From 201336367b2e864b960966568df0a472efdbe1e5 Mon Sep 17 00:00:00 2001 From: Tobias Gunkel Date: Sun, 29 Apr 2012 17:23:07 +0200 Subject: ANDROID: disable compression for zip-file assets and recompress uncompressed zip-files before adding them as assets to the apk --- backends/platform/android/android.mk | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/backends/platform/android/android.mk b/backends/platform/android/android.mk index 2e8fd62152..9292a16595 100644 --- a/backends/platform/android/android.mk +++ b/backends/platform/android/android.mk @@ -130,7 +130,18 @@ $(PATH_STAGE_PREFIX).%/res/drawable/scummvm.png: $(PATH_RESOURCES)/drawable/scum $(FILE_RESOURCES_MAIN): $(FILE_MANIFEST) $(RESOURCES) $(ANDROID_JAR8) $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) $(INSTALL) -d $(PATH_BUILD_ASSETS) $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) $(PATH_BUILD_ASSETS)/ - $(AAPT) package -f -M $< -S $(PATH_RESOURCES) -A $(PATH_BUILD_ASSETS) -I $(ANDROID_JAR8) -F $@ + work_dir=`pwd`; \ + for i in $(PATH_BUILD_ASSETS)/*.zip; do \ + echo "recompress $$i"; \ + cd $$work_dir; \ + $(RM) -rf $(PATH_BUILD_ASSETS)/tmp; \ + $(MKDIR) $(PATH_BUILD_ASSETS)/tmp; \ + unzip -q $$i -d $(PATH_BUILD_ASSETS)/tmp; \ + cd $(PATH_BUILD_ASSETS)/tmp; \ + zip -r ../`basename $$i` *; \ + done + @$(RM) -rf $(PATH_BUILD_ASSETS)/tmp + $(AAPT) package -f -0 zip -M $< -S $(PATH_RESOURCES) -A $(PATH_BUILD_ASSETS) -I $(ANDROID_JAR8) -F $@ $(PATH_BUILD)/%/$(FILE_RESOURCES): $(PATH_BUILD)/%/AndroidManifest.xml $(PATH_STAGE_PREFIX).%/res/values/strings.xml $(PATH_STAGE_PREFIX).%/res/drawable/scummvm.png plugins/lib%.so $(ANDROID_JAR8) $(AAPT) package -f -M $< -S $(PATH_STAGE_PREFIX).$*/res -I $(ANDROID_JAR8) -F $@ -- cgit v1.2.3 From 27b8b7e9b6644767ad9de1e40c188a7abd631c4e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 10 Jun 2012 04:06:25 +0200 Subject: GUI: Hide save/load chooser implementation. --- gui/saveload.cpp | 125 +++++++++++++++++++++++++++++++++++++++++++------------ gui/saveload.h | 43 ++----------------- 2 files changed, 103 insertions(+), 65 deletions(-) diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 67d871e133..717523b107 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -41,8 +41,52 @@ enum { }; -SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode) - : Dialog("SaveLoadChooser"), _delSupport(0), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { +class SaveLoadChooserImpl : GUI::Dialog { + typedef Common::String String; + typedef Common::Array StringArray; +public: + SaveLoadChooserImpl(const String &title, const String &buttonLabel, bool saveMode); + + int runModalWithCurrentTarget(); + int runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target); + + virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + + const Common::String &getResultString() const; + + virtual void open(); + + virtual void reflowLayout(); + + virtual void close(); +private: + GUI::ListWidget *_list; + GUI::ButtonWidget *_chooseButton; + GUI::ButtonWidget *_deleteButton; + GUI::GraphicsWidget *_gfxWidget; + GUI::ContainerWidget *_container; + GUI::StaticTextWidget *_date; + GUI::StaticTextWidget *_time; + GUI::StaticTextWidget *_playtime; + + const EnginePlugin *_plugin; + bool _delSupport; + bool _metaInfoSupport; + bool _thumbnailSupport; + bool _saveDateSupport; + bool _playTimeSupport; + String _target; + SaveStateList _saveList; + String _resultString; + + uint8 _fillR, _fillG, _fillB; + + void updateSaveList(); + void updateSelection(bool redraw); +}; + +SaveLoadChooserImpl::SaveLoadChooserImpl(const String &title, const String &buttonLabel, bool saveMode) + : Dialog("SaveLoadChooser"), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { _delSupport = _metaInfoSupport = _thumbnailSupport = _saveDateSupport = _playTimeSupport = false; _backgroundType = ThemeEngine::kDialogBackgroundSpecial; @@ -74,10 +118,7 @@ SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, // _container->setHints(GUI::THEME_HINT_USE_SHADOW); } -SaveLoadChooser::~SaveLoadChooser() { -} - -int SaveLoadChooser::runModalWithCurrentTarget() { +int SaveLoadChooserImpl::runModalWithCurrentTarget() { const Common::String gameId = ConfMan.get("gameid"); const EnginePlugin *plugin = 0; @@ -86,7 +127,7 @@ int SaveLoadChooser::runModalWithCurrentTarget() { return runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); } -int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target) { +int SaveLoadChooserImpl::runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target) { if (_gfxWidget) _gfxWidget->setGfx(0); @@ -114,7 +155,7 @@ int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, con return ret; } -void SaveLoadChooser::open() { +void SaveLoadChooserImpl::open() { Dialog::open(); // So that quitting ScummVM will not cause the dialog result to say a @@ -122,24 +163,12 @@ void SaveLoadChooser::open() { setResult(-1); } -const Common::String &SaveLoadChooser::getResultString() const { +const Common::String &SaveLoadChooserImpl::getResultString() const { int selItem = _list->getSelected(); return (selItem >= 0) ? _list->getSelectedString() : _resultString; } -Common::String SaveLoadChooser::createDefaultSaveDescription(const int slot) const { -#if defined(USE_SAVEGAME_TIMESTAMP) - TimeDate curTime; - g_system->getTimeAndDate(curTime); - curTime.tm_year += 1900; // fixup year - curTime.tm_mon++; // fixup month - return Common::String::format("%04d.%02d.%02d / %02d:%02d:%02d", curTime.tm_year, curTime.tm_mon, curTime.tm_mday, curTime.tm_hour, curTime.tm_min, curTime.tm_sec); -#else - return Common::String::format("Save %d", slot + 1); -#endif -} - -void SaveLoadChooser::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { +void SaveLoadChooserImpl::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { int selItem = _list->getSelected(); switch (cmd) { @@ -189,7 +218,7 @@ void SaveLoadChooser::handleCommand(CommandSender *sender, uint32 cmd, uint32 da } } -void SaveLoadChooser::reflowLayout() { +void SaveLoadChooserImpl::reflowLayout() { if (g_gui.xmlEval()->getVar("Globals.SaveLoadChooser.ExtInfo.Visible") == 1 && _thumbnailSupport) { int16 x, y; uint16 w, h; @@ -246,7 +275,7 @@ void SaveLoadChooser::reflowLayout() { Dialog::reflowLayout(); } -void SaveLoadChooser::updateSelection(bool redraw) { +void SaveLoadChooserImpl::updateSelection(bool redraw) { int selItem = _list->getSelected(); bool isDeletable = _delSupport; @@ -329,7 +358,7 @@ void SaveLoadChooser::updateSelection(bool redraw) { } } -void SaveLoadChooser::close() { +void SaveLoadChooserImpl::close() { _plugin = 0; _target.clear(); _saveList.clear(); @@ -338,7 +367,7 @@ void SaveLoadChooser::close() { Dialog::close(); } -void SaveLoadChooser::updateSaveList() { +void SaveLoadChooserImpl::updateSaveList() { _saveList = (*_plugin)->listSaves(_target.c_str()); int curSlot = 0; @@ -402,4 +431,48 @@ void SaveLoadChooser::updateSaveList() { _list->setList(saveNames, &colors); } +// --- SaveLoadChooser implementation --- + +SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode) { + _impl = new SaveLoadChooserImpl(title, buttonLabel, saveMode); +} + +SaveLoadChooser::~SaveLoadChooser() { + delete _impl; + _impl = 0; +} + +Common::String SaveLoadChooser::createDefaultSaveDescription(const int slot) const { +#if defined(USE_SAVEGAME_TIMESTAMP) + TimeDate curTime; + g_system->getTimeAndDate(curTime); + curTime.tm_year += 1900; // fixup year + curTime.tm_mon++; // fixup month + return Common::String::format("%04d.%02d.%02d / %02d:%02d:%02d", curTime.tm_year, curTime.tm_mon, curTime.tm_mday, curTime.tm_hour, curTime.tm_min, curTime.tm_sec); +#else + return Common::String::format("Save %d", slot + 1); +#endif +} + +int SaveLoadChooser::runModalWithCurrentTarget() { + if (_impl) + return _impl->runModalWithCurrentTarget(); + else + return -1; +} + +int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target) { + if (_impl) + return _impl->runModalWithPluginAndTarget(plugin, target); + else + return -1; +} + +Common::String SaveLoadChooser::getResultString() const { + if (_impl) + return _impl->getResultString(); + else + return Common::String(); +} + } // End of namespace GUI diff --git a/gui/saveload.h b/gui/saveload.h index a19f5ab083..9cd3c4605f 100644 --- a/gui/saveload.h +++ b/gui/saveload.h @@ -27,46 +27,16 @@ namespace GUI { -class ListWidget; -class GraphicsWidget; -class ButtonWidget; -class CommandSender; -class ContainerWidget; -class StaticTextWidget; +class SaveLoadChooserImpl; -class SaveLoadChooser : GUI::Dialog { +class SaveLoadChooser { typedef Common::String String; - typedef Common::Array StringArray; protected: - GUI::ListWidget *_list; - GUI::ButtonWidget *_chooseButton; - GUI::ButtonWidget *_deleteButton; - GUI::GraphicsWidget *_gfxWidget; - GUI::ContainerWidget *_container; - GUI::StaticTextWidget *_date; - GUI::StaticTextWidget *_time; - GUI::StaticTextWidget *_playtime; - - const EnginePlugin *_plugin; - bool _delSupport; - bool _metaInfoSupport; - bool _thumbnailSupport; - bool _saveDateSupport; - bool _playTimeSupport; - String _target; - SaveStateList _saveList; - String _resultString; - - uint8 _fillR, _fillG, _fillB; - - void updateSaveList(); - void updateSelection(bool redraw); + SaveLoadChooserImpl *_impl; public: SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode); ~SaveLoadChooser(); - virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); - /** * Runs the save/load chooser with the currently active config manager * domain as target. @@ -75,9 +45,8 @@ public: */ int runModalWithCurrentTarget(); int runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target); - void open(); - const Common::String &getResultString() const; + Common::String getResultString() const; /** * Creates a default save description for the specified slot. Depending @@ -93,10 +62,6 @@ public: * @return The slot description. */ Common::String createDefaultSaveDescription(const int slot) const; - - virtual void reflowLayout(); - - virtual void close(); }; } // End of namespace GUI -- cgit v1.2.3 From b7c3ffd37cfe10b45976b3e7fb4a595350ef7734 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 14 Jun 2012 03:12:48 +0200 Subject: BASE: Add operator* to PluginSubclass. --- base/plugins.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/base/plugins.h b/base/plugins.h index fffb5fb910..4409c9eaea 100644 --- a/base/plugins.h +++ b/base/plugins.h @@ -205,6 +205,10 @@ typedef Common::Array PluginList; template class PluginSubclass : public Plugin { public: + PO_t &operator*() const { + return *(PO_t *)_pluginObject; + } + PO_t *operator->() const { return (PO_t *)_pluginObject; } -- cgit v1.2.3 From e866dfd4069dfb4418ebdc0d4522b56aebed7522 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 14 Jun 2012 03:13:49 +0200 Subject: GUI: Refactor engine plugin access out of SaveLoadChooserImpl into SaveLoadChooser. --- gui/saveload.cpp | 77 ++++++++++++++++++++++++++------------------------------ 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 717523b107..e2f9461ddb 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -47,8 +47,7 @@ class SaveLoadChooserImpl : GUI::Dialog { public: SaveLoadChooserImpl(const String &title, const String &buttonLabel, bool saveMode); - int runModalWithCurrentTarget(); - int runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target); + int run(const String &target, const MetaEngine *metaEngine); virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); @@ -69,7 +68,7 @@ private: GUI::StaticTextWidget *_time; GUI::StaticTextWidget *_playtime; - const EnginePlugin *_plugin; + const MetaEngine *_metaEngine; bool _delSupport; bool _metaInfoSupport; bool _thumbnailSupport; @@ -118,41 +117,22 @@ SaveLoadChooserImpl::SaveLoadChooserImpl(const String &title, const String &butt // _container->setHints(GUI::THEME_HINT_USE_SHADOW); } -int SaveLoadChooserImpl::runModalWithCurrentTarget() { - const Common::String gameId = ConfMan.get("gameid"); - - const EnginePlugin *plugin = 0; - EngineMan.findGame(gameId, &plugin); - - return runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); -} - -int SaveLoadChooserImpl::runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target) { +int SaveLoadChooserImpl::run(const String &target, const MetaEngine *metaEngine) { if (_gfxWidget) _gfxWidget->setGfx(0); - // Set up the game domain as newly active domain, so - // target specific savepath will be checked - String oldDomain = ConfMan.getActiveDomainName(); - ConfMan.setActiveDomain(target); - - _plugin = plugin; + _metaEngine = metaEngine; _target = target; - _delSupport = (*_plugin)->hasFeature(MetaEngine::kSupportsDeleteSave); - _metaInfoSupport = (*_plugin)->hasFeature(MetaEngine::kSavesSupportMetaInfo); - _thumbnailSupport = _metaInfoSupport && (*_plugin)->hasFeature(MetaEngine::kSavesSupportThumbnail); - _saveDateSupport = _metaInfoSupport && (*_plugin)->hasFeature(MetaEngine::kSavesSupportCreationDate); - _playTimeSupport = _metaInfoSupport && (*_plugin)->hasFeature(MetaEngine::kSavesSupportPlayTime); + _delSupport = _metaEngine->hasFeature(MetaEngine::kSupportsDeleteSave); + _metaInfoSupport = _metaEngine->hasFeature(MetaEngine::kSavesSupportMetaInfo); + _thumbnailSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportThumbnail); + _saveDateSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportCreationDate); + _playTimeSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportPlayTime); _resultString.clear(); reflowLayout(); updateSaveList(); - int ret = Dialog::runModal(); - - // Revert to the old active domain - ConfMan.setActiveDomain(oldDomain); - - return ret; + return Dialog::runModal(); } void SaveLoadChooserImpl::open() { @@ -201,7 +181,7 @@ void SaveLoadChooserImpl::handleCommand(CommandSender *sender, uint32 cmd, uint3 MessageDialog alert(_("Do you really want to delete this savegame?"), _("Delete"), _("Cancel")); if (alert.runModal() == GUI::kMessageOK) { - (*_plugin)->removeSaveState(_target.c_str(), _saveList[selItem].getSaveSlot()); + _metaEngine->removeSaveState(_target.c_str(), _saveList[selItem].getSaveSlot()); setResult(-1); _list->setSelected(-1); @@ -288,7 +268,7 @@ void SaveLoadChooserImpl::updateSelection(bool redraw) { _playtime->setLabel(_("No playtime saved")); if (selItem >= 0 && _metaInfoSupport) { - SaveStateDescriptor desc = (*_plugin)->querySaveMetaInfos(_target.c_str(), _saveList[selItem].getSaveSlot()); + SaveStateDescriptor desc = _metaEngine->querySaveMetaInfos(_target.c_str(), _saveList[selItem].getSaveSlot()); isDeletable = desc.getDeletableFlag() && _delSupport; isWriteProtected = desc.getWriteProtectedFlag(); @@ -359,7 +339,7 @@ void SaveLoadChooserImpl::updateSelection(bool redraw) { } void SaveLoadChooserImpl::close() { - _plugin = 0; + _metaEngine = 0; _target.clear(); _saveList.clear(); _list->setList(StringArray()); @@ -368,7 +348,7 @@ void SaveLoadChooserImpl::close() { } void SaveLoadChooserImpl::updateSaveList() { - _saveList = (*_plugin)->listSaves(_target.c_str()); + _saveList = _metaEngine->listSaves(_target.c_str()); int curSlot = 0; int saveSlot = 0; @@ -410,7 +390,7 @@ void SaveLoadChooserImpl::updateSaveList() { // Fill the rest of the save slots with empty saves - int maximumSaveSlots = (*_plugin)->getMaximumSaveSlot(); + int maximumSaveSlots = _metaEngine->getMaximumSaveSlot(); #ifdef __DS__ // Low memory on the DS means too many save slots are impractical, so limit @@ -455,17 +435,32 @@ Common::String SaveLoadChooser::createDefaultSaveDescription(const int slot) con } int SaveLoadChooser::runModalWithCurrentTarget() { - if (_impl) - return _impl->runModalWithCurrentTarget(); - else + if (!_impl) return -1; + + const Common::String gameId = ConfMan.get("gameid"); + + const EnginePlugin *plugin = 0; + EngineMan.findGame(gameId, &plugin); + + return runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); } int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target) { - if (_impl) - return _impl->runModalWithPluginAndTarget(plugin, target); - else + if (!_impl) return -1; + + // Set up the game domain as newly active domain, so + // target specific savepath will be checked + String oldDomain = ConfMan.getActiveDomainName(); + ConfMan.setActiveDomain(target); + + int ret = _impl->run(target, &(**plugin)); + + // Revert to the old active domain + ConfMan.setActiveDomain(oldDomain); + + return ret; } Common::String SaveLoadChooser::getResultString() const { -- cgit v1.2.3 From 62c66cdb9c11c029e48706932c2513eaea1dd82b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 14 Jun 2012 03:17:33 +0200 Subject: GUI: Fix include guard of saveload.h. --- gui/saveload.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/saveload.h b/gui/saveload.h index 9cd3c4605f..a3834ff777 100644 --- a/gui/saveload.h +++ b/gui/saveload.h @@ -19,8 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifndef GUI_SAVELOAD_DIALOG_H -#define GUI_SAVELOAD_DIALOG_H +#ifndef GUI_SAVELOAD_H +#define GUI_SAVELOAD_H #include "gui/dialog.h" #include "engines/metaengine.h" -- cgit v1.2.3 From 1aa5200bb824119651e19a1809d9c07292da57fe Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 14 Jun 2012 03:33:50 +0200 Subject: GUI: Create an interface for save/load dialogs. --- gui/module.mk | 1 + gui/saveload-dialog.cpp | 380 +++++++++++++++++++++++++++++++++++++++++++++++ gui/saveload-dialog.h | 90 +++++++++++ gui/saveload.cpp | 388 +----------------------------------------------- gui/saveload.h | 4 +- 5 files changed, 475 insertions(+), 388 deletions(-) create mode 100644 gui/saveload-dialog.cpp create mode 100644 gui/saveload-dialog.h diff --git a/gui/module.mk b/gui/module.mk index d272bb0313..a435d8cca7 100644 --- a/gui/module.mk +++ b/gui/module.mk @@ -15,6 +15,7 @@ MODULE_OBJS := \ options.o \ predictivedialog.o \ saveload.o \ + saveload-dialog.o \ themebrowser.o \ ThemeEngine.o \ ThemeEval.o \ diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp new file mode 100644 index 0000000000..b8e64c4d99 --- /dev/null +++ b/gui/saveload-dialog.cpp @@ -0,0 +1,380 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "gui/saveload-dialog.h" +#include "common/translation.h" + +#include "gui/message.h" +#include "gui/gui-manager.h" +#include "gui/ThemeEval.h" + +#include "graphics/scaler.h" + +namespace GUI { + +SaveLoadChooserDialog::SaveLoadChooserDialog(const Common::String &dialogName) + : Dialog(dialogName), _metaEngine(0), _delSupport(false), _metaInfoSupport(false), + _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false) { +} + +SaveLoadChooserDialog::SaveLoadChooserDialog(int x, int y, int w, int h) + : Dialog(x, y, w, h), _metaEngine(0), _delSupport(false), _metaInfoSupport(false), + _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false) { +} + +void SaveLoadChooserDialog::open() { + Dialog::open(); + + // So that quitting ScummVM will not cause the dialog result to say a + // savegame was selected. + setResult(-1); +} + +int SaveLoadChooserDialog::run(const Common::String &target, const MetaEngine *metaEngine) { + _metaEngine = metaEngine; + _target = target; + _delSupport = _metaEngine->hasFeature(MetaEngine::kSupportsDeleteSave); + _metaInfoSupport = _metaEngine->hasFeature(MetaEngine::kSavesSupportMetaInfo); + _thumbnailSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportThumbnail); + _saveDateSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportCreationDate); + _playTimeSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportPlayTime); + + return runIntern(); +} + +// SaveLoadChooserSimple implementation + +enum { + kChooseCmd = 'CHOS', + kDelCmd = 'DEL ' +}; + +SaveLoadChooserSimple::SaveLoadChooserSimple(const String &title, const String &buttonLabel, bool saveMode) + : SaveLoadChooserDialog("SaveLoadChooser"), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { + _backgroundType = ThemeEngine::kDialogBackgroundSpecial; + + new StaticTextWidget(this, "SaveLoadChooser.Title", title); + + // Add choice list + _list = new GUI::ListWidget(this, "SaveLoadChooser.List"); + _list->setNumberingMode(GUI::kListNumberingZero); + _list->setEditable(saveMode); + + _gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10); + + _date = new StaticTextWidget(this, 0, 0, 10, 10, _("No date saved"), Graphics::kTextAlignCenter); + _time = new StaticTextWidget(this, 0, 0, 10, 10, _("No time saved"), Graphics::kTextAlignCenter); + _playtime = new StaticTextWidget(this, 0, 0, 10, 10, _("No playtime saved"), Graphics::kTextAlignCenter); + + // Buttons + new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), 0, kCloseCmd); + _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, 0, kChooseCmd); + _chooseButton->setEnabled(false); + + _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), 0, kDelCmd); + _deleteButton->setEnabled(false); + + _delSupport = _metaInfoSupport = _thumbnailSupport = false; + + _container = new GUI::ContainerWidget(this, 0, 0, 10, 10); +// _container->setHints(GUI::THEME_HINT_USE_SHADOW); +} + +int SaveLoadChooserSimple::runIntern() { + if (_gfxWidget) + _gfxWidget->setGfx(0); + + _resultString.clear(); + reflowLayout(); + updateSaveList(); + + return Dialog::runModal(); +} + +const Common::String &SaveLoadChooserSimple::getResultString() const { + int selItem = _list->getSelected(); + return (selItem >= 0) ? _list->getSelectedString() : _resultString; +} + +void SaveLoadChooserSimple::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { + int selItem = _list->getSelected(); + + switch (cmd) { + case GUI::kListItemActivatedCmd: + case GUI::kListItemDoubleClickedCmd: + if (selItem >= 0 && _chooseButton->isEnabled()) { + if (_list->isEditable() || !_list->getSelectedString().empty()) { + _list->endEditMode(); + if (!_saveList.empty()) { + setResult(_saveList[selItem].getSaveSlot()); + _resultString = _list->getSelectedString(); + } + close(); + } + } + break; + case kChooseCmd: + _list->endEditMode(); + if (!_saveList.empty()) { + setResult(_saveList[selItem].getSaveSlot()); + _resultString = _list->getSelectedString(); + } + close(); + break; + case GUI::kListSelectionChangedCmd: + updateSelection(true); + break; + case kDelCmd: + if (selItem >= 0 && _delSupport) { + MessageDialog alert(_("Do you really want to delete this savegame?"), + _("Delete"), _("Cancel")); + if (alert.runModal() == GUI::kMessageOK) { + _metaEngine->removeSaveState(_target.c_str(), _saveList[selItem].getSaveSlot()); + + setResult(-1); + _list->setSelected(-1); + + updateSaveList(); + updateSelection(true); + } + } + break; + case kCloseCmd: + setResult(-1); + default: + SaveLoadChooserDialog::handleCommand(sender, cmd, data); + } +} + +void SaveLoadChooserSimple::reflowLayout() { + if (g_gui.xmlEval()->getVar("Globals.SaveLoadChooser.ExtInfo.Visible") == 1 && _thumbnailSupport) { + int16 x, y; + uint16 w, h; + + if (!g_gui.xmlEval()->getWidgetData("SaveLoadChooser.Thumbnail", x, y, w, h)) + error("Error when loading position data for Save/Load Thumbnails"); + + int thumbW = kThumbnailWidth; + int thumbH = kThumbnailHeight2; + int thumbX = x + (w >> 1) - (thumbW >> 1); + int thumbY = y + kLineHeight; + + int textLines = 0; + if (!_saveDateSupport) + textLines++; + if (!_playTimeSupport) + textLines++; + + _container->resize(x, y, w, h - (kLineHeight * textLines)); + _gfxWidget->resize(thumbX, thumbY, thumbW, thumbH); + + int height = thumbY + thumbH + kLineHeight; + + if (_saveDateSupport) { + _date->resize(thumbX, height, kThumbnailWidth, kLineHeight); + height += kLineHeight; + _time->resize(thumbX, height, kThumbnailWidth, kLineHeight); + height += kLineHeight; + } + + if (_playTimeSupport) + _playtime->resize(thumbX, height, kThumbnailWidth, kLineHeight); + + _container->setVisible(true); + _gfxWidget->setVisible(true); + + _date->setVisible(_saveDateSupport); + _time->setVisible(_saveDateSupport); + + _playtime->setVisible(_playTimeSupport); + + _fillR = 0; + _fillG = 0; + _fillB = 0; + updateSelection(false); + } else { + _container->setVisible(false); + _gfxWidget->setVisible(false); + _date->setVisible(false); + _time->setVisible(false); + _playtime->setVisible(false); + } + + SaveLoadChooserDialog::reflowLayout(); +} + +void SaveLoadChooserSimple::updateSelection(bool redraw) { + int selItem = _list->getSelected(); + + bool isDeletable = _delSupport; + bool isWriteProtected = false; + bool startEditMode = _list->isEditable(); + + _gfxWidget->setGfx(-1, -1, _fillR, _fillG, _fillB); + _date->setLabel(_("No date saved")); + _time->setLabel(_("No time saved")); + _playtime->setLabel(_("No playtime saved")); + + if (selItem >= 0 && _metaInfoSupport) { + SaveStateDescriptor desc = _metaEngine->querySaveMetaInfos(_target.c_str(), _saveList[selItem].getSaveSlot()); + + isDeletable = desc.getDeletableFlag() && _delSupport; + isWriteProtected = desc.getWriteProtectedFlag(); + + // Don't allow the user to change the description of write protected games + if (isWriteProtected) + startEditMode = false; + + if (_thumbnailSupport) { + const Graphics::Surface *thumb = desc.getThumbnail(); + if (thumb) { + _gfxWidget->setGfx(thumb); + _gfxWidget->useAlpha(256); + } + } + + if (_saveDateSupport) { + const Common::String &saveDate = desc.getSaveDate(); + if (!saveDate.empty()) + _date->setLabel(_("Date: ") + saveDate); + + const Common::String &saveTime = desc.getSaveTime(); + if (!saveTime.empty()) + _time->setLabel(_("Time: ") + saveTime); + } + + if (_playTimeSupport) { + const Common::String &playTime = desc.getPlayTime(); + if (!playTime.empty()) + _playtime->setLabel(_("Playtime: ") + playTime); + } + } + + + if (_list->isEditable()) { + // Disable the save button if nothing is selected, or if the selected + // game is write protected + _chooseButton->setEnabled(selItem >= 0 && !isWriteProtected); + + if (startEditMode) { + _list->startEditMode(); + + if (_chooseButton->isEnabled() && _list->getSelectedString() == _("Untitled savestate") && + _list->getSelectionColor() == ThemeEngine::kFontColorAlternate) { + _list->setEditString(""); + _list->setEditColor(ThemeEngine::kFontColorNormal); + } + } + } else { + // Disable the load button if nothing is selected, or if an empty + // list item is selected. + _chooseButton->setEnabled(selItem >= 0 && !_list->getSelectedString().empty()); + } + + // Delete will always be disabled if the engine doesn't support it. + _deleteButton->setEnabled(isDeletable && (selItem >= 0) && (!_list->getSelectedString().empty())); + + if (redraw) { + _gfxWidget->draw(); + _date->draw(); + _time->draw(); + _playtime->draw(); + _chooseButton->draw(); + _deleteButton->draw(); + + draw(); + } +} + +void SaveLoadChooserSimple::close() { + _metaEngine = 0; + _target.clear(); + _saveList.clear(); + _list->setList(StringArray()); + + SaveLoadChooserDialog::close(); +} + +void SaveLoadChooserSimple::updateSaveList() { + _saveList = _metaEngine->listSaves(_target.c_str()); + + int curSlot = 0; + int saveSlot = 0; + StringArray saveNames; + ListWidget::ColorList colors; + for (SaveStateList::const_iterator x = _saveList.begin(); x != _saveList.end(); ++x) { + // Handle gaps in the list of save games + saveSlot = x->getSaveSlot(); + if (curSlot < saveSlot) { + while (curSlot < saveSlot) { + SaveStateDescriptor dummySave(curSlot, ""); + _saveList.insert_at(curSlot, dummySave); + saveNames.push_back(dummySave.getDescription()); + colors.push_back(ThemeEngine::kFontColorNormal); + curSlot++; + } + + // Sync the save list iterator + for (x = _saveList.begin(); x != _saveList.end(); ++x) { + if (x->getSaveSlot() == saveSlot) + break; + } + } + + // Show "Untitled savestate" for empty/whitespace savegame descriptions + Common::String description = x->getDescription(); + Common::String trimmedDescription = description; + trimmedDescription.trim(); + if (trimmedDescription.empty()) { + description = _("Untitled savestate"); + colors.push_back(ThemeEngine::kFontColorAlternate); + } else { + colors.push_back(ThemeEngine::kFontColorNormal); + } + + saveNames.push_back(description); + curSlot++; + } + + // Fill the rest of the save slots with empty saves + + int maximumSaveSlots = _metaEngine->getMaximumSaveSlot(); + +#ifdef __DS__ + // Low memory on the DS means too many save slots are impractical, so limit + // the maximum here. + if (maximumSaveSlots > 99) { + maximumSaveSlots = 99; + } +#endif + + Common::String emptyDesc; + for (int i = curSlot; i <= maximumSaveSlots; i++) { + saveNames.push_back(emptyDesc); + SaveStateDescriptor dummySave(i, ""); + _saveList.push_back(dummySave); + colors.push_back(ThemeEngine::kFontColorNormal); + } + + _list->setList(saveNames, &colors); +} + +} // End of namespace GUI diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h new file mode 100644 index 0000000000..7a78e17bae --- /dev/null +++ b/gui/saveload-dialog.h @@ -0,0 +1,90 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef GUI_SAVELOAD_DIALOG_H +#define GUI_SAVELOAD_DIALOG_H + +#include "gui/dialog.h" +#include "gui/widgets/list.h" + +#include "engines/metaengine.h" + +namespace GUI { + +class SaveLoadChooserDialog : protected Dialog { +public: + SaveLoadChooserDialog(const Common::String &dialogName); + SaveLoadChooserDialog(int x, int y, int w, int h); + + virtual void open(); + + int run(const Common::String &target, const MetaEngine *metaEngine); + virtual const Common::String &getResultString() const = 0; + +protected: + virtual int runIntern() = 0; + + const MetaEngine *_metaEngine; + bool _delSupport; + bool _metaInfoSupport; + bool _thumbnailSupport; + bool _saveDateSupport; + bool _playTimeSupport; + Common::String _target; +}; + +class SaveLoadChooserSimple : public SaveLoadChooserDialog { + typedef Common::String String; + typedef Common::Array StringArray; +public: + SaveLoadChooserSimple(const String &title, const String &buttonLabel, bool saveMode); + + virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + + virtual const Common::String &getResultString() const; + + virtual void reflowLayout(); + + virtual void close(); +private: + virtual int runIntern(); + + GUI::ListWidget *_list; + GUI::ButtonWidget *_chooseButton; + GUI::ButtonWidget *_deleteButton; + GUI::GraphicsWidget *_gfxWidget; + GUI::ContainerWidget *_container; + GUI::StaticTextWidget *_date; + GUI::StaticTextWidget *_time; + GUI::StaticTextWidget *_playtime; + + SaveStateList _saveList; + String _resultString; + + uint8 _fillR, _fillG, _fillB; + + void updateSaveList(); + void updateSelection(bool redraw); +}; + +} // End of namespace GUI + +#endif diff --git a/gui/saveload.cpp b/gui/saveload.cpp index e2f9461ddb..e0e6d6187e 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -20,401 +20,17 @@ */ #include "common/config-manager.h" -#include "common/translation.h" #include "common/system.h" -#include "gui/widgets/list.h" -#include "gui/message.h" #include "gui/saveload.h" -#include "gui/ThemeEval.h" -#include "gui/gui-manager.h" - -#include "graphics/scaler.h" +#include "gui/saveload-dialog.h" #include "engines/metaengine.h" namespace GUI { -enum { - kChooseCmd = 'CHOS', - kDelCmd = 'DEL ' - -}; - -class SaveLoadChooserImpl : GUI::Dialog { - typedef Common::String String; - typedef Common::Array StringArray; -public: - SaveLoadChooserImpl(const String &title, const String &buttonLabel, bool saveMode); - - int run(const String &target, const MetaEngine *metaEngine); - - virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); - - const Common::String &getResultString() const; - - virtual void open(); - - virtual void reflowLayout(); - - virtual void close(); -private: - GUI::ListWidget *_list; - GUI::ButtonWidget *_chooseButton; - GUI::ButtonWidget *_deleteButton; - GUI::GraphicsWidget *_gfxWidget; - GUI::ContainerWidget *_container; - GUI::StaticTextWidget *_date; - GUI::StaticTextWidget *_time; - GUI::StaticTextWidget *_playtime; - - const MetaEngine *_metaEngine; - bool _delSupport; - bool _metaInfoSupport; - bool _thumbnailSupport; - bool _saveDateSupport; - bool _playTimeSupport; - String _target; - SaveStateList _saveList; - String _resultString; - - uint8 _fillR, _fillG, _fillB; - - void updateSaveList(); - void updateSelection(bool redraw); -}; - -SaveLoadChooserImpl::SaveLoadChooserImpl(const String &title, const String &buttonLabel, bool saveMode) - : Dialog("SaveLoadChooser"), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { - _delSupport = _metaInfoSupport = _thumbnailSupport = _saveDateSupport = _playTimeSupport = false; - - _backgroundType = ThemeEngine::kDialogBackgroundSpecial; - - new StaticTextWidget(this, "SaveLoadChooser.Title", title); - - // Add choice list - _list = new GUI::ListWidget(this, "SaveLoadChooser.List"); - _list->setNumberingMode(GUI::kListNumberingZero); - _list->setEditable(saveMode); - - _gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10); - - _date = new StaticTextWidget(this, 0, 0, 10, 10, _("No date saved"), Graphics::kTextAlignCenter); - _time = new StaticTextWidget(this, 0, 0, 10, 10, _("No time saved"), Graphics::kTextAlignCenter); - _playtime = new StaticTextWidget(this, 0, 0, 10, 10, _("No playtime saved"), Graphics::kTextAlignCenter); - - // Buttons - new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), 0, kCloseCmd); - _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, 0, kChooseCmd); - _chooseButton->setEnabled(false); - - _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), 0, kDelCmd); - _deleteButton->setEnabled(false); - - _delSupport = _metaInfoSupport = _thumbnailSupport = false; - - _container = new GUI::ContainerWidget(this, 0, 0, 10, 10); -// _container->setHints(GUI::THEME_HINT_USE_SHADOW); -} - -int SaveLoadChooserImpl::run(const String &target, const MetaEngine *metaEngine) { - if (_gfxWidget) - _gfxWidget->setGfx(0); - - _metaEngine = metaEngine; - _target = target; - _delSupport = _metaEngine->hasFeature(MetaEngine::kSupportsDeleteSave); - _metaInfoSupport = _metaEngine->hasFeature(MetaEngine::kSavesSupportMetaInfo); - _thumbnailSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportThumbnail); - _saveDateSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportCreationDate); - _playTimeSupport = _metaInfoSupport && _metaEngine->hasFeature(MetaEngine::kSavesSupportPlayTime); - _resultString.clear(); - reflowLayout(); - updateSaveList(); - - return Dialog::runModal(); -} - -void SaveLoadChooserImpl::open() { - Dialog::open(); - - // So that quitting ScummVM will not cause the dialog result to say a - // savegame was selected. - setResult(-1); -} - -const Common::String &SaveLoadChooserImpl::getResultString() const { - int selItem = _list->getSelected(); - return (selItem >= 0) ? _list->getSelectedString() : _resultString; -} - -void SaveLoadChooserImpl::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { - int selItem = _list->getSelected(); - - switch (cmd) { - case GUI::kListItemActivatedCmd: - case GUI::kListItemDoubleClickedCmd: - if (selItem >= 0 && _chooseButton->isEnabled()) { - if (_list->isEditable() || !_list->getSelectedString().empty()) { - _list->endEditMode(); - if (!_saveList.empty()) { - setResult(_saveList[selItem].getSaveSlot()); - _resultString = _list->getSelectedString(); - } - close(); - } - } - break; - case kChooseCmd: - _list->endEditMode(); - if (!_saveList.empty()) { - setResult(_saveList[selItem].getSaveSlot()); - _resultString = _list->getSelectedString(); - } - close(); - break; - case GUI::kListSelectionChangedCmd: - updateSelection(true); - break; - case kDelCmd: - if (selItem >= 0 && _delSupport) { - MessageDialog alert(_("Do you really want to delete this savegame?"), - _("Delete"), _("Cancel")); - if (alert.runModal() == GUI::kMessageOK) { - _metaEngine->removeSaveState(_target.c_str(), _saveList[selItem].getSaveSlot()); - - setResult(-1); - _list->setSelected(-1); - - updateSaveList(); - updateSelection(true); - } - } - break; - case kCloseCmd: - setResult(-1); - default: - Dialog::handleCommand(sender, cmd, data); - } -} - -void SaveLoadChooserImpl::reflowLayout() { - if (g_gui.xmlEval()->getVar("Globals.SaveLoadChooser.ExtInfo.Visible") == 1 && _thumbnailSupport) { - int16 x, y; - uint16 w, h; - - if (!g_gui.xmlEval()->getWidgetData("SaveLoadChooser.Thumbnail", x, y, w, h)) - error("Error when loading position data for Save/Load Thumbnails"); - - int thumbW = kThumbnailWidth; - int thumbH = kThumbnailHeight2; - int thumbX = x + (w >> 1) - (thumbW >> 1); - int thumbY = y + kLineHeight; - - int textLines = 0; - if (!_saveDateSupport) - textLines++; - if (!_playTimeSupport) - textLines++; - - _container->resize(x, y, w, h - (kLineHeight * textLines)); - _gfxWidget->resize(thumbX, thumbY, thumbW, thumbH); - - int height = thumbY + thumbH + kLineHeight; - - if (_saveDateSupport) { - _date->resize(thumbX, height, kThumbnailWidth, kLineHeight); - height += kLineHeight; - _time->resize(thumbX, height, kThumbnailWidth, kLineHeight); - height += kLineHeight; - } - - if (_playTimeSupport) - _playtime->resize(thumbX, height, kThumbnailWidth, kLineHeight); - - _container->setVisible(true); - _gfxWidget->setVisible(true); - - _date->setVisible(_saveDateSupport); - _time->setVisible(_saveDateSupport); - - _playtime->setVisible(_playTimeSupport); - - _fillR = 0; - _fillG = 0; - _fillB = 0; - updateSelection(false); - } else { - _container->setVisible(false); - _gfxWidget->setVisible(false); - _date->setVisible(false); - _time->setVisible(false); - _playtime->setVisible(false); - } - - Dialog::reflowLayout(); -} - -void SaveLoadChooserImpl::updateSelection(bool redraw) { - int selItem = _list->getSelected(); - - bool isDeletable = _delSupport; - bool isWriteProtected = false; - bool startEditMode = _list->isEditable(); - - _gfxWidget->setGfx(-1, -1, _fillR, _fillG, _fillB); - _date->setLabel(_("No date saved")); - _time->setLabel(_("No time saved")); - _playtime->setLabel(_("No playtime saved")); - - if (selItem >= 0 && _metaInfoSupport) { - SaveStateDescriptor desc = _metaEngine->querySaveMetaInfos(_target.c_str(), _saveList[selItem].getSaveSlot()); - - isDeletable = desc.getDeletableFlag() && _delSupport; - isWriteProtected = desc.getWriteProtectedFlag(); - - // Don't allow the user to change the description of write protected games - if (isWriteProtected) - startEditMode = false; - - if (_thumbnailSupport) { - const Graphics::Surface *thumb = desc.getThumbnail(); - if (thumb) { - _gfxWidget->setGfx(thumb); - _gfxWidget->useAlpha(256); - } - } - - if (_saveDateSupport) { - const Common::String &saveDate = desc.getSaveDate(); - if (!saveDate.empty()) - _date->setLabel(_("Date: ") + saveDate); - - const Common::String &saveTime = desc.getSaveTime(); - if (!saveTime.empty()) - _time->setLabel(_("Time: ") + saveTime); - } - - if (_playTimeSupport) { - const Common::String &playTime = desc.getPlayTime(); - if (!playTime.empty()) - _playtime->setLabel(_("Playtime: ") + playTime); - } - } - - - if (_list->isEditable()) { - // Disable the save button if nothing is selected, or if the selected - // game is write protected - _chooseButton->setEnabled(selItem >= 0 && !isWriteProtected); - - if (startEditMode) { - _list->startEditMode(); - - if (_chooseButton->isEnabled() && _list->getSelectedString() == _("Untitled savestate") && - _list->getSelectionColor() == ThemeEngine::kFontColorAlternate) { - _list->setEditString(""); - _list->setEditColor(ThemeEngine::kFontColorNormal); - } - } - } else { - // Disable the load button if nothing is selected, or if an empty - // list item is selected. - _chooseButton->setEnabled(selItem >= 0 && !_list->getSelectedString().empty()); - } - - // Delete will always be disabled if the engine doesn't support it. - _deleteButton->setEnabled(isDeletable && (selItem >= 0) && (!_list->getSelectedString().empty())); - - if (redraw) { - _gfxWidget->draw(); - _date->draw(); - _time->draw(); - _playtime->draw(); - _chooseButton->draw(); - _deleteButton->draw(); - - draw(); - } -} - -void SaveLoadChooserImpl::close() { - _metaEngine = 0; - _target.clear(); - _saveList.clear(); - _list->setList(StringArray()); - - Dialog::close(); -} - -void SaveLoadChooserImpl::updateSaveList() { - _saveList = _metaEngine->listSaves(_target.c_str()); - - int curSlot = 0; - int saveSlot = 0; - StringArray saveNames; - ListWidget::ColorList colors; - for (SaveStateList::const_iterator x = _saveList.begin(); x != _saveList.end(); ++x) { - // Handle gaps in the list of save games - saveSlot = x->getSaveSlot(); - if (curSlot < saveSlot) { - while (curSlot < saveSlot) { - SaveStateDescriptor dummySave(curSlot, ""); - _saveList.insert_at(curSlot, dummySave); - saveNames.push_back(dummySave.getDescription()); - colors.push_back(ThemeEngine::kFontColorNormal); - curSlot++; - } - - // Sync the save list iterator - for (x = _saveList.begin(); x != _saveList.end(); ++x) { - if (x->getSaveSlot() == saveSlot) - break; - } - } - - // Show "Untitled savestate" for empty/whitespace savegame descriptions - Common::String description = x->getDescription(); - Common::String trimmedDescription = description; - trimmedDescription.trim(); - if (trimmedDescription.empty()) { - description = _("Untitled savestate"); - colors.push_back(ThemeEngine::kFontColorAlternate); - } else { - colors.push_back(ThemeEngine::kFontColorNormal); - } - - saveNames.push_back(description); - curSlot++; - } - - // Fill the rest of the save slots with empty saves - - int maximumSaveSlots = _metaEngine->getMaximumSaveSlot(); - -#ifdef __DS__ - // Low memory on the DS means too many save slots are impractical, so limit - // the maximum here. - if (maximumSaveSlots > 99) { - maximumSaveSlots = 99; - } -#endif - - Common::String emptyDesc; - for (int i = curSlot; i <= maximumSaveSlots; i++) { - saveNames.push_back(emptyDesc); - SaveStateDescriptor dummySave(i, ""); - _saveList.push_back(dummySave); - colors.push_back(ThemeEngine::kFontColorNormal); - } - - _list->setList(saveNames, &colors); -} - -// --- SaveLoadChooser implementation --- - SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode) { - _impl = new SaveLoadChooserImpl(title, buttonLabel, saveMode); + _impl = new SaveLoadChooserSimple(title, buttonLabel, saveMode); } SaveLoadChooser::~SaveLoadChooser() { diff --git a/gui/saveload.h b/gui/saveload.h index a3834ff777..ac61291b62 100644 --- a/gui/saveload.h +++ b/gui/saveload.h @@ -27,12 +27,12 @@ namespace GUI { -class SaveLoadChooserImpl; +class SaveLoadChooserDialog; class SaveLoadChooser { typedef Common::String String; protected: - SaveLoadChooserImpl *_impl; + SaveLoadChooserDialog *_impl; public: SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode); ~SaveLoadChooser(); -- cgit v1.2.3 From b4882ce6bdb8f3a0df0085fa43ed3bbaf5cb47e1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 15 Jun 2012 22:39:57 +0200 Subject: GUI: Implement a new load chooser, which displays a list of thumbnails. --- gui/saveload-dialog.cpp | 192 ++++++++++++++++++++++++++++++++++++++++++++++++ gui/saveload-dialog.h | 46 ++++++++++++ 2 files changed, 238 insertions(+) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index b8e64c4d99..6740fcad13 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -377,4 +377,196 @@ void SaveLoadChooserSimple::updateSaveList() { _list->setList(saveNames, &colors); } +// LoadChooserThumbnailed implementation + +enum { + kNextCmd = 'NEXT', + kPrevCmd = 'PREV' +}; + +LoadChooserThumbnailed::LoadChooserThumbnailed(const Common::String &title) + : SaveLoadChooserDialog("SaveLoadChooser"), _lines(0), _columns(0), _entriesPerPage(0), + _curPage(0), _buttons() { + _backgroundType = ThemeEngine::kDialogBackgroundSpecial; + + new StaticTextWidget(this, "SaveLoadChooser.Title", title); + + // Buttons + new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Cancel"), 0, kCloseCmd); + _nextButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", _("Next"), 0, kNextCmd); + _nextButton->setEnabled(false); + + _prevButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Prev"), 0, kPrevCmd); + _prevButton->setEnabled(false); +} + +const Common::String &LoadChooserThumbnailed::getResultString() const { + // FIXME: This chooser is only for loading, thus the result is never used + // anyway. But this is still an ugly hack. + return _target; +} + +void LoadChooserThumbnailed::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { + if (cmd <= _entriesPerPage) { + setResult(_saveList[cmd - 1 + _curPage * _entriesPerPage].getSaveSlot()); + close(); + } + + switch (cmd) { + case kNextCmd: + ++_curPage; + updateSaves(); + draw(); + break; + + case kPrevCmd: + --_curPage; + updateSaves(); + draw(); + break; + + case kCloseCmd: + setResult(-1); + default: + SaveLoadChooserDialog::handleCommand(sender, cmd, data); + } +} + +void LoadChooserThumbnailed::handleMouseWheel(int x, int y, int direction) { + if (direction > 0) { + if (_nextButton->isEnabled()) { + ++_curPage; + updateSaves(); + draw(); + } + } else { + if (_prevButton->isEnabled()) { + --_curPage; + updateSaves(); + draw(); + } + } +} + +void LoadChooserThumbnailed::open() { + SaveLoadChooserDialog::open(); + + _curPage = 0; + updateSaves(); +} + +void LoadChooserThumbnailed::reflowLayout() { + SaveLoadChooserDialog::reflowLayout(); + destroyButtons(); + + const uint16 availableWidth = getWidth() - 20; + uint16 availableHeight; + + int16 x, y; + uint16 w; + g_gui.xmlEval()->getWidgetData("SaveLoadChooser.List", x, y, w, availableHeight); + + const int16 buttonWidth = kThumbnailWidth + 6; + const int16 buttonHeight = kThumbnailHeight2 + 6; + + const int16 containerFrameWidthAdd = 10; + const int16 containerFrameHeightAdd = 0; + const int16 containerWidth = buttonWidth + containerFrameWidthAdd; + const int16 containerHeight = buttonHeight + kLineHeight + containerFrameHeightAdd; + + const int16 defaultSpacingHorizontal = 4; + const int16 defaultSpacingVertical = 4; + const int16 slotAreaWidth = containerWidth + defaultSpacingHorizontal; + const int16 slotAreaHeight = containerHeight + defaultSpacingHorizontal; + + const uint oldEntriesPerPage = _entriesPerPage; + _columns = MAX(1, availableWidth / slotAreaWidth); + _lines = MAX(1, availableHeight / slotAreaHeight); + _entriesPerPage = _columns * _lines; + // Recalculate the page number + if (!_saveList.empty() && oldEntriesPerPage != 0) { + _curPage = (_curPage * oldEntriesPerPage) / _entriesPerPage; + } + + const uint addX = _columns > 1 ? (availableWidth % slotAreaWidth) / (_columns - 1) : 0; + const uint addY = _lines > 1 ? (availableHeight % slotAreaHeight) / (_lines - 1) : 0; + + _buttons.reserve(_lines * _columns); + y += defaultSpacingVertical / 2; + for (uint curLine = 0; curLine < _lines; ++curLine, y += slotAreaHeight + addY) { + for (uint curColumn = 0, curX = x + defaultSpacingHorizontal / 2; curColumn < _columns; ++curColumn, curX += slotAreaWidth + addX) { + ContainerWidget *container = new ContainerWidget(this, curX, y, containerWidth, containerHeight); + container->setVisible(false); + + int dstY = y + containerFrameHeightAdd / 2; + int dstX = curX + containerFrameWidthAdd / 2; + + PicButtonWidget *button = new PicButtonWidget(this, dstX, dstY, buttonWidth, buttonHeight, 0, curLine * _columns + curColumn + 1); + button->setVisible(false); + dstY += buttonHeight; + + StaticTextWidget *description = new StaticTextWidget(this, dstX, dstY, buttonWidth, kLineHeight, Common::String(), Graphics::kTextAlignLeft); + description->setVisible(false); + + _buttons.push_back(SlotButton(container, button, description)); + } + } + + if (!_target.empty()) + updateSaves(); +} + +void LoadChooserThumbnailed::close() { + SaveLoadChooserDialog::close(); + hideButtons(); +} + +int LoadChooserThumbnailed::runIntern() { + return SaveLoadChooserDialog::runModal(); +} + +void LoadChooserThumbnailed::destroyButtons() { + for (ButtonArray::iterator i = _buttons.begin(), end = _buttons.end(); i != end; ++i) { + removeWidget(i->container); + removeWidget(i->button); + removeWidget(i->description); + } + + _buttons.clear(); +} + +void LoadChooserThumbnailed::hideButtons() { + for (ButtonArray::iterator i = _buttons.begin(), end = _buttons.end(); i != end; ++i) { + i->button->setGfx(0); + i->setVisible(false); + } + +} + +void LoadChooserThumbnailed::updateSaves() { + hideButtons(); + + _saveList = _metaEngine->listSaves(_target.c_str()); + + for (uint i = _curPage * _entriesPerPage, curNum = 0; i < _saveList.size() && curNum < _entriesPerPage; ++i, ++curNum) { + const uint saveSlot = _saveList[i].getSaveSlot(); + + SaveStateDescriptor desc = _metaEngine->querySaveMetaInfos(_target.c_str(), saveSlot); + SlotButton &curButton = _buttons[curNum]; + curButton.setVisible(true); + curButton.button->setGfx(desc.getThumbnail()); + curButton.description->setLabel(Common::String::format("%d. %s", saveSlot, desc.getDescription().c_str())); + } + + if (_curPage > 0) + _prevButton->setEnabled(true); + else + _prevButton->setEnabled(false); + + if ((_curPage + 1) * _entriesPerPage < _saveList.size()) + _nextButton->setEnabled(true); + else + _nextButton->setEnabled(false); +} + } // End of namespace GUI diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 7a78e17bae..b80741d36a 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -85,6 +85,52 @@ private: void updateSelection(bool redraw); }; +class LoadChooserThumbnailed : public SaveLoadChooserDialog { +public: + LoadChooserThumbnailed(const Common::String &title); + + virtual const Common::String &getResultString() const; + + virtual void open(); + + virtual void reflowLayout(); + + virtual void close(); +protected: + virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + virtual void handleMouseWheel(int x, int y, int direction); +private: + virtual int runIntern(); + + uint _columns, _lines; + uint _entriesPerPage; + uint _curPage; + SaveStateList _saveList; + + GUI::ButtonWidget *_nextButton; + GUI::ButtonWidget *_prevButton; + + struct SlotButton { + SlotButton() : container(0), button(0), description(0) {} + SlotButton(ContainerWidget *c, PicButtonWidget *b, StaticTextWidget *d) : container(c), button(b), description(d) {} + + ContainerWidget *container; + PicButtonWidget *button; + StaticTextWidget *description; + + void setVisible(bool state) { + container->setVisible(state); + button->setVisible(state); + description->setVisible(state); + } + }; + typedef Common::Array ButtonArray; + ButtonArray _buttons; + void destroyButtons(); + void hideButtons(); + void updateSaves(); +}; + } // End of namespace GUI #endif -- cgit v1.2.3 From 72ea449431d9db61c45160f7c42d546599e84afe Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 15 Jun 2012 22:47:57 +0200 Subject: GUI: Hook up the new load chooser for > 320x200 and engines which support thumbnails. --- gui/saveload.cpp | 22 +++++++++++++++++----- gui/saveload.h | 6 ++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/gui/saveload.cpp b/gui/saveload.cpp index e0e6d6187e..becc3f6b4f 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -24,13 +24,14 @@ #include "gui/saveload.h" #include "gui/saveload-dialog.h" +#include "gui/gui-manager.h" #include "engines/metaengine.h" namespace GUI { -SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode) { - _impl = new SaveLoadChooserSimple(title, buttonLabel, saveMode); +SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode) + : _impl(0), _title(title), _buttonLabel(buttonLabel), _saveMode(saveMode) { } SaveLoadChooser::~SaveLoadChooser() { @@ -38,6 +39,19 @@ SaveLoadChooser::~SaveLoadChooser() { _impl = 0; } +void SaveLoadChooser::selectChooser(const MetaEngine &engine) { + delete _impl; + _impl = 0; + + if (!_saveMode && g_gui.getWidth() > 320 && g_gui.getHeight() > 200 + && engine.hasFeature(MetaEngine::kSavesSupportMetaInfo) + && engine.hasFeature(MetaEngine::kSavesSupportThumbnail)) { + _impl = new LoadChooserThumbnailed(_title); + } else { + _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); + } +} + Common::String SaveLoadChooser::createDefaultSaveDescription(const int slot) const { #if defined(USE_SAVEGAME_TIMESTAMP) TimeDate curTime; @@ -51,9 +65,6 @@ Common::String SaveLoadChooser::createDefaultSaveDescription(const int slot) con } int SaveLoadChooser::runModalWithCurrentTarget() { - if (!_impl) - return -1; - const Common::String gameId = ConfMan.get("gameid"); const EnginePlugin *plugin = 0; @@ -63,6 +74,7 @@ int SaveLoadChooser::runModalWithCurrentTarget() { } int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target) { + selectChooser(**plugin); if (!_impl) return -1; diff --git a/gui/saveload.h b/gui/saveload.h index ac61291b62..26a8cd1bad 100644 --- a/gui/saveload.h +++ b/gui/saveload.h @@ -33,6 +33,12 @@ class SaveLoadChooser { typedef Common::String String; protected: SaveLoadChooserDialog *_impl; + + const String _title; + const String _buttonLabel; + const bool _saveMode; + + void selectChooser(const MetaEngine &engine); public: SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode); ~SaveLoadChooser(); -- cgit v1.2.3 From 80ae9d7d34234e6cf9a7464723691d7b2b72cb26 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 20 Jun 2012 03:31:50 +0200 Subject: GUI: Allow tooltips to be changed after widget creation. --- gui/Tooltip.cpp | 2 +- gui/gui-manager.cpp | 2 +- gui/widget.h | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gui/Tooltip.cpp b/gui/Tooltip.cpp index 85e5856cff..88124e782b 100644 --- a/gui/Tooltip.cpp +++ b/gui/Tooltip.cpp @@ -37,7 +37,7 @@ Tooltip::Tooltip() : } void Tooltip::setup(Dialog *parent, Widget *widget, int x, int y) { - assert(widget->getTooltip()); + assert(widget->hasTooltip()); _maxWidth = g_gui.xmlEval()->getVar("Globals.Tooltip.MaxWidth", 100); _xdelta = g_gui.xmlEval()->getVar("Globals.Tooltip.XDelta", 0); diff --git a/gui/gui-manager.cpp b/gui/gui-manager.cpp index abd781e1a3..a0ef4216aa 100644 --- a/gui/gui-manager.cpp +++ b/gui/gui-manager.cpp @@ -381,7 +381,7 @@ void GuiManager::runLoop() { if (tooltipCheck && _lastMousePosition.time + kTooltipDelay < _system->getMillis()) { Widget *wdg = activeDialog->findWidget(_lastMousePosition.x, _lastMousePosition.y); - if (wdg && wdg->getTooltip() && !(wdg->getFlags() & WIDGET_PRESSED)) { + if (wdg && wdg->hasTooltip() && !(wdg->getFlags() & WIDGET_PRESSED)) { Tooltip *tooltip = new Tooltip(); tooltip->setup(activeDialog, wdg, _lastMousePosition.x, _lastMousePosition.y); tooltip->runModal(); diff --git a/gui/widget.h b/gui/widget.h index 6de56862c3..d80b2ad7e2 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -88,7 +88,7 @@ protected: uint16 _id; bool _hasFocus; ThemeEngine::WidgetStateInfo _state; - const char *_tooltip; + Common::String _tooltip; private: uint16 _flags; @@ -142,7 +142,9 @@ public: uint8 parseHotkey(const Common::String &label); Common::String cleanupHotkey(const Common::String &label); - const char *getTooltip() const { return _tooltip; } + bool hasTooltip() const { return !_tooltip.empty(); } + const Common::String &getTooltip() const { return _tooltip; } + void setTooltip(const Common::String &tooltip) { _tooltip = tooltip; } protected: void updateState(int oldFlags, int newFlags); -- cgit v1.2.3 From d7db655c5b832691fbaa0d0d175de38f43217dc2 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 20 Jun 2012 03:42:32 +0200 Subject: GUI: Show additional meta data in the thumbnail load chooser via tooltip. --- gui/saveload-dialog.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 6740fcad13..5d9d489fec 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -556,6 +556,33 @@ void LoadChooserThumbnailed::updateSaves() { curButton.setVisible(true); curButton.button->setGfx(desc.getThumbnail()); curButton.description->setLabel(Common::String::format("%d. %s", saveSlot, desc.getDescription().c_str())); + + Common::String tooltip(_("Name: ")); + tooltip += desc.getDescription(); + + if (_saveDateSupport) { + const Common::String &saveDate = desc.getSaveDate(); + if (!saveDate.empty()) { + tooltip += "\n"; + tooltip += _("Date: ") + saveDate; + } + + const Common::String &saveTime = desc.getSaveTime(); + if (!saveTime.empty()) { + tooltip += "\n"; + tooltip += _("Time: ") + saveTime; + } + } + + if (_playTimeSupport) { + const Common::String &playTime = desc.getPlayTime(); + if (!playTime.empty()) { + tooltip += "\n"; + tooltip += _("Playtime: ") + playTime; + } + } + + curButton.button->setTooltip(tooltip); } if (_curPage > 0) -- cgit v1.2.3 From e10e412bba99090b67a99cd7fddd5405172452f1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 21 May 2012 21:21:48 +0300 Subject: COMMON: Allow the savefile manager to create uncompressed saves These are useful in cases where the files can be used in the original interpreters (such as the exported characters from QFG), in order to avoid confusion in cases where the users are unaware that these saves are compressed and are trying to load them in the original interpreters. --- backends/platform/ds/arm9/source/gbampsave.cpp | 2 +- backends/platform/ds/arm9/source/gbampsave.h | 2 +- backends/platform/ps2/savefilemgr.cpp | 4 ++-- backends/platform/ps2/savefilemgr.h | 2 +- backends/saves/default/default-saves.cpp | 4 ++-- backends/saves/default/default-saves.h | 2 +- common/savefile.h | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/backends/platform/ds/arm9/source/gbampsave.cpp b/backends/platform/ds/arm9/source/gbampsave.cpp index 03729c5e6e..3192e2d277 100644 --- a/backends/platform/ds/arm9/source/gbampsave.cpp +++ b/backends/platform/ds/arm9/source/gbampsave.cpp @@ -45,7 +45,7 @@ static Common::String getSavePath() { // GBAMP Save File Manager ////////////////////////// -Common::OutSaveFile *GBAMPSaveFileManager::openForSaving(const Common::String &filename) { +Common::OutSaveFile *GBAMPSaveFileManager::openForSaving(const Common::String &filename, bool compress) { Common::String fileSpec = getSavePath(); if (fileSpec.lastChar() != '/') fileSpec += '/'; diff --git a/backends/platform/ds/arm9/source/gbampsave.h b/backends/platform/ds/arm9/source/gbampsave.h index 492054dc52..0d9d9aca8c 100644 --- a/backends/platform/ds/arm9/source/gbampsave.h +++ b/backends/platform/ds/arm9/source/gbampsave.h @@ -27,7 +27,7 @@ class GBAMPSaveFileManager : public Common::SaveFileManager { public: - virtual Common::OutSaveFile *openForSaving(const Common::String &filename); + virtual Common::OutSaveFile *openForSaving(const Common::String &filename, bool compress = true); virtual Common::InSaveFile *openForLoading(const Common::String &filename); virtual bool removeSavefile(const Common::String &filename); diff --git a/backends/platform/ps2/savefilemgr.cpp b/backends/platform/ps2/savefilemgr.cpp index 421edc3e2e..46af42e193 100644 --- a/backends/platform/ps2/savefilemgr.cpp +++ b/backends/platform/ps2/savefilemgr.cpp @@ -145,7 +145,7 @@ Common::InSaveFile *Ps2SaveFileManager::openForLoading(const Common::String &fil return Common::wrapCompressedReadStream(sf); } -Common::OutSaveFile *Ps2SaveFileManager::openForSaving(const Common::String &filename) { +Common::OutSaveFile *Ps2SaveFileManager::openForSaving(const Common::String &filename, bool compress) { Common::FSNode savePath(ConfMan.get("savepath")); // TODO: is this fast? Common::WriteStream *sf; @@ -193,7 +193,7 @@ Common::OutSaveFile *Ps2SaveFileManager::openForSaving(const Common::String &fil } _screen->wantAnim(false); - return Common::wrapCompressedWriteStream(sf); + return compress ? Common::wrapCompressedWriteStream(sf) : sf; } bool Ps2SaveFileManager::removeSavefile(const Common::String &filename) { diff --git a/backends/platform/ps2/savefilemgr.h b/backends/platform/ps2/savefilemgr.h index a25fb063ae..163706eace 100644 --- a/backends/platform/ps2/savefilemgr.h +++ b/backends/platform/ps2/savefilemgr.h @@ -35,7 +35,7 @@ public: virtual ~Ps2SaveFileManager(); virtual Common::InSaveFile *openForLoading(const Common::String &filename); - virtual Common::OutSaveFile *openForSaving(const Common::String &filename); + virtual Common::OutSaveFile *openForSaving(const Common::String &filename, bool compress = true); virtual Common::StringArray listSavefiles(const Common::String &pattern); virtual bool removeSavefile(const Common::String &filename); diff --git a/backends/saves/default/default-saves.cpp b/backends/saves/default/default-saves.cpp index 237c50a1ba..64e7e778b6 100644 --- a/backends/saves/default/default-saves.cpp +++ b/backends/saves/default/default-saves.cpp @@ -97,7 +97,7 @@ Common::InSaveFile *DefaultSaveFileManager::openForLoading(const Common::String return Common::wrapCompressedReadStream(sf); } -Common::OutSaveFile *DefaultSaveFileManager::openForSaving(const Common::String &filename) { +Common::OutSaveFile *DefaultSaveFileManager::openForSaving(const Common::String &filename, bool compress) { // Ensure that the savepath is valid. If not, generate an appropriate error. Common::String savePathName = getSavePath(); checkPath(Common::FSNode(savePathName)); @@ -112,7 +112,7 @@ Common::OutSaveFile *DefaultSaveFileManager::openForSaving(const Common::String // Open the file for saving Common::WriteStream *sf = file.createWriteStream(); - return Common::wrapCompressedWriteStream(sf); + return compress ? Common::wrapCompressedWriteStream(sf) : sf; } bool DefaultSaveFileManager::removeSavefile(const Common::String &filename) { diff --git a/backends/saves/default/default-saves.h b/backends/saves/default/default-saves.h index 1ea87efc67..c7fca279bc 100644 --- a/backends/saves/default/default-saves.h +++ b/backends/saves/default/default-saves.h @@ -38,7 +38,7 @@ public: virtual Common::StringArray listSavefiles(const Common::String &pattern); virtual Common::InSaveFile *openForLoading(const Common::String &filename); - virtual Common::OutSaveFile *openForSaving(const Common::String &filename); + virtual Common::OutSaveFile *openForSaving(const Common::String &filename, bool compress = true); virtual bool removeSavefile(const Common::String &filename); protected: diff --git a/common/savefile.h b/common/savefile.h index 03a7b52add..3aa0f423e3 100644 --- a/common/savefile.h +++ b/common/savefile.h @@ -108,7 +108,7 @@ public: * @param name the name of the savefile * @return pointer to an OutSaveFile, or NULL if an error occurred. */ - virtual OutSaveFile *openForSaving(const String &name) = 0; + virtual OutSaveFile *openForSaving(const String &name, bool compress = true) = 0; /** * Open the file with the specified name in the given directory for loading. -- cgit v1.2.3 From 4c4a127ca23ca55ec4f3348b40553ac5f72a3892 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 21 May 2012 23:17:28 +0300 Subject: COMMON: Add documentation regarding the new parameter in openForSaving() --- common/savefile.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/savefile.h b/common/savefile.h index 3aa0f423e3..2f4b8a2d5b 100644 --- a/common/savefile.h +++ b/common/savefile.h @@ -105,7 +105,8 @@ public: /** * Open the savefile with the specified name in the given directory for saving. - * @param name the name of the savefile + * @param name the name of the savefile + * @param compress toggles whether to compress the resulting save file (default) or not. * @return pointer to an OutSaveFile, or NULL if an error occurred. */ virtual OutSaveFile *openForSaving(const String &name, bool compress = true) = 0; -- cgit v1.2.3 From c9ace6426ebd4cac2777f199848dcfa5770b65ca Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 21 Jun 2012 10:35:27 +0300 Subject: COMMON: Add a detailed explanation on when to create uncompressed saves --- common/savefile.h | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/common/savefile.h b/common/savefile.h index 2f4b8a2d5b..abe0df2758 100644 --- a/common/savefile.h +++ b/common/savefile.h @@ -104,9 +104,32 @@ public: virtual String popErrorDesc(); /** - * Open the savefile with the specified name in the given directory for saving. + * Open the savefile with the specified name in the given directory for + * saving. + * + * Saved games are always compressed using ZIP compression on platforms + * where the zlib library is included (i.e. almost all platforms except the + * NDS). Engines are expected to always create compressed saved games. + * A notable exception is when the created saved games are compatible with + * the ones that the original interpreters create, and they are then used + * with later game versions in a game series which are not supported by + * ScummVM. An example is the characters exported in the Quest for Glory + * games: these saved states actually contain simple text strings with + * character attributes, which can then be used with later games in the + * Quest for Glory Series. Currently, ScummVM supports Quest for Glory + * 1, 2 and 3. These exported heroes can also be read by the AGS VGA fan + * made version of Quest for Glory 2 and the SCI32 game Quest for Glory IV, + * none of which is supported by ScummVM yet. Moreover, these heroes can + * also be imported into Quest for Glory V, which is a 3D game and thus + * outside of ScummVM's scope. For these reasons, in such cases engines can + * create uncompressed saved games to help users import them in other games + * not supported by ScummVM. Users only need to know that such saved games + * exported by ScummVM are compatible with later unsupported games, without + * needing to explain how to uncompress them. + * * @param name the name of the savefile - * @param compress toggles whether to compress the resulting save file (default) or not. + * @param compress toggles whether to compress the resulting save file + * (default) or not. * @return pointer to an OutSaveFile, or NULL if an error occurred. */ virtual OutSaveFile *openForSaving(const String &name, bool compress = true) = 0; -- cgit v1.2.3 From eb8230988a413ffff3458f0cfade5a94c95940b1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 21 Jun 2012 12:15:25 +0300 Subject: SCI: Don't compress exported heroes in the Quest for Glory games This allows them to be used by other games in the series not supported by ScummVM (i.e. QFG4, QFG5 and the fanmade AGS version of QFG2) --- engines/sci/engine/file.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/file.cpp b/engines/sci/engine/file.cpp index 0d575f97dd..a0f7ebf4a2 100644 --- a/engines/sci/engine/file.cpp +++ b/engines/sci/engine/file.cpp @@ -57,11 +57,24 @@ namespace Sci { reg_t file_open(EngineState *s, const Common::String &filename, int mode, bool unwrapFilename) { Common::String englishName = g_sci->getSciLanguageString(filename, K_LANG_ENGLISH); + englishName.toLowercase(); + Common::String wrappedName = unwrapFilename ? g_sci->wrapFilename(englishName) : englishName; Common::SeekableReadStream *inFile = 0; Common::WriteStream *outFile = 0; Common::SaveFileManager *saveFileMan = g_sci->getSaveFileManager(); + bool isCompressed = true; + const SciGameId gameId = g_sci->getGameId(); + if ((gameId == GID_QFG1 || gameId == GID_QFG1VGA || gameId == GID_QFG2 || gameId == GID_QFG3) + && englishName.hasSuffix(".sav")) { + // QFG Characters are saved via the CharSave object. + // We leave them uncompressed so that they can be imported in later QFG + // games. + // Rooms/Scripts: QFG1: 601, QFG2: 840, QFG3/4: 52 + isCompressed = false; + } + if (mode == _K_FILE_MODE_OPEN_OR_FAIL) { // Try to open file, abort if not possible inFile = saveFileMan->openForLoading(wrappedName); @@ -74,12 +87,12 @@ reg_t file_open(EngineState *s, const Common::String &filename, int mode, bool u debugC(kDebugLevelFile, " -> file_open(_K_FILE_MODE_OPEN_OR_FAIL): failed to open file '%s'", englishName.c_str()); } else if (mode == _K_FILE_MODE_CREATE) { // Create the file, destroying any content it might have had - outFile = saveFileMan->openForSaving(wrappedName); + outFile = saveFileMan->openForSaving(wrappedName, isCompressed); if (!outFile) debugC(kDebugLevelFile, " -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); } else if (mode == _K_FILE_MODE_OPEN_OR_CREATE) { // Try to open file, create it if it doesn't exist - outFile = saveFileMan->openForSaving(wrappedName); + outFile = saveFileMan->openForSaving(wrappedName, isCompressed); if (!outFile) debugC(kDebugLevelFile, " -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); -- cgit v1.2.3 From 478fd0ed2957a766df2860c66fa476aa3665fc8f Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sun, 24 Jun 2012 18:17:47 +0200 Subject: CREATE_PROJECT: Clarify license on imported code License confirmed by personal email by littleboy. This clarification was requested in bug #3527268. --- devtools/create_project/xcode.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index 39470f4e19..9784bb0bf5 100644 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -871,7 +871,9 @@ std::string XCodeProvider::writeProperty(const std::string &variable, Property & std::string XCodeProvider::writeSetting(const std::string &variable, std::string value, std::string comment, int flags, int indent) const { return writeSetting(variable, Setting(value, comment, flags, indent)); } -// Heavily modified (not in a good way) function, imported from QMake XCode project generator (licensed under the QT license) + +// Heavily modified (not in a good way) function, imported from the QMake +// XCode project generator pbuilder_pbx.cpp, writeSettings() (under LGPL 2.1) std::string XCodeProvider::writeSetting(const std::string &variable, const Setting &setting) const { std::string output; const std::string quote = (setting.flags & SettingsNoQuote) ? "" : "\""; -- cgit v1.2.3 From 99de89c974fc24bf58b034842750e522d7d441d4 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 24 Jun 2012 19:52:37 +0300 Subject: SCI: Add a workaround for script bug #3537232 The bug in question is "SCI: SQ4 Floppy DOS title screen skipping too quickly", and is caused by game scripts not waiting between palette calls --- engines/sci/engine/kgraphics.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 0ef268f108..ec8e0dbf1b 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -645,6 +645,20 @@ reg_t kPaletteAnimate(EngineState *s, int argc, reg_t *argv) { if (paletteChanged) g_sci->_gfxPalette->kernelAnimateSet(); + // WORKAROUND: The game scripts in SQ4 floppy count the number of elapsed + // cycles in the intro from the number of successive kAnimate calls during + // the palette cycling effect, while showing the SQ4 logo. This worked in + // older computers because each animate call took awhile to complete. + // Normally, such scripts are handled automatically by our speed throttler, + // however in this case there are no calls to kGameIsRestarting (where the + // speed throttler gets called) between the different palette animation calls. + // Thus, we add a small delay between each animate call to make the whole + // palette animation effect slower and visible, and not have the logo screen + // get skipped because the scripts don't wait between animation steps. Fixes + // bug #3537232. + if (g_sci->getGameId() == GID_SQ4 && !g_sci->isCD() && s->currentRoomNumber() == 1) + g_sci->sleep(10); + return s->r_acc; } -- cgit v1.2.3 From 54fba983476987436a1cea3dda7e2e4b004d8fe2 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Thu, 7 Jun 2012 01:46:32 +0100 Subject: SWORD1: Add warning for untranslated subtitles This should help adding workarounds for those by providing all the needed information (textId and english text). --- engines/sword1/objectman.cpp | 26 ++++++++++++++++++++++---- engines/sword1/objectman.h | 3 +++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/engines/sword1/objectman.cpp b/engines/sword1/objectman.cpp index d0803590a7..d3890cc1fc 100644 --- a/engines/sword1/objectman.cpp +++ b/engines/sword1/objectman.cpp @@ -99,13 +99,27 @@ uint8 ObjectMan::fnCheckForTextLine(uint32 textId) { char *ObjectMan::lockText(uint32 textId) { uint8 lang = SwordEngine::_systemVars.language; + char *text = lockText(textId, lang); + if (text == 0) { + if (lang != BS1_ENGLISH) { + text = lockText(textId, BS1_ENGLISH); + if (text != 0) + warning("Missing translation for textId %u (\"%s\")", textId, text); + unlockText(textId, BS1_ENGLISH); + } + return _missingSubTitleStr; + } + return text; +} + +char *ObjectMan::lockText(uint32 textId, uint8 lang) { char *addr = (char *)_resMan->openFetchRes(_textList[textId / ITM_PER_SEC][lang]); if (addr == 0) - return _missingSubTitleStr; + return NULL; addr += sizeof(Header); if ((textId & ITM_ID) >= _resMan->readUint32(addr)) { warning("ObjectMan::lockText(%d): only %d texts in file", textId & ITM_ID, _resMan->readUint32(addr)); - return _missingSubTitleStr; + return NULL; } uint32 offset = _resMan->readUint32(addr + ((textId & ITM_ID) + 1) * 4); if (offset == 0) { @@ -115,13 +129,17 @@ char *ObjectMan::lockText(uint32 textId) { return const_cast(_translationId2950145[lang]); warning("ObjectMan::lockText(%d): text number has no text lines", textId); - return _missingSubTitleStr; + return NULL; } return addr + offset; } void ObjectMan::unlockText(uint32 textId) { - _resMan->resClose(_textList[textId / ITM_PER_SEC][SwordEngine::_systemVars.language]); + unlockText(textId, SwordEngine::_systemVars.language); +} + +void ObjectMan::unlockText(uint32 textId, uint8 lang) { + _resMan->resClose(_textList[textId / ITM_PER_SEC][lang]); } uint32 ObjectMan::lastTextNumber(int section) { diff --git a/engines/sword1/objectman.h b/engines/sword1/objectman.h index ca3c7c1526..cce360573a 100644 --- a/engines/sword1/objectman.h +++ b/engines/sword1/objectman.h @@ -53,6 +53,9 @@ public: void saveLiveList(uint16 *dest); // for loading/saving void loadLiveList(uint16 *src); private: + char *lockText(uint32 textId, uint8 language); + void unlockText(uint32 textId, uint8 language); + ResMan *_resMan; static const uint32 _objectList[TOTAL_SECTIONS]; //a table of pointers to object files static const uint32 _textList[TOTAL_SECTIONS][7]; //a table of pointers to text files -- cgit v1.2.3 From 865488ffcac6226b72ce0ea9b86d2ef2ba5bd266 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 24 Jun 2012 17:27:16 +0100 Subject: I18N: Update Spanish translation from patch #3537204 --- po/es_ES.po | 154 ++++++++++++++++++++++++++++-------------------------------- 1 file changed, 72 insertions(+), 82 deletions(-) diff --git a/po/es_ES.po b/po/es_ES.po index 366dcf4905..612a19ba4a 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.4.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-05-20 22:39+0100\n" -"PO-Revision-Date: 2011-10-23 21:53+0100\n" +"PO-Revision-Date: 2012-06-22 17:44+0100\n" "Last-Translator: Toms Maidagan\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -77,7 +77,6 @@ msgid "Remap keys" msgstr "Asignar teclas" #: gui/gui-manager.cpp:129 base/main.cpp:307 -#, fuzzy msgid "Toggle FullScreen" msgstr "Activar pantalla completa" @@ -193,9 +192,8 @@ msgid "Platform:" msgstr "Plat.:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Examinar" +msgstr "Motor" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -604,7 +602,7 @@ msgstr "Renderizado:" #: gui/options.cpp:741 gui/options.cpp:742 msgid "Special dithering modes supported by some games" -msgstr "Modos especiales de expansin soportados por algunos juegos" +msgstr "Modos especiales de expansin compatibles con algunos juegos" #: gui/options.cpp:753 #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 @@ -692,8 +690,8 @@ msgstr "SoundFont:" #: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -"SoundFont est soportado por algunas tarjetas de sonido, adems de " -"Fluidsynth y Timidity" +"SoundFont es compatible con algunas tarjetas de sonido, con Fluidsynth y con " +"Timidity" #: gui/options.cpp:851 msgctxt "lowres" @@ -895,7 +893,7 @@ msgstr "Idioma de la interfaz de ScummVM" #: gui/options.cpp:1347 msgid "You have to restart ScummVM before your changes will take effect." -msgstr "Tienes que reiniciar ScummVM para que los cambios surjan efecto." +msgstr "Tienes que reiniciar ScummVM para aplicar los cambios." #: gui/options.cpp:1360 msgid "Select directory for savegames" @@ -998,7 +996,7 @@ msgstr "Eliminar valor" #: base/main.cpp:209 #, c-format msgid "Engine does not support debug level '%s'" -msgstr "El motor no soporta el nivel de debug '%s'" +msgstr "El motor no es compatible con el nivel de debug '%s'" #: base/main.cpp:287 msgid "Menu" @@ -1037,11 +1035,11 @@ msgstr "No se han encontrado datos de juego" #: common/error.cpp:42 msgid "Game id not supported" -msgstr "ID del juego no soportada" +msgstr "ID del juego no compatible" #: common/error.cpp:44 msgid "Unsupported color mode" -msgstr "Modo de color no soportado" +msgstr "Modo de color no compatible" #: common/error.cpp:47 msgid "Read permission denied" @@ -1164,14 +1162,14 @@ msgstr "" "para obtener ms ayuda." #: engines/dialogs.cpp:243 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Lo sentimos, an no hay ayuda disponible para este juego. Por favor, " -"consulta el archivo README para encontrar informacin bsica e instrucciones " -"para obtener ms ayuda." +"Ha habido un fallo al guardar la partida (%s). Por favor, consulta el " +"archivo README para encontrar informacin bsica e instrucciones sobre cmo " +"obtener ms ayuda." #: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 @@ -1232,14 +1230,14 @@ msgstr "" "Consulta el archivo README para ms detalles." #: engines/engine.cpp:426 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Lo sentimos, an no hay ayuda disponible para este juego. Por favor, " -"consulta el archivo README para encontrar informacin bsica e instrucciones " -"para obtener ms ayuda." +"Ha habido un fallo al cargar la partida (%s). Por favor, consulta el archivo " +"README para encontrar informacin bsica e instrucciones sobre cmo obtener " +"ms ayuda." #: engines/engine.cpp:439 msgid "" @@ -1253,17 +1251,18 @@ msgstr "" #: engines/engine.cpp:442 msgid "Start anyway" -msgstr "Jugar de todos modos" +msgstr "Jugar aun as" #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Usar pantallas de guardar/cargar originales" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 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" #: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 msgid "Restore game:" @@ -1274,68 +1273,68 @@ msgid "Restore" msgstr "Cargar" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "Objeto superior derecho" +msgstr "Usar paleta original" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Utilizar los niveles de brillo originales del juego" #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "Difuminado EGA" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "Activar difuminado en los juegos EGA compatibles" +msgstr "Activar difuminado en los juegos EGA" #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Volumen de los efectos de sonido" +msgstr "Preferir efectos de sonido digitales" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Preferir efectos de sonido digitales en vez de los sintetizados" #: engines/sci/detection.cpp:400 msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "" +msgstr "Usar IMF/Yahama FB-01 para la salida MIDI" #: engines/sci/detection.cpp:401 msgid "" "Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " "output" msgstr "" +"Usa una tarjeta IBM Music o un mdulo sintetizador Yahama FB-01 FM para la " +"salida MIDI" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "Usar CD audio" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr "Usa CD audio en vez del sonido interno del juego, si est disponible" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Usar cursores de Windows" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" +"Usar los cursores de Windows (ms pequeos y monocromos) en vez de los de DOS" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Cursor normal" +msgstr "Usar cursores plateados" #: engines/sci/detection.cpp:434 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" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -1457,7 +1456,7 @@ msgstr "Selecciona un nivel de dificultad." #: engines/scumm/dialogs.cpp:655 msgid "Refer to your Loom(TM) manual for help." -msgstr "Mira en el Manual para mayor informacin." +msgstr "Consulta el manual para obtener ms informacin." #: engines/scumm/dialogs.cpp:658 msgid "Standard" @@ -2088,115 +2087,107 @@ msgstr "Fallo al guardar la partida" #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Risas del pblico" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Activa las risas del pblico" #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr "Permitir omisiones" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Permite saltarse frases y vdeos" #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Modo helio" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Activar modo Roland GS" +msgstr "Activa el modo helio" #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Desplazamiento suave" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Activa el desplazamiento de pantalla suave al caminar" #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Cursor normal" +msgstr "Cursores flotantes" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Activar cursores flotantes" #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr "Barras de energa" #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr "Activa las barras de energa" #: engines/kyra/lol.cpp:478 msgid "Attack 1" -msgstr "" +msgstr "Ataque 1" #: engines/kyra/lol.cpp:479 msgid "Attack 2" -msgstr "" +msgstr "Ataque 2" #: engines/kyra/lol.cpp:480 msgid "Attack 3" -msgstr "" +msgstr "Ataque 3" #: engines/kyra/lol.cpp:481 msgid "Move Forward" -msgstr "" +msgstr "Avanzar" #: engines/kyra/lol.cpp:482 msgid "Move Back" -msgstr "" +msgstr "Retroceder" #: engines/kyra/lol.cpp:483 msgid "Slide Left" -msgstr "" +msgstr "Deslizarse a la izquierda" #: engines/kyra/lol.cpp:484 -#, fuzzy msgid "Slide Right" -msgstr "Derecha" +msgstr "Deslizarse a la derecha" #: engines/kyra/lol.cpp:485 -#, fuzzy msgid "Turn Left" -msgstr "Apagar" +msgstr "Girar a la izquierda" #: engines/kyra/lol.cpp:486 -#, fuzzy msgid "Turn Right" -msgstr "Derecha" +msgstr "Girar a la derecha" #: engines/kyra/lol.cpp:487 -#, fuzzy msgid "Rest" -msgstr "Cargar" +msgstr "Descansar" #: engines/kyra/lol.cpp:488 -#, fuzzy msgid "Options" -msgstr "~O~pciones" +msgstr "Opciones" #: engines/kyra/lol.cpp:489 -#, fuzzy msgid "Choose Spell" -msgstr "Aceptar" +msgstr "Elegir hechizo" #: engines/kyra/sound_midi.cpp:475 msgid "" @@ -2206,19 +2197,20 @@ msgid "" "General MIDI ones. After all it might happen\n" "that a few tracks will not be correctly played." msgstr "" -"Ests usando un dispositivo General Midi,\n" -"pero el juego solo soporta MIDI Roland MT32.\n" +"Ests usando un dispositivo General Midi, pero el\n" +"juego solo es compatible con MIDI Roland MT32.\n" "Intentamos adaptar los instrumentos Roland MT32\n" "a los de General MIDI, pero es posible que algunas\n" "de las pistas no se reproduzcan correctamente." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Intro de disquete" #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" msgstr "" +"Usa la introduccin de la versin en disquete (solo para la versin CD)" #: engines/sky/compact.cpp:130 msgid "" @@ -2239,7 +2231,7 @@ msgstr "" #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" -msgstr "" +msgstr "El vdeo de PSX '%s' no se puede reproducir en modo paleta" #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" @@ -2295,19 +2287,19 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "Este es el final de la demo de Broken Sword 1" #: engines/sword2/animation.cpp:435 -#, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" -"Se han encontrado vdeos DXA, pero se ha compilado ScummVM sin soporte zlib" +"Se han encontrado vdeos PSX, pero se ha compilado ScummVM sin soporte de " +"color RGB" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr "Mostrar etiquetas de objetos" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr "Muestra las etiquetas de los objetos al pasar el ratn" #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2449,7 +2441,6 @@ msgid "Keymap:" msgstr "Asignacin de teclas:" #: backends/keymapper/remap-dialog.cpp:66 -#, fuzzy msgid " (Effective)" msgstr "(Activa)" @@ -2459,7 +2450,7 @@ msgstr "(Activa)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr "(Bloqueado)" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" @@ -2563,7 +2554,7 @@ msgstr "Modo Touchpad desactivado." #: backends/platform/maemo/maemo.cpp:205 msgid "Click Mode" -msgstr "" +msgstr "Modo clic" #: backends/platform/maemo/maemo.cpp:211 #: backends/platform/symbian/src/SymbianActions.cpp:42 @@ -2574,9 +2565,8 @@ msgid "Left Click" msgstr "Clic izquierdo" #: backends/platform/maemo/maemo.cpp:214 -#, fuzzy msgid "Middle Click" -msgstr "Objeto izquierdo del medio" +msgstr "Clic central" #: backends/platform/maemo/maemo.cpp:217 #: backends/platform/symbian/src/SymbianActions.cpp:43 @@ -3019,7 +3009,7 @@ msgstr "Bajando el volumen" #: backends/updates/macosx/macosx-updates.mm:65 msgid "Check for Updates..." -msgstr "Comprobando las actualizaciones..." +msgstr "Buscar actualizaciones..." #: backends/platform/bada/form.cpp:269 msgid "Right Click Once" -- cgit v1.2.3 From 314f76503f7ba0fd3f4140cc6670f8c7b7e3aedd Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 24 Jun 2012 17:57:07 +0100 Subject: I18N: Regenerate translations data file --- gui/themes/translations.dat | Bin 312684 -> 314939 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 1463b70212..f4a3a96084 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From 0bd7d1d1b4ba23fddfd4dea685125abebf275cb4 Mon Sep 17 00:00:00 2001 From: Simon Sawatzki Date: Sun, 24 Jun 2012 19:12:06 +0200 Subject: I18N: Updated German GUI translation. --- po/de_DE.po | 145 +++++++++++++++++++++++++++++------------------------------- 1 file changed, 69 insertions(+), 76 deletions(-) diff --git a/po/de_DE.po b/po/de_DE.po index e11a3d4fc7..9a4d9acd79 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ScummVM 1.4.0git\n" +"Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-05-20 22:39+0100\n" -"PO-Revision-Date: 2012-01-29 21:11+0100\n" +"PO-Revision-Date: 2012-06-07 13:48+0100\n" "Last-Translator: Simon Sawatzki \n" "Language-Team: Simon Sawatzki (Lead), Lothar Serra Mari " " (Contributor)\n" @@ -79,9 +79,8 @@ msgid "Remap keys" msgstr "Tasten neu zuweisen" #: gui/gui-manager.cpp:129 base/main.cpp:307 -#, fuzzy msgid "Toggle FullScreen" -msgstr "Vollbild-/Fenster-Modus" +msgstr "Vollbild EIN/AUS" #: gui/KeysDialog.h:36 gui/KeysDialog.cpp:145 msgid "Choose an action to map" @@ -195,9 +194,8 @@ msgid "Platform:" msgstr "Plattform:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Betrachte" +msgstr "Engine" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -788,7 +786,7 @@ msgstr "Spr." #: gui/options.cpp:931 msgid "Subs" -msgstr "TXT" +msgstr "Text" #: gui/options.cpp:932 msgctxt "lowres" @@ -1172,18 +1170,16 @@ msgid "" "further assistance." msgstr "" "Leider bietet diese Engine keine Spielhilfe. Bitte lesen Sie die Liesmich-" -"Datei fr grundlegende Informationen und Anweisungen dazu, wie man an " -"weitere Hilfe gelangt." +"Datei fr grundlegende Informationen und Anweisungen zu weiterer Hilfe." #: engines/dialogs.cpp:243 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Leider bietet diese Engine keine Spielhilfe. Bitte lesen Sie die Liesmich-" -"Datei fr grundlegende Informationen und Anweisungen dazu, wie man an " -"weitere Hilfe gelangt." +"Speichern des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-" +"Datei fr grundlegende Informationen und Anweisungen zu weiterer Hilfe." #: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 @@ -1247,14 +1243,13 @@ msgstr "" "Liesmich-Datei fr weitere Informationen." #: engines/engine.cpp:426 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Leider bietet diese Engine keine Spielhilfe. Bitte lesen Sie die Liesmich-" -"Datei fr grundlegende Informationen und Anweisungen dazu, wie man an " -"weitere Hilfe gelangt." +"Laden des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-" +"Datei fr grundlegende Informationen und Anweisungen zu weiterer Hilfe." #: engines/engine.cpp:439 msgid "" @@ -1274,12 +1269,12 @@ msgstr "Trotzdem starten" #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Originale Spielstand-Mens" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" -msgstr "" +msgstr "Verwendet die originalen Mens zum Speichern und Laden statt der von ScummVM." #: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 msgid "Restore game:" @@ -1290,70 +1285,70 @@ msgid "Restore" msgstr "Laden" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "Oberer rechter Gegenstand" +msgstr "Modus fr helle Palette verwenden" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Zeigt Grafiken ber helle Spielpalette an." #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "Antifehlerdiffusion fr EGA" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "" -"Aktiviert die Aufhebung der Fehlerdiffusion in EGA-Spielen, die dies " -"untersttzen." +msgstr "Aktiviert die Aufhebung der Fehlerdiffusion in EGA-Spielen." #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Lautstrke spezieller Soundeffekte" +msgstr "Digitale Sound-Effekte bevorzugen" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Bevorzugt digitale Sound-Effekte statt synthethisierter." #: engines/sci/detection.cpp:400 msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "" +msgstr "IMF/Yahama FB-01 fr MIDI-Ausgabe verwenden" #: engines/sci/detection.cpp:401 msgid "" "Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " "output" msgstr "" +"Verwendet eine Music-Feature-Karte von IBM oder ein " +"Yahama-FB-01-FM-Synthetisierungsmodul fr die MIDI-Ausgabe." #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "CD-Ton verwenden" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr "Verwendet CD-Ton anstatt des Tons im Spiel, sofern verfgbar." #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Windows-Mauszeiger verwenden" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" +"Verwendet die Windows-Mauszeiger (kleiner und schwarz-wei) anstatt der von " +"DOS." #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Normaler Mauszeiger" +msgstr "Silberne Mauszeiger verwenden" #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" +"Verwendet alternativen Satz silberner Mauszeiger anstatt der normalen " +"goldenen." #: engines/scumm/dialogs.cpp:175 #, c-format @@ -2008,8 +2003,9 @@ msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" "but %s is missing. Using AdLib instead." msgstr "" -"Systemeigene MIDI-ntersttzung erfordert das Roland-Upgrade von LucasArts,\n" -"aber %s fehlt. Stattdessen wird AdLib verwendet." +"Systemeigene MIDI-ntersttzung erfordert das\n" +"Roland-Upgrade von LucasArts, aber %s\n" +"fehlt. Stattdessen wird AdLib verwendet." #: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 #, c-format @@ -2107,61 +2103,59 @@ msgstr "Konnte Spielstand nicht speichern." #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Studio-Publikum" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Aktiviert Studio-Publikum." #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr "berspring-Untersttzung" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Erlaubt das berspringen von Textteilen und Zwischensequenzen." #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Helium-Modus" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Roland-GS-Modus" +msgstr "Aktiviert Helium-Modus." #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Gleichmiges Scrollen" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Aktiviert gleichmiges Scrollen beim Gehen." #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Normaler Mauszeiger" +msgstr "Richtungspfeil-Mauszeiger" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Aktiviert Richtungspfeil-Mauszeiger." #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr "Trefferpunkte-Balken" #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr "Aktiviert grafische Trefferpunkte-Balken." #: engines/kyra/lol.cpp:478 msgid "Attack 1" @@ -2222,17 +2216,18 @@ msgstr "" "Sie scheinen ein General-MIDI-Gert zu\n" "verwenden, aber das Spiel untersttzt nur\n" "Roland MT-32 MIDI. Es wird versucht, die\n" -"Roland-MT-32-Instrumente denen von General MIDI\n" -"zuzuordnen. Es kann jedoch vorkommen, dass ein\n" -"paar Musikstcke nicht richtig abgespielt werden." +"Roland-MT-32-Instrumente denen von\n" +"General MIDI zuzuordnen. Es kann jedoch\n" +"vorkommen, dass ein paar Musikstcke nicht\n" +"richtig abgespielt werden." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Disketten-Vorspann" #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr "Verwendet den Vorspann der Diskettenversion (nur bei CD-Version)." #: engines/sky/compact.cpp:130 msgid "" @@ -2256,6 +2251,7 @@ msgstr "" #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" +"PSX-Zwischensequenz \"%s\" kann in Palettenmodus nicht wiedergegeben werden." #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" @@ -2282,13 +2278,13 @@ msgid "" "Press OK to convert them now, otherwise you will be asked again the next " "time you start the game.\n" msgstr "" -"ScummVM hat erkannt, dass Sie alte Speicherstnde von Baphomets Fluch 1 " +"ScummVM hat erkannt, dass Sie alte Spielstnde von Baphomets Fluch 1 " "haben, die umgewandelt werden sollten.\n" -"Das alte Spielstandsformat wird nicht mehr untersttzt, also knnen Sie " -"diese Speicherstnde nicht laden, wenn Sie diese nicht konvertieren.\n" +"Das alte Speicherformat wird nicht mehr untersttzt, also knnen Sie " +"diese Spielstnde unkonvertiert nicht laden.\n" "\n" -"Klicken Sie auf OK, um diese jetzt umzuwandeln, ansonsten werden Sie erneut " -"gefragt, wenn Sie das nchste Mal dieses Spiel starten.\n" +"Klicken Sie auf OK, um diese jetzt umzuwandeln, sonst werden Sie erneut " +"gefragt, wenn Sie nchstes Mal dieses Spiel starten.\n" #: engines/sword1/control.cpp:1232 #, c-format @@ -2312,20 +2308,19 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "Das ist das Ende der Demo von Broken Sword 1 (Baphomets Fluch 1)." #: engines/sword2/animation.cpp:435 -#, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" -"DXA-Zwischensequenzen gefunden, aber ScummVM wurde ohne Zlib-Untersttzung " -"erstellt." +"PSX-Zwischensequenzen gefunden, aber ScummVM wurde ohne Untersttzung " +"fr RGB-Farben erstellt." #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr "Objektnamen zeigen" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr "Zeigt Objektbeschriftungen bei Mausberhrung an." #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2353,13 +2348,13 @@ msgid "" "\n" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" -"ScummVM hat erkannt, dass Sie alte Speicherstnde von Nippon Safes haben, " +"ScummVM hat erkannt, dass Sie alte Spielstnde von Nippon Safes haben, " "die umbenannt werden sollten.\n" "Die alten Dateinamen werden nicht mehr untersttzt, also knnen Sie diese " -"Speicherstnde nicht laden, wenn Sie diese nicht konvertieren.\n" +"Spielstnde unkonvertiert nicht laden.\n" "\n" -"Klicken Sie auf OK, um diese jetzt umzuwandeln, ansonsten werden Sie erneut " -"gefragt, wenn Sie das nchste Mal dieses Spiel starten.\n" +"Klicken Sie auf OK, um diese jetzt umzuwandeln, sonst werden Sie erneut " +"gefragt, wenn Sie nchstes Mal dieses Spiel starten.\n" #: engines/parallaction/saveload.cpp:326 msgid "ScummVM successfully converted all your savefiles." @@ -2467,9 +2462,8 @@ msgid "Keymap:" msgstr "Tasten-Layout:" #: backends/keymapper/remap-dialog.cpp:66 -#, fuzzy msgid " (Effective)" -msgstr " (Aktiv)" +msgstr " (Aktuell)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Active)" @@ -2477,7 +2471,7 @@ msgstr " (Aktiv)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr " (Blockiert)" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" @@ -2581,7 +2575,7 @@ msgstr "Touchpad-Modus ausgeschaltet." #: backends/platform/maemo/maemo.cpp:205 msgid "Click Mode" -msgstr "" +msgstr "Klickmodus" #: backends/platform/maemo/maemo.cpp:211 #: backends/platform/symbian/src/SymbianActions.cpp:42 @@ -2592,9 +2586,8 @@ msgid "Left Click" msgstr "Linksklick" #: backends/platform/maemo/maemo.cpp:214 -#, fuzzy msgid "Middle Click" -msgstr "Mittlerer linker Gegenstand" +msgstr "Mittelklick" #: backends/platform/maemo/maemo.cpp:217 #: backends/platform/symbian/src/SymbianActions.cpp:43 -- cgit v1.2.3 From 97168d52852cae7e525695e3c4d5691801fdf029 Mon Sep 17 00:00:00 2001 From: Simon Sawatzki Date: Sun, 24 Jun 2012 19:13:42 +0200 Subject: DOCS: Updated German README (Liesmich) and NEWS (Neues). Liesmich now based on README SHA1 ID: d860f0f9bf823655844c5fc56a5ac8f94774aa23 Neues now based on NEWS SHA1 ID: 555afaa50c45a51e53c88c6cb1d52a66ba367fd5 --- doc/de/Liesmich | 143 +++++++++++++++++++++++++++++++++++++++++++++----------- doc/de/Neues | 85 ++++++++++++++++++++++++++------- 2 files changed, 183 insertions(+), 45 deletions(-) diff --git a/doc/de/Liesmich b/doc/de/Liesmich index 5d24ec050b..e8ee4ca3f8 100644 --- a/doc/de/Liesmich +++ b/doc/de/Liesmich @@ -56,6 +56,8 @@ Inhaltsverzeichnis: * 7.8 Komprimierte Audio-Dateien verwenden (MP3, Ogg Vorbis, FLAC) * 7.9 Ausgabefrequenzen 8.0) Konfigurationsdatei + * 8.1 Verwendbare Konfigurationsschlüsselwörter + * 8.2 Spielspezifische Optionen bei der grafischen Benutzeroberfläche 9.0) Kompilierung @@ -273,11 +275,16 @@ AGOS-Spiele von Adventuresoft/Horrorsoft: Floyd - Es gibt noch Helden [feeble] GOB-Spiele von Coktel Vision: + Bambou le sauveur de la jungle [bambou] Bargon Attack [bargon] + Fascination [fascination] + Geisha [geisha] Gobliiins [gob1] Gobliins 2 [gob2] Goblins 3 [gob3] Lost in Time [lostintime] + Once Upon A Time: Little Red Riding Hood [littlered] + Urban Runner [urban] Woodruff and the Schnibble of Azimuth [woodruff] Ween: The Prophecy [ween] @@ -310,6 +317,7 @@ Andere Spiele: SCUMM-Spiele von Humongous Entertainment: Backyard Baseball [baseball] Backyard Baseball 2001 [baseball2001] + Backyard Baseball 2003 [baseball2003] Backyard Football [football] Big Thinkers First Grade [thinker1] Big Thinkers Kindergarten [thinkerk] @@ -378,7 +386,6 @@ Wenn Sie über den neusten Stand bezüglich der Kompatibilität des Spiels erfah möchten, besuchen Sie unsere Website und schauen Sie in der Kompatibilitätsliste nach. - Backyard Baseball 2003 [baseball2003] Backyard Football 2002 [football2002] Backyard Soccer [soccer] Backyard Soccer MLS [soccermls] @@ -558,6 +565,15 @@ Zwischensequenzen, aber diese sind von niedrigerer Qualität.) Sie können sie auch in einem Unterverzeichnis namens „video“ ablegen, wenn Ihnen das lieber ist. +Bei PlayStation-Versionen können Sie die Original-Videos von CD ausgeben lassen. +Alle Dateien mit der Endung „STR“ sollten als Raw-Sektoren von der CD ausgelesen +werden (alle 2352 Bytes pro Sektor). Sie können stattdessen auch die weiter +unten erwähnten umgewandelten Zwischensequenzen verwenden, aber dies +funktioniert nicht bei allen Videos in Baphomets Fluch II. Weitere Informationen +finden Sie hier: + + http://wiki.scummvm.org/index.php/HOWTO-PlayStation_Videos + Einige Neuausgaben der Spiele, wie beispielsweise die PlayStation-Version, haben keine Smacker-Videos. Revolution Software hat uns freundlicherweise erlaubt, die Zwischensequenzen umgewandelt auf unserer Website als Download zur Verfügung zu @@ -577,9 +593,11 @@ Ogg-Vorbis-Audio angeboten. Um diese Zwischensequenzen mit Ogg-Vorbis-Audio abspielen zu können, ist eine Version von ScummVM erforderlich, die sowohl mit Unterstützung von libVorbis als auch zlib kompiliert wurde. -Für Baphomets Fluch bieten wir auch ein Untertitel-Paket an. Entpacken Sie es -einfach und folgen Sie den Anweisungen in der liesmich.txt. (Baphomets Fluch II -hat bereits Untertitel; für diese ist keine zusätzliche Arbeit notwendig.) +Für Baphomets Fluch bieten wir außerdem ein Untertitelpaket an. Entpacken Sie es +einfach und folgen Sie den Anweisungen in der liesmich.txt. Das Untertitelpaket +funktioniert momentan nicht bei der Verwendung von PlayStation-Videos. +(Baphomets Fluch II hat bereits Untertitel; für diese ist keine zusätzliche +Arbeit notwendig.) 3.7.2) Zwischensequenzen von Baphomets Fluch I und II im Rückblick: @@ -800,11 +818,11 @@ originale EXE-Datei des Spiels (mickey.exe) sowie die Spieldateien. Für das Spiel gibt es unter ScummVM umfangreiche Mausunterstützung, obwohl es im Originalspiel überhaupt keine Mausunterstützung gab. Menüpunkte können mit der -Maus ausgewählt werden und es ist auch möglich, mittels Maus an andere Orten zu -wechseln. Wenn die Maus über die Kanten des Bildschirms bewegt wird, ändert sich +Maus ausgewählt werden und es ist auch möglich, mittels Maus an andere Orte zu +wechseln. Wenn die Maus über den Rand des Bildschirms bewegt wird, ändert sich die Farbe des Zeigers in Rot, wenn es möglich ist, in diese Richtung zu gehen. -Der Spieler kann dann einfach auf die Kanten des Spielbildschirms klicken, um -den Ort zu wechseln, ähnlich wie in vielen Adventures, was einfacher und viel +Der Spieler kann dann einfach auf den Rand des Spielbildschirms klicken, um den +Ort zu wechseln, ähnlich wie in vielen Adventures, was einfacher und viel unkomplizierter ist, als sich mit dem Menü umherzubewegen. @@ -815,11 +833,11 @@ importieren. Für das Spiel gibt es unter ScummVM umfangreiche Mausunterstützung, obwohl es im Originalspiel überhaupt keine Mausunterstützung gab. Menüpunkte können mit der -Maus ausgewählt werden und es ist auch möglich, mittels Maus an andere Orten zu -wechseln. Wenn die Maus über die Kanten des Bildschirms bewegt wird, ändert sich +Maus ausgewählt werden und es ist auch möglich, mittels Maus an andere Orte zu +wechseln. Wenn die Maus über den Rand des Bildschirms bewegt wird, ändert sich die Farbe des Zeigers in Rot, wenn es möglich ist, in diese Richtung zu gehen. -Der Spieler kann dann einfach auf die Kanten des Spielbildschirms klicken, um -den Ort zu wechseln, ähnlich wie in vielen Adventures, was einfacher und viel +Der Spieler kann dann einfach auf den Rand des Spielbildschirms klicken, um den +Ort zu wechseln, ähnlich wie in vielen Adventures, was einfacher und viel unkomplizierter ist, als sich mit dem Menü umherzubewegen. @@ -903,7 +921,7 @@ Kompatibilitätsseite der Website aufgeführt ist, sehen Sie bitte im Abschnitt - Sprache und Untertitel zusammen führen manchmal dazu, dass die Sprachausgabe vorzeitig abgeschnitten wird. Dies ist eine Beschränkung des Originalspiels. - - Nur die Standardsprache (Englisch) der Spieldaten wird bei den Amiga- und + - Nur die Standard-Sprache (Englisch) der Spieldaten wird bei den Amiga- und Macintosh-Versionen unterstützt. Simon the Sorcerer's Game Pack: @@ -1044,7 +1062,7 @@ gestartet werden -- siehe nächster Abschnitt. --debugflags=FLAGGEN Aktiviert für Engine spezifische Debug-Flaggen (getrennt durch Kommas). -u, --dump-scripts Aktiviert die Skriptausgabe, wenn ein Verzeichnis - namens 'dumps' im aktuellen Verzeichnis existiert. + namens „dumps“ im aktuellen Verzeichnis existiert. --cdrom=ZAHL CD-Laufwerk, von dem CD-Titel wiedergegeben werden sollen (Standard: 0 = erstes Laufwerk) @@ -1436,7 +1454,7 @@ Spielstände werden bei einigen Plattformen standardmäßig im aktuellen Verzeichnis gespeichert und bei anderen in voreingestellten Verzeichnissen. Sehen Sie sich das Beispiel weiter unten in dieser Liesmich-Datei an. -Die folgenden Plattformen haben ein anderes Standardverzeichnis: +Die folgenden Plattformen haben ein anderes Standard-Verzeichnis: Mac OS X: $HOME/Documents/ScummVM Savegames/ @@ -1454,6 +1472,11 @@ Die folgenden Plattformen haben ein anderes Standardverzeichnis: \Profiles\Benutzername\ Application Data\ScummVM\Saved games\ +Hinweis für Anwender von Windows NT4/2000/XP/Vista/7: Das Standard-Verzeichnis +für Spielstände wurde bei ScummVM 1.5.0 geändert. Die Stapelverarbeitungsdatei +migration.bat kann verwendet werden, um die Spielstände vom alten +Standard-Verzeichnis in das neue zu kopieren. + 6.1) Automatische Spielstände: ---- ------------------------- @@ -1797,7 +1820,7 @@ SoundFonts): fluidsynth -m alsa_seq /Pfad/zu/8mbgmsfx.sf2 Wenn einmal TiMidity oder FluidSynth laufen, verwenden Sie den Befehl -„aconnect -o -l“, der bereits in diesem Abschnitt beschrieben wurde. +„aconnect -o -l”, der bereits in diesem Abschnitt beschrieben wurde. 7.6.2) Sound-Wiedergabe mittels IRIX-dmedia-Sequenzer: [NUR IN UNIX] @@ -1839,7 +1862,7 @@ Dienstprogramm): Nun können Sie ScummVM starten und TiMidity für Musikausgabe auswählen. Standardmäßig wird das Programm mit dem localhost:7777 verbunden, aber Sie -können Host und Port über die Umgebungsvariable „TIMIDITY_HOST“ ändern. Sie +können Host und Port über die Umgebungsvariable „TIMIDITY_HOST” ändern. Sie können auch eine „Gerätenummer“ über die Umgebungsvariable „SCUMMVM_MIDIPORT“ festlegen. @@ -2117,10 +2140,13 @@ Eine beispielhafte Konfigurationsdatei sieht wie folgt aus: path=C:\amiga_mi2\ music_driver=windows -Erklärung zu nachfolgender Liste: In der nachfolgenden Liste mit -Schlüsselwörtern werden rechts das Schlüsselwort, in der Mitte der Typ der -erwarteten Zuweisung und rechts die Erklärung angezeigt. Der Typ „Bool“ bedeutet -Wahrheitswert. Er kann entweder „true“ (wahr) oder „false“ (falsch) sein. + +8.1) Verwendbare Konfigurationsschlüsselwörter +---- ----------------------------------------- +In der nachfolgenden Liste mit Schlüsselwörtern für die Konfigurationsdatei +werden rechts das Schlüsselwort, in der Mitte der Typ der erwarteten Zuweisung +und rechts die Erklärung angezeigt. Der Typ „Bool“ bedeutet Wahrheitswert. Er +kann entweder „true“ (wahr) oder „false“ (falsch) sein. Die folgenden Schlüsselwörter werden erkannt: @@ -2149,8 +2175,6 @@ Die folgenden Schlüsselwörter werden erkannt: fullscreen Bool Vollbildmodus aspect_ratio Bool Seitenverhältniskorrektur - disable_dithering Bool Entfernung von Fehlerdiffusionsartefakten in - EGA-Spielen gfx_mode Text Grafikmodus (normal, 2x, 3x, 2xsai, super2xsai, supereagle, advmame2x, advmame3x, hq2x, hq3x, tv2x, dotmatrix) @@ -2198,6 +2222,28 @@ Die folgenden Schlüsselwörter werden erkannt: boot_param Zahl Ruft Boot-Skript mit dieser Nummer auf. +Sierra-Spiele, welche die AGI-Engine verwenden, verfügen zusätzlich über +folgendes nicht standardmäßiges Schlüsselwort: + + originalsaveload Bool Falls „true“, werden die originalen Menüs zum + Speichern und Laden statt der + erweiterten von ScummVM verwendet. + +Sierra-Spiele, welche die SCI-Engine verwenden, verfügen zusätzlich über +folgende nicht standardmäßige Schlüsselwörter: + + disable_dithering Bool Entfernung von Fehlerdiffusionsartefakten in + EGA-Spielen + prefer_digitalsfx Bool Falls „true“, werden digitale Sound-Effekte + statt synthetisierter bevorzugt. + originalsaveload Bool Falls „true“, werden die originalen Menüs zum + Speichern und Laden statt der + erweiterten von ScummVM verwendet. + native_fb01 Bool Falls „true“, wird für die MIDI-Ausgabe + der Musiktreiber für eine Music-Feature-Karte + von IBM oder für ein Yahama-FB-01-FM- + Synthetisierungsmodul verwendet. + Baphomets Fluch II verfügt zusätzlich über folgende nicht standardmäßige Schlüsselwörter: @@ -2213,6 +2259,12 @@ Schlüsselwörter: music_mute Bool Falls „true“, wird Musik unterdrückt. sfx_mute Bool Falls „true“, werden Geräusche unterdrückt. +Jones in the Fast Lane verfügt zusätzlich über folgendes nicht standardmäßiges +Schlüsselwort: + + music_mute Bool Falls „true“, wird - sofern verfügbar - CD-Ton + anstatt des Tons im Spiel verwendet. + Die Windows-Version von King's Quest VI verfügt zusätzlich über folgendes nicht standardmäßiges Schlüsselwort: @@ -2223,6 +2275,25 @@ standardmäßiges Schlüsselwort: verwendet - hochskaliert, um zum Rest der hochskalierten Grafiken zu passen. +Lands of Lore: The Throne of Chaos verfügt zusätzlich über folgende nicht +standardmäßige Schlüsselwörter: + + smooth_scrolling Bool Falls „true“, ist das Scrollen gleichmäßiger, + wenn man von einem Bildschirm zum anderen + wechselt. + floating_cursors Bool Falls „true“, verwandelt sich der Mauszeiger in + einen Richtungspfeil, wenn er über den + Bildschirmrand bewegt wird. Durch einen + Mausklick kann der Spieler dann in diese + Richtung gehen. + +Die CD-Version von Space Quest IV verfügt zusätzlich über folgendes nicht +standardmäßiges Schlüsselwort: + + silver_cursors Bool Falls „true“, wird ein alternativer Satz + silberner Mauszeiger verwendet anstatt der + originalen goldenen. + Simon the Sorcerer 1 und 2 verfügen zusätzlich über folgende nicht standardmäßige Schlüsselwörter: @@ -2234,6 +2305,16 @@ Schlüsselwort: walkspeed Zahl Bewegungsgeschwindigkeit (0-4) +The Legend of Kyrandia: Malcolm's Revenge verfügt zusätzlich über folgende nicht +standardmäßige Schlüsselwörter: + + studio_audience Bool Falls „true“, hört man stets Applaus- und + Jubelgeräusche, wenn Malcolm einen Scherz macht. + skip_support Bool Falls „true“, kann der Spieler Textteile und + Zwischensequenzen überspringen. + helium_mode Bool Falls „true“, klingen alle Spielfiguren so, + als hätten sie Helium eingeatmet. + The 7th Guest verfügt zusätzlich über folgendes nicht standardmäßiges Schlüsselwort: @@ -2242,6 +2323,18 @@ Schlüsselwort: im_an_ios [ich bin ein iOS]) +8.2) Spielspezifische Optionen bei der grafischen Benutzeroberfläche +---- --------------------------------------------------------------- +Viele spielspezifische Optionen, die im vorigen Abschnitt aufgeführt wurden, +können über die grafische Benutzeroberfläche angesprochen werden. Falls eine +spielspezifische Option für ein bestimmtes Spiel verfügbar ist, erscheint ein +neuer Reiter mit der Bezeichnung „Engine“, wenn man dieses Spiel hinzufügt oder +dessen Spieloptionen bearbeitet. Falls die spielspezifischen Optionen nicht +angezeigt werden, muss das betreffende Spiel einmal gestartet oder neu zur +Spieleliste hinzugefügt werden. Dadurch wird die Konfiguration von jedem Eintrag +aktualisiert, was die spielspezifischen Optionen zum Vorschein bringt. + + 9.0) Kompilierung: ---- ------------- Für eine aktuelle Übersicht dazu, wie man ScummVM für unterschiedliche @@ -2341,7 +2434,3 @@ Viel Glück und viel Spaß beim Spielen wünscht das ScummVM-Team. http://www.scummvm.org/ ------------------------------------------------------------------------ - - -(Deutscher Text basiert auf README mit SHA1-ID: -d1de75a6ca828ab2fcdbce6352a12337f93fc21c) diff --git a/doc/de/Neues b/doc/de/Neues index 23fe6751c1..7c6699fcb0 100644 --- a/doc/de/Neues +++ b/doc/de/Neues @@ -1,34 +1,89 @@ -Umfangreichere Änderungsaufzeichnungen des neusten experimentellen Codes finden +Umfangreichere Änderungsaufzeichnungen des neusten experimentellen Codes finden Sie auf Englisch unter: https://github.com/scummvm/scummvm/commits/ 1.5.0 (??.??.????) Neue Spiele: + - Unterstützung für Backyard Baseball 2003 hinzugefügt. + - Unterstützung für Blue Force hinzugefügt. + - Unterstützung für Darby der Drache hinzugefügt. + - Unterstützung für Dreamweb hinzugefügt. + - Unterstützung für Geisha hinzugefügt. + - Unterstützung für Gregor und der Heißluftballon hinzugefügt. + - Unterstützung für Magic Tales: Baba Yaga and the Magic Geese hinzugefügt. + - Unterstützung für Magic Tales: Imo and the King hinzugefügt. + - Unterstützung für Magic Tales: Liam Finds a Story hinzugefügt. + - Unterstützung für Magic Tales: The Little Samurai hinzugefügt. + - Unterstützung für Once Upon A Time: Little Red Riding Hood hinzugefügt. + - Unterstützung für Sleeping Cub's Test of Courage hinzugefügt. - Unterstützung für Soltys hinzugefügt. + - Unterstützung für The Princess and the Crab hinzugefügt. + +Allgemein: + - MT-32-Emulationscode auf den neusten Stand des Munt-Projekt-Schnappschusses + gebracht. Die Emulation hat sich drastisch verbessert. + - Unterstützung für TrueType-Schriftarten über FreeType2 in unserer + grafischen Benutzeroberfläche hinzugefügt. Damit einhergehend wurde auch + GNU FreeFont zu unserem modernen Thema hinzugefügt. Beachten Sie, dass + nicht alle Ports hiervon profitieren. + - Baskische Übersetzung hinzugefügt. + - Spiel- und engine-spezifische Optionen in den Engines AGI, DREAMWEB, KYRA, + QUEEN, SKY und SCI hinzugefügt. Es ist nun möglich, diese über den + Engine-Reiter anzusprechen, wenn man ein Spiel hinzufügt oder dessen + Spieloptionen bearbeitet. In den meisten Fällen müssen Sie jedes Spiel + einmal starten oder diese alle in ScummVMs Spieleliste neu hinzufügen, um + den Reiter für spielspezifische Optionen zu erhalten. + - Aussehen von vorhersagendem Eingabedialog verbessert. + - Verschiedene Verbesserungen der grafischen Benutzeroberfläche. SDL-Portierungen: - Unterstützung für OpenGL hinzugefügt. (GSoC-Aufgabe) + Baphomets Fluch 1: + - Falsche Soundeffekte in der DOS-/Windows-Demo korrigiert. + - Unterstützung für PlayStation-Videos hinzugefügt. + + Baphomets Fluch 2: + - Unterstützung für PlayStation-Videos hinzugefügt. + Cine: - Roland-MT-32-Ausgabetreiber integriert. + Gob: + - Absturz in Lost in Time beseitigt. + - AdLib-Abspieler umgeschrieben. Den nun funktionierenden MDY-Abspieler in + Fascination und Geisha aktiviert. + SCUMM: - Unterstützung für die Macintosh-Version von SPY Fox in Hold the Mustard hinzugefügt. - Dialog zur Auswahl des Schwierigkeitsgrads für Loom FM-TOWNS hinzugefügt. + - Grafische Störungen in HE98-Version von Pajama Sam's Lost & Found + beseitigt. - Sword1: - - Falsche Soundeffekte in der DOS-/Windows-Demo korrigiert. + iPhone-Portierung: + - Verhalten von Geste für F5 (Menü) geändert, um stattdessen das Hauptmenü zu + öffnen. + - Unterstützung für spezifische Mauszeigerpaletten hinzugefügt. Hierdurch + wird beispielsweise der rote Zeiger im modernen Thema verwendet. + - Unterstützung für Seitenverhältniskorrektur hinzugefügt. + - Unterstützung für 16 Bits pro Pixel bei Spielen integriert. Windows-Portierung: - - Standardmäßiger Speicherort für Spielstände bei + - Standard-Verzeichnis für Spielstände bei Windows NT4/2000/XP/Vista/7 geändert. + (Die Stapelverarbeitungsdatei migration.bat kann verwendet werden, um die + Spielstände vom alten Standard-Verzeichnis in das neue zu kopieren.) 1.4.1 (27.01.2012) AGOS: - Das Laden von Videos direkt aus InstallShield-Archiven in der Windows-Version von Floyd - Es gibt noch Helden korrigiert. + Baphomets Fluch 2: + - Leichte Grafikverbesserung für PSX-Version. + + BASS: - Unterstützung für verbesserte Musik von James Woodcock hinzugefügt (http://www.jameswoodcock.co.uk/?p=7695). @@ -52,9 +107,6 @@ Sie auf Englisch unter: nicht alle Kanäle zurückgesetzt wurden und somit einige Noten falsch klangen. - Sword2: - - Leichte Grafikverbesserung für PSX-Version. - 1.4.0 (11.11.2011) Neue Spiele: - Unterstützung für Lands of Lore: The Throne of Chaos hinzugefügt. @@ -82,6 +134,12 @@ Sie auf Englisch unter: - Laden und Speichern in der PC-Version von Waxworks repariert. - Musik in den PC-Versionen von Elvira 1 und 2 sowie Waxworks korrigiert. + Baphomets Fluch 1: + - Aufhängen in Windows-Demo beseitigt. + - Absturz beseitigt, wenn Untertitelpaket für Zwischensequenzen in + Macintosh-Version verwendet wird. + + Groovie: - Unterstützung für die iOS-Version von The 7th Guest hinzugefügt. @@ -105,11 +163,6 @@ Sie auf Englisch unter: - Palettenhandhabung in der Amiga-Version von Indiana Jones and the Fate of Atlantis verbessert. - Sword1: - - Aufhängen in Windows-Demo beseitigt. - - Absturz beseitigt, wenn Untertitelpaket für Zwischensequenzen in - Macintosh-Version verwendet wird. - Tinsel: - Löschen von Spielständen aus der Liste der Speicherstände korrigiert (im Startmenü und im ScummVM-Menü innerhalb des Spiels). @@ -189,7 +242,7 @@ Sie auf Englisch unter: Drascula: - Deutsche und französische Untertitel zur Zwischensequenz mit Von Braun - hinzugefügt (3069981: Keine Untertitel in Szene mit “Von Braun“). + hinzugefügt (3069981: Keine Untertitel in Szene mit „Von Braun“). - Französische Übersetzung des Spiels verbessert. - Unterstützung für Rückkehr zur Spieleliste hinzugefügt. @@ -1313,7 +1366,7 @@ Sie auf Englisch unter: - Grafische Benutzeroberfläche für SoundFont-Einstellungen hinzugefügt (werden momentan nur von CoreAudio und FluidSynth-MIDI-Treibern verwendet). - - Der MPEG-Spieler konnte aussetzen, wenn der Ton vorzeitig endet. + - Der MPEG-Abspieler konnte aussetzen, wenn der Ton vorzeitig endet. - Automatische Skalierung der Benutzeroberfläche verbessert, um den vollen Vorteil des Bildschirms auszunutzen. - Fehlerbeseitigungen für GCC 4 @@ -1667,7 +1720,3 @@ Sie auf Englisch unter: 0.0.1 (08.10.2001) - Erste Version - - -(Deutscher Text basiert auf NEWS mit SHA1-ID: -ab2b020ff10b2e5d25cc93757029838c7eac6b41) -- cgit v1.2.3 From 29afa41047bec1eafcd1fb18137b11f04442f1ff Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 24 Jun 2012 18:17:33 +0100 Subject: I18N: Update translations template from source code --- po/ca_ES.po | 94 +++++++++++++++++++++++++++++----------------------------- po/cs_CZ.po | 94 +++++++++++++++++++++++++++++----------------------------- po/da_DA.po | 94 +++++++++++++++++++++++++++++----------------------------- po/de_DE.po | 94 +++++++++++++++++++++++++++++----------------------------- po/es_ES.po | 94 +++++++++++++++++++++++++++++----------------------------- po/eu.po | 94 +++++++++++++++++++++++++++++----------------------------- po/fr_FR.po | 94 +++++++++++++++++++++++++++++----------------------------- po/hu_HU.po | 94 +++++++++++++++++++++++++++++----------------------------- po/it_IT.po | 94 +++++++++++++++++++++++++++++----------------------------- po/nb_NO.po | 94 +++++++++++++++++++++++++++++----------------------------- po/nn_NO.po | 94 +++++++++++++++++++++++++++++----------------------------- po/pl_PL.po | 94 +++++++++++++++++++++++++++++----------------------------- po/pt_BR.po | 94 +++++++++++++++++++++++++++++----------------------------- po/ru_RU.po | 94 +++++++++++++++++++++++++++++----------------------------- po/scummvm.pot | 94 +++++++++++++++++++++++++++++----------------------------- po/se_SE.po | 94 +++++++++++++++++++++++++++++----------------------------- po/uk_UA.po | 94 +++++++++++++++++++++++++++++----------------------------- 17 files changed, 799 insertions(+), 799 deletions(-) diff --git a/po/ca_ES.po b/po/ca_ES.po index 35d5810ed6..d076f96f55 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-10-04 20:51+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" @@ -44,9 +44,9 @@ msgstr "Amunt" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -92,14 +92,14 @@ msgstr "Assigna" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -443,13 +443,13 @@ msgid "Search:" msgstr "Cerca:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Carrega partida:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Carrega" @@ -611,7 +611,7 @@ msgid "Special dithering modes supported by some games" msgstr "Modes de tramat especials suportats per alguns jocs" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Mode pantalla completa" @@ -931,39 +931,39 @@ msgstr "" "El tema que heu seleccionat no suporta l'idioma actual. Si voleu utilitzar " "aquest tema primer haureu de canviar a un altre idioma." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "No hi ha data desada" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "No hi ha hora desada" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "No hi ha temps de joc desat" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Suprimeix" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Realment voleu suprimir aquesta partida?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Data: " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Hora: " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Temps de joc: " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Partida sense ttol" @@ -1134,23 +1134,23 @@ msgstr "~A~juda" msgid "~A~bout" msgstr "~Q~uant a" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~R~etorna al Llanador" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~R~etorna al Llanador" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Desa la partida:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1159,7 +1159,7 @@ msgstr "Desa la partida:" msgid "Save" msgstr "Desa" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1168,7 +1168,7 @@ msgstr "" "Aquest motor no ofereix ajuda dins el joc. Consulteu el fitxer README per a " "la informaci bsica i les instruccions sobre com obtenir ms assistncia." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1177,17 +1177,17 @@ msgstr "" "Aquest motor no ofereix ajuda dins el joc. Consulteu el fitxer README per a " "la informaci bsica i les instruccions sobre com obtenir ms assistncia." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~D~'acord" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~C~ancella" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~ecles" @@ -1268,11 +1268,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Recupera la partida:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Restaura" @@ -1997,7 +1997,7 @@ msgstr "" "El suport de MIDI natiu requereix l'actualitzaci Roland de LucasArts,\n" "per no s'ha trobat %s. S'utilitzar AdLib." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2008,7 +2008,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2019,7 +2019,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2030,7 +2030,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2066,17 +2066,17 @@ msgstr "~M~en msgid "~W~ater Effect Enabled" msgstr "~E~fecte de l'aigua activat" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "No s'ha trobat el fitxer d'escena '%s'!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "No s'ha pogut carregar l'estat del joc del fitxer." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "No s'ha pogut desar l'estat del joc al fitxer." @@ -2324,15 +2324,15 @@ msgstr "" "No s'ha pogut desar a l'espai %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Carregant la partida..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Desant la partida..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2349,11 +2349,11 @@ msgstr "" "Premeu D'Acord per convertir-les ara, en cas contrari se us tornar a " "demanar la propera vegada.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM ha convertit satisfactriament totes les partides desades." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2621,21 +2621,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normal (no escalat)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "S'ha activat la correcci de la relaci d'aspecte" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "S'ha desactivat la correcci de la relaci d'aspecte" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Filtre de grfics actiu:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Mode de finestra" diff --git a/po/cs_CZ.po b/po/cs_CZ.po index dd13e78f1b..93bfed0261 100644 --- a/po/cs_CZ.po +++ b/po/cs_CZ.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2012-05-22 21:02+0100\n" "Last-Translator: Zbynk Schwarz \n" "Language-Team: \n" @@ -48,9 +48,9 @@ msgstr "J #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -95,14 +95,14 @@ msgstr "Mapovat" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -440,13 +440,13 @@ msgid "Search:" msgstr "Hledat:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Nahrt hru:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Nahrt" @@ -606,7 +606,7 @@ msgid "Special dithering modes supported by some games" msgstr "Speciln reimy chvn podporovan nktermi hrami" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Reim cel obrazovky" @@ -919,39 +919,39 @@ msgstr "" "Vzhled, kter jste zvolili, nepodporuje V souasn jazyk. Pokud chcete " "tento vzhled pout, muste nejdve pepnout na jin jazyk." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Neuloena dn data" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "dn uloen as" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "dn uloen doba hran" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Smazat" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Opravdu chcete tuto uloenou hru vymazat" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Datum:" -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "as:" -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Doba hran:" -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Bezejmenn uloen stav" @@ -1121,23 +1121,23 @@ msgstr "~N~ msgid "~A~bout" msgstr "~O~ programu" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~N~vrat do Spoute" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~N~vrat do Spoute" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Uloit hru:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1146,7 +1146,7 @@ msgstr "Ulo msgid "Save" msgstr "Uloit" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1156,7 +1156,7 @@ msgstr "" "prohldnte si README pro zkladn informace a pro instrukce jak zskat " "dal pomoc." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1165,17 +1165,17 @@ msgstr "" "Uloen stavu hry selhalo (%s)! Prosm pette si dokumentaci pro zkladn " "informace a pokyny k zskn dal podpory." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~Z~ruit" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~K~lvesy" @@ -1256,11 +1256,11 @@ msgstr "Pou msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Pout pvodn obrazovky naten/uloen msto ze ScummVM" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Obnovit hru" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Obnovit" @@ -1982,7 +1982,7 @@ msgstr "" "Pirozen podpora MIDI vyaduje Aktualizaci Roland od LucasArts,\n" "ale %s chyb. Msto toho je pouit AdLib." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1993,7 +1993,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2004,7 +2004,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2015,7 +2015,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2051,17 +2051,17 @@ msgstr "~H~lavn msgid "~W~ater Effect Enabled" msgstr "~E~fekt Vody Zapnut" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Soubor videa '%s' nenalezen'" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Nelze nast stav hry ze souboru." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Nelze uloit stav hry do souboru." @@ -2296,15 +2296,15 @@ msgstr "" "Nelze uloit hru do pozice %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Nahrvn hry..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Ukldn hry..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2320,11 +2320,11 @@ msgstr "" "\n" "Stisknte OK, abyste je pevedli te, jinak budete podni pt.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM spn pevedl vechny Vae uloen pozice. " -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2590,21 +2590,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normln (bez zmny velikosti)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Povolena korekce pomru stran" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Zakzna korekce pomru stran" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Aktivn grafick filtr:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Reim do okna" diff --git a/po/da_DA.po b/po/da_DA.po index 76374027ba..50068cae5e 100644 --- a/po/da_DA.po +++ b/po/da_DA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-01-08 22:53+0100\n" "Last-Translator: Steffen Nyeland \n" "Language-Team: Steffen Nyeland \n" @@ -44,9 +44,9 @@ msgstr "G #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -92,14 +92,14 @@ msgstr "Kortl #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -440,13 +440,13 @@ msgid "Search:" msgstr "Sg:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Indls spil:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Indls" @@ -607,7 +607,7 @@ msgid "Special dithering modes supported by some games" msgstr "Speciel farvereduceringstilstand understttet a nogle spil" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Fuldskrms tilstand" @@ -919,39 +919,39 @@ msgstr "" "Temaet du valgte understtter ikke dit aktuelle sprog. Hvis du nsker at " "bruge dette tema, skal du skifte til et andet sprog frst." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Ingen dato gemt" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Intet tidspunkt gemt" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Ingen spilletid gemt" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Slet" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Vil du virkelig slette denne gemmer?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Dato:" -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Tid:" -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Spilletid:" -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Unavngivet gemmetilstand" @@ -1128,23 +1128,23 @@ msgstr "H~j~ msgid "~A~bout" msgstr "~O~m" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~R~etur til spiloversigt" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~R~etur til oversigt" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Gemmer:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1153,31 +1153,31 @@ msgstr "Gemmer:" msgid "Save" msgstr "Gem" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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:243 +#: engines/dialogs.cpp:228 #, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~F~ortryd" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~aster" @@ -1245,11 +1245,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Gendan spil:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Gendan" @@ -1980,7 +1980,7 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1991,7 +1991,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2002,7 +2002,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2013,7 +2013,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2047,12 +2047,12 @@ msgstr "ScummVM Hovedmenu" msgid "~W~ater Effect Enabled" msgstr "~V~andeffekter aktiveret" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 #, fuzzy msgid "Failed to load game state from file." @@ -2061,7 +2061,7 @@ msgstr "" "\n" "%s" -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 #, fuzzy msgid "Failed to save game state to file." msgstr "" @@ -2296,17 +2296,17 @@ msgid "" "\n" msgstr "" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 #, fuzzy msgid "Loading game..." msgstr "Indls spil:" -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 #, fuzzy msgid "Saving game..." msgstr "Gemmer:" -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2316,11 +2316,11 @@ msgid "" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "" -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2580,24 +2580,24 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normal (ingen skalering)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 #, fuzzy msgid "Enabled aspect ratio correction" msgstr "Skift billedformat korrektion" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 #, fuzzy msgid "Disabled aspect ratio correction" msgstr "Skift billedformat korrektion" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 #, fuzzy msgid "Active graphics filter:" msgstr "Skift mellem grafik filtre" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 #, fuzzy msgid "Windowed mode" diff --git a/po/de_DE.po b/po/de_DE.po index e11a3d4fc7..d3d0c53922 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2012-01-29 21:11+0100\n" "Last-Translator: Simon Sawatzki \n" "Language-Team: Simon Sawatzki (Lead), Lothar Serra Mari " @@ -46,9 +46,9 @@ msgstr "Pfad hoch" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -94,14 +94,14 @@ msgstr "Zuweisen" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -444,13 +444,13 @@ msgid "Search:" msgstr "Suchen:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Spiel laden:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Laden" @@ -613,7 +613,7 @@ msgstr "" "Spezielle Farbmischungsmethoden werden von manchen Spielen untersttzt." #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Vollbildmodus" @@ -934,39 +934,39 @@ msgid "" "to use this theme you need to switch to another language first." msgstr "" -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Kein Datum gespeichert" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Keine Zeit gespeichert" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Keine Spielzeit gespeichert" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Lschen" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Diesen Spielstand wirklich lschen?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Datum: " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Zeit: " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Spieldauer: " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Unbenannt" @@ -1140,23 +1140,23 @@ msgstr "~H~ilfe" msgid "~A~bout" msgstr "be~r~" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "Zur Spiele~l~iste zurck" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "Zur Spiele~l~iste" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Speichern:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1165,7 +1165,7 @@ msgstr "Speichern:" msgid "Save" msgstr "Speichern" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1175,7 +1175,7 @@ msgstr "" "Datei fr grundlegende Informationen und Anweisungen dazu, wie man an " "weitere Hilfe gelangt." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1185,17 +1185,17 @@ msgstr "" "Datei fr grundlegende Informationen und Anweisungen dazu, wie man an " "weitere Hilfe gelangt." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~A~bbrechen" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~asten" @@ -1281,11 +1281,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Spiel laden:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Laden" @@ -2011,7 +2011,7 @@ msgstr "" "Systemeigene MIDI-ntersttzung erfordert das Roland-Upgrade von LucasArts,\n" "aber %s fehlt. Stattdessen wird AdLib verwendet." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2022,7 +2022,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2033,7 +2033,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2044,7 +2044,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2081,17 +2081,17 @@ msgstr "Haupt~m~en msgid "~W~ater Effect Enabled" msgstr "~W~assereffekt aktiviert" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Zwischensequenz \"%s\" nicht gefunden!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Konnte Spielstand aus Datei nicht laden." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Konnte Spielstand nicht in Datei speichern." @@ -2336,15 +2336,15 @@ msgstr "" "Kann Spiel nicht speichern auf Speicherplatz %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Spiel wird geladen..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Spiel wird gespeichert..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2361,11 +2361,11 @@ msgstr "" "Klicken Sie auf OK, um diese jetzt umzuwandeln, ansonsten werden Sie erneut " "gefragt, wenn Sie das nchste Mal dieses Spiel starten.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM hat alle Speicherstnde erfolgreich umgewandelt." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2633,21 +2633,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normal ohn.Skalieren" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Seitenverhltniskorrektur an" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Seitenverhltniskorrektur aus" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Aktiver Grafikfilter:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Fenstermodus" diff --git a/po/es_ES.po b/po/es_ES.po index 612a19ba4a..9849a1798b 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2012-06-22 17:44+0100\n" "Last-Translator: Toms Maidagan\n" "Language-Team: \n" @@ -44,9 +44,9 @@ msgstr "Arriba" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -91,14 +91,14 @@ msgstr "Asignar" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -438,13 +438,13 @@ msgid "Search:" msgstr "Buscar:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Cargar juego:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Cargar" @@ -605,7 +605,7 @@ msgid "Special dithering modes supported by some games" msgstr "Modos especiales de expansin compatibles con algunos juegos" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Pantalla completa" @@ -924,39 +924,39 @@ msgstr "" "El tema seleccionado no es compatible con el idioma actual. Si quieres usar " "este tema debes cambiar a otro idioma primero." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "No hay fecha guardada" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "No hay hora guardada" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "No hay tiempo guardado" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Borrar" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Seguro que quieres borrar esta partida?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Fecha: " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Hora: " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Tiempo: " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Partida sin nombre" @@ -1126,23 +1126,23 @@ msgstr "~A~yuda" msgid "~A~bout" msgstr "Acerca ~d~e" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~V~olver al lanzador" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~V~olver al lanzador" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Guardar partida" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1151,7 +1151,7 @@ msgstr "Guardar partida" msgid "Save" msgstr "Guardar" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1161,7 +1161,7 @@ msgstr "" "consulta el archivo README para encontrar informacin bsica e instrucciones " "para obtener ms ayuda." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1171,17 +1171,17 @@ msgstr "" "archivo README para encontrar informacin bsica e instrucciones sobre cmo " "obtener ms ayuda." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~S~" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~C~ancelar" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~eclas" @@ -1264,11 +1264,11 @@ 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" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Cargar partida:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Cargar" @@ -1992,7 +1992,7 @@ msgstr "" "El soporte MIDI nativo requiere la actualizacin Roland de LucasArts,\n" "pero %s no est disponible. Se usar AdLib." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2003,7 +2003,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2014,7 +2014,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2025,7 +2025,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2061,17 +2061,17 @@ msgstr "~M~en msgid "~W~ater Effect Enabled" msgstr "Efecto ag~u~a activado" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "No se ha encontrado el vdeo '%s'" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Fallo al cargar el estado del juego desde el archivo." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Fallo al guardar el estado del juego en el archivo." @@ -2310,15 +2310,15 @@ msgstr "" "No se puede guardar en la ranura %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Cargando partida..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Guardando partida..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2335,11 +2335,11 @@ msgstr "" "Pulsa Aceptar para actualizarlos, si no lo haces este mensaje volver a " "aparecer la prxima vez.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM ha convertido todas las partidas guardadas correctamente." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2605,21 +2605,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normal" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Activar la correccin de aspecto" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Desactivar la correccin de aspecto" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Filtro de grficos activo:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Modo ventana" diff --git a/po/eu.po b/po/eu.po index 7df042dc14..fa0d3030b6 100644 --- a/po/eu.po +++ b/po/eu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-12-15 14:53+0100\n" "Last-Translator: Mikel Iturbe Urretxa \n" "Language-Team: Librezale \n" @@ -44,9 +44,9 @@ msgstr "Joan gora" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -91,14 +91,14 @@ msgstr "Esleitu" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -438,13 +438,13 @@ msgid "Search:" msgstr "Bilatu:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Jokoa kargatu:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Kargatu" @@ -608,7 +608,7 @@ msgid "Special dithering modes supported by some games" msgstr "Joko batzuk onarturiko lausotze-modu bereziak" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Pantaila osoa" @@ -925,39 +925,39 @@ msgstr "" "Aukeraturiko gaia ez da zure hizkuntzarekin bateragarria. Gai hau erabili " "nahi baduzu, aurretik beste hizkuntza batera pasa behar duzu." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Ez dago datarik gordeta" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Ez dago ordurik gordeta" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Ez dago denborarik gordeta" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Ezabatu" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Ezabatu partida gorde hau?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Data:" -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Ordua" -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Denbora:" -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Titulurik gabeko partida" @@ -1127,23 +1127,23 @@ msgstr "~L~aguntza" msgid "~A~bout" msgstr "Ho~n~i buruz" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "It~z~uli abiarazlera" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "It~z~uli abiarazlera" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Gorde jokoa:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1152,7 +1152,7 @@ msgstr "Gorde jokoa:" msgid "Save" msgstr "Gorde" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1161,7 +1161,7 @@ msgstr "" "Barkatu, motore honek ez du joko barruan laguntzarik eskaintzen. Jo ezazu " "README-ra oinarrizko informaziorako eta laguntza gehiago nola jaso jakiteko." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1170,17 +1170,17 @@ msgstr "" "Jokoaren egoera gordetzeak huts egin du (%s)! Jo ezazu README-ra oinarrizko " "informaziorako eta laguntza gehiago nola jaso jakiteko." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~A~dos" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~U~tzi" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~eklak" @@ -1261,11 +1261,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Jokoa kargatu:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Kargatu" @@ -1989,7 +1989,7 @@ msgstr "" "MIDI euskarri natiboak LucasArts-en Roland eguneraketa behar du,\n" "baina %s ez dago eskuragarri. AdLib erabiliko da." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2000,7 +2000,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2011,7 +2011,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2022,7 +2022,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2058,17 +2058,17 @@ msgstr "Menu ~n~agusia" msgid "~W~ater Effect Enabled" msgstr "~U~r-efektua gaituta" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "'%s' bideo fitxategia ez da aurkitu!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Ezin izan da fitxategitik jokoa kargatu." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Ezin izan da jokoa fitxategira gorde." @@ -2308,15 +2308,15 @@ msgstr "" "Ezin da partida gorde %i zirrikituan\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Jokoa kargatzen..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Jokoa gordetzen..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2333,11 +2333,11 @@ msgstr "" "Sakatu Ados orain konbertitzeko, bestela berriz galdetuko dizut jokoa berriz " "martxan jartzen duzunean.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM-k ondo konbertitu ditu zure gordetako partida guztiak." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2603,21 +2603,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normala" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Formatu-ratio zuzenketa gaituta" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Formatu-ratio zuzenketa desgaituta" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Filtro grafiko aktiboa:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Leiho modua" diff --git a/po/fr_FR.po b/po/fr_FR.po index 6270ab3f73..be7ddddbed 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-10-23 14:52+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" @@ -45,9 +45,9 @@ msgstr "Remonter" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -92,14 +92,14 @@ msgstr "Affecter" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -441,13 +441,13 @@ msgid "Search:" msgstr "Filtre:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Charger le jeu:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Charger" @@ -609,7 +609,7 @@ msgid "Special dithering modes supported by some games" msgstr "Mode spcial de tramage support par certains jeux" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Plein cran" @@ -931,39 +931,39 @@ msgstr "" "Le thme que vous avez slection ne support pas la langue franaise. Si " "vous voulez l'utiliser vous devez d'abord changer de langue." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Date inconnue" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Heure inconnue" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Dure de jeu inconnue" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Supprimer" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Voulez-vous vraiment supprimer cette sauvegarde?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Date: " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Heure: " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Dure de jeu: " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Sauvegarde sans nom" @@ -1135,23 +1135,23 @@ msgstr "~A~ide" msgid "~A~bout" msgstr " ~P~ropos" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "Retour au ~L~anceur" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "Retour au ~L~anceur" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Sauvegarde:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1160,7 +1160,7 @@ msgstr "Sauvegarde:" msgid "Save" msgstr "Sauver" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1170,7 +1170,7 @@ msgstr "" "fichier README pour les informations de base et les instructions pour " "obtenir de l'aide supplmentaire." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1180,17 +1180,17 @@ msgstr "" "fichier README pour les informations de base et les instructions pour " "obtenir de l'aide supplmentaire." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~A~nnuler" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~ouches" @@ -1272,11 +1272,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Charger le jeu:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Charger" @@ -2000,7 +2000,7 @@ msgstr "" "Support MIDI natif require la mise jour Roland de LucasArt,\n" "mais %s manque. Utilise AdLib la place." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2011,7 +2011,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2022,7 +2022,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2033,7 +2033,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2070,17 +2070,17 @@ msgstr "~M~enu Principal" msgid "~W~ater Effect Enabled" msgstr "~E~ffets de l'Eau Activs" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Fichier de squence '%s' non trouv!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "chec du chargement de l'tat du jeu depuis le disque." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "chec de l'enregistrement de l'tat du jeu sur le disque." @@ -2322,15 +2322,15 @@ msgstr "" "Erreur lors de la sauvegarde dans l'emplacement %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Chargement en cours..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Sauvegarde en cours..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2347,11 +2347,11 @@ msgstr "" "Appuyer sur OK pour les convertir maintenant, sinon le mme message " "s'affichera la prochaine fois que vous dmarrerez le jeu.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM a converti avec succs vos anciennes sauvegardes." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2616,21 +2616,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normal" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Activer la correction du rapport d'aspect" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Dsactiver la correction du rapport d'aspect" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Mode graphique actif:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Mode Fentre" diff --git a/po/hu_HU.po b/po/hu_HU.po index 321e5b7e70..e1eb2fb15f 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2012-04-18 08:20+0100\n" "Last-Translator: Gruby \n" "Language-Team: Hungarian\n" @@ -48,9 +48,9 @@ msgstr "Feljebb" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -95,14 +95,14 @@ msgstr "Kioszt #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -441,13 +441,13 @@ msgid "Search:" msgstr "Keress:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Jtk betltse:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Betlts" @@ -608,7 +608,7 @@ msgid "Special dithering modes supported by some games" msgstr "Nhny jtk tmogatja a specilis rnyalsi mdokat" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Teljeskpernys md:" @@ -919,39 +919,39 @@ msgstr "" "A kivlasztott tma nem tmogatja a nyelvedet. Ha hasznlni akarod ezt a " "tmt, elszr vlts t egy msik nyelvre." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Dtum nincs mentve" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Id nincs mentve" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Jtkid nincs mentve" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Trl" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Biztos hogy trlni akarod ezt a jtkllst?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Dtum:" -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Id:" -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Jtkid:" -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Nvtelen jtklls" @@ -1121,23 +1121,23 @@ msgstr "S msgid "~A~bout" msgstr "Nvjegy" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "Visszatrs az indtba" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "Visszatrs az indtba" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Jtk mentse:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1146,7 +1146,7 @@ msgstr "J msgid "Save" msgstr "Ments" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1155,7 +1155,7 @@ msgstr "" "Sajnlom, a motor jelenleg nem tartalmaz jtk kzbeni sgt. Olvassd el a " "README-t az alap informcikrl, s hogy hogyan segthetsz a ksbbiekben." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1164,17 +1164,17 @@ msgstr "" "(%s) jtkments nem sikerlt!. Olvassd el a README-t az alap " "informcikrl, s hogy hogyan segthetsz a ksbbiekben." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "Mgse" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "Billentyk" @@ -1255,11 +1255,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Jtkmenet visszalltsa:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Visszallts" @@ -1983,7 +1983,7 @@ msgstr "" "Native MIDI tmogatshoz kell a Roland Upgrade a LucasArts-tl,\n" "a %s hinyzik. AdLib-ot hasznlok helyette." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1994,7 +1994,7 @@ msgstr "" "\n" "%s fjlba nem sikerlt" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2005,7 +2005,7 @@ msgstr "" "\n" "%s fjlbl nem sikerlt" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2016,7 +2016,7 @@ msgstr "" "\n" "%s fjlba elkszlt" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2052,17 +2052,17 @@ msgstr "F msgid "~W~ater Effect Enabled" msgstr "Vzeffektus engedlyezve" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "'%s' tvezet fjl nem tallhat" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Jtklls betltse fjlbl nem sikerlt." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Jtklls mentse fjlba nem sikerlt." @@ -2301,15 +2301,15 @@ msgstr "" "Jtklls nem menthet %i slotba\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Jtk betlts..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Jtk ments..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2325,11 +2325,11 @@ msgstr "" "Nyomj OK-t az talaktshoz, vagy rkrdezzek ha legkzelebb elindtod a " "jtkot.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM konvertlta az sszes jtkllsodat." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2593,21 +2593,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Norml (nincs tmretezs)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Mretarny korrekci engedlyezve" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Mretarny korrekci letiltva" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Aktv grafikus szrk:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Ablakos md" diff --git a/po/it_IT.po b/po/it_IT.po index bee74f5a68..dc33811e28 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-10-08 17:29+0100\n" "Last-Translator: Matteo 'Maff' Angelino \n" "Language-Team: Italian\n" @@ -44,9 +44,9 @@ msgstr "Su" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -92,14 +92,14 @@ msgstr "Mappa" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -439,13 +439,13 @@ msgid "Search:" msgstr "Cerca:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Carica gioco:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Carica" @@ -609,7 +609,7 @@ msgid "Special dithering modes supported by some games" msgstr "Modalit di resa grafica speciali supportate da alcuni giochi" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Modalit a schermo intero" @@ -926,39 +926,39 @@ msgstr "" "Il tema che hai selezionato non supporta la lingua attuale. Se vuoi " "utilizzare questo tema devi prima cambiare la lingua." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Nessuna data salvata" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Nessun orario salvato" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Nessun tempo salvato" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Elimina" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Sei sicuro di voler eliminare questo salvataggio?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Data: " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Ora: " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Tempo di gioco: " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Salvataggio senza titolo" @@ -1129,23 +1129,23 @@ msgstr "~A~iuto" msgid "~A~bout" msgstr "~I~nfo" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~T~orna a elenco giochi" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~V~ai a elenco giochi" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Salva gioco:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1154,7 +1154,7 @@ msgstr "Salva gioco:" msgid "Save" msgstr "Salva" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1164,7 +1164,7 @@ msgstr "" "gioco. Si prega di consultare il file README per le informazioni di base e " "per le istruzioni su come ottenere ulteriore assistenza." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1174,17 +1174,17 @@ msgstr "" "gioco. Si prega di consultare il file README per le informazioni di base e " "per le istruzioni su come ottenere ulteriore assistenza." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~A~nnulla" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~asti" @@ -1266,11 +1266,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Ripristina gioco:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Ripristina" @@ -1994,7 +1994,7 @@ msgstr "" "Il supporto nativo MIDI richiede il Roland Upgrade della LucasArts,\n" "ma %s non presente. Verr usato AdLib." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2005,7 +2005,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2016,7 +2016,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2027,7 +2027,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2064,17 +2064,17 @@ msgstr "~M~enu principale" msgid "~W~ater Effect Enabled" msgstr "~E~ffetto acqua attivo" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "File della scena di intermezzo '%s' non trovato!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Impossibile caricare il gioco dal file." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Impossibile salvare il gioco nel file." @@ -2322,15 +2322,15 @@ msgstr "" "Impossibile salvare nella posizione %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Caricamento..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Salvataggio..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2347,11 +2347,11 @@ msgstr "" "Premi OK per convertirli adesso, altrimenti ti verr richiesto la prossima " "volta.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM ha convertito con successo tutti i tuoi salvataggi." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2619,21 +2619,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normale (no ridim.)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Correzione proporzioni attivata" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Correzione proporzioni disattivata" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Filtro grafico attivo:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Modalit finestra" diff --git a/po/nb_NO.po b/po/nb_NO.po index cdc102f394..9dfc58331c 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-04-25 22:56+0100\n" "Last-Translator: Einar Johan T. Smen \n" "Language-Team: somaen \n" @@ -48,9 +48,9 @@ msgstr "G #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -96,14 +96,14 @@ msgstr "Koble" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -444,13 +444,13 @@ msgid "Search:" msgstr "Sk:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "pne spill:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "pne" @@ -611,7 +611,7 @@ msgid "Special dithering modes supported by some games" msgstr "Spesiel dithering-modus stttet av enkelte spill" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Fullskjermsmodus" @@ -923,39 +923,39 @@ msgstr "" "Temaet du valgte sttter ikke det aktive sprket. Hvis du vil bruke dette " "temaet, m du bytte til et annet sprk frst." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Ingen dato lagret" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Ingen tid lagret" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Ingen spilltid lagret" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Slett" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Vil du virkelig slette dette lagrede spillet?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Dato: " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Tid: " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Spilltid: " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Ikke navngitt spilltilstand" @@ -1125,23 +1125,23 @@ msgstr "~H~jelp" msgid "~A~bout" msgstr "~O~m" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Lagret spill:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1150,31 +1150,31 @@ msgstr "Lagret spill:" msgid "Save" msgstr "Lagre" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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:243 +#: engines/dialogs.cpp:228 #, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~A~vbryt" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~aster" @@ -1242,11 +1242,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Gjennopprett spill:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Gjenopprett" @@ -1977,7 +1977,7 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1988,7 +1988,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -1999,7 +1999,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2010,7 +2010,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2047,12 +2047,12 @@ msgstr "ScummVM Hovedmeny" msgid "~W~ater Effect Enabled" msgstr "~V~anneffekt aktivert" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 #, fuzzy msgid "Failed to load game state from file." @@ -2061,7 +2061,7 @@ msgstr "" "\n" "%s" -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 #, fuzzy msgid "Failed to save game state to file." msgstr "" @@ -2296,17 +2296,17 @@ msgid "" "\n" msgstr "" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 #, fuzzy msgid "Loading game..." msgstr "pne spill:" -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 #, fuzzy msgid "Saving game..." msgstr "Lagret spill:" -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2316,11 +2316,11 @@ msgid "" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "" -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2580,24 +2580,24 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normal (ingen skalering)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 #, fuzzy msgid "Enabled aspect ratio correction" msgstr "Veksle aspekt-rate korrigering" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 #, fuzzy msgid "Disabled aspect ratio correction" msgstr "Veksle aspekt-rate korrigering" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 #, fuzzy msgid "Active graphics filter:" msgstr "Bytt grafikkfiltre" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 #, fuzzy msgid "Windowed mode" diff --git a/po/nn_NO.po b/po/nn_NO.po index a5b01a7c52..fe0c1d1106 100644 --- a/po/nn_NO.po +++ b/po/nn_NO.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-04-25 23:07+0100\n" "Last-Translator: Einar Johan T. Smen \n" "Language-Team: somaen \n" @@ -48,9 +48,9 @@ msgstr "G #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -96,14 +96,14 @@ msgstr "Kople" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -444,13 +444,13 @@ msgid "Search:" msgstr "Sk:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "pne spel:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "pne" @@ -610,7 +610,7 @@ msgid "Special dithering modes supported by some games" msgstr "Spesielle dithering-modus som stttast av nokre spel" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Fullskjermsmodus" @@ -920,39 +920,39 @@ msgstr "" "Temaet du har valt stttar ikkje det aktive sprket. Om du vil nytte dette " "temaet m du bytte til eit anna sprk frst." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Ingen dato lagra" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Inga tid lagra" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Inga speletid lagra" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Slett" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Vil du verkeleg slette det lagra spelet?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Dato: " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Tid: " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Speletid: " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Ikkje navngjeven speltilstand" @@ -1123,25 +1123,25 @@ msgstr "~H~jelp" msgid "~A~bout" msgstr "~O~m" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 #, fuzzy msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 #, fuzzy msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Lagra spel:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1150,31 +1150,31 @@ msgstr "Lagra spel:" msgid "Save" msgstr "Lagre" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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:243 +#: engines/dialogs.cpp:228 #, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~A~vbryt" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~astar" @@ -1242,11 +1242,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Gjenopprett spel:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Gjenopprett" @@ -1975,7 +1975,7 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1983,7 +1983,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -1991,7 +1991,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -1999,7 +1999,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2036,17 +2036,17 @@ msgstr "ScummVM Hovudmeny" msgid "~W~ater Effect Enabled" msgstr "~V~anneffekt aktivert" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "" -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "" @@ -2270,17 +2270,17 @@ msgid "" "\n" msgstr "" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 #, fuzzy msgid "Loading game..." msgstr "pne spel:" -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 #, fuzzy msgid "Saving game..." msgstr "Lagra spel:" -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2290,11 +2290,11 @@ msgid "" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "" -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2552,24 +2552,24 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normal (inga skalering)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 #, fuzzy msgid "Enabled aspect ratio correction" msgstr "Veksle aspekt-korrigering" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 #, fuzzy msgid "Disabled aspect ratio correction" msgstr "Veksle aspekt-korrigering" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 #, fuzzy msgid "Active graphics filter:" msgstr "Veksle grafikkfiltre" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 #, fuzzy msgid "Windowed mode" diff --git a/po/pl_PL.po b/po/pl_PL.po index 94929760cc..da089c5026 100644 --- a/po/pl_PL.po +++ b/po/pl_PL.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-10-24 21:14+0100\n" "Last-Translator: Micha Zibkowski \n" "Language-Team: Grajpopolsku.pl \n" @@ -48,9 +48,9 @@ msgstr "W g #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -96,14 +96,14 @@ msgstr "Przypisz" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -442,13 +442,13 @@ msgid "Search:" msgstr "Szukaj" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Wczytaj gr:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Wczytaj" @@ -607,7 +607,7 @@ msgid "Special dithering modes supported by some games" msgstr "Specjalne tryby ditheringu wspierane przez niektre gry" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Peny ekran" @@ -922,39 +922,39 @@ msgstr "" "Wybrany styl nie obsuguje obecnego jzyka. Jeli chcesz go uywa, zmie " "najpierw swj jzyk." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Brak daty" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Brak godziny" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Brak czasu gry" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Skasuj" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Na pewno chcesz skasowa ten zapis?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Data: " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Czas: " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Czas gry: " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Zapis bez nazwy" @@ -1124,23 +1124,23 @@ msgstr "~P~omoc" msgid "~A~bout" msgstr "~I~nformacje" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~P~owrt do launchera" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~P~owrt do launchera" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Zapis:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1149,7 +1149,7 @@ msgstr "Zapis:" msgid "Save" msgstr "Zapisz" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1159,7 +1159,7 @@ msgstr "" "uzyska podstawowe informacje oraz dowiedzie jak szuka dalszej pomocy, " "sprawd plik README." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1169,17 +1169,17 @@ msgstr "" "uzyska podstawowe informacje oraz dowiedzie jak szuka dalszej pomocy, " "sprawd plik README." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~A~nuluj" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~K~lawisze" @@ -1257,11 +1257,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Wznw gr:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Wznw" @@ -1986,7 +1986,7 @@ msgstr "" "Natywne wsparcie MIDI wymaga aktualizacji Rolanda od LucasArts,\n" "ale brakuje %s. Przeczam na tryb AdLib." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1997,7 +1997,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2008,7 +2008,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2019,7 +2019,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2055,17 +2055,17 @@ msgstr "~M~enu g msgid "~W~ater Effect Enabled" msgstr "~E~fekty wody wczone" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Nie znaleziono pliku przerywnika '%s'!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Nie udao si wczyta stanu gry z pliku." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Nie udao si zapisa stanu gry do pliku." @@ -2312,15 +2312,15 @@ msgstr "" "Nie mona zapisa w slocie %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Wczytywanie stanu gry..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Zapisywanie stanu gry..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2336,11 +2336,11 @@ msgstr "" "Nacinij OK, eby je teraz przekonwertowa. W przeciwnym wypadku zostaniesz " "zapytany ponownie przy nastpnym wczeniu gry.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM pomylnie przekonwertowa wszystkie twoje zapisy." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2608,21 +2608,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Zwyky (bez skalowania)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Wczono korekcj formatu obrazu" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Wyczono korekcj formatu obrazu" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Aktywny filtr graficzny:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Okno" diff --git a/po/pt_BR.po b/po/pt_BR.po index 2c3a530b30..cb0c50a7c8 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-10-21 21:30-0300\n" "Last-Translator: Saulo Benigno \n" "Language-Team: ScummBR (www.scummbr.com) \n" @@ -48,9 +48,9 @@ msgstr "Acima" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -96,14 +96,14 @@ msgstr "Mapear" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -443,13 +443,13 @@ msgid "Search:" msgstr "Pesquisar:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Carregar jogo:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Carregar" @@ -615,7 +615,7 @@ msgid "Special dithering modes supported by some games" msgstr "Modos especiais de dithering suportados por alguns jogos" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Modo Tela Cheia" @@ -931,39 +931,39 @@ msgstr "" "O tema que voc selecionou no suporta seu idioma atual. Se voc quiser usar " "este tema voc precisa mudar para outro idioma." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Sem data salva" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Sem hora salva" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Sem tempo de jogo salvo" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Excluir" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Voc realmente quer excluir este jogo salvo?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Data:" -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Hora:" -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Tempo de jogo:" -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "No-titulado arquivo de save" @@ -1136,23 +1136,23 @@ msgstr "~A~juda" msgid "~A~bout" msgstr "So~b~re" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~V~oltar ao menu" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~V~oltar ao menu" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Salvar jogo:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1161,7 +1161,7 @@ msgstr "Salvar jogo:" msgid "Save" msgstr "Salvar" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1171,7 +1171,7 @@ msgstr "" "Por favor, consulte o README para obter informaes bsicas, e para obter " "instrues sobre como obter assistncia adicional." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1181,17 +1181,17 @@ msgstr "" "Por favor, consulte o README para obter informaes bsicas, e para obter " "instrues sobre como obter assistncia adicional." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~C~ancelar" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~eclas" @@ -1273,11 +1273,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Restaurar jogo:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Restaurar" @@ -2003,7 +2003,7 @@ msgstr "" "LucasArts,\n" "mas %s est faltando. Utilizando AdLib ao invs." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2014,7 +2014,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2025,7 +2025,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2036,7 +2036,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2073,12 +2073,12 @@ msgstr "~M~enu Principal ScummVM" msgid "~W~ater Effect Enabled" msgstr "Modo ~E~feitos de gua ativado" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Arquivo de vdeo '%s' no encontrado!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "" @@ -2086,7 +2086,7 @@ msgstr "" "\n" "%s" -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "" "Falha ao salvar o estado do jogo para o arquivo:\n" @@ -2337,15 +2337,15 @@ msgstr "" "No possvel salvar o jogo na posio %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Carregando jogo..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Salvando jogo..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2362,11 +2362,11 @@ msgstr "" "Pressione OK para convert-los agora, caso contrrio voc ser solicitado na " "prxima vez.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM converteu com xito todos os seus jogos salvos." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2634,21 +2634,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normal (sem escala)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Correo de proporo habilitada" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Correo de proporo desabilitada" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Ativa os filtros grficos" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Modo janela" diff --git a/po/ru_RU.po b/po/ru_RU.po index dbeb07298e..5d5f8dabf4 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2012-02-16 13:09+0200+0200\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -46,9 +46,9 @@ msgstr " #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -93,14 +93,14 @@ msgstr " #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -440,13 +440,13 @@ msgid "Search:" msgstr ":" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr " :" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "" @@ -606,7 +606,7 @@ msgid "Special dithering modes supported by some games" msgstr " , " #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr " " @@ -925,39 +925,39 @@ msgstr "" ", , . " " , ." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr " " -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr " " -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr " " -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr " ?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr ": " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr ": " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr " : " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr " " @@ -1128,23 +1128,23 @@ msgstr "~ msgid "~A~bout" msgstr " ~~" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~~ " -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~~ " -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr " :" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1153,7 +1153,7 @@ msgstr " msgid "Save" msgstr "" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1163,7 +1163,7 @@ msgstr "" ", README , " " , ." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1173,17 +1173,17 @@ msgstr "" ", README , " " , ." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~~" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~~" @@ -1266,11 +1266,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr " :" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "" @@ -1996,7 +1996,7 @@ msgstr "" " \"\" MIDI Roland Upgrade \n" "LucasArts, %s. AdLib." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2007,7 +2007,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2018,7 +2018,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2029,7 +2029,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2065,17 +2065,17 @@ msgstr " msgid "~W~ater Effect Enabled" msgstr " " -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr " '%s' !" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr " ." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr " ." @@ -2315,15 +2315,15 @@ msgstr "" " %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr " ..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr " ..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2339,11 +2339,11 @@ msgstr "" " , , " " .\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM ." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2609,21 +2609,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr " " -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr " " -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr " " -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr " :" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr " " diff --git a/po/scummvm.pot b/po/scummvm.pot index 33ab8552db..86067a3083 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -44,9 +44,9 @@ msgstr "" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -91,14 +91,14 @@ msgstr "" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -434,13 +434,13 @@ msgid "Search:" msgstr "" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "" @@ -598,7 +598,7 @@ msgid "Special dithering modes supported by some games" msgstr "" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "" @@ -903,39 +903,39 @@ msgid "" "to use this theme you need to switch to another language first." msgstr "" -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "" -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "" -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "" -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "" @@ -1105,23 +1105,23 @@ msgstr "" msgid "~A~bout" msgstr "" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1130,31 +1130,31 @@ msgstr "" msgid "Save" msgstr "" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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:243 +#: engines/dialogs.cpp:228 #, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "" @@ -1220,11 +1220,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "" @@ -1942,7 +1942,7 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1950,7 +1950,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -1958,7 +1958,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -1966,7 +1966,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -1999,17 +1999,17 @@ msgstr "" msgid "~W~ater Effect Enabled" msgstr "" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "" -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "" @@ -2224,15 +2224,15 @@ msgid "" "\n" msgstr "" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "" -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "" -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2242,11 +2242,11 @@ msgid "" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "" -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2500,21 +2500,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "" diff --git a/po/se_SE.po b/po/se_SE.po index 592fbcdd58..a1f9c91b44 100644 --- a/po/se_SE.po +++ b/po/se_SE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2011-11-27 19:00+0100\n" "Last-Translator: Hampus Flink \n" "Language-Team: \n" @@ -48,9 +48,9 @@ msgstr "Upp #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -96,14 +96,14 @@ msgstr "St #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -444,13 +444,13 @@ msgid "Search:" msgstr "Sk:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Ladda spel:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Ladda" @@ -611,7 +611,7 @@ msgid "Special dithering modes supported by some games" msgstr "Speciella gitterlgen stdda av vissa spel" #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr "Fullskrmslge" @@ -926,39 +926,39 @@ msgstr "" "Temat du valde stder inte ditt sprk. Om du vill anvnda det hr temat " "mste frst byta till ett annat sprk." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Inget datum sparat" -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Ingen tid sparad" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Ingen speltid sparad" -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Radera" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr "Vill du verkligen radera den hr spardatan?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr "Datum:" -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr "Tid:" -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr "Speltid:" -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Namnls spardata" @@ -1129,23 +1129,23 @@ msgstr "~H~j msgid "~A~bout" msgstr "O~m~..." -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "te~r~vnd till launcher" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "te~r~vnd till launcher" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Spara spelet:" -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1154,7 +1154,7 @@ msgstr "Spara spelet:" msgid "Save" msgstr "Spara" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1164,7 +1164,7 @@ msgstr "" "hnvisa till README-filen fr information och instruktioner fr att f " "ytterligare assistens." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1174,17 +1174,17 @@ msgstr "" "hnvisa till README-filen fr information och instruktioner fr att f " "ytterligare assistens." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "A~v~bryt" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~T~angenter" @@ -1266,11 +1266,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "terstll spel:" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "terstll" @@ -1995,7 +1995,7 @@ msgstr "" "Std fr Native MIDI krver Roland-uppdateringen frn LucasArts,\n" "men %s saknas. Anvnder AdLib istllet." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2006,7 +2006,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2017,7 +2017,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2028,7 +2028,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2064,17 +2064,17 @@ msgstr "Huvud~m~eny" msgid "~W~ater Effect Enabled" msgstr "~V~atteneffekt aktiverad" -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr "Filmscensfilen '%s' hittades ej!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Kunde inte lsa spardata frn filen" -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Kunde inte skriva spardata till filen." @@ -2312,15 +2312,15 @@ msgstr "" "Kan inte spara data i position %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr "Laddar speldata..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr "Sparar speldata..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2337,11 +2337,11 @@ msgstr "" "Tryck \"OK\" fr att konvertera dem nu, annars kommer du tillfrgas igen " "nsta gng du startar spelet.\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM lyckades konvertera alla dina spardata." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2609,21 +2609,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr "Normalt (ingen skalning)" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr "Korrektion av bildfrhllande p" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr "Korrektion av bildfrhllande av" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr "Aktivt grafikfilter:" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr "Fnsterlge" diff --git a/po/uk_UA.po b/po/uk_UA.po index 3d8ec456a6..cbcf7f670c 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-05-20 22:39+0100\n" +"POT-Creation-Date: 2012-06-24 18:06+0100\n" "PO-Revision-Date: 2012-02-16 13:09+0200\n" "Last-Translator: Eugene Sandulenko\n" "Language-Team: Ukrainian\n" @@ -46,9 +46,9 @@ msgstr " #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:63 gui/saveload.cpp:155 gui/themebrowser.cpp:54 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 #: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:281 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 @@ -93,14 +93,14 @@ msgstr " #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 #: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:551 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 #: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 #: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 #: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 #: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 #: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 #: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:281 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -441,13 +441,13 @@ msgid "Search:" msgstr ":" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:216 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr " :" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 #: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:216 backends/platform/wince/CEActionsPocket.cpp:267 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "" @@ -607,7 +607,7 @@ msgid "Special dithering modes supported by some games" msgstr " , " #: gui/options.cpp:753 -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2248 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2236 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:472 msgid "Fullscreen mode" msgstr " " @@ -924,39 +924,39 @@ msgstr "" " . " ", ." -#: gui/saveload.cpp:58 gui/saveload.cpp:239 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr " " -#: gui/saveload.cpp:59 gui/saveload.cpp:240 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr " " -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr " " -#: gui/saveload.cpp:67 gui/saveload.cpp:155 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "" -#: gui/saveload.cpp:154 +#: gui/saveload.cpp:172 msgid "Do you really want to delete this savegame?" msgstr " ?" -#: gui/saveload.cpp:264 +#: gui/saveload.cpp:282 msgid "Date: " msgstr ": " -#: gui/saveload.cpp:268 +#: gui/saveload.cpp:286 msgid "Time: " msgstr ": " -#: gui/saveload.cpp:274 +#: gui/saveload.cpp:292 msgid "Playtime: " msgstr " : " -#: gui/saveload.cpp:287 gui/saveload.cpp:354 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr " " @@ -1126,23 +1126,23 @@ msgstr "~ msgid "~A~bout" msgstr " ~~" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~~. " -#: engines/dialogs.cpp:106 engines/dialogs.cpp:184 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~~. " -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/cruise/menu.cpp:214 engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr " : " -#: engines/dialogs.cpp:116 engines/agi/saveload.cpp:805 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:214 -#: engines/sci/engine/kfile.cpp:567 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1151,7 +1151,7 @@ msgstr " msgid "Save" msgstr "" -#: engines/dialogs.cpp:146 +#: engines/dialogs.cpp:144 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 " @@ -1161,7 +1161,7 @@ msgstr "" "README , , " "." -#: engines/dialogs.cpp:243 +#: engines/dialogs.cpp:228 #, fuzzy, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " @@ -1171,17 +1171,17 @@ msgstr "" "README , , " "." -#: engines/dialogs.cpp:321 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:322 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~~" -#: engines/dialogs.cpp:325 +#: engines/dialogs.cpp:305 msgid "~K~eys" msgstr "~~" @@ -1263,11 +1263,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr " :" -#: engines/agi/saveload.cpp:827 engines/sci/engine/kfile.cpp:674 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "" @@ -1991,7 +1991,7 @@ msgstr "" " \"\" MIDI Roland Upgrade \n" "LucasArts, %s . AdLib." -#: engines/scumm/scumm.cpp:2271 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2002,7 +2002,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2013,7 +2013,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2290 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2024,7 +2024,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2505 +#: engines/scumm/scumm.cpp:2512 msgid "" "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " @@ -2060,17 +2060,17 @@ msgstr " msgid "~W~ater Effect Enabled" msgstr " " -#: engines/agos/animation.cpp:550 +#: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" msgstr " '%s' !" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1283 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr " ." -#: engines/gob/inter_v2.cpp:1353 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr " ." @@ -2307,15 +2307,15 @@ msgstr "" " %i\n" "\n" -#: engines/parallaction/saveload.cpp:211 +#: engines/parallaction/saveload.cpp:204 msgid "Loading game..." msgstr " ..." -#: engines/parallaction/saveload.cpp:226 +#: engines/parallaction/saveload.cpp:219 msgid "Saving game..." msgstr " ..." -#: engines/parallaction/saveload.cpp:279 +#: engines/parallaction/saveload.cpp:272 msgid "" "ScummVM found that you have old savefiles for Nippon Safes that should be " "renamed.\n" @@ -2331,11 +2331,11 @@ msgstr "" " , , ' " " .\n" -#: engines/parallaction/saveload.cpp:326 +#: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." msgstr "ScummVM ." -#: engines/parallaction/saveload.cpp:328 +#: engines/parallaction/saveload.cpp:321 msgid "" "ScummVM printed some warnings in your console window and can't guarantee all " "your files have been converted.\n" @@ -2601,21 +2601,21 @@ msgctxt "lowres" msgid "Normal (no scaling)" msgstr " " -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2147 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 msgid "Enabled aspect ratio correction" msgstr " " -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2153 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 msgid "Disabled aspect ratio correction" msgstr " " -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2208 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 msgid "Active graphics filter:" msgstr " :" -#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2250 +#: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 msgid "Windowed mode" msgstr " " -- cgit v1.2.3 From c4df905e0c1856bd3a06b8b7a90d2d5929ee6300 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Sun, 24 Jun 2012 21:23:27 +0200 Subject: CGE: Fix bug #3537529 --- engines/cge/cge.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp index 875ac34cd0..8ddb9be140 100644 --- a/engines/cge/cge.cpp +++ b/engines/cge/cge.cpp @@ -134,7 +134,6 @@ void CGEEngine::init() { _soundOk = 1; _sprTv = NULL; _gameCase2Cpt = 0; - _offUseCount = 0; _startGameSlot = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1; } -- cgit v1.2.3 From d2c510b8866d7901e126efbe8d96498587994939 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sun, 24 Jun 2012 22:34:49 +0100 Subject: AUDIO: Update Mixer class doxygen comment on balance to be consistent. --- audio/mixer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audio/mixer.h b/audio/mixer.h index e38e052bef..a0060f2e1a 100644 --- a/audio/mixer.h +++ b/audio/mixer.h @@ -97,7 +97,7 @@ public: * @param stream the actual AudioStream to be played * @param id a unique id assigned to this stream * @param volume the volume with which to play the sound, ranging from 0 to 255 - * @param balance the balance with which to play the sound, ranging from -128 to 127 + * @param balance the balance with which to play the sound, ranging from -127 to 127 (full left to full right), 0 is balanced, -128 is invalid * @param autofreeStream a flag indicating whether the stream should be * freed after playback finished * @param permanent a flag indicating whether a plain stopAll call should -- cgit v1.2.3 From 150011b843e865d99322417e45ba53d6a64ff34b Mon Sep 17 00:00:00 2001 From: Strangerke Date: Sun, 24 Jun 2012 23:49:03 +0200 Subject: CGE: Fix FX stereo --- engines/cge/sound.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/cge/sound.cpp b/engines/cge/sound.cpp index 7f74794474..b378898955 100644 --- a/engines/cge/sound.cpp +++ b/engines/cge/sound.cpp @@ -91,6 +91,12 @@ void Sound::sndDigiStart(SmpInfo *PSmpInfo) { // Start the new sound _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, Audio::makeLoopingAudioStream(_audioStream, (uint)PSmpInfo->_counter)); + + // CGE pan: + // 8 = Center + // Less = Left + // More = Right + _vm->_mixer->setChannelBalance(_soundHandle, (int8)CLIP(((PSmpInfo->_span - 8) * 16), -127, 127)); } void Sound::stop() { -- cgit v1.2.3 From c7fd284e4a96686b3dde288c047db8b68a96a408 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Mon, 25 Jun 2012 00:44:59 +0200 Subject: CGE: Fix bug 3537530 - ALTering dice --- engines/cge/events.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp index 095aac2412..c8baf4ed61 100644 --- a/engines/cge/events.cpp +++ b/engines/cge/events.cpp @@ -55,7 +55,7 @@ Sprite *Keyboard::setClient(Sprite *spr) { bool Keyboard::getKey(Common::Event &event) { Common::KeyCode keycode = event.kbd.keycode; - if ((keycode == Common::KEYCODE_LALT) || (keycode == Common::KEYCODE_RALT)) + if (((keycode == Common::KEYCODE_LALT) || (keycode == Common::KEYCODE_RALT)) && event.type == Common::EVENT_KEYDOWN) _keyAlt = true; else _keyAlt = false; -- cgit v1.2.3 From 20a781c02047cc8e2908e77707115db09a9aa59f Mon Sep 17 00:00:00 2001 From: sylvaintv Date: Mon, 25 Jun 2012 00:49:33 +0200 Subject: TOON: Fix bug #3533291 - Crash in Russian Version The Russian-localized version of an animation contained an empty frame, added a check to skip the rendering. Bug #3533291: "TOON: Russian Version Crash at Voice Scanner" --- engines/toon/anim.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/toon/anim.cpp b/engines/toon/anim.cpp index 84f6fa375c..a4eb1f210c 100644 --- a/engines/toon/anim.cpp +++ b/engines/toon/anim.cpp @@ -146,6 +146,9 @@ void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int if (_frames[frame]._ref != -1) frame = _frames[frame]._ref; + if (!_frames[frame]._data) + return; + int32 rectX = _frames[frame]._x2 - _frames[frame]._x1; int32 rectY = _frames[frame]._y2 - _frames[frame]._y1; int32 offsX = 0; -- cgit v1.2.3 From 7b44c20eb114515a1117df7f930ed98af0528db4 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 25 Jun 2012 19:59:46 +0200 Subject: BADA: Implement weekday querying in getTimeAndDate. This furthermore makes the returned time be the wall time instead of UTC. Thanks to Chris Warren-Smith for testing and improving a patch based on pull request #248. --- backends/platform/bada/system.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/backends/platform/bada/system.cpp b/backends/platform/bada/system.cpp index 816a6755fc..3f862c2571 100644 --- a/backends/platform/bada/system.cpp +++ b/backends/platform/bada/system.cpp @@ -21,6 +21,7 @@ */ #include +#include #include "common/config-manager.h" #include "common/file.h" @@ -42,7 +43,9 @@ using namespace Osp::Base; using namespace Osp::Base::Runtime; +using namespace Osp::Locales; using namespace Osp::Ui::Controls; +using namespace Osp::System; #define DEFAULT_CONFIG_FILE "/Home/scummvm.ini" #define RESOURCE_PATH "/Res" @@ -305,7 +308,7 @@ void BadaSystem::initBackend() { ConfMan.registerDefault("aspect_ratio", false); ConfMan.setBool("confirm_exit", false); - Osp::System::SystemTime::GetTicks(_epoch); + SystemTime::GetTicks(_epoch); if (E_SUCCESS != initModules()) { AppLog("initModules failed"); @@ -372,7 +375,7 @@ bool BadaSystem::pollEvent(Common::Event &event) { uint32 BadaSystem::getMillis() { long long result, ticks = 0; - Osp::System::SystemTime::GetTicks(ticks); + SystemTime::GetTicks(ticks); result = ticks - _epoch; return result; } @@ -392,18 +395,18 @@ void BadaSystem::updateScreen() { void BadaSystem::getTimeAndDate(TimeDate &td) const { DateTime currentTime; - if (E_SUCCESS == Osp::System::SystemTime::GetCurrentTime(currentTime)) { + if (E_SUCCESS == SystemTime::GetCurrentTime(WALL_TIME, currentTime)) { td.tm_sec = currentTime.GetSecond(); td.tm_min = currentTime.GetMinute(); td.tm_hour = currentTime.GetHour(); td.tm_mday = currentTime.GetDay(); td.tm_mon = currentTime.GetMonth(); td.tm_year = currentTime.GetYear(); -#ifdef RELEASE_BUILD - #error getTimeAndDate() is not setting the day of the week -#else - td.tm_wday = 0; // FIXME -#endif + + Calendar *calendar = Calendar::CreateInstanceN(CALENDAR_GREGORIAN); + calendar->SetTime(currentTime); + td.tm_wday = calendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK) - 1; + delete calendar; } } -- cgit v1.2.3 From 16adcb5145ce293af120b7cc828a08166da310e2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 25 Jun 2012 22:32:00 +0300 Subject: COMMON: Simplify the documentation in openForSaving() The new more concise description is courtesy of wjp. --- common/savefile.h | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/common/savefile.h b/common/savefile.h index abe0df2758..da787289ee 100644 --- a/common/savefile.h +++ b/common/savefile.h @@ -107,25 +107,13 @@ public: * Open the savefile with the specified name in the given directory for * saving. * - * Saved games are always compressed using ZIP compression on platforms - * where the zlib library is included (i.e. almost all platforms except the - * NDS). Engines are expected to always create compressed saved games. - * A notable exception is when the created saved games are compatible with - * the ones that the original interpreters create, and they are then used - * with later game versions in a game series which are not supported by - * ScummVM. An example is the characters exported in the Quest for Glory - * games: these saved states actually contain simple text strings with - * character attributes, which can then be used with later games in the - * Quest for Glory Series. Currently, ScummVM supports Quest for Glory - * 1, 2 and 3. These exported heroes can also be read by the AGS VGA fan - * made version of Quest for Glory 2 and the SCI32 game Quest for Glory IV, - * none of which is supported by ScummVM yet. Moreover, these heroes can - * also be imported into Quest for Glory V, which is a 3D game and thus - * outside of ScummVM's scope. For these reasons, in such cases engines can - * create uncompressed saved games to help users import them in other games - * not supported by ScummVM. Users only need to know that such saved games - * exported by ScummVM are compatible with later unsupported games, without - * needing to explain how to uncompress them. + * Saved games are compressed by default, and engines are expected to + * always write compressed saves. + * + * A notable exception is if uncompressed files are needed for + * compatibility with games not supported by ScummVM, such as character + * exports from the Quest for Glory series. QfG5 is a 3D game and won't be + * supported by ScummVM. * * @param name the name of the savefile * @param compress toggles whether to compress the resulting save file -- cgit v1.2.3 From 659d0cfcc39721001f607e4ca51b8eb477708404 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 25 Jun 2012 22:39:28 +0300 Subject: COMMON: Also adapt openForSaving() in the DC and N64 backends --- backends/platform/dc/vmsave.cpp | 5 +++-- backends/platform/n64/framfs_save_manager.h | 4 ++-- backends/platform/n64/pakfs_save_manager.h | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/backends/platform/dc/vmsave.cpp b/backends/platform/dc/vmsave.cpp index e06dd7fa43..ba3b787942 100644 --- a/backends/platform/dc/vmsave.cpp +++ b/backends/platform/dc/vmsave.cpp @@ -316,8 +316,9 @@ public: class VMSaveManager : public Common::SaveFileManager { public: - virtual Common::OutSaveFile *openForSaving(const Common::String &filename) { - return Common::wrapCompressedWriteStream(new OutVMSave(filename.c_str())); + virtual Common::OutSaveFile *openForSaving(const Common::String &filename, bool compress = true) { + OutVMSave *s = new OutVMSave(filename.c_str()); + return compress ? Common::wrapCompressedWriteStream(s) : s; } virtual Common::InSaveFile *openForLoading(const Common::String &filename) { diff --git a/backends/platform/n64/framfs_save_manager.h b/backends/platform/n64/framfs_save_manager.h index da553e423a..0a88c8666b 100644 --- a/backends/platform/n64/framfs_save_manager.h +++ b/backends/platform/n64/framfs_save_manager.h @@ -100,10 +100,10 @@ public: class FRAMSaveManager : public Common::SaveFileManager { public: - virtual Common::OutSaveFile *openForSaving(const Common::String &filename) { + virtual Common::OutSaveFile *openForSaving(const Common::String &filename, bool compress = true) { OutFRAMSave *s = new OutFRAMSave(filename.c_str()); if (!s->err()) { - return Common::wrapCompressedWriteStream(s); + return compress ? Common::wrapCompressedWriteStream(s) : s; } else { delete s; return 0; diff --git a/backends/platform/n64/pakfs_save_manager.h b/backends/platform/n64/pakfs_save_manager.h index e0fcbc1e2d..6e67fb0f5f 100644 --- a/backends/platform/n64/pakfs_save_manager.h +++ b/backends/platform/n64/pakfs_save_manager.h @@ -101,10 +101,10 @@ public: class PAKSaveManager : public Common::SaveFileManager { public: - virtual Common::OutSaveFile *openForSaving(const Common::String &filename) { + virtual Common::OutSaveFile *openForSaving(const Common::String &filename, bool compress = true) { OutPAKSave *s = new OutPAKSave(filename.c_str()); if (!s->err()) { - return Common::wrapCompressedWriteStream(s); + return compress ? Common::wrapCompressedWriteStream(s) : s; } else { delete s; return NULL; -- cgit v1.2.3 From 80388527ea891bc9c44cd11ff31afefb253d3eaa Mon Sep 17 00:00:00 2001 From: Strangerke Date: Mon, 25 Jun 2012 23:33:17 +0200 Subject: CGE: Fix SPR files with extra 0x1A or missing ending CRLF. Fix bug #3537527 --- engines/cge/fileio.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/engines/cge/fileio.cpp b/engines/cge/fileio.cpp index c50db4e929..f23105d823 100644 --- a/engines/cge/fileio.cpp +++ b/engines/cge/fileio.cpp @@ -201,9 +201,28 @@ EncryptedStream::EncryptedStream(CGEEngine *vm, const char *name) : _vm(vm) { _error = true; _vm->_resman->seek(kp->_pos); - byte *dataBuffer = (byte *)malloc(kp->_size); - _vm->_resman->read(dataBuffer, kp->_size); - _readStream = new Common::MemoryReadStream(dataBuffer, kp->_size, DisposeAfterUse::YES); + byte *dataBuffer; + int bufSize; + + if ((strlen(name) > 4) && (scumm_stricmp(name + strlen(name) - 4, ".SPR") == 0)) { + // SPR files have some inconsistencies. Some have extra 0x1A at the end, some others + // do not have a carriage return at the end of the last line + // Therefore, we remove this ending 0x1A and add extra new lines. + // This fixes bug #3537527 + dataBuffer = (byte *)malloc(kp->_size + 2); + _vm->_resman->read(dataBuffer, kp->_size); + if (dataBuffer[kp->_size - 1] == 0x1A) + dataBuffer[kp->_size - 1] = '\n'; + dataBuffer[kp->_size] = '\n'; + dataBuffer[kp->_size + 1] = '\n'; + bufSize = kp->_size + 2; + } else { + dataBuffer = (byte *)malloc(kp->_size); + _vm->_resman->read(dataBuffer, kp->_size); + bufSize = kp->_size; + } + + _readStream = new Common::MemoryReadStream(dataBuffer, bufSize, DisposeAfterUse::YES); } uint32 EncryptedStream::read(void *dataPtr, uint32 dataSize) { -- cgit v1.2.3 From f8b8bd8c9b4c64d4a898b3742cebb959bca5d4fc Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Mon, 25 Jun 2012 22:44:52 +0100 Subject: I18N: Update Hungarian translation from patch #3537638 --- gui/themes/translations.dat | Bin 314939 -> 318276 bytes po/hu_HU.po | 75 +++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index f4a3a96084..12ad3d4352 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ diff --git a/po/hu_HU.po b/po/hu_HU.po index e1eb2fb15f..c868806a8a 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-06-24 18:06+0100\n" -"PO-Revision-Date: 2012-04-18 08:20+0100\n" -"Last-Translator: Gruby \n" +"PO-Revision-Date: 2012-06-25 06:21+0100\n" +"Last-Translator: George Kormendi \n" "Language-Team: Hungarian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" @@ -194,9 +194,8 @@ msgid "Platform:" msgstr "Platform:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Vizsgl" +msgstr "Motor" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -1248,12 +1247,12 @@ msgstr "Ind #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Eredeti ment/tlt kpernyk hasznlata" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" -msgstr "" +msgstr "Az eredeti ments/betlts kperny hasznlata a ScummVM kpek helyett" #: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" @@ -1264,68 +1263,66 @@ msgid "Restore" msgstr "Visszallts" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "Jobb fels trgy" +msgstr "Fnyes paletta md hasznlata" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Grafikus megjelentsre hasznlja a jtk fnyes palettjt" #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "EGA szinjavts" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "EGA sznjavts tmogatott EGA jtkokban" +msgstr "Undithering engedlyezse EGA jtkokban" #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Specilis hangeffektusok hangereje" +msgstr "Digitlis hangeffektusok elnyben" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Digitlis hanghatsok elnyben a szintetizltakkal szemben" #: engines/sci/detection.cpp:400 msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "" +msgstr "IMF/Yahama FB-01 hasznlata MIDI kimentre" #: engines/sci/detection.cpp:401 msgid "" "Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " "output" msgstr "" +"IBM Music Feature krtya vagy Yahama FB-01 FM szintetiztor modul hasznlata " +"MIDI kimenetre" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "CD audi hasznlata" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr "CD audi hasznlata a jtkban lvvel szemben, ha elrhet" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Windows kurzorok hasznlata" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" -msgstr "" +msgstr "Windows kurzorok hasznlata (kisebb s monokrm) a DOS-osok helyett " #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Szabvny kurzor" +msgstr "Ezst kurzor hasznlata" #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" -msgstr "" +msgstr "Alternatv ezst kurzorszett hasznlata, a norml arany helyett" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -2078,61 +2075,59 @@ msgstr "J #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Stdi kznsg" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Stdi kznsg engedlyezse" #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr "tugrs tmogats" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Szveg s tvezetk tugrsnak tmogatsa" #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Helium md" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Roland GS Md engedlyezve" +msgstr "Helium md engedlyezve" #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Finom grgets" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Finom grgets engedlyezse jrs kzben" #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Szabvny kurzor" +msgstr "Lebeg kurzor" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Lebeg kurzor engedlyezse" #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr "HP sv grafika" #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr "Hit point sv grafika engedlyezse" #: engines/kyra/lol.cpp:478 msgid "Attack 1" @@ -2198,11 +2193,11 @@ msgstr "" #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Floppy intro" #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr "A floppy verzi intro hasznlata (csak CD verzinl)" #: engines/sky/compact.cpp:130 msgid "" @@ -2286,11 +2281,11 @@ msgstr "" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr "Trgycimke lthat" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr "Trgycimke lthat ha az egr felette van" #: engines/parallaction/saveload.cpp:133 #, c-format -- cgit v1.2.3 From 7e66cbd468a5b89eaf170d5e0fb3bb312365628c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 26 Jun 2012 11:12:37 +0300 Subject: SCI: Rename a parameter in validateExportFunc() This ensures that it won't be confused with a function with the same name --- engines/sci/engine/script.cpp | 4 ++-- engines/sci/engine/script.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 57334b89aa..d4143dcceb 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -385,7 +385,7 @@ void Script::setLockers(int lockers) { _lockers = lockers; } -uint32 Script::validateExportFunc(int pubfunct, bool relocateSci3) { +uint32 Script::validateExportFunc(int pubfunct, bool relocSci3) { bool exportsAreWide = (g_sci->_features->detectLofsType() == SCI_VERSION_1_MIDDLE); if (_numExports <= pubfunct) { @@ -401,7 +401,7 @@ uint32 Script::validateExportFunc(int pubfunct, bool relocateSci3) { if (getSciVersion() != SCI_VERSION_3) { offset = READ_SCI11ENDIAN_UINT16(_exportTable + pubfunct); } else { - if (!relocateSci3) + if (!relocSci3) offset = READ_SCI11ENDIAN_UINT16(_exportTable + pubfunct) + getCodeBlockOffsetSci3(); else offset = relocateOffsetSci3(pubfunct * 2 + 22); diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 1fc8caf313..0b499203c2 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -197,11 +197,11 @@ public: * Validate whether the specified public function is exported by * the script in the specified segment. * @param pubfunct Index of the function to validate - * @param relocateSci3 Decide whether to relocate this SCI3 public function or not + * @param relocSci3 Decide whether to relocate this SCI3 public function or not * @return NULL if the public function is invalid, its * offset into the script's segment otherwise */ - uint32 validateExportFunc(int pubfunct, bool relocateSci3); + uint32 validateExportFunc(int pubfunct, bool relocSci3); /** * Marks the script as deleted. -- cgit v1.2.3 From 152b340a9ac502434e99da79e880625626209adc Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 26 Jun 2012 13:22:05 +0300 Subject: SCI: Remove a music fading hack used for the intro of Longbow --- engines/sci/sound/soundcmd.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 989df7c8a1..cbb5cab4fe 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -368,6 +368,11 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { case 4: // SCI01+ case 5: // SCI1+ (SCI1 late sound scheme), with fade and continue musicSlot->fadeTo = CLIP(argv[1].toUint16(), 0, MUSIC_VOLUME_MAX); + // Check if the song is already at the requested volume. If it is, don't + // perform any fading. Happens for example during the intro of Longbow. + if (musicSlot->fadeTo == musicSlot->volume) + return acc; + // sometimes we get objects in that position, fix it up (ffs. workarounds) if (!argv[1].getSegment()) musicSlot->fadeStep = volume > musicSlot->fadeTo ? -argv[3].toUint16() : argv[3].toUint16(); @@ -497,12 +502,7 @@ void SoundCommandParser::processUpdateCues(reg_t obj) { // fireworks). // It is also needed in other games, e.g. LSL6 when talking to the // receptionist (bug #3192166). - if (g_sci->getGameId() == GID_LONGBOW && g_sci->getEngineState()->currentRoomNumber() == 95) { - // HACK: Don't set a signal here in the intro of Longbow, as that makes some dialog - // boxes disappear too soon (bug #3044844). - } else { - writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - } + writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); if (_soundVersion <= SCI_VERSION_0_LATE) { processStopSound(obj, false); } else { -- cgit v1.2.3 From c2aabea6faa6fc4a056000aa55859526b0c72034 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Tue, 26 Jun 2012 21:05:01 +0100 Subject: DRASCULA: Add Spanish subtitles for von Braun cutscene This finally solves bug #3069981 DRASCULA: no subtitles in scene with "von Braun". Thanks go to Tomás Maidagan for providing these subtitles. --- devtools/create_drascula/staticdata.h | 8 ++++---- dists/engine-data/drascula.dat | Bin 218771 -> 219267 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/devtools/create_drascula/staticdata.h b/devtools/create_drascula/staticdata.h index 21b9a82622..e0e4f9da10 100644 --- a/devtools/create_drascula/staticdata.h +++ b/devtools/create_drascula/staticdata.h @@ -6031,10 +6031,10 @@ const char *_texthis[NUM_LANGS][NUM_TEXTHIS] = { }, { "", - "", - "", - "", - "" + "Hace mucho tiempo, parece ser que Drascula mato a la mujer de Von Braun, asi que, con la intencion de enfrentarse al conde, Von Braun empezo a investigar todo lo que pudo sobre vampiros.", + "Cuando creyo estar preparado, subio al castillo y tuvo un enfrentamiento muy violento con Drascula.", + "Nadie sabe que paso exactamente. Aunque Von Braun perdio, Drascula no pudo matarlo.", + "Von Braun se sintio humillado por su derrota, huyo del castillo y no ha tenido valor para enfrentarse de nuevo a Drascula." }, { "", diff --git a/dists/engine-data/drascula.dat b/dists/engine-data/drascula.dat index 0938ef4a9a..e2b046a527 100644 Binary files a/dists/engine-data/drascula.dat and b/dists/engine-data/drascula.dat differ -- cgit v1.2.3 From 7705c13cc41ba9b4c82d2f061cc42a84f004719e Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Tue, 26 Jun 2012 21:19:16 +0100 Subject: SWORD1: Add workaround for missing subtitles in the demo --- engines/sword1/objectman.cpp | 217 ++++++++++++++++++++++++++++++++++++++++++- engines/sword1/objectman.h | 16 ++++ 2 files changed, 231 insertions(+), 2 deletions(-) diff --git a/engines/sword1/objectman.cpp b/engines/sword1/objectman.cpp index d3890cc1fc..f3c83c1656 100644 --- a/engines/sword1/objectman.cpp +++ b/engines/sword1/objectman.cpp @@ -107,6 +107,7 @@ char *ObjectMan::lockText(uint32 textId) { warning("Missing translation for textId %u (\"%s\")", textId, text); unlockText(textId, BS1_ENGLISH); } + return _missingSubTitleStr; } return text; @@ -118,6 +119,42 @@ char *ObjectMan::lockText(uint32 textId, uint8 lang) { return NULL; addr += sizeof(Header); if ((textId & ITM_ID) >= _resMan->readUint32(addr)) { + // Workaround for missing sentences in some langages in the demo. + switch(textId) { + case 8455194: + return const_cast(_translationId8455194[lang]); + case 8455195: + return const_cast(_translationId8455195[lang]); + case 8455196: + return const_cast(_translationId8455196[lang]); + case 8455197: + return const_cast(_translationId8455197[lang]); + case 8455198: + return const_cast(_translationId8455198[lang]); + case 8455199: + return const_cast(_translationId8455199[lang]); + case 8455200: + return const_cast(_translationId8455200[lang]); + case 8455201: + return const_cast(_translationId8455201[lang]); + case 8455202: + return const_cast(_translationId8455202[lang]); + case 8455203: + return const_cast(_translationId8455203[lang]); + case 8455204: + return const_cast(_translationId8455204[lang]); + case 8455205: + return const_cast(_translationId8455205[lang]); + case 6488080: + return const_cast(_translationId6488080[lang]); + case 6488081: + return const_cast(_translationId6488081[lang]); + case 6488082: + return const_cast(_translationId6488082[lang]); + case 6488083: + return const_cast(_translationId6488083[lang]); + } + warning("ObjectMan::lockText(%d): only %d texts in file", textId & ITM_ID, _resMan->readUint32(addr)); return NULL; } @@ -127,7 +164,7 @@ char *ObjectMan::lockText(uint32 textId, uint8 lang) { // We use the hardcoded text in this case. if (textId == 2950145) return const_cast(_translationId2950145[lang]); - + warning("ObjectMan::lockText(%d): text number has no text lines", textId); return NULL; } @@ -204,7 +241,183 @@ const char *const ObjectMan::_translationId2950145[7] = { "Eh?", // Italian "\277Eh?", // Spanish "Ano?", // Czech - " " // Portuguese + NULL // Portuguese +}; + +// Missing translation for textId 8455194 (in the demo). +const char *const ObjectMan::_translationId8455194[7] = { + NULL, // "Who was the guy you were supposed to meet?", // English (not needed) + "Qui \351tait l'homme que vous deviez rencontrer?", // French + "Wer war der Typ, den Du treffen wolltest?", // German + "Chi dovevi incontrare?", // Italian + "\277Qui\351n era el hombre con el que ten\355as que encontrarte?", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455195 (in the demo). +const char *const ObjectMan::_translationId8455195[7] = { + NULL, // "His name was Plantard. I didn't know him, but he called me last night.", // English (not needed) + "Son nom \351tait Plantard. Je ne le connaissais pas, mais il m'avait t\351l\351phon\351 la veille.", // French + "Sein Name war Plantard. Ich kannte ihn nicht, aber er hat mich letzte Nacht angerufen.", // German + "Si chiamava Plantard. Mi ha chiamato ieri sera, ma non lo conoscevo.", // Italian + "Su nombre era Plantard. Yo no lo conoc\355a pero \351l me llam\363 ayer por la noche.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455196 (in the demo). +const char *const ObjectMan::_translationId8455196[7] = { + NULL, // "He said he had a story which would interest me.", // English (not needed) + "Il a dit qu'il avait une histoire qui devrait m'int\351resser.", // French + "Er sagte, er h\344tte eine Story, die mich interessieren w\374rde.", // German + "Mi disse che aveva una storia che mi poteva interessare.", // Italian + "Dijo que ten\355a una historia que me interesar\355a.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455197 (in the demo). +const char *const ObjectMan::_translationId8455197[7] = { + NULL, // "He asked me to meet him at the caf\351.", // English (not needed) + "Il m'a demand\351 de le rencontrer au caf\351.", // French + "Er fragte mich, ob wir uns im Caf\351 treffen k\366nnten.", // German + "Mi chiese di incontrarci al bar.", // Italian + "Me pidi\363 que nos encontr\341ramos en el caf\351.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455198 (in the demo). +const char *const ObjectMan::_translationId8455198[7] = { + NULL, // "I guess I'll never know what he wanted to tell me...", // English (not needed) + "Je suppose que je ne saurai jamais ce qu'il voulait me dire...", // French + "Ich werde wohl nie erfahren, was er mir sagen wollte...", // German + "Penso che non sapr\362 mai che cosa voleva dirmi...", // Italian + "Supongo que nunca sabr\351 qu\351 me quer\355a contar...", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455199 (in the demo). +const char *const ObjectMan::_translationId8455199[7] = { + NULL, // "Not unless you have Rosso's gift for psychic interrogation.", // English (not needed) + "Non, \340 moins d'avoir les dons de Rosso pour les interrogatoires psychiques.", // French + "Es sei denn, Du h\344ttest Rosso's Gabe der parapsychologischen Befragung.", // German + "A meno che tu non riesca a fare interrogatori telepatici come Rosso.", // Italian + "A no ser que tengas el don de Rosso para la interrogaci\363n ps\355quica.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455200 (in the demo). +const char *const ObjectMan::_translationId8455200[7] = { + NULL, // "How did Plantard get your name?", // English (not needed) + "Comment Plantard a-t-il obtenu votre nom?", // French + "Woher hat Plantard Deinen Namen?", // German + "Come ha fatto Plantard a sapere il tuo nome?", // Italian + "\277C\363mo consigui\363 Plantard tu nombre?", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455201 (in the demo). +const char *const ObjectMan::_translationId8455201[7] = { + NULL, // "Through the newspaper - La Libert\351.", // English (not needed) + "Par mon journal... La Libert\351.", // French + "\334ber die Zeitung - La Libert\351.", // German + "Tramite il giornale La Libert\351.", // Italian + "Por el peri\363dico - La Libert\351.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455202 (in the demo). +const char *const ObjectMan::_translationId8455202[7] = { + NULL, // "I'd written an article linking two unsolved murders, one in Italy, the other in Japan.", // English (not needed) + "J'ai \351crit un article o\371 je faisais le lien entre deux meurtres inexpliqu\351s, en Italie et au japon.", // French + "Ich habe einen Artikel geschrieben, in dem ich zwei ungel\366ste Morde miteinander in Verbindung bringe, einen in Italien, einen anderen in Japan.", // German + "Ho scritto un articolo che metteva in collegamento due omicidi insoluti in Italia e Giappone.", // Italian + "Yo hab\355a escrito un art\355culo conectando dos asesinatos sin resolver, uno en Italia, el otro en Jap\363n.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455203 (in the demo). +const char *const ObjectMan::_translationId8455203[7] = { + NULL, // "The cases were remarkably similar...", // English (not needed) + "Les affaires \351taient quasiment identiques...", // French + "Die F\344lle sind sich bemerkenswert \344hnlich...", // German + "I casi erano sorprendentemente uguali...", // Italian + "Los casos eran incre\355blemente parecidos...", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455204 (in the demo). +const char *const ObjectMan::_translationId8455204[7] = { + NULL, // "...a wealthy victim, no apparent motive, and a costumed killer.", // English (not needed) + "...une victime riche, pas de motif apparent, et un tueur d\351guis\351.", // French + "...ein wohlhabendes Opfer, kein offensichtliches Motiv, und ein verkleideter Killer.", // German + "...una vittima ricca, nessun motivo apparente e un assassino in costume.", // Italian + "...una v\355ctima rica, sin motivo aparente, y un asesino disfrazado.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 8455205 (in the demo). +const char *const ObjectMan::_translationId8455205[7] = { + NULL, // "Plantard said he could supply me with more information.", // English (not needed) + "Plantard m'a dit qu'il pourrait me fournir des renseignements.", // French + "Plantard sagte, er k\366nne mir weitere Informationen beschaffen.", // German + "Plantard mi disse che mi avrebbe fornito ulteriori informazioni.", // Italian + "Plantard dijo que \351l me pod\355a proporcionar m\341s informaci\363n.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 6488080 (in the demo). +const char *const ObjectMan::_translationId6488080[7] = { + NULL, // "I wasn't going to head off all over Paris until I'd investigated some more.", // English (not needed) + "Je ferais mieux d'enqu\351ter un peu par ici avant d'aller me promener ailleurs.", // French + "Ich durchquere nicht ganz Paris, bevor ich etwas mehr herausgefunden habe.", // German + "Non mi sarei incamminato per tutta Parigi prima di ulteriori indagini.", // Italian + "No iba a ponerme a recorrer Par\355s sin haber investigado un poco m\341s.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 6488081 (in the demo). +const char *const ObjectMan::_translationId6488081[7] = { + NULL, // "I wasn't sure what I was going to do when I caught up with that clown...", // English (not needed) + "Je ne savais pas ce que je ferais quand je rattraperais le clown...", // French + "Ich wu\337te nicht, worauf ich mich einlie\337, als ich dem Clown nachjagte...", // German + "Non sapevo cosa avrei fatto una volta raggiunto quel clown...", // Italian + "No sab\355a muy bien qu\351 es lo que har\355a cuando alcanzara al payaso...", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 6488082 (in the demo). +const char *const ObjectMan::_translationId6488082[7] = { + NULL, // "...but before I knew it, I was drawn into a desperate race between two ruthless enemies.", // English (not needed) + "...mais avant de m'en rendre compte je me retrouvais happ\351 dans une course effr\351n\351e entre deux ennemis impitoyables.", // French + "... doch bevor ich mich versah, war ich inmitten eines Wettlaufs von zwei r\374cksichtslosen Feinden.", // German + "... ma prima che me ne rendessi conto, fui trascinato in una corsa disperata con due spietati nemici.", // Italian + "...pero sin darme cuenta, acab\351 en medio de una desesperada carrera entre dos despiadados enemigos.", // Spanish + NULL, // Czech + NULL // Portuguese +}; + +// Missing translation for textId 6488083 (in the demo). +const char *const ObjectMan::_translationId6488083[7] = { + NULL, // "The goal: the mysterious power of the Broken Sword.", // English (not needed) + "Le but: les pouvoirs myst\351rieux de l'\351p\351e bris\351e.", // French + "Das Ziel: die geheimnisvolle Macht des zerbrochenen Schwertes.", // German + "Obiettivo: il misterioso potere della Spada spezzata.", // Italian + "El objetivo: el misterioso poder de la Espada Rota.", // Spanish + NULL, // Czech + NULL // Portuguese }; } // End of namespace Sword1 diff --git a/engines/sword1/objectman.h b/engines/sword1/objectman.h index cce360573a..197b437c15 100644 --- a/engines/sword1/objectman.h +++ b/engines/sword1/objectman.h @@ -63,6 +63,22 @@ private: uint8 *_cptData[TOTAL_SECTIONS]; static char _missingSubTitleStr[]; static const char *const _translationId2950145[7]; //translation for textId 2950145 (missing from cluster file for some langages) + static const char *const _translationId8455194[7]; //translation for textId 8455194 (missing in the demo) + static const char *const _translationId8455195[7]; //translation for textId 8455195 (missing in the demo) + static const char *const _translationId8455196[7]; //translation for textId 8455196 (missing in the demo) + static const char *const _translationId8455197[7]; //translation for textId 8455197 (missing in the demo) + static const char *const _translationId8455198[7]; //translation for textId 8455198 (missing in the demo) + static const char *const _translationId8455199[7]; //translation for textId 8455199 (missing in the demo) + static const char *const _translationId8455200[7]; //translation for textId 8455200 (missing in the demo) + static const char *const _translationId8455201[7]; //translation for textId 8455201 (missing in the demo) + static const char *const _translationId8455202[7]; //translation for textId 8455202 (missing in the demo) + static const char *const _translationId8455203[7]; //translation for textId 8455203 (missing in the demo) + static const char *const _translationId8455204[7]; //translation for textId 8455204 (missing in the demo) + static const char *const _translationId8455205[7]; //translation for textId 8455205 (missing in the demo) + static const char *const _translationId6488080[7]; //translation for textId 6488081 (missing in the demo) + static const char *const _translationId6488081[7]; //translation for textId 6488081 (missing in the demo) + static const char *const _translationId6488082[7]; //translation for textId 6488082 (missing in the demo) + static const char *const _translationId6488083[7]; //translation for textId 6488083 (missing in the demo) }; } // End of namespace Sword1 -- cgit v1.2.3 From 57e84b9632fdd403d72773ace94b7c3f101aaa87 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Tue, 26 Jun 2012 21:31:12 +0100 Subject: SWORD1: Add source of the translations for the missing subtitles This adds a few comment to explain were the translations come from for the missing subtitle workaround (and give credits were they are due). --- engines/sword1/objectman.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engines/sword1/objectman.cpp b/engines/sword1/objectman.cpp index f3c83c1656..5d1864d58d 100644 --- a/engines/sword1/objectman.cpp +++ b/engines/sword1/objectman.cpp @@ -244,6 +244,9 @@ const char *const ObjectMan::_translationId2950145[7] = { NULL // Portuguese }; +// The translations for the next texts are missing in the demo but are present +// in the full game. The translations were therefore extracted from the full game. + // Missing translation for textId 8455194 (in the demo). const char *const ObjectMan::_translationId8455194[7] = { NULL, // "Who was the guy you were supposed to meet?", // English (not needed) @@ -387,6 +390,13 @@ const char *const ObjectMan::_translationId6488080[7] = { NULL // Portuguese }; +// The next three sentences are specific to the demo and only the english text is present. +// The translations were provided by: +// French: Thierry Crozat +// German: Simon Sawatzki +// Italian: Matteo Angelino +// Spanish: Tomás Maidagan + // Missing translation for textId 6488081 (in the demo). const char *const ObjectMan::_translationId6488081[7] = { NULL, // "I wasn't sure what I was going to do when I caught up with that clown...", // English (not needed) -- cgit v1.2.3 From 90d78e31a7b91195f3c382cc8da9bfbd90b5f73d Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Tue, 26 Jun 2012 21:40:51 +0100 Subject: NEWS: Mention fix for missing subtitles in Drascula and BS1 --- NEWS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS b/NEWS index 9fde25e3f3..e4ea5f3f49 100644 --- a/NEWS +++ b/NEWS @@ -39,6 +39,7 @@ For a more comprehensive changelog of the latest experimental code, see: Broken Sword 1: - Fixed incorrect sound effects in the DOS/Windows demo. - Added support for PlayStation videos. + - Fixed missing subtitles in the demo. Broken Sword 2: - Added support for PlayStation videos. @@ -46,6 +47,10 @@ For a more comprehensive changelog of the latest experimental code, see: Cine: - Implemented Roland MT-32 output driver. + Drascula: + - Added Spanish subtitles in the Von Braun cutscene (#3069981: no subtitles + in scene with "von Braun"). + Gob: - Fixed a crash in Lost in Time - Rewrote the AdLib player. Enabled the now working MDY player in -- cgit v1.2.3 From 8b30750f821b16c1bb0f6e505aefe41375661a32 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 27 Jun 2012 01:13:36 +0200 Subject: CGE: Remove dead code used to display copyright in DOS prompt --- engines/cge/vga13h.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/engines/cge/vga13h.cpp b/engines/cge/vga13h.cpp index 3800b6643a..e178795b7c 100644 --- a/engines/cge/vga13h.cpp +++ b/engines/cge/vga13h.cpp @@ -637,15 +637,6 @@ Vga::Vga(CGEEngine *vm) : _frmCnt(0), _msg(NULL), _name(NULL), _setPal(false), _ _page[idx]->create(320, 200, Graphics::PixelFormat::createFormatCLUT8()); } -#if 0 - // This part was used to display credits at the beginning of the game - for (int i = 10; i < 20; i++) { - char *text = _text->getText(i); - if (text) { - debugN(1, "%s\n", text); - } - } -#endif _oldColors = (Dac *)malloc(sizeof(Dac) * kPalCount); _newColors = (Dac *)malloc(sizeof(Dac) * kPalCount); getColors(_oldColors); -- cgit v1.2.3 From f32c9a7735352784a501bf70a71137478cf9946f Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 27 Jun 2012 01:14:37 +0200 Subject: CGE: Fix bug 3538039 - level buttons not pressed --- engines/cge/cge_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index 2620147c4d..bef4f610eb 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -1312,7 +1312,7 @@ void CGEEngine::runGame() { _sceneLight->_flags._tran = true; _vga->_showQ->append(_sceneLight); - _sceneLight->_flags._hide = true; + _sceneLight->_flags._hide = false; const Seq pocSeq[] = { { 0, 0, 0, 0, 20 }, -- cgit v1.2.3 From 76915424962c1288cbd8859bf1a4d401f2769cbd Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 04:05:12 +0200 Subject: DETECTOR: Rename SizeMD5(Map) to ADFileProperties(Map) --- engines/advancedDetector.cpp | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index ac06e74e0a..272032d66a 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -308,14 +308,21 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) return Common::kNoError; } -struct SizeMD5 { - int size; +/** + * A record describing the properties of a file. Used on the existing + * files while detecting a game. + */ +struct ADFileProperties { + int32 size; Common::String md5; }; -typedef Common::HashMap SizeMD5Map; +/** + * A map of all relevant existing files in a game directory while detecting. + */ +typedef Common::HashMap ADFilePropertiesMap; -static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSizeMD5) { +static void reportUnknown(const Common::FSNode &path, const ADFilePropertiesMap &filesProps) { // TODO: This message should be cleaned up / made more specific. // For example, we should specify at least which engine triggered this. // @@ -327,7 +334,7 @@ static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSiz report += _("of the game you tried to add and its version/language/etc.:"); report += "\n"; - for (SizeMD5Map::const_iterator file = filesSizeMD5.begin(); file != filesSizeMD5.end(); ++file) + for (ADFilePropertiesMap::const_iterator file = filesProps.begin(); file != filesProps.end(); ++file) report += Common::String::format(" {\"%s\", 0, \"%s\", %d},\n", file->_key.c_str(), file->_value.md5.c_str(), file->_value.size); report += "\n"; @@ -376,7 +383,7 @@ void AdvancedMetaEngine::composeFileHashMap(FileMap &allFiles, const Common::FSL } ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, const FileMap &allFiles, Common::Language language, Common::Platform platform, const Common::String &extra) const { - SizeMD5Map filesSizeMD5; + ADFilePropertiesMap filesProps; const ADGameFileDescription *fileDesc; const ADGameDescription *g; @@ -391,9 +398,9 @@ ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, cons for (fileDesc = g->filesDescriptions; fileDesc->fileName; fileDesc++) { Common::String fname = fileDesc->fileName; - SizeMD5 tmp; + ADFileProperties tmp; - if (filesSizeMD5.contains(fname)) + if (filesProps.contains(fname)) continue; // FIXME/TODO: We don't handle the case that a file is listed as a regular @@ -406,7 +413,7 @@ ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, cons tmp.md5 = macResMan.computeResForkMD5AsString(_md5Bytes); tmp.size = macResMan.getResForkDataSize(); debug(3, "> '%s': '%s'", fname.c_str(), tmp.md5.c_str()); - filesSizeMD5[fname] = tmp; + filesProps[fname] = tmp; } } else { if (allFiles.contains(fname)) { @@ -422,7 +429,7 @@ ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, cons } debug(3, "> '%s': '%s'", fname.c_str(), tmp.md5.c_str()); - filesSizeMD5[fname] = tmp; + filesProps[fname] = tmp; } } } @@ -456,19 +463,19 @@ ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, cons for (fileDesc = g->filesDescriptions; fileDesc->fileName; fileDesc++) { Common::String tstr = fileDesc->fileName; - if (!filesSizeMD5.contains(tstr)) { + if (!filesProps.contains(tstr)) { fileMissing = true; allFilesPresent = false; break; } - if (fileDesc->md5 != NULL && fileDesc->md5 != filesSizeMD5[tstr].md5) { - debug(3, "MD5 Mismatch. Skipping (%s) (%s)", fileDesc->md5, filesSizeMD5[tstr].md5.c_str()); + if (fileDesc->md5 != NULL && fileDesc->md5 != filesProps[tstr].md5) { + debug(3, "MD5 Mismatch. Skipping (%s) (%s)", fileDesc->md5, filesProps[tstr].md5.c_str()); fileMissing = true; break; } - if (fileDesc->fileSize != -1 && fileDesc->fileSize != filesSizeMD5[tstr].size) { + if (fileDesc->fileSize != -1 && fileDesc->fileSize != filesProps[tstr].size) { debug(3, "Size Mismatch. Skipping"); fileMissing = true; break; @@ -514,8 +521,8 @@ ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, cons // We didn't find a match if (matched.empty()) { - if (!filesSizeMD5.empty() && gotAnyMatchesWithAllFiles) { - reportUnknown(parent, filesSizeMD5); + if (!filesProps.empty() && gotAnyMatchesWithAllFiles) { + reportUnknown(parent, filesProps); } // Filename based fallback -- cgit v1.2.3 From 5ca480aa2e5ffdb0e8fc753aff06e676358dfcfc Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 04:07:32 +0200 Subject: DETECTOR: Move ADFileProperties(Map) into advancedDetector.h --- engines/advancedDetector.cpp | 15 --------------- engines/advancedDetector.h | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 272032d66a..248b8cc432 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -22,7 +22,6 @@ #include "common/debug.h" #include "common/util.h" -#include "common/hash-str.h" #include "common/file.h" #include "common/macresman.h" #include "common/md5.h" @@ -308,20 +307,6 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) return Common::kNoError; } -/** - * A record describing the properties of a file. Used on the existing - * files while detecting a game. - */ -struct ADFileProperties { - int32 size; - Common::String md5; -}; - -/** - * A map of all relevant existing files in a game directory while detecting. - */ -typedef Common::HashMap ADFilePropertiesMap; - static void reportUnknown(const Common::FSNode &path, const ADFilePropertiesMap &filesProps) { // TODO: This message should be cleaned up / made more specific. // For example, we should specify at least which engine triggered this. diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index 45a9f183e8..0c3f53f0c5 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -26,6 +26,8 @@ #include "engines/metaengine.h" #include "engines/engine.h" +#include "common/hash-str.h" + #include "common/gui_options.h" // FIXME: Temporary hack? namespace Common { @@ -45,6 +47,20 @@ struct ADGameFileDescription { int32 fileSize; ///< Size of the described file. Set to -1 to ignore. }; +/** + * A record describing the properties of a file. Used on the existing + * files while detecting a game. + */ +struct ADFileProperties { + int32 size; + Common::String md5; +}; + +/** + * A map of all relevant existing files in a game directory while detecting. + */ +typedef Common::HashMap ADFilePropertiesMap; + /** * A shortcut to produce an empty ADGameFileDescription record. Used to mark * the end of a list of these. -- cgit v1.2.3 From 63e13c5d2c48c0a9aba72a0f63dc4aa515972da5 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 04:25:38 +0200 Subject: DETECTOR: Move size reading and MD5 creating into a new method getFileProperties() --- engines/advancedDetector.cpp | 59 +++++++++++++++++++++++--------------------- engines/advancedDetector.h | 3 +++ 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 248b8cc432..af011bee4d 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -367,6 +367,34 @@ void AdvancedMetaEngine::composeFileHashMap(FileMap &allFiles, const Common::FSL } } +bool AdvancedMetaEngine::getFileProperties(const Common::FSNode &parent, const FileMap &allFiles, const ADGameDescription &game, const Common::String fname, ADFileProperties &fileProps) const { + // FIXME/TODO: We don't handle the case that a file is listed as a regular + // file and as one with resource fork. + + if (game.flags & ADGF_MACRESFORK) { + Common::MacResManager macResMan; + + if (!macResMan.open(parent, fname)) + return false; + + fileProps.md5 = macResMan.computeResForkMD5AsString(_md5Bytes); + fileProps.size = macResMan.getResForkDataSize(); + return true; + } + + if (!allFiles.contains(fname)) + return false; + + Common::File testFile; + + if (!testFile.open(allFiles[fname])) + return false; + + fileProps.size = (int32)testFile.size(); + fileProps.md5 = Common::computeStreamMD5AsString(testFile, _md5Bytes); + return true; +} + ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, const FileMap &allFiles, Common::Language language, Common::Platform platform, const Common::String &extra) const { ADFilePropertiesMap filesProps; @@ -388,34 +416,9 @@ ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, cons if (filesProps.contains(fname)) continue; - // FIXME/TODO: We don't handle the case that a file is listed as a regular - // file and as one with resource fork. - - if (g->flags & ADGF_MACRESFORK) { - Common::MacResManager macResMan; - - if (macResMan.open(parent, fname)) { - tmp.md5 = macResMan.computeResForkMD5AsString(_md5Bytes); - tmp.size = macResMan.getResForkDataSize(); - debug(3, "> '%s': '%s'", fname.c_str(), tmp.md5.c_str()); - filesProps[fname] = tmp; - } - } else { - if (allFiles.contains(fname)) { - debug(3, "+ %s", fname.c_str()); - - Common::File testFile; - - if (testFile.open(allFiles[fname])) { - tmp.size = (int32)testFile.size(); - tmp.md5 = Common::computeStreamMD5AsString(testFile, _md5Bytes); - } else { - tmp.size = -1; - } - - debug(3, "> '%s': '%s'", fname.c_str(), tmp.md5.c_str()); - filesProps[fname] = tmp; - } + if (getFileProperties(parent, allFiles, *g, fname, tmp)) { + debug(3, "> '%s': '%s'", fname.c_str(), tmp.md5.c_str()); + filesProps[fname] = tmp; } } } diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index 0c3f53f0c5..91cb54c396 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -314,6 +314,9 @@ protected: * Includes nifty stuff like removing trailing dots and ignoring case. */ void composeFileHashMap(FileMap &allFiles, const Common::FSList &fslist, int depth) const; + + /** Get the properties (size and MD5) of this file. */ + bool getFileProperties(const Common::FSNode &parent, const FileMap &allFiles, const ADGameDescription &game, const Common::String fname, ADFileProperties &fileProps) const; }; #endif -- cgit v1.2.3 From 2c760cb15e27de29ef9262cb6e2a102d8dbe3935 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 04:42:36 +0200 Subject: DETECTOR: Make detectGameFilebased() return a list of MD5s and file sizes Since we need a FSNode parent for Mac resource forks, we need to change signature of detectGameFilebased(), too. --- engines/advancedDetector.cpp | 12 +++++++++++- engines/advancedDetector.h | 4 +++- engines/cge/detection.cpp | 2 +- engines/gob/detection/detection.cpp | 2 +- engines/mohawk/detection.cpp | 2 +- engines/toon/detection.cpp | 2 +- engines/touche/detection.cpp | 2 +- 7 files changed, 19 insertions(+), 7 deletions(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index af011bee4d..727134fad8 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -519,7 +519,7 @@ ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSNode &parent, cons return matched; } -const ADGameDescription *AdvancedMetaEngine::detectGameFilebased(const FileMap &allFiles, const ADFileBasedFallback *fileBasedFallback) const { +const ADGameDescription *AdvancedMetaEngine::detectGameFilebased(const FileMap &allFiles, const Common::FSList &fslist, const ADFileBasedFallback *fileBasedFallback, ADFilePropertiesMap *filesProps) const { const ADFileBasedFallback *ptr; const char* const* filenames; @@ -549,6 +549,16 @@ const ADGameDescription *AdvancedMetaEngine::detectGameFilebased(const FileMap & maxNumMatchedFiles = numMatchedFiles; debug(4, "and overridden"); + + if (filesProps) { + for (filenames = ptr->filenames; *filenames; ++filenames) { + ADFileProperties tmp; + + if (getFileProperties(fslist.begin()->getParent(), allFiles, *agdesc, *filenames, tmp)) + (*filesProps)[*filenames] = tmp; + } + } + } } } diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index 91cb54c396..3e18a6aa18 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -302,9 +302,11 @@ protected: * In case of a tie, the entry coming first in the list is chosen. * * @param allFiles a map describing all present files + * @param fslist a list of nodes for all present files * @param fileBasedFallback a list of ADFileBasedFallback records, zero-terminated + * @param filesProps if not 0, return a map of properties for all detected files here */ - const ADGameDescription *detectGameFilebased(const FileMap &allFiles, const ADFileBasedFallback *fileBasedFallback) const; + const ADGameDescription *detectGameFilebased(const FileMap &allFiles, const Common::FSList &fslist, const ADFileBasedFallback *fileBasedFallback, ADFilePropertiesMap *filesProps = 0) const; // TODO void updateGameDescriptor(GameDescriptor &desc, const ADGameDescription *realDesc) const; diff --git a/engines/cge/detection.cpp b/engines/cge/detection.cpp index f723ec8fbd..eda4edd520 100644 --- a/engines/cge/detection.cpp +++ b/engines/cge/detection.cpp @@ -108,7 +108,7 @@ public: } virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { - return detectGameFilebased(allFiles, CGE::fileBasedFallback); + return detectGameFilebased(allFiles, fslist, CGE::fileBasedFallback); } virtual const char *getName() const { diff --git a/engines/gob/detection/detection.cpp b/engines/gob/detection/detection.cpp index bcfd5dacfa..9400001636 100644 --- a/engines/gob/detection/detection.cpp +++ b/engines/gob/detection/detection.cpp @@ -40,7 +40,7 @@ public: } virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { - return detectGameFilebased(allFiles, Gob::fileBased); + return detectGameFilebased(allFiles, fslist, Gob::fileBased); } virtual const char *getName() const { diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index f0c657897d..5664929948 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -167,7 +167,7 @@ public: } virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { - return detectGameFilebased(allFiles, Mohawk::fileBased); + return detectGameFilebased(allFiles, fslist, Mohawk::fileBased); } virtual const char *getName() const { diff --git a/engines/toon/detection.cpp b/engines/toon/detection.cpp index 8234934972..9c50c20ef8 100644 --- a/engines/toon/detection.cpp +++ b/engines/toon/detection.cpp @@ -133,7 +133,7 @@ public: } virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { - return detectGameFilebased(allFiles, Toon::fileBasedFallback); + return detectGameFilebased(allFiles, fslist, Toon::fileBasedFallback); } virtual const char *getName() const { diff --git a/engines/touche/detection.cpp b/engines/touche/detection.cpp index 35dd54776f..2566597e6c 100644 --- a/engines/touche/detection.cpp +++ b/engines/touche/detection.cpp @@ -135,7 +135,7 @@ public: } virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { - const ADGameDescription *matchedDesc = detectGameFilebased(allFiles, Touche::fileBasedFallback); + const ADGameDescription *matchedDesc = detectGameFilebased(allFiles, fslist, Touche::fileBasedFallback); if (matchedDesc) { // We got a match Common::String report = Common::String::format(_("Your game version has been detected using " -- cgit v1.2.3 From 9e7ece4ebe06bb66d1408189b44ba2aa9d0d6f42 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 04:48:57 +0200 Subject: DETECTOR: Make reportUnknown() available for AdvancedMetaEngine classes to use --- engines/advancedDetector.cpp | 2 +- engines/advancedDetector.h | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 727134fad8..9beba6ce4a 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -307,7 +307,7 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) return Common::kNoError; } -static void reportUnknown(const Common::FSNode &path, const ADFilePropertiesMap &filesProps) { +void AdvancedMetaEngine::reportUnknown(const Common::FSNode &path, const ADFilePropertiesMap &filesProps) const { // TODO: This message should be cleaned up / made more specific. // For example, we should specify at least which engine triggered this. // diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index 3e18a6aa18..8c19d03691 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -308,6 +308,12 @@ protected: */ const ADGameDescription *detectGameFilebased(const FileMap &allFiles, const Common::FSList &fslist, const ADFileBasedFallback *fileBasedFallback, ADFilePropertiesMap *filesProps = 0) const; + /** + * Log and print a report that we found an unknown game variant, together with the file + * names, sizes and MD5 sums. + */ + void reportUnknown(const Common::FSNode &path, const ADFilePropertiesMap &filesProps) const; + // TODO void updateGameDescriptor(GameDescriptor &desc, const ADGameDescription *realDesc) const; -- cgit v1.2.3 From 02375fa1e62aef578117e98c864d83939cac7229 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 04:53:39 +0200 Subject: GOB: Report unknown game variant when using the file based fallback detector --- engines/gob/detection/detection.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/gob/detection/detection.cpp b/engines/gob/detection/detection.cpp index 9400001636..14da54637b 100644 --- a/engines/gob/detection/detection.cpp +++ b/engines/gob/detection/detection.cpp @@ -40,7 +40,14 @@ public: } virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { - return detectGameFilebased(allFiles, fslist, Gob::fileBased); + ADFilePropertiesMap filesProps; + + const ADGameDescription *game = detectGameFilebased(allFiles, fslist, Gob::fileBased, &filesProps); + if (!game) + return 0; + + reportUnknown(fslist.begin()->getParent(), filesProps); + return game; } virtual const char *getName() const { -- cgit v1.2.3 From 18fc453b97e4b67e5e4bd6522c8b8dd05d289910 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 04:56:19 +0200 Subject: TOUCHE: Report unknown game variant when using the file based fallback detector Given the message Touche prints when it found a game, printing the MD5 sums of the files was probably what it expected the AdvancedDetector would do in the filebase fallback detector. This may have been true in the past, but it's not what it does anymore, rendering the message pointless. This fixes it by calling the now accessable reportUnknown method. --- engines/touche/detection.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/engines/touche/detection.cpp b/engines/touche/detection.cpp index 2566597e6c..e4bbe0c4c1 100644 --- a/engines/touche/detection.cpp +++ b/engines/touche/detection.cpp @@ -135,19 +135,13 @@ public: } virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { - const ADGameDescription *matchedDesc = detectGameFilebased(allFiles, fslist, Touche::fileBasedFallback); - - if (matchedDesc) { // We got a match - Common::String report = Common::String::format(_("Your game version has been detected using " - "filename matching as a variant of %s."), matchedDesc->gameid); - report += "\n"; - report += _("If this is an original and unmodified version, please report any"); - report += "\n"; - report += _("information previously printed by ScummVM to the team."); - report += "\n"; - g_system->logMessage(LogMessageType::kInfo, report.c_str()); - } + ADFilePropertiesMap filesProps; + + const ADGameDescription *matchedDesc = detectGameFilebased(allFiles, fslist, Touche::fileBasedFallback, &filesProps); + if (!matchedDesc) + return 0; + reportUnknown(fslist.begin()->getParent(), filesProps); return matchedDesc; } -- cgit v1.2.3 From ee14ef5348a38dd578e1f17f22c897f8ed9607a0 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 27 Jun 2012 22:12:37 +0200 Subject: CGE: Add ending message to tell the user he finished the game. Fix bug #3538396 --- engines/cge/cge.cpp | 12 ++++++++++++ engines/cge/cge.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp index 8ddb9be140..09fce6323c 100644 --- a/engines/cge/cge.cpp +++ b/engines/cge/cge.cpp @@ -30,6 +30,8 @@ #include "common/fs.h" #include "engines/advancedDetector.h" #include "engines/util.h" +#include "gui/message.h" + #include "cge/cge.h" #include "cge/vga13h.h" #include "cge/cge_main.h" @@ -195,6 +197,16 @@ Common::Error CGEEngine::run() { // Run the game cge_main(); + // If game is finished, display ending message + if (_flag[3]) { + Common::String msg = Common::String(_text->getText(kSayTheEnd)); + if (msg.size() != 0) { + g_system->delayMillis(10); + GUI::MessageDialog dialog(msg, "OK"); + dialog.runModal(); + } + } + // Remove game objects deinit(); diff --git a/engines/cge/cge.h b/engines/cge/cge.h index 4ebc836ee0..a5c6a62e34 100644 --- a/engines/cge/cge.h +++ b/engines/cge/cge.h @@ -78,6 +78,8 @@ class Talk; #define kMapZCnt 20 #define kMapTop 80 +#define kSayTheEnd 41 + // our engine debug channels enum { kCGEDebugBitmap = 1 << 0, -- cgit v1.2.3 From 12b8534e2f56451cd9c142cd3c7725bbde4f9f10 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 28 Jun 2012 03:27:34 +0300 Subject: SCI: Fix the detection entry for the Spanish version of KQ6 There is no Spanish CD version of KQ6, only floppy. This also seems to fix the bug with the puzzle in the cliffs of wisdom (room 300) --- engines/sci/detection_tables.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 9872973e09..7c51c03b06 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1447,6 +1447,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // King's Quest 6 - Spanish DOS Floppy (from jvprat) + // Executable scanning reports "1.cfs.158", VERSION file reports "1.000.000, July 5, 1994" + // SCI interpreter version 1.001.055 + {"kq6", "", { + {"resource.map", 0, "a73a5ab04b8f60c4b75b946a4dccea5a", 8953}, + {"resource.000", 0, "4da3ad5868a775549a7cc4f72770a58e", 8537260}, + {"resource.msg", 0, "41eed2d3893e1ca6c3695deba4e9d2e8", 267102}, + AD_LISTEND}, + Common::ES_ESP, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // King's Quest 6 - English DOS CD (from the King's Quest Collection) // Executable scanning reports "1.cfs.158", VERSION file reports "1.034 9/11/94 - KQ6 version 1.000.00G" // SCI interpreter version 1.001.054 @@ -1465,16 +1475,6 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO5(GUIO_NOASPECT, GAMEOPTION_KQ6_WINDOWS_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, - // King's Quest 6 - Spanish DOS CD (from jvprat) - // Executable scanning reports "1.cfs.158", VERSION file reports "1.000.000, July 5, 1994" - // SCI interpreter version 1.001.055 - {"kq6", "CD", { - {"resource.map", 0, "a73a5ab04b8f60c4b75b946a4dccea5a", 8953}, - {"resource.000", 0, "4da3ad5868a775549a7cc4f72770a58e", 8537260}, - {"resource.msg", 0, "41eed2d3893e1ca6c3695deba4e9d2e8", 267102}, - AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, ADGF_CD, GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, - // King's Quest 6 - English Macintosh Floppy // VERSION file reports "1.0" {"kq6", "", { -- cgit v1.2.3 From cc7768869690261d0f6ee3fddc8f0800307813bb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 28 Jun 2012 03:29:34 +0300 Subject: SCI: Remove an incorrect error check in validateExportFunc() --- engines/sci/engine/script.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index d4143dcceb..037f4ab700 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -422,16 +422,9 @@ uint32 Script::validateExportFunc(int pubfunct, bool relocSci3) { } } - if (!offset) { -#ifdef ENABLE_SCI32 - // WORKAROUNDS for invalid (empty) exports - if (g_sci->getGameId() == GID_TORIN && _nr == 64036) { - } else if (g_sci->getGameId() == GID_RAMA && _nr == 64908) { - } else -#endif - error("Request for invalid exported function 0x%x of script %d", pubfunct, _nr); - return NULL; - } + // Note that it's perfectly normal to return a zero offset, especially in + // SCI1.1 and newer games. Examples include script 64036 in Torin's Passage, + // script 64908 in the demo of RAMA and script 1013 in KQ6 floppy. if (offset >= _bufSize) error("Invalid export function pointer"); -- cgit v1.2.3 From 848575b8264e99eeab2dd0f24dda986909048b93 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 28 Jun 2012 03:27:34 +0300 Subject: SCI: Fix bug #3538418 in SQ4CD Add a script patch for another speech/subtitles script, which handles the babble icon shown in the quit/death dialogs (e.g. the two guys from Andromeda in the quit dialog). Now, these dialogs have speech both in the speech and the speech + subtitles modes --- engines/sci/engine/script_patches.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 69eb377684..659c13b13e 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -978,7 +978,27 @@ const uint16 sq4CdPatchTextOptionsButton[] = { PATCH_END }; -// Patch 2: Add the ability to toggle among the three available options, +// Patch 2: Adjust a check in babbleIcon::init, which handles the babble icon +// (e.g. the two guys from Andromeda) shown when dying/quitting. +// Fixes bug #3538418. +const byte sq4CdSignatureBabbleIcon[] = { + 7, + 0x89, 0x5a, // lsg 5a + 0x35, 0x02, // ldi 02 + 0x1a, // eq? + 0x31, 0x26, // bnt 26 [02a7] + 0 +}; + +const uint16 sq4CdPatchBabbleIcon[] = { + 0x89, 0x5a, // lsg 5a + 0x35, 0x01, // ldi 01 + 0x1a, // eq? + 0x2f, 0x26, // bt 26 [02a7] + PATCH_END +}; + +// Patch 3: Add the ability to toggle among the three available options, // when the text options button is clicked: "Speech", "Text" and "Both". // Refer to the patch above for additional details. // iconTextSwitch::doit (called when the text options button is clicked) @@ -1030,6 +1050,7 @@ const SciScriptSignature sq4Signatures[] = { { 298, "Floppy: endless flight", 1, PATCH_MAGICDWORD(0x67, 0x08, 0x63, 0x44), -3, sq4FloppySignatureEndlessFlight, sq4FloppyPatchEndlessFlight }, { 298, "Floppy (German): endless flight", 1, PATCH_MAGICDWORD(0x67, 0x08, 0x63, 0x4c), -3, sq4FloppySignatureEndlessFlightGerman, sq4FloppyPatchEndlessFlight }, { 818, "CD: Speech and subtitles option", 1, PATCH_MAGICDWORD(0x89, 0x5a, 0x3c, 0x35), 0, sq4CdSignatureTextOptions, sq4CdPatchTextOptions }, + { 0, "CD: Babble icon speech and subtitles fix", 1, PATCH_MAGICDWORD(0x89, 0x5a, 0x35, 0x02), 0, sq4CdSignatureBabbleIcon, sq4CdPatchBabbleIcon }, { 818, "CD: Speech and subtitles option button", 1, PATCH_MAGICDWORD(0x35, 0x01, 0xa1, 0x53), 0, sq4CdSignatureTextOptionsButton, sq4CdPatchTextOptionsButton }, SCI_SIGNATUREENTRY_TERMINATOR }; -- cgit v1.2.3 From 647bc59f992e77fa65dfa7e1e000b85a9ea55c2a Mon Sep 17 00:00:00 2001 From: Strangerke Date: Thu, 28 Jun 2012 07:19:54 +0200 Subject: CGE: Rename variable --- engines/cge/cge.cpp | 2 +- engines/cge/cge.h | 2 +- engines/cge/cge_main.cpp | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp index 09fce6323c..2f5acfa4a4 100644 --- a/engines/cge/cge.cpp +++ b/engines/cge/cge.cpp @@ -124,7 +124,7 @@ void CGEEngine::init() { _maxScene = 0; _dark = false; _game = false; - _finis = false; + _endGame = false; _now = 1; _lev = -1; _recentStep = -2; diff --git a/engines/cge/cge.h b/engines/cge/cge.h index a5c6a62e34..c5be78236a 100644 --- a/engines/cge/cge.h +++ b/engines/cge/cge.h @@ -159,7 +159,7 @@ public: bool _flag[4]; bool _dark; bool _game; - bool _finis; + bool _endGame; int _now; int _lev; int _mode; diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index bef4f610eb..dd1c78d92e 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -706,7 +706,7 @@ void CGEEngine::qGame() { saveGame(0, Common::String("Automatic Savegame")); _vga->sunset(); - _finis = true; + _endGame = true; } void CGEEngine::switchScene(int newScene) { @@ -1403,14 +1403,14 @@ void CGEEngine::runGame() { _keyboard->setClient(_sys); // main loop - while (!_finis && !_quitFlag) { - if (_flag[3]) + while (!_endGame && !_quitFlag) { + if (_flag[3]) // Flag FINIS _commandHandler->addCallback(kCmdExec, -1, 0, kQGame); mainLoop(); } // If finishing game due to closing ScummVM window, explicitly save the game - if (!_finis && canSaveGameStateCurrently()) + if (!_endGame && canSaveGameStateCurrently()) qGame(); _keyboard->setClient(NULL); -- cgit v1.2.3 From d73ed91051f9155f77162c50b99ca9efbb7d3b46 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Thu, 28 Jun 2012 07:25:56 +0200 Subject: CGE: Remove unused Demo text id --- engines/cge/cge.cpp | 1 - engines/cge/cge.h | 1 - engines/cge/cge_main.cpp | 4 ++-- engines/cge/cge_main.h | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp index 2f5acfa4a4..6cc0c45963 100644 --- a/engines/cge/cge.cpp +++ b/engines/cge/cge.cpp @@ -52,7 +52,6 @@ CGEEngine::CGEEngine(OSystem *syst, const ADGameDescription *gameDescription) DebugMan.addDebugChannel(kCGEDebugEngine, "engine", "CGE Engine debug channel"); _startupMode = 1; - _demoText = kDemo; _oldLev = 0; _pocPtr = 0; _bitmapPalette = NULL; diff --git a/engines/cge/cge.h b/engines/cge/cge.h index c5be78236a..0e8c5a05bb 100644 --- a/engines/cge/cge.h +++ b/engines/cge/cge.h @@ -149,7 +149,6 @@ public: const ADGameDescription *_gameDescription; int _startupMode; - int _demoText; int _oldLev; int _pocPtr; bool _music; diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index dd1c78d92e..fbe37e58a0 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -150,11 +150,11 @@ void CGEEngine::sndSetVolume() { void CGEEngine::syncHeader(Common::Serializer &s) { debugC(1, kCGEDebugEngine, "CGEEngine::syncHeader(s)"); - int i; + int i = kDemo; s.syncAsUint16LE(_now); s.syncAsUint16LE(_oldLev); - s.syncAsUint16LE(_demoText); + s.syncAsUint16LE(i); // unused Demo string id for (i = 0; i < 5; i++) s.syncAsUint16LE(_game); s.syncAsSint16LE(i); // unused VGA::Mono variable diff --git a/engines/cge/cge_main.h b/engines/cge/cge_main.h index 87199ee524..b98fec531d 100644 --- a/engines/cge/cge_main.h +++ b/engines/cge/cge_main.h @@ -78,7 +78,7 @@ namespace CGE { #define kScrHeight 200 #define kWorldHeight (kScrHeight - kPanHeight) #define kStackSize 2048 -#define kSavegameCheckSum (1956 + _now + _oldLev + _game + _music + _demoText) +#define kSavegameCheckSum (1956 + _now + _oldLev + _game + _music + kDemo) #define kSavegame0Name ("{{INIT}}" kSvgExt) #define kSavegameStrSize 11 #define kGameFrameDelay (1000 / 50) -- cgit v1.2.3 From 78b8ca5c7fd7296d88c381695534844879673b75 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 21 Jun 2012 02:21:21 +0100 Subject: TOON: Replace remaining int32 x,y,w and h coordinates with int16. --- engines/toon/anim.cpp | 107 ++++++++++++++++++++++----------------------- engines/toon/anim.h | 58 ++++++++++++------------ engines/toon/character.cpp | 24 +++++----- engines/toon/font.cpp | 46 +++++++++---------- engines/toon/font.h | 6 +-- engines/toon/hotspot.cpp | 4 +- engines/toon/hotspot.h | 4 +- engines/toon/picture.cpp | 60 ++++++++++++------------- engines/toon/picture.h | 24 +++++----- engines/toon/toon.cpp | 19 ++++---- 10 files changed, 172 insertions(+), 180 deletions(-) diff --git a/engines/toon/anim.cpp b/engines/toon/anim.cpp index a4eb1f210c..8097b1844d 100644 --- a/engines/toon/anim.cpp +++ b/engines/toon/anim.cpp @@ -132,7 +132,7 @@ Common::Rect Animation::getRect() { return Common::Rect(_x1, _y1, _x2, _y2); } -void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy) { +void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy) { debugC(3, kDebugAnim, "drawFrame(surface, %d, %d, %d)", frame, xx, yy); if (frame < 0) frame = 0; @@ -149,10 +149,10 @@ void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int if (!_frames[frame]._data) return; - int32 rectX = _frames[frame]._x2 - _frames[frame]._x1; - int32 rectY = _frames[frame]._y2 - _frames[frame]._y1; - int32 offsX = 0; - int32 offsY = 0; + int16 rectX = _frames[frame]._x2 - _frames[frame]._x1; + int16 rectY = _frames[frame]._y2 - _frames[frame]._y1; + int16 offsX = 0; + int16 offsY = 0; _vm->addDirtyRect(xx + _x1 + _frames[frame]._x1, yy + _y1 + _frames[frame]._y1, xx + rectX + _x1 + _frames[frame]._x1 , yy + rectY + _y1 + _frames[frame]._y1); @@ -189,10 +189,10 @@ void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int int32 destPitch = surface.pitch; uint8 *srcRow = _frames[frame]._data + offsX + (_frames[frame]._x2 - _frames[frame]._x1) * offsY; uint8 *curRow = (uint8 *)surface.pixels + (yy + _frames[frame]._y1 + _y1 + offsY) * destPitch + (xx + _x1 + _frames[frame]._x1 + offsX); - for (int32 y = 0; y < rectY; y++) { + for (int16 y = 0; y < rectY; y++) { uint8 *cur = curRow; uint8 *c = srcRow + y * (_frames[frame]._x2 - _frames[frame]._x1); - for (int32 x = 0; x < rectX; x++) { + for (int16 x = 0; x < rectX; x++) { if (*c) *cur = *c; c++; @@ -202,27 +202,27 @@ void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int } } -void Animation::drawFrameWithMask(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask) { +void Animation::drawFrameWithMask(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, int32 zz, Picture *mask) { debugC(1, kDebugAnim, "drawFrameWithMask(surface, %d, %d, %d, %d, mask)", frame, xx, yy, zz); warning("STUB: drawFrameWithMask()"); } -void Animation::drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask, int32 scale) { +void Animation::drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, int32 zz, Picture *mask, int32 scale) { debugC(5, kDebugAnim, "drawFrameWithMaskAndScale(surface, %d, %d, %d, %d, mask, %d)", frame, xx, yy, zz, scale); if (_frames[frame]._ref != -1) frame = _frames[frame]._ref; - int32 rectX = _frames[frame]._x2 - _frames[frame]._x1; - int32 rectY = _frames[frame]._y2 - _frames[frame]._y1; + int16 rectX = _frames[frame]._x2 - _frames[frame]._x1; + int16 rectY = _frames[frame]._y2 - _frames[frame]._y1; - int32 finalWidth = rectX * scale / 1024; - int32 finalHeight = rectY * scale / 1024; + int16 finalWidth = rectX * scale / 1024; + int16 finalHeight = rectY * scale / 1024; // compute final x1, y1, x2, y2 - int32 xx1 = xx + _x1 + _frames[frame]._x1 * scale / 1024; - int32 yy1 = yy + _y1 + _frames[frame]._y1 * scale / 1024; - int32 xx2 = xx1 + finalWidth; - int32 yy2 = yy1 + finalHeight; - int32 w = _frames[frame]._x2 - _frames[frame]._x1; + int16 xx1 = xx + _x1 + _frames[frame]._x1 * scale / 1024; + int16 yy1 = yy + _y1 + _frames[frame]._y1 * scale / 1024; + int16 xx2 = xx1 + finalWidth; + int16 yy2 = yy1 + finalHeight; + int16 w = _frames[frame]._x2 - _frames[frame]._x1; _vm->addDirtyRect(xx1, yy1, xx2, yy2); @@ -236,8 +236,8 @@ void Animation::drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 fram if (strstr(_name, "SHADOW")) shadowFlag = true; - for (int32 y = yy1; y < yy2; y++) { - for (int32 x = xx1; x < xx2; x++) { + for (int16 y = yy1; y < yy2; y++) { + for (int16 x = xx1; x < xx2; x++) { if (x < 0 || x >= 1280 || y < 0 || y >= 400) continue; @@ -245,8 +245,8 @@ void Animation::drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 fram uint8 *curMask = curRowMask + x + y * destPitchMask; // find the good c - int32 xs = (x - xx1) * 1024 / scale; - int32 ys = (y - yy1) * 1024 / scale; + int16 xs = (x - xx1) * 1024 / scale; + int16 ys = (y - yy1) * 1024 / scale; uint8 *cc = &c[ys * w + xs]; if (*cc && ((*curMask) >= zz)) { if (shadowFlag) @@ -275,7 +275,7 @@ Common::Rect Animation::getFrameRect(int32 frame) { return Common::Rect(_frames[frame]._x1, _frames[frame]._y1, _frames[frame]._x2, _frames[frame]._y2); } -int32 Animation::getFrameWidth(int32 frame) { +int16 Animation::getFrameWidth(int32 frame) { debugC(4, kDebugAnim, "getFrameWidth(%d)", frame); if ((frame < 0) || (frame >= _numFrames)) return 0; @@ -286,7 +286,7 @@ int32 Animation::getFrameWidth(int32 frame) { return _frames[frame]._x2 - _frames[frame]._x1; } -int32 Animation::getFrameHeight(int32 frame) { +int16 Animation::getFrameHeight(int32 frame) { debugC(4, kDebugAnim, "getFrameHeight(%d)", frame); if (frame < 0 || frame >= _numFrames) return 0; @@ -297,15 +297,15 @@ int32 Animation::getFrameHeight(int32 frame) { return _frames[frame]._y2 - _frames[frame]._y1; } -int32 Animation::getWidth() const { +int16 Animation::getWidth() const { return _x2 - _x1; } -int32 Animation::getHeight() const { +int16 Animation::getHeight() const { return _y2 - _y1; } -void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, byte *colorMap) { +void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, byte *colorMap) { debugC(4, kDebugAnim, "drawFontFrame(surface, %d, %d, %d, colorMap)", frame, xx, yy); if (frame < 0) frame = 0; @@ -319,8 +319,8 @@ void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int32 xx, if (_frames[frame]._ref != -1) frame = _frames[frame]._ref; - int32 rectX = _frames[frame]._x2 - _frames[frame]._x1; - int32 rectY = _frames[frame]._y2 - _frames[frame]._y1; + int16 rectX = _frames[frame]._x2 - _frames[frame]._x1; + int16 rectY = _frames[frame]._y2 - _frames[frame]._y1; if ((xx + _x1 + _frames[frame]._x1 < 0) || (yy + _y1 + _frames[frame]._y1 < 0)) return; @@ -340,9 +340,9 @@ void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int32 xx, int32 destPitch = surface.pitch; uint8 *c = _frames[frame]._data; uint8 *curRow = (uint8 *)surface.pixels + (yy + _frames[frame]._y1 + _y1) * destPitch + (xx + _x1 + _frames[frame]._x1); - for (int32 y = 0; y < rectY; y++) { + for (int16 y = 0; y < rectY; y++) { unsigned char *cur = curRow; - for (int32 x = 0; x < rectX; x++) { + for (int16 x = 0; x < rectX; x++) { if (*c && *c < 4) *cur = colorMap[*c]; c++; @@ -352,7 +352,7 @@ void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int32 xx, } } -void Animation::drawFrameOnPicture(int32 frame, int32 xx, int32 yy) { +void Animation::drawFrameOnPicture(int32 frame, int16 xx, int16 yy) { debugC(1, kDebugAnim, "drawFrameOnPicture(%d, %d, %d)", frame, xx, yy); if (frame < 0) frame = 0; @@ -366,8 +366,8 @@ void Animation::drawFrameOnPicture(int32 frame, int32 xx, int32 yy) { if (_frames[frame]._ref != -1) frame = _frames[frame]._ref; - int32 rectX = _frames[frame]._x2 - _frames[frame]._x1; - int32 rectY = _frames[frame]._y2 - _frames[frame]._y1; + int16 rectX = _frames[frame]._x2 - _frames[frame]._x1; + int16 rectY = _frames[frame]._y2 - _frames[frame]._y1; Picture *pic = _vm->getPicture(); @@ -389,9 +389,9 @@ void Animation::drawFrameOnPicture(int32 frame, int32 xx, int32 yy) { int32 destPitch = pic->getWidth(); uint8 *c = _frames[frame]._data; uint8 *curRow = (uint8 *)pic->getDataPtr() + (yy + _frames[frame]._y1 + _y1) * destPitch + (xx + _x1 + _frames[frame]._x1); - for (int32 y = 0; y < rectY; y++) { + for (int16 y = 0; y < rectY; y++) { unsigned char *cur = curRow; - for (int32 x = 0; x < rectX; x++) { + for (int16 x = 0; x < rectX; x++) { if (*c) *cur = *c; c++; @@ -458,8 +458,8 @@ void AnimationInstance::render() { if (frame >= _animation->_numFrames) frame = _animation->_numFrames - 1; - int32 x = _x; - int32 y = _y; + int16 x = _x; + int16 y = _y; if (_alignBottom) { int32 offsetX = (_animation->_x2 - _animation->_x1) / 2 * (_scale - 1024); @@ -513,7 +513,7 @@ void AnimationInstance::setAnimationRange(int32 rangeStart, int rangeEnd) { _currentFrame = _rangeEnd; } -void AnimationInstance::setPosition(int32 x, int32 y, int32 z, bool relative) { +void AnimationInstance::setPosition(int16 x, int16 y, int32 z, bool relative) { debugC(5, kDebugAnim, "setPosition(%d, %d, %d, %d)", x, y, z, (relative) ? 1 : 0); if (relative || !_animation) { _x = x; @@ -526,7 +526,7 @@ void AnimationInstance::setPosition(int32 x, int32 y, int32 z, bool relative) { } } -void AnimationInstance::moveRelative(int32 dx, int32 dy, int32 dz) { +void AnimationInstance::moveRelative(int16 dx, int16 dy, int32 dz) { debugC(1, kDebugAnim, "moveRelative(%d, %d, %d)", dx, dy, dz); _x += dx; _y += dy; @@ -571,13 +571,13 @@ void AnimationInstance::setUseMask(bool useMask) { _useMask = useMask; } -void AnimationInstance::getRect(int32 *x1, int32 *y1, int32 *x2, int32 *y2) const { +void AnimationInstance::getRect(int16 *x1, int16 *y1, int16 *x2, int16 *y2) const { debugC(5, kDebugAnim, "getRect(%d, %d, %d, %d)", *x1, *y1, *x2, *y2); - int32 rectX = _animation->_frames[_currentFrame]._x2 - _animation->_frames[_currentFrame]._x1; - int32 rectY = _animation->_frames[_currentFrame]._y2 - _animation->_frames[_currentFrame]._y1; + int16 rectX = _animation->_frames[_currentFrame]._x2 - _animation->_frames[_currentFrame]._x1; + int16 rectY = _animation->_frames[_currentFrame]._y2 - _animation->_frames[_currentFrame]._y1; - int32 finalWidth = rectX * _scale / 1024; - int32 finalHeight = rectY * _scale / 1024; + int16 finalWidth = rectX * _scale / 1024; + int16 finalHeight = rectY * _scale / 1024; // compute final x1, y1, x2, y2 *x1 = _x + _animation->_x1 + _animation->_frames[_currentFrame]._x1 * _scale / 1024; @@ -586,7 +586,7 @@ void AnimationInstance::getRect(int32 *x1, int32 *y1, int32 *x2, int32 *y2) cons *y2 = *y1 + finalHeight; } -void AnimationInstance::setX(int32 x, bool relative) { +void AnimationInstance::setX(int16 x, bool relative) { debugC(1, kDebugAnim, "setX(%d, %d)", x, (relative) ? 1 : 0); if (relative || !_animation) _x = x; @@ -594,7 +594,7 @@ void AnimationInstance::setX(int32 x, bool relative) { _x = x - _animation->_x1; } -void AnimationInstance::setY(int32 y, bool relative) { +void AnimationInstance::setY(int16 y, bool relative) { debugC(1, kDebugAnim, "setY(%d, %d)", y, (relative) ? 1 : 0); if (relative || !_animation) _y = y; @@ -617,11 +617,11 @@ int32 AnimationInstance::getLayerZ() const { return _layerZ; } -int32 AnimationInstance::getX2() const { +int16 AnimationInstance::getX2() const { return _x + _animation->_x1; } -int32 AnimationInstance::getY2() const { +int16 AnimationInstance::getY2() const { return _y + _animation->_y1; } @@ -650,6 +650,7 @@ void AnimationInstance::save(Common::WriteStream *stream) { stream->writeSint32LE(_visible); stream->writeSint32LE(_useMask); } + void AnimationInstance::load(Common::ReadStream *stream) { _currentFrame = stream->readSint32LE(); _currentTime = stream->readSint32LE(); @@ -698,14 +699,13 @@ void AnimationManager::updateInstance(AnimationInstance* instance) { } void AnimationManager::addInstance(AnimationInstance *instance) { - // if the instance already exists, we skip the add for (uint32 i = 0; i < _instances.size(); i++) { if (_instances[i] == instance) return; } - int found = -1; + int32 found = -1; // here we now do an ordered insert (closer to the original game) for (uint32 i = 0; i < _instances.size(); i++) { @@ -715,11 +715,10 @@ void AnimationManager::addInstance(AnimationInstance *instance) { } } - if ( found == -1 ) { + if (found == -1) _instances.push_back(instance); - } else { + else _instances.insert_at(found, instance); - } } void AnimationManager::removeInstance(AnimationInstance *instance) { diff --git a/engines/toon/anim.h b/engines/toon/anim.h index eb8dcbd600..cd550b2621 100644 --- a/engines/toon/anim.h +++ b/engines/toon/anim.h @@ -36,10 +36,10 @@ class Picture; class ToonEngine; struct AnimationFrame { - int32 _x1; - int32 _y1; - int32 _x2; - int32 _y2; + int16 _x1; + int16 _y1; + int16 _x2; + int16 _y2; int32 _ref; uint8 *_data; }; @@ -49,10 +49,10 @@ public: Animation(ToonEngine *vm); ~Animation(); - int32 _x1; - int32 _y1; - int32 _x2; - int32 _y2; + int16 _x1; + int16 _y1; + int16 _x2; + int16 _y2; int32 _numFrames; int32 _fps; AnimationFrame *_frames; @@ -61,18 +61,18 @@ public: char _name[32]; bool loadAnimation(const Common::String &file); - void drawFrame(Graphics::Surface &surface, int32 frame, int32 x, int32 y); - void drawFontFrame(Graphics::Surface &surface, int32 frame, int32 x, int32 y, byte *colorMap); - void drawFrameOnPicture(int32 frame, int32 x, int32 y); - void drawFrameWithMask(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask); - void drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask, int32 scale); + void drawFrame(Graphics::Surface &surface, int32 frame, int16 x, int16 y); + void drawFontFrame(Graphics::Surface &surface, int32 frame, int16 x, int16 y, byte *colorMap); + void drawFrameOnPicture(int32 frame, int16 x, int16 y); + void drawFrameWithMask(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, int32 zz, Picture *mask); + void drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, int32 zz, Picture *mask, int32 scale); void drawStrip(int32 offset = 0); void applyPalette(int32 offset, int32 srcOffset, int32 numEntries); Common::Rect getFrameRect(int32 frame); - int32 getFrameWidth(int32 frame); - int32 getFrameHeight(int32 frame); - int32 getWidth() const; - int32 getHeight() const; + int16 getFrameWidth(int32 frame); + int16 getFrameHeight(int32 frame); + int16 getWidth() const; + int16 getHeight() const; Common::Rect getRect(); protected: ToonEngine *_vm; @@ -92,25 +92,25 @@ public: void renderOnPicture(); void setAnimation(Animation *animation, bool setRange = true); void playAnimation(); - void setAnimationRange(int32 rangeStart, int rangeEnd); + void setAnimationRange(int32 rangeStart, int32 rangeEnd); void setFps(int32 fps); void setLooping(bool enable); void stopAnimation(); void setFrame(int32 position); void forceFrame(int32 position); - void setPosition(int32 x, int32 y, int32 z, bool relative = false); + void setPosition(int16 x, int16 y, int32 z, bool relative = false); Animation *getAnimation() const { return _animation; } void setScale(int32 scale, bool align = false); void setVisible(bool visible); bool getVisible() const { return _visible; } void setUseMask(bool useMask); - void moveRelative(int32 dx, int32 dy, int32 dz); - void getRect(int32 *x1, int32 *y1, int32 *x2, int32 *y2) const; - int32 getX() const { return _x; } - int32 getY() const { return _y; } + void moveRelative(int16 dx, int16 dy, int32 dz); + void getRect(int16 *x1, int16 *y1, int16 *x2, int16 *y2) const; + int16 getX() const { return _x; } + int16 getY() const { return _y; } int32 getZ() const { return _z; } - int32 getX2() const; - int32 getY2() const; + int16 getX2() const; + int16 getY2() const; int32 getZ2() const; int32 getFrame() const { return _currentFrame; } void reset(); @@ -120,8 +120,8 @@ public: void setId(int32 id) { _id = id; } int32 getId() const { return _id; } - void setX(int32 x, bool relative = false); - void setY(int32 y, bool relative = false); + void setX(int16 x, bool relative = false); + void setY(int16 y, bool relative = false); void setZ(int32 z, bool relative = false); void setLayerZ(int32 layer); int32 getLayerZ() const; @@ -133,8 +133,8 @@ protected: int32 _currentTime; int32 _fps; Animation *_animation; - int32 _x; - int32 _y; + int16 _x; + int16 _y; int32 _z; int32 _layerZ; int32 _rangeStart; diff --git a/engines/toon/character.cpp b/engines/toon/character.cpp index 09730626f2..e19656f2c8 100644 --- a/engines/toon/character.cpp +++ b/engines/toon/character.cpp @@ -534,35 +534,33 @@ int32 Character::getFacingFromDirection(int16 dx, int16 dy) { dx = -dx; int32 facingEntry = 0; - int32 ydiff = dy; + int16 ydiff = dy; if (ydiff < 0) { ++facingEntry; ydiff = -ydiff; } - facingEntry <<= 1; + facingEntry *= 2; - int32 xdiff = dx; + int16 xdiff = dx; if (xdiff < 0) { ++facingEntry; xdiff = -xdiff; } - facingEntry <<= 1; + facingEntry *= 2; if (xdiff >= ydiff) { - int32 temp = ydiff; + // Swap xdiff and ydiff + int16 temp = ydiff; ydiff = xdiff; xdiff = temp; - } else { - facingEntry += 1; - } - - facingEntry <<= 1; + } else + facingEntry++; - int32 temp = (ydiff + 1) >> 1; + facingEntry *= 2; - if (xdiff < temp) - facingEntry += 1; + if (xdiff < ((ydiff + 1) / 2)) + facingEntry++; return facingTable[facingEntry]; } diff --git a/engines/toon/font.cpp b/engines/toon/font.cpp index d58663a00c..1e851ff4ae 100644 --- a/engines/toon/font.cpp +++ b/engines/toon/font.cpp @@ -65,10 +65,10 @@ byte FontRenderer::textToFont(byte c) { return map_textToFont[c - 0x80]; } -void FontRenderer::renderText(int32 x, int32 y, const Common::String &origText, int32 mode) { +void FontRenderer::renderText(int16 x, int16 y, const Common::String &origText, int32 mode) { debugC(5, kDebugFont, "renderText(%d, %d, %s, %d)", x, y, origText.c_str(), mode); - int32 xx, yy; + int16 xx, yy; computeSize(origText, &xx, &yy); if (mode & 2) { @@ -83,8 +83,8 @@ void FontRenderer::renderText(int32 x, int32 y, const Common::String &origText, _vm->addDirtyRect(x, y, x + xx, y + yy); - int32 curX = x; - int32 curY = y; + int16 curX = x; + int16 curY = y; int32 height = 0; const byte *text = (const byte *)origText.c_str(); @@ -98,20 +98,20 @@ void FontRenderer::renderText(int32 x, int32 y, const Common::String &origText, curChar = textToFont(curChar); _currentFont->drawFontFrame(_vm->getMainSurface(), curChar, curX, curY, _currentFontColor); curX = curX + _currentFont->getFrameWidth(curChar) - 1; - height = MAX(height, _currentFont->getFrameHeight(curChar)); + height = MAX(height, _currentFont->getFrameHeight(curChar)); } text++; } } -void FontRenderer::computeSize(const Common::String &origText, int32 *retX, int32 *retY) { +void FontRenderer::computeSize(const Common::String &origText, int16 *retX, int16 *retY) { debugC(4, kDebugFont, "computeSize(%s, retX, retY)", origText.c_str()); - int32 lineWidth = 0; - int32 lineHeight = 0; - int32 totalHeight = 0; - int32 totalWidth = 0; - int32 lastLineHeight = 0; + int16 lineWidth = 0; + int16 lineHeight = 0; + int16 totalHeight = 0; + int16 totalWidth = 0; + int16 lastLineHeight = 0; const byte *text = (const byte *)origText.c_str(); while (*text) { @@ -127,8 +127,8 @@ void FontRenderer::computeSize(const Common::String &origText, int32 *retX, int3 lastLineHeight = 0; } else { curChar = textToFont(curChar); - int32 charWidth = _currentFont->getFrameWidth(curChar) - 1; - int32 charHeight = _currentFont->getFrameHeight(curChar); + int16 charWidth = _currentFont->getFrameWidth(curChar) - 1; + int16 charHeight = _currentFont->getFrameHeight(curChar); lineWidth += charWidth; lineHeight = MAX(lineHeight, charHeight); @@ -137,7 +137,7 @@ void FontRenderer::computeSize(const Common::String &origText, int32 *retX, int3 // assume we only need to take the lower bound into // consideration. Common::Rect charRect = _currentFont->getFrameRect(curChar); - lastLineHeight = MAX(lastLineHeight, charRect.bottom); + lastLineHeight = MAX(lastLineHeight, charRect.bottom); } text++; } @@ -189,7 +189,7 @@ void FontRenderer::setFontColor(int32 fontColor1, int32 fontColor2, int32 fontCo _currentFontColor[3] = fontColor3; } -void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &origText, int32 mode) { +void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &origText, int32 mode) { debugC(5, kDebugFont, "renderMultiLineText(%d, %d, %s, %d)", x, y, origText.c_str(), mode); // divide the text in several lines @@ -204,10 +204,10 @@ void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &o byte *it = text; - int32 maxWidth = 0; - int32 curWidth = 0; + int16 maxWidth = 0; + int16 curWidth = 0; - while (1) { + while (true) { byte *lastLine = it; byte *lastSpace = it; int32 lastSpaceX = 0; @@ -223,7 +223,7 @@ void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &o curChar = textToFont(curChar); int width = _currentFont->getFrameWidth(curChar); - curWidth += MAX(width - 2, 0); + curWidth += MAX(width - 2, 0); it++; curLetterNr++; } @@ -260,8 +260,8 @@ void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &o //numLines++; // get font height (assumed to be constant) - int32 height = _currentFont->getHeight(); - int textSize = (height - 2) * numLines; + int16 height = _currentFont->getHeight(); + int32 textSize = (height - 2) * numLines; y = y - textSize; if (y < 30) y = 30; @@ -278,8 +278,8 @@ void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &o x = TOON_SCREEN_WIDTH - (maxWidth / 2) - 30; // we have good coordinates now, we can render the multi line - int32 curX = x; - int32 curY = y; + int16 curX = x; + int16 curY = y; for (int32 i = 0; i < numLines; i++) { const byte *line = lines[i]; diff --git a/engines/toon/font.h b/engines/toon/font.h index 349d9d1ee7..2a46ad3559 100644 --- a/engines/toon/font.h +++ b/engines/toon/font.h @@ -33,9 +33,9 @@ public: ~FontRenderer(); void setFont(Animation *font); - void computeSize(const Common::String &origText, int32 *retX, int32 *retY); - void renderText(int32 x, int32 y, const Common::String &origText, int32 mode); - void renderMultiLineText(int32 x, int32 y, const Common::String &origText, int32 mode); + void computeSize(const Common::String &origText, int16 *retX, int16 *retY); + void renderText(int16 x, int16 y, const Common::String &origText, int32 mode); + void renderMultiLineText(int16 x, int16 y, const Common::String &origText, int32 mode); void setFontColorByCharacter(int32 characterId); void setFontColor(int32 fontColor1, int32 fontColor2, int32 fontColor3); protected: diff --git a/engines/toon/hotspot.cpp b/engines/toon/hotspot.cpp index ce2cdf1bb9..8b8f0ab577 100644 --- a/engines/toon/hotspot.cpp +++ b/engines/toon/hotspot.cpp @@ -57,7 +57,7 @@ void Hotspots::save(Common::WriteStream *Stream) { } } -int32 Hotspots::FindBasedOnCorner(int32 x, int32 y) { +int32 Hotspots::FindBasedOnCorner(int16 x, int16 y) { debugC(1, kDebugHotspot, "FindBasedOnCorner(%d, %d)", x, y); for (int32 i = 0; i < _numItems; i++) { @@ -73,7 +73,7 @@ int32 Hotspots::FindBasedOnCorner(int32 x, int32 y) { return -1; } -int32 Hotspots::Find(int32 x, int32 y) { +int32 Hotspots::Find(int16 x, int16 y) { debugC(6, kDebugHotspot, "Find(%d, %d)", x, y); int32 priority = -1; diff --git a/engines/toon/hotspot.h b/engines/toon/hotspot.h index 70e80046e1..3852e2e42e 100644 --- a/engines/toon/hotspot.h +++ b/engines/toon/hotspot.h @@ -51,8 +51,8 @@ public: ~Hotspots(); bool LoadRif(const Common::String &rifName, const Common::String &additionalRifName); - int32 Find(int32 x, int32 y); - int32 FindBasedOnCorner(int32 x, int32 y); + int32 Find(int16 x, int16 y); + int32 FindBasedOnCorner(int16 x, int16 y); HotspotData *Get(int32 id); int32 getCount() const { return _numItems; } diff --git a/engines/toon/picture.cpp b/engines/toon/picture.cpp index ff136e5acb..204b0fe576 100644 --- a/engines/toon/picture.cpp +++ b/engines/toon/picture.cpp @@ -150,7 +150,7 @@ void Picture::setupPalette() { _vm->setPaletteEntries(_palette, 1, 128); } -void Picture::drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy) { +void Picture::drawMask(Graphics::Surface &surface, int16 x, int16 y, int16 dx, int16 dy) { debugC(1, kDebugPicture, "drawMask(surface, %d, %d, %d, %d)", x, y, dx, dy); for (int32 i = 0; i < 128; i++) { @@ -161,8 +161,8 @@ void Picture::drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, i _vm->setPaletteEntries(color, i, 1); } - int32 rx = MIN(_width, surface.w - x); - int32 ry = MIN(_height, surface.h - y); + int16 rx = MIN(_width, surface.w - x); + int16 ry = MIN(_height, surface.h - y); if (rx < 0 || ry < 0) return; @@ -172,10 +172,10 @@ void Picture::drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, i uint8 *c = _data + _width * dy + dx; uint8 *curRow = (uint8 *)surface.pixels + y * destPitch + x; - for (int32 yy = 0; yy < ry; yy++) { + for (int16 yy = 0; yy < ry; yy++) { uint8 *curSrc = c; uint8 *cur = curRow; - for (int32 xx = 0; xx < rx; xx++) { + for (int16 xx = 0; xx < rx; xx++) { //*cur = (*curSrc >> 5) * 8; // & 0x1f; *cur = (*curSrc & 0x1f) ? 127 : 0; @@ -187,10 +187,9 @@ void Picture::drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, i } } -void Picture::drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int32 dx, int32 dy, Common::Array& rectArray) { - - int32 rx = MIN(_width, surface.w - x); - int32 ry = MIN(_height, surface.h - y); +void Picture::drawWithRectList(Graphics::Surface& surface, int16 x, int16 y, int16 dx, int16 dy, Common::Array& rectArray) { + int16 rx = MIN(_width, surface.w - x); + int16 ry = MIN(_height, surface.h - y); if (rx < 0 || ry < 0) return; @@ -202,16 +201,16 @@ void Picture::drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int Common::Rect rect = rectArray[i]; - int32 fillRx = MIN(rx, rect.right - rect.left); - int32 fillRy = MIN(ry, rect.bottom - rect.top); + int16 fillRx = MIN(rx, rect.right - rect.left); + int16 fillRy = MIN(ry, rect.bottom - rect.top); uint8 *c = _data + _width * (dy + rect.top) + (dx + rect.left); uint8 *curRow = (uint8 *)surface.pixels + (y + rect.top) * destPitch + (x + rect.left); - for (int32 yy = 0; yy < fillRy; yy++) { + for (int16 yy = 0; yy < fillRy; yy++) { uint8 *curSrc = c; uint8 *cur = curRow; - for (int32 xx = 0; xx < fillRx; xx++) { + for (int16 xx = 0; xx < fillRx; xx++) { *cur = *curSrc; curSrc++; cur++; @@ -222,11 +221,11 @@ void Picture::drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int } } -void Picture::draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy) { +void Picture::draw(Graphics::Surface &surface, int16 x, int16 y, int16 dx, int16 dy) { debugC(6, kDebugPicture, "draw(surface, %d, %d, %d, %d)", x, y, dx, dy); - int32 rx = MIN(_width, surface.w - x); - int32 ry = MIN(_height, surface.h - y); + int16 rx = MIN(_width, surface.w - x); + int16 ry = MIN(_height, surface.h - y); if (rx < 0 || ry < 0) return; @@ -236,10 +235,10 @@ void Picture::draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 uint8 *c = _data + _width * dy + dx; uint8 *curRow = (uint8 *)surface.pixels + y * destPitch + x; - for (int32 yy = 0; yy < ry; yy++) { + for (int16 yy = 0; yy < ry; yy++) { uint8 *curSrc = c; uint8 *cur = curRow; - for (int32 xx = 0; xx < rx; xx++) { + for (int16 xx = 0; xx < rx; xx++) { *cur = *curSrc; curSrc++; cur++; @@ -249,7 +248,7 @@ void Picture::draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 } } -uint8 Picture::getData(int32 x, int32 y) { +uint8 Picture::getData(int16 x, int16 y) { debugC(6, kDebugPicture, "getData(%d, %d)", x, y); if (!_data) @@ -259,7 +258,7 @@ uint8 Picture::getData(int32 x, int32 y) { } // use original work from johndoe -void Picture::floodFillNotWalkableOnMask(int32 x, int32 y) { +void Picture::floodFillNotWalkableOnMask(int16 x, int16 y) { debugC(1, kDebugPicture, "floodFillNotWalkableOnMask(%d, %d)", x, y); // Stack-based floodFill algorithm based on // http://student.kuleuven.be/~m0216922/CG/files/floodfill.cpp @@ -292,10 +291,10 @@ void Picture::floodFillNotWalkableOnMask(int32 x, int32 y) { } } -void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable) { +void Picture::drawLineOnMask(int16 x, int16 y, int16 x2, int16 y2, bool walkable) { debugC(1, kDebugPicture, "drawLineOnMask(%d, %d, %d, %d, %d)", x, y, x2, y2, (walkable) ? 1 : 0); - static int32 lastX = 0; - static int32 lastY = 0; + static int16 lastX = 0; + static int16 lastY = 0; if (x == -1) { x = lastX; @@ -303,12 +302,12 @@ void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable } uint32 bx = x << 16; - int32 dx = x2 - x; + int16 dx = x2 - x; uint32 by = y << 16; - int32 dy = y2 - y; - uint32 adx = abs(dx); - uint32 ady = abs(dy); - int32 t = 0; + int16 dy = y2 - y; + uint16 adx = abs(dx); + uint16 ady = abs(dy); + int16 t = 0; if (adx <= ady) t = ady; else @@ -317,9 +316,7 @@ void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable int32 cdx = (dx << 16) / t; int32 cdy = (dy << 16) / t; - int32 i = t; - while (i) { - + for (int16 i = t; i > 0; i--) { int32 rx = bx >> 16; int32 ry = by >> 16; @@ -337,7 +334,6 @@ void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable bx += cdx; by += cdy; - i--; } } } // End of namespace Toon diff --git a/engines/toon/picture.h b/engines/toon/picture.h index 460c5b58a2..5e79612a39 100644 --- a/engines/toon/picture.h +++ b/engines/toon/picture.h @@ -33,25 +33,27 @@ namespace Toon { class ToonEngine; -class Picture { +class Picture { public: Picture(ToonEngine *vm); ~Picture(); + bool loadPicture(const Common::String &file); void setupPalette(); - void draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy); - void drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int32 dx, int32 dy, Common::Array& rectArray); - void drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy); - void drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable); - void floodFillNotWalkableOnMask(int32 x, int32 y); - uint8 getData(int32 x, int32 y); + void draw(Graphics::Surface &surface, int16 x, int16 y, int16 dx, int16 dy); + void drawWithRectList(Graphics::Surface& surface, int16 x, int16 y, int16 dx, int16 dy, Common::Array& rectArray); + void drawMask(Graphics::Surface &surface, int16 x, int16 y, int16 dx, int16 dy); + void drawLineOnMask(int16 x, int16 y, int16 x2, int16 y2, bool walkable); + void floodFillNotWalkableOnMask(int16 x, int16 y); + uint8 getData(int16 x, int16 y); uint8 *getDataPtr() { return _data; } - int32 getWidth() const { return _width; } - int32 getHeight() const { return _height; } + int16 getWidth() const { return _width; } + int16 getHeight() const { return _height; } + protected: - int32 _width; - int32 _height; + int16 _width; + int16 _height; uint8 *_data; uint8 *_palette; // need to be copied at 3-387 int32 _paletteEntries; diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp index 416daa1fe8..0956b965a7 100644 --- a/engines/toon/toon.cpp +++ b/engines/toon/toon.cpp @@ -1588,12 +1588,12 @@ void ToonEngine::clickEvent() { } void ToonEngine::selectHotspot() { - int32 x1 = 0; - int32 x2 = 0; - int32 y1 = 0; - int32 y2 = 0; + int16 x1 = 0; + int16 x2 = 0; + int16 y1 = 0; + int16 y2 = 0; - int32 mouseX = _mouseX; + int16 mouseX = _mouseX; if (_gameState->_inCutaway) mouseX += TOON_BACKBUFFER_WIDTH; @@ -1693,7 +1693,6 @@ void ToonEngine::selectHotspot() { } void ToonEngine::exitScene() { - fadeOut(5); // disable all scene animation @@ -2831,7 +2830,6 @@ void ToonEngine::playSoundWrong() { } void ToonEngine::getTextPosition(int32 characterId, int32 *retX, int32 *retY) { - if (characterId < 0) characterId = 0; @@ -2852,8 +2850,8 @@ void ToonEngine::getTextPosition(int32 characterId, int32 *retX, int32 *retY) { } } else if (characterId == 1) { // flux - int32 x = _flux->getX(); - int32 y = _flux->getY(); + int16 x = _flux->getX(); + int16 y = _flux->getY(); if (x >= _gameState->_currentScrollValue && x <= _gameState->_currentScrollValue + TOON_SCREEN_WIDTH) { if (!_gameState->_inCutaway) { *retX = x; @@ -2885,7 +2883,7 @@ void ToonEngine::getTextPosition(int32 characterId, int32 *retX, int32 *retY) { if (character && !_gameState->_inCutaway) { if (character->getAnimationInstance()) { if (character->getX() >= _gameState->_currentScrollValue && character->getX() <= _gameState->_currentScrollValue + TOON_SCREEN_WIDTH) { - int32 x1, y1, x2, y2; + int16 x1, y1, x2, y2; character->getAnimationInstance()->getRect(&x1, &y1, &x2, &y2); *retX = (x1 + x2) / 2; *retY = y1; @@ -2896,7 +2894,6 @@ void ToonEngine::getTextPosition(int32 characterId, int32 *retX, int32 *retY) { } Character *ToonEngine::getCharacterById(int32 charId) { - for (int32 i = 0; i < 8; i++) { if (_characters[i] && _characters[i]->getId() == charId) return _characters[i]; -- cgit v1.2.3 From 0b5b58829cbb76a2da1c4de19dd51e30fc2c5a3d Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 29 Jun 2012 14:57:54 +0200 Subject: GUI: Don't distribute vertical space between buttons in the thumbnail load chooser. --- gui/saveload-dialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 5d9d489fec..8537937c0f 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -489,11 +489,11 @@ void LoadChooserThumbnailed::reflowLayout() { } const uint addX = _columns > 1 ? (availableWidth % slotAreaWidth) / (_columns - 1) : 0; - const uint addY = _lines > 1 ? (availableHeight % slotAreaHeight) / (_lines - 1) : 0; + //const uint addY = _lines > 1 ? (availableHeight % slotAreaHeight) / (_lines - 1) : 0; _buttons.reserve(_lines * _columns); y += defaultSpacingVertical / 2; - for (uint curLine = 0; curLine < _lines; ++curLine, y += slotAreaHeight + addY) { + for (uint curLine = 0; curLine < _lines; ++curLine, y += slotAreaHeight/* + addY*/) { for (uint curColumn = 0, curX = x + defaultSpacingHorizontal / 2; curColumn < _columns; ++curColumn, curX += slotAreaWidth + addX) { ContainerWidget *container = new ContainerWidget(this, curX, y, containerWidth, containerHeight); container->setVisible(false); -- cgit v1.2.3 From 0db0b650e215847005676755363565879c2a7b94 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 29 Jun 2012 14:58:33 +0200 Subject: GUI: Fix copy&paste error affecting vertical spacing in thumbnail load chooser. --- gui/saveload-dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 8537937c0f..1d8a9872aa 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -477,7 +477,7 @@ void LoadChooserThumbnailed::reflowLayout() { const int16 defaultSpacingHorizontal = 4; const int16 defaultSpacingVertical = 4; const int16 slotAreaWidth = containerWidth + defaultSpacingHorizontal; - const int16 slotAreaHeight = containerHeight + defaultSpacingHorizontal; + const int16 slotAreaHeight = containerHeight + defaultSpacingVertical; const uint oldEntriesPerPage = _entriesPerPage; _columns = MAX(1, availableWidth / slotAreaWidth); -- cgit v1.2.3 From 7860c5bfc93055f1ebcbf037876cd2abd42818c5 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 29 Jun 2012 15:00:56 +0200 Subject: GUI: Only update save list when the dialog opens in thumbnail load chooser. --- gui/saveload-dialog.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 1d8a9872aa..25c722eec1 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -452,6 +452,7 @@ void LoadChooserThumbnailed::open() { SaveLoadChooserDialog::open(); _curPage = 0; + _saveList = _metaEngine->listSaves(_target.c_str()); updateSaves(); } @@ -546,8 +547,6 @@ void LoadChooserThumbnailed::hideButtons() { void LoadChooserThumbnailed::updateSaves() { hideButtons(); - _saveList = _metaEngine->listSaves(_target.c_str()); - for (uint i = _curPage * _entriesPerPage, curNum = 0; i < _saveList.size() && curNum < _entriesPerPage; ++i, ++curNum) { const uint saveSlot = _saveList[i].getSaveSlot(); -- cgit v1.2.3 From d3e5763276826d3f469fd93077c2f1ef6ef61314 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 29 Jun 2012 15:52:56 +0200 Subject: GUI: Allow the user to switch between list and thumbnail based load chooser. --- gui/ThemeEngine.cpp | 2 + gui/ThemeEngine.h | 4 +- gui/saveload-dialog.cpp | 78 +++++++++++++++++++-- gui/saveload-dialog.h | 18 ++++- gui/saveload.cpp | 13 +++- gui/themes/default.inc | 18 +++++ gui/themes/scummclassic.zip | Bin 93390 -> 93928 bytes gui/themes/scummclassic/THEMERC | 2 +- gui/themes/scummclassic/classic_layout.stx | 9 +++ gui/themes/scummclassic/classic_layout_lowres.stx | 9 +++ gui/themes/scummmodern.zip | Bin 1449870 -> 1452236 bytes gui/themes/scummmodern/THEMERC | 2 +- gui/themes/scummmodern/grid.bmp | Bin 0 -> 822 bytes gui/themes/scummmodern/list.bmp | Bin 0 -> 822 bytes gui/themes/scummmodern/scummmodern_gfx.stx | 2 + gui/themes/scummmodern/scummmodern_layout.stx | 9 +++ .../scummmodern/scummmodern_layout_lowres.stx | 9 +++ 17 files changed, 163 insertions(+), 12 deletions(-) create mode 100644 gui/themes/scummmodern/grid.bmp create mode 100644 gui/themes/scummmodern/list.bmp diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index 1bf7ad3c85..6f34e8dc70 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -48,6 +48,8 @@ const char * const ThemeEngine::kImageLogoSmall = "logo_small.bmp"; const char * const ThemeEngine::kImageSearch = "search.bmp"; const char * const ThemeEngine::kImageEraser = "eraser.bmp"; const char * const ThemeEngine::kImageDelbtn = "delbtn.bmp"; +const char * const ThemeEngine::kImageList = "list.bmp"; +const char * const ThemeEngine::kImageGrid = "grid.bmp"; struct TextDrawData { const Graphics::Font *_fontPtr; diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index 21711e2955..cd388b7f65 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -35,7 +35,7 @@ #include "graphics/pixelformat.h" -#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.13" +#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.14" class OSystem; @@ -232,6 +232,8 @@ public: static const char *const kImageSearch; ///< Search tool image used in the launcher static const char *const kImageEraser; ///< Clear input image used in the launcher static const char *const kImageDelbtn; ///< Delete characters in the predictive dialog + static const char *const kImageList; ///< List image used in save/load chooser selection + static const char *const kImageGrid; ///< Grid image used in save/load chooser selection /** * Graphics mode enumeration. diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 25c722eec1..45bf1c49fc 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -30,14 +30,23 @@ namespace GUI { -SaveLoadChooserDialog::SaveLoadChooserDialog(const Common::String &dialogName) +enum { + kListSwitchCmd = 'LIST', + kGridSwitchCmd = 'GRID' +}; + +SaveLoadChooserDialog::SaveLoadChooserDialog(const Common::String &dialogName, const bool saveMode) : Dialog(dialogName), _metaEngine(0), _delSupport(false), _metaInfoSupport(false), - _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false) { + _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false), _saveMode(saveMode), + _listButton(0), _gridButton(0) { + addChooserButtons(); } -SaveLoadChooserDialog::SaveLoadChooserDialog(int x, int y, int w, int h) +SaveLoadChooserDialog::SaveLoadChooserDialog(int x, int y, int w, int h, const bool saveMode) : Dialog(x, y, w, h), _metaEngine(0), _delSupport(false), _metaInfoSupport(false), - _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false) { + _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false), _saveMode(saveMode), + _listButton(0), _gridButton(0) { + addChooserButtons(); } void SaveLoadChooserDialog::open() { @@ -60,6 +69,63 @@ int SaveLoadChooserDialog::run(const Common::String &target, const MetaEngine *m return runIntern(); } +void SaveLoadChooserDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { + switch (cmd) { + case kListSwitchCmd: + setResult(kSwitchToList); + close(); + break; + + case kGridSwitchCmd: + setResult(kSwitchToGrid); + close(); + break; + + default: + break; + } + + return Dialog::handleCommand(sender, cmd, data); +} + +void SaveLoadChooserDialog::addChooserButtons() { + if (_listButton) { + removeWidget(_listButton); + delete _listButton; + } + + if (_gridButton) { + removeWidget(_gridButton); + delete _gridButton; + } + + _listButton = createSwitchButton("SaveLoadChooser.ListSwitch", "L", _("List view"), ThemeEngine::kImageList, kListSwitchCmd); + _gridButton = createSwitchButton("SaveLoadChooser.GridSwitch", "G", _("Grid view"), ThemeEngine::kImageGrid, kGridSwitchCmd); + if (!_metaInfoSupport || !_thumbnailSupport || _saveMode) + _gridButton->setEnabled(false); +} + +void SaveLoadChooserDialog::reflowLayout() { + addChooserButtons(); + + Dialog::reflowLayout(); +} + +GUI::ButtonWidget *SaveLoadChooserDialog::createSwitchButton(const Common::String &name, const char *desc, const char *tooltip, const char *image, uint32 cmd) { + ButtonWidget *button; + +#ifndef DISABLE_FANCY_THEMES + if (g_gui.xmlEval()->getVar("Globals.ShowChooserPics") == 1 && g_gui.theme()->supportsImages()) { + button = new PicButtonWidget(this, name, tooltip, cmd); + ((PicButtonWidget *)button)->useThemeTransparency(true); + ((PicButtonWidget *)button)->setGfx(g_gui.theme()->getImageSurface(image)); + } else +#endif + button = new ButtonWidget(this, name, desc, tooltip, cmd); + + return button; +} + // SaveLoadChooserSimple implementation enum { @@ -68,7 +134,7 @@ enum { }; SaveLoadChooserSimple::SaveLoadChooserSimple(const String &title, const String &buttonLabel, bool saveMode) - : SaveLoadChooserDialog("SaveLoadChooser"), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { + : SaveLoadChooserDialog("SaveLoadChooser", saveMode), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { _backgroundType = ThemeEngine::kDialogBackgroundSpecial; new StaticTextWidget(this, "SaveLoadChooser.Title", title); @@ -385,7 +451,7 @@ enum { }; LoadChooserThumbnailed::LoadChooserThumbnailed(const Common::String &title) - : SaveLoadChooserDialog("SaveLoadChooser"), _lines(0), _columns(0), _entriesPerPage(0), + : SaveLoadChooserDialog("SaveLoadChooser", false), _lines(0), _columns(0), _entriesPerPage(0), _curPage(0), _buttons() { _backgroundType = ThemeEngine::kDialogBackgroundSpecial; diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index b80741d36a..7921f5798a 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -29,19 +29,27 @@ namespace GUI { +#define kSwitchToList -2 +#define kSwitchToGrid -3 + class SaveLoadChooserDialog : protected Dialog { public: - SaveLoadChooserDialog(const Common::String &dialogName); - SaveLoadChooserDialog(int x, int y, int w, int h); + SaveLoadChooserDialog(const Common::String &dialogName, const bool saveMode); + SaveLoadChooserDialog(int x, int y, int w, int h, const bool saveMode); virtual void open(); + virtual void reflowLayout(); + + virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + int run(const Common::String &target, const MetaEngine *metaEngine); virtual const Common::String &getResultString() const = 0; protected: virtual int runIntern() = 0; + const bool _saveMode; const MetaEngine *_metaEngine; bool _delSupport; bool _metaInfoSupport; @@ -49,6 +57,12 @@ protected: bool _saveDateSupport; bool _playTimeSupport; Common::String _target; + + GUI::ButtonWidget *_listButton; + GUI::ButtonWidget *_gridButton; + + void addChooserButtons(); + GUI::ButtonWidget *createSwitchButton(const Common::String &name, const char *desc, const char *tooltip, const char *image, uint32 cmd = 0); }; class SaveLoadChooserSimple : public SaveLoadChooserDialog { diff --git a/gui/saveload.cpp b/gui/saveload.cpp index becc3f6b4f..f544f0e6a0 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -83,7 +83,18 @@ int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, con String oldDomain = ConfMan.getActiveDomainName(); ConfMan.setActiveDomain(target); - int ret = _impl->run(target, &(**plugin)); + int ret; + do { + ret = _impl->run(target, &(**plugin)); + + if (ret == kSwitchToList) { + delete _impl; + _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); + } else if (ret == kSwitchToGrid) { + delete _impl; + _impl = new LoadChooserThumbnailed(_title); + } + } while (ret < -1); // Revert to the old active domain ConfMan.setActiveDomain(oldDomain); diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 86d0061e1b..331289ddf7 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -619,6 +619,7 @@ " " " " " " +" " " " " " " " @@ -1362,6 +1363,14 @@ " " " " " " +" " +" " " " " " " " " " +" " " " " " " " @@ -2305,6 +2315,14 @@ "/> " " " " " +" " +" " " " " + @@ -804,6 +805,14 @@ /> + + + @@ -807,6 +808,14 @@ + + + + diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index 087a844a1b..30f8f3c323 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -38,6 +38,7 @@ + @@ -818,6 +819,14 @@ /> + + + @@ -806,6 +807,14 @@ + + container); + delete i->container; removeWidget(i->button); + delete i->button; removeWidget(i->description); + delete i->description; } _buttons.clear(); -- cgit v1.2.3 From e2056bdfd93ba247c819ec3fd2f0b487dde05709 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 29 Jun 2012 16:09:28 +0200 Subject: GUI: Remember last save/load chooser selection. --- base/commandLine.cpp | 2 ++ gui/saveload.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/base/commandLine.cpp b/base/commandLine.cpp index 6fd020cb15..5ad23313dc 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -237,6 +237,8 @@ void registerDefaults() { ConfMan.registerDefault("record_temp_file_name", "record.tmp"); ConfMan.registerDefault("record_time_file_name", "record.time"); + ConfMan.registerDefault("gui_saveload_chooser", "grid"); + } // diff --git a/gui/saveload.cpp b/gui/saveload.cpp index f544f0e6a0..9ae27f31be 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -43,9 +43,12 @@ void SaveLoadChooser::selectChooser(const MetaEngine &engine) { delete _impl; _impl = 0; + Common::String userConfig = ConfMan.get("gui_saveload_chooser", Common::ConfigManager::kApplicationDomain); + if (!_saveMode && g_gui.getWidth() > 320 && g_gui.getHeight() > 200 && engine.hasFeature(MetaEngine::kSavesSupportMetaInfo) - && engine.hasFeature(MetaEngine::kSavesSupportThumbnail)) { + && engine.hasFeature(MetaEngine::kSavesSupportThumbnail) + && userConfig.equalsIgnoreCase("grid")) { _impl = new LoadChooserThumbnailed(_title); } else { _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); @@ -90,9 +93,11 @@ int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, con if (ret == kSwitchToList) { delete _impl; _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); + ConfMan.set("gui_saveload_chooser", "list", Common::ConfigManager::kApplicationDomain); } else if (ret == kSwitchToGrid) { delete _impl; _impl = new LoadChooserThumbnailed(_title); + ConfMan.set("gui_saveload_chooser", "grid", Common::ConfigManager::kApplicationDomain); } } while (ret < -1); -- cgit v1.2.3 From c1426f783d91976d221c059c37b606411445d438 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 29 Jun 2012 16:15:46 +0200 Subject: GUI: Use a black rect when no thumbnail is available in the thumbnail load chooser. --- gui/saveload-dialog.cpp | 7 ++++++- gui/widget.cpp | 13 +++++++++++++ gui/widget.h | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 1a6083bf9e..12b34e49fb 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -622,7 +622,12 @@ void LoadChooserThumbnailed::updateSaves() { SaveStateDescriptor desc = _metaEngine->querySaveMetaInfos(_target.c_str(), saveSlot); SlotButton &curButton = _buttons[curNum]; curButton.setVisible(true); - curButton.button->setGfx(desc.getThumbnail()); + const Graphics::Surface *thumbnail = desc.getThumbnail(); + if (thumbnail) { + curButton.button->setGfx(desc.getThumbnail()); + } else { + curButton.button->setGfx(kThumbnailWidth, kThumbnailHeight2, 0, 0, 0); + } curButton.description->setLabel(Common::String::format("%d. %s", saveSlot, desc.getDescription().c_str())); Common::String tooltip(_("Name: ")); diff --git a/gui/widget.cpp b/gui/widget.cpp index 1b68e36ea8..3c26f1135b 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -414,6 +414,19 @@ void PicButtonWidget::setGfx(const Graphics::Surface *gfx) { _gfx->copyFrom(*gfx); } +void PicButtonWidget::setGfx(int w, int h, int r, int g, int b) { + if (w == -1) + w = _w; + if (h == -1) + h = _h; + + const Graphics::PixelFormat &requiredFormat = g_gui.theme()->getPixelFormat(); + + _gfx->free(); + _gfx->create(w, h, requiredFormat); + _gfx->fillRect(Common::Rect(0, 0, w, h), _gfx->format.RGBToColor(r, g, b)); +} + void PicButtonWidget::drawWidget() { g_gui.theme()->drawButton(Common::Rect(_x, _y, _x+_w, _y+_h), "", _state, getFlags()); diff --git a/gui/widget.h b/gui/widget.h index d80b2ad7e2..bcc9a3f6d3 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -222,6 +222,7 @@ public: ~PicButtonWidget(); void setGfx(const Graphics::Surface *gfx); + void setGfx(int w, int h, int r, int g, int b); void useAlpha(int alpha) { _alpha = alpha; } void useThemeTransparency(bool enable) { _transparency = enable; } -- cgit v1.2.3 From 10bfb82d3b7ba31b7b8f57560ff55b010dd7de3e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 29 Jun 2012 16:16:36 +0200 Subject: GUI: Use a slightly bigger vertical spacing in the thumbnail load chooser. --- gui/saveload-dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 12b34e49fb..0a94fede51 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -542,7 +542,7 @@ void LoadChooserThumbnailed::reflowLayout() { const int16 containerHeight = buttonHeight + kLineHeight + containerFrameHeightAdd; const int16 defaultSpacingHorizontal = 4; - const int16 defaultSpacingVertical = 4; + const int16 defaultSpacingVertical = 8; const int16 slotAreaWidth = containerWidth + defaultSpacingHorizontal; const int16 slotAreaHeight = containerHeight + defaultSpacingVertical; -- cgit v1.2.3 From 100ff974cb38304890afa96f43259b55464bd888 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Fri, 29 Jun 2012 22:13:19 +0100 Subject: TOON: Correct mismatched method definition against prototype. Fixes bug #3539018 - "Toon: AmigaOS4 Compiler error in anim.cpp" --- engines/toon/anim.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/toon/anim.cpp b/engines/toon/anim.cpp index 8097b1844d..1c85a8d798 100644 --- a/engines/toon/anim.cpp +++ b/engines/toon/anim.cpp @@ -501,7 +501,7 @@ void AnimationInstance::setAnimation(Animation *animation, bool setRange) { } } -void AnimationInstance::setAnimationRange(int32 rangeStart, int rangeEnd) { +void AnimationInstance::setAnimationRange(int32 rangeStart, int32 rangeEnd) { debugC(5, kDebugAnim, "setAnimationRange(%d, %d)", rangeStart, rangeEnd); _rangeStart = rangeStart; _rangeEnd = rangeEnd; -- cgit v1.2.3 From 4789e0f02665a8cc8cf0b814d65e71d38f88a5f1 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Fri, 29 Jun 2012 23:37:11 +0100 Subject: LURE: Fix engine crash in copy protection screen. Fixes bug #3539031 - "LURE: Crash at Copy Protection Screen". Previously, the code didn't prevent keyboard events with modifiers being used. Since the ascii values for these were outside the 0-9 numeric range, this resulted in an invalid frame number being used and thus the engine aborted at an asertion. --- engines/lure/surface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/lure/surface.cpp b/engines/lure/surface.cpp index 4d63647af5..7af9d665de 100644 --- a/engines/lure/surface.cpp +++ b/engines/lure/surface.cpp @@ -1349,7 +1349,7 @@ bool CopyProtectionDialog::show() { while (!engine.shouldQuit()) { while (events.pollEvent() && (_charIndex < 4)) { - if (events.type() == Common::EVENT_KEYDOWN) { + if (events.type() == Common::EVENT_KEYDOWN && !(events.event().kbd.flags & Common::KBD_NON_STICKY)) { if ((events.event().kbd.keycode == Common::KEYCODE_BACKSPACE) && (_charIndex > 0)) { // Remove the last number typed --_charIndex; -- cgit v1.2.3 From 7efdf21e85dea6d103bbf8929a585025b79869ca Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 30 Jun 2012 12:18:47 +0100 Subject: I18N: Update Swedish translation from patch #3538686 --- po/se_SE.po | 120 +++++++++++++++++++++++++++--------------------------------- 1 file changed, 54 insertions(+), 66 deletions(-) diff --git a/po/se_SE.po b/po/se_SE.po index a1f9c91b44..fe896842a2 100644 --- a/po/se_SE.po +++ b/po/se_SE.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ScummVM 1.3.0svn\n" +"Project-Id-Version: ScummVM 1.5.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-06-24 18:06+0100\n" -"PO-Revision-Date: 2011-11-27 19:00+0100\n" +"PO-Revision-Date: 2012-06-28 15:47+0100\n" "Last-Translator: Hampus Flink \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -81,7 +81,6 @@ msgid "Remap keys" msgstr "Stll in tangenter" #: gui/gui-manager.cpp:129 base/main.cpp:307 -#, fuzzy msgid "Toggle FullScreen" msgstr "Fullskrmslge" @@ -197,9 +196,8 @@ msgid "Platform:" msgstr "Plattform:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Undersk" +msgstr "Motor" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -1165,14 +1163,11 @@ msgstr "" "ytterligare assistens." #: engines/dialogs.cpp:228 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." -msgstr "" -"Tyvrr stder fr tillfllet inte den hr motorn hjlp-funktionen. Var god " -"hnvisa till README-filen fr information och instruktioner fr att f " -"ytterligare assistens." +msgstr "Spar" #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 @@ -1233,14 +1228,13 @@ msgstr "" "Se README-filen fr detaljer." #: engines/engine.cpp:426 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Tyvrr stder fr tillfllet inte den hr motorn hjlp-funktionen. Var god " -"hnvisa till README-filen fr information och instruktioner fr att f " -"ytterligare assistens." +"Kunde inte ladda spardata (%s)! Hnvisa till README-filen fr grundlggande " +"information och instruktioner fr ytterligare assistans." #: engines/engine.cpp:439 msgid "" @@ -1259,12 +1253,12 @@ msgstr "Starta #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Anvnd originalskrmar fr spara/ladda" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" -msgstr "" +msgstr "Anvnder originalskrmarna fr spara/ladda istllet fr ScummVM:s" #: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" @@ -1275,68 +1269,68 @@ msgid "Restore" msgstr "terstll" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "vre hgra fremlet" +msgstr "Anvnd ljus palett-lge" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Visa grafik med spelets ljusa palett" #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "EGA anti-gitter" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "Aktiverar anti-gitter i EGA spel som stder det" +msgstr "Aktivera anti-gitter i EGA-spel" #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Volym fr specialeffekter" +msgstr "Fredra digitala ljudeffekter" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Fredra digitala ljudeffekter istllet fr syntetiserade" #: engines/sci/detection.cpp:400 msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "" +msgstr "Anvnd IMF/Yahama FB-01 fr MIDI-uppspelning" #: engines/sci/detection.cpp:401 msgid "" "Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " "output" msgstr "" +"Anvnd ett IMB Music Feature-kort eller en Yamaha FB-01 FM synthmodul fr " +"MIDI-uppspelning" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "Anvnd CD-ljud" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr "Anvnd CD-ljud istllet fr spelets ljud, om tillgngligt" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Anvnd Windows muspekare" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" +"Anvnd Windows muspekare (mindre och svartvit) istllet fr DOS-pekaren" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Vanlig pekare" +msgstr "Anvnd silverpekare" #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" +"Anvnd de alternativa silverpekarna istllet fr de normala guldpekarna" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -1454,24 +1448,23 @@ msgstr "Tal & text" #: engines/scumm/dialogs.cpp:653 msgid "Select a Proficiency Level." -msgstr "" +msgstr "Vlj en skicklighetsniv." #: engines/scumm/dialogs.cpp:655 msgid "Refer to your Loom(TM) manual for help." -msgstr "" +msgstr "Hnvisa till din Loom(TM)-manual fr hjlp." #: engines/scumm/dialogs.cpp:658 -#, fuzzy msgid "Standard" -msgstr "Standard (16 bpp)" +msgstr "Standard" #: engines/scumm/dialogs.cpp:659 msgid "Practice" -msgstr "" +msgstr "vning" #: engines/scumm/dialogs.cpp:660 msgid "Expert" -msgstr "" +msgstr "Expert" #: engines/scumm/help.cpp:73 msgid "Common keyboard commands:" @@ -2002,7 +1995,7 @@ msgid "" "\n" "%s" msgstr "" -"Kunde inte skriva spardata till file:\n" +"Kunde inte skriva spardata till filen:\n" "\n" "%s" @@ -2013,7 +2006,7 @@ msgid "" "\n" "%s" msgstr "" -"Kunde inte lsa spardata frn file:\n" +"Kunde inte lsa spardata frn filen:\n" "\n" "%s" @@ -2024,7 +2017,7 @@ msgid "" "\n" "%s" msgstr "" -"Sparade framgngsrikt spardata i file\n" +"Sparade framgngsrikt spardata i filen:\n" "\n" "%s" @@ -2090,61 +2083,59 @@ msgstr "Kunde inte spara spelet." #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Studiopublik" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Aktivera studiopublik" #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr "Skipp-std" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Tillter skippning av text och filmscener" #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Helium-lge" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Aktivera Roland GS-lge" +msgstr "Aktivera heliumlge" #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Mjuk rullning" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Aktivera mjuk skrmrullning vid gngfart" #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Vanlig pekare" +msgstr "Flytande pekare" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Aktivera flytande pekare" #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr "Livmtare" #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr "Aktivera livmtare" #: engines/kyra/lol.cpp:478 msgid "Attack 1" @@ -2210,11 +2201,11 @@ msgstr "" #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Diskettintro" #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr "Anvnd diskettversionens intro (endast CD-version)" #: engines/sky/compact.cpp:130 msgid "" @@ -2235,7 +2226,7 @@ msgstr "" #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" -msgstr "" +msgstr "PSX-filmscenen '%s' kan inte visas i palettlget" #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" @@ -2290,18 +2281,17 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "Hr slutar Broken Sword 1 demon" #: engines/sword2/animation.cpp:435 -#, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" -msgstr "DXA filmscener hittades men ScummVM har byggts utan std fr zlib" +msgstr "PSX-filmscener hittades men ScummVM har byggts utan std fr RGB-frg" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr "Visa etiketter" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr "Visar etiketter fr objekten som musen pekar p" #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2443,9 +2433,8 @@ msgid "Keymap:" msgstr "Tangenter:" #: backends/keymapper/remap-dialog.cpp:66 -#, fuzzy msgid " (Effective)" -msgstr "(Aktiv)" +msgstr "(Effektiv)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Active)" @@ -2453,7 +2442,7 @@ msgstr "(Aktiv)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr "(Blockerad)" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" @@ -2557,7 +2546,7 @@ msgstr "Touchpad-l #: backends/platform/maemo/maemo.cpp:205 msgid "Click Mode" -msgstr "" +msgstr "Klicklge" #: backends/platform/maemo/maemo.cpp:211 #: backends/platform/symbian/src/SymbianActions.cpp:42 @@ -2568,9 +2557,8 @@ msgid "Left Click" msgstr "Vnsterklick" #: backends/platform/maemo/maemo.cpp:214 -#, fuzzy msgid "Middle Click" -msgstr "Mellersta vnstra fremlet" +msgstr "Mittenklick" #: backends/platform/maemo/maemo.cpp:217 #: backends/platform/symbian/src/SymbianActions.cpp:43 -- cgit v1.2.3 From 5bbac72839c82d49863cda0508e44606eeb13ba3 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 30 Jun 2012 12:19:54 +0100 Subject: I18N: Update Italian translation The update was sent by Matteo by email. --- po/it_IT.po | 157 ++++++++++++++++++++++++++++-------------------------------- 1 file changed, 72 insertions(+), 85 deletions(-) diff --git a/po/it_IT.po b/po/it_IT.po index dc33811e28..26bf3773f9 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-06-24 18:06+0100\n" -"PO-Revision-Date: 2011-10-08 17:29+0100\n" +"PO-Revision-Date: 2012-06-29 14:33+0100\n" "Last-Translator: Matteo 'Maff' Angelino \n" "Language-Team: Italian\n" "MIME-Version: 1.0\n" @@ -77,7 +77,6 @@ msgid "Remap keys" msgstr "Riprogramma tasti" #: gui/gui-manager.cpp:129 base/main.cpp:307 -#, fuzzy msgid "Toggle FullScreen" msgstr "Attiva / disattiva schermo intero" @@ -192,9 +191,8 @@ msgid "Platform:" msgstr "Piattaf.:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Esamina" +msgstr "Motore" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -1165,14 +1163,14 @@ msgstr "" "per le istruzioni su come ottenere ulteriore assistenza." #: engines/dialogs.cpp:228 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Siamo spiacenti, ma l'attuale motore non prevede aiuto all'interno del " -"gioco. Si prega di consultare il file README per le informazioni di base e " -"per le istruzioni su come ottenere ulteriore assistenza." +"Salvataggio fallito (%s)! Si prega di consultare il file README per le " +"informazioni di base e per le istruzioni su come ottenere ulteriore " +"assistenza." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 @@ -1233,14 +1231,14 @@ msgstr "" "Vedi il file README per i dettagli." #: engines/engine.cpp:426 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Siamo spiacenti, ma l'attuale motore non prevede aiuto all'interno del " -"gioco. Si prega di consultare il file README per le informazioni di base e " -"per le istruzioni su come ottenere ulteriore assistenza." +"Caricamento salvataggio fallito (%s)! Si prega di consultare il file README " +"per le informazioni di base e per le istruzioni su come ottenere ulteriore " +"assistenza." #: engines/engine.cpp:439 msgid "" @@ -1259,12 +1257,14 @@ msgstr "Avvia comunque" #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Usa schermate di salvataggio originali" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" +"Usa le schermate originali di salvataggio e caricamento, al posto di quelle " +"di ScummVM" #: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" @@ -1275,68 +1275,69 @@ msgid "Restore" msgstr "Ripristina" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "Oggetto in alto a destra" +msgstr "Usa modalit colori brillanti" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Visualizza la grafica con i colori brillanti del gioco" #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "Undithering EGA" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "Attiva undithering nei giochi EGA che lo supportano" +msgstr "Attiva undithering nei giochi EGA" #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Volume degli effetti sonori" +msgstr "Scegli effetti sonori digitali" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Scegli gli effetti sonori digitali al posto di quelli sintetizzati" #: engines/sci/detection.cpp:400 msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "" +msgstr "Usa IMF/Yahama FB-01 per output MIDI" #: engines/sci/detection.cpp:401 msgid "" "Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " "output" msgstr "" +"Usa una scheda IBM Music Feature o un modulo synth Yamaha FB-01 FM per " +"l'output MIDI" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "Usa audio da CD" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" msgstr "" +"Usa l'audio da CD al posto di quello incorporato nel gioco, se disponibile" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Usa cursori di Windows" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" +"Usa i cursori di Windows (pi piccoli e monocromatici) al posto di quelli DOS" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Cursore normale" +msgstr "Usa cursori d'argento" #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" +"Usa il set alternativo di cursori d'argento al posto di quelli normali d'oro" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -1362,12 +1363,12 @@ msgstr "Gioco in pausa. Premere SPAZIO per continuare." #. Will react to J as 'Yes' #: engines/scumm/dialogs.cpp:182 msgid "Are you sure you want to restart? (Y/N)" -msgstr "Sei sicuro di voler riavviare? (Y/N)" +msgstr "Sei sicuro di voler riavviare? (S/N)S" #. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment #: engines/scumm/dialogs.cpp:184 msgid "Are you sure you want to quit? (Y/N)" -msgstr "Sei sicuro di voler uscire? (Y/N)" +msgstr "Sei sicuro di voler uscire? (S/N)S" #: engines/scumm/dialogs.cpp:189 msgid "Play" @@ -2090,115 +2091,107 @@ msgstr "Impossibile salvare il gioco" #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Reazioni del pubblico" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Attiva le reazioni del pubblico" #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr "Interruzione del parlato" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Permette di saltare i dialoghi e le scene di intermezzo" #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Modalit elio" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Attiva la modalit Roland GS" +msgstr "Attiva la modalit elio" #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Scorrimento morbido" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Attiva lo scorrimento morbido durante gli spostamenti" #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Cursore normale" +msgstr "Cursori fluttuanti" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Attiva cursori fluttuanti" #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr "Barre HP" #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr "Attiva le barre di Hit Point" #: engines/kyra/lol.cpp:478 msgid "Attack 1" -msgstr "" +msgstr "Attacco 1" #: engines/kyra/lol.cpp:479 msgid "Attack 2" -msgstr "" +msgstr "Attacco 2" #: engines/kyra/lol.cpp:480 msgid "Attack 3" -msgstr "" +msgstr "Attacco 3" #: engines/kyra/lol.cpp:481 msgid "Move Forward" -msgstr "" +msgstr "Vai avanti" #: engines/kyra/lol.cpp:482 msgid "Move Back" -msgstr "" +msgstr "Vai indietro" #: engines/kyra/lol.cpp:483 msgid "Slide Left" -msgstr "" +msgstr "Scorri a sinistra" #: engines/kyra/lol.cpp:484 -#, fuzzy msgid "Slide Right" -msgstr "Destra" +msgstr "Scorri a destra" #: engines/kyra/lol.cpp:485 -#, fuzzy msgid "Turn Left" -msgstr "Spegni" +msgstr "Gira a sinistra" #: engines/kyra/lol.cpp:486 -#, fuzzy msgid "Turn Right" -msgstr "Cursore a destra" +msgstr "Gira a destra" #: engines/kyra/lol.cpp:487 -#, fuzzy msgid "Rest" -msgstr "Ripristina" +msgstr "Riposa" #: engines/kyra/lol.cpp:488 -#, fuzzy msgid "Options" -msgstr "~O~pzioni" +msgstr "Opzioni" #: engines/kyra/lol.cpp:489 -#, fuzzy msgid "Choose Spell" -msgstr "Scegli" +msgstr "Scegli incantesimo" #: engines/kyra/sound_midi.cpp:475 msgid "" @@ -2216,11 +2209,11 @@ msgstr "" #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Intro floppy" #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr "Usa la versione floppy dell'intro (solo versione CD)" #: engines/sky/compact.cpp:130 msgid "" @@ -2242,6 +2235,7 @@ msgstr "" #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" +"La scena PSX di intermezzo '%s' non pu essere eseguita in modalit tavolozza" #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" @@ -2298,20 +2292,19 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "Questa la fine della demo di Broken Sword 1" #: engines/sword2/animation.cpp:435 -#, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" -"Sono state trovare scene di intermezzo DXA ma ScummVM stato compilato " -"senza il supporto zlib" +"Sono state trovare scene di intermezzo PSX ma ScummVM stato compilato " +"senza il supporto colori RGB" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr "Mostra etichette oggetti" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr "Mostra etichette per gli oggetti al passaggio del mouse" #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2453,9 +2446,8 @@ msgid "Keymap:" msgstr "Mappa tasti:" #: backends/keymapper/remap-dialog.cpp:66 -#, fuzzy msgid " (Effective)" -msgstr " (Attivo)" +msgstr " (Efficace)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Active)" @@ -2463,7 +2455,7 @@ msgstr " (Attivo)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr " (Bloccato)" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" @@ -2567,7 +2559,7 @@ msgstr "Modalit #: backends/platform/maemo/maemo.cpp:205 msgid "Click Mode" -msgstr "" +msgstr "Modalit clic" #: backends/platform/maemo/maemo.cpp:211 #: backends/platform/symbian/src/SymbianActions.cpp:42 @@ -2578,9 +2570,8 @@ msgid "Left Click" msgstr "Clic sinistro" #: backends/platform/maemo/maemo.cpp:214 -#, fuzzy msgid "Middle Click" -msgstr "Oggetto al centro a sinistra" +msgstr "Clic centrale" #: backends/platform/maemo/maemo.cpp:217 #: backends/platform/symbian/src/SymbianActions.cpp:43 @@ -3025,40 +3016,36 @@ msgid "Check for Updates..." msgstr "Cerca aggiornamenti..." #: backends/platform/bada/form.cpp:269 -#, fuzzy msgid "Right Click Once" -msgstr "Clic destro" +msgstr "Un clic destro" #: backends/platform/bada/form.cpp:277 -#, fuzzy msgid "Move Only" -msgstr "Solo voci" +msgstr "Muovi soltanto" #: backends/platform/bada/form.cpp:291 msgid "Escape Key" -msgstr "" +msgstr "Tasto Esc" #: backends/platform/bada/form.cpp:296 -#, fuzzy msgid "Game Menu" -msgstr "Gioco" +msgstr "Menu di gioco" #: backends/platform/bada/form.cpp:301 -#, fuzzy msgid "Show Keypad" -msgstr "Mostra tastiera" +msgstr "Mostra tastierino numerico" #: backends/platform/bada/form.cpp:309 msgid "Control Mouse" -msgstr "" +msgstr "Controllo mouse" #: backends/events/maemosdl/maemosdl-events.cpp:192 msgid "Clicking Enabled" -msgstr "" +msgstr "Clic attivato" #: backends/events/maemosdl/maemosdl-events.cpp:192 msgid "Clicking Disabled" -msgstr "" +msgstr "Clic disattivato" #~ msgid "Hercules Green" #~ msgstr "Hercules verde" -- cgit v1.2.3 From 33c67caed16e0f99677fe0f4938660800e021a64 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 30 Jun 2012 12:20:17 +0100 Subject: I18N: Regenerate translation data file --- gui/themes/translations.dat | Bin 318276 -> 322471 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 12ad3d4352..c2e8339701 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From 335ba979a2e3aab9c1856bf84a18b60ab91de687 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 30 Jun 2012 20:47:29 +0100 Subject: LURE: Fix engine crash in copy protection screen with AZERTY keyboard Fixes bug #3539031 - "LURE: Crash at Copy Protection Screen". This reverts the previous fix which only worked for QWERTY keyboards and made the issue worse for AZERTY keyboards. It now uses the ASCII code instead of the keycode for the sanity check. --- engines/lure/surface.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/lure/surface.cpp b/engines/lure/surface.cpp index 7af9d665de..0f13d87fbc 100644 --- a/engines/lure/surface.cpp +++ b/engines/lure/surface.cpp @@ -1349,7 +1349,7 @@ bool CopyProtectionDialog::show() { while (!engine.shouldQuit()) { while (events.pollEvent() && (_charIndex < 4)) { - if (events.type() == Common::EVENT_KEYDOWN && !(events.event().kbd.flags & Common::KBD_NON_STICKY)) { + if (events.type() == Common::EVENT_KEYDOWN) { if ((events.event().kbd.keycode == Common::KEYCODE_BACKSPACE) && (_charIndex > 0)) { // Remove the last number typed --_charIndex; @@ -1360,8 +1360,8 @@ bool CopyProtectionDialog::show() { (*tmpHotspot)->copyTo(&screen.screen()); screen.update(); - } else if ((events.event().kbd.keycode >= Common::KEYCODE_0) && - (events.event().kbd.keycode <= Common::KEYCODE_9)) { + } else if ((events.event().kbd.ascii >= '0') && + (events.event().kbd.ascii <= '9')) { HotspotsList::iterator tmpHotspot = _hotspots.begin(); for (int i = 0; i < _charIndex + 3; i++) ++tmpHotspot; -- cgit v1.2.3 From c19df60092bac7fde7e492dbf9b5002a17f935c8 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 1 Jul 2012 00:40:07 +0100 Subject: I18N: Update German translation One of the string was left untranslated in the last update. This adds the translation for that string (provided by Lightkey). --- gui/themes/translations.dat | Bin 322471 -> 322629 bytes po/de_DE.po | 2 ++ 2 files changed, 2 insertions(+) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index c2e8339701..4812633011 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ diff --git a/po/de_DE.po b/po/de_DE.po index 3d9a0ca38c..d68dcb2d8e 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -931,6 +931,8 @@ 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 "" +"Das ausgewhlte Thema untersttzt nicht die aktuelle Sprache. Wenn Sie dieses " +"Thema benutzen wollen, mssen Sie erst zu einer anderen Sprache wechseln." #: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" -- cgit v1.2.3 From 50136f43c7de4889444d9de19ff5d99f2cc04bf7 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 1 Jul 2012 01:03:49 +0100 Subject: COMMON: Expand a bit the KeyState documentation This follows a bug that was found in the Lure engine where keycode was used in a place where it should have used ascii. --- common/keyboard.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/keyboard.h b/common/keyboard.h index e6db086598..f9e94e6656 100644 --- a/common/keyboard.h +++ b/common/keyboard.h @@ -248,7 +248,10 @@ struct KeyState { * ASCII-value of the pressed key (if any). * This depends on modifiers, i.e. pressing the 'A' key results in * different values here depending on the status of shift, alt and - * caps lock. + * caps lock. This should be used rather than keycode for text input + * to avoid keyboard layout issues. For example you cannot assume that + * KEYCODE_0 without a modifier will be '0' (on AZERTY keyboards it is + * not). */ uint16 ascii; -- cgit v1.2.3 From d335b78003f3d28d1c9c9aeddf6a46ad1c5f4888 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sun, 1 Jul 2012 06:20:53 +0100 Subject: DREAMWEB: Fix minor regression with Ryan's watch. Using Ryan's watch within the game, the watch time always started at 19.30 from point of use, which did not seem correct. Checking with the original CD and Floppy interpreters under DOSBox showed they used the current system time, so this was incorrect. Bisection shows that this regression was introduced by commit 57e940f67896e0f085de23088754fe1682cd49db i.e. "DREAMWEB: Move all saved variables to a GameVars struct" and was probably a side effect of a minor call ordering change in the equivalent of setupInitialVars() with respect to the getTime() call. However, to ensure no further regressions, it was easier to fix this by replacing the initial value setting by a getTime() call. --- engines/dreamweb/stubs.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 4515939ebc..f235f7c2fd 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -2920,9 +2920,7 @@ void DreamWebEngine::setupInitialVars() { _vars._progressPoints = 0; _vars._watchOn = 0; _vars._shadesOn = 0; - _vars._secondCount = 0; - _vars._minuteCount = 30; - _vars._hourCount = 19; + getTime(); _vars._zoomOn = 1; _vars._location = 0; _vars._exPos = 0; -- cgit v1.2.3 From 1c389e55105d40468ff9415a3d2b3ca31ef602b8 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Jul 2012 15:43:20 +0200 Subject: GUI: Only use grid load dialog for 640x400 or bigger. Formerly it was enabled for everything above 320x200, but resolutions below 640x400 feature not enough space. --- gui/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 9ae27f31be..9cc8935f03 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -45,7 +45,7 @@ void SaveLoadChooser::selectChooser(const MetaEngine &engine) { Common::String userConfig = ConfMan.get("gui_saveload_chooser", Common::ConfigManager::kApplicationDomain); - if (!_saveMode && g_gui.getWidth() > 320 && g_gui.getHeight() > 200 + if (!_saveMode && g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400 && engine.hasFeature(MetaEngine::kSavesSupportMetaInfo) && engine.hasFeature(MetaEngine::kSavesSupportThumbnail) && userConfig.equalsIgnoreCase("grid")) { -- cgit v1.2.3 From 236db5ed87acf603898243734e2c5273c23568cb Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Jul 2012 15:58:42 +0200 Subject: GUI: Automatically switch to list based save/load chooser when changing resolution below 640x400. --- gui/saveload-dialog.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- gui/saveload-dialog.h | 11 +++++++++++ gui/saveload.cpp | 2 -- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 0a94fede51..3a778b2fa4 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -21,6 +21,7 @@ #include "gui/saveload-dialog.h" #include "common/translation.h" +#include "common/config-manager.h" #include "gui/message.h" #include "gui/gui-manager.h" @@ -73,11 +74,17 @@ void SaveLoadChooserDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd switch (cmd) { case kListSwitchCmd: setResult(kSwitchToList); + // We save the requested dialog type here to avoid the setting to be + // overwritten when our reflowLayout logic selects a different dialog + // type. + ConfMan.set("gui_saveload_chooser", "list", Common::ConfigManager::kApplicationDomain); close(); break; case kGridSwitchCmd: setResult(kSwitchToGrid); + // See above. + ConfMan.set("gui_saveload_chooser", "grid", Common::ConfigManager::kApplicationDomain); close(); break; @@ -101,13 +108,45 @@ void SaveLoadChooserDialog::addChooserButtons() { _listButton = createSwitchButton("SaveLoadChooser.ListSwitch", "L", _("List view"), ThemeEngine::kImageList, kListSwitchCmd); _gridButton = createSwitchButton("SaveLoadChooser.GridSwitch", "G", _("Grid view"), ThemeEngine::kImageGrid, kGridSwitchCmd); - if (!_metaInfoSupport || !_thumbnailSupport || _saveMode) + if (!_metaInfoSupport || !_thumbnailSupport || _saveMode || !(g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400)) _gridButton->setEnabled(false); } void SaveLoadChooserDialog::reflowLayout() { addChooserButtons(); + const SaveLoadChooserType currentType = getType(); + SaveLoadChooserType requestedType; + + const Common::String &userConfig = ConfMan.get("gui_saveload_chooser", Common::ConfigManager::kApplicationDomain); + if (!_saveMode && g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400 + && _metaEngine->hasFeature(MetaEngine::kSavesSupportMetaInfo) + && _metaEngine->hasFeature(MetaEngine::kSavesSupportThumbnail) + && userConfig.equalsIgnoreCase("grid")) { + // In case we are 640x400 or higher, this dialog is not in save mode, + // the user requested the grid dialog and the engines supports it we + // try to set it up. + requestedType = kSaveLoadDialogGrid; + } else { + // In all other cases we want to use the list dialog. + requestedType = kSaveLoadDialogList; + } + + // Change the dialog type if there is any need for it. + if (requestedType != currentType) { + switch (requestedType) { + case kSaveLoadDialogGrid: + setResult(kSwitchToGrid); + break; + + case kSaveLoadDialogList: + setResult(kSwitchToList); + break; + } + + close(); + } + Dialog::reflowLayout(); } diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 7921f5798a..75b1dc41e0 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -32,6 +32,11 @@ namespace GUI { #define kSwitchToList -2 #define kSwitchToGrid -3 +enum SaveLoadChooserType { + kSaveLoadDialogList = 0, + kSaveLoadDialogGrid = 1 +}; + class SaveLoadChooserDialog : protected Dialog { public: SaveLoadChooserDialog(const Common::String &dialogName, const bool saveMode); @@ -43,6 +48,8 @@ public: virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + virtual SaveLoadChooserType getType() const = 0; + int run(const Common::String &target, const MetaEngine *metaEngine); virtual const Common::String &getResultString() const = 0; @@ -77,6 +84,8 @@ public: virtual void reflowLayout(); + virtual SaveLoadChooserType getType() const { return kSaveLoadDialogList; } + virtual void close(); private: virtual int runIntern(); @@ -109,6 +118,8 @@ public: virtual void reflowLayout(); + virtual SaveLoadChooserType getType() const { return kSaveLoadDialogGrid; } + virtual void close(); protected: virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 9cc8935f03..7f3dd6d5d8 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -93,11 +93,9 @@ int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, con if (ret == kSwitchToList) { delete _impl; _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); - ConfMan.set("gui_saveload_chooser", "list", Common::ConfigManager::kApplicationDomain); } else if (ret == kSwitchToGrid) { delete _impl; _impl = new LoadChooserThumbnailed(_title); - ConfMan.set("gui_saveload_chooser", "grid", Common::ConfigManager::kApplicationDomain); } } while (ret < -1); -- cgit v1.2.3 From bd3d5fb8ffed3938c68a723d5c5bfbb6b56fb0ec Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Jul 2012 16:07:48 +0200 Subject: GUI: Clean up save load chooser selection code. --- gui/saveload-dialog.cpp | 47 ++++++++++++++++++++--------------------------- gui/saveload-dialog.h | 5 +++-- gui/saveload.cpp | 30 ++++++++++++++---------------- 3 files changed, 37 insertions(+), 45 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 3a778b2fa4..dce09aaec8 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -31,6 +31,22 @@ namespace GUI { +SaveLoadChooserType getRequestedSaveLoadDialog(const bool saveMode, const MetaEngine &metaEngine) { + const Common::String &userConfig = ConfMan.get("gui_saveload_chooser", Common::ConfigManager::kApplicationDomain); + if (!saveMode && g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400 + && metaEngine.hasFeature(MetaEngine::kSavesSupportMetaInfo) + && metaEngine.hasFeature(MetaEngine::kSavesSupportThumbnail) + && userConfig.equalsIgnoreCase("grid")) { + // In case we are 640x400 or higher, this dialog is not in save mode, + // the user requested the grid dialog and the engines supports it we + // try to set it up. + return kSaveLoadDialogGrid; + } else { + // In all other cases we want to use the list dialog. + return kSaveLoadDialogList; + } +} + enum { kListSwitchCmd = 'LIST', kGridSwitchCmd = 'GRID' @@ -73,7 +89,7 @@ int SaveLoadChooserDialog::run(const Common::String &target, const MetaEngine *m void SaveLoadChooserDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { case kListSwitchCmd: - setResult(kSwitchToList); + setResult(kSwitchSaveLoadDialog); // We save the requested dialog type here to avoid the setting to be // overwritten when our reflowLayout logic selects a different dialog // type. @@ -82,7 +98,7 @@ void SaveLoadChooserDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd break; case kGridSwitchCmd: - setResult(kSwitchToGrid); + setResult(kSwitchSaveLoadDialog); // See above. ConfMan.set("gui_saveload_chooser", "grid", Common::ConfigManager::kApplicationDomain); close(); @@ -116,34 +132,11 @@ void SaveLoadChooserDialog::reflowLayout() { addChooserButtons(); const SaveLoadChooserType currentType = getType(); - SaveLoadChooserType requestedType; - - const Common::String &userConfig = ConfMan.get("gui_saveload_chooser", Common::ConfigManager::kApplicationDomain); - if (!_saveMode && g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400 - && _metaEngine->hasFeature(MetaEngine::kSavesSupportMetaInfo) - && _metaEngine->hasFeature(MetaEngine::kSavesSupportThumbnail) - && userConfig.equalsIgnoreCase("grid")) { - // In case we are 640x400 or higher, this dialog is not in save mode, - // the user requested the grid dialog and the engines supports it we - // try to set it up. - requestedType = kSaveLoadDialogGrid; - } else { - // In all other cases we want to use the list dialog. - requestedType = kSaveLoadDialogList; - } + const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(_saveMode, *_metaEngine); // Change the dialog type if there is any need for it. if (requestedType != currentType) { - switch (requestedType) { - case kSaveLoadDialogGrid: - setResult(kSwitchToGrid); - break; - - case kSaveLoadDialogList: - setResult(kSwitchToList); - break; - } - + setResult(kSwitchSaveLoadDialog); close(); } diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 75b1dc41e0..68512ad9a5 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -29,14 +29,15 @@ namespace GUI { -#define kSwitchToList -2 -#define kSwitchToGrid -3 +#define kSwitchSaveLoadDialog -2 enum SaveLoadChooserType { kSaveLoadDialogList = 0, kSaveLoadDialogGrid = 1 }; +SaveLoadChooserType getRequestedSaveLoadDialog(const bool saveMode, const MetaEngine &metaEngine); + class SaveLoadChooserDialog : protected Dialog { public: SaveLoadChooserDialog(const Common::String &dialogName, const bool saveMode); diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 7f3dd6d5d8..12e62122fe 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -40,18 +40,20 @@ SaveLoadChooser::~SaveLoadChooser() { } void SaveLoadChooser::selectChooser(const MetaEngine &engine) { - delete _impl; - _impl = 0; + const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(_saveMode, engine); + if (!_impl || _impl->getType() != requestedType) { + delete _impl; + _impl = 0; - Common::String userConfig = ConfMan.get("gui_saveload_chooser", Common::ConfigManager::kApplicationDomain); + switch (requestedType) { + case kSaveLoadDialogGrid: + _impl = new LoadChooserThumbnailed(_title); + break; - if (!_saveMode && g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400 - && engine.hasFeature(MetaEngine::kSavesSupportMetaInfo) - && engine.hasFeature(MetaEngine::kSavesSupportThumbnail) - && userConfig.equalsIgnoreCase("grid")) { - _impl = new LoadChooserThumbnailed(_title); - } else { - _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); + case kSaveLoadDialogList: + _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); + break; + } } } @@ -90,12 +92,8 @@ int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, con do { ret = _impl->run(target, &(**plugin)); - if (ret == kSwitchToList) { - delete _impl; - _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); - } else if (ret == kSwitchToGrid) { - delete _impl; - _impl = new LoadChooserThumbnailed(_title); + if (ret == kSwitchSaveLoadDialog) { + selectChooser(**plugin); } } while (ret < -1); -- cgit v1.2.3 From 3256081b2b1c604b1367ba3b5fc3fea8bd76d842 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Jul 2012 16:47:40 +0200 Subject: GUI: Add page display to grid based load chooser. --- gui/ThemeEngine.h | 2 +- gui/saveload-dialog.cpp | 12 ++++++++++++ gui/saveload-dialog.h | 2 ++ gui/themes/default.inc | 9 +++++++++ gui/themes/scummclassic.zip | Bin 93928 -> 94215 bytes gui/themes/scummclassic/THEMERC | 2 +- gui/themes/scummclassic/classic_layout.stx | 15 ++++++++++++--- gui/themes/scummclassic/classic_layout_lowres.stx | 2 ++ gui/themes/scummmodern.zip | Bin 1452236 -> 1452523 bytes gui/themes/scummmodern/THEMERC | 2 +- gui/themes/scummmodern/scummmodern_layout.stx | 15 ++++++++++++--- .../scummmodern/scummmodern_layout_lowres.stx | 2 ++ 12 files changed, 54 insertions(+), 9 deletions(-) diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index cd388b7f65..de4a92be16 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -35,7 +35,7 @@ #include "graphics/pixelformat.h" -#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.14" +#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.15" class OSystem; diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index dce09aaec8..3d542b1dc8 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -496,6 +496,10 @@ LoadChooserThumbnailed::LoadChooserThumbnailed(const Common::String &title) _prevButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Prev"), 0, kPrevCmd); _prevButton->setEnabled(false); + + // Page display + _pageDisplay = new GUI::StaticTextWidget(this, "SaveLoadChooser.PageDisplay", Common::String()); + _pageDisplay->setAlign(Graphics::kTextAlignRight); } const Common::String &LoadChooserThumbnailed::getResultString() const { @@ -555,6 +559,11 @@ void LoadChooserThumbnailed::open() { } void LoadChooserThumbnailed::reflowLayout() { + removeWidget(_pageDisplay); + if (g_gui.xmlEval()->getVar("Globals.ShowChooserPageDisplay") == 1) { + _pageDisplay->init(); + } + SaveLoadChooserDialog::reflowLayout(); destroyButtons(); @@ -690,6 +699,9 @@ void LoadChooserThumbnailed::updateSaves() { curButton.button->setTooltip(tooltip); } + const uint numPages = _saveList.size() / _entriesPerPage + 1; + _pageDisplay->setLabel(Common::String::format("%u/%u", _curPage + 1, numPages)); + if (_curPage > 0) _prevButton->setEnabled(true); else diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 68512ad9a5..63dbf4182e 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -136,6 +136,8 @@ private: GUI::ButtonWidget *_nextButton; GUI::ButtonWidget *_prevButton; + GUI::StaticTextWidget *_pageDisplay; + struct SlotButton { SlotButton() : container(0), button(0), description(0) {} SlotButton(ContainerWidget *c, PicButtonWidget *b, StaticTextWidget *d) : container(c), button(b), description(d) {} diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 331289ddf7..dc8d5c1a0e 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -620,6 +620,7 @@ " " " " " " +" " " " " " " " @@ -1574,6 +1575,7 @@ " " " " " " +" " " " " " " " @@ -2304,9 +2306,16 @@ " " " " " " +" " " " +" " +" " +" " " " " " " + + @@ -794,9 +796,16 @@ - + + + + + + + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 977a6960e6..a861e8e0df 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/THEMERC b/gui/themes/scummmodern/THEMERC index e9a2d542c4..c4381c2061 100644 --- a/gui/themes/scummmodern/THEMERC +++ b/gui/themes/scummmodern/THEMERC @@ -1 +1 @@ -[SCUMMVM_STX0.8.14:ScummVM Modern Theme:No Author] +[SCUMMVM_STX0.8.15:ScummVM Modern Theme:No Author] diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index 30f8f3c323..e27de3fe9b 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -38,7 +38,9 @@ + + @@ -808,9 +810,16 @@ - + + + + + + + -- cgit v1.2.3 From 049e61b4459fd6fdbcf29c5d0e29d35755de82e3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Jul 2012 17:17:04 +0200 Subject: GUI: Fix small memory leak in grid based load chooser. --- gui/saveload-dialog.cpp | 5 +++++ gui/saveload-dialog.h | 1 + 2 files changed, 6 insertions(+) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 3d542b1dc8..d7fa9c686a 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -502,6 +502,11 @@ LoadChooserThumbnailed::LoadChooserThumbnailed(const Common::String &title) _pageDisplay->setAlign(Graphics::kTextAlignRight); } +LoadChooserThumbnailed::~LoadChooserThumbnailed() { + removeWidget(_pageDisplay); + delete _pageDisplay; +} + const Common::String &LoadChooserThumbnailed::getResultString() const { // FIXME: This chooser is only for loading, thus the result is never used // anyway. But this is still an ugly hack. diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 63dbf4182e..e169dbf613 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -112,6 +112,7 @@ private: class LoadChooserThumbnailed : public SaveLoadChooserDialog { public: LoadChooserThumbnailed(const Common::String &title); + ~LoadChooserThumbnailed(); virtual const Common::String &getResultString() const; -- cgit v1.2.3 From 44935117f493b2e256b5a2c701b63cef57d872af Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 2 Jul 2012 11:37:55 +0300 Subject: SCI: Fix a workaround for an uninitialized variable in SQ4CD This makes sure that the workaround works for subclassed objects as well, such as "theProfessor" talker. Fixes bug #3539350 - "SCI: SQ4 CD - Crash in sewer when text and speech enabled" --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index ecb1e4c2d5..15fca0322c 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -162,7 +162,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // CD: called when rummaging in Software Excess bargain bin - { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // CD: method returns this to the caller + { GID_SQ4, -1, 928, -1, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // CD: happens in the options dialog and in-game when speech and subtitles are used simultaneously { GID_SQ5, 201, 201, 0, "buttonPanel", "doVerb", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking at the orange or red button - bug #3038563 { GID_SQ6, -1, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // Demo and full version: called when the game starts (demo: room 0, full: room 100) { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu -- cgit v1.2.3 From f6e4312665614d7b5b626f997194fbbcb00ddbb0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 2 Jul 2012 12:48:02 +0300 Subject: SCI: Add a hack for a bug in the script handling code When resetting the segment manager, sometimes the locals block for a script is placed in a segment smaller than the script itself. This shouldn't be happening, but it isn't fatal, however it should be resolved in a proper manner --- engines/sci/engine/seg_manager.cpp | 41 ++++++++++++++++++++------------------ engines/sci/engine/seg_manager.h | 8 -------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index a6c145979f..d425e170ce 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -143,16 +143,34 @@ Script *SegManager::allocateScript(int script_nr, SegmentId *segid) { } void SegManager::deallocate(SegmentId seg) { - if (!check(seg)) - error("SegManager::deallocate(): invalid segment ID"); + if (seg < 1 || (uint)seg >= _heap.size()) + error("Attempt to deallocate an invalid segment ID"); SegmentObj *mobj = _heap[seg]; + if (!mobj) + error("Attempt to deallocate an already freed segment"); if (mobj->getType() == SEG_TYPE_SCRIPT) { Script *scr = (Script *)mobj; _scriptSegMap.erase(scr->getScriptNumber()); - if (scr->getLocalsSegment()) - deallocate(scr->getLocalsSegment()); + if (scr->getLocalsSegment()) { + // HACK: Check if the locals segment has already been deallocated. + // This happens sometimes in SQ4CD when resetting the segment + // manager: the locals for script 808 are somehow stored in a + // smaller segment than the script itself, so by the time the script + // is about to be freed, the locals block has already been freed. + // This isn't fatal, but it shouldn't be happening at all. + // FIXME: Check why this happens. Perhaps there's a bug in the + // script handling code? + if (!_heap[scr->getLocalsSegment()]) { + warning("SegManager::deallocate(): The locals block of script " + "%d has already been deallocated. Script segment: %d, " + "locals segment: %d", scr->getScriptNumber(), seg, + scr->getLocalsSegment()); + } else { + deallocate(scr->getLocalsSegment()); + } + } } delete mobj; @@ -307,21 +325,6 @@ reg_t SegManager::findObjectByName(const Common::String &name, int index) { return result[index]; } -// validate the seg -// return: -// false - invalid seg -// true - valid seg -bool SegManager::check(SegmentId seg) { - if (seg < 1 || (uint)seg >= _heap.size()) { - return false; - } - if (!_heap[seg]) { - warning("SegManager: seg %x is removed from memory, but not removed from hash_map", seg); - return false; - } - return true; -} - // return the seg if script_id is valid and in the map, else 0 SegmentId SegManager::getScriptSegment(int script_id) const { return _scriptSegMap.getVal(script_id, 0); diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 356a1b04a7..074d3f6b0a 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -471,14 +471,6 @@ private: void createClassTable(); SegmentId findFreeSegment() const; - - /** - * Check segment validity - * @param[in] seg The segment to validate - * @return false if 'seg' is an invalid segment, true if - * 'seg' is a valid segment - */ - bool check(SegmentId seg); }; } // End of namespace Sci -- cgit v1.2.3 From b091c0bd090f075e6e0b796785c400dbe9d2b8ac Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Tue, 3 Jul 2012 00:00:38 +0200 Subject: SCI: Remove unnecessary const-cast --- engines/sci/engine/kvideo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index 2456ba1100..61d2f935f7 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -90,7 +90,7 @@ void playVideo(Video::VideoDecoder *videoDecoder, VideoState videoState) { EngineState *s = g_sci->getEngineState(); if (videoDecoder->hasDirtyPalette()) { - byte *palette = (byte *)videoDecoder->getPalette() + s->_vmdPalStart * 3; + const byte *palette = videoDecoder->getPalette() + s->_vmdPalStart * 3; g_system->getPaletteManager()->setPalette(palette, s->_vmdPalStart, s->_vmdPalEnd - s->_vmdPalStart); } @@ -108,7 +108,7 @@ void playVideo(Video::VideoDecoder *videoDecoder, VideoState videoState) { } if (videoDecoder->hasDirtyPalette()) { - byte *palette = (byte *)videoDecoder->getPalette() + s->_vmdPalStart * 3; + const byte *palette = videoDecoder->getPalette() + s->_vmdPalStart * 3; g_system->getPaletteManager()->setPalette(palette, s->_vmdPalStart, s->_vmdPalEnd - s->_vmdPalStart); } -- cgit v1.2.3 From c80429008f135c236544846920f488680fa7c200 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 3 Jul 2012 03:33:42 +0300 Subject: SCI: Remove an unnecessary warning and related FIXME comments It's perfectly normal behavior to have locals with a smaller segment ID than the ID of their respective script, e.g. when scripts are uninstantiated and then instantiated again --- engines/sci/engine/seg_manager.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index d425e170ce..951fc7c363 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -154,22 +154,15 @@ void SegManager::deallocate(SegmentId seg) { Script *scr = (Script *)mobj; _scriptSegMap.erase(scr->getScriptNumber()); if (scr->getLocalsSegment()) { - // HACK: Check if the locals segment has already been deallocated. - // This happens sometimes in SQ4CD when resetting the segment - // manager: the locals for script 808 are somehow stored in a - // smaller segment than the script itself, so by the time the script - // is about to be freed, the locals block has already been freed. - // This isn't fatal, but it shouldn't be happening at all. - // FIXME: Check why this happens. Perhaps there's a bug in the - // script handling code? - if (!_heap[scr->getLocalsSegment()]) { - warning("SegManager::deallocate(): The locals block of script " - "%d has already been deallocated. Script segment: %d, " - "locals segment: %d", scr->getScriptNumber(), seg, - scr->getLocalsSegment()); - } else { + // Check if the locals segment has already been deallocated. + // If the locals block has been stored in a segment with an ID + // smaller than the segment ID of the script itself, it will be + // already freed at this point. This can happen when scripts are + // uninstantiated and instantiated again: they retain their own + // segment ID, but are allocated a new locals segment, which can + // have an ID smaller than the segment of the script itself. + if (_heap[scr->getLocalsSegment()]) deallocate(scr->getLocalsSegment()); - } } } -- cgit v1.2.3 From 9184a40fcc2263fae7bc67777346f592d50a39eb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 3 Jul 2012 03:46:27 +0300 Subject: SCI: Fix incorrect game options for SQ4CD --- engines/sci/detection_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 7c51c03b06..07b4733cfd 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -3536,7 +3536,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "ed90a8e3ccc53af6633ff6ab58392bae", 7054}, {"resource.000", 0, "63247e3901ab8963d4eece73747832e0", 5157378}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO1(GAMEOPTION_SQ4_SILVER_CURSORS) }, + Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO5(GUIO_MIDIGM, GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Space Quest 4 - English Windows CD (from the Space Quest Collection) // Executable scanning reports "1.001.064", VERSION file reports "1.0" -- cgit v1.2.3 From 5a47afea9ed5d0cca89ca01d48be937dcba02bbd Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 3 Jul 2012 18:11:41 +0300 Subject: SCI: Move kGetWindowsOption together with the other misc kernel functions --- engines/sci/engine/kgraphics32.cpp | 12 ------------ engines/sci/engine/kmisc.cpp | 12 ++++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 413ad1ecb1..14ea409a58 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -197,18 +197,6 @@ reg_t kDisposeTextBitmap(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -reg_t kGetWindowsOption(EngineState *s, int argc, reg_t *argv) { - uint16 windowsOption = argv[0].toUint16(); - switch (windowsOption) { - case 0: - // Title bar on/off in Phantasmagoria, we return 0 (off) - return NULL_REG; - default: - warning("GetWindowsOption: Unknown option %d", windowsOption); - return NULL_REG; - } -} - reg_t kWinHelp(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case 1: diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 12c830f622..8b7fc4ffec 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -419,6 +419,18 @@ reg_t kGetSierraProfileInt(EngineState *s, int argc, reg_t *argv) { return argv[2]; } +reg_t kGetWindowsOption(EngineState *s, int argc, reg_t *argv) { + uint16 windowsOption = argv[0].toUint16(); + switch (windowsOption) { + case 0: + // Title bar on/off in Phantasmagoria, we return 0 (off) + return NULL_REG; + default: + warning("GetWindowsOption: Unknown option %d", windowsOption); + return NULL_REG; + } +} + #endif // kIconBar is really a subop of kMacPlatform for SCI1.1 Mac -- cgit v1.2.3 From f9d2871eb4c1fa9e11e051dfd65d85bc892f8bc1 Mon Sep 17 00:00:00 2001 From: Ori Avtalion Date: Tue, 3 Jul 2012 18:27:48 +0300 Subject: JANITORIAL: Remove extra semicolons --- engines/dreamweb/dreamweb.h | 4 ++-- engines/kyra/eobcommon.h | 6 +++--- engines/tsage/ringworld2/ringworld2_speakers.h | 14 +++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h index 48d44c0380..1f6deb8566 100644 --- a/engines/dreamweb/dreamweb.h +++ b/engines/dreamweb/dreamweb.h @@ -152,8 +152,8 @@ public: uint8 modifyChar(uint8 c) const; Common::String modifyFileName(const char *); - const Common::String& getDatafilePrefix() { return _datafilePrefix; }; - const Common::String& getSpeechDirName() { return _speechDirName; }; + const Common::String& getDatafilePrefix() { return _datafilePrefix; } + const Common::String& getSpeechDirName() { return _speechDirName; } private: void keyPressed(uint16 ascii); diff --git a/engines/kyra/eobcommon.h b/engines/kyra/eobcommon.h index 050fe2b794..f60e755dd7 100644 --- a/engines/kyra/eobcommon.h +++ b/engines/kyra/eobcommon.h @@ -263,7 +263,7 @@ protected: // Main Menu, Intro, Finale virtual int mainMenu() = 0; - virtual void seq_xdeath() {}; + virtual void seq_xdeath() {} virtual void seq_playFinale() = 0; bool _playFinale; @@ -921,8 +921,8 @@ protected: void usePotion(int charIndex, int weaponSlot); void useWand(int charIndex, int weaponSlot); - virtual void turnUndeadAuto() {}; - virtual void turnUndeadAutoHit() {}; + virtual void turnUndeadAuto() {} + virtual void turnUndeadAutoHit() {} void castSpell(int spell, int weaponSlot); void removeCharacterEffect(int spell, int charIndex, int showWarning); diff --git a/engines/tsage/ringworld2/ringworld2_speakers.h b/engines/tsage/ringworld2/ringworld2_speakers.h index e336564c5f..fa2946d56c 100644 --- a/engines/tsage/ringworld2/ringworld2_speakers.h +++ b/engines/tsage/ringworld2/ringworld2_speakers.h @@ -504,14 +504,14 @@ public: class SpeakerSoldier300 : public SpeakerSoldier { public: - SpeakerSoldier300() : SpeakerSoldier(60) {}; + SpeakerSoldier300() : SpeakerSoldier(60) {} virtual Common::String getClassName() { return "SpeakerSoldier300"; } virtual void proc15(); }; class SpeakerSoldier1625 : public SpeakerSoldier { public: - SpeakerSoldier1625() : SpeakerSoldier(5) {}; + SpeakerSoldier1625() : SpeakerSoldier(5) {} virtual Common::String getClassName() { return "SpeakerSoldier1625"; } }; @@ -585,7 +585,7 @@ public: class SpeakerWebbster3240 : public SpeakerWebbster { public: - SpeakerWebbster3240() : SpeakerWebbster(10) {}; + SpeakerWebbster3240() : SpeakerWebbster(10) {} virtual Common::String getClassName() { return "SpeakerWebbster3240"; } virtual void proc15(); @@ -593,7 +593,7 @@ public: class SpeakerWebbster3375 : public SpeakerWebbster { public: - SpeakerWebbster3375() : SpeakerWebbster(60) {}; + SpeakerWebbster3375() : SpeakerWebbster(60) {} virtual Common::String getClassName() { return "SpeakerWebbster3375"; } virtual void proc15(); @@ -601,7 +601,7 @@ public: class SpeakerWebbster3385 : public SpeakerWebbster { public: - SpeakerWebbster3385() : SpeakerWebbster(60) {}; + SpeakerWebbster3385() : SpeakerWebbster(60) {} virtual Common::String getClassName() { return "SpeakerWebbster3385"; } virtual void proc15(); @@ -609,7 +609,7 @@ public: class SpeakerWebbster3395 : public SpeakerWebbster { public: - SpeakerWebbster3395() : SpeakerWebbster(60) {}; + SpeakerWebbster3395() : SpeakerWebbster(60) {} virtual Common::String getClassName() { return "SpeakerWebbster3395"; } virtual void proc15(); @@ -617,7 +617,7 @@ public: class SpeakerWebbster3400 : public SpeakerWebbster { public: - SpeakerWebbster3400() : SpeakerWebbster(27) {}; + SpeakerWebbster3400() : SpeakerWebbster(27) {} virtual Common::String getClassName() { return "SpeakerWebbster3400"; } virtual void proc15(); -- cgit v1.2.3 From b2ba37a039715e64dba8b534cc23d72624469f34 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 17:44:07 +0200 Subject: KYRA: Get rid of unused private class members. Thanks to salty-horse for pointing at these. --- engines/kyra/screen.cpp | 6 +++--- engines/kyra/screen.h | 3 +-- engines/kyra/screen_lol.cpp | 2 +- engines/kyra/screen_lol.h | 2 -- engines/kyra/sound_intern.h | 1 - engines/kyra/sound_towns.cpp | 2 +- 6 files changed, 6 insertions(+), 10 deletions(-) diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp index 4fd5985a09..04d805737f 100644 --- a/engines/kyra/screen.cpp +++ b/engines/kyra/screen.cpp @@ -141,7 +141,7 @@ bool Screen::init() { if (!font) error("Could not load any SJIS font, neither the original nor ScummVM's 'SJIS.FNT'"); - _fonts[FID_SJIS_FNT] = new SJISFont(this, font, _sjisInvisibleColor, _use16ColorMode, !_use16ColorMode); + _fonts[FID_SJIS_FNT] = new SJISFont(font, _sjisInvisibleColor, _use16ColorMode, !_use16ColorMode); } } @@ -3595,8 +3595,8 @@ void AMIGAFont::unload() { memset(_chars, 0, sizeof(_chars)); } -SJISFont::SJISFont(Screen *s, Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool outlineSize) - : _colorMap(0), _font(font), _invisColor(invisColor), _is16Color(is16Color), _screen(s) { +SJISFont::SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool outlineSize) + : _colorMap(0), _font(font), _invisColor(invisColor), _is16Color(is16Color) { assert(_font); _font->setDrawingMode(outlineSize ? Graphics::FontSJIS::kOutlineMode : Graphics::FontSJIS::kDefaultMode); diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h index b064c72bb0..60bfeb3241 100644 --- a/engines/kyra/screen.h +++ b/engines/kyra/screen.h @@ -213,7 +213,7 @@ private: */ class SJISFont : public Font { public: - SJISFont(Screen *s, Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool outlineSize); + SJISFont(Graphics::FontSJIS *font, const uint8 invisColor, bool is16Color, bool outlineSize); ~SJISFont() { unload(); } bool usesOverlay() const { return true; } @@ -233,7 +233,6 @@ private: const uint8 _invisColor; const bool _is16Color; - const Screen *_screen; int _sjisWidth, _asciiWidth; int _fontHeight; }; diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp index 08b232f400..3726b1f4b9 100644 --- a/engines/kyra/screen_lol.cpp +++ b/engines/kyra/screen_lol.cpp @@ -31,7 +31,7 @@ namespace Kyra { -Screen_LoL::Screen_LoL(LoLEngine *vm, OSystem *system) : Screen_v2(vm, system, vm->gameFlags().use16ColorMode ? _screenDimTable16C : _screenDimTable256C, _screenDimTableCount), _vm(vm) { +Screen_LoL::Screen_LoL(LoLEngine *vm, OSystem *system) : Screen_v2(vm, system, vm->gameFlags().use16ColorMode ? _screenDimTable16C : _screenDimTable256C, _screenDimTableCount) { _paletteOverlay1 = new uint8[0x100]; _paletteOverlay2 = new uint8[0x100]; _grayOverlay = new uint8[0x100]; diff --git a/engines/kyra/screen_lol.h b/engines/kyra/screen_lol.h index 3bba9f8b70..09496705bb 100644 --- a/engines/kyra/screen_lol.h +++ b/engines/kyra/screen_lol.h @@ -89,8 +89,6 @@ public: static void convertPC98Gfx(uint8 *data, int w, int h, int pitch); private: - LoLEngine *_vm; - static const ScreenDim _screenDimTable256C[]; static const ScreenDim _screenDimTable16C[]; static const int _screenDimTableCount; diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index 427bef66e2..827a487685 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -130,7 +130,6 @@ private: void fadeOutSoundEffects(); int _lastTrack; - Audio::AudioStream *_currentSFX; Audio::SoundHandle _sfxHandle; uint8 *_musicTrackData; diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 2f996de1ac..4b25db33f2 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -34,7 +34,7 @@ namespace Kyra { SoundTowns::SoundTowns(KyraEngine_v1 *vm, Audio::Mixer *mixer) - : Sound(vm, mixer), _lastTrack(-1), _currentSFX(0), _musicTrackData(0), _sfxFileData(0), _cdaPlaying(0), + : Sound(vm, mixer), _lastTrack(-1), _musicTrackData(0), _sfxFileData(0), _cdaPlaying(0), _sfxFileIndex((uint)-1), _musicFadeTable(0), _sfxWDTable(0), _sfxBTTable(0), _sfxChannel(0x46) { _driver = new TownsEuphonyDriver(_mixer); -- cgit v1.2.3 From 2678bcda981d7772beece5eaae3293e3e0f1c2a8 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 17:53:00 +0200 Subject: BACKENDS: Remove unused member in DefaultTimerManager. Thanks to salty-horse for pointing this out. --- backends/timer/default/default-timer.cpp | 1 - backends/timer/default/default-timer.h | 1 - 2 files changed, 2 deletions(-) diff --git a/backends/timer/default/default-timer.cpp b/backends/timer/default/default-timer.cpp index 8681102cd0..9cd803f148 100644 --- a/backends/timer/default/default-timer.cpp +++ b/backends/timer/default/default-timer.cpp @@ -59,7 +59,6 @@ void insertPrioQueue(TimerSlot *head, TimerSlot *newSlot) { DefaultTimerManager::DefaultTimerManager() : - _timerHandler(0), _head(0) { _head = new TimerSlot(); diff --git a/backends/timer/default/default-timer.h b/backends/timer/default/default-timer.h index e5a9dada79..5884979da0 100644 --- a/backends/timer/default/default-timer.h +++ b/backends/timer/default/default-timer.h @@ -34,7 +34,6 @@ private: typedef Common::HashMap TimerSlotMap; Common::Mutex _mutex; - void *_timerHandler; TimerSlot *_head; TimerSlotMap _callbacks; -- cgit v1.2.3 From 48e6b80253355a91fbd72d0d0f38b43f5c2340f2 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:26:27 +0200 Subject: SAGA: Slight cleanup in querySaveMetaInfos implementation. Saves are writable and deletable by default, there is no need to mark them explicitly as such. --- engines/saga/detection.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp index d39ec34cc8..9c178559f2 100644 --- a/engines/saga/detection.cpp +++ b/engines/saga/detection.cpp @@ -252,9 +252,6 @@ SaveStateDescriptor SagaMetaEngine::querySaveMetaInfos(const char *target, int s debug(0, "Save is for: %s", title); } - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - if (version >= 6) { Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in); desc.setThumbnail(thumbnail); -- cgit v1.2.3 From e242b91db0401c2a5c7af4202ab185a895fded31 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:27:49 +0200 Subject: SCUMM: Slight cleanup in querySaveMetaInfos. --- engines/scumm/detection.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index ebf1a2675c..87305921c9 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -1266,7 +1266,6 @@ SaveStateDescriptor ScummMetaEngine::querySaveMetaInfos(const char *target, int Graphics::Surface *thumbnail = ScummEngine::loadThumbnailFromSlot(target, slot); SaveStateDescriptor desc(slot, saveDesc); - desc.setDeletableFlag(true); desc.setThumbnail(thumbnail); SaveStateMetaInfos infos; -- cgit v1.2.3 From afa94697dcf21c3c96360f5dd54dd2a016d69e85 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:33:44 +0200 Subject: CGE: Slight cleanup in querySaveMetaInfos. --- engines/cge/detection.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/cge/detection.cpp b/engines/cge/detection.cpp index f723ec8fbd..d16b682501 100644 --- a/engines/cge/detection.cpp +++ b/engines/cge/detection.cpp @@ -217,8 +217,6 @@ SaveStateDescriptor CGEMetaEngine::querySaveMetaInfos(const char *target, int sl } else { // Create the return descriptor SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); desc.setThumbnail(header.thumbnail); desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); desc.setSaveTime(header.saveHour, header.saveMinutes); -- cgit v1.2.3 From bc3c80714b768ef11459738ad10bc7cd79afb854 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:33:56 +0200 Subject: CRUISE: Slight cleanup in querySaveMetaInfos. --- engines/cruise/detection.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp index b2e267ca49..cbe17ea4d3 100644 --- a/engines/cruise/detection.cpp +++ b/engines/cruise/detection.cpp @@ -303,8 +303,6 @@ SaveStateDescriptor CruiseMetaEngine::querySaveMetaInfos(const char *target, int // Create the return descriptor SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); desc.setThumbnail(header.thumbnail); return desc; -- cgit v1.2.3 From a51358535824564934e22b84ca37f2ae66649f24 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:34:12 +0200 Subject: DRACI: Slight cleanup in querySaveMetaInfos. --- engines/draci/detection.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/draci/detection.cpp b/engines/draci/detection.cpp index de76eb83e0..61705a1e59 100644 --- a/engines/draci/detection.cpp +++ b/engines/draci/detection.cpp @@ -161,8 +161,6 @@ SaveStateDescriptor DraciMetaEngine::querySaveMetaInfos(const char *target, int // Create the return descriptor SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); desc.setThumbnail(header.thumbnail); int day = (header.date >> 24) & 0xFF; -- cgit v1.2.3 From e66b9d4487b71cba26741882e94248d8259b5fcb Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:34:30 +0200 Subject: DREAMWEB: Slight cleanup in querySaveMetaInfos. --- engines/dreamweb/detection.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/dreamweb/detection.cpp b/engines/dreamweb/detection.cpp index 6468281ac2..f2e2f42216 100644 --- a/engines/dreamweb/detection.cpp +++ b/engines/dreamweb/detection.cpp @@ -172,8 +172,6 @@ SaveStateDescriptor DreamWebMetaEngine::querySaveMetaInfos(const char *target, i saveName += (char)in->readByte(); SaveStateDescriptor desc(slot, saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); // Check if there is a ScummVM data block if (header.len(6) == SCUMMVM_BLOCK_MAGIC_SIZE) { -- cgit v1.2.3 From 31f339880d94d85e6168a4ee152512a730396ddd Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:34:41 +0200 Subject: GROOVIE: Slight cleanup in querySaveMetaInfos. --- engines/groovie/saveload.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/groovie/saveload.cpp b/engines/groovie/saveload.cpp index 14e7a09cb2..1a92c02e0e 100644 --- a/engines/groovie/saveload.cpp +++ b/engines/groovie/saveload.cpp @@ -103,8 +103,6 @@ Common::InSaveFile *SaveLoad::openForLoading(const Common::String &target, int s if (descriptor) { // Initialize the SaveStateDescriptor descriptor->setSaveSlot(slot); - descriptor->setDeletableFlag(true); - descriptor->setWriteProtectedFlag(false); // TODO: Add extra information //setSaveDate(int year, int month, int day) -- cgit v1.2.3 From 3b14ff33caeff827c2a4e82dc61c6a61d83c8d94 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:34:58 +0200 Subject: HUGO: Slight cleanup in querySaveMetaInfos. --- engines/hugo/detection.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/hugo/detection.cpp b/engines/hugo/detection.cpp index 90708163f5..bb5944acc8 100644 --- a/engines/hugo/detection.cpp +++ b/engines/hugo/detection.cpp @@ -244,9 +244,6 @@ SaveStateDescriptor HugoMetaEngine::querySaveMetaInfos(const char *target, int s Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*file); desc.setThumbnail(thumbnail); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - uint32 saveDate = file->readUint32BE(); uint16 saveTime = file->readUint16BE(); -- cgit v1.2.3 From 05bd736d163f7e18ce27cd483a7e0f35adf1dce9 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:35:43 +0200 Subject: SCI: Slight cleanup in querySaveMetaInfos. --- engines/sci/detection.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 78df3065b2..8a74bc817c 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -762,9 +762,6 @@ SaveStateDescriptor SciMetaEngine::querySaveMetaInfos(const char *target, int sl Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*in); desc.setThumbnail(thumbnail); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - int day = (meta.saveDate >> 24) & 0xFF; int month = (meta.saveDate >> 16) & 0xFF; int year = meta.saveDate & 0xFFFF; -- cgit v1.2.3 From 89b8f6bb56e62f04e36778cfbd0abbebb94c4771 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:36:28 +0200 Subject: SWORD1: Slight cleanup in querySaveMetaInfos. --- engines/sword1/detection.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/sword1/detection.cpp b/engines/sword1/detection.cpp index 087dcd09d8..5662e4672b 100644 --- a/engines/sword1/detection.cpp +++ b/engines/sword1/detection.cpp @@ -268,9 +268,6 @@ SaveStateDescriptor SwordMetaEngine::querySaveMetaInfos(const char *target, int SaveStateDescriptor desc(slot, name); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - if (versionSave < 2) // These older version of the savegames used a flag to signal presence of thumbnail in->skip(1); -- cgit v1.2.3 From 72e1e5a31c723a1167568f4c3c952931815f3ff8 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:36:41 +0200 Subject: TEENAGENT: Slight cleanup in querySaveMetaInfos. --- engines/teenagent/detection.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/teenagent/detection.cpp b/engines/teenagent/detection.cpp index dad876dd97..f516ee06c1 100644 --- a/engines/teenagent/detection.cpp +++ b/engines/teenagent/detection.cpp @@ -174,7 +174,6 @@ public: return SaveStateDescriptor(slot, desc); SaveStateDescriptor ssd(slot, desc); - ssd.setDeletableFlag(true); //checking for the thumbnail if (Graphics::Surface *const thumb = Graphics::loadThumbnail(*in)) -- cgit v1.2.3 From 69723c82bc41ea9f7a440bf3a8cb5869ceb4b206 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:36:56 +0200 Subject: TOLTECTS: Slight cleanup in querySaveMetaInfos. --- engines/toltecs/detection.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/toltecs/detection.cpp b/engines/toltecs/detection.cpp index c532bbbf09..c1a57638c2 100644 --- a/engines/toltecs/detection.cpp +++ b/engines/toltecs/detection.cpp @@ -273,8 +273,6 @@ SaveStateDescriptor ToltecsMetaEngine::querySaveMetaInfos(const char *target, in if (error == Toltecs::ToltecsEngine::kRSHENoError) { SaveStateDescriptor desc(slot, header.description); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); desc.setThumbnail(header.thumbnail); if (header.version > 0) { -- cgit v1.2.3 From b9ac34272d6c04473b4acfc08fbf383912f22465 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:37:12 +0200 Subject: TOON: Slight cleanup in querySaveMetaInfos. --- engines/toon/detection.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/toon/detection.cpp b/engines/toon/detection.cpp index 8234934972..0cafee1475 100644 --- a/engines/toon/detection.cpp +++ b/engines/toon/detection.cpp @@ -234,9 +234,6 @@ SaveStateDescriptor ToonMetaEngine::querySaveMetaInfos(const char *target, int s Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*file); desc.setThumbnail(thumbnail); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - uint32 saveDate = file->readUint32BE(); uint16 saveTime = file->readUint16BE(); -- cgit v1.2.3 From 79e24035273cbf17f2518460c014ecb45ed6ea90 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:37:24 +0200 Subject: TSAGE: Slight cleanup in querySaveMetaInfos. --- engines/tsage/detection.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/tsage/detection.cpp b/engines/tsage/detection.cpp index 0c458f5c35..bcadfdc201 100644 --- a/engines/tsage/detection.cpp +++ b/engines/tsage/detection.cpp @@ -164,8 +164,6 @@ public: // Create the return descriptor SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); desc.setThumbnail(header.thumbnail); desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); desc.setSaveTime(header.saveHour, header.saveMinutes); -- cgit v1.2.3 From 0a51805a8ceaeaeeaa57eb224e1adc821fd359f2 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Jul 2012 18:40:40 +0200 Subject: ENGINES: Mention defaults for writable and deletable settings in SaveStateDescriptor docs. --- engines/savestate.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/savestate.h b/engines/savestate.h index 6cbdb22edf..c233554657 100644 --- a/engines/savestate.h +++ b/engines/savestate.h @@ -40,6 +40,8 @@ struct Surface; * * Further possibilites are a thumbnail, play time, creation date, * creation time, delete protected, write protection. + * + * Saves are writable and deletable by default. */ class SaveStateDescriptor { public: -- cgit v1.2.3 From cc02255740a42177c4ce7a8af892ba7f05cf6fae Mon Sep 17 00:00:00 2001 From: D G Turner Date: Tue, 3 Jul 2012 21:43:04 +0100 Subject: CGE: Fix for missing inventory selection by numeric keys. This fixes bug #3539671. --- engines/cge/events.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp index c8baf4ed61..99855e1aa6 100644 --- a/engines/cge/events.cpp +++ b/engines/cge/events.cpp @@ -112,6 +112,16 @@ bool Keyboard::getKey(Common::Event &event) { _vm->_commandHandler->addCommand(kCmdLevel, -1, keycode - '0', NULL); return false; } + // Fallthrough intended + case Common::KEYCODE_5: + case Common::KEYCODE_6: + case Common::KEYCODE_7: + case Common::KEYCODE_8: + if (event.type == Common::EVENT_KEYDOWN && !(event.kbd.flags & Common::KBD_ALT) && keycode != '0') { + _vm->selectPocket(keycode - '1'); + return false; + } + break; default: break; } -- cgit v1.2.3 From 4201d4ead031629446c6227712d98a8a56a23ca9 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Tue, 3 Jul 2012 23:55:48 +0200 Subject: CGE: Use keycode instead of ascii value --- engines/cge/events.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp index 99855e1aa6..98a39a947b 100644 --- a/engines/cge/events.cpp +++ b/engines/cge/events.cpp @@ -109,7 +109,7 @@ bool Keyboard::getKey(Common::Event &event) { case Common::KEYCODE_3: case Common::KEYCODE_4: if (event.kbd.flags & Common::KBD_ALT) { - _vm->_commandHandler->addCommand(kCmdLevel, -1, keycode - '0', NULL); + _vm->_commandHandler->addCommand(kCmdLevel, -1, keycode - Common::KEYCODE_0, NULL); return false; } // Fallthrough intended @@ -117,8 +117,8 @@ bool Keyboard::getKey(Common::Event &event) { case Common::KEYCODE_6: case Common::KEYCODE_7: case Common::KEYCODE_8: - if (event.type == Common::EVENT_KEYDOWN && !(event.kbd.flags & Common::KBD_ALT) && keycode != '0') { - _vm->selectPocket(keycode - '1'); + if (event.type == Common::EVENT_KEYDOWN && !(event.kbd.flags & Common::KBD_ALT) && keycode != Common::KEYCODE_0) { + _vm->selectPocket(keycode - Common::KEYCODE_1); return false; } break; -- cgit v1.2.3 From 72c59baf247e09c7b40afd1c48221827ef1d64df Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 00:57:59 +0300 Subject: SCI: Merge and simplify the code that sets the kernel functions --- engines/sci/engine/kernel.cpp | 125 ++++++++++++++++++++----------------- engines/sci/engine/kernel.h | 18 +----- engines/sci/engine/kernel_tables.h | 4 +- 3 files changed, 69 insertions(+), 78 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index c8fe47d9fc..924641cdbe 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -757,13 +757,26 @@ bool Kernel::debugSetFunction(const char *kernelName, int logging, int breakpoin return true; } -void Kernel::setDefaultKernelNames(GameFeatures *features) { - _kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames)); +#ifdef ENABLE_SCI32 +enum { + kKernelEntriesSci2 = 0x8b, + kKernelEntriesGk2Demo = 0xa0, + kKernelEntriesSci21 = 0x9d, + kKernelEntriesSci3 = 0xa1 +}; +#endif + +void Kernel::loadKernelNames(GameFeatures *features) { + _kernelNames.clear(); - // Some (later) SCI versions replaced CanBeHere by CantBeHere - // If vocab.999 exists, the kernel function is still named CanBeHere - if (_selectorCache.cantBeHere != -1) - _kernelNames[0x4d] = "CantBeHere"; + if (getSciVersion() <= SCI_VERSION_1_1) { + _kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames)); + + // Some (later) SCI versions replaced CanBeHere by CantBeHere + // If vocab.999 exists, the kernel function is still named CanBeHere + if (_selectorCache.cantBeHere != -1) + _kernelNames[0x4d] = "CantBeHere"; + } switch (getSciVersion()) { case SCI_VERSION_0_EARLY: @@ -817,66 +830,60 @@ void Kernel::setDefaultKernelNames(GameFeatures *features) { _kernelNames[0x7c] = "Message"; break; - default: - // Use default table for the other versions - break; - } -} - #ifdef ENABLE_SCI32 + case SCI_VERSION_2: + _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesSci2); + break; -enum { - kKernelEntriesSci2 = 0x8b, - kKernelEntriesGk2Demo = 0xa0, - kKernelEntriesSci21 = 0x9d, - kKernelEntriesSci3 = 0xa1 -}; - -void Kernel::setKernelNamesSci2() { - _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesSci2); -} + case SCI_VERSION_2_1: + if (features->detectSci21KernelType() == SCI_VERSION_2) { + // Some late SCI2.1 games use a modified SCI2 kernel table instead of + // the SCI2.1 kernel table. We detect which version to use based on + // how kDoSound is called from Sound::play(). + // Known games that use this: + // GK2 demo + // KQ7 1.4 + // PQ4 SWAT demo + // LSL6 + // PQ4CD + // QFG4CD + + // This is interesting because they all have the same interpreter + // version (2.100.002), yet they would not be compatible with other + // games of the same interpreter. + + _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesGk2Demo); + // OnMe is IsOnMe here, but they should be compatible + _kernelNames[0x23] = "Robot"; // Graph in SCI2 + _kernelNames[0x2e] = "Priority"; // DisposeTextBitmap in SCI2 + } else { + // Normal SCI2.1 kernel table + _kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci21); + } + break; -void Kernel::setKernelNamesSci21(GameFeatures *features) { - // Some SCI games use a modified SCI2 kernel table instead of the - // SCI2.1 kernel table. We detect which version to use based on - // how kDoSound is called from Sound::play(). - // Known games that use this: - // GK2 demo - // KQ7 1.4 - // PQ4 SWAT demo - // LSL6 - // PQ4CD - // QFG4CD - - // This is interesting because they all have the same interpreter - // version (2.100.002), yet they would not be compatible with other - // games of the same interpreter. - - if (getSciVersion() != SCI_VERSION_3 && features->detectSci21KernelType() == SCI_VERSION_2) { - _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesGk2Demo); - // OnMe is IsOnMe here, but they should be compatible - _kernelNames[0x23] = "Robot"; // Graph in SCI2 - _kernelNames[0x2e] = "Priority"; // DisposeTextBitmap in SCI2 - } else if (getSciVersion() != SCI_VERSION_3) { - _kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci21); - } else if (getSciVersion() == SCI_VERSION_3) { + case SCI_VERSION_3: _kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci3); - } -} -#endif - -void Kernel::loadKernelNames(GameFeatures *features) { - _kernelNames.clear(); + // In SCI3, some kernel functions have been removed, and others have been added + _kernelNames[0x18] = "Dummy"; // AddMagnify in SCI2.1 + _kernelNames[0x19] = "Dummy"; // DeleteMagnify in SCI2.1 + _kernelNames[0x30] = "Dummy"; // SetScroll in SCI2.1 + _kernelNames[0x39] = "Dummy"; // ShowMovie in SCI2.1 + _kernelNames[0x4c] = "Dummy"; // ScrollWindow in SCI2.1 + _kernelNames[0x56] = "Dummy"; // VibrateMouse in SCI2.1 (only used in QFG4 floppy) + _kernelNames[0x64] = "Dummy"; // AvoidPath in SCI2.1 + _kernelNames[0x66] = "Dummy"; // MergePoly in SCI2.1 + _kernelNames[0x8d] = "MessageBox"; // Dummy in SCI2.1 + _kernelNames[0x9b] = "Minimize"; // Dummy in SCI2.1 -#ifdef ENABLE_SCI32 - if (getSciVersion() >= SCI_VERSION_2_1) - setKernelNamesSci21(features); - else if (getSciVersion() == SCI_VERSION_2) - setKernelNamesSci2(); - else + break; #endif - setDefaultKernelNames(features); + + default: + // Use default table for the other versions + break; + } mapFunctions(); } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 677b790f93..c3fcdd06e7 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -223,23 +223,6 @@ public: bool debugSetFunction(const char *kernelName, int logging, int breakpoint); private: - /** - * Sets the default kernel function names, based on the SCI version used. - */ - void setDefaultKernelNames(GameFeatures *features); - -#ifdef ENABLE_SCI32 - /** - * Sets the default kernel function names to the SCI2 kernel functions. - */ - void setKernelNamesSci2(); - - /** - * Sets the default kernel function names to the SCI2.1 kernel functions. - */ - void setKernelNamesSci21(GameFeatures *features); -#endif - /** * Loads the kernel selector names. */ @@ -556,6 +539,7 @@ reg_t kFileIOWriteByte(EngineState *s, int argc, reg_t *argv); reg_t kFileIOReadWord(EngineState *s, int argc, reg_t *argv); reg_t kFileIOWriteWord(EngineState *s, int argc, reg_t *argv); reg_t kFileIOCreateSaveSlot(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOIsValidDirectory(EngineState *s, int argc, reg_t *argv); #endif //@} diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 6965a5da45..322d82ea08 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -1099,7 +1099,7 @@ static const char *const sci21_default_knames[] = { /*0x8a*/ "LoadChunk", /*0x8b*/ "SetPalStyleRange", /*0x8c*/ "AddPicAt", - /*0x8d*/ "MessageBox", // SCI3, was Dummy in SCI2.1 + /*0x8d*/ "Dummy", // MessageBox in SCI3 /*0x8e*/ "NewRoom", // debug function /*0x8f*/ "Dummy", /*0x90*/ "Priority", @@ -1113,7 +1113,7 @@ static const char *const sci21_default_knames[] = { /*0x98*/ "GetWindowsOption", // Windows only /*0x99*/ "WinDLL", // Windows only /*0x9a*/ "Dummy", - /*0x9b*/ "Minimize", // SCI3, was Dummy in SCI2.1 + /*0x9b*/ "Dummy", // Minimize in SCI3 /*0x9c*/ "DeletePic", // == SCI3 only =============== /*0x9d*/ "Dummy", -- cgit v1.2.3 From e0a3cfd21c607afd0fe9781b5d0a7d8407393d3f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 00:59:55 +0300 Subject: SCI: FileIO subop 19 checks for directory validity This is used in Torin's Passage and LSL7 when autosaving --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/kfile.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 322d82ea08..69baa1cf47 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -240,7 +240,7 @@ static const SciKernelMapSubEntry kFileIO_subops[] = { { SIG_SCI32, 16, MAP_CALL(FileIOWriteWord), "ii", NULL }, { SIG_SCI32, 17, MAP_CALL(FileIOCreateSaveSlot), "ir", NULL }, { SIG_SCI32, 18, MAP_EMPTY(FileIOChangeDirectory), "r", NULL }, // for SQ6, when changing the savegame directory in the save/load dialog - { SIG_SCI32, 19, MAP_CALL(Stub), "r", NULL }, // for Torin / Torin demo + { SIG_SCI32, 19, MAP_CALL(FileIOIsValidDirectory), "r", NULL }, // for Torin / Torin demo #endif SCI_SUBOPENTRY_TERMINATOR }; diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index a21e19802d..786276221c 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -688,6 +688,13 @@ reg_t kFileIOCreateSaveSlot(EngineState *s, int argc, reg_t *argv) { return TRUE_REG; // slot creation was successful } +reg_t kFileIOIsValidDirectory(EngineState *s, int argc, reg_t *argv) { + // Used in Torin's Passage and LSL7 to determine if the directory passed as + // a parameter (usually the save directory) is valid. We always return true + // here. + return TRUE_REG; +} + #endif // ---- Save operations ------------------------------------------------------- @@ -1002,7 +1009,7 @@ reg_t kAutoSave(EngineState *s, int argc, reg_t *argv) { // the elapsed time from the timer object) // This function has to return something other than 0 to proceed - return s->r_acc; + return TRUE_REG; } #endif -- cgit v1.2.3 From 43224076e785e615d3ab3a5de53c3aff659a64f2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 01:00:54 +0300 Subject: SCI: Handle the autosave call of Torin's Passage --- engines/sci/engine/kernel_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 69baa1cf47..126e972bd2 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -248,7 +248,7 @@ static const SciKernelMapSubEntry kFileIO_subops[] = { #ifdef ENABLE_SCI32 static const SciKernelMapSubEntry kSave_subops[] = { - { SIG_SCI32, 0, MAP_CALL(SaveGame), "[r0]i[r0](r)", NULL }, + { SIG_SCI32, 0, MAP_CALL(SaveGame), "[r0]i[r0](r0)", NULL }, { SIG_SCI32, 1, MAP_CALL(RestoreGame), "[r0]i[r0]", NULL }, { SIG_SCI32, 2, MAP_CALL(GetSaveDir), "(r*)", NULL }, { SIG_SCI32, 3, MAP_CALL(CheckSaveGame), ".*", NULL }, -- cgit v1.2.3 From d757b5b94a0b180ce8e2e59617898a322f8ee0d5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 01:01:35 +0300 Subject: SCI: Update some version checks in kernelFrameout() to work with SCI3 too --- engines/sci/graphics/frameout.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 265a175e66..5703579b1e 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -653,7 +653,7 @@ void GfxFrameout::kernelFrameout() { if (view && view->isSci2Hires()) { view->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); view->adjustToUpscaledCoordinates(itemEntry->z, dummyX); - } else if (getSciVersion() == SCI_VERSION_2_1) { + } else if (getSciVersion() >= SCI_VERSION_2_1) { _coordAdjuster->fromScriptToDisplay(itemEntry->y, itemEntry->x); _coordAdjuster->fromScriptToDisplay(itemEntry->z, dummyX); } @@ -691,7 +691,7 @@ void GfxFrameout::kernelFrameout() { if (view && view->isSci2Hires()) { view->adjustBackUpscaledCoordinates(nsRect.top, nsRect.left); view->adjustBackUpscaledCoordinates(nsRect.bottom, nsRect.right); - } else if (getSciVersion() == SCI_VERSION_2_1) { + } else if (getSciVersion() >= SCI_VERSION_2_1) { _coordAdjuster->fromDisplayToScript(nsRect.top, nsRect.left); _coordAdjuster->fromDisplayToScript(nsRect.bottom, nsRect.right); } -- cgit v1.2.3 From a0ad504059470b9ac8f5d4025d7bcec1621e1933 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 01:06:58 +0300 Subject: SCI: Update some kernel table related comments --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/engine/kernel_tables.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 924641cdbe..46051ef145 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -837,7 +837,7 @@ void Kernel::loadKernelNames(GameFeatures *features) { case SCI_VERSION_2_1: if (features->detectSci21KernelType() == SCI_VERSION_2) { - // Some late SCI2.1 games use a modified SCI2 kernel table instead of + // Some early SCI2.1 games use a modified SCI2 kernel table instead of // the SCI2.1 kernel table. We detect which version to use based on // how kDoSound is called from Sound::play(). // Known games that use this: diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 126e972bd2..114cd58c95 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -828,7 +828,7 @@ static const char *const sci2_default_knames[] = { /*0x20*/ "AddMagnify", /*0x21*/ "DeleteMagnify", /*0x22*/ "IsHiRes", - /*0x23*/ "Graph", + /*0x23*/ "Graph", // Robot in early SCI2.1 games with a SCI2 kernel table /*0x24*/ "InvertRect", // only in SCI2, not used in any SCI2 game /*0x25*/ "TextSize", /*0x26*/ "Message", @@ -839,7 +839,7 @@ static const char *const sci2_default_knames[] = { /*0x2b*/ "EditText", /*0x2c*/ "InputText", // unused function /*0x2d*/ "CreateTextBitmap", - /*0x2e*/ "DisposeTextBitmap", + /*0x2e*/ "DisposeTextBitmap", // Priority in early SCI2.1 games with a SCI2 kernel table /*0x2f*/ "GetEvent", /*0x30*/ "GlobalToLocal", /*0x31*/ "LocalToGlobal", -- cgit v1.2.3 From 8884d7735c652de035f83889ef62ac4177a05996 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 4 Jul 2012 00:23:46 +0200 Subject: GOB: Give the Geisha detection entries proper languages --- engines/gob/detection/tables_geisha.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/engines/gob/detection/tables_geisha.h b/engines/gob/detection/tables_geisha.h index 331e17e31d..83aa543668 100644 --- a/engines/gob/detection/tables_geisha.h +++ b/engines/gob/detection/tables_geisha.h @@ -32,7 +32,21 @@ "geisha", "", AD_ENTRY1s("disk1.stk", "6eebbb98ad90cd3c44549fc2ab30f632", 212153), - UNK_LANG, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeGeisha, + kFeaturesEGA | kFeaturesAdLib, + "disk1.stk", "intro.tot", 0 +}, +{ + { + "geisha", + "", + AD_ENTRY1s("disk1.stk", "6eebbb98ad90cd3c44549fc2ab30f632", 212153), + DE_DEU, kPlatformPC, ADGF_NO_FLAGS, GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) @@ -63,7 +77,7 @@ "geisha", "", AD_ENTRY1s("disk1.stk", "e5892f00917c62423e93f5fd9920cf47", 208120), - UNK_LANG, + EN_ANY, kPlatformAmiga, ADGF_NO_FLAGS, GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) -- cgit v1.2.3 From 1657b173cc58cea02d99f27abff5e336c52c6d0f Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 4 Jul 2012 00:26:37 +0200 Subject: GOB: Add a French DOS version of Geisha As supplied by misterhands in bug report #3539797. --- engines/gob/detection/tables_geisha.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/engines/gob/detection/tables_geisha.h b/engines/gob/detection/tables_geisha.h index 83aa543668..d05659d9e5 100644 --- a/engines/gob/detection/tables_geisha.h +++ b/engines/gob/detection/tables_geisha.h @@ -55,6 +55,20 @@ kFeaturesEGA | kFeaturesAdLib, "disk1.stk", "intro.tot", 0 }, +{ // Supplied by misterhands in bug report #3539797 + { + "geisha", + "", + AD_ENTRY1s("disk1.stk", "0c4c16090921664f50baefdfd24d7f5d", 211889), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeGeisha, + kFeaturesEGA | kFeaturesAdLib, + "disk1.stk", "intro.tot", 0 +}, { { "geisha", -- cgit v1.2.3 From ff0ab5b5814fd790595d72786bdac2b61937abed Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 4 Jul 2012 00:37:28 +0200 Subject: GOB: Don't print a warning when oGeisha_checkData() doesn't find fin.tot Geisha looks if fin.tot exists to check if it needs to open disk3.stk. This is completely normal, so don't print a warning. --- engines/gob/inter_geisha.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/gob/inter_geisha.cpp b/engines/gob/inter_geisha.cpp index 8a4d4246b6..8d05cefa66 100644 --- a/engines/gob/inter_geisha.cpp +++ b/engines/gob/inter_geisha.cpp @@ -200,8 +200,12 @@ void Inter_Geisha::oGeisha_checkData(OpFuncParams ¶ms) { if (mode == SaveLoad::kSaveModeNone) { exists = _vm->_dataIO->hasFile(file); - if (!exists) - warning("File \"%s\" not found", file.c_str()); + if (!exists) { + // NOTE: Geisha looks if fin.tot exists to check if it needs to open disk3.stk. + // This is completely normal, so don't print a warning. + if (file != "fin.tot") + warning("File \"%s\" not found", file.c_str()); + } } else if (mode == SaveLoad::kSaveModeSave) exists = _vm->_saveLoad->getSize(file.c_str()) >= 0; -- cgit v1.2.3 From d74d211479660eee0d9c63f10ddd1191340fdb02 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 02:14:57 +0300 Subject: SCI: Mark the SetScroll and SetHotRectangles kernel functions as unused --- engines/sci/engine/kernel_tables.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 114cd58c95..04b221d2b0 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -520,7 +520,6 @@ static SciKernelMapEntry s_kernelMap[] = { // SCI2 unmapped functions - TODO! - // SetScroll - called by script 64909, Styler::doit() // PalCycle - called by Game::newRoom. Related to RemapColors. // SCI2 Empty functions @@ -561,6 +560,11 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_DUMMY(InputText), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(TextWidth), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(PointSize), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + // SetScroll is called by script 64909, Styler::doit(), but it doesn't seem to + // be used at all (plus, it was then changed to a dummy function in SCI3). + // Since this is most likely unused, and we got no test case, error out when + // it is called in order to find an actual call to it. + { MAP_DUMMY(SetScroll), SIG_EVERYWHERE, "(.*)", NULL, NULL }, // SCI2.1 Kernel Functions { MAP_CALL(CD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, @@ -620,6 +624,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_DUMMY(WinDLL), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(DeletePic), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(GetSierraProfileString), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + // SetHotRectangles is used by Phantasmagoria 1, script 64981 (a debug script) + { MAP_DUMMY(SetHotRectangles), SIG_EVERYWHERE, "(.*)", NULL, NULL }, // Unused / debug functions in the in-between SCI2.1 interpreters { MAP_DUMMY(PreloadResource), SIG_EVERYWHERE, "(.*)", NULL, NULL }, @@ -633,7 +639,6 @@ static SciKernelMapEntry s_kernelMap[] = { // SetPalStyleRange - 2 integer parameters, start and end. All styles from start-end // (inclusive) are set to 0 // MorphOn - used by SQ6, script 900, the datacorder reprogramming puzzle (from room 270) - // SetHotRectangles - used by Phantasmagoria 1 // SCI3 Kernel Functions { MAP_CALL(PlayDuck), SIG_EVERYWHERE, "(.*)", NULL, NULL }, -- cgit v1.2.3 From dc1a097e508fc4cd323314fd5dde4dfe648f7c64 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 02:15:39 +0300 Subject: SCI: Make the debug message in kSetShowStyle more verbose --- engines/sci/engine/kgraphics32.cpp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 14ea409a58..072d4df021 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -224,12 +224,12 @@ reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv) { // tables inside graphics/transitions.cpp uint16 showStyle = argv[0].toUint16(); // 0 - 15 reg_t planeObj = argv[1]; // the affected plane - //uint16 seconds = argv[2].toUint16(); // seconds that the transition lasts - //uint16 backColor = argv[3].toUint16(); // target back color(?). When fading out, it's 0x0000. When fading in, it's 0xffff - //int16 priority = argv[4].toSint16(); // always 0xc8 (200) when fading in/out - //uint16 animate = argv[5].toUint16(); // boolean, animate or not while the transition lasts - //uint16 refFrame = argv[6].toUint16(); // refFrame, always 0 when fading in/out -#if 0 + Common::String planeObjName = s->_segMan->getObjectName(planeObj); + uint16 seconds = argv[2].toUint16(); // seconds that the transition lasts + uint16 backColor = argv[3].toUint16(); // target back color(?). When fading out, it's 0x0000. When fading in, it's 0xffff + int16 priority = argv[4].toSint16(); // always 0xc8 (200) when fading in/out + uint16 animate = argv[5].toUint16(); // boolean, animate or not while the transition lasts + uint16 refFrame = argv[6].toUint16(); // refFrame, always 0 when fading in/out int16 divisions; // If the game has the pFadeArray selector, another parameter is used here, @@ -241,7 +241,7 @@ reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv) { } else { divisions = (argc >= 8) ? argv[7].toSint16() : -1; // divisions (transition steps?) } -#endif + if (showStyle > 15) { warning("kSetShowStyle: Illegal style %d for plane %04x:%04x", showStyle, PRINT_REG(planeObj)); return s->r_acc; @@ -257,18 +257,29 @@ reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv) { // TODO: Check if the plane is in the list of planes to draw + Common::String effectName = "unknown"; + switch (showStyle) { - //case 0: // no transition, perhaps? (like in the previous SCI versions) + case 0: // no transition / show + effectName = "show"; + break; case 13: // fade out + effectName = "fade out"; // TODO + break; case 14: // fade in + effectName = "fade in"; // TODO + break; default: - // TODO: This is all a stub/skeleton, thus we're invoking kStub() for now - kStub(s, argc, argv); + // TODO break; } + warning("kSetShowStyle: effect %d (%s) - plane: %04x:%04x (%s), sec: %d, " + "back: %d, prio: %d, animate: %d, ref frame: %d, divisions: %d", + showStyle, effectName.c_str(), PRINT_REG(planeObj), planeObjName.c_str(), + seconds, backColor, priority, animate, refFrame, divisions); return s->r_acc; } -- cgit v1.2.3 From 5d3e22ae4f5fcf6c7717eb9e50767b3fbb5a10f8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 02:17:27 +0300 Subject: SCI: Some cleanup of the warnings in the SCI32 plane manipulation code --- engines/sci/graphics/frameout.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 5703579b1e..450460023c 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -326,8 +326,10 @@ void GfxFrameout::deletePlaneLine(reg_t object, reg_t hunkId) { void GfxFrameout::kernelAddScreenItem(reg_t object) { // Ignore invalid items - if (!_segMan->isObject(object)) + if (!_segMan->isObject(object)) { + warning("kernelAddScreenItem: Attempt to add an invalid object (%04x:%04x)", PRINT_REG(object)); return; + } FrameoutEntry *itemEntry = new FrameoutEntry(); memset(itemEntry, 0, sizeof(FrameoutEntry)); @@ -341,8 +343,10 @@ void GfxFrameout::kernelAddScreenItem(reg_t object) { void GfxFrameout::kernelUpdateScreenItem(reg_t object) { // Ignore invalid items - if (!_segMan->isObject(object)) + if (!_segMan->isObject(object)) { + warning("kernelUpdateScreenItem: Attempt to update an invalid object (%04x:%04x)", PRINT_REG(object)); return; + } FrameoutEntry *itemEntry = findScreenItem(object); if (!itemEntry) { @@ -372,10 +376,9 @@ void GfxFrameout::kernelUpdateScreenItem(reg_t object) { void GfxFrameout::kernelDeleteScreenItem(reg_t object) { FrameoutEntry *itemEntry = findScreenItem(object); - if (!itemEntry) { - warning("kernelDeleteScreenItem: invalid object %04x:%04x", PRINT_REG(object)); + // If the item could not be found, it may already have been deleted + if (!itemEntry) return; - } _screenItems.remove(itemEntry); delete itemEntry; -- cgit v1.2.3 From 243ea1fa290a919d5f0a07094782465f0ba08d7e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 02:20:39 +0300 Subject: SCI: Add a check for invalid clip rectangles Happens in QFG4, when starting a battle --- engines/sci/graphics/frameout.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 450460023c..5b857fe3d8 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -722,6 +722,9 @@ void GfxFrameout::kernelFrameout() { translatedClipRect = clipRect; translatedClipRect.translate(it->upscaledPlaneRect.left, it->upscaledPlaneRect.top); } else { + // QFG4 passes invalid rectangles when a battle is starting + if (!clipRect.isValidRect()) + continue; clipRect.clip(it->planeClipRect); translatedClipRect = clipRect; translatedClipRect.translate(it->planeRect.left, it->planeRect.top); -- cgit v1.2.3 From 7e2cf139a97764bcd45252f6d54f0247b2d4939b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 4 Jul 2012 01:59:32 +0200 Subject: KYRA: Improve wording about possibly incorrect MT32->GM mapping. --- engines/kyra/sound_midi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp index 0004395f6f..70cc304192 100644 --- a/engines/kyra/sound_midi.cpp +++ b/engines/kyra/sound_midi.cpp @@ -475,8 +475,8 @@ SoundMidiPC::SoundMidiPC(KyraEngine_v1 *vm, Audio::Mixer *mixer, MidiDriver *dri ::GUI::MessageDialog dialog(_("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. After all it might happen\n" - "that a few tracks will not be correctly played.")); + "General MIDI ones. It is still possible that\n" + "some tracks sound incorrect.")); dialog.runModal(); } } -- cgit v1.2.3 From 55d322346832d41c42bb058bdc263d755e0f598b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 4 Jul 2012 02:01:47 +0200 Subject: SCI: Fix spelling of Yamaha. Thanks to somaen for noticing. --- engines/sci/detection.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 8a74bc817c..58ac5f1fa6 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -397,8 +397,8 @@ static const ADExtraGuiOptionsMap optionsList[] = { { GAMEOPTION_FB01_MIDI, { - _s("Use IMF/Yahama FB-01 for MIDI output"), - _s("Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI output"), + _s("Use IMF/Yamaha FB-01 for MIDI output"), + _s("Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI output"), "native_fb01", false } -- cgit v1.2.3 From 604c6bde91a9f1fb71d18f8fdcc172fc738ff9ef Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 4 Jul 2012 02:02:02 +0200 Subject: DOCS: Fix spelling of Yamaha. --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 722f3298d3..8d4ca4bc22 100644 --- a/README +++ b/README @@ -2084,7 +2084,7 @@ Sierra games using the SCI engine add the following non-standard keywords: originalsaveload bool If true, the original save/load screens are used instead of the enhanced ScummVM ones native_fb01 bool If true, the music driver for an IBM Music - Feature card or a Yahama FB-01 FM synth module + Feature card or a Yamaha FB-01 FM synth module is used for MIDI output Broken Sword II adds the following non-standard keywords: -- cgit v1.2.3 From 190efefdd259eedc10d8d8ea4e113392daff12af Mon Sep 17 00:00:00 2001 From: Einar Johan Trøan Sømåen Date: Wed, 4 Jul 2012 02:20:42 +0200 Subject: I18N: Update the Norwegian (Bokmål)-translation --- po/nb_NO.po | 1039 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 567 insertions(+), 472 deletions(-) diff --git a/po/nb_NO.po b/po/nb_NO.po index 9dfc58331c..0975877d65 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-06-24 18:06+0100\n" -"PO-Revision-Date: 2011-04-25 22:56+0100\n" -"Last-Translator: Einar Johan T. Smen \n" +"PO-Revision-Date: 2012-07-04 02:19+0100\n" +"Last-Translator: Einar Johan Smen \n" "Language-Team: somaen \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" @@ -37,7 +37,8 @@ msgstr "Tilgjengelige motorer:" msgid "Go up" msgstr "G tilbake" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:66 +#: gui/browser.cpp:68 msgid "Go to previous directory level" msgstr "G til forrige mappeniv" @@ -46,24 +47,37 @@ msgctxt "lowres" msgid "Go up" msgstr "G tilbake" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 +#: gui/browser.cpp:69 +#: gui/chooser.cpp:45 +#: gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 +#: gui/massadd.cpp:94 +#: gui/options.cpp:1228 +#: gui/saveload.cpp:64 +#: gui/saveload.cpp:173 +#: gui/themebrowser.cpp:54 +#: engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Avbryt" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:70 +#: gui/chooser.cpp:46 +#: gui/themebrowser.cpp:55 msgid "Choose" msgstr "Velg" -#: gui/gui-manager.cpp:115 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 +#: gui/gui-manager.cpp:115 +#: 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 #: backends/keymapper/remap-dialog.cpp:52 msgid "Close" msgstr "Lukk" @@ -72,20 +86,23 @@ msgstr "Lukk" msgid "Mouse click" msgstr "Musklikk" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 +#: base/main.cpp:300 msgid "Display keyboard" msgstr "Vis tastatur" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 +#: base/main.cpp:304 msgid "Remap keys" msgstr "Omkoble taster" -#: gui/gui-manager.cpp:129 base/main.cpp:307 -#, fuzzy +#: gui/gui-manager.cpp:129 +#: base/main.cpp:307 msgid "Toggle FullScreen" msgstr "Veksle fullskjerm" -#: gui/KeysDialog.h:36 gui/KeysDialog.cpp:145 +#: gui/KeysDialog.h:36 +#: gui/KeysDialog.cpp:145 msgid "Choose an action to map" msgstr "Velg en handling for kobling" @@ -93,17 +110,31 @@ msgstr "Velg en handling for kobling" msgid "Map" msgstr "Koble" -#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 +#: gui/KeysDialog.cpp:42 +#: gui/launcher.cpp:346 +#: gui/launcher.cpp:1001 +#: gui/launcher.cpp:1005 +#: gui/massadd.cpp:91 +#: gui/options.cpp:1229 +#: engines/engine.cpp:361 +#: engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 +#: engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 +#: engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 +#: engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 +#: engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -113,12 +144,16 @@ msgstr "OK" msgid "Select an action and click 'Map'" msgstr "Velg en handling, og trykk 'Koble'" -#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141 +#: gui/KeysDialog.cpp:80 +#: gui/KeysDialog.cpp:102 +#: gui/KeysDialog.cpp:141 #, c-format msgid "Associated key : %s" msgstr "Koblet tast : %s" -#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#: gui/KeysDialog.cpp:82 +#: gui/KeysDialog.cpp:104 +#: gui/KeysDialog.cpp:143 #, c-format msgid "Associated key : none" msgstr "Koblet tast: ingen" @@ -139,13 +174,11 @@ msgstr "Spill" msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194 -msgid "" -"Short game identifier used for referring to savegames and running the game " -"from the command line" -msgstr "" -"Kort spill-identifikator, brukt for referere til lagrede spill, og kjre " -"spillet fra kommandolinjen" +#: gui/launcher.cpp:191 +#: gui/launcher.cpp:193 +#: gui/launcher.cpp:194 +msgid "Short game identifier used for referring to savegames and running the game from the command line" +msgstr "Kort spill-identifikator, brukt for referere til lagrede spill, og kjre spillet fra kommandolinjen" #: gui/launcher.cpp:193 msgctxt "lowres" @@ -156,7 +189,9 @@ msgstr "ID:" msgid "Name:" msgstr "Navn:" -#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201 +#: gui/launcher.cpp:198 +#: gui/launcher.cpp:200 +#: gui/launcher.cpp:201 msgid "Full title of the game" msgstr "Full spilltittel" @@ -169,16 +204,17 @@ msgstr "Navn:" msgid "Language:" msgstr "Sprk:" -#: gui/launcher.cpp:204 gui/launcher.cpp:205 -msgid "" -"Language of the game. This will not turn your Spanish game version into " -"English" -msgstr "" -"Spillets sprk. Dette vil ikke gjre din spanske spillversjon om til engelsk " -"versjon" +#: gui/launcher.cpp:204 +#: gui/launcher.cpp:205 +msgid "Language of the game. This will not turn your Spanish game version into English" +msgstr "Spillets sprk. Dette vil ikke gjre din spanske spillversjon om til engelsk versjon" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 +#: gui/launcher.cpp:220 +#: gui/options.cpp:80 +#: gui/options.cpp:730 +#: gui/options.cpp:743 +#: gui/options.cpp:1199 #: audio/null.cpp:40 msgid "" msgstr "" @@ -187,7 +223,9 @@ msgstr "" msgid "Platform:" msgstr "Plattform:" -#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219 +#: gui/launcher.cpp:216 +#: gui/launcher.cpp:218 +#: gui/launcher.cpp:219 msgid "Platform the game was originally designed for" msgstr "Plattform spillet opprinnelig ble designet for" @@ -197,15 +235,18 @@ msgid "Platform:" msgstr "Plattform:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Undersk" +msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 +#: gui/options.cpp:1062 +#: gui/options.cpp:1079 msgid "Graphics" msgstr "Grafikk" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 +#: gui/options.cpp:1062 +#: gui/options.cpp:1079 msgid "GFX" msgstr "GFX" @@ -218,7 +259,8 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Overstyr globale grafikkinstillinger" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 +#: gui/options.cpp:1085 msgid "Audio" msgstr "Lyd" @@ -231,11 +273,13 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Overstyr globale lydinstillinger" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 +#: gui/options.cpp:1090 msgid "Volume" msgstr "Volum" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 +#: gui/options.cpp:1092 msgctxt "lowres" msgid "Volume" msgstr "Volum" @@ -249,7 +293,8 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Overstyr globale voluminstillinger" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 +#: gui/options.cpp:1100 msgid "MIDI" msgstr "MIDI" @@ -262,7 +307,8 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Overstyr globale MIDI-instillinger" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 +#: gui/options.cpp:1106 msgid "MT-32" msgstr "MT-32" @@ -275,11 +321,13 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Overstyr globale MT-32-instillinger" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 +#: gui/options.cpp:1113 msgid "Paths" msgstr "Sti" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 +#: gui/options.cpp:1115 msgctxt "lowres" msgid "Paths" msgstr "Sti" @@ -293,54 +341,80 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Spillsti:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 +#: gui/options.cpp:1139 msgid "Extra Path:" msgstr "Ekstrasti:" -#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327 +#: gui/launcher.cpp:324 +#: gui/launcher.cpp:326 +#: gui/launcher.cpp:327 msgid "Specifies path to additional data used the game" msgstr "Bestemmer sti til ytterligere data brukt av spillet" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 +#: gui/options.cpp:1141 msgctxt "lowres" msgid "Extra Path:" msgstr "Ekstrasti:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 +#: gui/options.cpp:1123 msgid "Save Path:" msgstr "Lagringssti:" -#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/launcher.cpp:333 +#: gui/launcher.cpp:335 +#: gui/launcher.cpp:336 +#: gui/options.cpp:1123 +#: gui/options.cpp:1125 +#: gui/options.cpp:1126 msgid "Specifies where your savegames are put" msgstr "Bestemmer sti til lagrede spill" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 +#: gui/options.cpp:1125 msgctxt "lowres" msgid "Save Path:" msgstr "Lagringssti:" -#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 +#: gui/launcher.cpp:354 +#: gui/launcher.cpp:453 +#: gui/launcher.cpp:511 +#: gui/launcher.cpp:565 +#: gui/options.cpp:1134 +#: gui/options.cpp:1142 +#: gui/options.cpp:1151 +#: gui/options.cpp:1258 +#: gui/options.cpp:1264 +#: gui/options.cpp:1272 +#: gui/options.cpp:1302 +#: gui/options.cpp:1308 +#: gui/options.cpp:1315 +#: gui/options.cpp:1408 +#: gui/options.cpp:1411 #: gui/options.cpp:1423 msgctxt "path" msgid "None" msgstr "Ingen" -#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/launcher.cpp:359 +#: gui/launcher.cpp:459 +#: gui/launcher.cpp:569 +#: gui/options.cpp:1252 +#: gui/options.cpp:1296 +#: gui/options.cpp:1414 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 +#: gui/options.cpp:1417 msgid "Select SoundFont" msgstr "Velg SoundFont" -#: gui/launcher.cpp:523 gui/launcher.cpp:677 +#: gui/launcher.cpp:523 +#: gui/launcher.cpp:677 msgid "Select directory with game data" msgstr "Velg mappe med spilldata" @@ -356,11 +430,13 @@ msgstr "Velg mappe for lagrede spill" msgid "This game ID is already taken. Please choose another one." msgstr "Denne spill-IDen er allerede i bruk. Vennligst velg en annen." -#: gui/launcher.cpp:621 engines/dialogs.cpp:110 +#: gui/launcher.cpp:621 +#: engines/dialogs.cpp:110 msgid "~Q~uit" msgstr "~A~vslutt" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 +#: backends/platform/sdl/macosx/appmenu_osx.mm:96 msgid "Quit ScummVM" msgstr "Avslutt ScummVM" @@ -368,7 +444,8 @@ msgstr "Avslutt ScummVM" msgid "A~b~out..." msgstr "~O~m..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 +#: backends/platform/sdl/macosx/appmenu_osx.mm:70 msgid "About ScummVM" msgstr "Om ScummVM" @@ -396,11 +473,13 @@ msgstr "~ msgid "Load savegame for selected game" msgstr "pne lagret spill for det valgte spillet" -#: gui/launcher.cpp:633 gui/launcher.cpp:1120 +#: gui/launcher.cpp:633 +#: gui/launcher.cpp:1120 msgid "~A~dd Game..." msgstr "~L~egg til spill..." -#: gui/launcher.cpp:633 gui/launcher.cpp:640 +#: gui/launcher.cpp:633 +#: gui/launcher.cpp:640 msgid "Hold Shift for Mass Add" msgstr "Hold Shift for legge til flere" @@ -408,7 +487,8 @@ msgstr "Hold Shift for msgid "~E~dit Game..." msgstr "~R~ediger spill..." -#: gui/launcher.cpp:635 gui/launcher.cpp:642 +#: gui/launcher.cpp:635 +#: gui/launcher.cpp:642 msgid "Change game options" msgstr "Endre spillinstillinger" @@ -416,11 +496,13 @@ msgstr "Endre spillinstillinger" msgid "~R~emove Game" msgstr "~F~jern spill" -#: gui/launcher.cpp:637 gui/launcher.cpp:644 +#: gui/launcher.cpp:637 +#: gui/launcher.cpp:644 msgid "Remove game from the list. The game data files stay intact" msgstr "Fjern spill fra listen. Spilldataene forblir intakte" -#: gui/launcher.cpp:640 gui/launcher.cpp:1120 +#: gui/launcher.cpp:640 +#: gui/launcher.cpp:1120 msgctxt "lowres" msgid "~A~dd Game..." msgstr "~L~egg til spill..." @@ -439,31 +521,36 @@ msgstr "~F~jern spill" msgid "Search in game list" msgstr "Sk i spilliste" -#: gui/launcher.cpp:656 gui/launcher.cpp:1167 +#: gui/launcher.cpp:656 +#: gui/launcher.cpp:1167 msgid "Search:" msgstr "Sk:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: gui/launcher.cpp:680 +#: engines/dialogs.cpp:114 +#: engines/mohawk/myst.cpp:255 +#: engines/mohawk/riven.cpp:716 +#: engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "pne spill:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: gui/launcher.cpp:680 +#: engines/dialogs.cpp:114 +#: engines/scumm/dialogs.cpp:188 +#: engines/mohawk/myst.cpp:255 +#: engines/mohawk/riven.cpp:716 +#: engines/cruise/menu.cpp:214 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "pne" #: gui/launcher.cpp:788 -msgid "" -"Do you really want to run the mass game detector? This could potentially add " -"a huge number of games." -msgstr "" -"Vil du virkelig kjre flerspill-finneren? Dette kan potensielt legge til et " -"stort antall spill." +msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." +msgstr "Vil du virkelig kjre flerspill-finneren? Dette kan potensielt legge til et stort antall spill." -#: gui/launcher.cpp:789 gui/launcher.cpp:937 +#: gui/launcher.cpp:789 +#: gui/launcher.cpp:937 #: backends/events/symbiansdl/symbiansdl-events.cpp:184 #: backends/platform/wince/CEActionsPocket.cpp:326 #: backends/platform/wince/CEActionsSmartphone.cpp:287 @@ -471,7 +558,8 @@ msgstr "" msgid "Yes" msgstr "Ja" -#: gui/launcher.cpp:789 gui/launcher.cpp:937 +#: gui/launcher.cpp:789 +#: gui/launcher.cpp:937 #: backends/events/symbiansdl/symbiansdl-events.cpp:184 #: backends/platform/wince/CEActionsPocket.cpp:326 #: backends/platform/wince/CEActionsSmartphone.cpp:287 @@ -501,8 +589,7 @@ msgstr "Dette spillet st #: gui/launcher.cpp:1005 msgid "ScummVM could not find any engine capable of running the selected game!" -msgstr "" -"ScummVM kunne ikke finne noen motor som kunne kjre det valgte spillet!" +msgstr "ScummVM kunne ikke finne noen motor som kunne kjre det valgte spillet!" #: gui/launcher.cpp:1119 msgctxt "lowres" @@ -513,7 +600,8 @@ msgstr "Legg til flere..." msgid "Mass Add..." msgstr "Legg til flere..." -#: gui/massadd.cpp:78 gui/massadd.cpp:81 +#: gui/massadd.cpp:78 +#: gui/massadd.cpp:81 msgid "... progress ..." msgstr "... fremdrift ..." @@ -524,7 +612,7 @@ msgstr "S #: gui/massadd.cpp:261 #, c-format msgid "Discovered %d new games, ignored %d previously added games." -msgstr "" +msgstr "Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere." #: gui/massadd.cpp:265 #, c-format @@ -532,9 +620,9 @@ msgid "Scanned %d directories ..." msgstr "Sjekket %d mapper ..." #: gui/massadd.cpp:268 -#, fuzzy, c-format +#, c-format msgid "Discovered %d new games, ignored %d previously added games ..." -msgstr "Fant %d nye spill ..." +msgstr "Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere..." #: gui/options.cpp:78 msgid "Never" @@ -576,27 +664,30 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:248 +#: gui/options.cpp:474 +#: gui/options.cpp:575 +#: gui/options.cpp:644 +#: gui/options.cpp:852 msgctxt "soundfont" msgid "None" msgstr "Ingen" #: gui/options.cpp:382 msgid "Failed to apply some of the graphic options changes:" -msgstr "" +msgstr "Klarte ikke aktivere enkelte av endringene i grafikkinstillinger:" #: gui/options.cpp:394 msgid "the video mode could not be changed." -msgstr "" +msgstr "videomodusen kunne ikke endres." #: gui/options.cpp:400 msgid "the fullscreen setting could not be changed" -msgstr "" +msgstr "fullskjermsinnstillingen kunne ikke endres" #: gui/options.cpp:406 msgid "the aspect ratio setting could not be changed" -msgstr "" +msgstr "aspektrate-innstillingen kunne ikke endres" #: gui/options.cpp:727 msgid "Graphics mode:" @@ -606,7 +697,8 @@ msgstr "Grafikkmodus:" msgid "Render mode:" msgstr "Tegnemodus:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:741 +#: gui/options.cpp:742 msgid "Special dithering modes supported by some games" msgstr "Spesiel dithering-modus stttet av enkelte spill" @@ -632,11 +724,14 @@ msgstr "Foretrukket enhet:" msgid "Music Device:" msgstr "Musikkenhet:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:764 +#: gui/options.cpp:766 msgid "Specifies preferred sound device or sound card emulator" msgstr "Velger foretrukket lydenhet eller lydkort-emulator" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:764 +#: gui/options.cpp:766 +#: gui/options.cpp:767 msgid "Specifies output sound device or sound card emulator" msgstr "Velger ut-lydenhet eller lydkortemulator" @@ -654,7 +749,8 @@ msgstr "Musikkenhet:" msgid "AdLib emulator:" msgstr "AdLib-emulator:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:793 +#: gui/options.cpp:794 msgid "AdLib is used for music in many games" msgstr "AdLib brukes til musikk i mange spill" @@ -662,13 +758,10 @@ msgstr "AdLib brukes til musikk i mange spill" msgid "Output rate:" msgstr "Utrate:" -#: gui/options.cpp:804 gui/options.cpp:805 -msgid "" -"Higher value specifies better sound quality but may be not supported by your " -"soundcard" -msgstr "" -"Hyere verdier gir bedre lydkvalitet, men stttes kanskje ikke av ditt " -"lydkort " +#: gui/options.cpp:804 +#: gui/options.cpp:805 +msgid "Higher value specifies better sound quality but may be not supported by your soundcard" +msgstr "Hyere verdier gir bedre lydkvalitet, men stttes kanskje ikke av ditt lydkort " #: gui/options.cpp:815 msgid "GM Device:" @@ -682,7 +775,8 @@ msgstr "Velger standard lydenhet for General MIDI-utdata" msgid "Don't use General MIDI music" msgstr "Ikke bruk General MIDI-musikk" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:837 +#: gui/options.cpp:899 msgid "Use first available device" msgstr "Bruk frste tilgjengelige enhet" @@ -690,7 +784,9 @@ msgstr "Bruk f msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:849 +#: gui/options.cpp:851 +#: gui/options.cpp:852 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont stttes ikke av enkelte lydkort, FluidSynth og Timidity" @@ -723,13 +819,10 @@ msgstr "Velger standard lydenhet for Roland MT-32/LAPC1/CM32I/CM64-avspilling" msgid "True Roland MT-32 (disable GM emulation)" msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)" -#: gui/options.cpp:875 gui/options.cpp:877 -msgid "" -"Check if you want to use your real hardware Roland-compatible sound device " -"connected to your computer" -msgstr "" -"Velg hvis du har et ekte Roland-kompatible lydkort tilkoblet maskinen, og " -"vil bruke dette." +#: gui/options.cpp:875 +#: gui/options.cpp:877 +msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" +msgstr "Velg hvis du har et ekte Roland-kompatible lydkort tilkoblet maskinen, og vil bruke dette." #: gui/options.cpp:877 msgctxt "lowres" @@ -752,11 +845,13 @@ msgstr "Ikke bruk Roland MT-32-musikk" msgid "Text and Speech:" msgstr "Tekst og Tale:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:920 +#: gui/options.cpp:930 msgid "Speech" msgstr "Tale" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:921 +#: gui/options.cpp:931 msgid "Subtitles" msgstr "Undertekster" @@ -812,7 +907,9 @@ msgstr "Demp alle" msgid "SFX volume:" msgstr "Lydeffektvolum:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:962 +#: gui/options.cpp:964 +#: gui/options.cpp:965 msgid "Special sound effects volume" msgstr "Volum for spesielle lydeffekter" @@ -839,7 +936,9 @@ msgctxt "lowres" msgid "Theme Path:" msgstr "Temasti:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1139 +#: gui/options.cpp:1141 +#: gui/options.cpp:1142 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Velger sti for ytterligere data brukt av alle spill eller ScummVM" @@ -891,9 +990,8 @@ msgid "Language of ScummVM GUI" msgstr "Sprk i ScummVM-GUIet" #: gui/options.cpp:1347 -#, fuzzy msgid "You have to restart ScummVM before your changes will take effect." -msgstr "Du m omstarte ScummVM for at endringene skal skje. " +msgstr "Du m starte ScummVM p nytt for at endringene skal tre i kraft. " #: gui/options.cpp:1360 msgid "Select directory for savegames" @@ -916,26 +1014,26 @@ msgid "Select directory for plugins" msgstr "Velg mappe for plugins" #: gui/options.cpp:1450 -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 "" -"Temaet du valgte sttter ikke det aktive sprket. Hvis du vil bruke dette " -"temaet, m du bytte til et annet sprk frst." +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 "Temaet du valgte sttter ikke det aktive sprket. Hvis du vil bruke dette temaet, m du bytte til et annet sprk frst." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload.cpp:59 +#: gui/saveload.cpp:257 msgid "No date saved" msgstr "Ingen dato lagret" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload.cpp:60 +#: gui/saveload.cpp:258 msgid "No time saved" msgstr "Ingen tid lagret" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload.cpp:61 +#: gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Ingen spilltid lagret" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload.cpp:68 +#: gui/saveload.cpp:173 msgid "Delete" msgstr "Slett" @@ -955,7 +1053,8 @@ msgstr "Tid: " msgid "Playtime: " msgstr "Spilltid: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload.cpp:305 +#: gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Ikke navngitt spilltilstand" @@ -988,7 +1087,10 @@ msgstr "Antialiased Tegner (16bpp)" msgid "Antialiased (16bpp)" msgstr "Antialiased (16bpp)" -#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332 +#: gui/widget.cpp:322 +#: gui/widget.cpp:324 +#: gui/widget.cpp:330 +#: gui/widget.cpp:332 msgid "Clear value" msgstr "Tm verdi" @@ -1001,13 +1103,15 @@ msgstr "Motoren st msgid "Menu" msgstr "Meny" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:290 +#: backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Hopp over" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:293 +#: backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pause" @@ -1082,7 +1186,7 @@ msgstr "Spillmotor-plugin st #: common/error.cpp:71 msgid "User canceled" -msgstr "" +msgstr "Brukeren avbrt" #: common/error.cpp:75 msgid "Unknown error" @@ -1091,15 +1195,15 @@ msgstr "Ukjent feil" #: engines/advancedDetector.cpp:324 #, c-format msgid "The game in '%s' seems to be unknown." -msgstr "" +msgstr "Spillet i '%s' ser ut til vre ukjent." #: engines/advancedDetector.cpp:325 msgid "Please, report the following data to the ScummVM team along with name" -msgstr "" +msgstr "Vennligst rapporter de flgende dataene til ScummVM-teamet sammen med navnet" #: engines/advancedDetector.cpp:327 msgid "of the game you tried to add and its version/language/etc.:" -msgstr "" +msgstr "p spillet du forskte legge til, og dets versjon/sprk/etc.:" #: engines/dialogs.cpp:84 msgid "~R~esume" @@ -1125,22 +1229,28 @@ msgstr "~H~jelp" msgid "~A~bout" msgstr "~O~m" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 +#: engines/dialogs.cpp:104 +#: engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:106 +#: engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" -#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/dialogs.cpp:115 +#: engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:728 msgid "Save game:" msgstr "Lagret spill:" -#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/dialogs.cpp:115 +#: engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 #: engines/sci/engine/kfile.cpp:728 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 @@ -1151,25 +1261,22 @@ msgid "Save" msgstr "Lagre" #: engines/dialogs.cpp:144 -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 "" +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 "Beklager, men denne motoren sttter for yeblikket ikke hjelp i spillet. Vennligst se i README-filen for grunnleggende informasjon, og for instruksjoner om hvordan du kan f ytterligere hjelp." #: engines/dialogs.cpp:228 #, c-format -msgid "" -"Gamestate save failed (%s)! Please consult the README for basic information, " -"and for instructions on how to obtain further assistance." -msgstr "" +msgid "Gamestate save failed (%s)! Please consult the README for basic information, and for instructions on how to obtain further assistance." +msgstr "Lagring av spilltilstand feilet (%s)! Vennligst konsulter README-filen for grunnleggende informasjon og instruksjon om hvordan du fr ytterligere hjelp." -#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 +#: engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 +#: engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~A~vbryt" @@ -1180,21 +1287,19 @@ msgstr "~T~aster" #: engines/engine.cpp:235 msgid "Could not initialize color format." -msgstr "" +msgstr "Kunne ikke initalisere fargeformat." #: engines/engine.cpp:243 -#, fuzzy msgid "Could not switch to video mode: '" -msgstr "Nvrende videomodus:" +msgstr "Kunne ikke veksle til videomodus: '" #: engines/engine.cpp:252 -#, fuzzy msgid "Could not apply aspect ratio setting." -msgstr "Veksle aspekt-rate korrigering" +msgstr "Kunne ikke aktivere aspektrate-innstilling." #: engines/engine.cpp:257 msgid "Could not apply fullscreen setting." -msgstr "" +msgstr "Kunne ikke aktivere fullskjermsinnstilling." #: engines/engine.cpp:357 msgid "" @@ -1204,6 +1309,11 @@ msgid "" "the data files to your hard disk instead.\n" "See the README file for details." msgstr "" +"Du ser ut til spille dette spillet direkte fra\n" +"CDen. Dette er kjent for skape problemer,\n" +"og det er derfor anbefalt at du kopierer\n" +"datafilene til harddisken din istedet.\n" +"Se README-filen for detaljer." #: engines/engine.cpp:368 msgid "" @@ -1216,108 +1326,99 @@ msgstr "" #: engines/engine.cpp:426 #, c-format -msgid "" -"Gamestate load failed (%s)! Please consult the README for basic information, " -"and for instructions on how to obtain further assistance." +msgid "Gamestate load failed (%s)! Please consult the README for basic information, and for instructions on how to obtain further assistance." msgstr "" #: engines/engine.cpp:439 -msgid "" -"WARNING: The game you are about to start is not yet fully supported by " -"ScummVM. As such, it is likely to be unstable, and any saves you make might " -"not work in future versions of ScummVM." -msgstr "" +msgid "WARNING: The game you are about to start is not yet fully supported by ScummVM. As such, it is likely to be unstable, and any saves you make might not work in future versions of ScummVM." +msgstr "ADVARSEL: Spillet du prver starte er ikke fullstendig stttet av ScummVM. Derfor er det sannsynlig at det vil vre ustabilt, og det er ikke sikkert at lagrede spill vil fortsette fungere i fremtidige versjoner av ScummVM." #: engines/engine.cpp:442 msgid "Start anyway" -msgstr "" +msgstr "Start allikevel" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 +#: engines/agi/detection.cpp:145 +#: engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Bruk originale lagre/laste-skjermer" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 +#: engines/agi/detection.cpp:146 +#: engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" -msgstr "" +msgstr "Bruk de originale lagre/laste-skjermene, istedenfor ScummVM-variantene" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 +#: engines/sci/engine/kfile.cpp:824 msgid "Restore game:" msgstr "Gjennopprett spill:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 +#: engines/sci/engine/kfile.cpp:824 msgid "Restore" msgstr "Gjenopprett" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "vre hyre gjenstand" +msgstr "Bruk lys palettmodus" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Vis grafikk med spillets lyse palett" #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "EGA av-dithering" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "Slr av dithering i EGA-spill som sttter det." +msgstr "Aktiver av-dithering i EGA-spill" #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Volum for spesielle lydeffekter" +msgstr "Foretrekk digitale lydeffekter" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Foretrekk digitale lydeffekter fremfor syntetiske" #: engines/sci/detection.cpp:400 msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "" +msgstr "Bruk IMF/Yahama-FB-01 for MIDI-output" #: engines/sci/detection.cpp:401 -msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " -"output" +msgid "Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI output" msgstr "" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "Bruk CD-lyd" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr "Bruk CD-lyd istedenfor spillets lyd, hvis tilgjengelig" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Bruk Windows-muspekere" #: engines/sci/detection.cpp:423 -msgid "" -"Use the Windows cursors (smaller and monochrome) instead of the DOS ones" -msgstr "" +msgid "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" +msgstr "Bruk Windows-muspekerene (mindre, og monokrome) isteden" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Vanlig muspeker" +msgstr "Bruk slvmuspekere" #: engines/sci/detection.cpp:434 -msgid "" -"Use the alternate set of silver cursors, instead of the normal golden ones" -msgstr "" +msgid "Use the alternate set of silver cursors, instead of the normal golden ones" +msgstr "Bruk det alternative settet med slvmuspekere, istedenfor de normale gylne." #: engines/scumm/dialogs.cpp:175 #, c-format msgid "Insert Disk %c and Press Button to Continue." -msgstr "" +msgstr "Sett inn disk %c, og trykk Tast for fortsette." #: engines/scumm/dialogs.cpp:176 #, c-format @@ -1331,27 +1432,26 @@ msgstr "" #: engines/scumm/dialogs.cpp:178 msgid "Game Paused. Press SPACE to Continue." -msgstr "" +msgstr "Spill pauset. Trykk p MELLOMROMstasten for fortsette." #. 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:182 -#, fuzzy msgid "Are you sure you want to restart? (Y/N)" -msgstr " Er du sikker p at du vil avslutte ?" +msgstr "Er du sikker p at du vil avslutte? (Y/N)" #. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment #: engines/scumm/dialogs.cpp:184 -#, fuzzy msgid "Are you sure you want to quit? (Y/N)" -msgstr " Er du sikker p at du vil avslutte ?" +msgstr "Er du sikker p at du vil avslutte? (Y/N)" #: engines/scumm/dialogs.cpp:189 msgid "Play" -msgstr "" +msgstr "Spill" -#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82 +#: engines/scumm/dialogs.cpp:191 +#: engines/scumm/help.cpp:82 #: engines/scumm/help.cpp:84 #: backends/platform/symbian/src/SymbianActions.cpp:52 #: backends/platform/wince/CEActionsPocket.cpp:44 @@ -1366,38 +1466,37 @@ msgstr "" #: engines/scumm/dialogs.cpp:194 msgid "You must enter a name" -msgstr "" +msgstr "Du m skrive inn et navn" #: engines/scumm/dialogs.cpp:195 msgid "The game was NOT saved (disk full?)" -msgstr "" +msgstr "Spillet ble IKKE lagret (full disk?)" #: engines/scumm/dialogs.cpp:196 msgid "The game was NOT loaded" -msgstr "" +msgstr "Spillet ble IKKE lastet" #: engines/scumm/dialogs.cpp:197 #, c-format msgid "Saving '%s'" -msgstr "" +msgstr "Lagrer '%s'" #: engines/scumm/dialogs.cpp:198 #, c-format msgid "Loading '%s'" -msgstr "" +msgstr "Laster '%s'" #: engines/scumm/dialogs.cpp:199 msgid "Name your SAVE game" -msgstr "" +msgstr "Gi det LAGREDE spillet ditt et navn" #: engines/scumm/dialogs.cpp:200 -#, fuzzy msgid "Select a game to LOAD" -msgstr "Velg et tema" +msgstr "Velg et spill for LASTING" #: engines/scumm/dialogs.cpp:201 msgid "Game title)" -msgstr "" +msgstr "Spilltittel)" #. I18N: Previous page button #: engines/scumm/dialogs.cpp:287 @@ -1415,25 +1514,21 @@ msgid "~C~lose" msgstr "~L~ukk" #: engines/scumm/dialogs.cpp:597 -#, fuzzy msgid "Speech Only" -msgstr "Tale" +msgstr "Kun tale" #: engines/scumm/dialogs.cpp:598 -#, fuzzy msgid "Speech and Subtitles" -msgstr "Undertekster" +msgstr "Tale og undertekster" #: engines/scumm/dialogs.cpp:599 -#, fuzzy msgid "Subtitles Only" -msgstr "Undertekster" +msgstr "Kun undertekster" #: engines/scumm/dialogs.cpp:607 -#, fuzzy msgctxt "lowres" msgid "Speech & Subs" -msgstr "Tale" +msgstr "Tekst & Tale" #: engines/scumm/dialogs.cpp:653 msgid "Select a Proficiency Level." @@ -1441,20 +1536,19 @@ msgstr "" #: engines/scumm/dialogs.cpp:655 msgid "Refer to your Loom(TM) manual for help." -msgstr "" +msgstr "Referer til Loom(TM)-hndboka di for hjelp." #: engines/scumm/dialogs.cpp:658 -#, fuzzy msgid "Standard" -msgstr "Standard (16bpp)" +msgstr "Standard" #: engines/scumm/dialogs.cpp:659 msgid "Practice" -msgstr "" +msgstr "Trening" #: engines/scumm/dialogs.cpp:660 msgid "Expert" -msgstr "" +msgstr "Ekspert" #: engines/scumm/help.cpp:73 msgid "Common keyboard commands:" @@ -1484,11 +1578,16 @@ msgstr "Space" msgid "Pause game" msgstr "Pause spill" -#: engines/scumm/help.cpp:79 engines/scumm/help.cpp:84 -#: engines/scumm/help.cpp:95 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:79 +#: engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:95 +#: 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 msgid "Ctrl" msgstr "Ctrl" @@ -1496,9 +1595,12 @@ msgstr "Ctrl" msgid "Load game state 1-10" msgstr "pne spilltilstand 1-10" -#: engines/scumm/help.cpp:80 engines/scumm/help.cpp:84 -#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:100 -#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102 +#: engines/scumm/help.cpp:80 +#: engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:86 +#: engines/scumm/help.cpp:100 +#: engines/scumm/help.cpp:101 +#: engines/scumm/help.cpp:102 msgid "Alt" msgstr "Alt" @@ -1506,7 +1608,8 @@ msgstr "Alt" msgid "Save game state 1-10" msgstr "Lagre spilltilstand 1-10" -#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89 +#: engines/scumm/help.cpp:86 +#: engines/scumm/help.cpp:89 msgid "Enter" msgstr "Enter" @@ -1587,9 +1690,8 @@ msgid " since they may cause crashes" msgstr " de kan forrsake krsj, eller" #: engines/scumm/help.cpp:110 -#, fuzzy msgid " or incorrect game behavior." -msgstr " feilaktig spilloppfrsel." +msgstr " eller feilaktig spilloppfrsel." #: engines/scumm/help.cpp:114 msgid "Spinning drafts on the keyboard:" @@ -1599,24 +1701,30 @@ msgstr "Spinne drafts p msgid "Main game controls:" msgstr "Hovedkontroller for spill:" -#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136 +#: engines/scumm/help.cpp:121 +#: engines/scumm/help.cpp:136 #: engines/scumm/help.cpp:161 msgid "Push" msgstr "Dytt" -#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137 +#: engines/scumm/help.cpp:122 +#: engines/scumm/help.cpp:137 #: engines/scumm/help.cpp:162 msgid "Pull" msgstr "Dra" -#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138 -#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197 +#: engines/scumm/help.cpp:123 +#: engines/scumm/help.cpp:138 +#: engines/scumm/help.cpp:163 +#: engines/scumm/help.cpp:197 #: engines/scumm/help.cpp:207 msgid "Give" msgstr "Gi" -#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139 -#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190 +#: engines/scumm/help.cpp:124 +#: engines/scumm/help.cpp:139 +#: engines/scumm/help.cpp:164 +#: engines/scumm/help.cpp:190 #: engines/scumm/help.cpp:208 msgid "Open" msgstr "pne" @@ -1629,43 +1737,54 @@ msgstr "G msgid "Get" msgstr "F" -#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152 -#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198 -#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224 +#: engines/scumm/help.cpp:128 +#: engines/scumm/help.cpp:152 +#: engines/scumm/help.cpp:170 +#: engines/scumm/help.cpp:198 +#: engines/scumm/help.cpp:213 +#: engines/scumm/help.cpp:224 #: engines/scumm/help.cpp:250 msgid "Use" msgstr "Bruk" -#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141 +#: engines/scumm/help.cpp:129 +#: engines/scumm/help.cpp:141 msgid "Read" msgstr "Les" -#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147 +#: engines/scumm/help.cpp:130 +#: engines/scumm/help.cpp:147 msgid "New kid" msgstr "Bytt unge" -#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153 +#: engines/scumm/help.cpp:131 +#: engines/scumm/help.cpp:153 #: engines/scumm/help.cpp:171 msgid "Turn on" msgstr "Sl p" -#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154 +#: engines/scumm/help.cpp:132 +#: engines/scumm/help.cpp:154 #: engines/scumm/help.cpp:172 msgid "Turn off" msgstr "Sl av" -#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167 +#: engines/scumm/help.cpp:142 +#: engines/scumm/help.cpp:167 #: engines/scumm/help.cpp:194 msgid "Walk to" msgstr "G til" -#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168 -#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210 +#: engines/scumm/help.cpp:143 +#: engines/scumm/help.cpp:168 +#: engines/scumm/help.cpp:195 +#: engines/scumm/help.cpp:210 #: engines/scumm/help.cpp:227 msgid "Pick up" msgstr "Plukk opp" -#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169 +#: engines/scumm/help.cpp:144 +#: engines/scumm/help.cpp:169 msgid "What is" msgstr "Hva er" @@ -1689,11 +1808,13 @@ msgstr "Fiks" msgid "Switch" msgstr "Bytt" -#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228 +#: engines/scumm/help.cpp:166 +#: engines/scumm/help.cpp:228 msgid "Look" msgstr "Kikk" -#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223 +#: engines/scumm/help.cpp:173 +#: engines/scumm/help.cpp:223 msgid "Talk" msgstr "Snakk" @@ -1738,20 +1859,24 @@ msgstr "spill H p msgid "play C major on distaff" msgstr "spill C dur p distaffen" -#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214 +#: engines/scumm/help.cpp:192 +#: engines/scumm/help.cpp:214 msgid "puSh" msgstr "Dytt" -#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215 +#: engines/scumm/help.cpp:193 +#: engines/scumm/help.cpp:215 msgid "pull (Yank)" msgstr "Dra" -#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212 +#: engines/scumm/help.cpp:196 +#: engines/scumm/help.cpp:212 #: engines/scumm/help.cpp:248 msgid "Talk to" msgstr "Snakk til" -#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211 +#: engines/scumm/help.cpp:199 +#: engines/scumm/help.cpp:211 msgid "Look at" msgstr "Se p" @@ -1783,8 +1908,10 @@ msgstr "Merk neste dialog" msgid "Walk" msgstr "G" -#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234 -#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249 +#: engines/scumm/help.cpp:225 +#: engines/scumm/help.cpp:234 +#: engines/scumm/help.cpp:241 +#: engines/scumm/help.cpp:249 msgid "Inventory" msgstr "Inventar" @@ -1812,7 +1939,8 @@ msgstr "Sl msgid "Kick" msgstr "Spark" -#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247 +#: engines/scumm/help.cpp:239 +#: engines/scumm/help.cpp:247 msgid "Examine" msgstr "Undersk" @@ -1833,31 +1961,38 @@ msgstr "Lagre / msgid "Other game controls:" msgstr "Andre spillkontroller" -#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267 +#: engines/scumm/help.cpp:257 +#: engines/scumm/help.cpp:267 msgid "Inventory:" msgstr "Inventar:" -#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274 +#: engines/scumm/help.cpp:258 +#: engines/scumm/help.cpp:274 msgid "Scroll list up" msgstr "Bla liste opp" -#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275 +#: engines/scumm/help.cpp:259 +#: engines/scumm/help.cpp:275 msgid "Scroll list down" msgstr "Bla liste ned" -#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268 +#: engines/scumm/help.cpp:260 +#: engines/scumm/help.cpp:268 msgid "Upper left item" msgstr "vre venstre gjenstand" -#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270 +#: engines/scumm/help.cpp:261 +#: engines/scumm/help.cpp:270 msgid "Lower left item" msgstr "Nedre venstre gjenstand" -#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271 +#: engines/scumm/help.cpp:262 +#: engines/scumm/help.cpp:271 msgid "Upper right item" msgstr "vre hyre gjenstand" -#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273 +#: engines/scumm/help.cpp:263 +#: engines/scumm/help.cpp:273 msgid "Lower right item" msgstr "Nedre hyre gjenstand" @@ -1869,7 +2004,8 @@ msgstr "Midtre venstre gjenstand" msgid "Middle right item" msgstr "Midtre hyre gjenstand" -#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284 +#: engines/scumm/help.cpp:279 +#: engines/scumm/help.cpp:284 msgid "Switching characters:" msgstr "Bytte av karakterer:" @@ -1885,7 +2021,8 @@ msgstr "Tredje unge" msgid "Fighting controls (numpad):" msgstr "Kampkontroller (talltastatur)" -#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296 +#: engines/scumm/help.cpp:295 +#: engines/scumm/help.cpp:296 #: engines/scumm/help.cpp:297 msgid "Step back" msgstr "Bakoversteg" @@ -1977,7 +2114,8 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 +#: engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1988,7 +2126,8 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 +#: engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -1999,7 +2138,8 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 +#: engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2011,17 +2151,12 @@ msgstr "" "%s" #: engines/scumm/scumm.cpp:2512 -msgid "" -"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " -"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " -"directory inside the Tentacle game directory." -msgstr "" -"Vanligvis, ville Maniac Mansion ha startet n. Men ScummVM sttter ikke det " -"enn. S, for spille Maniac Mansion, g til 'Legg til spill' i ScummVM-" -"hovedmenyen og velg 'Maniac'-undermappa i Tentacle-mappa." +msgid "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' directory inside the Tentacle game directory." +msgstr "Vanligvis, ville Maniac Mansion ha startet n. Men ScummVM sttter ikke det enn. S, for spille Maniac Mansion, g til 'Legg til spill' i ScummVM-hovedmenyen og velg 'Maniac'-undermappa i Tentacle-mappa." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 +#: engines/mohawk/dialogs.cpp:171 msgid "~Z~ip Mode Activated" msgstr "~Z~ipmodus aktivert" @@ -2032,16 +2167,15 @@ msgstr "~O~verganger aktivert" #. I18N: Drop book page #: engines/mohawk/dialogs.cpp:95 msgid "~D~rop Page" -msgstr "" +msgstr "~D~ropp Side" #: engines/mohawk/dialogs.cpp:99 msgid "~S~how Map" -msgstr "" +msgstr "Vi~s~ Kart" #: engines/mohawk/dialogs.cpp:105 -#, fuzzy msgid "~M~ain Menu" -msgstr "ScummVM Hovedmeny" +msgstr "Hoved~m~eny" #: engines/mohawk/dialogs.cpp:172 msgid "~W~ater Effect Enabled" @@ -2052,48 +2186,34 @@ msgstr "~V~anneffekt aktivert" msgid "Cutscene file '%s' not found!" msgstr "" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 +#: engines/gob/inter_playtoons.cpp:256 +#: engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 -#, fuzzy msgid "Failed to load game state from file." -msgstr "" -"Klarte ikke pne spilltilstand fra fil:\n" -"\n" -"%s" +msgstr "Klarte ikke pne spilltilstand fra fil." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 -#, fuzzy +#: engines/gob/inter_v2.cpp:1357 +#: engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." -msgstr "" -"Klarte ikke lagre spilltilstand til fil:\n" -"\n" -"%s" +msgstr "Klarte ikke lagre spilltilstand fra fil." #: engines/gob/inter_v5.cpp:107 -#, fuzzy msgid "Failed to delete file." -msgstr "" -"Klarte ikke lagre spilltilstand til fil:\n" -"\n" -"%s" +msgstr "Klarte ikke slette fil." #: engines/groovie/script.cpp:420 -#, fuzzy msgid "Failed to save game" -msgstr "" -"Klarte ikke lagre spilltilstand til fil:\n" -"\n" -"%s" +msgstr "Klarte ikke lagre spill." #. I18N: Studio audience adds an applause and cheering sounds whenever #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Studiopublikum" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Aktiver studiopublikum" #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 @@ -2102,39 +2222,37 @@ msgstr "" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Tillat hoppe over tekst og kutt-scener" #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Helium-modus" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Aktiver Roland GS-modus" +msgstr "Aktiver helium-modus" #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Myk scrolling" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Aktiver myk scrolling nr man gr" #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Vanlig muspeker" +msgstr "Flytende muspekere" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Aktiver flytende muspekere" #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 @@ -2147,52 +2265,47 @@ msgstr "" #: engines/kyra/lol.cpp:478 msgid "Attack 1" -msgstr "" +msgstr "Angrep 1" #: engines/kyra/lol.cpp:479 msgid "Attack 2" -msgstr "" +msgstr "Angrep 2" #: engines/kyra/lol.cpp:480 msgid "Attack 3" -msgstr "" +msgstr "Angrep 3" #: engines/kyra/lol.cpp:481 msgid "Move Forward" -msgstr "" +msgstr "Beveg Fremover" #: engines/kyra/lol.cpp:482 msgid "Move Back" -msgstr "" +msgstr "Beveg Bakover" #: engines/kyra/lol.cpp:483 msgid "Slide Left" -msgstr "" +msgstr "Skli mot Venstre" #: engines/kyra/lol.cpp:484 -#, fuzzy msgid "Slide Right" -msgstr "Hyre" +msgstr "Skli mot Hyre" #: engines/kyra/lol.cpp:485 -#, fuzzy msgid "Turn Left" -msgstr "Sl av" +msgstr "Svin til Venstre" #: engines/kyra/lol.cpp:486 -#, fuzzy msgid "Turn Right" -msgstr "Peker hyre" +msgstr "Sving til Hyre" #: engines/kyra/lol.cpp:487 -#, fuzzy msgid "Rest" -msgstr "Gjenopprett" +msgstr "Hvil" #: engines/kyra/lol.cpp:488 -#, fuzzy msgid "Options" -msgstr "~V~alg" +msgstr "Valg" #: engines/kyra/lol.cpp:489 #, fuzzy @@ -2207,20 +2320,29 @@ msgid "" "General MIDI ones. After all it might happen\n" "that a few tracks will not be correctly played." msgstr "" +"Du ser ut til bruke en General MIDI-enhet,\n" +"men spillet ditt sttter bare Roland MT32-MIDI.\n" +"Vi forsker koble Roland MT32-instrumentene til\n" +"General MIDI-instrumentene. Allikevel, kan det\n" +"skje at enkelte spor ikke vil spilles riktig." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 +#: engines/queen/queen.cpp:59 +#: engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Diskett-intro" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 +#: engines/queen/queen.cpp:60 +#: engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr "Bruk diskettversjonens intro (Kun for CD-versjon)" #: engines/sky/compact.cpp:130 msgid "" "Unable to find \"sky.cpt\" file!\n" "Please download it from www.scummvm.org" msgstr "" +"Fant ikke filen \"sky.cpt\"!\n" +"Vennligst last den ned fra www.scummvm.org" #: engines/sky/compact.cpp:141 msgid "" @@ -2233,29 +2355,33 @@ msgstr "" msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:560 +#: engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:570 +#: engines/sword2/animation.cpp:465 msgid "MPEG2 cutscenes are no longer supported" msgstr "" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:576 +#: engines/sword2/animation.cpp:473 #, c-format msgid "Cutscene '%s' not found" msgstr "" #: engines/sword1/control.cpp:863 msgid "" -"ScummVM found that you have old savefiles for Broken Sword 1 that should be " -"converted.\n" -"The old save game format is no longer supported, so you will not be able to " -"load your games if you don't convert them.\n" +"ScummVM found that you have old savefiles for Broken Sword 1 that should be converted.\n" +"The old save 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" +"Press OK to convert them now, otherwise you will be asked again the next time you start the game.\n" msgstr "" +"ScummVM oppdaget at du har gamle lagrede spill for Broken Sword 1 som br konverteres.\n" +"Det gamle formatet for lagrede spill stttes ikke lengre, s du vil ikke vre i stand til laste de lagrede spillene,\n" +"med mindre du konverterer dem.\n" +"Trykk OK for konvertere dem n, ellers vil du bli spurt igjen neste gang du starter spillet." #: engines/sword1/control.cpp:1232 #, c-format @@ -2266,19 +2392,18 @@ msgstr "" #: engines/sword1/control.cpp:1235 msgid "Keep the old one" -msgstr "" +msgstr "Behold den gamle" #: engines/sword1/control.cpp:1235 msgid "Keep the new one" -msgstr "" +msgstr "Behold den nye" #: engines/sword1/logic.cpp:1633 msgid "This is the end of the Broken Sword 1 Demo" -msgstr "" +msgstr "Dette er slutten p Broken Sword 1-demoen" #: engines/sword2/animation.cpp:435 -msgid "" -"PSX cutscenes found but ScummVM has been built without RGB color support" +msgid "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" #: engines/sword2/sword2.cpp:79 @@ -2297,36 +2422,38 @@ msgid "" msgstr "" #: engines/parallaction/saveload.cpp:204 -#, fuzzy msgid "Loading game..." -msgstr "pne spill:" +msgstr "Laster spill..." #: engines/parallaction/saveload.cpp:219 -#, fuzzy msgid "Saving game..." -msgstr "Lagret spill:" +msgstr "Lagrer spill..." #: engines/parallaction/saveload.cpp:272 msgid "" -"ScummVM found that you have old savefiles 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" +"ScummVM found that you have old savefiles 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 "" +"ScummVM oppdaget at du har gamle lagrede spill for Nippon Safes som br omdpes.\n" +"De gamle navnene stttes ikke lengre, s du vil ikke vre i stand til laste de lagrede spillene,\n" +"med mindre du konverterer dem.\n" +"Trykk OK for konvertere dem n, ellers vil du bli spurt igjen neste gang du starter spillet." #: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." -msgstr "" +msgstr "ScummVM konverterte alle de lagrede spillene dine uten problemer." #: engines/parallaction/saveload.cpp:321 msgid "" -"ScummVM printed some warnings in your console window and can't guarantee all " -"your files have been converted.\n" +"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 "" +"ScummVM skrev ut noen advarsler i konsollvinduet ditt og kan ikke garantere at alle filene dine har blitt konvertert.\n" +"\n" +"Vennligst rapporter dette til teamet." #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" @@ -2338,36 +2465,30 @@ msgstr "DOSBox OPL emulator" #: audio/mididrv.cpp:209 #, c-format -msgid "" -"The selected audio device '%s' was not found (e.g. might be turned off or " -"disconnected)." -msgstr "" +msgid "The selected audio device '%s' was not found (e.g. might be turned off or disconnected)." +msgstr "Den valgte lydenheten '%s' ble ikke funnet (den kan f.eks. vre avsltt eller frakoblet)." -#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257 +#: 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 "" +msgstr "Forsker falle tilbake p den neste tilgjengelige enheten..." #: audio/mididrv.cpp:221 #, c-format -msgid "" -"The selected audio device '%s' cannot be used. See log file for more " -"information." -msgstr "" +msgid "The selected audio device '%s' cannot be used. See log file for more information." +msgstr "Den valgte lydenheten '%s' kan ikke brukes. Se logg-filen for mer informasjon." #: audio/mididrv.cpp:257 #, c-format -msgid "" -"The preferred audio device '%s' was not found (e.g. might be turned off or " -"disconnected)." -msgstr "" +msgid "The preferred audio device '%s' was not found (e.g. might be turned off or disconnected)." +msgstr "Den foretrukne lydenheten '%s' ble ikke funnet (den kan f.eks. vre avsltt eller frakoblet)." #: audio/mididrv.cpp:272 #, c-format -msgid "" -"The preferred audio device '%s' cannot be used. See log file for more " -"information." -msgstr "" +msgid "The preferred audio device '%s' cannot be used. See log file for more information." +msgstr "Den foretrukne lydenheten '%s' kan ikke brukes. Se i logg-filen for mer informasjon." #: audio/null.h:43 msgid "No music" @@ -2390,7 +2511,6 @@ msgid "C64 Audio Emulator" msgstr "C64 Lydemulator" #: audio/softsynth/mt32.cpp:293 -#, fuzzy msgid "Initializing MT-32 Emulator" msgstr "Initialiserer MT-32-Emulator" @@ -2421,7 +2541,7 @@ msgstr " (Aktiv)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr " (Blokkert)" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" @@ -2508,14 +2628,12 @@ msgid "Disable power off" msgstr "Deaktiver strmsparing" #: backends/platform/iphone/osys_events.cpp:300 -#, fuzzy msgid "Mouse-click-and-drag mode enabled." -msgstr "Touchpad-modus aktivert." +msgstr "Mus-klikk-og-dra-modus aktivert." #: backends/platform/iphone/osys_events.cpp:302 -#, fuzzy msgid "Mouse-click-and-drag mode disabled." -msgstr "Touchpad-modus deaktivert." +msgstr "Mus-klikk-og-dra-modus-deaktivert." #: backends/platform/iphone/osys_events.cpp:313 msgid "Touchpad mode enabled." @@ -2527,7 +2645,7 @@ msgstr "Touchpad-modus deaktivert." #: backends/platform/maemo/maemo.cpp:205 msgid "Click Mode" -msgstr "" +msgstr "Klikkmodus" #: backends/platform/maemo/maemo.cpp:211 #: backends/platform/symbian/src/SymbianActions.cpp:42 @@ -2538,9 +2656,8 @@ msgid "Left Click" msgstr "Venstreklikk" #: backends/platform/maemo/maemo.cpp:214 -#, fuzzy msgid "Middle Click" -msgstr "Midtre venstre gjenstand" +msgstr "Midtklikk" #: backends/platform/maemo/maemo.cpp:217 #: backends/platform/symbian/src/SymbianActions.cpp:43 @@ -2550,7 +2667,6 @@ msgid "Right Click" msgstr "Hyreklikk" #: backends/platform/sdl/macosx/appmenu_osx.mm:78 -#, fuzzy msgid "Hide ScummVM" msgstr "Skjul ScummVM" @@ -2582,26 +2698,22 @@ msgstr "Normal (ingen skalering)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 -#, fuzzy msgid "Enabled aspect ratio correction" -msgstr "Veksle aspekt-rate korrigering" +msgstr "Aspekt-rate korrigering aktivert" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 -#, fuzzy msgid "Disabled aspect ratio correction" -msgstr "Veksle aspekt-rate korrigering" +msgstr "Aspekt-rate korrigering deaktivert" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 -#, fuzzy msgid "Active graphics filter:" -msgstr "Bytt grafikkfiltre" +msgstr "Aktivt grafikkfilter:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 -#, fuzzy msgid "Windowed mode" -msgstr "Tegnemodus:" +msgstr "Vindusmodus" #: backends/graphics/opengl/opengl-graphics.cpp:135 msgid "OpenGL Normal" @@ -2616,21 +2728,20 @@ msgid "OpenGL Original" msgstr "OpenGL Original" #: backends/graphics/openglsdl/openglsdl-graphics.cpp:415 -#, fuzzy msgid "Current display mode" -msgstr "Nvrende videomodus:" +msgstr "Nvrende videomodus" #: backends/graphics/openglsdl/openglsdl-graphics.cpp:428 msgid "Current scale" -msgstr "" +msgstr "Nvrende skala" #: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 msgid "Active filter mode: Linear" -msgstr "" +msgstr "Aktiv filtermodus: Linjr" #: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 msgid "Active filter mode: Nearest" -msgstr "" +msgstr "Aktiv filtermodus: Nrmeste" #: backends/platform/symbian/src/SymbianActions.cpp:38 #: backends/platform/wince/CEActionsSmartphone.cpp:39 @@ -2714,7 +2825,7 @@ msgstr "Horisontal underscan:" #: backends/platform/wii/options.cpp:66 msgid "Vertical underscan:" -msgstr "Vertikal underscan" +msgstr "Vertikal underscan:" #: backends/platform/wii/options.cpp:71 msgid "Input" @@ -2732,11 +2843,13 @@ msgstr "GC Pad-aksellerasjon:" msgid "DVD" msgstr "DVD" -#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +#: backends/platform/wii/options.cpp:89 +#: backends/platform/wii/options.cpp:101 msgid "Status:" msgstr "Status:" -#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +#: backends/platform/wii/options.cpp:90 +#: backends/platform/wii/options.cpp:102 msgid "Unknown" msgstr "Ukjent" @@ -2813,17 +2926,15 @@ msgid "Network down" msgstr "Nettverket er nede" #: backends/platform/wii/options.cpp:178 -#, fuzzy msgid "Initializing network" msgstr "Initialiserer nettverk" #: backends/platform/wii/options.cpp:182 -#, fuzzy msgid "Timeout while initializing network" msgstr "Timeout under initialisering av nettverk" #: backends/platform/wii/options.cpp:186 -#, fuzzy, c-format +#, c-format msgid "Network not initialized (%d)" msgstr "Nettverk ikke initialisert (%d)" @@ -2916,8 +3027,7 @@ msgstr "Koble handling til h #: backends/platform/wince/wince-sdl.cpp:519 msgid "You must map a key to the 'Right Click' action to play this game" -msgstr "" -"Du m koble en tast til handlingen 'Hyreklikk' for spille dette spillet" +msgstr "Du m koble en tast til handlingen 'Hyreklikk' for spille dette spillet" #: backends/platform/wince/wince-sdl.cpp:528 msgid "Map hide toolbar action" @@ -2925,9 +3035,7 @@ msgstr "Koble skjul-verkt #: backends/platform/wince/wince-sdl.cpp:532 msgid "You must map a key to the 'Hide toolbar' action to play this game" -msgstr "" -"Du m koble en tast til 'Skjul verktylinje'-handlingen for spille dette " -"spillet" +msgstr "Du m koble en tast til 'Skjul verktylinje'-handlingen for spille dette spillet" #: backends/platform/wince/wince-sdl.cpp:541 msgid "Map Zoom Up action (optional)" @@ -2938,90 +3046,78 @@ msgid "Map Zoom Down action (optional)" msgstr "Koble handlingen Zoom Ned (valgfritt)" #: backends/platform/wince/wince-sdl.cpp:552 -msgid "" -"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" -msgstr "" -"Ikke glem koble en tast til handlingen 'Skjul verktylinje' for se hele " -"inventaret" +msgid "Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" +msgstr "Ikke glem koble en tast til handlingen 'Skjul verktylinje' for se hele inventaret" #: backends/events/default/default-events.cpp:191 -#, fuzzy msgid "Do you really want to return to the Launcher?" -msgstr "Vil du virkelig slette dette lagrede spillet?" +msgstr "Vil du virkelig returnere til oppstarteren?" #: backends/events/default/default-events.cpp:191 -#, fuzzy msgid "Launcher" -msgstr "Sl" +msgstr "Oppstarter" #: backends/events/default/default-events.cpp:213 -#, fuzzy msgid "Do you really want to quit?" -msgstr "Vil du avslutte?" +msgstr "Vil du virkelig avslutte?" #: backends/events/gph/gph-events.cpp:338 #: backends/events/gph/gph-events.cpp:381 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" -msgstr "" +msgstr "Touchskjerm 'Tapmodus' - Venstreklikk" #: backends/events/gph/gph-events.cpp:340 #: backends/events/gph/gph-events.cpp:383 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" -msgstr "" +msgstr "Touchskjerm 'Tapmodus' - Hyreklikk" #: backends/events/gph/gph-events.cpp:342 #: backends/events/gph/gph-events.cpp:385 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" -msgstr "" +msgstr "Touchskjerm 'Tapmodus' - Sveve (Ingen Klikk)" #: backends/events/gph/gph-events.cpp:362 -#, fuzzy msgid "Maximum Volume" -msgstr "Volum" +msgstr "Maksimalt Volum" #: backends/events/gph/gph-events.cpp:364 msgid "Increasing Volume" -msgstr "" +msgstr "ker volum" #: backends/events/gph/gph-events.cpp:370 -#, fuzzy msgid "Minimal Volume" -msgstr "Volum" +msgstr "Minimalt Volum" #: backends/events/gph/gph-events.cpp:372 msgid "Decreasing Volume" -msgstr "" +msgstr "Senker volum" #: backends/updates/macosx/macosx-updates.mm:65 msgid "Check for Updates..." -msgstr "" +msgstr "Sjekk for oppdateringer..." #: backends/platform/bada/form.cpp:269 -#, fuzzy msgid "Right Click Once" -msgstr "Hyreklikk" +msgstr "Hyreklikk n gang" #: backends/platform/bada/form.cpp:277 -#, fuzzy msgid "Move Only" -msgstr "Tale" +msgstr "Kun Beveg" #: backends/platform/bada/form.cpp:291 msgid "Escape Key" -msgstr "" +msgstr "ESC-tast" #: backends/platform/bada/form.cpp:296 -#, fuzzy msgid "Game Menu" -msgstr "Spill" +msgstr "Spillmeny" #: backends/platform/bada/form.cpp:301 -#, fuzzy msgid "Show Keypad" -msgstr "Vis tastatur" +msgstr "Vis talltastatur" #: backends/platform/bada/form.cpp:309 msgid "Control Mouse" @@ -3029,31 +3125,30 @@ msgstr "" #: backends/events/maemosdl/maemosdl-events.cpp:192 msgid "Clicking Enabled" -msgstr "" +msgstr "Klikking aktivert" #: backends/events/maemosdl/maemosdl-events.cpp:192 msgid "Clicking Disabled" -msgstr "" +msgstr "Klikking deaktivert" #~ msgid "Hercules Green" #~ msgstr "Hercules Grnn" #~ msgid "Hercules Amber" #~ msgstr "Hercules Oransje" - #~ msgctxt "lowres" + #~ msgid "Hercules Green" #~ msgstr "Hercules Grnn" - #~ msgctxt "lowres" + #~ msgid "Hercules Amber" #~ msgstr "Hercules Oransje" -#, fuzzy #~ msgid "Save game failed!" #~ msgstr "Lagret spill:" - #~ msgctxt "lowres" + #~ msgid "Add Game..." #~ msgstr "Legg til spill..." -- cgit v1.2.3 From 097c61955189c8dc598acb6bb328074950d7fa62 Mon Sep 17 00:00:00 2001 From: Einar Johan Trøan Sømåen Date: Wed, 4 Jul 2012 02:27:39 +0200 Subject: CREDITS: Drop my middle initial to stay within the size-limit for AUTHORS, and add handle. --- AUTHORS | 4 ++-- devtools/credits.pl | 4 ++-- gui/credits.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/AUTHORS b/AUTHORS index 9f71be9467..387c602b84 100644 --- a/AUTHORS +++ b/AUTHORS @@ -418,10 +418,10 @@ Other contributions Matteo Angelino Norwegian (Bokmaal): - Einar Johan T. Somaae + Einar Johan Somaaen Norwegian (Nynorsk): - Einar Johan T. Somaae + Einar Johan Somaaen Polish: GrajPoPolsku.pl Team diff --git a/devtools/credits.pl b/devtools/credits.pl index b3a506125f..411ec3c10d 100755 --- a/devtools/credits.pl +++ b/devtools/credits.pl @@ -942,10 +942,10 @@ begin_credits("Credits"); add_person("Matteo Angelino", "Maff", ""); end_section(); begin_section("Norwegian (Bokmål)"); - add_person("Einar Johan T. Sømåen", "", ""); + add_person("Einar Johan Sømåen", "somaen", ""); end_section(); begin_section("Norwegian (Nynorsk)"); - add_person("Einar Johan T. Sømåen", "", ""); + add_person("Einar Johan Sømåen", "somaen", ""); end_section(); begin_section("Polish"); add_person("GrajPoPolsku.pl Team", "", ""); diff --git a/gui/credits.h b/gui/credits.h index ecfe280d20..7226864543 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -486,10 +486,10 @@ static const char *credits[] = { "C0""Matteo Angelino", "", "C1""Norwegian (Bokm\345l)", -"C0""Einar Johan T. S\370m\345en", +"C0""Einar Johan S\370m\345en", "", "C1""Norwegian (Nynorsk)", -"C0""Einar Johan T. S\370m\345en", +"C0""Einar Johan S\370m\345en", "", "C1""Polish", "C0""GrajPoPolsku.pl Team", -- cgit v1.2.3 From efb1d96d98e7bc856522772bbcdb266e11e26a29 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Wed, 4 Jul 2012 02:13:40 +0100 Subject: TEENAGENT: Fix erroneous files in savegame listing. This was achieved by making the detection pattern stricter to avoid matching the dat file or other extraneous files in the savegame path. This fixes bug #3539774 "TEENAGENT : teenagent.dat considered as a savegame". Also did some minor formatting and string function usage cleanup. --- engines/teenagent/detection.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/engines/teenagent/detection.cpp b/engines/teenagent/detection.cpp index f516ee06c1..2de6f49c44 100644 --- a/engines/teenagent/detection.cpp +++ b/engines/teenagent/detection.cpp @@ -80,7 +80,7 @@ static const ADGameDescription teenAgentGameDescriptions[] = { }; enum { - MAX_SAVES = 20 + MAX_SAVES = 20 }; class TeenAgentMetaEngine : public AdvancedMetaEngine { @@ -123,16 +123,15 @@ public: virtual SaveStateList listSaves(const char *target) const { Common::String pattern = target; - pattern += ".*"; + pattern += ".??"; Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); Common::sort(filenames.begin(), filenames.end()); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { - int slot; - const char *ext = strrchr(file->c_str(), '.'); - if (ext && (slot = atoi(ext + 1)) >= 0 && slot < MAX_SAVES) { + int slot = atoi(file->c_str() + file->size() - 2); + if (slot >= 0 && slot < MAX_SAVES) { Common::ScopedPtr in(g_system->getSavefileManager()->openForLoading(*file)); if (!in) continue; -- cgit v1.2.3 From d61c5ae529e99c641edbde152f8f264073a9cdce Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Jul 2012 11:55:09 +0300 Subject: SCI: make g_base_opcode_formats and SciOpcodes a bit more readable --- engines/sci/engine/kernel_tables.h | 56 ++++++++++++++++++++++++-------------- engines/sci/engine/vm.h | 4 +++ 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 04b221d2b0..c4443c92d3 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -1132,57 +1132,73 @@ static const char *const sci21_default_knames[] = { // Base set of opcode formats. They're copied and adjusted slightly in // script_adjust_opcode_format depending on SCI version. static const opcode_format g_base_opcode_formats[128][4] = { - /*00*/ + // 00 - 03 / bnot, add, sub, mul {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*04*/ + // 04 - 07 / div, mod, shr, shl {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*08*/ + // 08 - 0B / xor, and, or, neg {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*0C*/ + // 0C - 0F / not, eq, ne, gt {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*10*/ + // 10 - 13 / ge, lt, le, ugt {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*14*/ + // 14 - 17 / uge, ult, ule, bt {Script_None}, {Script_None}, {Script_None}, {Script_SRelative}, - /*18*/ + // 18 - 1B / bnt, jmp, ldi, push {Script_SRelative}, {Script_SRelative}, {Script_SVariable}, {Script_None}, - /*1C*/ + // 1C - 1F / pushi, toss, dup, link {Script_SVariable}, {Script_None}, {Script_None}, {Script_Variable}, - /*20*/ + // 20 - 23 / call, callk, callb, calle {Script_SRelative, Script_Byte}, {Script_Variable, Script_Byte}, {Script_Variable, Script_Byte}, {Script_Variable, Script_SVariable, Script_Byte}, - /*24 (24=ret)*/ + // 24 - 27 / ret, send, dummy, dummy {Script_End}, {Script_Byte}, {Script_Invalid}, {Script_Invalid}, - /*28*/ + // 28 - 2B / class, dummy, self, super {Script_Variable}, {Script_Invalid}, {Script_Byte}, {Script_Variable, Script_Byte}, - /*2C*/ + // 2C - 2F / rest, lea, selfID, dummy {Script_SVariable}, {Script_SVariable, Script_Variable}, {Script_None}, {Script_Invalid}, - /*30*/ + // 30 - 33 / pprev, pToa, aTop, pTos {Script_None}, {Script_Property}, {Script_Property}, {Script_Property}, - /*34*/ + // 34 - 37 / sTop, ipToa, dpToa, ipTos {Script_Property}, {Script_Property}, {Script_Property}, {Script_Property}, - /*38*/ + // 38 - 3B / dpTos, lofsa, lofss, push0 {Script_Property}, {Script_SRelative}, {Script_SRelative}, {Script_None}, - /*3C*/ + // 3C - 3F / push1, push2, pushSelf, line {Script_None}, {Script_None}, {Script_None}, {Script_Word}, - /*40-4F*/ + // ------------------------------------------------------------------------ + // 40 - 43 / lag, lal, lat, lap {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 44 - 47 / lsg, lsl, lst, lsp {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 48 - 4B / lagi, lali, lati, lapi {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 4C - 4F / lsgi, lsli, lsti, lspi {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, - /*50-5F*/ + // ------------------------------------------------------------------------ + // 50 - 53 / sag, sal, sat, sap {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 54 - 57 / ssg, ssl, sst, ssp {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 58 - 5B / sagi, sali, sati, sapi {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 5C - 5F / ssgi, ssli, ssti, sspi {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, - /*60-6F*/ + // ------------------------------------------------------------------------ + // 60 - 63 / plusag, plusal, plusat, plusap {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 64 - 67 / plussg, plussl, plusst, plussp {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 68 - 6B / plusagi, plusali, plusati, plusapi {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 6C - 6F / plussgi, plussli, plussti, plusspi {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, - /*70-7F*/ + // ------------------------------------------------------------------------ + // 70 - 73 / minusag, minusal, minusat, minusap {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 74 - 77 / minussg, minussl, minusst, minussp {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 78 - 7B / minusagi, minusali, minusati, minusapi {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param}, + // 7C - 7F / minussgi, minussli, minussti, minusspi {Script_Global}, {Script_Local}, {Script_Temp}, {Script_Param} }; #undef END diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index a0fd6689df..8b38faa013 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -202,6 +202,7 @@ enum SciOpcodes { op_push2 = 0x3d, // 061 op_pushSelf = 0x3e, // 062 op_line = 0x3f, // 063 + // op_lag = 0x40, // 064 op_lal = 0x41, // 065 op_lat = 0x42, // 066 @@ -218,6 +219,7 @@ enum SciOpcodes { op_lsli = 0x4d, // 077 op_lsti = 0x4e, // 078 op_lspi = 0x4f, // 079 + // op_sag = 0x50, // 080 op_sal = 0x51, // 081 op_sat = 0x52, // 082 @@ -234,6 +236,7 @@ enum SciOpcodes { op_ssli = 0x5d, // 093 op_ssti = 0x5e, // 094 op_sspi = 0x5f, // 095 + // op_plusag = 0x60, // 096 op_plusal = 0x61, // 097 op_plusat = 0x62, // 098 @@ -250,6 +253,7 @@ enum SciOpcodes { op_plussli = 0x6d, // 109 op_plussti = 0x6e, // 110 op_plusspi = 0x6f, // 111 + // op_minusag = 0x70, // 112 op_minusal = 0x71, // 113 op_minusat = 0x72, // 114 -- cgit v1.2.3 From e9261cbdd11082dcc46cd60dc60a92c9c10e987c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 5 Jul 2012 00:46:28 +0200 Subject: WIN32: Also embed scummclassic.zip in the executable. This is required to have proper translation support with the classic theme without having an external scummclassic.zip. --- dists/scummvm.rc | 1 + dists/scummvm.rc.in | 1 + 2 files changed, 2 insertions(+) diff --git a/dists/scummvm.rc b/dists/scummvm.rc index e5d28d089a..6f24b8797d 100644 --- a/dists/scummvm.rc +++ b/dists/scummvm.rc @@ -14,6 +14,7 @@ IDI_COUNT ICON DISCARDABLE "icons/count.ico" ID_GDF_XML DATA "dists/win32/scummvm.gdf.xml" +scummclassic.zip FILE "gui/themes/scummclassic.zip" scummmodern.zip FILE "gui/themes/scummmodern.zip" #ifdef USE_TRANSLATION translations.dat FILE "gui/themes/translations.dat" diff --git a/dists/scummvm.rc.in b/dists/scummvm.rc.in index 6969e0b2a7..a874b98514 100644 --- a/dists/scummvm.rc.in +++ b/dists/scummvm.rc.in @@ -14,6 +14,7 @@ IDI_COUNT ICON DISCARDABLE "icons/count.ico" ID_GDF_XML DATA "dists/win32/scummvm.gdf.xml" +scummclassic.zip FILE "gui/themes/scummclassic.zip" scummmodern.zip FILE "gui/themes/scummmodern.zip" #ifdef USE_TRANSLATION translations.dat FILE "gui/themes/translations.dat" -- cgit v1.2.3 From fb215929efaefdf0b75521caab8a86e93181c5b2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Jul 2012 13:42:00 +0300 Subject: SCI: Some updates to SCI32 kernel graphics functions - Added a stub for kSetScroll, which sets the target picture immediately for now - Added an initial stub of kPalCycle (doesn't work correctly yet) - Adjusted the signatures of kUpdateLine and kDeleteLine for LSL6 - Unmapped kSetHotRectangles again, with updated information on how it is used in Phantasmagoria --- engines/sci/engine/kernel.h | 2 + engines/sci/engine/kernel_tables.h | 16 +++---- engines/sci/engine/kgraphics32.cpp | 90 ++++++++++++++++++++++++++++++++++++++ engines/sci/engine/state.cpp | 3 ++ engines/sci/engine/state.h | 2 + engines/sci/graphics/frameout.cpp | 8 ++++ 6 files changed, 113 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index c3fcdd06e7..441ea2624f 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -436,6 +436,8 @@ reg_t kObjectIntersect(EngineState *s, int argc, reg_t *argv); reg_t kEditText(EngineState *s, int argc, reg_t *argv); reg_t kMakeSaveCatName(EngineState *s, int argc, reg_t *argv); reg_t kMakeSaveFileName(EngineState *s, int argc, reg_t *argv); +reg_t kSetScroll(EngineState *s, int argc, reg_t *argv); +reg_t kPalCycle(EngineState *s, int argc, reg_t *argv); // SCI2.1 Kernel Functions reg_t kText(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index c4443c92d3..825ec90fa9 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -517,10 +517,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(EditText), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(MakeSaveCatName), SIG_EVERYWHERE, "rr", NULL, NULL }, { MAP_CALL(MakeSaveFileName), SIG_EVERYWHERE, "rri", NULL, NULL }, - - // SCI2 unmapped functions - TODO! - - // PalCycle - called by Game::newRoom. Related to RemapColors. + { MAP_CALL(SetScroll), SIG_EVERYWHERE, "oiiiii(i)", NULL, NULL }, + { MAP_CALL(PalCycle), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // SCI2 Empty functions @@ -587,8 +585,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Font), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, { MAP_CALL(Bitmap), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(AddLine), SIG_EVERYWHERE, "oiiiiiiiii", NULL, NULL }, - { MAP_CALL(UpdateLine), SIG_EVERYWHERE, "roiiiiiiiii", NULL, NULL }, - { MAP_CALL(DeleteLine), SIG_EVERYWHERE, "ro", NULL, NULL }, + { MAP_CALL(UpdateLine), SIG_EVERYWHERE, "[r0]oiiiiiiiii", NULL, NULL }, + { MAP_CALL(DeleteLine), SIG_EVERYWHERE, "[r0]o", NULL, NULL }, // SCI2.1 Empty Functions @@ -624,8 +622,6 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_DUMMY(WinDLL), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(DeletePic), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(GetSierraProfileString), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - // SetHotRectangles is used by Phantasmagoria 1, script 64981 (a debug script) - { MAP_DUMMY(SetHotRectangles), SIG_EVERYWHERE, "(.*)", NULL, NULL }, // Unused / debug functions in the in-between SCI2.1 interpreters { MAP_DUMMY(PreloadResource), SIG_EVERYWHERE, "(.*)", NULL, NULL }, @@ -635,6 +631,10 @@ static SciKernelMapEntry s_kernelMap[] = { // SCI2.1 unmapped functions - TODO! + // SetHotRectangles - used by Phantasmagoria 1, script 64981 (used in the chase scene) + // The idea, if I understand correctly, is that the engine generates events + // of a special HotRect type continuously when the mouse is on that rectangle + // MovePlaneItems - used by SQ6 to scroll through the inventory via the up/down buttons // SetPalStyleRange - 2 integer parameters, start and end. All styles from start-end // (inclusive) are set to 0 diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 072d4df021..16e54a5429 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -637,6 +637,96 @@ reg_t kDeleteLine(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } +reg_t kSetScroll(EngineState *s, int argc, reg_t *argv) { + // Called in the intro of LSL6 hires (room 110) + // The end effect of this is the same as the old screen scroll transition + + // 7 parameters + reg_t planeObject = argv[0]; + //int16 x = argv[1].toSint16(); + //int16 y = argv[2].toSint16(); + uint16 pictureId = argv[3].toUint16(); + // param 4: int (0 in LSL6, probably scroll direction? The picture in LSL6 scrolls down) + // param 5: int (first call is 1, then the subsequent one is 0 in LSL6) + // param 6: optional int (0 in LSL6) + + // Set the new picture directly for now + //writeSelectorValue(s->_segMan, planeObject, SELECTOR(left), x); + //writeSelectorValue(s->_segMan, planeObject, SELECTOR(top), y); + writeSelectorValue(s->_segMan, planeObject, SELECTOR(picture), pictureId); + // and update our draw list + g_sci->_gfxFrameout->kernelUpdatePlane(planeObject); + + // TODO + return kStub(s, argc, argv); +} + +reg_t kPalCycle(EngineState *s, int argc, reg_t *argv) { + // Examples: GK1 room 480 (Bayou ritual), LSL6 room 100 (title screen) + + switch (argv[0].toUint16()) { + case 0: { // Palette animation initialization + // 3 or 4 extra params + // Case 1 sends fromColor and speed again, so we don't need them here. + // Only toColor is stored + //uint16 fromColor = argv[1].toUint16(); + s->_palCycleToColor = argv[2].toUint16(); + //uint16 speed = argv[3].toUint16(); + + // Invalidate the picture, so that the palette steps calls (case 1 + // below) can update its palette without it being overwritten by the + // view/picture palettes. + g_sci->_gfxScreen->_picNotValid = 1; + + // TODO: The fourth optional parameter is an unknown integer, and is 0 by default + if (argc == 5) { + // When this variant is used, picNotValid doesn't seem to be set + // (e.g. GK1 room 480). In this case, the animation step calls are + // not made, so perhaps this signifies the palette cycling steps + // to make. + // GK1 sets this to 6 (6 palette steps?) + g_sci->_gfxScreen->_picNotValid = 0; + } + kStub(s, argc, argv); + } + break; + case 1: { // Palette animation step + // This is the same as the old kPaletteAnimate call, with 1 set of colors. + // The end color is set up during initialization in case 0 above. + + // 1 or 2 extra params + uint16 fromColor = argv[1].toUint16(); + uint16 speed = (argc == 2) ? 1 : argv[2].toUint16(); + // TODO: For some reason, this doesn't set the color correctly + // (e.g. LSL6 intro, room 100, Sierra logo) + if (g_sci->_gfxPalette->kernelAnimate(fromColor, s->_palCycleToColor, speed)) + g_sci->_gfxPalette->kernelAnimateSet(); + } + // No kStub() call here, as this gets called loads of times, like kPaletteAnimate + break; + // case 2 hasn't been encountered + // case 3 hasn't been encountered + case 4: // reset any palette cycling and make the picture valid again + // Gets called when changing rooms and after palette cycling animations finish + // 0 or 1 extra params + if (argc == 1) { + g_sci->_gfxScreen->_picNotValid = 0; + // TODO: This also seems to perform more steps + } else { + // The variant with the 1 extra param resets remapping to base + // TODO + } + kStub(s, argc, argv); + break; + default: + // TODO + kStub(s, argc, argv); + break; + } + + return s->r_acc; +} + #endif } // End of namespace Sci diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 94a3fe3ae5..0f0c8dcd66 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -122,8 +122,11 @@ void EngineState::reset(bool isRestoring) { _videoState.reset(); _syncedAudioOptions = false; + _vmdPalStart = 0; _vmdPalEnd = 256; + + _palCycleToColor = 255; } void EngineState::speedThrottler(uint32 neededSleep) { diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 9ae6299d83..81090876c7 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -199,6 +199,8 @@ public: uint16 _vmdPalStart, _vmdPalEnd; bool _syncedAudioOptions; + uint16 _palCycleToColor; + /** * Resets the engine state. */ diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 5b857fe3d8..31ad7a50aa 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -294,6 +294,10 @@ reg_t GfxFrameout::addPlaneLine(reg_t object, Common::Point startPoint, Common:: } void GfxFrameout::updatePlaneLine(reg_t object, reg_t hunkId, Common::Point startPoint, Common::Point endPoint, byte color, byte priority, byte control) { + // Check if we're asked to update a line that was never added + if (object.isNull()) + return; + for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); ++it) { if (it->object == object) { for (PlaneLineList::iterator it2 = it->lines.begin(); it2 != it->lines.end(); ++it2) { @@ -311,6 +315,10 @@ void GfxFrameout::updatePlaneLine(reg_t object, reg_t hunkId, Common::Point star } void GfxFrameout::deletePlaneLine(reg_t object, reg_t hunkId) { + // Check if we're asked to delete a line that was never added (happens during the intro of LSL6) + if (object.isNull()) + return; + for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); ++it) { if (it->object == object) { for (PlaneLineList::iterator it2 = it->lines.begin(); it2 != it->lines.end(); ++it2) { -- cgit v1.2.3 From 4ced5ccf306450bc4b0bd6afd66b5bc7bec1e814 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Jul 2012 13:58:04 +0300 Subject: SCI: Handle calls from MessageState::outputString() to arrays This happens during the intro of LSL6 hires (room 110) --- engines/sci/engine/message.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp index cddd01e10c..a92d572d35 100644 --- a/engines/sci/engine/message.cpp +++ b/engines/sci/engine/message.cpp @@ -400,11 +400,21 @@ Common::String MessageState::processString(const char *s) { void MessageState::outputString(reg_t buf, const Common::String &str) { #ifdef ENABLE_SCI32 if (getSciVersion() >= SCI_VERSION_2) { - SciString *sciString = _segMan->lookupString(buf); - sciString->setSize(str.size() + 1); - for (uint32 i = 0; i < str.size(); i++) - sciString->setValue(i, str.c_str()[i]); - sciString->setValue(str.size(), 0); + if (_segMan->getSegmentType(buf.getSegment()) == SEG_TYPE_STRING) { + SciString *sciString = _segMan->lookupString(buf); + sciString->setSize(str.size() + 1); + for (uint32 i = 0; i < str.size(); i++) + sciString->setValue(i, str.c_str()[i]); + sciString->setValue(str.size(), 0); + } else if (_segMan->getSegmentType(buf.getSegment()) == SEG_TYPE_ARRAY) { + // Happens in the intro of LSL6, we are asked to write the string + // into an array + SciArray *sciString = _segMan->lookupArray(buf); + sciString->setSize(str.size() + 1); + for (uint32 i = 0; i < str.size(); i++) + sciString->setValue(i, make_reg(0, str.c_str()[i])); + sciString->setValue(str.size(), NULL_REG); + } } else { #endif SegmentRef buffer_r = _segMan->dereference(buf); -- cgit v1.2.3 From 112f03390d308af60d9c5f5e9f29c30988d2e968 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Jul 2012 14:05:26 +0300 Subject: SCI: Fix typo --- engines/sci/graphics/frameout.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 31ad7a50aa..20b8a241aa 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -295,7 +295,7 @@ reg_t GfxFrameout::addPlaneLine(reg_t object, Common::Point startPoint, Common:: void GfxFrameout::updatePlaneLine(reg_t object, reg_t hunkId, Common::Point startPoint, Common::Point endPoint, byte color, byte priority, byte control) { // Check if we're asked to update a line that was never added - if (object.isNull()) + if (hunkId.isNull()) return; for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); ++it) { @@ -316,7 +316,7 @@ void GfxFrameout::updatePlaneLine(reg_t object, reg_t hunkId, Common::Point star void GfxFrameout::deletePlaneLine(reg_t object, reg_t hunkId) { // Check if we're asked to delete a line that was never added (happens during the intro of LSL6) - if (object.isNull()) + if (hunkId.isNull()) return; for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); ++it) { -- cgit v1.2.3 From b1cc34a080ff31fb22ab466624a99c0cdaeb51c1 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 4 Jul 2012 23:18:29 +0200 Subject: CGE: Remove hack used to store keycode in CGEEvent --- engines/cge/cge_main.cpp | 10 +++++----- engines/cge/cge_main.h | 4 ++-- engines/cge/events.cpp | 17 ++++++++++------- engines/cge/events.h | 1 + engines/cge/vga13h.h | 3 ++- engines/cge/vmenu.cpp | 4 ++-- engines/cge/vmenu.h | 2 +- 7 files changed, 23 insertions(+), 18 deletions(-) diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index fbe37e58a0..a70e32de7e 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -518,8 +518,8 @@ Square::Square(CGEEngine *vm) : Sprite(vm, NULL), _vm(vm) { setShapeList(MB); } -void Square::touch(uint16 mask, int x, int y) { - Sprite::touch(mask, x, y); +void Square::touch(uint16 mask, int x, int y, Common::KeyCode keyCode) { + Sprite::touch(mask, x, y, keyCode); if (mask & kMouseLeftUp) { _vm->XZ(_x + x, _y + y).cell() = 0; _vm->_commandHandlerTurbo->addCommand(kCmdKill, -1, 0, this); @@ -758,11 +758,11 @@ void System::funTouch() { _funDel = n; } -void System::touch(uint16 mask, int x, int y) { +void System::touch(uint16 mask, int x, int y, Common::KeyCode keyCode) { funTouch(); if (mask & kEventKeyb) { - if (x == Common::KEYCODE_ESCAPE) { + if (keyCode == Common::KEYCODE_ESCAPE) { // The original was calling keyClick() // The sound is uselessly annoying and noisy, so it has been removed _vm->killText(); @@ -926,7 +926,7 @@ void CGEEngine::optionTouch(int opt, uint16 mask) { } #pragma argsused -void Sprite::touch(uint16 mask, int x, int y) { +void Sprite::touch(uint16 mask, int x, int y, Common::KeyCode keyCode) { _vm->_sys->funTouch(); if ((mask & kEventAttn) != 0) diff --git a/engines/cge/cge_main.h b/engines/cge/cge_main.h index b98fec531d..bde8306f36 100644 --- a/engines/cge/cge_main.h +++ b/engines/cge/cge_main.h @@ -92,7 +92,7 @@ public: void setPal(); void funTouch(); - virtual void touch(uint16 mask, int x, int y); + virtual void touch(uint16 mask, int x, int y, Common::KeyCode keyCode); void tick(); private: CGEEngine *_vm; @@ -101,7 +101,7 @@ private: class Square : public Sprite { public: Square(CGEEngine *vm); - virtual void touch(uint16 mask, int x, int y); + virtual void touch(uint16 mask, int x, int y, Common::KeyCode keyCode); private: CGEEngine *_vm; }; diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp index 98a39a947b..1530c870ef 100644 --- a/engines/cge/events.cpp +++ b/engines/cge/events.cpp @@ -135,9 +135,11 @@ void Keyboard::newKeyboard(Common::Event &event) { if ((event.type == Common::EVENT_KEYDOWN) && (_client)) { CGEEvent &evt = _vm->_eventManager->getNextEvent(); - evt._x = event.kbd.keycode; // Keycode - evt._mask = kEventKeyb; // Event mask - evt._spritePtr = _client; // Sprite pointer + evt._x = 0; + evt._y = 0; + evt._keyCode = event.kbd.keycode; // Keycode + evt._mask = kEventKeyb; // Event mask + evt._spritePtr = _client; // Sprite pointer } } @@ -204,6 +206,7 @@ void Mouse::newMouse(Common::Event &event) { CGEEvent &evt = _vm->_eventManager->getNextEvent(); evt._x = event.mouse.x; evt._y = event.mouse.y; + evt._keyCode = Common::KEYCODE_INVALID; evt._spritePtr = _vm->spriteAt(evt._x, evt._y); switch (event.type) { @@ -269,7 +272,7 @@ void EventManager::handleEvents() { CGEEvent e = _eventQueue[_eventQueueTail]; if (e._mask) { if (_vm->_mouse->_hold && e._spritePtr != _vm->_mouse->_hold) - _vm->_mouse->_hold->touch(e._mask | kEventAttn, e._x - _vm->_mouse->_hold->_x, e._y - _vm->_mouse->_hold->_y); + _vm->_mouse->_hold->touch(e._mask | kEventAttn, e._x - _vm->_mouse->_hold->_x, e._y - _vm->_mouse->_hold->_y, e._keyCode); // update mouse cursor position if (e._mask & kMouseRoll) @@ -278,11 +281,11 @@ void EventManager::handleEvents() { // activate current touched SPRITE if (e._spritePtr) { if (e._mask & kEventKeyb) - e._spritePtr->touch(e._mask, e._x, e._y); + e._spritePtr->touch(e._mask, e._x, e._y, e._keyCode); else - e._spritePtr->touch(e._mask, e._x - e._spritePtr->_x, e._y - e._spritePtr->_y); + e._spritePtr->touch(e._mask, e._x - e._spritePtr->_x, e._y - e._spritePtr->_y, e._keyCode); } else if (_vm->_sys) - _vm->_sys->touch(e._mask, e._x, e._y); + _vm->_sys->touch(e._mask, e._x, e._y, e._keyCode); if (e._mask & kMouseLeftDown) { _vm->_mouse->_hold = e._spritePtr; diff --git a/engines/cge/events.h b/engines/cge/events.h index 6bbd52e4a5..522aa67905 100644 --- a/engines/cge/events.h +++ b/engines/cge/events.h @@ -70,6 +70,7 @@ struct CGEEvent { uint16 _mask; uint16 _x; uint16 _y; + Common::KeyCode _keyCode; Sprite *_spritePtr; }; diff --git a/engines/cge/vga13h.h b/engines/cge/vga13h.h index beca19f667..a816f7756f 100644 --- a/engines/cge/vga13h.h +++ b/engines/cge/vga13h.h @@ -29,6 +29,7 @@ #define CGE_VGA13H_H #include "common/serializer.h" +#include "common/events.h" #include "graphics/surface.h" #include "cge/general.h" #include "cge/bitmap.h" @@ -146,7 +147,7 @@ public: void step(int nr = -1); Seq *setSeq(Seq *seq); CommandHandler::Command *snList(SnList type); - virtual void touch(uint16 mask, int x, int y); + virtual void touch(uint16 mask, int x, int y, Common::KeyCode keyCode); virtual void tick(); void sync(Common::Serializer &s); private: diff --git a/engines/cge/vmenu.cpp b/engines/cge/vmenu.cpp index a317a765d4..84b557f4a6 100644 --- a/engines/cge/vmenu.cpp +++ b/engines/cge/vmenu.cpp @@ -89,11 +89,11 @@ Vmenu::~Vmenu() { #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) -void Vmenu::touch(uint16 mask, int x, int y) { +void Vmenu::touch(uint16 mask, int x, int y, Common::KeyCode keyCode) { if (!_items) return; - Sprite::touch(mask, x, y); + Sprite::touch(mask, x, y, keyCode); y -= kTextVMargin - 1; int n = 0; diff --git a/engines/cge/vmenu.h b/engines/cge/vmenu.h index 89ef7a9484..928b48f11c 100644 --- a/engines/cge/vmenu.h +++ b/engines/cge/vmenu.h @@ -58,7 +58,7 @@ public: MenuBar *_bar; Vmenu(CGEEngine *vm, Choice *list, int x, int y); ~Vmenu(); - virtual void touch(uint16 mask, int x, int y); + virtual void touch(uint16 mask, int x, int y, Common::KeyCode keyCode); private: char *_vmgt; CGEEngine *_vm; -- cgit v1.2.3 From 14a59b97b289416bc124985e7b5f3b45d8e7a7e0 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 4 Jul 2012 23:36:11 +0200 Subject: CGE: Silent some CppCheck warnings --- engines/cge/bitmap.cpp | 3 +++ engines/cge/vmenu.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/cge/bitmap.cpp b/engines/cge/bitmap.cpp index 309b89bdda..4f85957b3d 100644 --- a/engines/cge/bitmap.cpp +++ b/engines/cge/bitmap.cpp @@ -123,12 +123,15 @@ Bitmap::~Bitmap() { Bitmap &Bitmap::operator=(const Bitmap &bmp) { debugC(1, kCGEDebugBitmap, "&Bitmap::operator ="); + if (this == &bmp) + return *this; uint8 *v0 = bmp._v; _w = bmp._w; _h = bmp._h; _m = NULL; _map = 0; + _vm = bmp._vm; delete[] _v; if (v0 == NULL) { diff --git a/engines/cge/vmenu.cpp b/engines/cge/vmenu.cpp index 84b557f4a6..910e54d267 100644 --- a/engines/cge/vmenu.cpp +++ b/engines/cge/vmenu.cpp @@ -63,7 +63,7 @@ Vmenu *Vmenu::_addr = NULL; int Vmenu::_recent = -1; Vmenu::Vmenu(CGEEngine *vm, Choice *list, int x, int y) - : Talk(vm, VMGather(list), kTBRect), _menu(list), _bar(NULL), _vm(vm) { + : Talk(vm, VMGather(list), kTBRect), _menu(list), _bar(NULL), _vmgt(NULL), _vm(vm) { Choice *cp; _addr = this; -- cgit v1.2.3 From 75137862967cd18a87dec16a6a322f9f97d54202 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Jul 2012 12:11:12 +0300 Subject: SCI: Add a hack to handle the internal script resolution in Phantasmagoria --- engines/sci/graphics/frameout.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 20b8a241aa..defc55edb2 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -131,6 +131,20 @@ void GfxFrameout::kernelAddPlane(reg_t object) { tmpRunningWidth = 320; tmpRunningHeight = 200; } + + // HACK: Game scripts in Phantasmagoria 1 seem to use a very odd internal + // resolution, or some other extra calculation is taking place. + // Changing the internal script dimensions to these odd values fixes + // object positioning, but makes the interface picture slightly bigger, + // thus there is a small gap between the room picture and the interface + // edges, plus a couple of pixels of the picture are cut off in the + // bottom. + // FIXME: Find how to properly handle the script dimensions in + // Phantasmagoria. This can't be right. + if (g_sci->getGameId() == GID_PHANTASMAGORIA) { + tmpRunningWidth = 325; + tmpRunningHeight = 213; + } _coordAdjuster->setScriptsResolution(tmpRunningWidth, tmpRunningHeight); } -- cgit v1.2.3 From e4378d5bac1b2467190e21333a037a6af34bba52 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Jul 2012 13:17:04 +0300 Subject: SCI: Better handling for Phantasmagoria's odd screen size Still not right, as the width isn't set --- engines/sci/graphics/frameout.cpp | 13 +++---------- engines/sci/graphics/screen.cpp | 7 +++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index defc55edb2..b13c7f4dce 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -132,18 +132,11 @@ void GfxFrameout::kernelAddPlane(reg_t object) { tmpRunningHeight = 200; } - // HACK: Game scripts in Phantasmagoria 1 seem to use a very odd internal - // resolution, or some other extra calculation is taking place. - // Changing the internal script dimensions to these odd values fixes - // object positioning, but makes the interface picture slightly bigger, - // thus there is a small gap between the room picture and the interface - // edges, plus a couple of pixels of the picture are cut off in the - // bottom. - // FIXME: Find how to properly handle the script dimensions in - // Phantasmagoria. This can't be right. + // HACK: Phantasmagoria 1 sets a window size of 630x450. + // We can't set a width of 630, as that messes up the pitch, so we hack + // the internal script width here if (g_sci->getGameId() == GID_PHANTASMAGORIA) { tmpRunningWidth = 325; - tmpRunningHeight = 213; } _coordAdjuster->setScriptsResolution(tmpRunningWidth, tmpRunningHeight); diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 4020518b72..3030fb4386 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -97,6 +97,13 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { break; } + // Phantasmagoria 1 sets a window area of 630x450 + if (g_sci->getGameId() == GID_PHANTASMAGORIA) { + // TODO: Also set width to 630 (can't be set right now, as it messes up + // the pitch). For now, a hack has been placed in GfxFrameout::kernelAddPlane() + _height = 450; + } + _displayPixels = _displayWidth * _displayHeight; _visualScreen = (byte *)calloc(_pixels, 1); _priorityScreen = (byte *)calloc(_pixels, 1); -- cgit v1.2.3 From 47499fa8a0da90ecb348a7feda2196bba3ea8a13 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 7 Jul 2012 01:10:21 +0100 Subject: DOCS: Update Swedish README from patch #3539543 --- doc/se/LasMig | 160 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 136 insertions(+), 24 deletions(-) diff --git a/doc/se/LasMig b/doc/se/LasMig index 656210883f..9ac79b4c35 100644 --- a/doc/se/LasMig +++ b/doc/se/LasMig @@ -1,5 +1,4 @@ ScummVM LÄS MIG -Senast uppdaterad: $Date$ ------------------------------------------------------------------------ För ytterligare information, kompatibilitetslistor, donationsdetaljer, den senaste programversionen, utvecklingsrapporter med mera, var god besök ScummVM:s hemsida på http://www.scummvm.org/ @@ -55,6 +54,8 @@ Innehåll: * 7.8 Att använda komprimerade ljudfiler (MP3, Ogg Vorbis, Flac) * 7.9 Uppspelningsfrekvens 8.0) Konfigurationsfilen + * 8.1 Igenkända nyckelord + * 8.2 Spelinställningar som kan aktiveras via användargränssnittet 9.0) Kompilering @@ -184,13 +185,18 @@ AGOS-spel från Adventuresoft/Horrorsoft: The Feeble Files [feeble] GOB-spel från Coktel Vision: + Bambou le sauveur de la jungle [bambou] Bargon Attack [bargon] + Fascination [fascination] + Geisha [geisha] Gobliiins [gob1] Gobliins 2 [gob2] Goblins 3 [gob3] Lost in Time [lostintime] + Once Upon A Time: Little Red Riding Hood [littlered] The Bizarre Adventures of Woodruff and the Schnibble [woodruff] + Urban Runner [urban] Ween: The Prophecy [ween] MADE-spel från Activision: @@ -221,6 +227,7 @@ MADE-spel från Activision: SCUMM-spel från Humongous Entertainment: Backyard Baseball [baseball] Backyard Baseball 2001 [baseball2001] + Backyard Baseball 2003 [baseball2003] Backyard Football [football] Big Thinkers First Grade [thinker1] Big Thinkers Kindergarten [thinkerk] @@ -288,7 +295,6 @@ Living Books-spel: De följande spelen borde starta, men är ännu ej helt spelbara. Spela dem på egen risk och var god skicka inga buggrapporter angående dem. För senaste nytt angående spelkompatibilitet kan du besöka vår hemsida och läsa kompatibilitetslistan. - Backyard Baseball 2003 [baseball2003] Backyard Football 2002 [football2002] Backyard Soccer [soccer] Backyard Soccer MLS [soccermls] @@ -387,6 +393,11 @@ Instruktionerna för Broken Sword-spelen är för Sold-Out Software-versionerna ------ --------------------------------- Filmscenerna i Broken Sword-spelen har varit med om en hel del (se nästa avdelning om du är intresserad) men i regel behöver du bara kopiera .SMK-filerna från ”SMACKS” eller ”SMACKSHI”-katalogerna på CD-skivorna till samma katalog där de andra datafilerna ligger. (Broken Sword har även en ”SMACKSLO” katalog med samma filmscener, men dessa har lägre kvalitet.) Du kan även lägga dem i en underkatalog med namnet ”video”, om du vill. +För PlayStation-versionerna kan du dumpa originalfilmerna från CD:n. Dumpa varje fil med ändelsen ”STR” som råa sektorer från CD:n (samtliga 2352 bitar per sektor). DU kan även använde de omkodade filmscenerna nedan istället, men detta fungerar inte för alla filmer i Broken Sword II. För ytterligare information, se: + + http://wiki.scummvm.org/index.php/HOWTO-PlayStation_Videos + + Vissa nyutgåvor av spelen, tillika PlayStation-versionen, har inga Smacker videos. Revolution Software har varit goda nog att skapa nykodade filmscener som kan laddas hem från våran hemsida: http://www.scummvm.org/downloads.php @@ -395,7 +406,7 @@ Dessa filmscener är tillgängliga i DXA-format med FLAC-ljud. Kvaliteten är de För de system som är för långsamma för att hantera FLAC-ljud finns ljudet för dessa filmscener att ladda hem separat som OGG Vorbis-ljud. För att se dessa filmscener med OGG Vorbis-ljud krävs en version av ScummVM som kompilerats med stöd för både libVorbis och zlib. -Vi erbjuder även ett tillägg för undertexter i Broken Sword. Packa upp tillägget och följ instruktionerna i readme.txt-filen. (Broken Sword II har redan undertexter; inga modifikationer krävs för dem). +Vi erbjuder även ett tillägg för undertexter i Broken Sword. Packa upp tillägget och följ instruktionerna i readme.txt-filen. Undertextpaketet fungerar för tillfället inte med PlayStation-filmer (Broken Sword II har redan undertexter; inga modifikationer krävs för dem). 3.7.2) Broken Sword-spelens filmscener – en återblick: @@ -475,7 +486,7 @@ Döp om voices.wav på CD4 till voices4.wav 3.14) Notiser om The Legend of Kyrandia: ----- ---------------------------------- -För att spela The Legend of Kyrandia i ScummVM behöver du “kyra.dat”-filen som är tillgänglig från ”Downloads”-avdelningen på ScummVM:s hemsida. +För att spela The Legend of Kyrandia i ScummVM behöver du “kyra.dat”-filen. Filen borde alltid inkluderas med officiella ScummVM-paket. Om ScummVM klagar över att filen saknas kan du finna den på “Downloads”-avdelningen av ScummVM:s hemsida. Märk att den nuvarande Windows-versionen av ScummVM borde ha filen inbyggd i programfilen, och sålunda behöver du bara ladda hem den om ScummVM klagar över att filen saknas. 3.15) Notiser om Sierra AGI-spel med textinmatningshjälp: @@ -537,10 +548,6 @@ Den här versionen har följande kända problem. Du behöver inte rapportera dem FM-TOWNS-versioner av spel: - Kanji-versioner kräver en FM-TOWNS Font ROM - - ScummVM krashar slumpmässigt när FM-TOWNS Font Rom används för - kanji-versionerna av de följande spelen: - The Secret of Monkey Island, Monkey Island 2: LeChuck's Revenge - och Indiana Jones and the Fate of Atlantis Loom: - Att stänga av undertexterna via konfigurationsfilen är inte pålitligt då @@ -590,7 +597,6 @@ Den här versionen har följande kända problem. Du behöver inte rapportera dem The Legend of Kyrandia: - Varken musik eller ljudeffekter i Macintosh diskett-versioner. - Macintosh-CD använder DOS-musik och ljudeffekter. - - PC-9821-versionen saknar stöd för ljudeffekter. Humongous Entertainment-spel: - Endast originalgränssnittet för att ladda och spara kan användas. @@ -668,6 +674,7 @@ Ordning: scummvm [INSTÄLLNINGAR]... [SPEL] --themepath=PATH Sökväg dit GUI-teman lagras --list-themes Visa full lista med alla användbara GUI-teman -e, --music-driver=MODE Välj musik-driver (se även avdelning 7.0) + --list-audio-devices Visar tillgängliga ljudenheter -q, --language=LANG Välj spelets språk (se även avdelning 5.2) -m, --music-volume=NUM Ställ in musikvolym, 0-255 (standard: 192) -s, --sfx-volume=NUM Ställ in ljudeffektsvolym, 0-255 (standard: 192) @@ -822,19 +829,28 @@ Motorer som för närvarande stöder återvändo till launchern: AGI AGOS CINE + COMPOSER + CRUISE DRACI + DRASCULA GOB GROOVIE + HUGO KYRA LURE + MADE + MOHAWK PARALLACTION QUEEN SAGA + SCI SCUMM SKY SWORD1 SWORD2 + TEENAGENT TOUCHE + TSAGE TUCKER @@ -1006,8 +1022,24 @@ Notis för WinCE-användare: På grund av de begränsade tangentborden på de fl Spardata lagras som standard i den aktiva katalogen på vissa plattformar och i förbestämda kataloger på andra plattformar. Du kan ställa in katalogen i konfigurationsfilen genom att ändra savepath-parametern. Se exempel för konfigurationsfilen senare i detta dokument. Plattformar som för närvarande har annorlunda standardkataloger: - Mac OS X: $HOME/Documents/ScummVM Savegames/ - Övriga unix-system: $HOME/.scummvm/ + Mac OS X: + $HOME/Documents/ScummVM Savegames/ + + Övriga unix-system: + $HOME/.scummvm/ + + Windows Vista/7: + \Users\username\AppData\Roaming\ScummVM\Saved games\ + + Windows 2000/XP: + \Documents and Settings\username\Application Data\ScummVM\Saved games\ + + Windows NT4: + \Profiles\username\Application Data\ScummVM\Saved games\ + +Spardata lagras i en gömd map I Windows NT4/2000/XP/Vista/7, som kan kommas åt genom att köra "%APPDATA%%\ScummVM\Saved Games\" eller genom att visa dolda filer i Windows Explorer. + +Notis för användare av NT4/2000/XP/Vista/7: Den förutbestämda platsen för spardata har ändrats i ScummVM 1.5.0. Migrationsfilen kan användas för att kopiera spardata från den förra platsen till den nya. 6.1) Autosparning: @@ -1059,20 +1091,28 @@ Där “xxx” står för positionsnumret (t.ex. 001) i ScummVM. AGI AGOS + CGE CINE + CRUISE DRACI GROOVIE + HUGO KYRA LURE + MOHAWK PARALLACTION QUEEN SAGA + SCI SCUMM SKY SWORD1 SWORD2 + TEENAGENT TINSEL + TOON TOUCHE + TSAGE TUCKER --save-slot/-x: @@ -1086,20 +1126,28 @@ Där “xxx” står för positionsnumret (t.ex. 001) i ScummVM. Motorer som för tillfället stöder --save-slot/-x: AGI + CGE CINE + CRUISE DRACI GROOVIE + HUGO KYRA LURE - PARALLACTION + MOHAWK QUEEN SAGA + SCI SCUMM SKY SWORD1 SWORD2 + TEENAGENT TINSEL + TOON TOUCHE + TSAGE + TUCKER 7.0) Musik och ljud: @@ -1396,7 +1444,7 @@ Att använda frekvenser mellan de ovansagda rekommenderas ej. Till att börja me ---- -------------------- Som standard sparas och laddas konfigrationsfilen i: - Windows Vista: + Windows Vista/7: \Users\username\AppData\Roaming\ScummVM\scummvm.ini, Windows 2000/XP: @@ -1458,6 +1506,9 @@ Ett exempel på en konfigurationsfil ser ut så här: path=C:\amiga_mi2\ music_driver=windows + +8.1) Igenkända nyckelord +---- ------------------- Följande nyckelord kan användas: path string Sökvägen dit spelets datafiler ligger @@ -1483,7 +1534,6 @@ Följande nyckelord kan användas: fullscreen bool Fullskärmsläge aspect_ratio bool Aktivera korrektion av bildförhållande - disable_dithering bool Anti-gitter för EGA-spel gfx_mode string Grafikläge (normalt, 2x, 3x, 2xsai, super2xsai, supereagle, advmame2x, advmame3x, hq2x, hq3x, tv2x, dotmatrix) @@ -1529,6 +1579,29 @@ Följande nyckelord kan användas: boot_param number Skicka det här numret till boot script +Sierra-spel som använder AGI-motorn använder även följande nyckelord: + + originalsaveload bool Ställ in till “true” för att använda + originalskärmarna för ladda/spara + istället för ScummVM:s förbättrade + skärmar + +Sierra-spel som använder SCI-motorn använder även följande nyckelord: + + disable_dithering bool Tar bort gitter artefakter från EGA-spel + prefer_digitalsfx bool Ställ in till “true” för att föredra + digitala ljudeffekter istället för + syntetiserade ljudeffekter + originalsaveload bool Ställ in till “true” för att använda + originalskärmarna för ladda/spara + istället för ScummVM:s förbättrade + skärmar + native_fb01 bool Ställ in till “true” för att använda + ett IBM Music Feature-kort eller en + Yamaha FB-01 FM synthmodul för + MIDI-uppspelning + + Broken Sword II lägger till följande nyckelord: gfx_details number Grafisk detalj (0-3) @@ -1546,6 +1619,13 @@ Flight of the Amazon Queen lägger till följande nyckelord: sfx_mute bool Ställ in till “true” för att deaktivera ljudeffekter + +Jones in the Fast Lane använder även följande nyckelord: + music_mute bool Ställ in till “true” för att använda + CD-ljud, om tillgängligt, istället + spelets vanliga ljud. + + King's Quest VI Windows lägger till följande nyckelord: windows_cursors bool Ställ in till “true” för att använda de svartvita @@ -1553,6 +1633,25 @@ King's Quest VI Windows lägger till följande nyckelord: Ställ in till ”false” för att använda de uppskalade muspekarna som matchar resten av grafiken. + +Lands of Lore: The Throne of Chaos använder även följande nyckelord: + + smooth_scrolling bool Ställ in till “true” för mjukare + skärmrullning när du går från en + skärm till en annan. + floating_cursors bool Ställ in till “true” för att ändra + pekaren till en riktningspil när den + närmar sig kanten av skärmen. Spelaren + kan sedan klicka för att gå mot + den riktningen. + + +Space Quest IV CD använder även följande nyckelord: + + silver_cursors bool Ställ in till “true” för att använda + silverpekare istället för gulpekarna + + Simon the Sorcerer 1 och 2 lägger till följande nyckelord: music_mute bool Ställ in till “true” för att deaktivera musik @@ -1565,6 +1664,28 @@ The Legend of Kyrandia lägger till följande nyckelord: walkspeed int Gånghastighet (0-4) +The Legend of Kyrandia: Malcolm's Revenge använder även följande nyckelord: + + studio_audience bool Ställ in till “true” för att höra + skratt och applåder när Malcolm + berättar ett skämt + skip_support bool Ställ in till “true” för att kunna + skippa text och filmscener + helium_mode bool Ställ in till “true” så låter folk + som att dom inandats helium + +The 7th Guest använder även följande nyckelord: + + t7g_speed string Hastighet på videouppspelning + (normal, tweaked, im_an_ios) + + +8.2) Spelinställningar som kan aktiveras via användargränssnittet +---- ------------------------------------------------------------ +Många av inställningarna i den föregående avdelningen kan aktiveras via användargränssnittet. Om en inställning finns tillgänglig för ett specifikt spel visas en ny tabb med namnet ”Motor” när du lägger till eller ändrar inställningarna för spelet. +Om specialinställningarna inte visas måste spelet köras en gång eller läggas till igen i spellistan i ScummVM:s launcher. Detta uppdaterar inställningarna för varje spel, vilket låter specialinställningarna visas. + + 9.0) Kompilering: ---- ------------ För en uppdaterad överblick för hur man kompilerar ScummVM på diverse plattformar var god se vår Wiki, speciellt den här här sidan: @@ -1599,15 +1720,6 @@ På Win9x/NT/XP kan du definiera USE_WINDBG och lägga till WinDbg för att visa * Var god se: http://wiki.scummvm.org/index.php/Compiling_ScummVM/Windows_CE - Debian GNU/Linux: - * Installera paketen 'build-essential', 'fakeroot', 'debhelper', - och 'libsdl1.2-dev' på ditt system. - * Installera de här paketen (valfria): 'libvorbis-dev' (för Ogg - Vorbis stöd), 'libasound2-dev' (för ALSA sequencer stöd), - 'libmad0-dev' (för MAD MP3 stöd), 'zlib1g-dev' (för stöd av kompresserad spardata). - * Kör 'make deb'. - * Kör sedan 'dpkg -i ../scummvm-cvs*deb', så är du klar. - Mac OS X: * Se till att du har utvecklingsverktygen istallerade. * SDL-utvecklingspaketet för OS X som finns tillgängligt på SLD:s hemsida @@ -1649,4 +1761,4 @@ På Win9x/NT/XP kan du definiera USE_WINDBG och lägga till WinDbg för att visa Lycka till och glada äventyr! ScummVM-teamet. http://www.scummvm.org/ ------------------------------------------------------------------------- \ No newline at end of file +------------------------------------------------------------------------ -- cgit v1.2.3 From 56194194aa1cea352185ab5dcafdbe7ca234a5ef Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 7 Jul 2012 01:15:04 +0100 Subject: I18N: Update Danish translation This was sent by Steffen Nyeland by email. --- po/da_DA.po | 441 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 219 insertions(+), 222 deletions(-) diff --git a/po/da_DA.po b/po/da_DA.po index 50068cae5e..eb62af84a9 100644 --- a/po/da_DA.po +++ b/po/da_DA.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-06-24 18:06+0100\n" -"PO-Revision-Date: 2011-01-08 22:53+0100\n" +"PO-Revision-Date: 2012-06-29 19:45+0100\n" "Last-Translator: Steffen Nyeland \n" "Language-Team: Steffen Nyeland \n" "MIME-Version: 1.0\n" @@ -15,6 +15,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Language: Dansk\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Danish\n" +"X-Poedit-Country: DENMARK\n" #: gui/about.cpp:91 #, c-format @@ -77,7 +79,6 @@ msgid "Remap keys" msgstr "Kortlg taster" #: gui/gui-manager.cpp:129 base/main.cpp:307 -#, fuzzy msgid "Toggle FullScreen" msgstr "Skift fuldskrm" @@ -193,9 +194,8 @@ msgid "Platform:" msgstr "Platform:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Undersg" +msgstr "Motor" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -386,11 +386,11 @@ msgstr "Start det valgte spil" #: gui/launcher.cpp:628 msgid "~L~oad..." -msgstr "~H~ent..." +msgstr "Ind~l~s..." #: gui/launcher.cpp:628 msgid "Load savegame for selected game" -msgstr "Hent gemmer for det valgte spil" +msgstr "Indls gemmer for det valgte spil" #: gui/launcher.cpp:633 gui/launcher.cpp:1120 msgid "~A~dd Game..." @@ -493,7 +493,7 @@ msgstr "Vil du virkelig fjerne denne spil konfiguration?" #: gui/launcher.cpp:1001 msgid "This game does not support loading games from the launcher." -msgstr "Dette spil understtter ikke hentning af spil fra spiloversigten." +msgstr "Dette spil understtter ikke indlsning af spil fra spiloversigten." #: gui/launcher.cpp:1005 msgid "ScummVM could not find any engine capable of running the selected game!" @@ -520,7 +520,7 @@ msgstr "Skan gennemf #: gui/massadd.cpp:261 #, c-format msgid "Discovered %d new games, ignored %d previously added games." -msgstr "" +msgstr "Opdaget %d nye spil, ignorerede %d tidligere tilfjede spil." #: gui/massadd.cpp:265 #, c-format @@ -528,9 +528,9 @@ msgid "Scanned %d directories ..." msgstr "Gennemset %d biblioteker ..." #: gui/massadd.cpp:268 -#, fuzzy, c-format +#, c-format msgid "Discovered %d new games, ignored %d previously added games ..." -msgstr "Fundet %d nye spil ..." +msgstr "Fundet %d nye spil, ignorer %d tidligere tilfjede spil ..." #: gui/options.cpp:78 msgid "Never" @@ -580,19 +580,19 @@ msgstr "Ingen" #: gui/options.cpp:382 msgid "Failed to apply some of the graphic options changes:" -msgstr "" +msgstr "Anvendelse af ndringer for grafiske indstillinger fejlede:" #: gui/options.cpp:394 msgid "the video mode could not be changed." -msgstr "" +msgstr "videotilstanden kunne ikke ndres." #: gui/options.cpp:400 msgid "the fullscreen setting could not be changed" -msgstr "" +msgstr "fuld skrm indstillingen kunne ikke ndres" #: gui/options.cpp:406 msgid "the aspect ratio setting could not be changed" -msgstr "" +msgstr "billedformat indstillingen ikke kunne ndres" #: gui/options.cpp:727 msgid "Graphics mode:" @@ -672,7 +672,7 @@ msgstr "GM enhed:" #: gui/options.cpp:815 msgid "Specifies default sound device for General MIDI output" -msgstr "Angiver standard lyd enhed for General MIDI udgang" +msgstr "Angiver standard lyd enhed for General MIDI-udgang" #: gui/options.cpp:826 msgid "Don't use General MIDI music" @@ -887,9 +887,8 @@ msgid "Language of ScummVM GUI" msgstr "Sprog for brugerfladen i ScummVM" #: gui/options.cpp:1347 -#, fuzzy msgid "You have to restart ScummVM before your changes will take effect." -msgstr "Du skal genstarte ScummVM for at ndringer vises." +msgstr "Du skal genstarte ScummVM fr dine ndringer har effekt." #: gui/options.cpp:1360 msgid "Select directory for savegames" @@ -1022,20 +1021,17 @@ msgstr "Kunne ikke finde nogen motor istand til at afvikle det valgte spil" #: common/error.cpp:38 msgid "No error" -msgstr "" +msgstr "Ingen fejl" #: common/error.cpp:40 -#, fuzzy msgid "Game data not found" msgstr "Spil data ikke fundet" #: common/error.cpp:42 -#, fuzzy msgid "Game id not supported" msgstr "Spil id ikke understttet" #: common/error.cpp:44 -#, fuzzy msgid "Unsupported color mode" msgstr "Ikke understttet farve tilstand" @@ -1048,7 +1044,6 @@ msgid "Write permission denied" msgstr "Skrive rettighed ngtet" #: common/error.cpp:52 -#, fuzzy msgid "Path does not exist" msgstr "Sti eksistere ikke" @@ -1065,9 +1060,8 @@ msgid "Cannot create file" msgstr "Kan ikke oprette fil" #: common/error.cpp:61 -#, fuzzy msgid "Reading data failed" -msgstr "Lsning fejlet" +msgstr "Lsning af data fejlet" #: common/error.cpp:63 msgid "Writing data failed" @@ -1075,34 +1069,33 @@ msgstr "Skrivning af data fejlet" #: common/error.cpp:66 msgid "Could not find suitable engine plugin" -msgstr "" +msgstr "Kunne ikke finde passende motor udvidelse" #: common/error.cpp:68 -#, fuzzy msgid "Engine plugin does not support save states" -msgstr "Motor understtter ikke fejlfindingsniveau '%s'" +msgstr "Motor udvidelse understtter ikke gemmetilstande" #: common/error.cpp:71 msgid "User canceled" -msgstr "" +msgstr "Bruger annullerede" #: common/error.cpp:75 -#, fuzzy msgid "Unknown error" msgstr "Ukendt fejl" #: engines/advancedDetector.cpp:324 #, c-format msgid "The game in '%s' seems to be unknown." -msgstr "" +msgstr "Spillet i '%s' ser ud til at vre ukendt." #: engines/advancedDetector.cpp:325 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" +"Venligst, rapportere flgende data til ScummVM holdet sammen med navnet" #: engines/advancedDetector.cpp:327 msgid "of the game you tried to add and its version/language/etc.:" -msgstr "" +msgstr "p det spil, du forsgte at tilfje og dets version/sprog/ etc.:" #: engines/dialogs.cpp:84 msgid "~R~esume" @@ -1159,6 +1152,9 @@ msgid "" "the README for basic information, and for instructions on how to obtain " "further assistance." msgstr "" +"Beklager, denne motor leverer i jeblikket ikke spil hjlp. Se venligst " +"README for grundlggende oplysninger, og for at f instruktioner om, hvordan " +"man fr yderligere hjlp." #: engines/dialogs.cpp:228 #, c-format @@ -1166,6 +1162,8 @@ msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" +"Gem af spiltilstand fejlede (%s)! Se venligst README for grundlggende " +"oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 @@ -1183,21 +1181,19 @@ msgstr "~T~aster" #: engines/engine.cpp:235 msgid "Could not initialize color format." -msgstr "" +msgstr "Kunne ikke initialisere farveformat." #: engines/engine.cpp:243 -#, fuzzy msgid "Could not switch to video mode: '" -msgstr "Aktuel videotilstand:" +msgstr "Kunne ikke skifte til videotilstand: '" #: engines/engine.cpp:252 -#, fuzzy msgid "Could not apply aspect ratio setting." -msgstr "Skift billedformat korrektion" +msgstr "Kunne ikke anvende billedformat korrektion indstilling." #: engines/engine.cpp:257 msgid "Could not apply fullscreen setting." -msgstr "" +msgstr "Kunne ikke anvende fuldskrm indstilling." #: engines/engine.cpp:357 msgid "" @@ -1207,6 +1203,11 @@ msgid "" "the data files to your hard disk instead.\n" "See the README file for details." msgstr "" +"Det lader til at du spiller dette spil direkte\n" +"fra cd'en. Dette er kendt for at forrsage problemer,\n" +"og det anbefales derfor, at du kopierer\n" +"datafiler til din harddisk i stedet.\n" +"Se README fil for detaljer." #: engines/engine.cpp:368 msgid "" @@ -1216,6 +1217,11 @@ msgid "" "order to listen to the game's music.\n" "See the README file for details." msgstr "" +"Dette spil har lydspor p sin disk. Disse\n" +"spor skal rippes fra disken ved hjlp af\n" +"en passende CD audio udvindingsvrktj\n" +"for at lytte til spillets musik.\n" +"Se README fil for detaljer." #: engines/engine.cpp:426 #, c-format @@ -1223,6 +1229,9 @@ msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" +"Indlsning af spiltilstand fejlede (%s)! Se venligst README for " +"grundlggende oplysninger, og for at f instruktioner om, hvordan man fr " +"yderligere hjlp." #: engines/engine.cpp:439 msgid "" @@ -1230,20 +1239,23 @@ msgid "" "ScummVM. As such, it is likely to be unstable, and any saves you make might " "not work in future versions of ScummVM." msgstr "" +"ADVARSEL: Spillet du er ved at starte endnu ikke er fuldt understttet af " +"ScummVM. Sledes, er det sandsynligt, at det er ustabilt, og alle gemmer du " +"foretager fungerer muligvis ikke i fremtidige versioner af ScummVM." #: engines/engine.cpp:442 msgid "Start anyway" -msgstr "" +msgstr "Start alligevel" #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Brug original gem/indls skrme" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" -msgstr "" +msgstr "Brug de originale gem/indls skrme, istedet for dem fra ScummVM" #: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 msgid "Restore game:" @@ -1254,105 +1266,102 @@ msgid "Restore" msgstr "Gendan" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "verste hjre punkt" +msgstr "Brug lys palet tilstand" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Vis grafik ved hjlp af spillets lyse palette" #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "EGA farveforgelse" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "Aktiver farveforgelse i EGA spil der understtter det" +msgstr "Aktiver farveforgelse i EGA spil" #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Lydstyrke for specielle lydeffekter" +msgstr "Foretrk digitale lydeffekter" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Foretrk digitale lydeffekter i stedet for syntetiserede" #: engines/sci/detection.cpp:400 msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "" +msgstr "Brug IMF/Yahama FB-01 til MIDI-udgang" #: engines/sci/detection.cpp:401 msgid "" "Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " "output" msgstr "" +"Bruge et IBM Musik Feature-kort eller et Yahama FB-01 FM synth modul til " +"MIDI-udgang" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "Brug CD lyd" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr "Brug cd-lyd i stedet for lyd fra spillet, hvis tilgngelige" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Brug Windows markr" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" -msgstr "" +msgstr "Brug Windows-markrer (mindre og monokrome) i stedet for dem fra DOS" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Normal markr" +msgstr "Brug slv markr" #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" +"Brug det alternative st af slv markrer, i stedet for de normale gyldne" #: engines/scumm/dialogs.cpp:175 #, c-format msgid "Insert Disk %c and Press Button to Continue." -msgstr "" +msgstr "Indst Disk %c og Tryk p knappen for at fortstte." #: engines/scumm/dialogs.cpp:176 #, c-format msgid "Unable to Find %s, (%c%d) Press Button." -msgstr "" +msgstr "Kunne ikke finde %s, (%c%d) Tryk p knappen." #: engines/scumm/dialogs.cpp:177 #, c-format msgid "Error reading disk %c, (%c%d) Press Button." -msgstr "" +msgstr "Fejl ved lsning af disk %c, (%c%d) Tryk p knappen." #: engines/scumm/dialogs.cpp:178 msgid "Game Paused. Press SPACE to Continue." -msgstr "" +msgstr "Spil sat p pause. Tryk MELLEMRUM for at fortstte." #. 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:182 -#, fuzzy msgid "Are you sure you want to restart? (Y/N)" -msgstr " Er du sikker p at du vil afslutte ? " +msgstr "Er du sikker p at du vil genstarte? (J/N) " #. I18N: you may specify 'Yes' symbol at the end of the line. See previous comment #: engines/scumm/dialogs.cpp:184 -#, fuzzy msgid "Are you sure you want to quit? (Y/N)" -msgstr " Er du sikker p at du vil afslutte ? " +msgstr "Er du sikker p at du vil afslutte? (J/N) " #: engines/scumm/dialogs.cpp:189 msgid "Play" -msgstr "" +msgstr "Spil" #: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82 #: engines/scumm/help.cpp:84 @@ -1365,42 +1374,41 @@ msgstr "Afslut" #: engines/scumm/dialogs.cpp:193 msgid "Insert save/load game disk" -msgstr "" +msgstr "Indst gem/indls spil disk" #: engines/scumm/dialogs.cpp:194 msgid "You must enter a name" -msgstr "" +msgstr "Du skal indtaste et name" #: engines/scumm/dialogs.cpp:195 msgid "The game was NOT saved (disk full?)" -msgstr "" +msgstr "Spillet blev ikke gemt (disk fuld?)" #: engines/scumm/dialogs.cpp:196 msgid "The game was NOT loaded" -msgstr "" +msgstr "Spillet blev IKKE indlst" #: engines/scumm/dialogs.cpp:197 #, c-format msgid "Saving '%s'" -msgstr "" +msgstr "Gemmer '%s'" #: engines/scumm/dialogs.cpp:198 #, c-format msgid "Loading '%s'" -msgstr "" +msgstr "Indlser '%s'" #: engines/scumm/dialogs.cpp:199 msgid "Name your SAVE game" -msgstr "" +msgstr "Navngiv din GEMMER" #: engines/scumm/dialogs.cpp:200 -#, fuzzy msgid "Select a game to LOAD" -msgstr "Vlg et tema" +msgstr "Vlg et spil at indlse" #: engines/scumm/dialogs.cpp:201 msgid "Game title)" -msgstr "" +msgstr "Spil titel)" #. I18N: Previous page button #: engines/scumm/dialogs.cpp:287 @@ -1418,46 +1426,41 @@ msgid "~C~lose" msgstr "~L~uk" #: engines/scumm/dialogs.cpp:597 -#, fuzzy msgid "Speech Only" -msgstr "Tale" +msgstr "Kun tale" #: engines/scumm/dialogs.cpp:598 -#, fuzzy msgid "Speech and Subtitles" -msgstr "Undertekster" +msgstr "Tale og Undertekster" #: engines/scumm/dialogs.cpp:599 -#, fuzzy msgid "Subtitles Only" -msgstr "Undertekster" +msgstr "Kun undertekster" #: engines/scumm/dialogs.cpp:607 -#, fuzzy msgctxt "lowres" msgid "Speech & Subs" -msgstr "Tale" +msgstr "Tale & Tekst" #: engines/scumm/dialogs.cpp:653 msgid "Select a Proficiency Level." -msgstr "" +msgstr "Vlg et Frdighedsniveau." #: engines/scumm/dialogs.cpp:655 msgid "Refer to your Loom(TM) manual for help." -msgstr "" +msgstr "Se din Loom(TM) manual for hjlp." #: engines/scumm/dialogs.cpp:658 -#, fuzzy msgid "Standard" -msgstr "Standard (16bpp)" +msgstr "Standard" #: engines/scumm/dialogs.cpp:659 msgid "Practice" -msgstr "" +msgstr "Trning" #: engines/scumm/dialogs.cpp:660 msgid "Expert" -msgstr "" +msgstr "Ekspert" #: engines/scumm/help.cpp:73 msgid "Common keyboard commands:" @@ -1465,7 +1468,7 @@ msgstr "Almindelige tastatur kommandoer:" #: engines/scumm/help.cpp:74 msgid "Save / Load dialog" -msgstr "Gem / Hent dialog" +msgstr "Gem / Indls dialog" #: engines/scumm/help.cpp:76 msgid "Skip line of text" @@ -1497,7 +1500,7 @@ msgstr "Ctrl" #: engines/scumm/help.cpp:79 msgid "Load game state 1-10" -msgstr "Hent spil tilstand 1-10" +msgstr "Indls spil tilstand 1-10" #: engines/scumm/help.cpp:80 engines/scumm/help.cpp:84 #: engines/scumm/help.cpp:86 engines/scumm/help.cpp:100 @@ -1590,7 +1593,6 @@ msgid " since they may cause crashes" msgstr " siden de kan skabe nedbrud" #: engines/scumm/help.cpp:110 -#, fuzzy msgid " or incorrect game behavior." msgstr " eller ukorrekt opfrsel af spil." @@ -1830,7 +1832,7 @@ msgstr "Komm" #: engines/scumm/help.cpp:246 msgid "Save / Load / Options" -msgstr "Gem / Hent / Indstillinger" +msgstr "Gem / Indls / Indstillinger" #: engines/scumm/help.cpp:255 msgid "Other game controls:" @@ -1979,6 +1981,8 @@ msgid "" "Native MIDI support requires the Roland Upgrade from LucasArts,\n" "but %s is missing. Using AdLib instead." msgstr "" +"Indbygget MIDI understttelse krver Roland opgradering fra LucasArts,\n" +"men %s mangler. Bruger AdLib i stedet." #: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format @@ -1998,7 +2002,7 @@ msgid "" "\n" "%s" msgstr "" -"Mislykkedes at hente spil tilstand fra fil:\n" +"Mislykkedes at indlse spil tilstand fra fil:\n" "\n" "%s" @@ -2019,6 +2023,9 @@ msgid "" "play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " "directory inside the Tentacle game directory." msgstr "" +"Normalt ville Maniac Mansion begynde nu. Men ScummVM kan ikke gre det " +"endnu. For at spille det, g til 'Tilfj spil' i ScummVM start-menuen og " +"vlg 'Maniac' mappen inde i Tentacle spillets mappe." #. I18N: Option for fast scene switching #: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 @@ -2032,16 +2039,15 @@ msgstr "~O~vergange aktiveret" #. I18N: Drop book page #: engines/mohawk/dialogs.cpp:95 msgid "~D~rop Page" -msgstr "" +msgstr "Smi~d~ side" #: engines/mohawk/dialogs.cpp:99 msgid "~S~how Map" -msgstr "" +msgstr "Vi~s~ kort" #: engines/mohawk/dialogs.cpp:105 -#, fuzzy msgid "~M~ain Menu" -msgstr "ScummVM Hovedmenu" +msgstr "Hoved~m~enu" #: engines/mohawk/dialogs.cpp:172 msgid "~W~ater Effect Enabled" @@ -2050,154 +2056,130 @@ msgstr "~V~andeffekter aktiveret" #: engines/agos/animation.cpp:560 #, c-format msgid "Cutscene file '%s' not found!" -msgstr "" +msgstr "Filmsekvens fil '%s' ikke fundet!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 -#, fuzzy msgid "Failed to load game state from file." -msgstr "" -"Mislykkedes at hente spil tilstand fra fil:\n" -"\n" -"%s" +msgstr "Mislykkedes at indlse spil tilstand fra fil." #: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 -#, fuzzy msgid "Failed to save game state to file." -msgstr "" -"Mislykkedes at gemme spil tilstand til fil:\n" -"\n" -"%s" +msgstr "Mislykkedes at gemme spil tilstand til fil." #: engines/gob/inter_v5.cpp:107 -#, fuzzy msgid "Failed to delete file." -msgstr "" -"Mislykkedes at gemme spil tilstand til fil:\n" -"\n" -"%s" +msgstr "Mislykkedes at slette fil." #: engines/groovie/script.cpp:420 -#, fuzzy msgid "Failed to save game" -msgstr "" -"Mislykkedes at gemme spil tilstand til fil:\n" -"\n" -"%s" +msgstr "Mislykkedes at gemme spil" #. I18N: Studio audience adds an applause and cheering sounds whenever #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Studio publikum" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Aktivr studio publikum" #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr "Spring over sttte" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Tillad at tekst og filmsekvenser kan springes over" #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Helium tilstand" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Aktivr Roland GS tilstand" +msgstr "Aktivr helium tilstand" #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Jvn bevgelse" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Aktivr jvn bevgelse nr du gr" #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Normal markr" +msgstr "Flydende markr" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Aktivr flydende markr" #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr "HP sjlegrafer" #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr "Aktivr trfpoint (HP) sjlediagrammer" #: engines/kyra/lol.cpp:478 msgid "Attack 1" -msgstr "" +msgstr "Angreb 1" #: engines/kyra/lol.cpp:479 msgid "Attack 2" -msgstr "" +msgstr "Angreb 2" #: engines/kyra/lol.cpp:480 msgid "Attack 3" -msgstr "" +msgstr "Angreb 3" #: engines/kyra/lol.cpp:481 msgid "Move Forward" -msgstr "" +msgstr "Flyt fremad" #: engines/kyra/lol.cpp:482 msgid "Move Back" -msgstr "" +msgstr "Flyt bagud" #: engines/kyra/lol.cpp:483 msgid "Slide Left" -msgstr "" +msgstr "Flyt til venstre" #: engines/kyra/lol.cpp:484 -#, fuzzy msgid "Slide Right" -msgstr "Hjre" +msgstr "Flyt til hjre" #: engines/kyra/lol.cpp:485 -#, fuzzy msgid "Turn Left" -msgstr "Sluk" +msgstr "Drej til venstre" #: engines/kyra/lol.cpp:486 -#, fuzzy msgid "Turn Right" -msgstr "Pil til hjre" +msgstr "Drej til hjre" #: engines/kyra/lol.cpp:487 -#, fuzzy msgid "Rest" -msgstr "Gendan" +msgstr "Hvil" #: engines/kyra/lol.cpp:488 -#, fuzzy msgid "Options" -msgstr "~I~ndstillinger" +msgstr "Indstillinger" #: engines/kyra/lol.cpp:489 -#, fuzzy msgid "Choose Spell" -msgstr "Vlg" +msgstr "Vlg magi" #: engines/kyra/sound_midi.cpp:475 msgid "" @@ -2207,44 +2189,54 @@ msgid "" "General MIDI ones. After all it might happen\n" "that a few tracks will not be correctly played." msgstr "" +"Det lader til at du en General MIDI-enhed,\n" +"men dit spil kun understtter Roland MT32 MIDI.\n" +"Vi forsger at kortlgge Roland MT32 instrumenterne til\n" +"dem i General MIDI. Trods det kan det ske\n" +"at nogle spor ikke vil blive korrekt afspillet." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Diskette intro" #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr "Brug diskette versionens intro (kun CD version)" #: engines/sky/compact.cpp:130 msgid "" "Unable to find \"sky.cpt\" file!\n" "Please download it from www.scummvm.org" msgstr "" +"Kunne ikke finde \"sky.cpt\" filen!\n" +"Venligst download den fra www.scummvm.org" #: engines/sky/compact.cpp:141 msgid "" "The \"sky.cpt\" file has an incorrect size.\n" "Please (re)download it from www.scummvm.org" msgstr "" +"\"sky.cpt\" filen har en forkert strrelse.\n" +"Venligst (gen)hent den fra www.scummvm.org" #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" -msgstr "" +msgstr "PSX stream filmsekvens '%s' kan ikke afspilles i palette tilstand" #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" +"DXA filmsekvenser fundet, men ScummVM er bygget uden zlib understttelse" #: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 msgid "MPEG2 cutscenes are no longer supported" -msgstr "" +msgstr "MPEG2 filmsekvenser understttes ikke lngere" #: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 #, c-format msgid "Cutscene '%s' not found" -msgstr "" +msgstr "Filmsekvens '%s' ikke fundet" #: engines/sword1/control.cpp:863 msgid "" @@ -2256,6 +2248,13 @@ msgid "" "Press OK to convert them now, otherwise you will be asked again the next " "time you start the game.\n" msgstr "" +"ScummVM har konstateret, at du har gamle gemmer for Broken Sword 1, der skal " +"konverteres.\n" +"Det gamle gemte spil format understttes ikke lngere, s vil du ikke vre i " +"stand til at indlse dine spil, hvis du ikke konvertere dem.\n" +"\n" +"Tryk p OK for at konvertere dem nu, ellers vil du blive spurgt igen, nste " +"gang du starter spillet.\n" #: engines/sword1/control.cpp:1232 #, c-format @@ -2263,31 +2262,34 @@ msgid "" "Target new save game already exists!\n" "Would you like to keep the old save game (%s) or the new one (%s)?\n" msgstr "" +"Nyt gemt spil findes allerede!\n" +"Vil du gerne beholde det gamle gemte spil (%s) eller det nye (%s)?\n" #: engines/sword1/control.cpp:1235 msgid "Keep the old one" -msgstr "" +msgstr "Behold den gamle" #: engines/sword1/control.cpp:1235 msgid "Keep the new one" -msgstr "" +msgstr "Behold den nye" #: engines/sword1/logic.cpp:1633 msgid "This is the end of the Broken Sword 1 Demo" -msgstr "" +msgstr "Dette er slutningen af Broken Sword 1 demoen" #: engines/sword2/animation.cpp:435 msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" +"PSX filmsekvenser fundet, men ScummVM er bygget uden RGB farve understttelse" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr "Vis labels p genstande" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr "Vis labels for genstande musen er henover" #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2295,16 +2297,16 @@ msgid "" "Can't save game in slot %i\n" "\n" msgstr "" +"Kan ikke gemme spil p plads %i\n" +"\n" #: engines/parallaction/saveload.cpp:204 -#, fuzzy msgid "Loading game..." -msgstr "Indls spil:" +msgstr "Indlser spil..." #: engines/parallaction/saveload.cpp:219 -#, fuzzy msgid "Saving game..." -msgstr "Gemmer:" +msgstr "Gemmer spil..." #: engines/parallaction/saveload.cpp:272 msgid "" @@ -2315,10 +2317,16 @@ msgid "" "\n" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" +"ScummVM har konstateret, at du har gamle gemmer for Nippon Safes, der skal " +"omdbes.\n" +"De gamle navne er ikke lngere understttet, s du vil ikke vre i stand til " +"at indlse dine spil, hvis du ikke konvertere dem.\n" +"\n" +"Tryk p OK for at konvertere dem nu, ellers vil du blive spurgt nste gang.\n" #: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." -msgstr "" +msgstr "ScummVM konverterede med succes alle dine gemmer." #: engines/parallaction/saveload.cpp:321 msgid "" @@ -2327,6 +2335,10 @@ msgid "" "\n" "Please report to the team." msgstr "" +"ScummVM udskrev nogle advarsler i dit konsol vindue, og kan ikke garantere " +"at alle dine filer er blevet konverteret.\n" +"\n" +"Venligst rapportr til holdet." #: audio/fmopl.cpp:49 msgid "MAME OPL emulator" @@ -2342,11 +2354,13 @@ msgid "" "The selected audio device '%s' was not found (e.g. might be turned off or " "disconnected)." msgstr "" +"Den valgte lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller " +"afbrudt)." #: 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 "" +msgstr "Forsger at falde tilbage til den nste tilgngelig enhed..." #: audio/mididrv.cpp:221 #, c-format @@ -2354,6 +2368,7 @@ msgid "" "The selected audio device '%s' cannot be used. See log file for more " "information." msgstr "" +"Den valgte lydenhed '%s' kan ikke bruges. Se log filen for mere information." #: audio/mididrv.cpp:257 #, c-format @@ -2361,6 +2376,8 @@ msgid "" "The preferred audio device '%s' was not found (e.g. might be turned off or " "disconnected)." msgstr "" +"Den foretrukne lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller " +"afbrudt)." #: audio/mididrv.cpp:272 #, c-format @@ -2368,6 +2385,8 @@ msgid "" "The preferred audio device '%s' cannot be used. See log file for more " "information." msgstr "" +"Den foretrukne lydenhed '%s' kan ikke bruges. Se log filen for mere " +"information." #: audio/null.h:43 msgid "No music" @@ -2390,7 +2409,6 @@ msgid "C64 Audio Emulator" msgstr "C64 lyd emulator" #: audio/softsynth/mt32.cpp:293 -#, fuzzy msgid "Initializing MT-32 Emulator" msgstr "Initialisere MT-32 emulator" @@ -2411,7 +2429,6 @@ msgid "Keymap:" msgstr "Tasteoversigt:" #: backends/keymapper/remap-dialog.cpp:66 -#, fuzzy msgid " (Effective)" msgstr " (Aktiv)" @@ -2421,7 +2438,7 @@ msgstr " (Aktiv)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr "(Blokeret)" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" @@ -2508,14 +2525,12 @@ msgid "Disable power off" msgstr "Deaktiver slukning" #: backends/platform/iphone/osys_events.cpp:300 -#, fuzzy msgid "Mouse-click-and-drag mode enabled." -msgstr "Pegeplade tilstand aktiveret." +msgstr "Muse-klik-og-trk tilstand aktiveret." #: backends/platform/iphone/osys_events.cpp:302 -#, fuzzy msgid "Mouse-click-and-drag mode disabled." -msgstr "Pegeplade tilstand deaktiveret." +msgstr "Muse-klik-og-trk tilstand deaktiveret." #: backends/platform/iphone/osys_events.cpp:313 msgid "Touchpad mode enabled." @@ -2527,7 +2542,7 @@ msgstr "Pegeplade tilstand deaktiveret." #: backends/platform/maemo/maemo.cpp:205 msgid "Click Mode" -msgstr "" +msgstr "Klik tilstand" #: backends/platform/maemo/maemo.cpp:211 #: backends/platform/symbian/src/SymbianActions.cpp:42 @@ -2538,9 +2553,8 @@ msgid "Left Click" msgstr "Venstre klik" #: backends/platform/maemo/maemo.cpp:214 -#, fuzzy msgid "Middle Click" -msgstr "Midterste hjre punkt" +msgstr "Miderste klik" #: backends/platform/maemo/maemo.cpp:217 #: backends/platform/symbian/src/SymbianActions.cpp:43 @@ -2550,7 +2564,6 @@ msgid "Right Click" msgstr "Hjre klik" #: backends/platform/sdl/macosx/appmenu_osx.mm:78 -#, fuzzy msgid "Hide ScummVM" msgstr "Skjul ScummVM" @@ -2582,26 +2595,22 @@ msgstr "Normal (ingen skalering)" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2135 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:533 -#, fuzzy msgid "Enabled aspect ratio correction" -msgstr "Skift billedformat korrektion" +msgstr "Aktivr billedformat korrektion" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2141 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:538 -#, fuzzy msgid "Disabled aspect ratio correction" -msgstr "Skift billedformat korrektion" +msgstr "Deaktivr billedformat korrektion" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2196 -#, fuzzy msgid "Active graphics filter:" -msgstr "Skift mellem grafik filtre" +msgstr "Aktive grafik filtre:" #: backends/graphics/surfacesdl/surfacesdl-graphics.cpp:2238 #: backends/graphics/openglsdl/openglsdl-graphics.cpp:477 -#, fuzzy msgid "Windowed mode" -msgstr "Rendere tilstand:" +msgstr "Vindue tilstand" #: backends/graphics/opengl/opengl-graphics.cpp:135 msgid "OpenGL Normal" @@ -2616,21 +2625,20 @@ msgid "OpenGL Original" msgstr "OpenGL Original" #: backends/graphics/openglsdl/openglsdl-graphics.cpp:415 -#, fuzzy msgid "Current display mode" -msgstr "Aktuel videotilstand:" +msgstr "Aktuel videotilstand" #: backends/graphics/openglsdl/openglsdl-graphics.cpp:428 msgid "Current scale" -msgstr "" +msgstr "Aktuel skalering" #: backends/graphics/openglsdl/openglsdl-graphics.cpp:558 msgid "Active filter mode: Linear" -msgstr "" +msgstr "Aktiv filter tilstand: Linr" #: backends/graphics/openglsdl/openglsdl-graphics.cpp:560 msgid "Active filter mode: Nearest" -msgstr "" +msgstr "Aktiv filter tilstand: Nrmest" #: backends/platform/symbian/src/SymbianActions.cpp:38 #: backends/platform/wince/CEActionsSmartphone.cpp:39 @@ -2812,17 +2820,15 @@ msgid "Network down" msgstr "Netvrk nede" #: backends/platform/wii/options.cpp:178 -#, fuzzy msgid "Initializing network" msgstr "Initialisere netvrk" #: backends/platform/wii/options.cpp:182 -#, fuzzy msgid "Timeout while initializing network" msgstr "Tidsgrnse net ved initialisering af netvrk" #: backends/platform/wii/options.cpp:186 -#, fuzzy, c-format +#, c-format msgid "Network not initialized (%d)" msgstr "Netvrk ikke initialiseret (%d)" @@ -2882,12 +2888,12 @@ msgstr "Pil til h #: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Do you want to load or save the game?" -msgstr "Vil du hente eller gemme spillet?" +msgstr "Vil du indlse eller gemme 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 afslutte ? " +msgstr " Er du sikker p at du vil afslutte? " #: backends/platform/wince/CEActionsSmartphone.cpp:50 msgid "Keyboard" @@ -2944,95 +2950,86 @@ msgstr "" "hele oversigten" #: backends/events/default/default-events.cpp:191 -#, fuzzy msgid "Do you really want to return to the Launcher?" -msgstr "Vil du virkelig slette denne gemmer?" +msgstr "Vil du virkelig g tilbage til oversigten?" #: backends/events/default/default-events.cpp:191 -#, fuzzy msgid "Launcher" -msgstr "Slag" +msgstr "Oversigt" #: backends/events/default/default-events.cpp:213 -#, fuzzy msgid "Do you really want to quit?" -msgstr "Vil du afslutte?" +msgstr "Vil du virkelig afslutte?" #: backends/events/gph/gph-events.cpp:338 #: backends/events/gph/gph-events.cpp:381 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" -msgstr "" +msgstr "Touchscreen 'Tap Mode' - Venstre Klik" #: backends/events/gph/gph-events.cpp:340 #: backends/events/gph/gph-events.cpp:383 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" -msgstr "" +msgstr "Touchscreen 'Tap Mode' - Hjre Klik" #: backends/events/gph/gph-events.cpp:342 #: backends/events/gph/gph-events.cpp:385 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" -msgstr "" +msgstr "Touchscreen 'Tap Mode' - Henover (Ingen Klik)" #: backends/events/gph/gph-events.cpp:362 -#, fuzzy msgid "Maximum Volume" -msgstr "Lydstyrke" +msgstr "Maximal lydstyrke" #: backends/events/gph/gph-events.cpp:364 msgid "Increasing Volume" -msgstr "" +msgstr "Hver lydstyrke" #: backends/events/gph/gph-events.cpp:370 -#, fuzzy msgid "Minimal Volume" -msgstr "Lydstyrke" +msgstr "Minimal lydstyrke" #: backends/events/gph/gph-events.cpp:372 msgid "Decreasing Volume" -msgstr "" +msgstr "Snker lydstyrke" #: backends/updates/macosx/macosx-updates.mm:65 msgid "Check for Updates..." -msgstr "" +msgstr "Sg efter opdateringer..." #: backends/platform/bada/form.cpp:269 -#, fuzzy msgid "Right Click Once" -msgstr "Hjre klik" +msgstr "Enkelt hjre klik" #: backends/platform/bada/form.cpp:277 -#, fuzzy msgid "Move Only" -msgstr "Tale" +msgstr "Flyt kun" #: backends/platform/bada/form.cpp:291 msgid "Escape Key" -msgstr "" +msgstr "Escape tast" #: backends/platform/bada/form.cpp:296 -#, fuzzy msgid "Game Menu" -msgstr "Spil" +msgstr "Spil menu" #: backends/platform/bada/form.cpp:301 -#, fuzzy msgid "Show Keypad" msgstr "Vis tastatur" #: backends/platform/bada/form.cpp:309 msgid "Control Mouse" -msgstr "" +msgstr "Kontrollr mus" #: backends/events/maemosdl/maemosdl-events.cpp:192 msgid "Clicking Enabled" -msgstr "" +msgstr "Klik aktiveret" #: backends/events/maemosdl/maemosdl-events.cpp:192 msgid "Clicking Disabled" -msgstr "" +msgstr "Klik deaktiveret" #~ msgid "Hercules Green" #~ msgstr "Hercules grn" -- cgit v1.2.3 From 6051ec13b7c1610897923201b2a01e5d472cd7d9 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 7 Jul 2012 01:15:59 +0100 Subject: DOCS: Add Danish QuickStart file This was sent by Steffen Nyeland by email. --- doc/da/HurtigStart | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ ports.mk | 6 +++ 2 files changed, 157 insertions(+) create mode 100644 doc/da/HurtigStart diff --git a/doc/da/HurtigStart b/doc/da/HurtigStart new file mode 100644 index 0000000000..b54590bba3 --- /dev/null +++ b/doc/da/HurtigStart @@ -0,0 +1,151 @@ +Dette dokument er en delvis oversættelse af den engelske README filen. +Det originale dokument har meget mere information, så hvis du ikke kan +finde det du har brug for her og kan forstå en smule engelsk, så prøv +at se i den Engelske README-fil. + +For mere information, kompatibilitet lister, detaljer om donering, den +seneste udgivelse, statusrapporter og mere, kan du besøge ScummVMs hjemme- +side på: http://www.scummvm.org/ + +Indholdsfortegnelse: +-------------------- +1.0) Indledning + * 1.1 Om ScummVM + * 1.2 Hurtig start +2.0) Kontakt + * 2.1 Rapportering af fejl + +1.0) Indledning: +---- ----------- + +1.1) Om ScummVM: +---- ----------- +ScummVM er et program, som tillader dig at køre visse klassiske grafiske +peg-og-klik eventyr spil, hvis du allerede har deres data filer. Den +smarte del omkring dette: ScummVM erstatter bare de eksekverbare filer +der fulgte med i spillet, så du kan afspille dem på systemer, hvor de +aldrig var designet til! + +Oprindeligt var det designet til at køre LucasArts' SCUMM spil, såsom +Maniac Mansion, Monkey Island, Day of the Tentacle eller Sam and Max. +SCUMM står for 'Script Creation Utility for Maniac Mansion', som var det +første spil som LucasArts designede dette system til. Og langt senere gav +navn til ScummVM ('VM', betyder Virtuel Maskine). + +Efterhånden er understøttelse for en masse ikke-SCUMM spil blevet tilføjet, +og ScummVM understøtter nu også mange af Sierras AGI og SCI-spil (såsom +Kings Quest 1-6, Space Quest 1-5, ...), Discworld 1 og 2, Simon the Sorcerer +1 og 2, Beneath A Steel Sky, Lure of the Temptress, Broken Sword I og II, +Flight of the Amazon Queen, Gobliiins 1-3, The Legend of Kyrandia serien, +mange af Humongous Entertainments børne SCUMM spil (herunder Freddi Fish +and Putt Putt spil) og mange flere. Du kan finde en komplet liste med +oplysninger om, hvilke eventyr der understøttes og hvor godt, på +kompatibilitetssiden. ScummVM forbedres løbende, så vend ofte tilbage. + +Blandt de systemer, som du kan spille disse spil på er regulære desktop +computere (Windows, Linux, Mac OS X, ...), spillekonsoller (Dreamcast, +Nintendo DS og Wii, PS2, PSP, ...), smartphones (Android, iPhone, PocketPC, +Symbian ...) og flere. + +På dette tidspunkt er ScummVM stadig under kraftig udvikling. Vær opmærksom +på, at selvom vi forsøger at sørge for, at mange spil kan gennemføres med få +store fejl, kan nedbrud ske, og vi tilbyder ingen garanti. Når det er sagt, +er nogle af spillene blevet understøttet i lang tid og bør fungerer fint +med alle nyere stabile udgaver. Du kan få en fornemmelse af, hvor godt +hvert spil virker i ScummVM, ved at kigge på kompatibilitetssiden. Faktisk, +hvis du søger lidt rundt, vil du måske opdage, at ScummVM endog anvendes +kommercielt til genudgivelse af nogle af understøttede spil på moderne +platforme. Dette viser, at flere virksomheder er tilfredse med kvaliteten +af ​​programmet, og hvor godt det kan køre nogle af spillene. + +Hvis du har fornøjelse af ScummVM, er du velkommen til at donere ved hjælp +af PayPal-knappen på ScummVM's hjemmeside. Dette vil hjælpe os med at købe +værktøjer nødvendige for at udvikle ScummVM nemmere og hurtigere. Hvis du +ikke kan donere, hjælp og bidrage med en programrettelse! + +1.2) Hurtig start: +---- ------------ +VIGTIGT: Denne korte vejledning antager, at du bruger ScummVM på dansk. +Som standard vil ScummVM bruge dit operativsystem sprog. Hvis du +foretrækker at bruge ScummVM på engelsk, kan du også foretrække at +følge vejledning fra den engelske README fil. + +For de utålmodige blandt jer, er her hvordan du får ScummVM op at køre +i fem enkle trin. + +1. Hent ScummVM fra og +installere det. + +2. Opret en mappe på din harddisk og kopiere spillets datafiler fra de +oprindelige medier til denne mappe. Gentag dette for hvert spil du +ønsker at spille (det er bedre at bruge en separat mappe til hvert spil). + +3. Start ScummVM. + +Hvis ScummVM på dette tidspunkt vises på engelsk i stedet for dansk, gør +som følger for at ændre sprog: + - Klik på 'Options'. + - Klik på højre pil i fanebjælken og vælg 'Misc' fanen. + - Vælg "Dansk" i "GUI Language'og klik på 'OK'. + - Bekræft meddelelsen boksen, der popper op, klik på 'Quit' for at + afslutte ScummVM og derefter genstarte programmet. + +Vælg nu 'Tilføj spil', vælge mappen med spillets datafiler (forsøg ikke +at vælge datafilerne selv!) Og tryk på 'Vælg' + +4. En dialog skulle komme op, hvor du kan konfigurere forskellige +indstillinger, hvis du ønsker det (det burde dog være fint at lade alt +forblive på sin standard). Bekræft dialogen. + +5. Vælg det spil, du ønsker at spille på listen, og tryk på 'Start'. + +ScummVM husker de spil, du tilføjer. Så hvis du lukker ScummVM, vil +listen over spil næste gang du starter den, indeholde alle de spil du +tidligere har tilføjet. Du kan derfor gå direkte til trin 5, medmindre +du ønsker at tilføje flere spil. + +Tip: Hvis du ønsker at tilføje flere spil på én gang, så prøv at trykke +og holde shift-tasten nede før du klikker på 'Tilføj spil' - teksten vil +skifte til 'Tilføj flere', og hvis du trykker på den, bliver du igen bedt +om at vælge en mappe, men denne gang vil ScummVM søge gennem alle +undermapper for understøttede spil. + +2.0) Kontakt: +---- -------- +Den nemmeste måde at kontakte ScummVM holdet på er ved at sende fejlrapporter +(se afsnit 2.1) eller ved at bruge vores fora på http://forums.scummvm.org. +Du kan også deltage og e-maile til scummvm-devel postlisten, eller chatte +med os på IRC (#scummvm på irc.freenode.net). Bed os venligst ikke om at +understøtte et ikke-understøttet spil -- læs FAQ på vores hjemmeside først. +Bemærk, at det officielle sprog i dette forum, mailing liste og chat er +engelsk og ingen andre sprog bør anvendes. + +2.1) Rapportering af fejl: +---- --------------------- +For at rapportere en fejl, skal du oprette en SourceForge konto, og følge +"Bug Tracker" linket fra vores hjemmeside. Sørg for at fejlen er reproducerbare, +og stadig forekommer i den seneste git/Daglig byggede version. +Kontroller også listen med kendte problemer (nedenfor) og kompatibilitetslisten +på vores hjemmeside for spillet, for at sikre, at problemet ikke allerede er kendt: + + http://www.scummvm.org/compatibility_stable.php + +Vær venlig ikke at rapportere fejl på spil, der ikke er anført som værende +mulige at gennemføre i 'understøttede spil' sektionen, eller kompatibilitetslisten. +Vi -ved- disse spil har fejl. + +Inkluder venligst følgende oplysninger: + - ScummVM version (VENLIGST test på den nyeste git/Daglig byggede) + - Detaljer om fejlen, herunder oplysninger om genskabelsen af fejlen + - Sprog i spillet (engelsk, tysk, ...) + - Version af spillet (talkie, diskette, ...) + - Platform og Kompiler (Win32, Linux, FreeBSD, ...) + - Medsend et gemt spil hvis det er muligt + - Hvis fejlen kun skete for nylig, notér venligst den sidste version + uden fejl, og den første version med fejlen. På denne måde kan vi + ordne det hurtigere ved at kigge på de foretagne ændringer. + +Endelig, bedes du rapportere hvert problem separat; indsend ikke flere +problemer på samme billet. (Ellers bliver det svært at spore status for +hver enkelt fejl). Husk også på, at alle fejlrapporter skal skrives på +engelsk. \ No newline at end of file diff --git a/ports.mk b/ports.mk index 271a352596..357a7e297a 100644 --- a/ports.mk +++ b/ports.mk @@ -160,6 +160,8 @@ osxsnap: bundle cp $(srcdir)/doc/QuickStart ./ScummVM-snapshot/doc/QuickStart mkdir ScummVM-snapshot/doc/cz cp $(srcdir)/doc/cz/PrectiMe ./ScummVM-snapshot/doc/cz/PrectiMe + mkdir ScummVM-snapshot/doc/da + cp $(srcdir)/doc/da/HurtigStart ./ScummVM-snapshot/doc/da/HurtigStart mkdir ScummVM-snapshot/doc/de cp $(srcdir)/doc/de/Liesmich ./ScummVM-snapshot/doc/de/Liesmich cp $(srcdir)/doc/de/Schnellstart ./ScummVM-snapshot/doc/de/Schnellstart @@ -176,6 +178,7 @@ osxsnap: bundle cp $(srcdir)/doc/se/Snabbstart ./ScummVM-snapshot/doc/se/Snabbstart /Developer/Tools/SetFile -t ttro -c ttxt ./ScummVM-snapshot/* xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/cz/* + xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/da/* xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/de/* xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/es/* xattr -w "com.apple.TextEncoding" "utf-8;134217984" ./ScummVM-snapshot/doc/fr/* @@ -206,6 +209,7 @@ win32dist: $(EXECUTABLE) mkdir -p $(WIN32PATH)/graphics mkdir -p $(WIN32PATH)/doc mkdir -p $(WIN32PATH)/doc/cz + mkdir -p $(WIN32PATH)/doc/da mkdir -p $(WIN32PATH)/doc/de mkdir -p $(WIN32PATH)/doc/es mkdir -p $(WIN32PATH)/doc/fr @@ -231,6 +235,7 @@ endif cp $(srcdir)/doc/fr/DemarrageRapide $(WIN32PATH)/doc/fr/DemarrageRapide.txt cp $(srcdir)/doc/it/GuidaRapida $(WIN32PATH)/doc/it/GuidaRapida.txt cp $(srcdir)/doc/no-nb/HurtigStart $(WIN32PATH)/doc/no-nb/HurtigStart.txt + cp $(srcdir)/doc/da/HurtigStart $(WIN32PATH)/doc/da/HurtigStart.txt cp $(srcdir)/doc/de/Schnellstart $(WIN32PATH)/doc/de/Schnellstart.txt cp $(srcdir)/doc/se/Snabbstart $(WIN32PATH)/doc/se/Snabbstart.txt cp $(srcdir)/README $(WIN32PATH)/README.txt @@ -246,6 +251,7 @@ endif unix2dos $(WIN32PATH)/*.txt unix2dos $(WIN32PATH)/doc/*.txt unix2dos $(WIN32PATH)/doc/cz/*.txt + unix2dos $(WIN32PATH)/doc/da/*.txt unix2dos $(WIN32PATH)/doc/de/*.txt unix2dos $(WIN32PATH)/doc/es/*.txt unix2dos $(WIN32PATH)/doc/fr/*.txt -- cgit v1.2.3 From 8b55dcf531e2842ca110f244789e29dbd4a0d0c3 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 7 Jul 2012 01:26:25 +0100 Subject: I18N: Regenerate translations data file --- gui/themes/translations.dat | Bin 322629 -> 337762 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 4812633011..2307ea20ae 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From 10ba526812daf504c086adf3057bdab643d3a3fe Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sat, 7 Jul 2012 20:13:02 +1000 Subject: SCUMM: Add another English Windows version of Freddi Fish and Luther's Maze Madness. --- devtools/scumm-md5.txt | 1 + engines/scumm/scumm-md5.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt index 176f04aaf8..d67f46205c 100644 --- a/devtools/scumm-md5.txt +++ b/devtools/scumm-md5.txt @@ -575,6 +575,7 @@ maze Freddi Fish and Luther's Maze Madness 4f04b321a95d4315ce6d65f8e1dd0368 -1 us All HE 80 - - Kirben cd424f143a141bc59226ad83a6e40f51 -1 nl All HE 98.5 - - daniel9, sugarcube 4dbff3787aedcd96b0b325f2d92d7ad9 -1 us All HE 100 Updated - Kirben + 4522564b3c31aaf218b6a96826a549fd -1 us Windows HE 100 - - legoking831 water Freddi Fish and Luther's Water Worries 4ba37f835be11a59d969f90f272f575b -1 us All HE 80 - - Kirben diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h index 0814e3bfe1..d6198b13c4 100644 --- a/engines/scumm/scumm-md5.h +++ b/engines/scumm/scumm-md5.h @@ -1,5 +1,5 @@ /* - This file was generated by the md5table tool on Fri Jun 15 09:16:45 2012 + This file was generated by the md5table tool on Sat Jul 07 10:02:31 2012 DO NOT EDIT MANUALLY! */ @@ -191,6 +191,7 @@ static const MD5Table md5table[] = { { "45082a5c9f42ba14dacfe1fdeeba819d", "freddicove", "HE 100", "Demo", 18422, Common::EN_ANY, Common::kPlatformUnknown }, { "45152f7cf2ba8f43cf8a8ea2e740ae09", "monkey", "VGA", "VGA", 8357, Common::ES_ESP, Common::kPlatformPC }, { "4521138d15d1fd7649c31fb981746231", "pajama2", "HE 98.5", "Demo", -1, Common::DE_DEU, Common::kPlatformUnknown }, + { "4522564b3c31aaf218b6a96826a549fd", "maze", "HE 100", "", -1, Common::EN_USA, Common::kPlatformWindows }, { "46b53fd430adcfbed791b48a0d4b079f", "funpack", "", "", -1, Common::EN_ANY, Common::kPlatformPC }, { "470c45b636139bb40716daa1c7edaad0", "loom", "EGA", "EGA", -1, Common::DE_DEU, Common::kPlatformPC }, { "477dbafbd66a53c98416dc01aef019ad", "monkey", "EGA", "EGA", -1, Common::IT_ITA, Common::kPlatformPC }, -- cgit v1.2.3 From cfe7bf614b425671167a0b1e92418bfeb7b20bf4 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sat, 7 Jul 2012 14:37:15 +0100 Subject: TOON: Remove unecessary getSystem() function. This was needed due to the unecessary protected shadow variable hiding the Engine superclass _system member variable. --- engines/toon/character.cpp | 14 +++++++------- engines/toon/movie.cpp | 20 ++++++++++---------- engines/toon/script_func.cpp | 4 ++-- engines/toon/toon.cpp | 3 +-- engines/toon/toon.h | 5 ----- 5 files changed, 20 insertions(+), 26 deletions(-) diff --git a/engines/toon/character.cpp b/engines/toon/character.cpp index e19656f2c8..479f4965f3 100644 --- a/engines/toon/character.cpp +++ b/engines/toon/character.cpp @@ -62,7 +62,7 @@ Character::Character(ToonEngine *vm) : _vm(vm) { _speed = 150; // 150 = nominal drew speed _lastWalkTime = 0; _numPixelToWalk = 0; - _nextIdleTime = _vm->getSystem()->getMillis() + (_vm->randRange(0, 600) + 300) * _vm->getTickLength(); + _nextIdleTime = _vm->_system->getMillis() + (_vm->randRange(0, 600) + 300) * _vm->getTickLength(); _lineToSayId = 0; } @@ -101,7 +101,7 @@ void Character::setFacing(int32 facing) { int32 dir = 0; - _lastWalkTime = _vm->getSystem()->getMillis(); + _lastWalkTime = _vm->_system->getMillis(); if ((_facing - facing + 8) % 8 > (facing - _facing + 8) % 8) dir = 1; else @@ -188,7 +188,7 @@ bool Character::walkTo(int16 newPosX, int16 newPosY) { _currentPathNode = 0; stopSpecialAnim(); - _lastWalkTime = _vm->getSystem()->getMillis(); + _lastWalkTime = _vm->_system->getMillis(); _numPixelToWalk = 0; @@ -220,8 +220,8 @@ bool Character::walkTo(int16 newPosX, int16 newPosY) { } // in 1/1000 pixels - _numPixelToWalk += _speed * (_vm->getSystem()->getMillis() - _lastWalkTime) * _scale / 1024; - _lastWalkTime = _vm->getSystem()->getMillis(); + _numPixelToWalk += _speed * (_vm->_system->getMillis() - _lastWalkTime) * _scale / 1024; + _lastWalkTime = _vm->_system->getMillis(); while (_numPixelToWalk >= 1000 && _currentPathNode < _currentPath.size()) { _x = _currentPath[_currentPathNode].x; @@ -356,8 +356,8 @@ void Character::update(int32 timeIncrement) { } // in 1/1000 pixels - _numPixelToWalk += _speed * (_vm->getSystem()->getMillis() - _lastWalkTime) * _scale / 1024; - _lastWalkTime = _vm->getSystem()->getMillis(); + _numPixelToWalk += _speed * (_vm->_system->getMillis() - _lastWalkTime) * _scale / 1024; + _lastWalkTime = _vm->_system->getMillis(); while (_numPixelToWalk > 1000 && _currentPathNode < _currentPath.size()) { _x = _currentPath[_currentPathNode].x; diff --git a/engines/toon/movie.cpp b/engines/toon/movie.cpp index 8cdf92363f..93e41adf57 100644 --- a/engines/toon/movie.cpp +++ b/engines/toon/movie.cpp @@ -109,40 +109,40 @@ bool Movie::playVideo(bool isFirstIntroVideo) { if (frame) { if (_decoder->isLowRes()) { // handle manually 2x scaling here - Graphics::Surface* surf = _vm->getSystem()->lockScreen(); + Graphics::Surface* surf = _vm->_system->lockScreen(); for (int y = 0; y < frame->h / 2; y++) { memcpy(surf->getBasePtr(0, y * 2 + 0), frame->getBasePtr(0, y), frame->pitch); memcpy(surf->getBasePtr(0, y * 2 + 1), frame->getBasePtr(0, y), frame->pitch); } - _vm->getSystem()->unlockScreen(); + _vm->_system->unlockScreen(); } else { - _vm->getSystem()->copyRectToScreen(frame->pixels, frame->pitch, 0, 0, frame->w, frame->h); + _vm->_system->copyRectToScreen(frame->pixels, frame->pitch, 0, 0, frame->w, frame->h); // WORKAROUND: There is an encoding glitch in the first intro video. This hides this using the adjacent pixels. if (isFirstIntroVideo) { int32 currentFrame = _decoder->getCurFrame(); if (currentFrame >= 956 && currentFrame <= 1038) { debugC(1, kDebugMovie, "Triggered workaround for glitch in first intro video..."); - _vm->getSystem()->copyRectToScreen(frame->getBasePtr(frame->w-188, 123), frame->pitch, frame->w-188, 124, 188, 1); - _vm->getSystem()->copyRectToScreen(frame->getBasePtr(frame->w-188, 126), frame->pitch, frame->w-188, 125, 188, 1); - _vm->getSystem()->copyRectToScreen(frame->getBasePtr(0, 125), frame->pitch, 0, 126, 64, 1); - _vm->getSystem()->copyRectToScreen(frame->getBasePtr(0, 128), frame->pitch, 0, 127, 64, 1); + _vm->_system->copyRectToScreen(frame->getBasePtr(frame->w-188, 123), frame->pitch, frame->w-188, 124, 188, 1); + _vm->_system->copyRectToScreen(frame->getBasePtr(frame->w-188, 126), frame->pitch, frame->w-188, 125, 188, 1); + _vm->_system->copyRectToScreen(frame->getBasePtr(0, 125), frame->pitch, 0, 126, 64, 1); + _vm->_system->copyRectToScreen(frame->getBasePtr(0, 128), frame->pitch, 0, 127, 64, 1); } } } } _decoder->setSystemPalette(); - _vm->getSystem()->updateScreen(); + _vm->_system->updateScreen(); } Common::Event event; - while (_vm->getSystem()->getEventManager()->pollEvent(event)) + while (_vm->_system->getEventManager()->pollEvent(event)) if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE)) { _vm->dirtyAllScreen(); return false; } - _vm->getSystem()->delayMillis(10); + _vm->_system->delayMillis(10); } _vm->dirtyAllScreen(); return !_vm->shouldQuit(); diff --git a/engines/toon/script_func.cpp b/engines/toon/script_func.cpp index e9b7534198..1fa4058114 100644 --- a/engines/toon/script_func.cpp +++ b/engines/toon/script_func.cpp @@ -564,9 +564,9 @@ int32 ScriptFunc::sys_Cmd_Exit_Conversation(EMCState *state) { int32 ScriptFunc::sys_Cmd_Set_Mouse_Pos(EMCState *state) { if (_vm->state()->_inCloseUp) { - _vm->getSystem()->warpMouse(stackPos(0), stackPos(1)); + _vm->_system->warpMouse(stackPos(0), stackPos(1)); } else { - _vm->getSystem()->warpMouse(stackPos(0) - _vm->state()->_currentScrollValue, stackPos(1)); + _vm->_system->warpMouse(stackPos(0) - _vm->state()->_currentScrollValue, stackPos(1)); } return 0; } diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp index 0956b965a7..ee427652d8 100644 --- a/engines/toon/toon.cpp +++ b/engines/toon/toon.cpp @@ -820,7 +820,6 @@ Common::Error ToonEngine::run() { ToonEngine::ToonEngine(OSystem *syst, const ADGameDescription *gameDescription) : Engine(syst), _gameDescription(gameDescription), _language(gameDescription->language), _rnd("toon") { - _system = syst; _tickLength = 16; _currentPicture = NULL; _inventoryPicture = NULL; @@ -1224,7 +1223,7 @@ void ToonEngine::loadScene(int32 SceneId, bool forGameLoad) { _script->init(&_sceneAnimationScripts[i]._state, _sceneAnimationScripts[i]._data); if (!forGameLoad) { _script->start(&_sceneAnimationScripts[i]._state, 9 + i); - _sceneAnimationScripts[i]._lastTimer = getSystem()->getMillis(); + _sceneAnimationScripts[i]._lastTimer = _system->getMillis(); _sceneAnimationScripts[i]._frozen = false; _sceneAnimationScripts[i]._frozenForConversation = false; } diff --git a/engines/toon/toon.h b/engines/toon/toon.h index 540f3e403b..d40c489011 100644 --- a/engines/toon/toon.h +++ b/engines/toon/toon.h @@ -289,10 +289,6 @@ public: return _oldTimer2; } - OSystem *getSystem() { - return _system; - } - AudioManager *getAudioManager() { return _audioManager; } @@ -340,7 +336,6 @@ public: void clearDirtyRects(); protected: - OSystem *_system; int32 _tickLength; Resources *_resources; TextResource *_genericTexts; -- cgit v1.2.3 From 4f9b9ce3cc263b5e5ad9a223ca2a01f3b9ddaf39 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sun, 8 Jul 2012 09:41:25 +1000 Subject: SCUMM: Correct HE version for another English Windows version of Freddi Fish and Luther's Maze Madness. --- devtools/scumm-md5.txt | 2 +- engines/scumm/scumm-md5.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt index d67f46205c..42dcb27d1a 100644 --- a/devtools/scumm-md5.txt +++ b/devtools/scumm-md5.txt @@ -575,7 +575,7 @@ maze Freddi Fish and Luther's Maze Madness 4f04b321a95d4315ce6d65f8e1dd0368 -1 us All HE 80 - - Kirben cd424f143a141bc59226ad83a6e40f51 -1 nl All HE 98.5 - - daniel9, sugarcube 4dbff3787aedcd96b0b325f2d92d7ad9 -1 us All HE 100 Updated - Kirben - 4522564b3c31aaf218b6a96826a549fd -1 us Windows HE 100 - - legoking831 + 4522564b3c31aaf218b6a96826a549fd -1 us Windows HE 99 - - legoking831 water Freddi Fish and Luther's Water Worries 4ba37f835be11a59d969f90f272f575b -1 us All HE 80 - - Kirben diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h index d6198b13c4..d4eefe8c28 100644 --- a/engines/scumm/scumm-md5.h +++ b/engines/scumm/scumm-md5.h @@ -1,5 +1,5 @@ /* - This file was generated by the md5table tool on Sat Jul 07 10:02:31 2012 + This file was generated by the md5table tool on Sat Jul 07 23:39:27 2012 DO NOT EDIT MANUALLY! */ @@ -191,7 +191,7 @@ static const MD5Table md5table[] = { { "45082a5c9f42ba14dacfe1fdeeba819d", "freddicove", "HE 100", "Demo", 18422, Common::EN_ANY, Common::kPlatformUnknown }, { "45152f7cf2ba8f43cf8a8ea2e740ae09", "monkey", "VGA", "VGA", 8357, Common::ES_ESP, Common::kPlatformPC }, { "4521138d15d1fd7649c31fb981746231", "pajama2", "HE 98.5", "Demo", -1, Common::DE_DEU, Common::kPlatformUnknown }, - { "4522564b3c31aaf218b6a96826a549fd", "maze", "HE 100", "", -1, Common::EN_USA, Common::kPlatformWindows }, + { "4522564b3c31aaf218b6a96826a549fd", "maze", "HE 99", "", -1, Common::EN_USA, Common::kPlatformWindows }, { "46b53fd430adcfbed791b48a0d4b079f", "funpack", "", "", -1, Common::EN_ANY, Common::kPlatformPC }, { "470c45b636139bb40716daa1c7edaad0", "loom", "EGA", "EGA", -1, Common::DE_DEU, Common::kPlatformPC }, { "477dbafbd66a53c98416dc01aef019ad", "monkey", "EGA", "EGA", -1, Common::IT_ITA, Common::kPlatformPC }, -- cgit v1.2.3 From e265be07bfb03ee9686ea27b2e12bf4d61ad3732 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Sun, 8 Jul 2012 09:54:09 +0200 Subject: MOHAWK: Run animations attached to LiveText items. Should fix bug #3541294. --- engines/mohawk/livingbooks.cpp | 14 +++++++++----- engines/mohawk/livingbooks.h | 3 +++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp index 708478a6d8..f5e5e7d7b4 100644 --- a/engines/mohawk/livingbooks.cpp +++ b/engines/mohawk/livingbooks.cpp @@ -3378,11 +3378,10 @@ void LBLiveTextItem::readData(uint16 type, uint16 size, Common::MemoryReadStream LiveTextWord word; word.bounds = _vm->readRect(stream); word.soundId = stream->readUint16(); - // TODO: unknowns - uint16 unknown1 = stream->readUint16(); - uint16 unknown2 = stream->readUint16(); - debug(4, "Word: (%d, %d) to (%d, %d), sound %d, unknowns %04x, %04x", - word.bounds.left, word.bounds.top, word.bounds.right, word.bounds.bottom, word.soundId, unknown1, unknown2); + word.itemType = stream->readUint16(); + word.itemId = stream->readUint16(); + debug(4, "Word: (%d, %d) to (%d, %d), sound %d, item %d (type %d)", + word.bounds.left, word.bounds.top, word.bounds.right, word.bounds.bottom, word.soundId, word.itemId, word.itemType); _words.push_back(word); } @@ -3531,6 +3530,11 @@ void LBLiveTextItem::handleMouseDown(Common::Point pos) { _currentWord = i; _vm->playSound(this, soundId); paletteUpdate(_currentWord, true); + + // TODO: check this in RE + LBItem *item = _vm->getItemById(_words[i].itemId); + if (item) + item->togglePlaying(false); return; } } diff --git a/engines/mohawk/livingbooks.h b/engines/mohawk/livingbooks.h index 91d6a8cd30..76da7d8219 100644 --- a/engines/mohawk/livingbooks.h +++ b/engines/mohawk/livingbooks.h @@ -537,6 +537,9 @@ protected: struct LiveTextWord { Common::Rect bounds; uint16 soundId; + + uint16 itemType; + uint16 itemId; }; struct LiveTextPhrase { -- cgit v1.2.3 From 87b79f2124a1d13cfd3a62d9a526d1770a340b19 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Sun, 8 Jul 2012 10:27:31 +0200 Subject: COMPOSER: Fix parsing v1 book groups. This fixes bug #3539019. --- engines/composer/composer.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp index 556dad7e94..23a9d2ff85 100644 --- a/engines/composer/composer.cpp +++ b/engines/composer/composer.cpp @@ -381,11 +381,17 @@ void ComposerEngine::loadLibrary(uint id) { filename = getStringFromConfig(_bookGroup, Common::String::format("%d", id)); filename = mangleFilename(filename); + // bookGroup is the basename of the path. + // TODO: tidy this up. _bookGroup.clear(); for (uint i = 0; i < filename.size(); i++) { - if (filename[i] == '\\' || filename[i] == ':') + if (filename[i] == '~' || filename[i] == '/' || filename[i] == ':') continue; for (uint j = 0; j < filename.size(); j++) { + if (filename[j] == '/') { + _bookGroup.clear(); + continue; + } if (filename[j] == '.') break; _bookGroup += filename[j]; -- cgit v1.2.3 From 93cc9c92c90162a73c0da5dee9b26b0a0012d60b Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 8 Jul 2012 12:36:30 +0100 Subject: I18N: Update French translation --- po/fr_FR.po | 117 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/po/fr_FR.po b/po/fr_FR.po index be7ddddbed..e153beb3a5 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" -"PO-Revision-Date: 2011-10-23 14:52+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"PO-Revision-Date: 2012-07-08 12:24+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" "MIME-Version: 1.0\n" @@ -193,9 +193,8 @@ msgid "Platform:" msgstr "Systme:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Examiner" +msgstr "Moteur" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -1145,13 +1144,13 @@ msgid "~R~eturn to Launcher" msgstr "Retour au ~L~anceur" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Sauvegarde:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1171,14 +1170,13 @@ msgstr "" "obtenir de l'aide supplmentaire." #: engines/dialogs.cpp:228 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Dsol, il n'y a pas d'aide disponible dans ce jeu actuellement. Lisez le " -"fichier README pour les informations de base et les instructions pour " -"obtenir de l'aide supplmentaire." +"Echec de la sauvegarde (%s)! Lisez le fichier README pour les informations " +"de base et les instructions pour obtenir de l'aide supplmentaire." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 @@ -1239,14 +1237,13 @@ msgstr "" "Lisez le fichier README pour plus de dtails." #: engines/engine.cpp:426 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Dsol, il n'y a pas d'aide disponible dans ce jeu actuellement. Lisez le " -"fichier README pour les informations de base et les instructions pour " -"obtenir de l'aide supplmentaire." +"Echec du chargement (%s)! . Lisez le fichier README pour les informations de " +"base et les instructions pour obtenir de l'aide supplmentaire." #: engines/engine.cpp:439 msgid "" @@ -1265,84 +1262,88 @@ msgstr "Jouer quand m #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Utiliser les dialogues sauvegarde/chargement d'origine" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" +"Utiliser les dialogues sauvegarde/chargement d'origine plutt que ceux de " +"ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Charger le jeu:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Charger" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "lment en haut droite" +msgstr "Utiliser le mode palette lumineuse" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Utiliser la palette lumineuse du jeu pour l'affichage" #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "Dtramage EGA" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "Active le dtramage dans les jeux EGA qui le supporte" +msgstr "Activer le dtramage dans les jeux EGA" #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Volume des effets spciaux sonores" +msgstr "Prfrer les effets sonors digitals" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Prfrer les effets sonores digitaux plutt que ceux synthtiss" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "Utiliser IMF/Yamaha FB-01 pour la sortie MIDI" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" +"Utiliser une carte IBM Music Feature ou un module Yamaha FB-01 FM pour la " +"sortie MIDI" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "Utiliser la musique du CD" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" msgstr "" +"Utiliser la musique du CD quand elle est disponible au lieu de la musique du " +"jeu" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Utiliser les curseurs Windows" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" +"Utiliser les curseurs Windows (plus petits et monochromes) au lieu des " +"curseurs DOS" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Curseur normal" +msgstr "Utiliser les curseurs argents" #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" -msgstr "" +msgstr "Utiliser les curseurs argents au lieu des curseurs normaux dors" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -2096,61 +2097,59 @@ msgstr " #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Public en studio" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Activer le public en studio" #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr "Support des interruptions" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Permet de sauter les textes et scnes cinmatiques" #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Mode Helium" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Activer le mode Roland GS" +msgstr "Activer le mode helium" #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Dfilement rgulier" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Activer le dfilement rgulier en marchant" #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Curseur normal" +msgstr "Curseurs flotants" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Activer les curseurs flotants" #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr "Bar HP" #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr "Activer les bars de sant (Hit Point)" #: engines/kyra/lol.cpp:478 msgid "Attack 1" @@ -2201,12 +2200,13 @@ msgid "Choose Spell" msgstr "Choisir un Sort" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Il semble que vous utilisiez un priphrique General MIDI,\n" "mais ce jeu ne support que le MIDI Roland MT32.\n" @@ -2216,11 +2216,11 @@ msgstr "" #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Intro disquette" #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr "Utiliser l'intro de la version disquette (version CD uniquement)" #: engines/sky/compact.cpp:130 msgid "" @@ -2242,6 +2242,7 @@ msgstr "" #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" +"La scne cinmatique PSX '%s' ne peut pas tre lu avec 256 couleurs ou moins" #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" @@ -2298,20 +2299,19 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "C'est la fin de la dmo des Chevaliers de Baphomet" #: engines/sword2/animation.cpp:435 -#, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" -"Les squences DXA sont prsente mais ScummVM a t compil sans le support " -"zlib." +"Scnes cinmatique PSX dtectes mais ScummVM a t compil sans le support " +"des couleurs RGB" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr "Afficher la description des objets" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr "Afficher la description des objets lors de passage du pointeur" #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2451,9 +2451,8 @@ msgid "Keymap:" msgstr "Affectation des touches:" #: backends/keymapper/remap-dialog.cpp:66 -#, fuzzy msgid " (Effective)" -msgstr "(Actif)" +msgstr "(Effectif)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Active)" @@ -2461,7 +2460,7 @@ msgstr "(Actif)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr "(Bloqu)" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" -- cgit v1.2.3 From 36f63e665a188929bef38f759096a10db8982d50 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 8 Jul 2012 12:38:47 +0100 Subject: I18N: Update all translations from source code This in particular fixes the spelling of Yamaha. --- po/ca_ES.po | 19 +- po/cs_CZ.po | 23 +- po/da_DA.po | 23 +- po/de_DE.po | 53 ++-- po/es_ES.po | 23 +- po/eu.po | 19 +- po/hu_HU.po | 23 +- po/it_IT.po | 21 +- po/nb_NO.po | 762 ++++++++++++++++++++++++--------------------------------- po/nn_NO.po | 18 +- po/pl_PL.po | 19 +- po/pt_BR.po | 19 +- po/ru_RU.po | 19 +- po/scummvm.pot | 18 +- po/se_SE.po | 21 +- po/uk_UA.po | 19 +- 16 files changed, 502 insertions(+), 597 deletions(-) diff --git a/po/ca_ES.po b/po/ca_ES.po index d076f96f55..8a978bee0d 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2011-10-04 20:51+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" @@ -1144,13 +1144,13 @@ msgid "~R~eturn to Launcher" msgstr "~R~etorna al Llanador" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Desa la partida:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1268,11 +1268,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Recupera la partida:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Restaura" @@ -1304,12 +1304,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" @@ -2203,12 +2203,13 @@ msgid "Choose Spell" msgstr "Escull" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Sembla que esteu utilitzant un dispositiu General\n" "MIDI, per el joc noms suporta MIDI de Roland\n" diff --git a/po/cs_CZ.po b/po/cs_CZ.po index 93bfed0261..6bf4e77206 100644 --- a/po/cs_CZ.po +++ b/po/cs_CZ.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-05-22 21:02+0100\n" "Last-Translator: Zbynk Schwarz \n" "Language-Team: \n" @@ -1131,13 +1131,13 @@ msgid "~R~eturn to Launcher" msgstr "~N~vrat do Spoute" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Uloit hru:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1256,11 +1256,11 @@ msgstr "Pou msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Pout pvodn obrazovky naten/uloen msto ze ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Obnovit hru" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Obnovit" @@ -1289,15 +1289,15 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Upednostovat digitln zvukov efekty ped syntetizovanmi" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "Pout IMF/Yahama FB-01 pro vstup MIDI" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "Pout IMF/Yamaha FB-01 pro vstup MIDI" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -"Pout kartu IBM Music Feature nebo modul syntetiztoru Yahama FB-01 FM pro " +"Pout kartu IBM Music Feature nebo modul syntetiztoru Yamaha FB-01 FM pro " "vstup MIDI" #: engines/sci/detection.cpp:411 @@ -2180,12 +2180,13 @@ msgid "Choose Spell" msgstr "Zvolit Kouzlo" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Zd se, e pouvte zazen General MIDI,\n" "ale Vae hra podporuje pouze Roland MT32 MIDI.\n" diff --git a/po/da_DA.po b/po/da_DA.po index eb62af84a9..d3a39db440 100644 --- a/po/da_DA.po +++ b/po/da_DA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-06-29 19:45+0100\n" "Last-Translator: Steffen Nyeland \n" "Language-Team: Steffen Nyeland \n" @@ -1131,13 +1131,13 @@ msgid "~R~eturn to Launcher" msgstr "~R~etur til oversigt" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Gemmer:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1257,11 +1257,11 @@ msgstr "Brug original gem/indl msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Brug de originale gem/indls skrme, istedet for dem fra ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Gendan spil:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Gendan" @@ -1290,15 +1290,15 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Foretrk digitale lydeffekter i stedet for syntetiserede" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "Brug IMF/Yahama FB-01 til MIDI-udgang" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "Brug IMF/Yamaha FB-01 til MIDI-udgang" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -"Bruge et IBM Musik Feature-kort eller et Yahama FB-01 FM synth modul til " +"Bruge et IBM Musik Feature-kort eller et Yamaha FB-01 FM synth modul til " "MIDI-udgang" #: engines/sci/detection.cpp:411 @@ -2182,12 +2182,13 @@ msgid "Choose Spell" msgstr "Vlg magi" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Det lader til at du en General MIDI-enhed,\n" "men dit spil kun understtter Roland MT32 MIDI.\n" diff --git a/po/de_DE.po b/po/de_DE.po index d68dcb2d8e..c40e08034a 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-01-29 21:11+0100\n" "Last-Translator: Simon Sawatzki \n" "Language-Team: Simon Sawatzki (Lead), Lothar Serra Mari " @@ -931,8 +931,9 @@ 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 "" -"Das ausgewhlte Thema untersttzt nicht die aktuelle Sprache. Wenn Sie dieses " -"Thema benutzen wollen, mssen Sie erst zu einer anderen Sprache wechseln." +"Das ausgewhlte Thema untersttzt nicht die aktuelle Sprache. Wenn Sie " +"dieses Thema benutzen wollen, mssen Sie erst zu einer anderen Sprache " +"wechseln." #: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" @@ -1150,13 +1151,13 @@ msgid "~R~eturn to Launcher" msgstr "Zur Spiele~l~iste" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Speichern:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1250,8 +1251,8 @@ msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Laden des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-" -"Datei fr grundlegende Informationen und Anweisungen zu weiterer Hilfe." +"Laden des Spielstands %s fehlgeschlagen! Bitte lesen Sie die Liesmich-Datei " +"fr grundlegende Informationen und Anweisungen zu weiterer Hilfe." #: engines/engine.cpp:439 msgid "" @@ -1276,13 +1277,14 @@ msgstr "Originale Spielstand-Men #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" -msgstr "Verwendet die originalen Mens zum Speichern und Laden statt der von ScummVM." +msgstr "" +"Verwendet die originalen Mens zum Speichern und Laden statt der von ScummVM." -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Spiel laden:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Laden" @@ -1311,16 +1313,16 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Bevorzugt digitale Sound-Effekte statt synthethisierter." #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "IMF/Yahama FB-01 fr MIDI-Ausgabe verwenden" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "IMF/Yamaha FB-01 fr MIDI-Ausgabe verwenden" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -"Verwendet eine Music-Feature-Karte von IBM oder ein " -"Yahama-FB-01-FM-Synthetisierungsmodul fr die MIDI-Ausgabe." +"Verwendet eine Music-Feature-Karte von IBM oder ein Yamaha-FB-01-FM-" +"Synthetisierungsmodul fr die MIDI-Ausgabe." #: engines/sci/detection.cpp:411 msgid "Use CD audio" @@ -2208,12 +2210,13 @@ msgid "Choose Spell" msgstr "Zauberspruch auswhlen" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Sie scheinen ein General-MIDI-Gert zu\n" "verwenden, aber das Spiel untersttzt nur\n" @@ -2280,10 +2283,10 @@ msgid "" "Press OK to convert them now, otherwise you will be asked again the next " "time you start the game.\n" msgstr "" -"ScummVM hat erkannt, dass Sie alte Spielstnde von Baphomets Fluch 1 " -"haben, die umgewandelt werden sollten.\n" -"Das alte Speicherformat wird nicht mehr untersttzt, also knnen Sie " -"diese Spielstnde unkonvertiert nicht laden.\n" +"ScummVM hat erkannt, dass Sie alte Spielstnde von Baphomets Fluch 1 haben, " +"die umgewandelt werden sollten.\n" +"Das alte Speicherformat wird nicht mehr untersttzt, also knnen Sie diese " +"Spielstnde unkonvertiert nicht laden.\n" "\n" "Klicken Sie auf OK, um diese jetzt umzuwandeln, sonst werden Sie erneut " "gefragt, wenn Sie nchstes Mal dieses Spiel starten.\n" @@ -2313,8 +2316,8 @@ msgstr "Das ist das Ende der Demo von Broken Sword 1 (Baphomets Fluch 1)." msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" -"PSX-Zwischensequenzen gefunden, aber ScummVM wurde ohne Untersttzung " -"fr RGB-Farben erstellt." +"PSX-Zwischensequenzen gefunden, aber ScummVM wurde ohne Untersttzung fr " +"RGB-Farben erstellt." #: engines/sword2/sword2.cpp:79 msgid "Show object labels" @@ -2350,8 +2353,8 @@ msgid "" "\n" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" -"ScummVM hat erkannt, dass Sie alte Spielstnde von Nippon Safes haben, " -"die umbenannt werden sollten.\n" +"ScummVM hat erkannt, dass Sie alte Spielstnde von Nippon Safes haben, die " +"umbenannt werden sollten.\n" "Die alten Dateinamen werden nicht mehr untersttzt, also knnen Sie diese " "Spielstnde unkonvertiert nicht laden.\n" "\n" diff --git a/po/es_ES.po b/po/es_ES.po index 9849a1798b..fffd190695 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-06-22 17:44+0100\n" "Last-Translator: Toms Maidagan\n" "Language-Team: \n" @@ -1136,13 +1136,13 @@ msgid "~R~eturn to Launcher" msgstr "~V~olver al lanzador" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Guardar partida" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1264,11 +1264,11 @@ 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" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Cargar partida:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Cargar" @@ -1297,15 +1297,15 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Preferir efectos de sonido digitales en vez de los sintetizados" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "Usar IMF/Yahama FB-01 para la salida MIDI" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "Usar IMF/Yamaha FB-01 para la salida MIDI" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -"Usa una tarjeta IBM Music o un mdulo sintetizador Yahama FB-01 FM para la " +"Usa una tarjeta IBM Music o un mdulo sintetizador Yamaha FB-01 FM para la " "salida MIDI" #: engines/sci/detection.cpp:411 @@ -2190,12 +2190,13 @@ msgid "Choose Spell" msgstr "Elegir hechizo" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Ests usando un dispositivo General Midi, pero el\n" "juego solo es compatible con MIDI Roland MT32.\n" diff --git a/po/eu.po b/po/eu.po index fa0d3030b6..5bc553e572 100644 --- a/po/eu.po +++ b/po/eu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2011-12-15 14:53+0100\n" "Last-Translator: Mikel Iturbe Urretxa \n" "Language-Team: Librezale \n" @@ -1137,13 +1137,13 @@ msgid "~R~eturn to Launcher" msgstr "It~z~uli abiarazlera" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Gorde jokoa:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1261,11 +1261,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Jokoa kargatu:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Kargatu" @@ -1297,12 +1297,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" @@ -2189,12 +2189,13 @@ msgid "Choose Spell" msgstr "Sorginkeria aukeratu" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "General MIDI gailua erabiltzen zaudela dirudi,\n" "baina zure jokoak Roland MT32 MIDI bakarrik\n" diff --git a/po/hu_HU.po b/po/hu_HU.po index c868806a8a..29ad6c3aeb 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-06-25 06:21+0100\n" "Last-Translator: George Kormendi \n" "Language-Team: Hungarian\n" @@ -1130,13 +1130,13 @@ msgid "~R~eturn to Launcher" msgstr "Visszatrs az indtba" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Jtk mentse:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1254,11 +1254,11 @@ msgstr "Eredeti ment/t msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Az eredeti ments/betlts kperny hasznlata a ScummVM kpek helyett" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Jtkmenet visszalltsa:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Visszallts" @@ -1287,15 +1287,15 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Digitlis hanghatsok elnyben a szintetizltakkal szemben" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "IMF/Yahama FB-01 hasznlata MIDI kimentre" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "IMF/Yamaha FB-01 hasznlata MIDI kimentre" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -"IBM Music Feature krtya vagy Yahama FB-01 FM szintetiztor modul hasznlata " +"IBM Music Feature krtya vagy Yamaha FB-01 FM szintetiztor modul hasznlata " "MIDI kimenetre" #: engines/sci/detection.cpp:411 @@ -2178,12 +2178,13 @@ msgid "Choose Spell" msgstr "Vlassz varzslatot" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "gy nz ki egy General MIDI eszkzt hasznlsz,\n" "a jtk csak Roland MT32 MIDI eszkzt tmogat.\n" diff --git a/po/it_IT.po b/po/it_IT.po index 26bf3773f9..d4f8256c83 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-06-29 14:33+0100\n" "Last-Translator: Matteo 'Maff' Angelino \n" "Language-Team: Italian\n" @@ -1137,13 +1137,13 @@ msgid "~R~eturn to Launcher" msgstr "~V~ai a elenco giochi" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Salva gioco:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1266,11 +1266,11 @@ msgstr "" "Usa le schermate originali di salvataggio e caricamento, al posto di quelle " "di ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Ripristina gioco:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Ripristina" @@ -1299,12 +1299,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Scegli gli effetti sonori digitali al posto di quelli sintetizzati" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "Usa IMF/Yahama FB-01 per output MIDI" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "Usa IMF/Yamaha FB-01 per output MIDI" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" "Usa una scheda IBM Music Feature o un modulo synth Yamaha FB-01 FM per " @@ -2194,12 +2194,13 @@ msgid "Choose Spell" msgstr "Scegli incantesimo" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Sembra che tu stia utilizzanto un dispositivo\n" "General MIDI, ma il gioco supporta solo Roland\n" diff --git a/po/nb_NO.po b/po/nb_NO.po index 0975877d65..bc7b1720fa 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-07-04 02:19+0100\n" "Last-Translator: Einar Johan Smen \n" "Language-Team: somaen \n" @@ -37,8 +37,7 @@ msgstr "Tilgjengelige motorer:" msgid "Go up" msgstr "G tilbake" -#: gui/browser.cpp:66 -#: gui/browser.cpp:68 +#: gui/browser.cpp:66 gui/browser.cpp:68 msgid "Go to previous directory level" msgstr "G til forrige mappeniv" @@ -47,37 +46,24 @@ msgctxt "lowres" msgid "Go up" msgstr "G tilbake" -#: gui/browser.cpp:69 -#: gui/chooser.cpp:45 -#: gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 -#: gui/massadd.cpp:94 -#: gui/options.cpp:1228 -#: gui/saveload.cpp:64 -#: gui/saveload.cpp:173 -#: gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 +#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 +#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 +#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Avbryt" -#: gui/browser.cpp:70 -#: gui/chooser.cpp:46 -#: gui/themebrowser.cpp:55 +#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Velg" -#: gui/gui-manager.cpp:115 -#: 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 +#: gui/gui-manager.cpp:115 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 #: backends/keymapper/remap-dialog.cpp:52 msgid "Close" msgstr "Lukk" @@ -86,23 +72,19 @@ msgstr "Lukk" msgid "Mouse click" msgstr "Musklikk" -#: gui/gui-manager.cpp:122 -#: base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:300 msgid "Display keyboard" msgstr "Vis tastatur" -#: gui/gui-manager.cpp:126 -#: base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:304 msgid "Remap keys" msgstr "Omkoble taster" -#: gui/gui-manager.cpp:129 -#: base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:307 msgid "Toggle FullScreen" msgstr "Veksle fullskjerm" -#: gui/KeysDialog.h:36 -#: gui/KeysDialog.cpp:145 +#: gui/KeysDialog.h:36 gui/KeysDialog.cpp:145 msgid "Choose an action to map" msgstr "Velg en handling for kobling" @@ -110,31 +92,17 @@ msgstr "Velg en handling for kobling" msgid "Map" msgstr "Koble" -#: gui/KeysDialog.cpp:42 -#: gui/launcher.cpp:346 -#: gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 -#: gui/massadd.cpp:91 -#: gui/options.cpp:1229 -#: engines/engine.cpp:361 -#: engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 +#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 +#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 +#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 +#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 +#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 +#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -144,16 +112,12 @@ msgstr "OK" msgid "Select an action and click 'Map'" msgstr "Velg en handling, og trykk 'Koble'" -#: gui/KeysDialog.cpp:80 -#: gui/KeysDialog.cpp:102 -#: gui/KeysDialog.cpp:141 +#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141 #, c-format msgid "Associated key : %s" msgstr "Koblet tast : %s" -#: gui/KeysDialog.cpp:82 -#: gui/KeysDialog.cpp:104 -#: gui/KeysDialog.cpp:143 +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 #, c-format msgid "Associated key : none" msgstr "Koblet tast: ingen" @@ -174,11 +138,13 @@ msgstr "Spill" msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:191 -#: gui/launcher.cpp:193 -#: gui/launcher.cpp:194 -msgid "Short game identifier used for referring to savegames and running the game from the command line" -msgstr "Kort spill-identifikator, brukt for referere til lagrede spill, og kjre spillet fra kommandolinjen" +#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"Kort spill-identifikator, brukt for referere til lagrede spill, og kjre " +"spillet fra kommandolinjen" #: gui/launcher.cpp:193 msgctxt "lowres" @@ -189,9 +155,7 @@ msgstr "ID:" msgid "Name:" msgstr "Navn:" -#: gui/launcher.cpp:198 -#: gui/launcher.cpp:200 -#: gui/launcher.cpp:201 +#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201 msgid "Full title of the game" msgstr "Full spilltittel" @@ -204,17 +168,16 @@ msgstr "Navn:" msgid "Language:" msgstr "Sprk:" -#: gui/launcher.cpp:204 -#: gui/launcher.cpp:205 -msgid "Language of the game. This will not turn your Spanish game version into English" -msgstr "Spillets sprk. Dette vil ikke gjre din spanske spillversjon om til engelsk versjon" +#: gui/launcher.cpp:204 gui/launcher.cpp:205 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"Spillets sprk. Dette vil ikke gjre din spanske spillversjon om til engelsk " +"versjon" -#: gui/launcher.cpp:206 -#: gui/launcher.cpp:220 -#: gui/options.cpp:80 -#: gui/options.cpp:730 -#: gui/options.cpp:743 -#: gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 +#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 #: audio/null.cpp:40 msgid "" msgstr "" @@ -223,9 +186,7 @@ msgstr "" msgid "Platform:" msgstr "Plattform:" -#: gui/launcher.cpp:216 -#: gui/launcher.cpp:218 -#: gui/launcher.cpp:219 +#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219 msgid "Platform the game was originally designed for" msgstr "Plattform spillet opprinnelig ble designet for" @@ -238,15 +199,11 @@ msgstr "Plattform:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 -#: gui/options.cpp:1062 -#: gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" msgstr "Grafikk" -#: gui/launcher.cpp:239 -#: gui/options.cpp:1062 -#: gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "GFX" msgstr "GFX" @@ -259,8 +216,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Overstyr globale grafikkinstillinger" -#: gui/launcher.cpp:251 -#: gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1085 msgid "Audio" msgstr "Lyd" @@ -273,13 +229,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Overstyr globale lydinstillinger" -#: gui/launcher.cpp:265 -#: gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1090 msgid "Volume" msgstr "Volum" -#: gui/launcher.cpp:267 -#: gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1092 msgctxt "lowres" msgid "Volume" msgstr "Volum" @@ -293,8 +247,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Overstyr globale voluminstillinger" -#: gui/launcher.cpp:280 -#: gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1100 msgid "MIDI" msgstr "MIDI" @@ -307,8 +260,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Overstyr globale MIDI-instillinger" -#: gui/launcher.cpp:294 -#: gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1106 msgid "MT-32" msgstr "MT-32" @@ -321,13 +273,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Overstyr globale MT-32-instillinger" -#: gui/launcher.cpp:308 -#: gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1113 msgid "Paths" msgstr "Sti" -#: gui/launcher.cpp:310 -#: gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1115 msgctxt "lowres" msgid "Paths" msgstr "Sti" @@ -341,80 +291,54 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Spillsti:" -#: gui/launcher.cpp:324 -#: gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1139 msgid "Extra Path:" msgstr "Ekstrasti:" -#: gui/launcher.cpp:324 -#: gui/launcher.cpp:326 -#: gui/launcher.cpp:327 +#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327 msgid "Specifies path to additional data used the game" msgstr "Bestemmer sti til ytterligere data brukt av spillet" -#: gui/launcher.cpp:326 -#: gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1141 msgctxt "lowres" msgid "Extra Path:" msgstr "Ekstrasti:" -#: gui/launcher.cpp:333 -#: gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1123 msgid "Save Path:" msgstr "Lagringssti:" -#: gui/launcher.cpp:333 -#: gui/launcher.cpp:335 -#: gui/launcher.cpp:336 -#: gui/options.cpp:1123 -#: gui/options.cpp:1125 -#: gui/options.cpp:1126 +#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 +#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 msgid "Specifies where your savegames are put" msgstr "Bestemmer sti til lagrede spill" -#: gui/launcher.cpp:335 -#: gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1125 msgctxt "lowres" msgid "Save Path:" msgstr "Lagringssti:" -#: gui/launcher.cpp:354 -#: gui/launcher.cpp:453 -#: gui/launcher.cpp:511 -#: gui/launcher.cpp:565 -#: gui/options.cpp:1134 -#: gui/options.cpp:1142 -#: gui/options.cpp:1151 -#: gui/options.cpp:1258 -#: gui/options.cpp:1264 -#: gui/options.cpp:1272 -#: gui/options.cpp:1302 -#: gui/options.cpp:1308 -#: gui/options.cpp:1315 -#: gui/options.cpp:1408 -#: gui/options.cpp:1411 +#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 +#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 +#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 +#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 +#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 #: gui/options.cpp:1423 msgctxt "path" msgid "None" msgstr "Ingen" -#: gui/launcher.cpp:359 -#: gui/launcher.cpp:459 -#: gui/launcher.cpp:569 -#: gui/options.cpp:1252 -#: gui/options.cpp:1296 -#: gui/options.cpp:1414 +#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 +#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 -#: gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1417 msgid "Select SoundFont" msgstr "Velg SoundFont" -#: gui/launcher.cpp:523 -#: gui/launcher.cpp:677 +#: gui/launcher.cpp:523 gui/launcher.cpp:677 msgid "Select directory with game data" msgstr "Velg mappe med spilldata" @@ -430,13 +354,11 @@ msgstr "Velg mappe for lagrede spill" msgid "This game ID is already taken. Please choose another one." msgstr "Denne spill-IDen er allerede i bruk. Vennligst velg en annen." -#: gui/launcher.cpp:621 -#: engines/dialogs.cpp:110 +#: gui/launcher.cpp:621 engines/dialogs.cpp:110 msgid "~Q~uit" msgstr "~A~vslutt" -#: gui/launcher.cpp:621 -#: backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 msgid "Quit ScummVM" msgstr "Avslutt ScummVM" @@ -444,8 +366,7 @@ msgstr "Avslutt ScummVM" msgid "A~b~out..." msgstr "~O~m..." -#: gui/launcher.cpp:622 -#: backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 msgid "About ScummVM" msgstr "Om ScummVM" @@ -473,13 +394,11 @@ msgstr "~ msgid "Load savegame for selected game" msgstr "pne lagret spill for det valgte spillet" -#: gui/launcher.cpp:633 -#: gui/launcher.cpp:1120 +#: gui/launcher.cpp:633 gui/launcher.cpp:1120 msgid "~A~dd Game..." msgstr "~L~egg til spill..." -#: gui/launcher.cpp:633 -#: gui/launcher.cpp:640 +#: gui/launcher.cpp:633 gui/launcher.cpp:640 msgid "Hold Shift for Mass Add" msgstr "Hold Shift for legge til flere" @@ -487,8 +406,7 @@ msgstr "Hold Shift for msgid "~E~dit Game..." msgstr "~R~ediger spill..." -#: gui/launcher.cpp:635 -#: gui/launcher.cpp:642 +#: gui/launcher.cpp:635 gui/launcher.cpp:642 msgid "Change game options" msgstr "Endre spillinstillinger" @@ -496,13 +414,11 @@ msgstr "Endre spillinstillinger" msgid "~R~emove Game" msgstr "~F~jern spill" -#: gui/launcher.cpp:637 -#: gui/launcher.cpp:644 +#: gui/launcher.cpp:637 gui/launcher.cpp:644 msgid "Remove game from the list. The game data files stay intact" msgstr "Fjern spill fra listen. Spilldataene forblir intakte" -#: gui/launcher.cpp:640 -#: gui/launcher.cpp:1120 +#: gui/launcher.cpp:640 gui/launcher.cpp:1120 msgctxt "lowres" msgid "~A~dd Game..." msgstr "~L~egg til spill..." @@ -521,36 +437,31 @@ msgstr "~F~jern spill" msgid "Search in game list" msgstr "Sk i spilliste" -#: gui/launcher.cpp:656 -#: gui/launcher.cpp:1167 +#: gui/launcher.cpp:656 gui/launcher.cpp:1167 msgid "Search:" msgstr "Sk:" -#: gui/launcher.cpp:680 -#: engines/dialogs.cpp:114 -#: engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "pne spill:" -#: gui/launcher.cpp:680 -#: engines/dialogs.cpp:114 -#: engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 -#: backends/platform/wince/CEActionsPocket.cpp:267 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 +#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "pne" #: gui/launcher.cpp:788 -msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." -msgstr "Vil du virkelig kjre flerspill-finneren? Dette kan potensielt legge til et stort antall spill." +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Vil du virkelig kjre flerspill-finneren? Dette kan potensielt legge til et " +"stort antall spill." -#: gui/launcher.cpp:789 -#: gui/launcher.cpp:937 +#: gui/launcher.cpp:789 gui/launcher.cpp:937 #: backends/events/symbiansdl/symbiansdl-events.cpp:184 #: backends/platform/wince/CEActionsPocket.cpp:326 #: backends/platform/wince/CEActionsSmartphone.cpp:287 @@ -558,8 +469,7 @@ msgstr "Vil du virkelig kj msgid "Yes" msgstr "Ja" -#: gui/launcher.cpp:789 -#: gui/launcher.cpp:937 +#: gui/launcher.cpp:789 gui/launcher.cpp:937 #: backends/events/symbiansdl/symbiansdl-events.cpp:184 #: backends/platform/wince/CEActionsPocket.cpp:326 #: backends/platform/wince/CEActionsSmartphone.cpp:287 @@ -589,7 +499,8 @@ msgstr "Dette spillet st #: gui/launcher.cpp:1005 msgid "ScummVM could not find any engine capable of running the selected game!" -msgstr "ScummVM kunne ikke finne noen motor som kunne kjre det valgte spillet!" +msgstr "" +"ScummVM kunne ikke finne noen motor som kunne kjre det valgte spillet!" #: gui/launcher.cpp:1119 msgctxt "lowres" @@ -600,8 +511,7 @@ msgstr "Legg til flere..." msgid "Mass Add..." msgstr "Legg til flere..." -#: gui/massadd.cpp:78 -#: gui/massadd.cpp:81 +#: gui/massadd.cpp:78 gui/massadd.cpp:81 msgid "... progress ..." msgstr "... fremdrift ..." @@ -612,7 +522,8 @@ msgstr "S #: gui/massadd.cpp:261 #, c-format msgid "Discovered %d new games, ignored %d previously added games." -msgstr "Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere." +msgstr "" +"Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere." #: gui/massadd.cpp:265 #, c-format @@ -622,7 +533,8 @@ msgstr "Sjekket %d mapper ..." #: gui/massadd.cpp:268 #, c-format msgid "Discovered %d new games, ignored %d previously added games ..." -msgstr "Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere..." +msgstr "" +"Fant %d nye spill, ignorerte %d spill som har blitt lagt til tidligere..." #: gui/options.cpp:78 msgid "Never" @@ -664,11 +576,8 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 -#: gui/options.cpp:474 -#: gui/options.cpp:575 -#: gui/options.cpp:644 -#: gui/options.cpp:852 +#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 +#: gui/options.cpp:644 gui/options.cpp:852 msgctxt "soundfont" msgid "None" msgstr "Ingen" @@ -697,8 +606,7 @@ msgstr "Grafikkmodus:" msgid "Render mode:" msgstr "Tegnemodus:" -#: gui/options.cpp:741 -#: gui/options.cpp:742 +#: gui/options.cpp:741 gui/options.cpp:742 msgid "Special dithering modes supported by some games" msgstr "Spesiel dithering-modus stttet av enkelte spill" @@ -724,14 +632,11 @@ msgstr "Foretrukket enhet:" msgid "Music Device:" msgstr "Musikkenhet:" -#: gui/options.cpp:764 -#: gui/options.cpp:766 +#: gui/options.cpp:764 gui/options.cpp:766 msgid "Specifies preferred sound device or sound card emulator" msgstr "Velger foretrukket lydenhet eller lydkort-emulator" -#: gui/options.cpp:764 -#: gui/options.cpp:766 -#: gui/options.cpp:767 +#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 msgid "Specifies output sound device or sound card emulator" msgstr "Velger ut-lydenhet eller lydkortemulator" @@ -749,8 +654,7 @@ msgstr "Musikkenhet:" msgid "AdLib emulator:" msgstr "AdLib-emulator:" -#: gui/options.cpp:793 -#: gui/options.cpp:794 +#: gui/options.cpp:793 gui/options.cpp:794 msgid "AdLib is used for music in many games" msgstr "AdLib brukes til musikk i mange spill" @@ -758,10 +662,13 @@ msgstr "AdLib brukes til musikk i mange spill" msgid "Output rate:" msgstr "Utrate:" -#: gui/options.cpp:804 -#: gui/options.cpp:805 -msgid "Higher value specifies better sound quality but may be not supported by your soundcard" -msgstr "Hyere verdier gir bedre lydkvalitet, men stttes kanskje ikke av ditt lydkort " +#: gui/options.cpp:804 gui/options.cpp:805 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Hyere verdier gir bedre lydkvalitet, men stttes kanskje ikke av ditt " +"lydkort " #: gui/options.cpp:815 msgid "GM Device:" @@ -775,8 +682,7 @@ msgstr "Velger standard lydenhet for General MIDI-utdata" msgid "Don't use General MIDI music" msgstr "Ikke bruk General MIDI-musikk" -#: gui/options.cpp:837 -#: gui/options.cpp:899 +#: gui/options.cpp:837 gui/options.cpp:899 msgid "Use first available device" msgstr "Bruk frste tilgjengelige enhet" @@ -784,9 +690,7 @@ msgstr "Bruk f msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 -#: gui/options.cpp:851 -#: gui/options.cpp:852 +#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont stttes ikke av enkelte lydkort, FluidSynth og Timidity" @@ -819,10 +723,13 @@ msgstr "Velger standard lydenhet for Roland MT-32/LAPC1/CM32I/CM64-avspilling" msgid "True Roland MT-32 (disable GM emulation)" msgstr "Ekte Roland MT-32 (deaktiver GM-emulering)" -#: gui/options.cpp:875 -#: gui/options.cpp:877 -msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" -msgstr "Velg hvis du har et ekte Roland-kompatible lydkort tilkoblet maskinen, og vil bruke dette." +#: gui/options.cpp:875 gui/options.cpp:877 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Velg hvis du har et ekte Roland-kompatible lydkort tilkoblet maskinen, og " +"vil bruke dette." #: gui/options.cpp:877 msgctxt "lowres" @@ -845,13 +752,11 @@ msgstr "Ikke bruk Roland MT-32-musikk" msgid "Text and Speech:" msgstr "Tekst og Tale:" -#: gui/options.cpp:920 -#: gui/options.cpp:930 +#: gui/options.cpp:920 gui/options.cpp:930 msgid "Speech" msgstr "Tale" -#: gui/options.cpp:921 -#: gui/options.cpp:931 +#: gui/options.cpp:921 gui/options.cpp:931 msgid "Subtitles" msgstr "Undertekster" @@ -907,9 +812,7 @@ msgstr "Demp alle" msgid "SFX volume:" msgstr "Lydeffektvolum:" -#: gui/options.cpp:962 -#: gui/options.cpp:964 -#: gui/options.cpp:965 +#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 msgid "Special sound effects volume" msgstr "Volum for spesielle lydeffekter" @@ -936,9 +839,7 @@ msgctxt "lowres" msgid "Theme Path:" msgstr "Temasti:" -#: gui/options.cpp:1139 -#: gui/options.cpp:1141 -#: gui/options.cpp:1142 +#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Velger sti for ytterligere data brukt av alle spill eller ScummVM" @@ -1014,26 +915,26 @@ msgid "Select directory for plugins" msgstr "Velg mappe for plugins" #: gui/options.cpp:1450 -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 "Temaet du valgte sttter ikke det aktive sprket. Hvis du vil bruke dette temaet, m du bytte til et annet sprk frst." +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 "" +"Temaet du valgte sttter ikke det aktive sprket. Hvis du vil bruke dette " +"temaet, m du bytte til et annet sprk frst." -#: gui/saveload.cpp:59 -#: gui/saveload.cpp:257 +#: gui/saveload.cpp:59 gui/saveload.cpp:257 msgid "No date saved" msgstr "Ingen dato lagret" -#: gui/saveload.cpp:60 -#: gui/saveload.cpp:258 +#: gui/saveload.cpp:60 gui/saveload.cpp:258 msgid "No time saved" msgstr "Ingen tid lagret" -#: gui/saveload.cpp:61 -#: gui/saveload.cpp:259 +#: gui/saveload.cpp:61 gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Ingen spilltid lagret" -#: gui/saveload.cpp:68 -#: gui/saveload.cpp:173 +#: gui/saveload.cpp:68 gui/saveload.cpp:173 msgid "Delete" msgstr "Slett" @@ -1053,8 +954,7 @@ msgstr "Tid: " msgid "Playtime: " msgstr "Spilltid: " -#: gui/saveload.cpp:305 -#: gui/saveload.cpp:372 +#: gui/saveload.cpp:305 gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Ikke navngitt spilltilstand" @@ -1087,10 +987,7 @@ msgstr "Antialiased Tegner (16bpp)" msgid "Antialiased (16bpp)" msgstr "Antialiased (16bpp)" -#: gui/widget.cpp:322 -#: gui/widget.cpp:324 -#: gui/widget.cpp:330 -#: gui/widget.cpp:332 +#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332 msgid "Clear value" msgstr "Tm verdi" @@ -1103,15 +1000,13 @@ msgstr "Motoren st msgid "Menu" msgstr "Meny" -#: base/main.cpp:290 -#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Hopp over" -#: base/main.cpp:293 -#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pause" @@ -1199,7 +1094,8 @@ msgstr "Spillet i '%s' ser ut til #: engines/advancedDetector.cpp:325 msgid "Please, report the following data to the ScummVM team along with name" -msgstr "Vennligst rapporter de flgende dataene til ScummVM-teamet sammen med navnet" +msgstr "" +"Vennligst rapporter de flgende dataene til ScummVM-teamet sammen med navnet" #: engines/advancedDetector.cpp:327 msgid "of the game you tried to add and its version/language/etc.:" @@ -1229,29 +1125,23 @@ msgstr "~H~jelp" msgid "~A~bout" msgstr "~O~m" -#: engines/dialogs.cpp:104 -#: engines/dialogs.cpp:180 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" -#: engines/dialogs.cpp:106 -#: engines/dialogs.cpp:182 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" -#: engines/dialogs.cpp:115 -#: engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Lagret spill:" -#: engines/dialogs.cpp:115 -#: engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 -#: engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1261,22 +1151,30 @@ msgid "Save" msgstr "Lagre" #: engines/dialogs.cpp:144 -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 "Beklager, men denne motoren sttter for yeblikket ikke hjelp i spillet. Vennligst se i README-filen for grunnleggende informasjon, og for instruksjoner om hvordan du kan f ytterligere hjelp." +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 "" +"Beklager, men denne motoren sttter for yeblikket ikke hjelp i spillet. " +"Vennligst se i README-filen for grunnleggende informasjon, og for " +"instruksjoner om hvordan du kan f ytterligere hjelp." #: engines/dialogs.cpp:228 #, c-format -msgid "Gamestate save failed (%s)! Please consult the README for basic information, and for instructions on how to obtain further assistance." -msgstr "Lagring av spilltilstand feilet (%s)! Vennligst konsulter README-filen for grunnleggende informasjon og instruksjon om hvordan du fr ytterligere hjelp." +msgid "" +"Gamestate save failed (%s)! Please consult the README for basic information, " +"and for instructions on how to obtain further assistance." +msgstr "" +"Lagring av spilltilstand feilet (%s)! Vennligst konsulter README-filen for " +"grunnleggende informasjon og instruksjon om hvordan du fr ytterligere hjelp." -#: engines/dialogs.cpp:301 -#: engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 -#: engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~A~vbryt" @@ -1326,36 +1224,40 @@ msgstr "" #: engines/engine.cpp:426 #, c-format -msgid "Gamestate load failed (%s)! Please consult the README for basic information, and for instructions on how to obtain further assistance." +msgid "" +"Gamestate load failed (%s)! Please consult the README for basic information, " +"and for instructions on how to obtain further assistance." msgstr "" #: engines/engine.cpp:439 -msgid "WARNING: The game you are about to start is not yet fully supported by ScummVM. As such, it is likely to be unstable, and any saves you make might not work in future versions of ScummVM." -msgstr "ADVARSEL: Spillet du prver starte er ikke fullstendig stttet av ScummVM. Derfor er det sannsynlig at det vil vre ustabilt, og det er ikke sikkert at lagrede spill vil fortsette fungere i fremtidige versjoner av ScummVM." +msgid "" +"WARNING: The game you are about to start is not yet fully supported by " +"ScummVM. As such, it is likely to be unstable, and any saves you make might " +"not work in future versions of ScummVM." +msgstr "" +"ADVARSEL: Spillet du prver starte er ikke fullstendig stttet av ScummVM. " +"Derfor er det sannsynlig at det vil vre ustabilt, og det er ikke sikkert at " +"lagrede spill vil fortsette fungere i fremtidige versjoner av ScummVM." #: engines/engine.cpp:442 msgid "Start anyway" msgstr "Start allikevel" -#: engines/agi/detection.cpp:145 -#: engines/dreamweb/detection.cpp:47 +#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" msgstr "Bruk originale lagre/laste-skjermer" -#: engines/agi/detection.cpp:146 -#: engines/dreamweb/detection.cpp:48 +#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Bruk de originale lagre/laste-skjermene, istedenfor ScummVM-variantene" -#: engines/agi/saveload.cpp:816 -#: engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Gjennopprett spill:" -#: engines/agi/saveload.cpp:816 -#: engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Gjenopprett" @@ -1384,11 +1286,13 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Foretrekk digitale lydeffekter fremfor syntetiske" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "Bruk IMF/Yahama-FB-01 for MIDI-output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "Bruk IMF/Yamaha-FB-01 for MIDI-output" #: engines/sci/detection.cpp:401 -msgid "Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI output" +msgid "" +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " +"output" msgstr "" #: engines/sci/detection.cpp:411 @@ -1404,7 +1308,8 @@ msgid "Use Windows cursors" msgstr "Bruk Windows-muspekere" #: engines/sci/detection.cpp:423 -msgid "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" +msgid "" +"Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "Bruk Windows-muspekerene (mindre, og monokrome) isteden" #: engines/sci/detection.cpp:433 @@ -1412,8 +1317,10 @@ msgid "Use silver cursors" msgstr "Bruk slvmuspekere" #: engines/sci/detection.cpp:434 -msgid "Use the alternate set of silver cursors, instead of the normal golden ones" -msgstr "Bruk det alternative settet med slvmuspekere, istedenfor de normale gylne." +msgid "" +"Use the alternate set of silver cursors, instead of the normal golden ones" +msgstr "" +"Bruk det alternative settet med slvmuspekere, istedenfor de normale gylne." #: engines/scumm/dialogs.cpp:175 #, c-format @@ -1450,8 +1357,7 @@ msgstr "Er du sikker p msgid "Play" msgstr "Spill" -#: engines/scumm/dialogs.cpp:191 -#: engines/scumm/help.cpp:82 +#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82 #: engines/scumm/help.cpp:84 #: backends/platform/symbian/src/SymbianActions.cpp:52 #: backends/platform/wince/CEActionsPocket.cpp:44 @@ -1578,16 +1484,11 @@ msgstr "Space" msgid "Pause game" msgstr "Pause spill" -#: engines/scumm/help.cpp:79 -#: engines/scumm/help.cpp:84 -#: engines/scumm/help.cpp:95 -#: 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:79 engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:95 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 msgid "Ctrl" msgstr "Ctrl" @@ -1595,12 +1496,9 @@ msgstr "Ctrl" msgid "Load game state 1-10" msgstr "pne spilltilstand 1-10" -#: engines/scumm/help.cpp:80 -#: engines/scumm/help.cpp:84 -#: engines/scumm/help.cpp:86 -#: engines/scumm/help.cpp:100 -#: engines/scumm/help.cpp:101 -#: engines/scumm/help.cpp:102 +#: engines/scumm/help.cpp:80 engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:100 +#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102 msgid "Alt" msgstr "Alt" @@ -1608,8 +1506,7 @@ msgstr "Alt" msgid "Save game state 1-10" msgstr "Lagre spilltilstand 1-10" -#: engines/scumm/help.cpp:86 -#: engines/scumm/help.cpp:89 +#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89 msgid "Enter" msgstr "Enter" @@ -1701,30 +1598,24 @@ msgstr "Spinne drafts p msgid "Main game controls:" msgstr "Hovedkontroller for spill:" -#: engines/scumm/help.cpp:121 -#: engines/scumm/help.cpp:136 +#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136 #: engines/scumm/help.cpp:161 msgid "Push" msgstr "Dytt" -#: engines/scumm/help.cpp:122 -#: engines/scumm/help.cpp:137 +#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137 #: engines/scumm/help.cpp:162 msgid "Pull" msgstr "Dra" -#: engines/scumm/help.cpp:123 -#: engines/scumm/help.cpp:138 -#: engines/scumm/help.cpp:163 -#: engines/scumm/help.cpp:197 +#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138 +#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197 #: engines/scumm/help.cpp:207 msgid "Give" msgstr "Gi" -#: engines/scumm/help.cpp:124 -#: engines/scumm/help.cpp:139 -#: engines/scumm/help.cpp:164 -#: engines/scumm/help.cpp:190 +#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139 +#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190 #: engines/scumm/help.cpp:208 msgid "Open" msgstr "pne" @@ -1737,54 +1628,43 @@ msgstr "G msgid "Get" msgstr "F" -#: engines/scumm/help.cpp:128 -#: engines/scumm/help.cpp:152 -#: engines/scumm/help.cpp:170 -#: engines/scumm/help.cpp:198 -#: engines/scumm/help.cpp:213 -#: engines/scumm/help.cpp:224 +#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152 +#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198 +#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224 #: engines/scumm/help.cpp:250 msgid "Use" msgstr "Bruk" -#: engines/scumm/help.cpp:129 -#: engines/scumm/help.cpp:141 +#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141 msgid "Read" msgstr "Les" -#: engines/scumm/help.cpp:130 -#: engines/scumm/help.cpp:147 +#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147 msgid "New kid" msgstr "Bytt unge" -#: engines/scumm/help.cpp:131 -#: engines/scumm/help.cpp:153 +#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153 #: engines/scumm/help.cpp:171 msgid "Turn on" msgstr "Sl p" -#: engines/scumm/help.cpp:132 -#: engines/scumm/help.cpp:154 +#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154 #: engines/scumm/help.cpp:172 msgid "Turn off" msgstr "Sl av" -#: engines/scumm/help.cpp:142 -#: engines/scumm/help.cpp:167 +#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167 #: engines/scumm/help.cpp:194 msgid "Walk to" msgstr "G til" -#: engines/scumm/help.cpp:143 -#: engines/scumm/help.cpp:168 -#: engines/scumm/help.cpp:195 -#: engines/scumm/help.cpp:210 +#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168 +#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210 #: engines/scumm/help.cpp:227 msgid "Pick up" msgstr "Plukk opp" -#: engines/scumm/help.cpp:144 -#: engines/scumm/help.cpp:169 +#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169 msgid "What is" msgstr "Hva er" @@ -1808,13 +1688,11 @@ msgstr "Fiks" msgid "Switch" msgstr "Bytt" -#: engines/scumm/help.cpp:166 -#: engines/scumm/help.cpp:228 +#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228 msgid "Look" msgstr "Kikk" -#: engines/scumm/help.cpp:173 -#: engines/scumm/help.cpp:223 +#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223 msgid "Talk" msgstr "Snakk" @@ -1859,24 +1737,20 @@ msgstr "spill H p msgid "play C major on distaff" msgstr "spill C dur p distaffen" -#: engines/scumm/help.cpp:192 -#: engines/scumm/help.cpp:214 +#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214 msgid "puSh" msgstr "Dytt" -#: engines/scumm/help.cpp:193 -#: engines/scumm/help.cpp:215 +#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215 msgid "pull (Yank)" msgstr "Dra" -#: engines/scumm/help.cpp:196 -#: engines/scumm/help.cpp:212 +#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212 #: engines/scumm/help.cpp:248 msgid "Talk to" msgstr "Snakk til" -#: engines/scumm/help.cpp:199 -#: engines/scumm/help.cpp:211 +#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211 msgid "Look at" msgstr "Se p" @@ -1908,10 +1782,8 @@ msgstr "Merk neste dialog" msgid "Walk" msgstr "G" -#: engines/scumm/help.cpp:225 -#: engines/scumm/help.cpp:234 -#: engines/scumm/help.cpp:241 -#: engines/scumm/help.cpp:249 +#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234 +#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249 msgid "Inventory" msgstr "Inventar" @@ -1939,8 +1811,7 @@ msgstr "Sl msgid "Kick" msgstr "Spark" -#: engines/scumm/help.cpp:239 -#: engines/scumm/help.cpp:247 +#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247 msgid "Examine" msgstr "Undersk" @@ -1961,38 +1832,31 @@ msgstr "Lagre / msgid "Other game controls:" msgstr "Andre spillkontroller" -#: engines/scumm/help.cpp:257 -#: engines/scumm/help.cpp:267 +#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267 msgid "Inventory:" msgstr "Inventar:" -#: engines/scumm/help.cpp:258 -#: engines/scumm/help.cpp:274 +#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274 msgid "Scroll list up" msgstr "Bla liste opp" -#: engines/scumm/help.cpp:259 -#: engines/scumm/help.cpp:275 +#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275 msgid "Scroll list down" msgstr "Bla liste ned" -#: engines/scumm/help.cpp:260 -#: engines/scumm/help.cpp:268 +#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268 msgid "Upper left item" msgstr "vre venstre gjenstand" -#: engines/scumm/help.cpp:261 -#: engines/scumm/help.cpp:270 +#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270 msgid "Lower left item" msgstr "Nedre venstre gjenstand" -#: engines/scumm/help.cpp:262 -#: engines/scumm/help.cpp:271 +#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271 msgid "Upper right item" msgstr "vre hyre gjenstand" -#: engines/scumm/help.cpp:263 -#: engines/scumm/help.cpp:273 +#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273 msgid "Lower right item" msgstr "Nedre hyre gjenstand" @@ -2004,8 +1868,7 @@ msgstr "Midtre venstre gjenstand" msgid "Middle right item" msgstr "Midtre hyre gjenstand" -#: engines/scumm/help.cpp:279 -#: engines/scumm/help.cpp:284 +#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284 msgid "Switching characters:" msgstr "Bytte av karakterer:" @@ -2021,8 +1884,7 @@ msgstr "Tredje unge" msgid "Fighting controls (numpad):" msgstr "Kampkontroller (talltastatur)" -#: engines/scumm/help.cpp:295 -#: engines/scumm/help.cpp:296 +#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296 #: engines/scumm/help.cpp:297 msgid "Step back" msgstr "Bakoversteg" @@ -2114,8 +1976,7 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2278 -#: engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2126,8 +1987,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 -#: engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2138,8 +1998,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 -#: engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2151,12 +2010,17 @@ msgstr "" "%s" #: engines/scumm/scumm.cpp:2512 -msgid "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' directory inside the Tentacle game directory." -msgstr "Vanligvis, ville Maniac Mansion ha startet n. Men ScummVM sttter ikke det enn. S, for spille Maniac Mansion, g til 'Legg til spill' i ScummVM-hovedmenyen og velg 'Maniac'-undermappa i Tentacle-mappa." +msgid "" +"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " +"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " +"directory inside the Tentacle game directory." +msgstr "" +"Vanligvis, ville Maniac Mansion ha startet n. Men ScummVM sttter ikke det " +"enn. S, for spille Maniac Mansion, g til 'Legg til spill' i ScummVM-" +"hovedmenyen og velg 'Maniac'-undermappa i Tentacle-mappa." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 -#: engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 msgid "~Z~ip Mode Activated" msgstr "~Z~ipmodus aktivert" @@ -2186,14 +2050,12 @@ msgstr "~V~anneffekt aktivert" msgid "Cutscene file '%s' not found!" msgstr "" -#: engines/gob/inter_playtoons.cpp:256 -#: engines/gob/inter_v2.cpp:1287 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Klarte ikke pne spilltilstand fra fil." -#: engines/gob/inter_v2.cpp:1357 -#: engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Klarte ikke lagre spilltilstand fra fil." @@ -2313,12 +2175,13 @@ msgid "Choose Spell" msgstr "Velg" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Du ser ut til bruke en General MIDI-enhet,\n" "men spillet ditt sttter bare Roland MT32-MIDI.\n" @@ -2326,13 +2189,11 @@ msgstr "" "General MIDI-instrumentene. Allikevel, kan det\n" "skje at enkelte spor ikke vil spilles riktig." -#: engines/queen/queen.cpp:59 -#: engines/sky/detection.cpp:44 +#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" msgstr "Diskett-intro" -#: engines/queen/queen.cpp:60 -#: engines/sky/detection.cpp:45 +#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" msgstr "Bruk diskettversjonens intro (Kun for CD-versjon)" @@ -2355,33 +2216,36 @@ msgstr "" msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" -#: engines/sword1/animation.cpp:560 -#: engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" msgstr "" -#: engines/sword1/animation.cpp:570 -#: engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 msgid "MPEG2 cutscenes are no longer supported" msgstr "" -#: engines/sword1/animation.cpp:576 -#: engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 #, c-format msgid "Cutscene '%s' not found" msgstr "" #: engines/sword1/control.cpp:863 msgid "" -"ScummVM found that you have old savefiles for Broken Sword 1 that should be converted.\n" -"The old save game format is no longer supported, so you will not be able to load your games if you don't convert them.\n" +"ScummVM found that you have old savefiles for Broken Sword 1 that should be " +"converted.\n" +"The old save 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" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" msgstr "" -"ScummVM oppdaget at du har gamle lagrede spill for Broken Sword 1 som br konverteres.\n" -"Det gamle formatet for lagrede spill stttes ikke lengre, s du vil ikke vre i stand til laste de lagrede spillene,\n" +"ScummVM oppdaget at du har gamle lagrede spill for Broken Sword 1 som br " +"konverteres.\n" +"Det gamle formatet for lagrede spill stttes ikke lengre, s du vil ikke " +"vre i stand til laste de lagrede spillene,\n" "med mindre du konverterer dem.\n" -"Trykk OK for konvertere dem n, ellers vil du bli spurt igjen neste gang du starter spillet." +"Trykk OK for konvertere dem n, ellers vil du bli spurt igjen neste gang " +"du starter spillet." #: engines/sword1/control.cpp:1232 #, c-format @@ -2403,7 +2267,8 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "Dette er slutten p Broken Sword 1-demoen" #: engines/sword2/animation.cpp:435 -msgid "PSX cutscenes found but ScummVM has been built without RGB color support" +msgid "" +"PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" #: engines/sword2/sword2.cpp:79 @@ -2431,15 +2296,20 @@ msgstr "Lagrer spill..." #: engines/parallaction/saveload.cpp:272 msgid "" -"ScummVM found that you have old savefiles 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" +"ScummVM found that you have old savefiles 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 "" -"ScummVM oppdaget at du har gamle lagrede spill for Nippon Safes som br omdpes.\n" -"De gamle navnene stttes ikke lengre, s du vil ikke vre i stand til laste de lagrede spillene,\n" +"ScummVM oppdaget at du har gamle lagrede spill for Nippon Safes som br " +"omdpes.\n" +"De gamle navnene stttes ikke lengre, s du vil ikke vre i stand til " +"laste de lagrede spillene,\n" "med mindre du konverterer dem.\n" -"Trykk OK for konvertere dem n, ellers vil du bli spurt igjen neste gang du starter spillet." +"Trykk OK for konvertere dem n, ellers vil du bli spurt igjen neste gang " +"du starter spillet." #: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." @@ -2447,11 +2317,13 @@ msgstr "ScummVM konverterte alle de lagrede spillene dine uten problemer." #: engines/parallaction/saveload.cpp:321 msgid "" -"ScummVM printed some warnings in your console window and can't guarantee all your files have been converted.\n" +"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 "" -"ScummVM skrev ut noen advarsler i konsollvinduet ditt og kan ikke garantere at alle filene dine har blitt konvertert.\n" +"ScummVM skrev ut noen advarsler i konsollvinduet ditt og kan ikke garantere " +"at alle filene dine har blitt konvertert.\n" "\n" "Vennligst rapporter dette til teamet." @@ -2465,30 +2337,44 @@ msgstr "DOSBox OPL emulator" #: audio/mididrv.cpp:209 #, c-format -msgid "The selected audio device '%s' was not found (e.g. might be turned off or disconnected)." -msgstr "Den valgte lydenheten '%s' ble ikke funnet (den kan f.eks. vre avsltt eller frakoblet)." +msgid "" +"The selected audio device '%s' was not found (e.g. might be turned off or " +"disconnected)." +msgstr "" +"Den valgte lydenheten '%s' ble ikke funnet (den kan f.eks. vre avsltt " +"eller frakoblet)." -#: audio/mididrv.cpp:209 -#: audio/mididrv.cpp:221 -#: audio/mididrv.cpp:257 +#: 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 "Forsker falle tilbake p den neste tilgjengelige enheten..." #: audio/mididrv.cpp:221 #, c-format -msgid "The selected audio device '%s' cannot be used. See log file for more information." -msgstr "Den valgte lydenheten '%s' kan ikke brukes. Se logg-filen for mer informasjon." +msgid "" +"The selected audio device '%s' cannot be used. See log file for more " +"information." +msgstr "" +"Den valgte lydenheten '%s' kan ikke brukes. Se logg-filen for mer " +"informasjon." #: audio/mididrv.cpp:257 #, c-format -msgid "The preferred audio device '%s' was not found (e.g. might be turned off or disconnected)." -msgstr "Den foretrukne lydenheten '%s' ble ikke funnet (den kan f.eks. vre avsltt eller frakoblet)." +msgid "" +"The preferred audio device '%s' was not found (e.g. might be turned off or " +"disconnected)." +msgstr "" +"Den foretrukne lydenheten '%s' ble ikke funnet (den kan f.eks. vre avsltt " +"eller frakoblet)." #: audio/mididrv.cpp:272 #, c-format -msgid "The preferred audio device '%s' cannot be used. See log file for more information." -msgstr "Den foretrukne lydenheten '%s' kan ikke brukes. Se i logg-filen for mer informasjon." +msgid "" +"The preferred audio device '%s' cannot be used. See log file for more " +"information." +msgstr "" +"Den foretrukne lydenheten '%s' kan ikke brukes. Se i logg-filen for mer " +"informasjon." #: audio/null.h:43 msgid "No music" @@ -2843,13 +2729,11 @@ msgstr "GC Pad-aksellerasjon:" msgid "DVD" msgstr "DVD" -#: backends/platform/wii/options.cpp:89 -#: backends/platform/wii/options.cpp:101 +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 msgid "Status:" msgstr "Status:" -#: backends/platform/wii/options.cpp:90 -#: backends/platform/wii/options.cpp:102 +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 msgid "Unknown" msgstr "Ukjent" @@ -3027,7 +2911,8 @@ msgstr "Koble handling til h #: backends/platform/wince/wince-sdl.cpp:519 msgid "You must map a key to the 'Right Click' action to play this game" -msgstr "Du m koble en tast til handlingen 'Hyreklikk' for spille dette spillet" +msgstr "" +"Du m koble en tast til handlingen 'Hyreklikk' for spille dette spillet" #: backends/platform/wince/wince-sdl.cpp:528 msgid "Map hide toolbar action" @@ -3035,7 +2920,9 @@ msgstr "Koble skjul-verkt #: backends/platform/wince/wince-sdl.cpp:532 msgid "You must map a key to the 'Hide toolbar' action to play this game" -msgstr "Du m koble en tast til 'Skjul verktylinje'-handlingen for spille dette spillet" +msgstr "" +"Du m koble en tast til 'Skjul verktylinje'-handlingen for spille dette " +"spillet" #: backends/platform/wince/wince-sdl.cpp:541 msgid "Map Zoom Up action (optional)" @@ -3046,8 +2933,11 @@ msgid "Map Zoom Down action (optional)" msgstr "Koble handlingen Zoom Ned (valgfritt)" #: backends/platform/wince/wince-sdl.cpp:552 -msgid "Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" -msgstr "Ikke glem koble en tast til handlingen 'Skjul verktylinje' for se hele inventaret" +msgid "" +"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" +msgstr "" +"Ikke glem koble en tast til handlingen 'Skjul verktylinje' for se hele " +"inventaret" #: backends/events/default/default-events.cpp:191 msgid "Do you really want to return to the Launcher?" @@ -3136,19 +3026,19 @@ msgstr "Klikking deaktivert" #~ msgid "Hercules Amber" #~ msgstr "Hercules Oransje" -#~ msgctxt "lowres" +#~ msgctxt "lowres" #~ msgid "Hercules Green" #~ msgstr "Hercules Grnn" -#~ msgctxt "lowres" +#~ msgctxt "lowres" #~ msgid "Hercules Amber" #~ msgstr "Hercules Oransje" #~ msgid "Save game failed!" #~ msgstr "Lagret spill:" -#~ msgctxt "lowres" +#~ msgctxt "lowres" #~ msgid "Add Game..." #~ msgstr "Legg til spill..." diff --git a/po/nn_NO.po b/po/nn_NO.po index fe0c1d1106..a88637b7c0 100644 --- a/po/nn_NO.po +++ b/po/nn_NO.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2011-04-25 23:07+0100\n" "Last-Translator: Einar Johan T. Smen \n" "Language-Team: somaen \n" @@ -1135,13 +1135,13 @@ msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Lagra spel:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1242,11 +1242,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Gjenopprett spel:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Gjenopprett" @@ -1276,12 +1276,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" @@ -2178,8 +2178,8 @@ 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 diff --git a/po/pl_PL.po b/po/pl_PL.po index da089c5026..5d3655f8b6 100644 --- a/po/pl_PL.po +++ b/po/pl_PL.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2011-10-24 21:14+0100\n" "Last-Translator: Micha Zibkowski \n" "Language-Team: Grajpopolsku.pl \n" @@ -1134,13 +1134,13 @@ msgid "~R~eturn to Launcher" msgstr "~P~owrt do launchera" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Zapis:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1257,11 +1257,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Wznw gr:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Wznw" @@ -1293,12 +1293,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" @@ -2192,12 +2192,13 @@ msgid "Choose Spell" msgstr "Wybierz" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Wyglda na to, e uywasz urzdzenia General MIDI, ale gra obsuguje tylko " "MIDI Roland MT32.\n" diff --git a/po/pt_BR.po b/po/pt_BR.po index cb0c50a7c8..ac60a814e2 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2011-10-21 21:30-0300\n" "Last-Translator: Saulo Benigno \n" "Language-Team: ScummBR (www.scummbr.com) \n" @@ -1146,13 +1146,13 @@ msgid "~R~eturn to Launcher" msgstr "~V~oltar ao menu" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Salvar jogo:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1273,11 +1273,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Restaurar jogo:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Restaurar" @@ -1309,12 +1309,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" @@ -2216,12 +2216,13 @@ msgid "Choose Spell" msgstr "Escolher" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Voc parece estar usando um dispositivo General MIDI,\n" "mas, o jogo s suporta Roland MT32 MIDI.\n" diff --git a/po/ru_RU.po b/po/ru_RU.po index 5d5f8dabf4..ec66de6f4f 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-02-16 13:09+0200+0200\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -1138,13 +1138,13 @@ msgid "~R~eturn to Launcher" msgstr "~~ " #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr " :" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1266,11 +1266,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr " :" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "" @@ -1304,12 +1304,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" @@ -2196,12 +2196,13 @@ msgid "Choose Spell" msgstr " " #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" ", \n" "General MIDI, \n" diff --git a/po/scummvm.pot b/po/scummvm.pot index 86067a3083..8a68e4372b 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1115,13 +1115,13 @@ msgid "~R~eturn to Launcher" msgstr "" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1220,11 +1220,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "" @@ -1253,12 +1253,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" @@ -2132,8 +2132,8 @@ 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 diff --git a/po/se_SE.po b/po/se_SE.po index fe896842a2..880b198895 100644 --- a/po/se_SE.po +++ b/po/se_SE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-06-28 15:47+0100\n" "Last-Translator: Hampus Flink \n" "Language-Team: \n" @@ -1137,13 +1137,13 @@ msgid "~R~eturn to Launcher" msgstr "te~r~vnd till launcher" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Spara spelet:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1260,11 +1260,11 @@ msgstr "Anv msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Anvnder originalskrmarna fr spara/ladda istllet fr ScummVM:s" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "terstll spel:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "terstll" @@ -1293,12 +1293,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "Fredra digitala ljudeffekter istllet fr syntetiserade" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" -msgstr "Anvnd IMF/Yahama FB-01 fr MIDI-uppspelning" +msgid "Use IMF/Yamaha FB-01 for MIDI output" +msgstr "Anvnd IMF/Yamaha FB-01 fr MIDI-uppspelning" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" "Anvnd ett IMB Music Feature-kort eller en Yamaha FB-01 FM synthmodul fr " @@ -2186,12 +2186,13 @@ msgid "Choose Spell" msgstr "Vlj trollformel" #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" "Du verkar anvnda en General MIDI enhet\n" "men ditt spel stder endast Roland MT32 MIDI.\n" diff --git a/po/uk_UA.po b/po/uk_UA.po index cbcf7f670c..7f484fdc06 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-06-24 18:06+0100\n" +"POT-Creation-Date: 2012-07-08 12:25+0100\n" "PO-Revision-Date: 2012-02-16 13:09+0200\n" "Last-Translator: Eugene Sandulenko\n" "Language-Team: Ukrainian\n" @@ -1136,13 +1136,13 @@ msgid "~R~eturn to Launcher" msgstr "~~. " #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:728 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr " : " #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:728 +#: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1263,11 +1263,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr " :" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:824 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "" @@ -1299,12 +1299,12 @@ msgid "Prefer digital sound effects instead of synthesized ones" msgstr "" #: engines/sci/detection.cpp:400 -msgid "Use IMF/Yahama FB-01 for MIDI output" +msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "" #: engines/sci/detection.cpp:401 msgid "" -"Use an IBM Music Feature card or a Yahama FB-01 FM synth module for MIDI " +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" @@ -2191,12 +2191,13 @@ msgid "Choose Spell" msgstr " " #: engines/kyra/sound_midi.cpp:475 +#, fuzzy 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. After all it might happen\n" -"that a few tracks will not be correctly played." +"General MIDI ones. It is still possible that\n" +"some tracks sound incorrect." msgstr "" ", General\n" "MIDI, Roland MT32\n" -- cgit v1.2.3 From 2675311f2512e44dd4c37ba9ac9d449b9f4c2439 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 8 Jul 2012 12:39:16 +0100 Subject: I18N: Regenerate translations data file --- gui/themes/translations.dat | Bin 337762 -> 334603 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 2307ea20ae..df99750170 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From 4c43d6d85dc70e1b9b82629f1af1e9a37a136013 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 8 Jul 2012 12:21:26 +0300 Subject: SCI: Add a hack in kGetAngleWorker to fix bug #3540976 kGetAngle(Worker) has been implemented based on behavior observed with a test program created with SCI Studio. However, the return values have subtle differences from the original, which uses atan(). This temporary hack will do for now till the implementation of kGetAngle is done again. A simpler atan2-based implementation has also been added for future reference --- engines/sci/engine/kmath.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index 7570856dff..cbfe00d3ca 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -78,6 +78,25 @@ reg_t kSqrt(EngineState *s, int argc, reg_t *argv) { } uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { + // TODO: This has been implemented based on behavior observed with a test + // program created with SCI Studio. However, the return values have subtle + // differences from the original, which uses atan(). + // The differences in the return values are the cause of bug #3540976 + // and perhaps bug #3037267 as well. + + // HACK: Return the expected value for Longbow, scene 150 (bug #3540976). + // This is a temporary solution, till the function returns the expected + // results. + if (g_sci->getGameId() == GID_LONGBOW && g_sci->getEngineState()->currentRoomNumber() == 150) { + if (x1 == 207 && y1 == 88 && x2 == 107 && y2 == 184) + return 226; + } + +#if 0 + // A simpler atan2-based implementation + return (360 - atan2((double)(x1 - x2), (double)(y1 - y2)) * 57.2958) % 360; +#endif + int16 xRel = x2 - x1; int16 yRel = y1 - y2; // y-axis is mirrored. int16 angle; -- cgit v1.2.3 From 2ef3f5e6957ce072f9bb5df0fe3f65da578b836c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 8 Jul 2012 15:58:50 +0300 Subject: SCI: Update the virtual file selected in the QFG4 character import screen This makes the character import screen in QFG4 functional, as the virtual file index was never updated --- engines/sci/engine/kgraphics.cpp | 6 ++++-- engines/sci/engine/klists.cpp | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index ec8e0dbf1b..5b483eb4a2 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -950,8 +950,8 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { } } if (objName == "savedHeros") { - // Import of QfG character files dialog is shown - // display additional popup information before letting user use it + // Import of QfG character files dialog is shown. + // display additional popup information before letting user use it. reg_t changeDirButton = s->_segMan->findObjectByName("changeDirItem"); if (!changeDirButton.isNull()) { // check if checkDirButton is still enabled, in that case we are called the first time during that room @@ -964,6 +964,8 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { "for Quest for Glory 2. Example: 'qfg2-thief.sav'."); } } + + // For the SCI32 version of this, check kListAt(). s->_chosenQfGImportItem = readSelectorValue(s->_segMan, controlObject, SELECTOR(mark)); } diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 15d18eb4bb..342fa95eda 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -506,6 +506,11 @@ reg_t kListAt(EngineState *s, int argc, reg_t *argv) { curIndex++; } + // Update the virtual file selected in the character import screen of QFG4. + // For the SCI0-SCI1.1 version of this, check kDrawControl(). + if (g_sci->inQfGImportRoom() && !strcmp(s->_segMan->getObjectName(curObject), "SelectorDText")) + s->_chosenQfGImportItem = listIndex; + return curObject; } -- cgit v1.2.3 From 10b3fdf2478dce3712de6213678f54335d5c46a0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 8 Jul 2012 16:10:40 +0300 Subject: SCI: Show information for correct file naming in the QFG4 import room This information is shown in previous QFG versions, but it had to be placed in a SCI32 graphics function in order to be shown in QFG4 too --- engines/sci/engine/kgraphics.cpp | 3 ++- engines/sci/graphics/frameout.cpp | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 5b483eb4a2..6d938b6d22 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -951,7 +951,8 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { } if (objName == "savedHeros") { // Import of QfG character files dialog is shown. - // display additional popup information before letting user use it. + // Display additional popup information before letting user use it. + // For the SCI32 version of this, check kernelAddPlane(). reg_t changeDirButton = s->_segMan->findObjectByName("changeDirItem"); if (!changeDirButton.isNull()) { // check if checkDirButton is still enabled, in that case we are called the first time during that room diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index b13c7f4dce..cb56e24de9 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -117,6 +117,8 @@ void GfxFrameout::showCurrentScrollText() { } } +extern void showScummVMDialog(const Common::String &message); + void GfxFrameout::kernelAddPlane(reg_t object) { PlaneEntry newPlane; @@ -142,6 +144,19 @@ void GfxFrameout::kernelAddPlane(reg_t object) { _coordAdjuster->setScriptsResolution(tmpRunningWidth, tmpRunningHeight); } + // Import of QfG character files dialog is shown in QFG4. + // Display additional popup information before letting user use it. + // For the SCI0-SCI1.1 version of this, check kDrawControl(). + if (g_sci->inQfGImportRoom() && !strcmp(_segMan->getObjectName(object), "DSPlane")) { + showScummVMDialog("Characters saved inside ScummVM are shown " + "automatically. Character files saved in the original " + "interpreter need to be put inside ScummVM's saved games " + "directory and a prefix needs to be added depending on which " + "game it was saved in: 'qfg1-' for Quest for Glory 1, 'qfg2-' " + "for Quest for Glory 2, 'qfg3-' for Quest for Glory 3. " + "Example: 'qfg2-thief.sav'."); + } + newPlane.object = object; newPlane.priority = readSelectorValue(_segMan, object, SELECTOR(priority)); newPlane.lastPriority = 0xFFFF; // hidden -- cgit v1.2.3 From 3b69816a7d02f5c6ef03efd48062abd532cced18 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 8 Jul 2012 16:15:07 +0300 Subject: SCI: Add another English floppy version of KQ5 (bug #3536863) According to this bug report, there exists another English version with the same file checksums as the vanilla English version, patched to Polish. We need a better way of distinguishing the two versions. Until we do, this is a duplicate entry of the Polish floppy version --- engines/sci/detection_tables.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 07b4733cfd..8a6184c7e4 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1238,6 +1238,26 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // King's Quest 5 - English DOS Floppy + // VERSION file reports "0.000.051" + // Supplied by misterhands in bug report #3536863. + // FIXME: According to bug #3536863, there exists another English version + // with the same file checksums as the vanilla English version, patched to + // Polish. We need a better way of distinguishing the two versions. Until + // we do, this is a duplicate entry of the Polish version below. + {"kq5", "", { + {"resource.map", 0, "70010c20138541f89013bb5e1b30f16a", 7998}, + {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 276398}, + {"resource.001", 0, "c0f48d4a7ebeaa6aa074fc98d77423e9", 1018560}, + {"resource.002", 0, "7f188a95acdb60bbe32a8379ba299393", 1307048}, + {"resource.003", 0, "0860785af59518b94d54718dddcd6907", 1348500}, + {"resource.004", 0, "c4745dd1e261c22daa6477961d08bf6c", 1239887}, + {"resource.005", 0, "6556ff8e7c4d1acf6a78aea154daa76c", 1287869}, + {"resource.006", 0, "da82e4beb744731d0a151f1d4922fafa", 1170456}, + {"resource.007", 0, "431def14ca29cdb5e6a5e84d3f38f679", 1240176}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // King's Quest 5 - English DOS Floppy (supplied by omer_mor in bug report #3036996) // VERSION file reports "0.000.051" {"kq5", "", { @@ -1356,6 +1376,10 @@ static const struct ADGameDescription SciGameDescriptions[] = { // King's Quest 5 - Polish DOS Floppy (supplied by jacek909 in bug report #2725722, includes english language?!) // SCI interpreter version 1.000.060 + // FIXME: According to bug #3536863, this is actually a patched English version. + // The vanilla English version has the same MD5 checksums. + // We need a better way of detecting this. Until we do, a duplicate English + // entry has been placed above. {"kq5", "", { {"resource.map", 0, "70010c20138541f89013bb5e1b30f16a", 7998}, {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 276398}, -- cgit v1.2.3 From ff1828fc7117d1dfcb5ea3dd04baf1ddc9045b3b Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Sun, 8 Jul 2012 20:24:33 +0200 Subject: MOHAWK: Play anims for LiveText items *after* the speech. Another attempt at fixing bug #3541294. --- engines/mohawk/livingbooks.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp index f5e5e7d7b4..7f7df66e53 100644 --- a/engines/mohawk/livingbooks.cpp +++ b/engines/mohawk/livingbooks.cpp @@ -3460,6 +3460,12 @@ void LBLiveTextItem::update() { uint16 soundId = _words[_currentWord].soundId; if (soundId && !_vm->_sound->isPlaying(soundId)) { paletteUpdate(_currentWord, false); + + // TODO: check this in RE + LBItem *item = _vm->getItemById(_words[_currentWord].itemId); + if (item) + item->togglePlaying(false); + _currentWord = 0xFFFF; } } @@ -3530,11 +3536,6 @@ void LBLiveTextItem::handleMouseDown(Common::Point pos) { _currentWord = i; _vm->playSound(this, soundId); paletteUpdate(_currentWord, true); - - // TODO: check this in RE - LBItem *item = _vm->getItemById(_words[i].itemId); - if (item) - item->togglePlaying(false); return; } } -- cgit v1.2.3 From bb434d4acddcef722465b19062f8ba5b8da86b63 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Sun, 8 Jul 2012 20:53:47 +0200 Subject: NEWS: V1 composer games aren't supported yet. --- NEWS | 3 --- 1 file changed, 3 deletions(-) diff --git a/NEWS b/NEWS index e4ea5f3f49..443306fbfd 100644 --- a/NEWS +++ b/NEWS @@ -9,10 +9,7 @@ For a more comprehensive changelog of the latest experimental code, see: - Added support for Dreamweb. - Added support for Geisha. - Added support for Gregory and the Hot Air Balloon. - - Added support for Magic Tales: Baba Yaga and the Magic Geese. - - Added support for Magic Tales: Imo and the King. - Added support for Magic Tales: Liam Finds a Story. - - Added support for Magic Tales: The Little Samurai. - Added support for Once Upon A Time: Little Red Riding Hood - Added support for Sleeping Cub's Test of Courage. - Added support for Soltys. -- cgit v1.2.3 From 50dc5009c85f3713d6917d5aba1cbb1428da1c30 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 8 Jul 2012 21:58:47 +0300 Subject: SCI: Ignore another leftover script from KQ7 in the debugger --- engines/sci/console.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 40a6fd1415..564bbbbd79 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2987,8 +2987,9 @@ void Console::printKernelCallsFound(int kernelFuncNum, bool showFoundScripts) { // Ignore specific leftover scripts, which require other non-existing scripts if ((_engine->getGameId() == GID_HOYLE3 && itr->getNumber() == 995) || (_engine->getGameId() == GID_KQ5 && itr->getNumber() == 980) || - (_engine->getGameId() == GID_SLATER && itr->getNumber() == 947) || - (_engine->getGameId() == GID_MOTHERGOOSE256 && itr->getNumber() == 980)) { + (_engine->getGameId() == GID_KQ7 && itr->getNumber() == 111) || + (_engine->getGameId() == GID_MOTHERGOOSE256 && itr->getNumber() == 980) || + (_engine->getGameId() == GID_SLATER && itr->getNumber() == 947)) { continue; } -- cgit v1.2.3 From 262c7a1fb73cb89a7c2db562374bdc0ce6f85d18 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 8 Jul 2012 21:59:54 +0300 Subject: SCI: Fix a typo and add some comments to kGetAngleWorker() --- engines/sci/engine/kmath.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index cbfe00d3ca..05c8845288 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -77,10 +77,16 @@ reg_t kSqrt(EngineState *s, int argc, reg_t *argv) { return make_reg(0, (int16) sqrt((float) ABS(argv[0].toSint16()))); } +/** + * Returns the angle (in degrees) between the two points determined by (x1, y1) + * and (x2, y2). The angle ranges from 0 to 359 degrees. + * What this function does is pretty simple but apparently the original is not + * accurate. + */ uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { // TODO: This has been implemented based on behavior observed with a test // program created with SCI Studio. However, the return values have subtle - // differences from the original, which uses atan(). + // differences from the original, which uses custom implementation of atan(). // The differences in the return values are the cause of bug #3540976 // and perhaps bug #3037267 as well. @@ -94,7 +100,7 @@ uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { #if 0 // A simpler atan2-based implementation - return (360 - atan2((double)(x1 - x2), (double)(y1 - y2)) * 57.2958) % 360; + return (int16)(360 - atan2((double)(x1 - x2), (double)(y1 - y2)) * 57.2958) % 360; #endif int16 xRel = x2 - x1; @@ -122,6 +128,7 @@ uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { // Convert from grads to degrees by merging grad 0 with grad 1, // grad 10 with grad 11, grad 20 with grad 21, etc. This leads to // "degrees" that equal either one or two grads. + // This subtraction is meant to change from 400 "degrees" into 360 degrees angle -= (angle + 9) / 10; return angle; } -- cgit v1.2.3 From b2fb2730d67deccf819701ae98cb49daddf6ac4f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 8 Jul 2012 22:00:36 +0300 Subject: SCI: Also set the filename of the videoState struct when playing AVIs --- engines/sci/engine/kvideo.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index 61d2f935f7..cb2a763da9 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -209,6 +209,8 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { warning("Failed to open movie file %s", filename.c_str()); delete videoDecoder; videoDecoder = 0; + } else { + s->_videoState.fileName = filename; } break; } -- cgit v1.2.3 From 97fe2682d75a4f5f0320f755aef7b7c950a8de6b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 8 Jul 2012 22:24:53 +0300 Subject: I18N: Updated Russian and Ukrainian translations --- po/ru_RU.po | 105 +++++++++++++++++++++++++++------------------------------ po/uk_UA.po | 110 ++++++++++++++++++++++++++++-------------------------------- 2 files changed, 101 insertions(+), 114 deletions(-) diff --git a/po/ru_RU.po b/po/ru_RU.po index ec66de6f4f..019acbddbc 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-02-16 13:09+0200+0200\n" +"PO-Revision-Date: 2012-07-08 22:00+0200+0200\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" "MIME-Version: 1.0\n" @@ -193,9 +193,8 @@ msgid "Platform:" msgstr ":" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "" +msgstr "" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -689,7 +688,7 @@ msgstr "SoundFont:" #: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -"SoundFont , Fluidsynth " +"SoundFont , Fluidsynth " "Timidity" #: gui/options.cpp:851 @@ -716,7 +715,7 @@ msgstr " #: gui/options.cpp:870 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -" Roland MT-32/LAPC1/" +" Roland MT-32/LAPC1/" "CM32l/CM64" #: gui/options.cpp:875 @@ -743,7 +742,7 @@ msgstr " #: gui/options.cpp:880 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -" General MIDI Roland MT-32" +" General MIDI Roland MT-32" #: gui/options.cpp:889 msgid "Don't use Roland MT-32 music" @@ -922,7 +921,7 @@ 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/saveload.cpp:59 gui/saveload.cpp:257 @@ -1159,17 +1158,17 @@ msgid "" "the README for basic information, and for instructions on how to obtain " "further assistance." msgstr "" -" , . " +" , . " ", README , " " , ." #: engines/dialogs.cpp:228 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -" , . " +" (%s)! " ", README , " " , ." @@ -1233,12 +1232,12 @@ msgstr "" " README." #: engines/engine.cpp:426 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -" , . " +" (%s)! " ", README , " " , ." @@ -1259,12 +1258,14 @@ msgstr " #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr " / " #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" +" " +" ScummVM" #: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" @@ -1272,73 +1273,71 @@ msgstr " #: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore" -msgstr "" +msgstr "" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr " " +msgstr " " #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr " " #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "EGA " #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr "" -" EGA , " -"" +msgstr " EGA " #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr " " +msgstr " " #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr " " #: engines/sci/detection.cpp:400 msgid "Use IMF/Yamaha FB-01 for MIDI output" -msgstr "" +msgstr " IMF/Yamaha FB-01 MIDI" #: engines/sci/detection.cpp:401 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" +" IBM Music Feature " +"Yamaha FB-01 FM MIDI" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr " CD " #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr " CD ( )" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr " Windows" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" +" Windows ( ) DOS" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr " " +msgstr " " #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" +" " #: engines/scumm/dialogs.cpp:175 #, c-format @@ -2091,61 +2090,59 @@ msgstr " #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr " " #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr " " #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr " " #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr " " #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr " " #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr " Roland GS" +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 "" +msgstr " " #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +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 -#, fuzzy msgid "Floating cursors" -msgstr " " +msgstr " " #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr " " #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr " " #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr " " #: engines/kyra/lol.cpp:478 msgid "Attack 1" @@ -2196,7 +2193,6 @@ msgid "Choose Spell" msgstr " " #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2213,11 +2209,11 @@ msgstr "" #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr " " #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr " ( CD )" #: engines/sky/compact.cpp:130 msgid "" @@ -2238,7 +2234,7 @@ msgstr "" #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" -msgstr "" +msgstr " PSX '%s' " #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" @@ -2293,19 +2289,18 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr " 1" #: engines/sword2/animation.cpp:435 -#, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" -" DXA, ScummVM zlib" +" PSX, ScummVM RGB " #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr " " #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr " " #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2334,7 +2329,7 @@ msgid "" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" "ScummVM Nippon Safes, " -" . , " +" . , " " , .\n" "\n" " , , " @@ -2351,7 +2346,7 @@ msgid "" "\n" "Please report to the team." msgstr "" -"ScummVM , " +"ScummVM " " .\n" "\n" ", ScummVM." @@ -2455,7 +2450,7 @@ msgstr " ( #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr " ()" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" diff --git a/po/uk_UA.po b/po/uk_UA.po index 7f484fdc06..38855dcb11 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-02-16 13:09+0200\n" -"Last-Translator: Eugene Sandulenko\n" +"PO-Revision-Date: 2012-06-29 20:19+0200\n" +"Last-Translator: lubomyr \n" "Language-Team: Ukrainian\n" +"Language: Ukrainian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-5\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Ukrainian\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" -"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: gui/about.cpp:91 #, c-format @@ -194,9 +194,8 @@ msgid "Platform:" msgstr ":" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "" +msgstr "" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -1162,14 +1161,13 @@ msgstr "" "." #: engines/dialogs.cpp:228 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -", . -, " -"README , , " -"." +" (%s)!. -, README " +" , , ." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 @@ -1230,14 +1228,13 @@ msgstr "" " README ." #: engines/engine.cpp:426 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -", . -, " -"README , , " -"." +" (%s)! . -, README " +" , , ." #: engines/engine.cpp:439 msgid "" @@ -1256,12 +1253,13 @@ msgstr " #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr " . / " #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" +" / , ScummVM" #: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 msgid "Restore game:" @@ -1272,35 +1270,32 @@ msgid "Restore" msgstr "" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr " " +msgstr " " #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr " " #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "EGA " #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" -msgstr " EGA " +msgstr " - EGA " #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr " " +msgstr " " #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr " , " #: engines/sci/detection.cpp:400 msgid "Use IMF/Yamaha FB-01 for MIDI output" -msgstr "" +msgstr " IMF/Yahama FB-01 MIDI " #: engines/sci/detection.cpp:401 msgid "" @@ -1310,30 +1305,31 @@ msgstr "" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr " CD " #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr " CD - , " #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr " Windows " #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" -msgstr "" +msgstr " Windows ( ), DOS" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr " " +msgstr " " #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" +" , " +"" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -2086,52 +2082,50 @@ msgstr " #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr " " #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr " " #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr " " #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr " " #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr " " #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr " Roland GS" +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 "" +msgstr " " #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +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 -#, fuzzy msgid "Floating cursors" -msgstr " " +msgstr " " #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr " " #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 @@ -2191,7 +2185,6 @@ msgid "Choose Spell" msgstr " " #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2207,11 +2200,11 @@ msgstr "" #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr " " #: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr " ( CD )" #: engines/sky/compact.cpp:130 msgid "" @@ -2232,7 +2225,7 @@ msgstr "" #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" -msgstr "" +msgstr " PSX '%s' " #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" @@ -2286,18 +2279,17 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr " Broken Sword 1" #: engines/sword2/animation.cpp:435 -#, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" -msgstr " DXA, ScummVM zlib" +msgstr " PSX , ScummVM RGB " #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr " '" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr " ' " #: engines/parallaction/saveload.cpp:133 #, c-format @@ -2362,7 +2354,7 @@ msgid "" "The selected audio device '%s' was not found (e.g. might be turned off or " "disconnected)." msgstr "" -" %s (, " +" '%s' (, " " )." #: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257 @@ -2376,7 +2368,7 @@ msgid "" "The selected audio device '%s' cannot be used. See log file for more " "information." msgstr "" -" %s . " +" '%s' . " " ." #: audio/mididrv.cpp:257 @@ -2385,7 +2377,7 @@ msgid "" "The preferred audio device '%s' was not found (e.g. might be turned off or " "disconnected)." msgstr "" -" %s (, " +" '%s' (, " " )." #: audio/mididrv.cpp:272 @@ -2394,7 +2386,7 @@ msgid "" "The preferred audio device '%s' cannot be used. See log file for more " "information." msgstr "" -" %s . " +" '%s' . " " ." #: audio/null.h:43 @@ -2447,7 +2439,7 @@ msgstr " ( #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr " ()" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" @@ -2867,11 +2859,11 @@ msgstr " #: backends/platform/wince/CEActionsPocket.cpp:52 msgid "Zoom up" -msgstr ". " +msgstr ". " #: backends/platform/wince/CEActionsPocket.cpp:53 msgid "Zoom down" -msgstr ". " +msgstr ". " #: backends/platform/wince/CEActionsPocket.cpp:55 #: backends/platform/wince/CEActionsSmartphone.cpp:49 @@ -2940,7 +2932,7 @@ msgstr " msgid "You must map a key to the 'Hide toolbar' action to play this game" msgstr "" " ' .', " -" " +" " #: backends/platform/wince/wince-sdl.cpp:541 msgid "Map Zoom Up action (optional)" -- cgit v1.2.3 From a4b0c0e2db36353ac037dc60a639bf59611bedda Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 8 Jul 2012 22:26:08 +0300 Subject: I18N: Updated translations.dat --- gui/themes/translations.dat | Bin 334603 -> 340460 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index df99750170..97d69b400c 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From 6387e3bca73dd8b2dacab15a84a4a3b8d6c13c10 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 8 Jul 2012 22:30:05 +0300 Subject: RELEASE: This is 1.6.0git --- backends/platform/psp/README.PSP | 2 +- base/internal_version.h | 2 +- dists/android/AndroidManifest.xml | 2 +- dists/android/plugin-manifest.xml | 2 +- dists/gph/README-GPH | 2 +- dists/gph/scummvm.ini | 2 +- dists/iphone/Info.plist | 4 ++-- dists/irix/scummvm.spec | 2 +- dists/macosx/Info.plist | 6 +++--- dists/openpandora/PXML.xml | 8 ++++---- dists/openpandora/README-OPENPANDORA | 2 +- dists/openpandora/README-PND.txt | 2 +- dists/openpandora/index.html | 4 ++-- dists/redhat/scummvm-tools.spec | 2 +- dists/redhat/scummvm.spec | 2 +- dists/scummvm.rc | 8 ++++---- dists/slackware/scummvm.SlackBuild | 2 +- dists/wii/meta.xml | 2 +- dists/win32/scummvm.nsi | 4 ++-- 19 files changed, 30 insertions(+), 30 deletions(-) diff --git a/backends/platform/psp/README.PSP b/backends/platform/psp/README.PSP index bc0bd35a6e..969459dc5b 100644 --- a/backends/platform/psp/README.PSP +++ b/backends/platform/psp/README.PSP @@ -1,4 +1,4 @@ -ScummVM-PSP 1.5.0git README +ScummVM-PSP 1.6.0git README ============================================================================== Installation diff --git a/base/internal_version.h b/base/internal_version.h index 5392012169..40ed67ceec 100644 --- a/base/internal_version.h +++ b/base/internal_version.h @@ -16,4 +16,4 @@ #define SCUMMVM_REVISION #endif -#define SCUMMVM_VERSION "1.5.0git" SCUMMVM_REVISION +#define SCUMMVM_VERSION "1.6.0git" SCUMMVM_REVISION diff --git a/dists/android/AndroidManifest.xml b/dists/android/AndroidManifest.xml index e7778fdf61..a3c02474eb 100644 --- a/dists/android/AndroidManifest.xml +++ b/dists/android/AndroidManifest.xml @@ -4,7 +4,7 @@ diff --git a/dists/android/plugin-manifest.xml b/dists/android/plugin-manifest.xml index 51b39be3b1..7855c330c6 100644 --- a/dists/android/plugin-manifest.xml +++ b/dists/android/plugin-manifest.xml @@ -3,7 +3,7 @@ diff --git a/dists/gph/README-GPH b/dists/gph/README-GPH index 29f0175306..974c2cf266 100644 --- a/dists/gph/README-GPH +++ b/dists/gph/README-GPH @@ -1,4 +1,4 @@ -ScummVM 1.5.0git - GPH DEVICE SPECIFIC README +ScummVM 1.6.0git - GPH DEVICE SPECIFIC README ------------------------------------------------------------------------ diff --git a/dists/gph/scummvm.ini b/dists/gph/scummvm.ini index 952cd0de24..7d9d85fcc2 100644 --- a/dists/gph/scummvm.ini +++ b/dists/gph/scummvm.ini @@ -1,5 +1,5 @@ [info] -name="ScummVM 1.5.0git" +name="ScummVM 1.6.0git" path="/scummvm/scummvm.gpe" icon="/scummvm/scummvm.png" title="/scummvm/scummvmb.png" diff --git a/dists/iphone/Info.plist b/dists/iphone/Info.plist index e25cee51ea..2f6ba85b00 100644 --- a/dists/iphone/Info.plist +++ b/dists/iphone/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.5.0git + 1.6.0git CFBundleSignature ???? CFBundleVersion - 1.5.0git + 1.6.0git CFBundleIconFile icon.png CFBundleIconFiles diff --git a/dists/irix/scummvm.spec b/dists/irix/scummvm.spec index 2e099d94a8..bbdf31cc2c 100644 --- a/dists/irix/scummvm.spec +++ b/dists/irix/scummvm.spec @@ -1,5 +1,5 @@ product scummvm - id "ScummVM 1.5.0git" + id "ScummVM 1.6.0git" image sw id "software" version 18 diff --git a/dists/macosx/Info.plist b/dists/macosx/Info.plist index 94adc00a9b..d8c28f6a08 100644 --- a/dists/macosx/Info.plist +++ b/dists/macosx/Info.plist @@ -28,7 +28,7 @@ CFBundleExecutable scummvm CFBundleGetInfoString - 1.5.0git, Copyright 2001-2012 The ScummVM team + 1.6.0git, Copyright 2001-2012 The ScummVM team CFBundleIconFile scummvm.icns CFBundleIdentifier @@ -40,9 +40,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.5.0git + 1.6.0git CFBundleVersion - 1.5.0git + 1.6.0git NSPrincipalClass NSApplication NSHumanReadableCopyright diff --git a/dists/openpandora/PXML.xml b/dists/openpandora/PXML.xml index 896210bf01..b759c311ba 100644 --- a/dists/openpandora/PXML.xml +++ b/dists/openpandora/PXML.xml @@ -4,11 +4,11 @@ - + - ScummVM 1.5.0git + ScummVM 1.6.0git - ScummVM 1.5.0git + ScummVM 1.6.0git @@ -25,7 +25,7 @@ - + ScummVM diff --git a/dists/openpandora/README-OPENPANDORA b/dists/openpandora/README-OPENPANDORA index b3947975c0..e3c7c9d631 100644 --- a/dists/openpandora/README-OPENPANDORA +++ b/dists/openpandora/README-OPENPANDORA @@ -1,4 +1,4 @@ -ScummVM 1.5.0git - OPENPANDORA SPECIFIC README +ScummVM 1.6.0git - OPENPANDORA SPECIFIC README ------------------------------------------------------------------------ Please refer to the: diff --git a/dists/openpandora/README-PND.txt b/dists/openpandora/README-PND.txt index 240936f755..594ad293ed 100644 --- a/dists/openpandora/README-PND.txt +++ b/dists/openpandora/README-PND.txt @@ -1,4 +1,4 @@ -ScummVM 1.5.0git - OPENPANDORA README - HOW TO INSTALL +ScummVM 1.6.0git - OPENPANDORA README - HOW TO INSTALL ------------------------------------------------------------------------ Please refer to the: diff --git a/dists/openpandora/index.html b/dists/openpandora/index.html index d7238c1889..5da951546c 100644 --- a/dists/openpandora/index.html +++ b/dists/openpandora/index.html @@ -5,7 +5,7 @@

-

ScummVM 1.5.0git: OpenPandora Specific Documentation

+

ScummVM 1.6.0git: OpenPandora Specific Documentation

ScummVM OpenPandora README
@@ -13,7 +13,7 @@ ScummVM OpenPandora WiKi

-

ScummVM 1.5.0git: General Documentation

+

ScummVM 1.6.0git: General Documentation

ScummVM website
diff --git a/dists/redhat/scummvm-tools.spec b/dists/redhat/scummvm-tools.spec index 99add8ba85..2f65931a70 100644 --- a/dists/redhat/scummvm-tools.spec +++ b/dists/redhat/scummvm-tools.spec @@ -7,7 +7,7 @@ # Prologue information #------------------------------------------------------------------------------ Name : scummvm-tools -Version : 1.5.0git +Version : 1.6.0git Release : 1 Summary : ScummVM-related tools Group : Interpreters diff --git a/dists/redhat/scummvm.spec b/dists/redhat/scummvm.spec index 2ccccae79d..d80404a3c6 100644 --- a/dists/redhat/scummvm.spec +++ b/dists/redhat/scummvm.spec @@ -7,7 +7,7 @@ # Prologue information #------------------------------------------------------------------------------ Name : scummvm -Version : 1.5.0git +Version : 1.6.0git Release : 1 Summary : Graphic adventure game interpreter Group : Interpreters diff --git a/dists/scummvm.rc b/dists/scummvm.rc index 6f24b8797d..4a67100f9f 100644 --- a/dists/scummvm.rc +++ b/dists/scummvm.rc @@ -49,8 +49,8 @@ pred.dic FILE "dists/pred.dic" #endif VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,5,0,0 - PRODUCTVERSION 1,5,0,0 + FILEVERSION 1,6,0,0 + PRODUCTVERSION 1,6,0,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG @@ -67,13 +67,13 @@ BEGIN BEGIN VALUE "Comments", "Look! A three headed monkey (TM)! .. Nice use of the TM!\0" VALUE "FileDescription", "http://www.scummvm.org/\0" - VALUE "FileVersion", "1.5.0git\0" + VALUE "FileVersion", "1.6.0git\0" VALUE "InternalName", "scummvm\0" VALUE "LegalCopyright", "Copyright 2001-2012 The ScummVM Team\0" VALUE "LegalTrademarks", "'SCUMM', and all SCUMM games are a TM of LucasArts. Simon The Sorcerer is a TM of AdventureSoft. Beneath a Steel Sky and Broken Sword are a TM of Revolution. Flight of the Amazon Queen is a TM of John Passfield and Steve Stamatiadis. \0" VALUE "OriginalFilename", "scummvm.exe\0" VALUE "ProductName", "ScummVM\0" - VALUE "ProductVersion", "1.5.0git\0" + VALUE "ProductVersion", "1.6.0git\0" END END diff --git a/dists/slackware/scummvm.SlackBuild b/dists/slackware/scummvm.SlackBuild index 4ccc2a8995..076a1d20ea 100755 --- a/dists/slackware/scummvm.SlackBuild +++ b/dists/slackware/scummvm.SlackBuild @@ -9,7 +9,7 @@ if [ "$TMP" = "" ]; then fi PKG=$TMP/package-scummvm -VERSION=1.5.0git +VERSION=1.6.0git ARCH=i486 BUILD=1 diff --git a/dists/wii/meta.xml b/dists/wii/meta.xml index e843d36e79..5a4c46e144 100644 --- a/dists/wii/meta.xml +++ b/dists/wii/meta.xml @@ -2,7 +2,7 @@ ScummVM The ScummVM Team - 1.5.0git@REVISION@ + 1.6.0git@REVISION@ @TIMESTAMP@ Point & Click Adventures ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed! diff --git a/dists/win32/scummvm.nsi b/dists/win32/scummvm.nsi index 7ff174befb..795eb660b6 100644 --- a/dists/win32/scummvm.nsi +++ b/dists/win32/scummvm.nsi @@ -72,7 +72,7 @@ Name ScummVM # General Symbol Definitions ######################################################################################### !define REGKEY "Software\$(^Name)\$(^Name)" -!define VERSION "1.5.0git" +!define VERSION "1.6.0git" !define COMPANY "ScummVM Team" !define URL "http://scummvm.org/" !define DESCRIPTION "ScummVM Installer. Look! A three headed monkey (TM)!" @@ -92,7 +92,7 @@ XPStyle on #TargetMinimalOS 5.0 ; Minimal version of windows for installer: Windows 2000 or more recent ; (will build unicode installer with NSIS 2.50+) -VIProductVersion 1.5.0.0 +VIProductVersion 1.6.0.0 VIAddVersionKey ProductName $(^Name) VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" -- cgit v1.2.3 From ccd1553f60680daf49f9237b718e9013cc3c3f97 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 8 Jul 2012 22:39:18 +0200 Subject: NEWS: Remove OpenGL entry in 1.5.0 news section. --- NEWS | 3 --- 1 file changed, 3 deletions(-) diff --git a/NEWS b/NEWS index 443306fbfd..40d98f294f 100644 --- a/NEWS +++ b/NEWS @@ -30,9 +30,6 @@ For a more comprehensive changelog of the latest experimental code, see: - Improved predictive dialog look. - Various GUI improvements. - SDL ports: - - Added support for OpenGL (GSoC Task). - Broken Sword 1: - Fixed incorrect sound effects in the DOS/Windows demo. - Added support for PlayStation videos. -- cgit v1.2.3 From 4635d83864b651292e7c7eb9be0687c0c742f061 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 8 Jul 2012 22:55:53 +0100 Subject: I18N: Update Swedish translation from patch #3541394 --- po/se_SE.po | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/po/se_SE.po b/po/se_SE.po index 880b198895..8388e55370 100644 --- a/po/se_SE.po +++ b/po/se_SE.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.5.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-06-28 15:47+0100\n" +"PO-Revision-Date: 2012-07-08 18:03+0100\n" "Last-Translator: Hampus Flink \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -2186,7 +2186,6 @@ msgid "Choose Spell" msgstr "Vlj trollformel" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2194,10 +2193,10 @@ msgid "" "General MIDI ones. It is still possible that\n" "some tracks sound incorrect." msgstr "" -"Du verkar anvnda en General MIDI enhet\n" +"Du verkar anvnda en General MIDI-enhet,\n" "men ditt spel stder endast Roland MT32 MIDI.\n" -"Vi frsker kartlgga Roland MT32 instrument fr\n" -"General MIDI instrument. Det kan trots allt hnda\n" +"Vi frsker kartlgga Roland MT32-instrumenten till\n" +"General MIDI-instrument. Det kan trots allt hnda\n" "att ett ftal ljudspr inte spelas korrekt." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -- cgit v1.2.3 From c40294fdcc64c2e78f0f5ef95e074b6ebf1070c6 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 8 Jul 2012 22:56:49 +0100 Subject: I18N: Update Spanish translation from patch #3541399 --- po/es_ES.po | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/po/es_ES.po b/po/es_ES.po index fffd190695..8e23894dcf 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.4.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-06-22 17:44+0100\n" +"PO-Revision-Date: 2012-07-08 18:19+0100\n" "Last-Translator: Toms Maidagan\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -2190,7 +2190,6 @@ msgid "Choose Spell" msgstr "Elegir hechizo" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2198,11 +2197,11 @@ msgid "" "General MIDI ones. It is still possible that\n" "some tracks sound incorrect." msgstr "" -"Ests usando un dispositivo General Midi, pero el\n" +"Ests usando un dispositivo General MIDI, pero el\n" "juego solo es compatible con MIDI Roland MT32.\n" "Intentamos adaptar los instrumentos Roland MT32\n" "a los de General MIDI, pero es posible que algunas\n" -"de las pistas no se reproduzcan correctamente." +"de las pistas no suenen correctamente." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -- cgit v1.2.3 From d2db9c1253580646e2b8f15eec7dc3b423292399 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 8 Jul 2012 22:58:06 +0100 Subject: I18N: Regenerate translations data file --- gui/themes/translations.dat | Bin 340460 -> 340940 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 97d69b400c..934aaeaebe 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From 078c09c13e5ffa2266bccfd85c38a93d730a02e6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 9 Jul 2012 01:27:39 +0300 Subject: SCI: Update comments in kGetAngleWorker() --- engines/sci/engine/kmath.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index 05c8845288..a643fbe37a 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -89,6 +89,9 @@ uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { // differences from the original, which uses custom implementation of atan(). // The differences in the return values are the cause of bug #3540976 // and perhaps bug #3037267 as well. + // The results of this function match the expected results of SCI0, but not + // SCI1 (hence the bug in Longbow). We need to find the point in history + // when this function was changed. // HACK: Return the expected value for Longbow, scene 150 (bug #3540976). // This is a temporary solution, till the function returns the expected @@ -128,7 +131,6 @@ uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { // Convert from grads to degrees by merging grad 0 with grad 1, // grad 10 with grad 11, grad 20 with grad 21, etc. This leads to // "degrees" that equal either one or two grads. - // This subtraction is meant to change from 400 "degrees" into 360 degrees angle -= (angle + 9) / 10; return angle; } -- cgit v1.2.3 From b8354e27ae1c81578d9ac279dcba9bf09ccec058 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 9 Jul 2012 01:31:25 +0300 Subject: TINSEL: Fix bug #3541230 - "DW: PSX version locks up after using the book" Removed the superfluous MIDI offset storing code. Now, the MIDI buffer is re-read when the music loops. This removes a static variable and also fixes another bug in the SEQ decoder. --- engines/tinsel/music.cpp | 95 ++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 52 deletions(-) diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp index fa5334a033..a226feb656 100644 --- a/engines/tinsel/music.cpp +++ b/engines/tinsel/music.cpp @@ -140,7 +140,6 @@ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) { } // the index and length of the last tune loaded - static uint32 dwLastMidiIndex = 0; // FIXME: Avoid non-const global vars uint32 dwSeqLen = 0; // length of the sequence // Support for external music from the music enhancement project @@ -181,61 +180,53 @@ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) { if (dwFileOffset == 0) return true; - if (dwFileOffset != dwLastMidiIndex) { - Common::File midiStream; - - // open MIDI sequence file in binary mode - if (!midiStream.open(MIDI_FILE)) - error(CANNOT_FIND_FILE, MIDI_FILE); - - // update index of last tune loaded - dwLastMidiIndex = dwFileOffset; - - // move to correct position in the file - midiStream.seek(dwFileOffset, SEEK_SET); - - // read the length of the sequence - dwSeqLen = midiStream.readUint32LE(); - - // make sure buffer is large enough for this sequence - assert(dwSeqLen > 0 && dwSeqLen <= g_midiBuffer.size); - - // stop any currently playing tune - _vm->_midiMusic->stop(); - - // read the sequence - if (midiStream.read(g_midiBuffer.pDat, dwSeqLen) != dwSeqLen) - error(FILE_IS_CORRUPT, MIDI_FILE); - - midiStream.close(); - - // WORKAROUND for bug #2820054 "DW1: No intro music at first start on Wii", - // which actually affects all ports, since it's specific to the GRA version. - // - // The GRA version does not seem to set the channel volume at all for the first - // intro track, thus we need to do that here. We only initialize the channels - // used in that sequence. And we are using 127 as default channel volume. - // - // Only in the GRA version dwFileOffset can be "38888", just to be sure, we - // check for the SCN files feature flag not being set though. - if (_vm->getGameID() == GID_DW1 && dwFileOffset == 38888 && !(_vm->getFeatures() & GF_SCNFILES)) { - _vm->_midiMusic->send(0x7F07B0 | 3); - _vm->_midiMusic->send(0x7F07B0 | 5); - _vm->_midiMusic->send(0x7F07B0 | 8); - _vm->_midiMusic->send(0x7F07B0 | 10); - _vm->_midiMusic->send(0x7F07B0 | 13); - } + Common::File midiStream; + + // open MIDI sequence file in binary mode + if (!midiStream.open(MIDI_FILE)) + error(CANNOT_FIND_FILE, MIDI_FILE); - _vm->_midiMusic->playMIDI(dwSeqLen, bLoop); + // move to correct position in the file + midiStream.seek(dwFileOffset, SEEK_SET); - // Store the length - //dwLastSeqLen = dwSeqLen; - } else { - // dwFileOffset == dwLastMidiIndex - _vm->_midiMusic->stop(); - _vm->_midiMusic->playMIDI(dwSeqLen, bLoop); + // read the length of the sequence + dwSeqLen = midiStream.readUint32LE(); + + // make sure buffer is large enough for this sequence + assert(dwSeqLen > 0 && dwSeqLen <= g_midiBuffer.size); + + // stop any currently playing tune + _vm->_midiMusic->stop(); + + // read the sequence. This needs to be read again before playSEQ() is + // called even if the music is restarting, as playSEQ() reads the file + // name off the buffer itself. However, that function adds SMF headers + // to the buffer, thus if it's read again, the SMF headers will be read + // and the filename will always be 'MThd'. + if (midiStream.read(g_midiBuffer.pDat, dwSeqLen) != dwSeqLen) + error(FILE_IS_CORRUPT, MIDI_FILE); + + midiStream.close(); + + // WORKAROUND for bug #2820054 "DW1: No intro music at first start on Wii", + // which actually affects all ports, since it's specific to the GRA version. + // + // The GRA version does not seem to set the channel volume at all for the first + // intro track, thus we need to do that here. We only initialize the channels + // used in that sequence. And we are using 127 as default channel volume. + // + // Only in the GRA version dwFileOffset can be "38888", just to be sure, we + // check for the SCN files feature flag not being set though. + if (_vm->getGameID() == GID_DW1 && dwFileOffset == 38888 && !(_vm->getFeatures() & GF_SCNFILES)) { + _vm->_midiMusic->send(0x7F07B0 | 3); + _vm->_midiMusic->send(0x7F07B0 | 5); + _vm->_midiMusic->send(0x7F07B0 | 8); + _vm->_midiMusic->send(0x7F07B0 | 10); + _vm->_midiMusic->send(0x7F07B0 | 13); } + _vm->_midiMusic->playMIDI(dwSeqLen, bLoop); + return true; } -- cgit v1.2.3 From 0cf00ddfe2d985bdd00f5fb06ee5bfb2f8683831 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 9 Jul 2012 01:49:58 +0200 Subject: GUI: Make container widget a bit more container like. Now it is possible to add sub widgets to a ContainerWidget and allow for these to get events too. --- gui/widget.cpp | 20 ++++++++++++++++++++ gui/widget.h | 3 +++ 2 files changed, 23 insertions(+) diff --git a/gui/widget.cpp b/gui/widget.cpp index 3c26f1135b..4babce66fb 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -711,6 +711,26 @@ ContainerWidget::ContainerWidget(GuiObject *boss, const Common::String &name) : _type = kContainerWidget; } +ContainerWidget::~ContainerWidget() { + // We also remove the widget from the boss to avoid segfaults, when the + // deleted widget is an active widget in the boss. + for (Widget *w = _firstWidget; w; w = w->next()) { + _boss->removeWidget(w); + } +} + +Widget *ContainerWidget::findWidget(int x, int y) { + return findWidgetInChain(_firstWidget, x, y); +} + +void ContainerWidget::removeWidget(Widget *widget) { + // We also remove the widget from the boss to avoid a reference to a + // widget not in the widget chain anymore. + _boss->removeWidget(widget); + + Widget::removeWidget(widget); +} + void ContainerWidget::drawWidget() { g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, ThemeEngine::kWidgetBackgroundBorder); } diff --git a/gui/widget.h b/gui/widget.h index bcc9a3f6d3..6f710f302f 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -368,7 +368,10 @@ class ContainerWidget : public Widget { public: ContainerWidget(GuiObject *boss, int x, int y, int w, int h); ContainerWidget(GuiObject *boss, const Common::String &name); + ~ContainerWidget(); + virtual Widget *findWidget(int x, int y); + virtual void removeWidget(Widget *widget); protected: void drawWidget(); }; -- cgit v1.2.3 From e37c0be0d91029284cee1e3ff895de15e59248f8 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 9 Jul 2012 02:17:57 +0200 Subject: GUI: Fix missing button background in grid based chooser. Now the thumbnail button and the descriptions are sub widgets of the container widget. --- gui/saveload-dialog.cpp | 14 ++++---------- gui/saveload-dialog.h | 2 -- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index d7fa9c686a..cf97737a1b 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -611,15 +611,13 @@ void LoadChooserThumbnailed::reflowLayout() { ContainerWidget *container = new ContainerWidget(this, curX, y, containerWidth, containerHeight); container->setVisible(false); - int dstY = y + containerFrameHeightAdd / 2; - int dstX = curX + containerFrameWidthAdd / 2; + int dstY = containerFrameHeightAdd / 2; + int dstX = containerFrameWidthAdd / 2; - PicButtonWidget *button = new PicButtonWidget(this, dstX, dstY, buttonWidth, buttonHeight, 0, curLine * _columns + curColumn + 1); - button->setVisible(false); + PicButtonWidget *button = new PicButtonWidget(container, dstX, dstY, buttonWidth, buttonHeight, 0, curLine * _columns + curColumn + 1); dstY += buttonHeight; - StaticTextWidget *description = new StaticTextWidget(this, dstX, dstY, buttonWidth, kLineHeight, Common::String(), Graphics::kTextAlignLeft); - description->setVisible(false); + StaticTextWidget *description = new StaticTextWidget(container, dstX, dstY, buttonWidth, kLineHeight, Common::String(), Graphics::kTextAlignLeft); _buttons.push_back(SlotButton(container, button, description)); } @@ -642,10 +640,6 @@ void LoadChooserThumbnailed::destroyButtons() { for (ButtonArray::iterator i = _buttons.begin(), end = _buttons.end(); i != end; ++i) { removeWidget(i->container); delete i->container; - removeWidget(i->button); - delete i->button; - removeWidget(i->description); - delete i->description; } _buttons.clear(); diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index e169dbf613..a604773142 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -149,8 +149,6 @@ private: void setVisible(bool state) { container->setVisible(state); - button->setVisible(state); - description->setVisible(state); } }; typedef Common::Array ButtonArray; -- cgit v1.2.3 From bed2eb20cdcfccc3bf1e9b24f7466b678332d601 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Mon, 9 Jul 2012 09:11:31 +0200 Subject: MOHAWK: Restart anims when LiveText plays them. --- engines/mohawk/livingbooks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp index 7f7df66e53..a0671d18d5 100644 --- a/engines/mohawk/livingbooks.cpp +++ b/engines/mohawk/livingbooks.cpp @@ -3464,7 +3464,7 @@ void LBLiveTextItem::update() { // TODO: check this in RE LBItem *item = _vm->getItemById(_words[_currentWord].itemId); if (item) - item->togglePlaying(false); + item->togglePlaying(false, true); _currentWord = 0xFFFF; } -- cgit v1.2.3 From 19bd379e8bcceb3287673cbfd0388b733ced778f Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Mon, 9 Jul 2012 12:38:50 +0100 Subject: I18N: Update Hungarian translation from patch #3541507 --- po/hu_HU.po | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/po/hu_HU.po b/po/hu_HU.po index 29ad6c3aeb..828659dea6 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-06-25 06:21+0100\n" +"PO-Revision-Date: 2012-07-09 05:58+0100\n" "Last-Translator: George Kormendi \n" "Language-Team: Hungarian\n" "MIME-Version: 1.0\n" @@ -2178,7 +2178,6 @@ msgid "Choose Spell" msgstr "Vlassz varzslatot" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2186,11 +2185,11 @@ msgid "" "General MIDI ones. It is still possible that\n" "some tracks sound incorrect." msgstr "" -"gy nz ki egy General MIDI eszkzt hasznlsz,\n" -"a jtk csak Roland MT32 MIDI eszkzt tmogat.\n" -"Cserld ki Roland MT32 hangszerekre\n" -"a General MIDI-t. Klnben nhny\n" -"svot nem lehet rendesen lejtszani." +"gy tnik, egy General MIDI eszkzt hasznlsz,\n" +"de a jtk csak Roland MT32 MIDI eszkzt tmogat.\n" +"Megprbljuk lecserlni a Roland MT32 hangszereket\n" +"General MIDIre. Tovbbra is lehetsges hogy\n" +"nhny hangsv helytelenl hangzik." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -- cgit v1.2.3 From 9a90f316dc29a37234a46457b4593aaddc24fa4c Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Mon, 9 Jul 2012 12:39:41 +0100 Subject: I18N: Update Italian translation This was sent by Matteo by email. --- po/it_IT.po | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/po/it_IT.po b/po/it_IT.po index d4f8256c83..164171ce8f 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-06-29 14:33+0100\n" +"PO-Revision-Date: 2012-07-09 09:30+0100\n" "Last-Translator: Matteo 'Maff' Angelino \n" "Language-Team: Italian\n" "MIME-Version: 1.0\n" @@ -2194,7 +2194,6 @@ msgid "Choose Spell" msgstr "Scegli incantesimo" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2206,7 +2205,7 @@ msgstr "" "General MIDI, ma il gioco supporta solo Roland\n" "MT32 MIDI. Tenteremo di mappare gli strumenti\n" "Roland MT32 in quelli General MIDI. Alcune tracce\n" -"potrebbero non essere riprodotte correttamente." +"potrebbero avere un suono non corretto." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -- cgit v1.2.3 From 1153133627d2d3c4a7cc02963051992bbfc00345 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Mon, 9 Jul 2012 12:40:09 +0100 Subject: I18N: Regenerate translations data file --- gui/themes/translations.dat | Bin 340940 -> 341409 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 934aaeaebe..9735e99fca 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From bc0bd33d4dfd448db989e84bcc67e54183b21e39 Mon Sep 17 00:00:00 2001 From: Steffen Nyeland Date: Mon, 9 Jul 2012 20:30:32 +0200 Subject: Updated da_DA file --- po/da_DA.po | 769 ++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 438 insertions(+), 331 deletions(-) diff --git a/po/da_DA.po b/po/da_DA.po index d3a39db440..c2d55f82cd 100644 --- a/po/da_DA.po +++ b/po/da_DA.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-06-29 19:45+0100\n" +"PO-Revision-Date: 2012-07-09 20:27+0100\n" "Last-Translator: Steffen Nyeland \n" "Language-Team: Steffen Nyeland \n" "MIME-Version: 1.0\n" @@ -35,7 +35,8 @@ msgstr "Tilg msgid "Go up" msgstr "G op" -#: gui/browser.cpp:66 gui/browser.cpp:68 +#: gui/browser.cpp:66 +#: gui/browser.cpp:68 msgid "Go to previous directory level" msgstr "G til forrige biblioteks niveau" @@ -44,24 +45,37 @@ msgctxt "lowres" msgid "Go up" msgstr "G op" -#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 +#: gui/browser.cpp:69 +#: gui/chooser.cpp:45 +#: gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 +#: gui/massadd.cpp:94 +#: gui/options.cpp:1228 +#: gui/saveload.cpp:64 +#: gui/saveload.cpp:173 +#: gui/themebrowser.cpp:54 +#: engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 +#: engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Fortryd" -#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 +#: gui/browser.cpp:70 +#: gui/chooser.cpp:46 +#: gui/themebrowser.cpp:55 msgid "Choose" msgstr "Vlg" -#: gui/gui-manager.cpp:115 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 +#: gui/gui-manager.cpp:115 +#: 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 #: backends/keymapper/remap-dialog.cpp:52 msgid "Close" msgstr "Luk" @@ -70,19 +84,23 @@ msgstr "Luk" msgid "Mouse click" msgstr "Muse klik" -#: gui/gui-manager.cpp:122 base/main.cpp:300 +#: gui/gui-manager.cpp:122 +#: base/main.cpp:300 msgid "Display keyboard" msgstr "Vis tastatur" -#: gui/gui-manager.cpp:126 base/main.cpp:304 +#: gui/gui-manager.cpp:126 +#: base/main.cpp:304 msgid "Remap keys" msgstr "Kortlg taster" -#: gui/gui-manager.cpp:129 base/main.cpp:307 +#: gui/gui-manager.cpp:129 +#: base/main.cpp:307 msgid "Toggle FullScreen" msgstr "Skift fuldskrm" -#: gui/KeysDialog.h:36 gui/KeysDialog.cpp:145 +#: gui/KeysDialog.h:36 +#: gui/KeysDialog.cpp:145 msgid "Choose an action to map" msgstr "Vlg en handling at kortlgge" @@ -90,17 +108,31 @@ msgstr "V msgid "Map" msgstr "Kortlg" -#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 +#: gui/KeysDialog.cpp:42 +#: gui/launcher.cpp:346 +#: gui/launcher.cpp:1001 +#: gui/launcher.cpp:1005 +#: gui/massadd.cpp:91 +#: gui/options.cpp:1229 +#: engines/engine.cpp:361 +#: engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 +#: engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 +#: engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 +#: engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 +#: engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 +#: engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 +#: engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 +#: engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 +#: engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" @@ -110,12 +142,16 @@ msgstr "OK" msgid "Select an action and click 'Map'" msgstr "Vlg en handling og klik 'Kortlg'" -#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141 +#: gui/KeysDialog.cpp:80 +#: gui/KeysDialog.cpp:102 +#: gui/KeysDialog.cpp:141 #, c-format msgid "Associated key : %s" msgstr "Tilknyttet tast : %s" -#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#: gui/KeysDialog.cpp:82 +#: gui/KeysDialog.cpp:104 +#: gui/KeysDialog.cpp:143 #, c-format msgid "Associated key : none" msgstr "Tilknyttet tast : ingen" @@ -136,13 +172,11 @@ msgstr "Spil" msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194 -msgid "" -"Short game identifier used for referring to savegames and running the game " -"from the command line" -msgstr "" -"Kort spil identifikator til brug for gemmer, og for at kre spillet fra " -"kommandolinien" +#: gui/launcher.cpp:191 +#: gui/launcher.cpp:193 +#: gui/launcher.cpp:194 +msgid "Short game identifier used for referring to savegames and running the game from the command line" +msgstr "Kort spil identifikator til brug for gemmer, og for at kre spillet fra kommandolinien" #: gui/launcher.cpp:193 msgctxt "lowres" @@ -153,7 +187,9 @@ msgstr "ID:" msgid "Name:" msgstr "Navn:" -#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201 +#: gui/launcher.cpp:198 +#: gui/launcher.cpp:200 +#: gui/launcher.cpp:201 msgid "Full title of the game" msgstr "Fuld titel p spillet" @@ -166,16 +202,17 @@ msgstr "Navn:" msgid "Language:" msgstr "Sprog:" -#: gui/launcher.cpp:204 gui/launcher.cpp:205 -msgid "" -"Language of the game. This will not turn your Spanish game version into " -"English" -msgstr "" -"Spillets sprog. Dette vil ikke ndre din spanske version af spillet til " -"engelsk" +#: gui/launcher.cpp:204 +#: gui/launcher.cpp:205 +msgid "Language of the game. This will not turn your Spanish game version into English" +msgstr "Spillets sprog. Dette vil ikke ndre din spanske version af spillet til engelsk" -#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 -#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 +#: gui/launcher.cpp:206 +#: gui/launcher.cpp:220 +#: gui/options.cpp:80 +#: gui/options.cpp:730 +#: gui/options.cpp:743 +#: gui/options.cpp:1199 #: audio/null.cpp:40 msgid "" msgstr "" @@ -184,7 +221,9 @@ msgstr "" msgid "Platform:" msgstr "Platform:" -#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219 +#: gui/launcher.cpp:216 +#: gui/launcher.cpp:218 +#: gui/launcher.cpp:219 msgid "Platform the game was originally designed for" msgstr "Platform som spillet oprindeligt var designet til" @@ -197,11 +236,15 @@ msgstr "Platform:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 +#: gui/options.cpp:1062 +#: gui/options.cpp:1079 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 +#: gui/launcher.cpp:239 +#: gui/options.cpp:1062 +#: gui/options.cpp:1079 msgid "GFX" msgstr "GFX" @@ -214,7 +257,8 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Overstyr globale grafik indstillinger" -#: gui/launcher.cpp:251 gui/options.cpp:1085 +#: gui/launcher.cpp:251 +#: gui/options.cpp:1085 msgid "Audio" msgstr "Lyd" @@ -227,11 +271,13 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Overstyr globale lyd indstillinger" -#: gui/launcher.cpp:265 gui/options.cpp:1090 +#: gui/launcher.cpp:265 +#: gui/options.cpp:1090 msgid "Volume" msgstr "Lydstyrke" -#: gui/launcher.cpp:267 gui/options.cpp:1092 +#: gui/launcher.cpp:267 +#: gui/options.cpp:1092 msgctxt "lowres" msgid "Volume" msgstr "Lydstyrke" @@ -245,7 +291,8 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Overstyr globale lydstyrke indstillinger" -#: gui/launcher.cpp:280 gui/options.cpp:1100 +#: gui/launcher.cpp:280 +#: gui/options.cpp:1100 msgid "MIDI" msgstr "MIDI" @@ -258,7 +305,8 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Overstyr globale MIDI indstillinger" -#: gui/launcher.cpp:294 gui/options.cpp:1106 +#: gui/launcher.cpp:294 +#: gui/options.cpp:1106 msgid "MT-32" msgstr "MT-32" @@ -271,11 +319,13 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Overstyr globale MT-32 indstillinger" -#: gui/launcher.cpp:308 gui/options.cpp:1113 +#: gui/launcher.cpp:308 +#: gui/options.cpp:1113 msgid "Paths" msgstr "Stier" -#: gui/launcher.cpp:310 gui/options.cpp:1115 +#: gui/launcher.cpp:310 +#: gui/options.cpp:1115 msgctxt "lowres" msgid "Paths" msgstr "Stier" @@ -289,54 +339,80 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Spil sti:" -#: gui/launcher.cpp:324 gui/options.cpp:1139 +#: gui/launcher.cpp:324 +#: gui/options.cpp:1139 msgid "Extra Path:" msgstr "Ekstra sti:" -#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327 +#: gui/launcher.cpp:324 +#: gui/launcher.cpp:326 +#: gui/launcher.cpp:327 msgid "Specifies path to additional data used the game" msgstr "Angiver sti til ekstra data der bruges i spillet" -#: gui/launcher.cpp:326 gui/options.cpp:1141 +#: gui/launcher.cpp:326 +#: gui/options.cpp:1141 msgctxt "lowres" msgid "Extra Path:" msgstr "Ekstra sti:" -#: gui/launcher.cpp:333 gui/options.cpp:1123 +#: gui/launcher.cpp:333 +#: gui/options.cpp:1123 msgid "Save Path:" msgstr "Gemme sti:" -#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 -#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 +#: gui/launcher.cpp:333 +#: gui/launcher.cpp:335 +#: gui/launcher.cpp:336 +#: gui/options.cpp:1123 +#: gui/options.cpp:1125 +#: gui/options.cpp:1126 msgid "Specifies where your savegames are put" msgstr "Angiver hvor dine gemmer bliver lagt" -#: gui/launcher.cpp:335 gui/options.cpp:1125 +#: gui/launcher.cpp:335 +#: gui/options.cpp:1125 msgctxt "lowres" msgid "Save Path:" msgstr "Gemme sti:" -#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 -#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 -#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 -#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 -#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 +#: gui/launcher.cpp:354 +#: gui/launcher.cpp:453 +#: gui/launcher.cpp:511 +#: gui/launcher.cpp:565 +#: gui/options.cpp:1134 +#: gui/options.cpp:1142 +#: gui/options.cpp:1151 +#: gui/options.cpp:1258 +#: gui/options.cpp:1264 +#: gui/options.cpp:1272 +#: gui/options.cpp:1302 +#: gui/options.cpp:1308 +#: gui/options.cpp:1315 +#: gui/options.cpp:1408 +#: gui/options.cpp:1411 #: gui/options.cpp:1423 msgctxt "path" msgid "None" msgstr "Ingen" -#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 -#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 +#: gui/launcher.cpp:359 +#: gui/launcher.cpp:459 +#: gui/launcher.cpp:569 +#: gui/options.cpp:1252 +#: gui/options.cpp:1296 +#: gui/options.cpp:1414 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 gui/options.cpp:1417 +#: gui/launcher.cpp:504 +#: gui/options.cpp:1417 msgid "Select SoundFont" msgstr "Vlg SoundFont" -#: gui/launcher.cpp:523 gui/launcher.cpp:677 +#: gui/launcher.cpp:523 +#: gui/launcher.cpp:677 msgid "Select directory with game data" msgstr "Vlg bibliotek med spil data" @@ -352,11 +428,13 @@ msgstr "V msgid "This game ID is already taken. Please choose another one." msgstr "Dette spil ID er allerede i brug. Vlg venligst et andet." -#: gui/launcher.cpp:621 engines/dialogs.cpp:110 +#: gui/launcher.cpp:621 +#: engines/dialogs.cpp:110 msgid "~Q~uit" msgstr "~A~fslut" -#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 +#: backends/platform/sdl/macosx/appmenu_osx.mm:96 msgid "Quit ScummVM" msgstr "Slut ScummVM" @@ -364,7 +442,8 @@ msgstr "Slut ScummVM" msgid "A~b~out..." msgstr "~O~m..." -#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 +#: backends/platform/sdl/macosx/appmenu_osx.mm:70 msgid "About ScummVM" msgstr "Om ScummVM" @@ -392,11 +471,13 @@ msgstr "Ind~l~ msgid "Load savegame for selected game" msgstr "Indls gemmer for det valgte spil" -#: gui/launcher.cpp:633 gui/launcher.cpp:1120 +#: gui/launcher.cpp:633 +#: gui/launcher.cpp:1120 msgid "~A~dd Game..." msgstr "~T~ilfj spil..." -#: gui/launcher.cpp:633 gui/launcher.cpp:640 +#: gui/launcher.cpp:633 +#: gui/launcher.cpp:640 msgid "Hold Shift for Mass Add" msgstr "Hold Skift for at tilfje flere" @@ -404,7 +485,8 @@ msgstr "Hold Skift for at tilf msgid "~E~dit Game..." msgstr "~R~ediger spil..." -#: gui/launcher.cpp:635 gui/launcher.cpp:642 +#: gui/launcher.cpp:635 +#: gui/launcher.cpp:642 msgid "Change game options" msgstr "ndre spil indstillinger" @@ -412,11 +494,13 @@ msgstr " msgid "~R~emove Game" msgstr "~F~jern spil" -#: gui/launcher.cpp:637 gui/launcher.cpp:644 +#: gui/launcher.cpp:637 +#: gui/launcher.cpp:644 msgid "Remove game from the list. The game data files stay intact" msgstr "Fjerner spil fra listen. Spillets data filer forbliver uberrt" -#: gui/launcher.cpp:640 gui/launcher.cpp:1120 +#: gui/launcher.cpp:640 +#: gui/launcher.cpp:1120 msgctxt "lowres" msgid "~A~dd Game..." msgstr "~T~ilfj spil..." @@ -435,31 +519,36 @@ msgstr "~F~jern spil" msgid "Search in game list" msgstr "Sg i spil liste" -#: gui/launcher.cpp:656 gui/launcher.cpp:1167 +#: gui/launcher.cpp:656 +#: gui/launcher.cpp:1167 msgid "Search:" msgstr "Sg:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 +#: gui/launcher.cpp:680 +#: engines/dialogs.cpp:114 +#: engines/mohawk/myst.cpp:255 +#: engines/mohawk/riven.cpp:716 +#: engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Indls spil:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 +#: gui/launcher.cpp:680 +#: engines/dialogs.cpp:114 +#: engines/scumm/dialogs.cpp:188 +#: engines/mohawk/myst.cpp:255 +#: engines/mohawk/riven.cpp:716 +#: engines/cruise/menu.cpp:214 +#: backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Indls" #: gui/launcher.cpp:788 -msgid "" -"Do you really want to run the mass game detector? This could potentially add " -"a huge number of games." -msgstr "" -"Vil du virkelig kre fler spils detektoren? Dette kunne potentielt tilfje " -"et stort antal spil." +msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." +msgstr "Vil du virkelig kre fler spils detektoren? Dette kunne potentielt tilfje et stort antal spil." -#: gui/launcher.cpp:789 gui/launcher.cpp:937 +#: gui/launcher.cpp:789 +#: gui/launcher.cpp:937 #: backends/events/symbiansdl/symbiansdl-events.cpp:184 #: backends/platform/wince/CEActionsPocket.cpp:326 #: backends/platform/wince/CEActionsSmartphone.cpp:287 @@ -467,7 +556,8 @@ msgstr "" msgid "Yes" msgstr "Ja" -#: gui/launcher.cpp:789 gui/launcher.cpp:937 +#: gui/launcher.cpp:789 +#: gui/launcher.cpp:937 #: backends/events/symbiansdl/symbiansdl-events.cpp:184 #: backends/platform/wince/CEActionsPocket.cpp:326 #: backends/platform/wince/CEActionsSmartphone.cpp:287 @@ -497,8 +587,7 @@ msgstr "Dette spil underst #: gui/launcher.cpp:1005 msgid "ScummVM could not find any engine capable of running the selected game!" -msgstr "" -"ScummVM kunne ikke finde en motor, istand til at afvikle det valgte spil!" +msgstr "ScummVM kunne ikke finde en motor, istand til at afvikle det valgte spil!" #: gui/launcher.cpp:1119 msgctxt "lowres" @@ -509,7 +598,8 @@ msgstr "Tilf msgid "Mass Add..." msgstr "Tilfj flere..." -#: gui/massadd.cpp:78 gui/massadd.cpp:81 +#: gui/massadd.cpp:78 +#: gui/massadd.cpp:81 msgid "... progress ..." msgstr "... fremskridt ..." @@ -572,8 +662,11 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 -#: gui/options.cpp:644 gui/options.cpp:852 +#: gui/options.cpp:248 +#: gui/options.cpp:474 +#: gui/options.cpp:575 +#: gui/options.cpp:644 +#: gui/options.cpp:852 msgctxt "soundfont" msgid "None" msgstr "Ingen" @@ -602,7 +695,8 @@ msgstr "Grafik tilstand:" msgid "Render mode:" msgstr "Rendere tilstand:" -#: gui/options.cpp:741 gui/options.cpp:742 +#: gui/options.cpp:741 +#: gui/options.cpp:742 msgid "Special dithering modes supported by some games" msgstr "Speciel farvereduceringstilstand understttet a nogle spil" @@ -628,11 +722,14 @@ msgstr "Foretruk. enhed:" msgid "Music Device:" msgstr "Musik enhed:" -#: gui/options.cpp:764 gui/options.cpp:766 +#: gui/options.cpp:764 +#: gui/options.cpp:766 msgid "Specifies preferred sound device or sound card emulator" msgstr "Angiver foretukket lyd enhed eller lydkort emulator" -#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 +#: gui/options.cpp:764 +#: gui/options.cpp:766 +#: gui/options.cpp:767 msgid "Specifies output sound device or sound card emulator" msgstr "Angiver lyd udgangsenhed eller lydkorts emulator" @@ -650,7 +747,8 @@ msgstr "Musik enhed:" msgid "AdLib emulator:" msgstr "AdLib emulator:" -#: gui/options.cpp:793 gui/options.cpp:794 +#: gui/options.cpp:793 +#: gui/options.cpp:794 msgid "AdLib is used for music in many games" msgstr "AdLib bliver brugt til musik i mange spil" @@ -658,13 +756,10 @@ msgstr "AdLib bliver brugt til musik i mange spil" msgid "Output rate:" msgstr "Udgangsfrekvens:" -#: gui/options.cpp:804 gui/options.cpp:805 -msgid "" -"Higher value specifies better sound quality but may be not supported by your " -"soundcard" -msgstr "" -"Hjere vrdi angiver bedre lyd kvalitet, men understttes mske ikke af dit " -"lydkort" +#: gui/options.cpp:804 +#: gui/options.cpp:805 +msgid "Higher value specifies better sound quality but may be not supported by your soundcard" +msgstr "Hjere vrdi angiver bedre lyd kvalitet, men understttes mske ikke af dit lydkort" #: gui/options.cpp:815 msgid "GM Device:" @@ -672,13 +767,14 @@ msgstr "GM enhed:" #: gui/options.cpp:815 msgid "Specifies default sound device for General MIDI output" -msgstr "Angiver standard lyd enhed for General MIDI-udgang" +msgstr "Angiver standard lyd enhed for Generel MIDI-udgang" #: gui/options.cpp:826 msgid "Don't use General MIDI music" -msgstr "Brug ikke General MIDI musik" +msgstr "Brug ikke Generel MIDI musik" -#: gui/options.cpp:837 gui/options.cpp:899 +#: gui/options.cpp:837 +#: gui/options.cpp:899 msgid "Use first available device" msgstr "Brug frste tilgngelig enhed" @@ -686,7 +782,9 @@ msgstr "Brug f msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 +#: gui/options.cpp:849 +#: gui/options.cpp:851 +#: gui/options.cpp:852 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont er understttet af nogle lydkort, Fluidsynth og Timidity" @@ -719,13 +817,10 @@ msgstr "Angiver standard lyd enhed for Roland MT-32/LAPC1/CM32I/CM64 udgang" msgid "True Roland MT-32 (disable GM emulation)" msgstr "gte Roland MT-32 (undlad GM emulering)" -#: gui/options.cpp:875 gui/options.cpp:877 -msgid "" -"Check if you want to use your real hardware Roland-compatible sound device " -"connected to your computer" -msgstr "" -"Kontroller om du vil bruge din rigtige hardware Roland-kompatible lyd enhed " -"tilsluttet til din computer" +#: gui/options.cpp:875 +#: gui/options.cpp:877 +msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" +msgstr "Kontroller om du vil bruge din rigtige hardware Roland-kompatible lyd enhed tilsluttet til din computer" #: gui/options.cpp:877 msgctxt "lowres" @@ -738,7 +833,7 @@ msgstr "Aktiv #: gui/options.cpp:880 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" -msgstr "Sluk for General MIDI kortlgning for spil med Roland MT-32 lydspor" +msgstr "Sluk for Generel MIDI kortlgning for spil med Roland MT-32 lydspor" #: gui/options.cpp:889 msgid "Don't use Roland MT-32 music" @@ -748,11 +843,13 @@ msgstr "Brug ikke Roland MT-32 musik" msgid "Text and Speech:" msgstr "Tekst og tale:" -#: gui/options.cpp:920 gui/options.cpp:930 +#: gui/options.cpp:920 +#: gui/options.cpp:930 msgid "Speech" msgstr "Tale" -#: gui/options.cpp:921 gui/options.cpp:931 +#: gui/options.cpp:921 +#: gui/options.cpp:931 msgid "Subtitles" msgstr "Undertekster" @@ -808,7 +905,9 @@ msgstr "Mute alle" msgid "SFX volume:" msgstr "SFX lydstyrke:" -#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 +#: gui/options.cpp:962 +#: gui/options.cpp:964 +#: gui/options.cpp:965 msgid "Special sound effects volume" msgstr "Lydstyrke for specielle lydeffekter" @@ -835,7 +934,9 @@ msgctxt "lowres" msgid "Theme Path:" msgstr "Tema sti:" -#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 +#: gui/options.cpp:1139 +#: gui/options.cpp:1141 +#: gui/options.cpp:1142 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Angiver sti til ekstra data brugt af alle spil eller ScummVM" @@ -911,26 +1012,26 @@ msgid "Select directory for plugins" msgstr "Vlg bibliotek for plugins" #: gui/options.cpp:1450 -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 "" -"Temaet du valgte understtter ikke dit aktuelle sprog. Hvis du nsker at " -"bruge dette tema, skal du skifte til et andet sprog frst." +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 "Temaet du valgte understtter ikke dit aktuelle sprog. Hvis du nsker at bruge dette tema, skal du skifte til et andet sprog frst." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload.cpp:59 +#: gui/saveload.cpp:257 msgid "No date saved" msgstr "Ingen dato gemt" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload.cpp:60 +#: gui/saveload.cpp:258 msgid "No time saved" msgstr "Intet tidspunkt gemt" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload.cpp:61 +#: gui/saveload.cpp:259 msgid "No playtime saved" msgstr "Ingen spilletid gemt" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload.cpp:68 +#: gui/saveload.cpp:173 msgid "Delete" msgstr "Slet" @@ -950,7 +1051,8 @@ msgstr "Tid:" msgid "Playtime: " msgstr "Spilletid:" -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload.cpp:305 +#: gui/saveload.cpp:372 msgid "Untitled savestate" msgstr "Unavngivet gemmetilstand" @@ -983,7 +1085,10 @@ msgstr "Antialias renderer (16bpp)" msgid "Antialiased (16bpp)" msgstr "Antialias (16bpp)" -#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332 +#: gui/widget.cpp:322 +#: gui/widget.cpp:324 +#: gui/widget.cpp:330 +#: gui/widget.cpp:332 msgid "Clear value" msgstr "Slet vrdi" @@ -996,13 +1101,15 @@ msgstr "Motor underst msgid "Menu" msgstr "Menu" -#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:290 +#: backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Spring over" -#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:293 +#: backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pause" @@ -1090,8 +1197,7 @@ msgstr "Spillet i '%s' ser ud til at v #: engines/advancedDetector.cpp:325 msgid "Please, report the following data to the ScummVM team along with name" -msgstr "" -"Venligst, rapportere flgende data til ScummVM holdet sammen med navnet" +msgstr "Venligst, rapportere flgende data til ScummVM holdet sammen med navnet" #: engines/advancedDetector.cpp:327 msgid "of the game you tried to add and its version/language/etc.:" @@ -1121,22 +1227,28 @@ msgstr "H~j~ msgid "~A~bout" msgstr "~O~m" -#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 +#: engines/dialogs.cpp:104 +#: engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~R~etur til spiloversigt" -#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 +#: engines/dialogs.cpp:106 +#: engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~R~etur til oversigt" -#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/dialogs.cpp:115 +#: engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:735 msgid "Save game:" msgstr "Gemmer:" -#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/dialogs.cpp:115 +#: engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 +#: engines/cruise/menu.cpp:212 #: engines/sci/engine/kfile.cpp:735 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 @@ -1147,30 +1259,22 @@ msgid "Save" msgstr "Gem" #: engines/dialogs.cpp:144 -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 "" -"Beklager, denne motor leverer i jeblikket ikke spil hjlp. Se venligst " -"README for grundlggende oplysninger, og for at f instruktioner om, hvordan " -"man fr yderligere hjlp." +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 "Beklager, denne motor leverer i jeblikket ikke spil hjlp. Se venligst README for grundlggende oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." #: engines/dialogs.cpp:228 #, c-format -msgid "" -"Gamestate save failed (%s)! Please consult the README for basic information, " -"and for instructions on how to obtain further assistance." -msgstr "" -"Gem af spiltilstand fejlede (%s)! Se venligst README for grundlggende " -"oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." +msgid "Gamestate save failed (%s)! Please consult the README for basic information, and for instructions on how to obtain further assistance." +msgstr "Gem af spiltilstand fejlede (%s)! Se venligst README for grundlggende oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." -#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 +#: engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 +#: engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~F~ortryd" @@ -1225,43 +1329,36 @@ msgstr "" #: engines/engine.cpp:426 #, c-format -msgid "" -"Gamestate load failed (%s)! Please consult the README for basic information, " -"and for instructions on how to obtain further assistance." -msgstr "" -"Indlsning af spiltilstand fejlede (%s)! Se venligst README for " -"grundlggende oplysninger, og for at f instruktioner om, hvordan man fr " -"yderligere hjlp." +msgid "Gamestate load failed (%s)! Please consult the README for basic information, and for instructions on how to obtain further assistance." +msgstr "Indlsning af spiltilstand fejlede (%s)! Se venligst README for grundlggende oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." #: engines/engine.cpp:439 -msgid "" -"WARNING: The game you are about to start is not yet fully supported by " -"ScummVM. As such, it is likely to be unstable, and any saves you make might " -"not work in future versions of ScummVM." -msgstr "" -"ADVARSEL: Spillet du er ved at starte endnu ikke er fuldt understttet af " -"ScummVM. Sledes, er det sandsynligt, at det er ustabilt, og alle gemmer du " -"foretager fungerer muligvis ikke i fremtidige versioner af ScummVM." +msgid "WARNING: The game you are about to start is not yet fully supported by ScummVM. As such, it is likely to be unstable, and any saves you make might not work in future versions of ScummVM." +msgstr "ADVARSEL: Spillet du er ved at starte endnu ikke er fuldt understttet af ScummVM. Sledes, er det sandsynligt, at det er ustabilt, og alle gemmer du foretager fungerer muligvis ikke i fremtidige versioner af ScummVM." #: engines/engine.cpp:442 msgid "Start anyway" msgstr "Start alligevel" -#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 +#: engines/agi/detection.cpp:145 +#: engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" msgstr "Brug original gem/indls skrme" -#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 +#: engines/agi/detection.cpp:146 +#: engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Brug de originale gem/indls skrme, istedet for dem fra ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 +#: engines/sci/engine/kfile.cpp:831 msgid "Restore game:" msgstr "Gendan spil:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 +#: engines/sci/engine/kfile.cpp:831 msgid "Restore" msgstr "Gendan" @@ -1294,12 +1391,8 @@ msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Brug IMF/Yamaha FB-01 til MIDI-udgang" #: engines/sci/detection.cpp:401 -msgid "" -"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " -"output" -msgstr "" -"Bruge et IBM Musik Feature-kort eller et Yamaha FB-01 FM synth modul til " -"MIDI-udgang" +msgid "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI output" +msgstr "Bruge et IBM Musik Feature-kort eller et Yamaha FB-01 FM synth modul til MIDI-udgang" #: engines/sci/detection.cpp:411 msgid "Use CD audio" @@ -1314,8 +1407,7 @@ msgid "Use Windows cursors" msgstr "Brug Windows markr" #: engines/sci/detection.cpp:423 -msgid "" -"Use the Windows cursors (smaller and monochrome) instead of the DOS ones" +msgid "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "Brug Windows-markrer (mindre og monokrome) i stedet for dem fra DOS" #: engines/sci/detection.cpp:433 @@ -1323,10 +1415,8 @@ msgid "Use silver cursors" msgstr "Brug slv markr" #: engines/sci/detection.cpp:434 -msgid "" -"Use the alternate set of silver cursors, instead of the normal golden ones" -msgstr "" -"Brug det alternative st af slv markrer, i stedet for de normale gyldne" +msgid "Use the alternate set of silver cursors, instead of the normal golden ones" +msgstr "Brug det alternative st af slv markrer, i stedet for de normale gyldne" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -1363,7 +1453,8 @@ msgstr "Er du sikker p msgid "Play" msgstr "Spil" -#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82 +#: engines/scumm/dialogs.cpp:191 +#: engines/scumm/help.cpp:82 #: engines/scumm/help.cpp:84 #: backends/platform/symbian/src/SymbianActions.cpp:52 #: backends/platform/wince/CEActionsPocket.cpp:44 @@ -1490,11 +1581,16 @@ msgstr "Mellemrum" msgid "Pause game" msgstr "Pause spil" -#: engines/scumm/help.cpp:79 engines/scumm/help.cpp:84 -#: engines/scumm/help.cpp:95 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:79 +#: engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:95 +#: 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 msgid "Ctrl" msgstr "Ctrl" @@ -1502,9 +1598,12 @@ msgstr "Ctrl" msgid "Load game state 1-10" msgstr "Indls spil tilstand 1-10" -#: engines/scumm/help.cpp:80 engines/scumm/help.cpp:84 -#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:100 -#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102 +#: engines/scumm/help.cpp:80 +#: engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:86 +#: engines/scumm/help.cpp:100 +#: engines/scumm/help.cpp:101 +#: engines/scumm/help.cpp:102 msgid "Alt" msgstr "Alt" @@ -1512,7 +1611,8 @@ msgstr "Alt" msgid "Save game state 1-10" msgstr "Gem spil tilstand 1-10" -#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89 +#: engines/scumm/help.cpp:86 +#: engines/scumm/help.cpp:89 msgid "Enter" msgstr "Enter" @@ -1604,24 +1704,30 @@ msgstr "Spind ordspil p msgid "Main game controls:" msgstr "Vigtigste spilstyring:" -#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136 +#: engines/scumm/help.cpp:121 +#: engines/scumm/help.cpp:136 #: engines/scumm/help.cpp:161 msgid "Push" msgstr "Skub" -#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137 +#: engines/scumm/help.cpp:122 +#: engines/scumm/help.cpp:137 #: engines/scumm/help.cpp:162 msgid "Pull" msgstr "Trk" -#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138 -#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197 +#: engines/scumm/help.cpp:123 +#: engines/scumm/help.cpp:138 +#: engines/scumm/help.cpp:163 +#: engines/scumm/help.cpp:197 #: engines/scumm/help.cpp:207 msgid "Give" msgstr "Giv" -#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139 -#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190 +#: engines/scumm/help.cpp:124 +#: engines/scumm/help.cpp:139 +#: engines/scumm/help.cpp:164 +#: engines/scumm/help.cpp:190 #: engines/scumm/help.cpp:208 msgid "Open" msgstr "bn" @@ -1634,43 +1740,54 @@ msgstr "G msgid "Get" msgstr "Tag" -#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152 -#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198 -#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224 +#: engines/scumm/help.cpp:128 +#: engines/scumm/help.cpp:152 +#: engines/scumm/help.cpp:170 +#: engines/scumm/help.cpp:198 +#: engines/scumm/help.cpp:213 +#: engines/scumm/help.cpp:224 #: engines/scumm/help.cpp:250 msgid "Use" msgstr "Brug" -#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141 +#: engines/scumm/help.cpp:129 +#: engines/scumm/help.cpp:141 msgid "Read" msgstr "Ls" -#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147 +#: engines/scumm/help.cpp:130 +#: engines/scumm/help.cpp:147 msgid "New kid" msgstr "Nyt barn" -#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153 +#: engines/scumm/help.cpp:131 +#: engines/scumm/help.cpp:153 #: engines/scumm/help.cpp:171 msgid "Turn on" msgstr "Tnd" -#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154 +#: engines/scumm/help.cpp:132 +#: engines/scumm/help.cpp:154 #: engines/scumm/help.cpp:172 msgid "Turn off" msgstr "Sluk" -#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167 +#: engines/scumm/help.cpp:142 +#: engines/scumm/help.cpp:167 #: engines/scumm/help.cpp:194 msgid "Walk to" msgstr "G til" -#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168 -#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210 +#: engines/scumm/help.cpp:143 +#: engines/scumm/help.cpp:168 +#: engines/scumm/help.cpp:195 +#: engines/scumm/help.cpp:210 #: engines/scumm/help.cpp:227 msgid "Pick up" msgstr "Tag op" -#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169 +#: engines/scumm/help.cpp:144 +#: engines/scumm/help.cpp:169 msgid "What is" msgstr "Hvad er" @@ -1694,11 +1811,13 @@ msgstr "Lav" msgid "Switch" msgstr "Skift" -#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228 +#: engines/scumm/help.cpp:166 +#: engines/scumm/help.cpp:228 msgid "Look" msgstr "Se" -#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223 +#: engines/scumm/help.cpp:173 +#: engines/scumm/help.cpp:223 msgid "Talk" msgstr "Tal" @@ -1743,20 +1862,24 @@ msgstr "spil H p msgid "play C major on distaff" msgstr "spil C-dur p rok" -#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214 +#: engines/scumm/help.cpp:192 +#: engines/scumm/help.cpp:214 msgid "puSh" msgstr "Skub" -#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215 +#: engines/scumm/help.cpp:193 +#: engines/scumm/help.cpp:215 msgid "pull (Yank)" msgstr "trk (Y)" -#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212 +#: engines/scumm/help.cpp:196 +#: engines/scumm/help.cpp:212 #: engines/scumm/help.cpp:248 msgid "Talk to" msgstr "Tal til" -#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211 +#: engines/scumm/help.cpp:199 +#: engines/scumm/help.cpp:211 msgid "Look at" msgstr "Lur p" @@ -1788,8 +1911,10 @@ msgstr "Fremh msgid "Walk" msgstr "G" -#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234 -#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249 +#: engines/scumm/help.cpp:225 +#: engines/scumm/help.cpp:234 +#: engines/scumm/help.cpp:241 +#: engines/scumm/help.cpp:249 msgid "Inventory" msgstr "Oversigt" @@ -1817,7 +1942,8 @@ msgstr "Slag" msgid "Kick" msgstr "Spark" -#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247 +#: engines/scumm/help.cpp:239 +#: engines/scumm/help.cpp:247 msgid "Examine" msgstr "Undersg" @@ -1838,31 +1964,38 @@ msgstr "Gem / Indl msgid "Other game controls:" msgstr "Andre spil kontroller" -#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267 +#: engines/scumm/help.cpp:257 +#: engines/scumm/help.cpp:267 msgid "Inventory:" msgstr "Oversigt:" -#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274 +#: engines/scumm/help.cpp:258 +#: engines/scumm/help.cpp:274 msgid "Scroll list up" msgstr "Rul liste op" -#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275 +#: engines/scumm/help.cpp:259 +#: engines/scumm/help.cpp:275 msgid "Scroll list down" msgstr "Rul liste ned" -#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268 +#: engines/scumm/help.cpp:260 +#: engines/scumm/help.cpp:268 msgid "Upper left item" msgstr "verste venstre punkt" -#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270 +#: engines/scumm/help.cpp:261 +#: engines/scumm/help.cpp:270 msgid "Lower left item" msgstr "Nederste hjre punkt" -#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271 +#: engines/scumm/help.cpp:262 +#: engines/scumm/help.cpp:271 msgid "Upper right item" msgstr "verste hjre punkt" -#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273 +#: engines/scumm/help.cpp:263 +#: engines/scumm/help.cpp:273 msgid "Lower right item" msgstr "Nederste venstre punkt" @@ -1874,7 +2007,8 @@ msgstr "Midterste h msgid "Middle right item" msgstr "Midterste hjre punkt" -#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284 +#: engines/scumm/help.cpp:279 +#: engines/scumm/help.cpp:284 msgid "Switching characters:" msgstr "Skift personer:" @@ -1890,7 +2024,8 @@ msgstr "Tredie barn" msgid "Fighting controls (numpad):" msgstr "Kamp kontroller (numtast):" -#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296 +#: engines/scumm/help.cpp:295 +#: engines/scumm/help.cpp:296 #: engines/scumm/help.cpp:297 msgid "Step back" msgstr "Skridt tilbage" @@ -1984,7 +2119,8 @@ msgstr "" "Indbygget MIDI understttelse krver Roland opgradering fra LucasArts,\n" "men %s mangler. Bruger AdLib i stedet." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 +#: engines/agos/saveload.cpp:202 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1995,7 +2131,8 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 +#: engines/agos/saveload.cpp:167 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2006,7 +2143,8 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 +#: engines/agos/saveload.cpp:210 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2018,17 +2156,12 @@ msgstr "" "%s" #: engines/scumm/scumm.cpp:2512 -msgid "" -"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " -"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " -"directory inside the Tentacle game directory." -msgstr "" -"Normalt ville Maniac Mansion begynde nu. Men ScummVM kan ikke gre det " -"endnu. For at spille det, g til 'Tilfj spil' i ScummVM start-menuen og " -"vlg 'Maniac' mappen inde i Tentacle spillets mappe." +msgid "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' directory inside the Tentacle game directory." +msgstr "Normalt ville Maniac Mansion begynde nu. Men ScummVM kan ikke gre det endnu. For at spille det, g til 'Tilfj spil' i ScummVM start-menuen og vlg 'Maniac' mappen inde i Tentacle spillets mappe." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 +#: engines/mohawk/dialogs.cpp:171 msgid "~Z~ip Mode Activated" msgstr "~Z~ip tilstand aktiveret" @@ -2058,12 +2191,14 @@ msgstr "~V~andeffekter aktiveret" msgid "Cutscene file '%s' not found!" msgstr "Filmsekvens fil '%s' ikke fundet!" -#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 +#: engines/gob/inter_playtoons.cpp:256 +#: engines/gob/inter_v2.cpp:1287 #: engines/tinsel/saveload.cpp:502 msgid "Failed to load game state from file." msgstr "Mislykkedes at indlse spil tilstand fra fil." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 +#: engines/tinsel/saveload.cpp:515 msgid "Failed to save game state to file." msgstr "Mislykkedes at gemme spil tilstand til fil." @@ -2182,7 +2317,6 @@ msgid "Choose Spell" msgstr "Vlg magi" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2190,17 +2324,19 @@ msgid "" "General MIDI ones. It is still possible that\n" "some tracks sound incorrect." msgstr "" -"Det lader til at du en General MIDI-enhed,\n" +"Det lader til at du bruger en Generel MIDI-enhed,\n" "men dit spil kun understtter Roland MT32 MIDI.\n" "Vi forsger at kortlgge Roland MT32 instrumenterne til\n" -"dem i General MIDI. Trods det kan det ske\n" -"at nogle spor ikke vil blive korrekt afspillet." +"dem i Generel MIDI. Trods det kan det ske\n" +"at nogle stykker ikke lyder korrekt." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 +#: engines/queen/queen.cpp:59 +#: engines/sky/detection.cpp:44 msgid "Floppy intro" msgstr "Diskette intro" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 +#: engines/queen/queen.cpp:60 +#: engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" msgstr "Brug diskette versionens intro (kun CD version)" @@ -2225,37 +2361,33 @@ msgstr "" msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "PSX stream filmsekvens '%s' kan ikke afspilles i palette tilstand" -#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:560 +#: engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" -msgstr "" -"DXA filmsekvenser fundet, men ScummVM er bygget uden zlib understttelse" +msgstr "DXA filmsekvenser fundet, men ScummVM er bygget uden zlib understttelse" -#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:570 +#: engines/sword2/animation.cpp:465 msgid "MPEG2 cutscenes are no longer supported" msgstr "MPEG2 filmsekvenser understttes ikke lngere" -#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:576 +#: engines/sword2/animation.cpp:473 #, c-format msgid "Cutscene '%s' not found" msgstr "Filmsekvens '%s' ikke fundet" #: engines/sword1/control.cpp:863 msgid "" -"ScummVM found that you have old savefiles for Broken Sword 1 that should be " -"converted.\n" -"The old save game format is no longer supported, so you will not be able to " -"load your games if you don't convert them.\n" +"ScummVM found that you have old savefiles for Broken Sword 1 that should be converted.\n" +"The old save 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" +"Press OK to convert them now, otherwise you will be asked again the next time you start the game.\n" msgstr "" -"ScummVM har konstateret, at du har gamle gemmer for Broken Sword 1, der skal " -"konverteres.\n" -"Det gamle gemte spil format understttes ikke lngere, s vil du ikke vre i " -"stand til at indlse dine spil, hvis du ikke konvertere dem.\n" +"ScummVM har konstateret, at du har gamle gemmer for Broken Sword 1, der skal konverteres.\n" +"Det gamle gemte spil format understttes ikke lngere, s vil du ikke vre i stand til at indlse dine spil, hvis du ikke konvertere dem.\n" "\n" -"Tryk p OK for at konvertere dem nu, ellers vil du blive spurgt igen, nste " -"gang du starter spillet.\n" +"Tryk p OK for at konvertere dem nu, ellers vil du blive spurgt igen, nste gang du starter spillet.\n" #: engines/sword1/control.cpp:1232 #, c-format @@ -2279,10 +2411,8 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "Dette er slutningen af Broken Sword 1 demoen" #: engines/sword2/animation.cpp:435 -msgid "" -"PSX cutscenes found but ScummVM has been built without RGB color support" -msgstr "" -"PSX filmsekvenser fundet, men ScummVM er bygget uden RGB farve understttelse" +msgid "PSX cutscenes found but ScummVM has been built without RGB color support" +msgstr "PSX filmsekvenser fundet, men ScummVM er bygget uden RGB farve understttelse" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" @@ -2311,17 +2441,13 @@ msgstr "Gemmer spil..." #: engines/parallaction/saveload.cpp:272 msgid "" -"ScummVM found that you have old savefiles 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" +"ScummVM found that you have old savefiles 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 "" -"ScummVM har konstateret, at du har gamle gemmer for Nippon Safes, der skal " -"omdbes.\n" -"De gamle navne er ikke lngere understttet, s du vil ikke vre i stand til " -"at indlse dine spil, hvis du ikke konvertere dem.\n" +"ScummVM har konstateret, at du har gamle gemmer for Nippon Safes, der skal omdbes.\n" +"De gamle navne er ikke lngere understttet, s du vil ikke vre i stand til at indlse dine spil, hvis du ikke konvertere dem.\n" "\n" "Tryk p OK for at konvertere dem nu, ellers vil du blive spurgt nste gang.\n" @@ -2331,13 +2457,11 @@ msgstr "ScummVM konverterede med succes alle dine gemmer." #: engines/parallaction/saveload.cpp:321 msgid "" -"ScummVM printed some warnings in your console window and can't guarantee all " -"your files have been converted.\n" +"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 "" -"ScummVM udskrev nogle advarsler i dit konsol vindue, og kan ikke garantere " -"at alle dine filer er blevet konverteret.\n" +"ScummVM udskrev nogle advarsler i dit konsol vindue, og kan ikke garantere at alle dine filer er blevet konverteret.\n" "\n" "Venligst rapportr til holdet." @@ -2351,43 +2475,30 @@ msgstr "DOSBox OPL emulator" #: audio/mididrv.cpp:209 #, c-format -msgid "" -"The selected audio device '%s' was not found (e.g. might be turned off or " -"disconnected)." -msgstr "" -"Den valgte lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller " -"afbrudt)." +msgid "The selected audio device '%s' was not found (e.g. might be turned off or disconnected)." +msgstr "Den valgte lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller afbrudt)." -#: audio/mididrv.cpp:209 audio/mididrv.cpp:221 audio/mididrv.cpp:257 +#: 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 "Forsger at falde tilbage til den nste tilgngelig enhed..." #: audio/mididrv.cpp:221 #, c-format -msgid "" -"The selected audio device '%s' cannot be used. See log file for more " -"information." -msgstr "" -"Den valgte lydenhed '%s' kan ikke bruges. Se log filen for mere information." +msgid "The selected audio device '%s' cannot be used. See log file for more information." +msgstr "Den valgte lydenhed '%s' kan ikke bruges. Se log filen for mere information." #: audio/mididrv.cpp:257 #, c-format -msgid "" -"The preferred audio device '%s' was not found (e.g. might be turned off or " -"disconnected)." -msgstr "" -"Den foretrukne lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller " -"afbrudt)." +msgid "The preferred audio device '%s' was not found (e.g. might be turned off or disconnected)." +msgstr "Den foretrukne lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller afbrudt)." #: audio/mididrv.cpp:272 #, c-format -msgid "" -"The preferred audio device '%s' cannot be used. See log file for more " -"information." -msgstr "" -"Den foretrukne lydenhed '%s' kan ikke bruges. Se log filen for mere " -"information." +msgid "The preferred audio device '%s' cannot be used. See log file for more information." +msgstr "Den foretrukne lydenhed '%s' kan ikke bruges. Se log filen for mere information." #: audio/null.h:43 msgid "No music" @@ -2740,11 +2851,13 @@ msgstr "GC Pad acceleration:" msgid "DVD" msgstr "DVD" -#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +#: backends/platform/wii/options.cpp:89 +#: backends/platform/wii/options.cpp:101 msgid "Status:" msgstr "Status:" -#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +#: backends/platform/wii/options.cpp:90 +#: backends/platform/wii/options.cpp:102 msgid "Unknown" msgstr "Ukendt" @@ -2922,8 +3035,7 @@ msgstr "Tildel h #: backends/platform/wince/wince-sdl.cpp:519 msgid "You must map a key to the 'Right Click' action to play this game" -msgstr "" -"Du skal tildele en tast til 'Hjreklik' handlingen for at spille dette spil" +msgstr "Du skal tildele en tast til 'Hjreklik' handlingen for at spille dette spil" #: backends/platform/wince/wince-sdl.cpp:528 msgid "Map hide toolbar action" @@ -2931,9 +3043,7 @@ msgstr "Tildel \"skjul v #: backends/platform/wince/wince-sdl.cpp:532 msgid "You must map a key to the 'Hide toolbar' action to play this game" -msgstr "" -"Du skal tildele en tast til 'Skjul vrktjslinje' handlingen for at spille " -"dette spil" +msgstr "Du skal tildele en tast til 'Skjul vrktjslinje' handlingen for at spille dette spil" #: backends/platform/wince/wince-sdl.cpp:541 msgid "Map Zoom Up action (optional)" @@ -2944,11 +3054,8 @@ msgid "Map Zoom Down action (optional)" msgstr "Tildel Forstr handling (valgfri)" #: backends/platform/wince/wince-sdl.cpp:552 -msgid "" -"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" -msgstr "" -"Glem ikke at tildele en tast til 'Skjul vrktjslinje' handling for at se " -"hele oversigten" +msgid "Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" +msgstr "Glem ikke at tildele en tast til 'Skjul vrktjslinje' handling for at se hele oversigten" #: backends/events/default/default-events.cpp:191 msgid "Do you really want to return to the Launcher?" @@ -3037,20 +3144,20 @@ msgstr "Klik deaktiveret" #~ msgid "Hercules Amber" #~ msgstr "Hercules brun" - #~ msgctxt "lowres" + #~ msgid "Hercules Green" #~ msgstr "Hercules grn" - #~ msgctxt "lowres" + #~ msgid "Hercules Amber" #~ msgstr "Hercules brun" #, fuzzy #~ msgid "Save game failed!" #~ msgstr "Gemmer:" - #~ msgctxt "lowres" + #~ msgid "Add Game..." #~ msgstr "Tilfj spil..." -- cgit v1.2.3 From 3de8c4b07d6f15fe6e9ca4bcb8da92532ebf5692 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Tue, 10 Jul 2012 22:15:31 -0500 Subject: NEWS: Mention Maemo port changes --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 40d98f294f..43e755f4ac 100644 --- a/NEWS +++ b/NEWS @@ -62,6 +62,10 @@ For a more comprehensive changelog of the latest experimental code, see: - Added aspect ratio correction feature. - Implemented 16 bits per pixel support for games. + Maemo port: + - Added support for Nokia 770 running OS2008 HE. + - Added configurable keymap. + Windows port: - Changed default savegames location for Windows NT4/2000/XP/Vista/7. (The migration batch file can be used to copy savegames from the old -- cgit v1.2.3 From 14832eae7f8787da83cd39214aa386e8136fdf1a Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Tue, 10 Jul 2012 22:58:41 -0500 Subject: MAEMO: Update debian/changelog --- backends/platform/maemo/debian/changelog | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/backends/platform/maemo/debian/changelog b/backends/platform/maemo/debian/changelog index 8a9d8ee3c3..f3e4c4eadb 100644 --- a/backends/platform/maemo/debian/changelog +++ b/backends/platform/maemo/debian/changelog @@ -1,8 +1,20 @@ -scummvm (1.5.0~git) unstable; urgency=low +scummvm (1.6.0~git) unstable; urgency=low * Development snapshot - -- Tarek Soliman Tue, 15 Nov 2011 14:56:57 -0600 + -- Tarek Soliman Tue, 10 Jul 2012 23:02:00 -0500 + +scummvm (1.5.0) unstable; urgency=low + + * 1.5.0 release + + -- Tarek Soliman Tue, 10 Jul 2012 22:57:32 -0500 + +scummvm (1.4.1) unstable; urgency=low + + * 1.4.1 release + + -- Tarek Soliman Wed, 11 Jan 2012 17:17:26 -0600 scummvm (1.4.0) unstable; urgency=low -- cgit v1.2.3 From 108e709b9bf78df2672f8a8bf0547a0966bfc246 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 11 Jul 2012 21:20:52 +1000 Subject: TSAGE: Fix for bug #3541354 - Nico shooting player after being tied up --- engines/tsage/blue_force/blueforce_scenes9.cpp | 73 +++++++++++++------------- engines/tsage/globals.cpp | 4 +- engines/tsage/globals.h | 2 +- 3 files changed, 40 insertions(+), 39 deletions(-) diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp index 2178f31b30..1cb8191640 100644 --- a/engines/tsage/blue_force/blueforce_scenes9.cpp +++ b/engines/tsage/blue_force/blueforce_scenes9.cpp @@ -794,12 +794,12 @@ bool Scene910::Lyle::startAction(CursorType action, Event &event) { Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; if (action == CURSOR_USE) { - if (BF_GLOBALS._v4CEE2 == 0) + if (BF_GLOBALS._nico910State == 0) return NamedObject::startAction(action, event); else return false; } else if (action == CURSOR_TALK) { - if ((BF_GLOBALS._hiddenDoorStatus != 0) || (BF_GLOBALS._v4CEE2 != 0)) { + if ((BF_GLOBALS._hiddenDoorStatus != 0) || (BF_GLOBALS._nico910State != 0)) { scene->_stripManager.start(9100 + _field90, &BF_GLOBALS._stripProxy); if (_field90 < 1) _field90++; @@ -833,7 +833,7 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) { return true; break; case CURSOR_TALK: - if (BF_GLOBALS._v4CEE2 >= 4) + if (BF_GLOBALS._nico910State >= 4) return NamedObject::startAction(action, event); if (BF_GLOBALS._v4CEE6 < 4) @@ -847,8 +847,8 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) { return true; break; case INV_COLT45: - if (BF_GLOBALS._v4CEE2 > 1) { - if (BF_GLOBALS._v4CEE2 != 4) { + if (BF_GLOBALS._nico910State > 1) { + if (BF_GLOBALS._nico910State != 4) { if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(fGunLoaded)) && (BF_GLOBALS.getHasBullets())) { if (scene->_field2DE0 == 0) { BF_GLOBALS._player.disableControl(); @@ -880,7 +880,7 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) { break; case INV_BADGE: case INV_ID: - if (BF_GLOBALS._v4CEE2 >= 4) + if (BF_GLOBALS._nico910State >= 4) return NamedObject::startAction(action, event); if (BF_GLOBALS._v4CEE6 < 4) @@ -895,11 +895,12 @@ bool Scene910::Nico::startAction(CursorType action, Event &event) { return true; break; case INV_YELLOW_CORD: - if (BF_GLOBALS._v4CEE2 < 4) { + if (BF_GLOBALS._nico910State < 4) { BF_GLOBALS._player.disableControl(); scene->_yellowCord.fixPriority(121); scene->_sceneSubMode = 10; scene->_sceneMode = 9123; + BF_GLOBALS._nico910State = 3; if (BF_GLOBALS._player._visage == 1911) scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); else @@ -995,7 +996,7 @@ bool Scene910::Stuart::startAction(CursorType action, Event &event) { return true; } else { BF_GLOBALS._player.disableControl(); - if (BF_GLOBALS._v4CEE2 == 4) { + if (BF_GLOBALS._nico910State == 4) { scene->_sceneSubMode = 11; scene->_sceneMode = 9123; if (BF_GLOBALS._player._visage == 1911) @@ -1136,7 +1137,7 @@ bool Scene910::BreakerBox::startAction(CursorType action, Event &event) { SceneItem::display2(910, 62); return true; } else if (scene->_sceneMode != 9120) { - if (BF_GLOBALS._v4CEE2 == 1) { + if (BF_GLOBALS._nico910State == 1) { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 9118; scene->setAction(&scene->_sequenceManager1, scene, 9118, &BF_GLOBALS._player, &scene->_nico, NULL); @@ -1291,7 +1292,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) { switch (_state) { case 1: - if (BF_GLOBALS._v4CEE2 < 1) { + if (BF_GLOBALS._nico910State < 1) { if (_frame == 2) { if (!BF_GLOBALS.getFlag(fGotPointsForClosingDoor)) { T2_GLOBALS._uiElements.addScore(30); @@ -1299,7 +1300,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) { } scene->_sceneMode = 0; if (BF_GLOBALS._dayNumber == 5) { - if (BF_GLOBALS._v4CEE2 == 0) { + if (BF_GLOBALS._nico910State == 0) { scene->_breakerBoxInset.remove(); // _objectList.draw(); BF_GLOBALS._player.disableControl(); @@ -1309,7 +1310,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) { scene->_nico.postInit(); scene->_sceneMode = 9129; scene->setAction(&scene->_sequenceManager1, scene, 9129, &BF_GLOBALS._player, &scene->_nico, NULL); - } else if (BF_GLOBALS._v4CEE2 == 2) { + } else if (BF_GLOBALS._nico910State == 2) { scene->_breakerBoxInset.remove(); // _objectList.draw(); BF_GLOBALS._player.disableControl(); @@ -1612,7 +1613,7 @@ bool Scene910::BlackPlug::startAction(CursorType action, Event &event) { SET_EXT_FGCOLOR, 13, LIST_END); return true; } - if (BF_GLOBALS._v4CEE2 == 3) { + if (BF_GLOBALS._nico910State == 3) { SceneItem::display(910, 84, SET_WIDTH, 312, SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, @@ -1830,7 +1831,7 @@ bool Scene910::Generator::startAction(CursorType action, Event &event) { SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, SET_EXT_FGCOLOR, 13, LIST_END); - else if (BF_GLOBALS._v4CEE2 == 1) { + else if (BF_GLOBALS._nico910State == 1) { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 9118; scene->setAction(&scene->_sequenceManager1, scene, 9118, &BF_GLOBALS._player, &scene->_nico, NULL); @@ -1869,7 +1870,7 @@ bool Scene910::Item2::startAction(CursorType action, Event &event) { bool Scene910::Item3::startAction(CursorType action, Event &event) { Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; - if ((action == CURSOR_TALK) && (BF_GLOBALS._v4CEE2 == 4) && (BF_GLOBALS._v4CEE4 == 0)) { + if ((action == CURSOR_TALK) && (BF_GLOBALS._nico910State == 4) && (BF_GLOBALS._v4CEE4 == 0)) { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 15; scene->_stripManager.start(9102, scene); @@ -1907,7 +1908,7 @@ bool Scene910::Item15::startAction(CursorType action, Event &event) { bool Scene910::Item16::startAction(CursorType action, Event &event) { Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; - if ((BF_GLOBALS._hiddenDoorStatus == 0) || (BF_GLOBALS._v4CEE2 != 0)) + if ((BF_GLOBALS._hiddenDoorStatus == 0) || (BF_GLOBALS._nico910State != 0)) return false; if (BF_GLOBALS._player._visage == 1911) { @@ -2016,7 +2017,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) { if (BF_GLOBALS._dayNumber < 5) _item17.setDetails(Rect(0, 149, 29, 167), 910, -1, -1, -1, 1, NULL); - if (BF_GLOBALS._v4CEE2 == 0) + if (BF_GLOBALS._nico910State == 0) _item16.setDetails(Rect(265, 18, 319, 102), 910, -1, -1, -1, 1, NULL); _breakerBox.setDetails(910, 6, -1, -1, 1, (SceneItem *)NULL); @@ -2048,7 +2049,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) { || (BF_GLOBALS._sceneManager._previousScene == 190) || (BF_GLOBALS._sceneManager._previousScene == 300)) { BF_GLOBALS._sceneManager._previousScene = 900; - BF_GLOBALS._v4CEE2 = 0; + BF_GLOBALS._nico910State = 0; BF_GLOBALS._v4CEE4 = 0; } @@ -2142,7 +2143,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) { _nico.setPosition(Common::Point(262, 124)); _nico.setStrip(6); BF_GLOBALS._v4CEE6 = 0; - BF_GLOBALS._v4CEE2 = 1; + BF_GLOBALS._nico910State = 1; _nico.setDetails(910, 63, 64, 67, 5, &_item4); BF_GLOBALS._v4CECA = 2; if (BF_GLOBALS._v4CECC == 0) @@ -2157,7 +2158,7 @@ void Scene910::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.disableControl(); } - if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)){ + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._nico910State == 0)){ _shadow.postInit(); _shadow.setAction(&_action2); } @@ -2297,7 +2298,7 @@ void Scene910::signal() { case 13: BF_GLOBALS._player.disableControl(); BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 9117, &_nico, NULL); - BF_GLOBALS._v4CEE2 = 2; + BF_GLOBALS._nico910State = 2; // No break on purpose case 15: _stuart.postInit(); @@ -2314,7 +2315,7 @@ void Scene910::signal() { _lyle._field90 = 1; _sceneMode = 10; addFader((const byte *)&black, 2, this); - BF_GLOBALS._v4CEE2 = 1; + BF_GLOBALS._nico910State = 1; BF_GLOBALS._walkRegions.disableRegion(16); BF_GLOBALS._walkRegions.disableRegion(14); BF_GLOBALS._sceneItems.remove(&_item16); @@ -2324,7 +2325,7 @@ void Scene910::signal() { BF_GLOBALS._player._frame = 1; if (_field2DE2 == 0) { _field2DE2 = 1; - if (BF_GLOBALS._v4CEE2 == 4) { + if (BF_GLOBALS._nico910State == 4) { _sceneMode = 9149; setAction(&_sequenceManager1, this, 9149, &BF_GLOBALS._player, NULL); } else { @@ -2452,7 +2453,7 @@ void Scene910::signal() { break; case 9114: _fakeWall.hide(); - if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)) { + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._nico910State == 0)) { BF_GLOBALS._player.disableControl(); _nico.postInit(); _nico.setDetails(910, 63, 64, 65, 5, &_item4); @@ -2496,7 +2497,7 @@ void Scene910::signal() { case 9121: _item3.setDetails(7, 910, 96, 60, 61, 3); BF_GLOBALS._v4CEE4 = 2; - if (BF_GLOBALS._v4CEE2 == 4) { + if (BF_GLOBALS._nico910State == 4) { _sceneMode = 20; _stripManager.start(9115, this); } else { @@ -2527,7 +2528,7 @@ void Scene910::signal() { setAction(&_sequenceManager1, this, 9111, &BF_GLOBALS._player, &_blackCord, NULL); break; case 5: - switch (BF_GLOBALS._v4CEE2 - 1) { + switch (BF_GLOBALS._nico910State - 1) { case 0: _sceneMode = 9118; setAction(&_sequenceManager1, this, 9118, &BF_GLOBALS._player, &_nico, NULL); @@ -2598,7 +2599,7 @@ void Scene910::signal() { break; case 9125: BF_GLOBALS.setFlag(fBackupAt340); - BF_GLOBALS._v4CEE2 = 4; + BF_GLOBALS._nico910State = 4; _stuart.postInit(); _nico.setDetails(910, 72, 73, 74, 3, (SceneItem *)NULL); _stuart.setDetails(910, 66, 67, 68, 5, &_nico); @@ -2645,7 +2646,7 @@ void Scene910::signal() { } _lyle.setAction(&_sequenceManager2, NULL, 9131, &_lyle, NULL); BF_GLOBALS._walkRegions.enableRegion(16); - if (BF_GLOBALS._v4CEE2 == 4) + if (BF_GLOBALS._nico910State == 4) BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 0); else BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910); @@ -2679,7 +2680,7 @@ void Scene910::signal() { } break; case 9143: - if (BF_GLOBALS._v4CEE2 == 0) { + if (BF_GLOBALS._nico910State == 0) { BF_GLOBALS._v51C44 = 1; BF_GLOBALS._sceneManager.changeScene(920); } else { @@ -2730,7 +2731,7 @@ void Scene910::process(Event &event) { if (_item17._bounds.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); BF_GLOBALS._events.setCursor(surface); - } else if ((BF_GLOBALS._hiddenDoorStatus == 0) || (BF_GLOBALS._v4CEE2 != 0)) { + } else if ((BF_GLOBALS._hiddenDoorStatus == 0) || (BF_GLOBALS._nico910State != 0)) { CursorType cursorId = BF_GLOBALS._events.getCursor(); BF_GLOBALS._events.setCursor(cursorId); } else if (!_item16._bounds.contains(event.mousePos)) { @@ -2755,7 +2756,7 @@ void Scene910::process(Event &event) { _sceneMode = 9123; setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); event.handled = true; - } else if (BF_GLOBALS._v4CEE2 <= 1) { + } else if (BF_GLOBALS._nico910State <= 1) { if (BF_GLOBALS.getFlag(fCanDrawGun)) { BF_GLOBALS._player.addMover(NULL); BF_GLOBALS._player.disableControl(); @@ -2776,7 +2777,7 @@ void Scene910::process(Event &event) { event.handled = true; break; case CURSOR_WALK: - if (BF_GLOBALS._v4CEE2 == 1) { + if (BF_GLOBALS._nico910State == 1) { BF_GLOBALS._player.disableControl(); if (BF_GLOBALS._player._visage == 1911) { BF_GLOBALS._player.disableControl(); @@ -2826,7 +2827,7 @@ void Scene910::dispatch() { _sceneSubMode = 3; _sceneMode = 9123; setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); - } else if (BF_GLOBALS._v4CEE2 == 0) { + } else if (BF_GLOBALS._nico910State == 0) { _sceneMode = 9143; setAction(&_sequenceManager1, this, 9143, &BF_GLOBALS._player, NULL); } else { @@ -2840,7 +2841,7 @@ void Scene910::dispatch() { } } - if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._player._position.x > 250) && (_sceneMode != 9135) && (_sceneMode != 11) && (BF_GLOBALS._hiddenDoorStatus != 0) && (BF_GLOBALS._v4CEE2 == 0)) { + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._player._position.x > 250) && (_sceneMode != 9135) && (_sceneMode != 11) && (BF_GLOBALS._hiddenDoorStatus != 0) && (BF_GLOBALS._nico910State == 0)) { BF_GLOBALS._player.disableControl(); _shadow.remove(); _nico.remove(); @@ -2853,7 +2854,7 @@ void Scene910::dispatch() { } void Scene910::checkGun() { - if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0) && (BF_GLOBALS._hiddenDoorStatus != 0)) + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._nico910State == 0) && (BF_GLOBALS._hiddenDoorStatus != 0)) SceneItem::display(910, 70, SET_WIDTH, 312, SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, @@ -2900,7 +2901,7 @@ void Scene910::closeHiddenDoor() { setAction(&_sequenceManager1, this, 9115, &_fakeWall, &_object5, NULL); } - if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)) { + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._nico910State == 0)) { // _objectList.draw(); if (BF_GLOBALS._sceneObjects->contains(&_breakerBoxInset)) _breakerBoxInset.remove(); diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index 59eb59b194..de9463268b 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -247,7 +247,7 @@ void BlueForceGlobals::synchronize(Serializer &s) { for (int i = 0; i < 18; i++) s.syncAsByte(_breakerBoxStatusArr[i]); s.syncAsSint16LE(_hiddenDoorStatus); - s.syncAsSint16LE(_v4CEE2); + s.syncAsSint16LE(_nico910State); s.syncAsSint16LE(_v4CEE4); s.syncAsSint16LE(_v4CEE6); s.syncAsSint16LE(_v4CEE8); @@ -320,7 +320,7 @@ void BlueForceGlobals::reset() { _breakerBoxStatusArr[16] = 3; _breakerBoxStatusArr[17] = 0; _hiddenDoorStatus = 0; - _v4CEE2 = 0; + _nico910State = 0; _v4CEE4 = 0; _v4CEE6 = 0; _v4CEE8 = 0; diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index 45226c921b..d190b6a2a4 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -200,7 +200,7 @@ public: int _v4CECC; int8 _breakerBoxStatusArr[18]; int _hiddenDoorStatus; - int _v4CEE2; + int _nico910State; int _v4CEE4; int _v4CEE6; int _v4CEE8; -- cgit v1.2.3 From ee818634abbf7c63c8b494f3b57f67b42cd3648a Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 11 Jul 2012 21:41:20 +1000 Subject: TINSEL: Added MD5 detection entries for Discworld 1 Polish translation --- engines/tinsel/detection_tables.h | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index b6b19f6ee7..ef562a5e08 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -218,6 +218,41 @@ static const TinselGameDescription gameDescriptions[] = { TINSEL_V1, }, + { // Polish fan translation CD V1 version, with *.gra files (same as the floppy one, with english.smp) + { + "dw", + "CD", + { + {"dw.gra", 0, "ef05bbd2a754bd11a2e87bcd84ab5ccf", 781864}, + {"english.smp", 0, NULL, -1}, + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // Polish fan translaction floppy V1 version, with *.gra files + { + "dw", + "Floppy", + AD_ENTRY1s("dw.gra", "ef05bbd2a754bd11a2e87bcd84ab5ccf", 781864), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + GID_DW1, + 0, + GF_FLOPPY | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + { // Italian CD with english speech and *.gra files. // Note: It contains only italian subtitles, but inside english.txt { @@ -520,6 +555,27 @@ static const TinselGameDescription gameDescriptions[] = { TINSEL_V2, }, + { // Polish fan translaction Discworld 1 + { + "dw", + "CD", + { + {"dw.scn", 0, "fa169d2c98660215ebd84b49c1899eef", 776396}, + {"english.txt", 0, "c1a53eb7ec812689dab70e2bb22cf2ab", 224151}, + {"english.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::PL_POL, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + { // European/Australian Discworld 2 release { "dw2", -- cgit v1.2.3 From e8d115247f5c9dabc0736fc0097a39be6f4cdb85 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Fri, 13 Jul 2012 21:39:26 +0100 Subject: I18N: Update Czech translation and README from patch #3541613 --- doc/cz/PrectiMe | 53 +++++++++++++++++++++++++++++++++++++++++++++++------ po/cs_CZ.po | 25 ++++++++++++------------- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/doc/cz/PrectiMe b/doc/cz/PrectiMe index 4cb362ab3c..153ef09dcd 100644 --- a/doc/cz/PrectiMe +++ b/doc/cz/PrectiMe @@ -53,7 +53,9 @@ Obsah: * 7.7 Podpora MIDI serveru TiMidity++ * 7.8 Použití komprimovaných zvukových souborů (MP3, Ogg Vorbis, Flac) * 7.9 Výstupní vzorkovací kmitočet -8.0) Soubor s nastavením +8.0) Soubor s nastavením + * 8.1 Rozpoznávaná klíčová slova nastavení + * 8.2 Vlastní herní volby, které mohou být přepínány pomoci grafického rozhraní 9.0) Sestavení @@ -179,13 +181,18 @@ Hry AGOS od Adventuresoft/Horrorsoft: The Feeble Files [feeble] Hry GOB od Coktel Vision: + Bambou le sauveur de la jungle [bambou] Bargon Attack [bargon] + Fascination [fascination] + Geisha [geisha] Gobliiins [gob1] Gobliins 2 [gob2] Goblins 3 [gob3] Lost in Time [lostintime] + Once Upon A Time: Little Red Riding Hood [littlered] The Bizarre Adventures of Woodruff and the Schnibble [woodruff] + Urban Runner [urban] Ween: The Prophecy [ween] Hry MADE od Activision: @@ -216,6 +223,7 @@ Další hry: Hry SCUMM od Humongous Entertainment: Backyard Baseball [baseball] Backyard Baseball 2001 [baseball2001] + Backyard Baseball 2003 [baseball2003] Backyard Football [football] Big Thinkers First Grade [thinker1] Big Thinkers Kindergarten [thinkerk] @@ -284,7 +292,6 @@ Hry Living Books: Následující hry by měly jít spustit, ale zatím nejsou úplně hratelné. Hrajte je pouze na vlastní riziko a prosíme, abyste pro tyto hry nenahlašovali chyby. Pokud chcete mít nejnovější zprávy o kompatibilitách her, navštivte naší stránku a prohlédněte si tabulku kompatibilit. - Backyard Baseball 2003 [baseball2003] Backyard Football 2002 [football2002] Backyard Soccer [soccer] Backyard Soccer MLS [soccermls] @@ -1478,6 +1485,8 @@ Vzorový soubor s nastavením vypadá takto: path=C:\amiga_mi2\ music_driver=windows +8.1) Rozpoznávaná klíčová slova nastavení +---- ------------------------------------ Jsou rozpoznávána následující klíčová slova: path řetězec Cesta, kde jsou umístěny datové soubory hry @@ -1494,7 +1503,6 @@ Jsou rozpoznávána následující klíčová slova: talkspeed číslo Zpoždění textu v hrách SCUMM, nebo rychlost textu v jiných hrách. fullscreen boolean Režim celé obrazovky aspect_ratio boolean Povolit korekci poměru stran - disable_dithering boolean Odstranit artefakty chvění v některých hrách EGA gfx_mode řetězec Grafický režim (normální, 2x, 3x, 2xsai, super2xsai, supereagle, advmame2x, advmame3x,hq2x, hq3x, tv2x, dotmatrix) confirm_exit boolean Zeptat se uživatele na potvrzení před ukončením (pouze jádro SDL). console boolean Povolit okno konzole (výchozí: zapnuto) (pouze Windows). @@ -1518,6 +1526,16 @@ Jsou rozpoznávána následující klíčová slova: alt_intro boolean Použít alternativní úvod pro CD verze Beneath a Steel Sky a Flight of the Amazon Queen boot_param číslo Předá toto číslo zaváděcímu skriptu +Hry Sierra používající jádro AGI přidávají následující nestandardní klíčové slovo: + +originalsaveload boolean Pokud true, jsou použity původní obrazovky nahrávání/uložení místo vylepšených ze ScummVM + +Hry Sierra používající jádro SCI přidávají následující nestandardní klíčová slova: + + disable_dithering boolean Odstranit artefakty chvění v některých hrách EGA + prefer_digitalsfx boolean Pokud true, jsou upřednostňovány digitální zvukové efekty před syntetizovanými + originalsaveload boolean Pokud true, jsou použity původní obrazovky nahrávání/uložení místo vylepšených ze ScummVM + native_fb01 bool Pokud true, je ovladač hudby pro kartu IBM Music Feature nebo modul syntetizátoru Yahama FB-01 FM použit jako výstup MIDI Broken Sword II přidává následující nestandardní klíčová slova: gfx_details číslo Nastavení grafických detailů (0-3) @@ -1526,16 +1544,25 @@ Broken Sword II přidává následující nestandardní klíčová slova: reverse_stereo boolean Pokud true, kanály stereo jsou obráceny sfx_mute boolean Pokud true, zvukové efekty jsou ztlumeny -Flight of the Amazon Queen přidává následující nestandardní klíčová slova +Flight of the Amazon Queen přidává následující nestandardní klíčová slova: music_mute boolean Pokud true, hudba je ztlumena sfx_mute boolean Pokud true, zvukové efekty jsou ztlumeny -King's Quest VI Windows přidává následující nestandardní klíčová slova: +Jones in the Fast Lane přidává následující nestandardní klíčové slovo: + + music_mute boolean Pokud true, je použito CD audio místo zvuků ve hře + +King's Quest VI Windows přidává následující nestandardní klíčové slovo: windows_cursors boolean Pokud true, jsou použity původní černobílé kurzory místo kurzorů z DOS. Pokud false, jsou ve verzi Windows použity kurzory DOS, zvětšené, aby se shodovaly se zbytkem zvětšené grafiky -Space Qust IV CD přidává následující nestandardní klíčové slovo: +Lands of Lore: The Throne of Chaos přidává následující nestandardní klíčová slova: + + smooth_scrolling boolean Pokud true, je posunování při změně z jedné obrazovky na druhou plynulejší + floating_cursors boolean Pokud true, je kurzor změněn na směrovou šipku při najetí na okraj obrazovky. Hráč pak může kliknout pro pohyb v tomto směru. + +Space Quest IV CD přidává následující nestandardní klíčové slovo: silver_cursors boolean Pokud true, je místo původních zlatých kurzorů použita alternativní sada stříbrných @@ -1548,10 +1575,23 @@ The Legend of Kyrandia přidává následující nestandardní klíčové slovo: walkspeed celé číslo Rychlost chůze (0-4) +The Legend of Kyrandia: Malcolm's Revenge přidává následující nestandardní klíčová slova: + + studio_audience boolean Pokud true, je slyšet potlesk a smích kdykoliv Malcolm provede něco vtipného + skip_support boolean Pokud true, hráč může přeskakovat text a scény hry + helium_mode boolean Pokud true, lidé znějí tak, jakoby se nadýchali hélia + The 7th Guest přidává následující nestandardní klíčové slovo: t7g_speed řetězec Rychlost přehrávání videa (normal - normální, tweaked - upravená, im_an_ios - jsem na ios) +8.2) Vlastní herní volby, které mohou být přepínány pomoci grafického +---- ---------------------------------------------------------------- +rozhraní +-------- +Mnoho vlastních herních voleb v předchozí části může být přepnuto přes grafické rozhraní. Pokud je takováto volba pro určitou hru dostupná, objeví se karta "Jádro" při přidávání nebo úpravě nastavení této hry. +Pokud vlastní možnosti nejsou zobrazeny, musí být konkrétní hry spuštěny jednou nebo znovu přidány do seznamu her spouštěče ScummVM. Toto aktualizuje nastavení každé položky, čímž umožní zobrazení vlastních voleb. + 9.0) Sestavení: ---- ---------- Pro aktuální přehled o tom, jak ScummVM sestavit pro různé platformy, prohlédněte si, prosím, naší Wiki, zvláště tuto stránku: @@ -1624,3 +1664,4 @@ http://www.scummvm.org/ ------------------------------------------------------------------------ + diff --git a/po/cs_CZ.po b/po/cs_CZ.po index 6bf4e77206..a2d640651c 100644 --- a/po/cs_CZ.po +++ b/po/cs_CZ.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.4.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-05-22 21:02+0100\n" +"PO-Revision-Date: 2012-07-08 18:03+0100\n" "Last-Translator: Zbynk Schwarz \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -27,7 +27,7 @@ msgstr "(sestaveno %s)" #: gui/about.cpp:98 msgid "Features compiled in:" -msgstr "Zakompilovan Funkce:" +msgstr "Zakompilovan funkce:" #: gui/about.cpp:107 msgid "Available engines:" @@ -309,7 +309,7 @@ msgstr "Cesta pro ulo #: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 #: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 msgid "Specifies where your savegames are put" -msgstr "Stanovuje, kam jsou umstny Vae uloen hry" +msgstr "Stanovuje, kam jsou umstny vae uloen hry" #: gui/launcher.cpp:335 gui/options.cpp:1125 msgctxt "lowres" @@ -726,7 +726,7 @@ msgid "" "connected to your computer" msgstr "" "Zakrtnte, pokud chcete pout prav hardwarov zazen kompatibiln s " -"Roland, pipojen k Vaemu potai" +"Roland, pipojen k vaemu potai" #: gui/options.cpp:877 msgctxt "lowres" @@ -2180,7 +2180,6 @@ msgid "Choose Spell" msgstr "Zvolit Kouzlo" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2189,10 +2188,10 @@ msgid "" "some tracks sound incorrect." msgstr "" "Zd se, e pouvte zazen General MIDI,\n" -"ale Vae hra podporuje pouze Roland MT32 MIDI.\n" +"ale vae hra podporuje pouze Roland MT32 MIDI.\n" "Sname se mapovat nstroje Roland MT32 na\n" -"ty od General MIDI. Po tomto se me stt,\n" -"e pr stop nebude sprvn pehrno." +"ty od General MIDI. Je stle mon, e\n" +"nkter stopy nebudou znt sprvn." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" @@ -2249,7 +2248,7 @@ msgstr "" "ScummVM zjistil, e mte star uloen pozice pro Broken Sword 1, kter by " "mly bt pevedeny.\n" "Star formt uloench her ji nen podporovn, take pokud je nepevedete, " -"nebudete moci Vae hry nast.\n" +"nebudete moci vae hry nast.\n" "\n" "Stisknte OK, abyste je pevedli te, jinak budete podni znovu, pi " "sputn tto hry.\n" @@ -2317,13 +2316,13 @@ msgstr "" "ScummVM zjistil, e mte star uloen pozice pro Nippon Safes, kter by " "mly bt pejmenovny.\n" "Star nzvy ji nejsou podporovny, take pokud je nepevedete, nebudete " -"moci Vae hry nast.\n" +"moci vae hry nast.\n" "\n" "Stisknte OK, abyste je pevedli te, jinak budete podni pt.\n" #: engines/parallaction/saveload.cpp:319 msgid "ScummVM successfully converted all your savefiles." -msgstr "ScummVM spn pevedl vechny Vae uloen pozice. " +msgstr "ScummVM spn pevedl vechny vae uloen pozice. " #: engines/parallaction/saveload.cpp:321 msgid "" @@ -2332,8 +2331,8 @@ msgid "" "\n" "Please report to the team." msgstr "" -"ScummVM vytiskl nkter varovn ve Vaem okn konzole a neme zaruit, e " -"vechny Vae soubory byly pevedeny.\n" +"ScummVM vytiskl nkter varovn ve vaem okn konzole a neme zaruit, e " +"vechny vae soubory byly pevedeny.\n" "\n" "Prosm nahlaste to tmu" -- cgit v1.2.3 From 9fa92e95e7367d2e99be387f471ed213689292df Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Fri, 13 Jul 2012 21:39:54 +0100 Subject: I18N: Update French translation --- po/fr_FR.po | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/po/fr_FR.po b/po/fr_FR.po index e153beb3a5..4631d4c91a 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -2200,7 +2200,6 @@ msgid "Choose Spell" msgstr "Choisir un Sort" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2209,10 +2208,10 @@ msgid "" "some tracks sound incorrect." msgstr "" "Il semble que vous utilisiez un priphrique General MIDI,\n" -"mais ce jeu ne support que le MIDI Roland MT32.\n" -"Nous essayons d'associer les instruments Roland MT32 auxinstruments General " -"MIDI. Mais il est possible que quelquespistes ne soient pas joues " -"correctement." +"mais ce jeu ne support que le MIDI Roland MT32. Nous essayons\n" +"d'associer les instruments Roland MT32 aux instruments General\n" +"MIDI. Cependant il est possible que quelques pistes ne soient\n " +"pas joues correctement." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 msgid "Floppy intro" -- cgit v1.2.3 From 856f9326179e186f08abc0163039f51ad31e9afb Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Fri, 13 Jul 2012 21:47:17 +0100 Subject: I18N: Regenerate translations data file --- gui/themes/translations.dat | Bin 341409 -> 342141 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 9735e99fca..0e32008bd9 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From e10b59b62492c67fc7eeb6eccd39f0b75722338d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 14 Jul 2012 05:04:00 +0300 Subject: TINSEL: Cleanup --- engines/tinsel/handle.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/engines/tinsel/handle.cpp b/engines/tinsel/handle.cpp index c3089db990..14d588dcec 100644 --- a/engines/tinsel/handle.cpp +++ b/engines/tinsel/handle.cpp @@ -99,14 +99,16 @@ void SetupHandleTable() { MEMHANDLE *pH; TinselFile f; - if (f.open(TinselV1PSX? PSX_INDEX_FILENAME : INDEX_FILENAME)) { + const char *indexFileName = TinselV1PSX ? PSX_INDEX_FILENAME : INDEX_FILENAME; + + if (f.open(indexFileName)) { // get size of index file len = f.size(); if (len > 0) { if ((len % RECORD_SIZE) != 0) { // index file is corrupt - error(FILE_IS_CORRUPT, TinselV1PSX? PSX_INDEX_FILENAME : INDEX_FILENAME); + error(FILE_IS_CORRUPT, indexFileName); } // calc number of handles @@ -132,16 +134,16 @@ void SetupHandleTable() { if (f.eos() || f.err()) { // index file is corrupt - error(FILE_IS_CORRUPT, (TinselV1PSX? PSX_INDEX_FILENAME : INDEX_FILENAME)); + error(FILE_IS_CORRUPT, indexFileName); } // close the file f.close(); } else { // index file is corrupt - error(FILE_IS_CORRUPT, (TinselV1PSX? PSX_INDEX_FILENAME : INDEX_FILENAME)); + error(FILE_IS_CORRUPT, indexFileName); } } else { // cannot find the index file - error(CANNOT_FIND_FILE, (TinselV1PSX? PSX_INDEX_FILENAME : INDEX_FILENAME)); + error(CANNOT_FIND_FILE, indexFileName); } // allocate memory nodes and load all permanent graphics -- cgit v1.2.3 From 0c84dc1ec94771e5bb4ea68049b0cd94d86fb789 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Tue, 10 Jul 2012 23:39:54 -0400 Subject: CREATE_PROJECT: Add Visual Studio 2012 project --- devtools/create_project/msvc11/create_project.sln | 20 ++++ .../create_project/msvc11/create_project.vcxproj | 129 +++++++++++++++++++++ .../msvc11/create_project.vcxproj.filters | 71 ++++++++++++ 3 files changed, 220 insertions(+) create mode 100644 devtools/create_project/msvc11/create_project.sln create mode 100644 devtools/create_project/msvc11/create_project.vcxproj create mode 100644 devtools/create_project/msvc11/create_project.vcxproj.filters diff --git a/devtools/create_project/msvc11/create_project.sln b/devtools/create_project/msvc11/create_project.sln new file mode 100644 index 0000000000..1552c9f502 --- /dev/null +++ b/devtools/create_project/msvc11/create_project.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "create_project", "create_project.vcxproj", "{CF177559-077D-4A08-AABE-BE0FD35F6C63}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Debug|Win32.ActiveCfg = Debug|Win32 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Debug|Win32.Build.0 = Debug|Win32 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Release|Win32.ActiveCfg = Release|Win32 + {CF177559-077D-4A08-AABE-BE0FD35F6C63}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/devtools/create_project/msvc11/create_project.vcxproj b/devtools/create_project/msvc11/create_project.vcxproj new file mode 100644 index 0000000000..5947211e35 --- /dev/null +++ b/devtools/create_project/msvc11/create_project.vcxproj @@ -0,0 +1,129 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {CF177559-077D-4A08-AABE-BE0FD35F6C63} + create_project + $(VCTargetsPath11) + + + + Application + MultiByte + true + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Disabled + true + EnableFastChecks + MultiThreadedDebugDLL + Level4 + EditAndContinue + false + 4003;4512;4127 + + + Rpcrt4.lib;%(AdditionalDependencies) + true + MachineX86 + false + + + @echo off +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\codeblocks\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\" + + + + + MaxSpeed + true + MultiThreadedDLL + true + Level3 + ProgramDatabase + 4003;4512;4127 + + + Rpcrt4.lib;%(AdditionalDependencies) + true + true + true + MachineX86 + + + @echo off +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\codeblocks\" +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/devtools/create_project/msvc11/create_project.vcxproj.filters b/devtools/create_project/msvc11/create_project.vcxproj.filters new file mode 100644 index 0000000000..b4f0b18774 --- /dev/null +++ b/devtools/create_project/msvc11/create_project.vcxproj.filters @@ -0,0 +1,71 @@ + + + + + {2e3580c8-ec3a-4c81-8351-b668c668db2a} + + + {31aaf58c-d3cb-4ed6-8eca-163b4a9b31a6} + + + {f980f6fb-41b6-4161-b035-58b200c85cad} + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + scripts + + + scripts + + + scripts + + + scripts + + + -- cgit v1.2.3 From 4e0f6d346fe3c05157fa89c7881c2050e497763a Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 11 Jul 2012 00:43:54 -0400 Subject: CREATE_PROJECT: Properly disable Edit and Continue in Debug mode --- devtools/create_project/msbuild.cpp | 8 ++++---- devtools/create_project/visualstudio.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index dfd3f1d1c7..a82140c2d3 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -249,11 +249,11 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s // Compile configuration if (setup.devTools || name == setup.projectName || name == "sword25" || name == "grim") { project << "\t\t\tfalse\n"; - } else { - if (name == "scummvm" && !isRelease) - project << "\t\t\tProgramDatabase\n"; - if (warningsIterator != _projectWarnings.end()) + if (name == setup.projectName && !isRelease) + project << "\t\t\tProgramDatabase\n"; + } else { + if (warningsIterator != _projectWarnings.end()) project << "\t\t\t" << warnings << ";%(DisableSpecificWarnings)\n"; } diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp index 62b30ddcd0..c301e78ad1 100644 --- a/devtools/create_project/visualstudio.cpp +++ b/devtools/create_project/visualstudio.cpp @@ -110,7 +110,7 @@ void VisualStudioProvider::createProjectFile(const std::string &name, const std: std::string toolConfig; toolConfig = (!warnings.empty() ? "DisableSpecificWarnings=\"" + warnings + "\"" : ""); - toolConfig += (name == "scummvm" ? "DebugInformationFormat=\"3\" " : ""); + toolConfig += (name == setup.projectName ? "DebugInformationFormat=\"3\" " : ""); toolConfig += (name == "sword25" ? "DisableLanguageExtensions=\"false\" " : ""); toolConfig += (name == "grim" ? "DisableLanguageExtensions=\"false\" " : ""); -- cgit v1.2.3 From d86c0a44f8452261e7d1e330edf2449642b056fd Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 11 Jul 2012 01:08:22 -0400 Subject: CREATE_PROJECT: Add support for Visual Studio 2012 project creation --- devtools/README | 2 +- devtools/create_project/create_project.cpp | 3 +- devtools/create_project/msbuild.cpp | 24 ++++-- .../create_project/msvc11/create_project.vcxproj | 2 + dists/msvc11/create_msvc11.bat | 95 ++++++++++++++++++++++ dists/msvc11/readme.txt | 6 ++ 6 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 dists/msvc11/create_msvc11.bat create mode 100644 dists/msvc11/readme.txt diff --git a/devtools/README b/devtools/README index 7db5259e7c..c7f08d6dfa 100644 --- a/devtools/README +++ b/devtools/README @@ -65,7 +65,7 @@ create_lure (dreammaster) create_project (LordHoto, Littleboy) -------------- - Creates project files for Visual Studio 2005, 2008, 2010, Xcode and + Creates project files for Visual Studio 2005, 2008, 2010, 2012, Xcode and Code::Blocks out of the configure / Makefile based build system. It also offers a way to enable or disable certain engines and the use of external libraries similar to configure. Run the tool without diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index df220f0934..c96b83414a 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -221,7 +221,7 @@ int main(int argc, char *argv[]) { msvcVersion = atoi(argv[++i]); - if (msvcVersion != 8 && msvcVersion != 9 && msvcVersion != 10) { + if (msvcVersion != 8 && msvcVersion != 9 && msvcVersion != 10 && msvcVersion != 11) { std::cerr << "ERROR: Unsupported version: \"" << msvcVersion << "\" passed to \"--msvc-version\"!\n"; return -1; } @@ -643,6 +643,7 @@ void displayHelp(const char *exe) { " 8 stands for \"Visual Studio 2005\"\n" " 9 stands for \"Visual Studio 2008\"\n" " 10 stands for \"Visual Studio 2010\"\n" + " 11 stands for \"Visual Studio 2012\"\n" " The default is \"9\", thus \"Visual Studio 2008\"\n" " --build-events Run custom build events as part of the build\n" " (default: false)\n" diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index a82140c2d3..90a5e3c15b 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -46,7 +46,13 @@ const char *MSBuildProvider::getPropertiesExtension() { } int MSBuildProvider::getVisualStudioVersion() { - return 2010; + if (_version == 10) + return 2010; + + if (_version == 11) + return 2012; + + error("Unsupported version passed to getVisualStudioVersion"); } namespace { @@ -58,9 +64,10 @@ inline void outputConfiguration(std::ostream &project, const std::string &config "\t\t\n"; } -inline void outputConfigurationType(const BuildSetup &setup, std::ostream &project, const std::string &name, const std::string &config) { +inline void outputConfigurationType(const BuildSetup &setup, std::ostream &project, const std::string &name, const std::string &config, int version) { project << "\t\n" "\t\t" << ((name == setup.projectName || setup.devTools) ? "Application" : "StaticLibrary") << "\n" + "\t\tv" << version << "0" "\t\n"; } @@ -98,17 +105,18 @@ void MSBuildProvider::createProjectFile(const std::string &name, const std::stri "\t\t{" << uuid << "}\n" "\t\t" << name << "\n" "\t\tWin32Proj\n" + "\t\t$(VCTargetsPath11)\n" "\t\n"; // Shared configuration project << "\t\n"; - outputConfigurationType(setup, project, name, "Release|Win32"); - outputConfigurationType(setup, project, name, "Analysis|Win32"); - outputConfigurationType(setup, project, name, "Debug|Win32"); - outputConfigurationType(setup, project, name, "Release|x64"); - outputConfigurationType(setup, project, name, "Analysis|x64"); - outputConfigurationType(setup, project, name, "Debug|x64"); + outputConfigurationType(setup, project, name, "Release|Win32", _version); + outputConfigurationType(setup, project, name, "Analysis|Win32", _version); + outputConfigurationType(setup, project, name, "Debug|Win32", _version); + outputConfigurationType(setup, project, name, "Release|x64", _version); + outputConfigurationType(setup, project, name, "Analysis|x64", _version); + outputConfigurationType(setup, project, name, "Debug|x64", _version); project << "\t\n" "\t\n" diff --git a/devtools/create_project/msvc11/create_project.vcxproj b/devtools/create_project/msvc11/create_project.vcxproj index 5947211e35..c87461c049 100644 --- a/devtools/create_project/msvc11/create_project.vcxproj +++ b/devtools/create_project/msvc11/create_project.vcxproj @@ -63,6 +63,7 @@ @echo off +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc11\" xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\" xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\" xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\" @@ -89,6 +90,7 @@ xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\iphone\" @echo off +xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc11\" xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc10\" xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc9\" xcopy /Y "$(TargetPath)" "$(SolutionDir)\..\..\..\dists\msvc8\" diff --git a/dists/msvc11/create_msvc11.bat b/dists/msvc11/create_msvc11.bat new file mode 100644 index 0000000000..b6a5413e3b --- /dev/null +++ b/dists/msvc11/create_msvc11.bat @@ -0,0 +1,95 @@ +@echo off + +echo. +echo Automatic creation of the MSVC11 project files +echo. + +if "%~1"=="/stable" goto stable +if "%~1"=="/STABLE" goto stable +if "%~1"=="/all" goto all +if "%~1"=="/ALL" goto all +if "%~1"=="/tools" goto tools +if "%~1"=="/TOOLS" goto tools +if "%~1"=="/clean" goto clean_check +if "%~1"=="/CLEAN" goto clean_check +if "%~1"=="/help" goto command_help +if "%~1"=="/HELP" goto command_help +if "%~1"=="/?" goto command_help + +if "%~1"=="" goto check_tool + +echo Invalid command parameter: %~1 +echo. + +:command_help +echo Valid command parameters are: +echo stable Generated stable engines project files +echo all Generate all engines project files +echo tools Generate project files for the devtools +echo clean Clean generated project files +echo help Show help message +goto done + +:check_tool +if not exist create_project.exe goto no_tool + +:question +echo. +set batchanswer=S +set /p batchanswer="Enable stable engines only, or all engines? (S/a)" +if "%batchanswer%"=="s" goto stable +if "%batchanswer%"=="S" goto stable +if "%batchanswer%"=="a" goto all +if "%batchanswer%"=="A" goto all +goto question + +:no_tool +echo create_project.exe not found in the current folder. +echo You need to build it first and copy it in this +echo folder +goto done + +:all +echo. +echo Creating project files with all engines enabled (stable and unstable) +echo. +create_project ..\.. --enable-all-engines --msvc --msvc-version 11 --build-events +goto done + +:stable +echo. +echo Creating normal project files, with only the stable engines enabled +echo. +create_project ..\.. --msvc --msvc-version 11 +goto done + +:tools +echo. +echo Creating tools project files +echo. +create_project ..\.. --tools --msvc --msvc-version 11 +goto done + +:clean_check +echo. +set cleananswer=N +set /p cleananswer="This will remove all project files. Are you sure you want to continue? (N/y)" +if "%cleananswer%"=="n" goto done +if "%cleananswer%"=="N" goto done +if "%cleananswer%"=="y" goto clean +if "%cleananswer%"=="Y" goto clean +goto clean_check + +:clean +echo. +echo Removing all project files +del /Q *.vcxproj* > NUL 2>&1 +del /Q *.props > NUL 2>&1 +del /Q *.sln* > NUL 2>&1 +del /Q scummvm* > NUL 2>&1 +del /Q devtools* > NUL 2>&1 +goto done + +:done +echo. +pause diff --git a/dists/msvc11/readme.txt b/dists/msvc11/readme.txt new file mode 100644 index 0000000000..fa91a8cc12 --- /dev/null +++ b/dists/msvc11/readme.txt @@ -0,0 +1,6 @@ +The Visual Studio project files can now be created automatically from the GCC +files using the create_project tool inside the /devtools/create_project folder. + +To create the default project files, build create_project.exe, copy it inside +this folder and run the create_msvc11.bat file for a default build. You can run +create_project.exe with no parameters to check the possible command-line options -- cgit v1.2.3 From 4e832ff947dcb998d76a33ccf86682e75c237fe1 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 11 Jul 2012 01:19:55 -0400 Subject: CREATE_PROJECT: Add freetype dll to copied files in postbuild script --- devtools/create_project/scripts/postbuild.cmd | 1 + 1 file changed, 1 insertion(+) diff --git a/devtools/create_project/scripts/postbuild.cmd b/devtools/create_project/scripts/postbuild.cmd index dd52c0217c..d78119d058 100644 --- a/devtools/create_project/scripts/postbuild.cmd +++ b/devtools/create_project/scripts/postbuild.cmd @@ -24,6 +24,7 @@ echo Copying data files echo. xcopy /F /Y "%~4/lib/%~3/SDL.dll" "%~2" 1>NUL 2>&1 +xcopy /F /Y "%~4/lib/%~3/freetype6.dll" "%~2" 1>NUL 2>&1 xcopy /F /Y "%~1/backends/vkeybd/packs/vkeybd_default.zip" "%~2" 1>NUL 2>&1 if "%~5"=="0" goto done -- cgit v1.2.3 From 339fb6968ea00e9c07e27eb7bd16560020d2ed98 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 11 Jul 2012 01:20:19 -0400 Subject: BACKENDS: Silence warning about ARRAYSIZE in windows-saves --- backends/saves/windows/windows-saves.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backends/saves/windows/windows-saves.cpp b/backends/saves/windows/windows-saves.cpp index 87348c3416..d520632394 100644 --- a/backends/saves/windows/windows-saves.cpp +++ b/backends/saves/windows/windows-saves.cpp @@ -26,8 +26,12 @@ #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(DISABLE_DEFAULT_SAVEFILEMANAGER) +#if defined(ARRAYSIZE) +#undef ARRAYSIZE +#endif #define WIN32_LEAN_AND_MEAN #include +#undef ARRAYSIZE // winnt.h defines ARRAYSIZE, but we want our own one... #include "common/config-manager.h" #include "common/savefile.h" -- cgit v1.2.3 From 51352b32f15d9a919e9b7a7d3b5a92e31384e9f4 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 14 Jul 2012 12:34:12 -0400 Subject: CREATE_PROJECT: Disable SAFESEH in debug mode (for edit and continue) --- devtools/create_project/msbuild.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index 90a5e3c15b..c797770955 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -67,7 +67,7 @@ inline void outputConfiguration(std::ostream &project, const std::string &config inline void outputConfigurationType(const BuildSetup &setup, std::ostream &project, const std::string &name, const std::string &config, int version) { project << "\t\n" "\t\t" << ((name == setup.projectName || setup.devTools) ? "Application" : "StaticLibrary") << "\n" - "\t\tv" << version << "0" + "\t\tv" << version << "0\n" "\t\n"; } @@ -403,6 +403,7 @@ void MSBuildProvider::createBuildProp(const BuildSetup &setup, bool isRelease, b "\t\t\n" "\t\t\n" "\t\t\ttrue\n" + "\t\t\tfalse\n" "\t\t\tlibcmt.lib;%(IgnoreSpecificDefaultLibraries)\n"; } -- cgit v1.2.3 From 732a2c80ddde4cf0ffd1b1742f514ae940c5301d Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 14 Jul 2012 13:23:54 -0400 Subject: LASTEXPRESS: Remove duplicated include statements --- engines/lastexpress/data/animation.cpp | 2 -- engines/lastexpress/data/scene.cpp | 1 - engines/lastexpress/data/sequence.cpp | 1 - engines/lastexpress/data/snd.cpp | 2 -- engines/lastexpress/data/subtitle.cpp | 1 - engines/lastexpress/debug.cpp | 4 ---- engines/lastexpress/entities/abbot.cpp | 2 -- engines/lastexpress/entities/alexei.cpp | 3 --- engines/lastexpress/entities/alouan.cpp | 3 --- engines/lastexpress/entities/anna.cpp | 2 -- engines/lastexpress/entities/august.cpp | 2 -- engines/lastexpress/entities/boutarel.cpp | 2 -- engines/lastexpress/entities/chapters.cpp | 2 -- engines/lastexpress/entities/cooks.cpp | 2 -- engines/lastexpress/entities/coudert.cpp | 2 -- engines/lastexpress/entities/entity.cpp | 4 ---- engines/lastexpress/entities/entity39.cpp | 1 - engines/lastexpress/entities/francois.cpp | 1 - engines/lastexpress/entities/gendarmes.cpp | 1 - engines/lastexpress/entities/hadija.cpp | 3 --- engines/lastexpress/entities/ivo.cpp | 3 --- engines/lastexpress/entities/kahina.cpp | 2 -- engines/lastexpress/entities/kronos.cpp | 2 -- engines/lastexpress/entities/mahmud.cpp | 2 -- engines/lastexpress/entities/max.cpp | 2 -- engines/lastexpress/entities/mertens.cpp | 2 -- engines/lastexpress/entities/milos.cpp | 2 -- engines/lastexpress/entities/mmeboutarel.cpp | 2 -- engines/lastexpress/entities/pascale.cpp | 14 ++++++-------- engines/lastexpress/entities/rebecca.cpp | 2 -- engines/lastexpress/entities/salko.cpp | 2 -- engines/lastexpress/entities/servers0.cpp | 3 --- engines/lastexpress/entities/servers1.cpp | 3 --- engines/lastexpress/entities/sophie.cpp | 3 --- engines/lastexpress/entities/tables.cpp | 2 -- engines/lastexpress/entities/tatiana.cpp | 2 -- engines/lastexpress/entities/train.cpp | 2 -- engines/lastexpress/entities/vassili.cpp | 2 -- engines/lastexpress/entities/verges.cpp | 2 -- engines/lastexpress/entities/vesna.cpp | 3 --- engines/lastexpress/entities/yasmin.cpp | 2 -- engines/lastexpress/fight/fight.cpp | 1 - engines/lastexpress/game/action.cpp | 3 --- engines/lastexpress/game/beetle.cpp | 1 - engines/lastexpress/game/entities.cpp | 4 ---- engines/lastexpress/game/inventory.cpp | 2 -- engines/lastexpress/game/logic.cpp | 3 --- engines/lastexpress/game/object.cpp | 1 - engines/lastexpress/game/savegame.cpp | 2 -- engines/lastexpress/game/savepoint.cpp | 1 - engines/lastexpress/game/scenes.cpp | 4 ---- engines/lastexpress/lastexpress.cpp | 2 -- engines/lastexpress/menu/menu.cpp | 2 -- engines/lastexpress/resource.cpp | 1 - engines/lastexpress/sound/entry.cpp | 3 --- engines/lastexpress/sound/queue.cpp | 1 - engines/lastexpress/sound/sound.cpp | 1 - 57 files changed, 6 insertions(+), 126 deletions(-) diff --git a/engines/lastexpress/data/animation.cpp b/engines/lastexpress/data/animation.cpp index 9d0ed532f2..12968520bb 100644 --- a/engines/lastexpress/data/animation.cpp +++ b/engines/lastexpress/data/animation.cpp @@ -32,10 +32,8 @@ #include "common/events.h" #include "common/rational.h" -#include "common/rect.h" #include "common/stream.h" #include "common/system.h" -#include "common/textconsole.h" #include "engines/engine.h" diff --git a/engines/lastexpress/data/scene.cpp b/engines/lastexpress/data/scene.cpp index 8f279ffbb3..79683d8067 100644 --- a/engines/lastexpress/data/scene.cpp +++ b/engines/lastexpress/data/scene.cpp @@ -28,7 +28,6 @@ #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" -#include "common/textconsole.h" #include "common/stream.h" namespace LastExpress { diff --git a/engines/lastexpress/data/sequence.cpp b/engines/lastexpress/data/sequence.cpp index a62348f6c0..e1e0d9bee8 100644 --- a/engines/lastexpress/data/sequence.cpp +++ b/engines/lastexpress/data/sequence.cpp @@ -27,7 +27,6 @@ #include "lastexpress/debug.h" #include "common/stream.h" -#include "common/textconsole.h" namespace LastExpress { diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp index a9bee6155d..5010d6e763 100644 --- a/engines/lastexpress/data/snd.cpp +++ b/engines/lastexpress/data/snd.cpp @@ -28,11 +28,9 @@ #include "lastexpress/debug.h" #include "audio/decoders/adpcm_intern.h" -#include "audio/audiostream.h" #include "common/debug.h" #include "common/memstream.h" #include "common/system.h" -#include "common/textconsole.h" namespace LastExpress { diff --git a/engines/lastexpress/data/subtitle.cpp b/engines/lastexpress/data/subtitle.cpp index 0be832cbdd..9918cf7689 100644 --- a/engines/lastexpress/data/subtitle.cpp +++ b/engines/lastexpress/data/subtitle.cpp @@ -32,7 +32,6 @@ #include "common/debug.h" #include "common/rect.h" #include "common/stream.h" -#include "common/textconsole.h" namespace LastExpress { diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp index dc2807db63..f64b172f73 100644 --- a/engines/lastexpress/debug.cpp +++ b/engines/lastexpress/debug.cpp @@ -28,7 +28,6 @@ #include "lastexpress/data/cursor.h" #include "lastexpress/data/scene.h" #include "lastexpress/data/sequence.h" -#include "lastexpress/data/snd.h" #include "lastexpress/data/subtitle.h" #include "lastexpress/fight/fight.h" @@ -44,15 +43,12 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" #include "common/debug-channels.h" -#include "common/events.h" #include "common/md5.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp index 301c52e142..a0aeb05f7f 100644 --- a/engines/lastexpress/entities/abbot.cpp +++ b/engines/lastexpress/entities/abbot.cpp @@ -34,9 +34,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp index 54c2d87b89..b0f9dd6a42 100644 --- a/engines/lastexpress/entities/alexei.cpp +++ b/engines/lastexpress/entities/alexei.cpp @@ -31,9 +31,6 @@ #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" - -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp index cd79870559..3ae38dcf27 100644 --- a/engines/lastexpress/entities/alouan.cpp +++ b/engines/lastexpress/entities/alouan.cpp @@ -28,9 +28,6 @@ #include "lastexpress/game/savepoint.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" - -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/anna.cpp b/engines/lastexpress/entities/anna.cpp index b13aa21f6d..e4a25be380 100644 --- a/engines/lastexpress/entities/anna.cpp +++ b/engines/lastexpress/entities/anna.cpp @@ -34,9 +34,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp index cfde8a2d6f..c9e89ab95b 100644 --- a/engines/lastexpress/entities/august.cpp +++ b/engines/lastexpress/entities/august.cpp @@ -36,9 +36,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp index 315b12a69e..bba07f5aa4 100644 --- a/engines/lastexpress/entities/boutarel.cpp +++ b/engines/lastexpress/entities/boutarel.cpp @@ -32,9 +32,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp index 4ef2dc50e8..b9384cbab9 100644 --- a/engines/lastexpress/entities/chapters.cpp +++ b/engines/lastexpress/entities/chapters.cpp @@ -63,11 +63,9 @@ #include "lastexpress/game/state.h" #include "lastexpress/menu/menu.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/entities/cooks.cpp b/engines/lastexpress/entities/cooks.cpp index 42e888cc7c..d962d21f8a 100644 --- a/engines/lastexpress/entities/cooks.cpp +++ b/engines/lastexpress/entities/cooks.cpp @@ -29,9 +29,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index c3e7e37b88..e735f50d52 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -32,9 +32,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index e136ca4776..dbce2246d0 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -33,11 +33,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/game/savegame.h" #include "lastexpress/game/savepoint.h" -#include "lastexpress/game/state.h" - -#include "lastexpress/sound/sound.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/entity39.cpp b/engines/lastexpress/entities/entity39.cpp index e786d153a0..1786cd2201 100644 --- a/engines/lastexpress/entities/entity39.cpp +++ b/engines/lastexpress/entities/entity39.cpp @@ -28,7 +28,6 @@ #include "lastexpress/game/savepoint.h" #include "lastexpress/game/state.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/francois.cpp b/engines/lastexpress/entities/francois.cpp index 46cd790ffb..3cbfc68734 100644 --- a/engines/lastexpress/entities/francois.cpp +++ b/engines/lastexpress/entities/francois.cpp @@ -32,7 +32,6 @@ #include "lastexpress/sound/queue.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/gendarmes.cpp b/engines/lastexpress/entities/gendarmes.cpp index daa50956d3..6f08c4cd62 100644 --- a/engines/lastexpress/entities/gendarmes.cpp +++ b/engines/lastexpress/entities/gendarmes.cpp @@ -31,7 +31,6 @@ #include "lastexpress/game/state.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/hadija.cpp b/engines/lastexpress/entities/hadija.cpp index 8ec972b939..09c80247d4 100644 --- a/engines/lastexpress/entities/hadija.cpp +++ b/engines/lastexpress/entities/hadija.cpp @@ -28,10 +28,7 @@ #include "lastexpress/game/savepoint.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" - #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/ivo.cpp b/engines/lastexpress/entities/ivo.cpp index f2261b438c..a097251f0d 100644 --- a/engines/lastexpress/entities/ivo.cpp +++ b/engines/lastexpress/entities/ivo.cpp @@ -32,10 +32,7 @@ #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" - #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/kahina.cpp b/engines/lastexpress/entities/kahina.cpp index 2918b1e8bd..8916f14911 100644 --- a/engines/lastexpress/entities/kahina.cpp +++ b/engines/lastexpress/entities/kahina.cpp @@ -32,10 +32,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/kronos.cpp b/engines/lastexpress/entities/kronos.cpp index 134dce9c81..c9fe0dcde1 100644 --- a/engines/lastexpress/entities/kronos.cpp +++ b/engines/lastexpress/entities/kronos.cpp @@ -39,10 +39,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/mahmud.cpp b/engines/lastexpress/entities/mahmud.cpp index 0e67b45cd2..a6fbd1a443 100644 --- a/engines/lastexpress/entities/mahmud.cpp +++ b/engines/lastexpress/entities/mahmud.cpp @@ -34,10 +34,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/max.cpp b/engines/lastexpress/entities/max.cpp index eacc38bf60..7911a5e5b6 100644 --- a/engines/lastexpress/entities/max.cpp +++ b/engines/lastexpress/entities/max.cpp @@ -31,10 +31,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index d88962fce2..e465bac3c9 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -32,10 +32,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp index ff3d2b6744..2e0da272ba 100644 --- a/engines/lastexpress/entities/milos.cpp +++ b/engines/lastexpress/entities/milos.cpp @@ -36,10 +36,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/mmeboutarel.cpp b/engines/lastexpress/entities/mmeboutarel.cpp index 9ca10ca374..a72bd1578b 100644 --- a/engines/lastexpress/entities/mmeboutarel.cpp +++ b/engines/lastexpress/entities/mmeboutarel.cpp @@ -31,10 +31,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/pascale.cpp b/engines/lastexpress/entities/pascale.cpp index a191273702..1f8504c566 100644 --- a/engines/lastexpress/entities/pascale.cpp +++ b/engines/lastexpress/entities/pascale.cpp @@ -30,10 +30,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { @@ -186,7 +184,7 @@ IMPLEMENT_FUNCTION(9, Pascale, sitSophieAndRebecca) case kActionExitCompartment: CALLBACK_ACTION(); - break; + break; case kActionDefault: getEntities()->drawSequenceLeft(kEntityPascale, "012C1"); @@ -298,7 +296,7 @@ IMPLEMENT_FUNCTION(12, Pascale, chapter1) case kActionNone: setup_chapter1Handler(); - break; + break; case kActionDefault: getSavePoints()->addData(kEntityPascale, kAction239072064, 0); @@ -648,7 +646,7 @@ IMPLEMENT_FUNCTION(21, Pascale, chapter3) case kActionNone: setup_chapter3Handler(); - break; + break; case kActionDefault: getEntities()->clearSequences(kEntityPascale); @@ -685,7 +683,7 @@ label_callback: setCallback(2); setup_welcomeSophieAndRebecca(); } - break; + break; case kActionCallback: if (getCallback() == 1) @@ -771,7 +769,7 @@ IMPLEMENT_FUNCTION(25, Pascale, chapter4) case kActionNone: setup_chapter4Handler(); - break; + break; case kActionDefault: getEntities()->clearSequences(kEntityPascale); @@ -1090,7 +1088,7 @@ IMPLEMENT_FUNCTION(31, Pascale, chapter5) case kActionNone: setup_chapter5Handler(); - break; + break; case kActionDefault: getEntities()->clearSequences(kEntityPascale); diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index b1a176b47e..a5f2d66793 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -30,10 +30,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/salko.cpp b/engines/lastexpress/entities/salko.cpp index 63d995dc42..c95269fc90 100644 --- a/engines/lastexpress/entities/salko.cpp +++ b/engines/lastexpress/entities/salko.cpp @@ -33,10 +33,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/servers0.cpp b/engines/lastexpress/entities/servers0.cpp index 989bddd662..60f5295fc6 100644 --- a/engines/lastexpress/entities/servers0.cpp +++ b/engines/lastexpress/entities/servers0.cpp @@ -28,10 +28,7 @@ #include "lastexpress/game/savepoint.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" - #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/servers1.cpp b/engines/lastexpress/entities/servers1.cpp index 995fbbc01b..76a35a4071 100644 --- a/engines/lastexpress/entities/servers1.cpp +++ b/engines/lastexpress/entities/servers1.cpp @@ -28,10 +28,7 @@ #include "lastexpress/game/savepoint.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" - #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/sophie.cpp b/engines/lastexpress/entities/sophie.cpp index 57bd491949..65c718a8c4 100644 --- a/engines/lastexpress/entities/sophie.cpp +++ b/engines/lastexpress/entities/sophie.cpp @@ -27,9 +27,6 @@ #include "lastexpress/game/savepoint.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" - -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/tables.cpp b/engines/lastexpress/entities/tables.cpp index 06ea4c597c..4f8d2b954d 100644 --- a/engines/lastexpress/entities/tables.cpp +++ b/engines/lastexpress/entities/tables.cpp @@ -29,10 +29,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp index c8901b3e30..b97538818f 100644 --- a/engines/lastexpress/entities/tatiana.cpp +++ b/engines/lastexpress/entities/tatiana.cpp @@ -35,10 +35,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/train.cpp b/engines/lastexpress/entities/train.cpp index bced1da62b..1a1b6efaa7 100644 --- a/engines/lastexpress/entities/train.cpp +++ b/engines/lastexpress/entities/train.cpp @@ -32,10 +32,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/vassili.cpp b/engines/lastexpress/entities/vassili.cpp index 22f41afa92..5079fdb252 100644 --- a/engines/lastexpress/entities/vassili.cpp +++ b/engines/lastexpress/entities/vassili.cpp @@ -35,10 +35,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp index 8246f85145..d4b2a1716e 100644 --- a/engines/lastexpress/entities/verges.cpp +++ b/engines/lastexpress/entities/verges.cpp @@ -32,10 +32,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/vesna.cpp b/engines/lastexpress/entities/vesna.cpp index 7a1f1d3195..b5ffd9c979 100644 --- a/engines/lastexpress/entities/vesna.cpp +++ b/engines/lastexpress/entities/vesna.cpp @@ -32,10 +32,7 @@ #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" - #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/yasmin.cpp b/engines/lastexpress/entities/yasmin.cpp index 45e5e11568..d2e8cd6b68 100644 --- a/engines/lastexpress/entities/yasmin.cpp +++ b/engines/lastexpress/entities/yasmin.cpp @@ -28,10 +28,8 @@ #include "lastexpress/game/savepoint.h" #include "lastexpress/game/state.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" namespace LastExpress { diff --git a/engines/lastexpress/fight/fight.cpp b/engines/lastexpress/fight/fight.cpp index b832d46a60..be1653092f 100644 --- a/engines/lastexpress/fight/fight.cpp +++ b/engines/lastexpress/fight/fight.cpp @@ -40,7 +40,6 @@ #include "lastexpress/sound/queue.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp index 98d74dd1a7..0ce75f16a4 100644 --- a/engines/lastexpress/game/action.cpp +++ b/engines/lastexpress/game/action.cpp @@ -29,7 +29,6 @@ #include "lastexpress/entities/abbot.h" #include "lastexpress/entities/anna.h" -#include "lastexpress/entities/entity.h" #include "lastexpress/game/beetle.h" #include "lastexpress/game/entities.h" @@ -42,9 +41,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/game/beetle.cpp b/engines/lastexpress/game/beetle.cpp index ab707ddae9..f95947617a 100644 --- a/engines/lastexpress/game/beetle.cpp +++ b/engines/lastexpress/game/beetle.cpp @@ -27,7 +27,6 @@ #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/game/entities.cpp b/engines/lastexpress/game/entities.cpp index f27087a609..f2201ac9a7 100644 --- a/engines/lastexpress/game/entities.cpp +++ b/engines/lastexpress/game/entities.cpp @@ -27,8 +27,6 @@ #include "lastexpress/data/sequence.h" // Entities -#include "lastexpress/entities/entity.h" - #include "lastexpress/entities/abbot.h" #include "lastexpress/entities/alexei.h" #include "lastexpress/entities/alouan.h" @@ -71,10 +69,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index e417b1ec0d..7b803bb1ca 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -33,10 +33,8 @@ #include "lastexpress/menu/menu.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp index aeac8cff98..5f220479d1 100644 --- a/engines/lastexpress/game/logic.cpp +++ b/engines/lastexpress/game/logic.cpp @@ -36,7 +36,6 @@ // Game #include "lastexpress/game/action.h" #include "lastexpress/game/beetle.h" -#include "lastexpress/game/entities.h" #include "lastexpress/game/inventory.h" #include "lastexpress/game/object.h" #include "lastexpress/game/savegame.h" @@ -47,10 +46,8 @@ #include "lastexpress/menu/menu.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/game/object.cpp b/engines/lastexpress/game/object.cpp index d9e9e4279a..91dcfcfb4a 100644 --- a/engines/lastexpress/game/object.cpp +++ b/engines/lastexpress/game/object.cpp @@ -26,7 +26,6 @@ #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp index 9c464feb6e..76cfe9525f 100644 --- a/engines/lastexpress/game/savegame.cpp +++ b/engines/lastexpress/game/savegame.cpp @@ -34,10 +34,8 @@ #include "lastexpress/debug.h" #include "lastexpress/lastexpress.h" -#include "lastexpress/helpers.h" #include "common/file.h" -#include "common/system.h" namespace LastExpress { diff --git a/engines/lastexpress/game/savepoint.cpp b/engines/lastexpress/game/savepoint.cpp index 64ae26c2be..0b5ff42679 100644 --- a/engines/lastexpress/game/savepoint.cpp +++ b/engines/lastexpress/game/savepoint.cpp @@ -26,7 +26,6 @@ #include "lastexpress/game/logic.h" #include "lastexpress/game/state.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" diff --git a/engines/lastexpress/game/scenes.cpp b/engines/lastexpress/game/scenes.cpp index b886951e0b..254b0fdb58 100644 --- a/engines/lastexpress/game/scenes.cpp +++ b/engines/lastexpress/game/scenes.cpp @@ -22,8 +22,6 @@ #include "lastexpress/game/scenes.h" -#include "lastexpress/data/scene.h" - #include "lastexpress/game/action.h" #include "lastexpress/game/beetle.h" #include "lastexpress/game/entities.h" @@ -34,10 +32,8 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp index 250fa0f2d0..cc3795651d 100644 --- a/engines/lastexpress/lastexpress.cpp +++ b/engines/lastexpress/lastexpress.cpp @@ -32,10 +32,8 @@ #include "lastexpress/menu/menu.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/resource.h" #include "common/config-manager.h" diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp index f1a8bebe94..3254bed130 100644 --- a/engines/lastexpress/menu/menu.cpp +++ b/engines/lastexpress/menu/menu.cpp @@ -41,10 +41,8 @@ #include "lastexpress/menu/trainline.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/resource.cpp b/engines/lastexpress/resource.cpp index ee4885e34e..bbbd139b97 100644 --- a/engines/lastexpress/resource.cpp +++ b/engines/lastexpress/resource.cpp @@ -31,7 +31,6 @@ #include "common/debug.h" #include "common/file.h" -#include "common/textconsole.h" namespace LastExpress { diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp index 44cc68a57b..85bb8eb479 100644 --- a/engines/lastexpress/sound/entry.cpp +++ b/engines/lastexpress/sound/entry.cpp @@ -27,14 +27,11 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" -#include "common/stream.h" namespace LastExpress { diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp index 33b4c06793..cfbb3091a4 100644 --- a/engines/lastexpress/sound/queue.cpp +++ b/engines/lastexpress/sound/queue.cpp @@ -27,7 +27,6 @@ #include "lastexpress/sound/entry.h" -#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp index 2f7bb4a601..17d51fe9f4 100644 --- a/engines/lastexpress/sound/sound.cpp +++ b/engines/lastexpress/sound/sound.cpp @@ -33,7 +33,6 @@ #include "lastexpress/sound/entry.h" #include "lastexpress/sound/queue.h" -#include "lastexpress/helpers.h" #include "lastexpress/graphics.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" -- cgit v1.2.3 From 0635d99ec74ad431146e14aba4ad07a5f9e7e221 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 14 Jul 2012 14:02:44 -0400 Subject: LASTEXPRESS: Cleanup - Add missing initializer/destructors - Add some const modifiers - Remove some unneeded casts - Use enumeration values in switch constructs --- engines/lastexpress/data/cursor.cpp | 2 +- engines/lastexpress/data/scene.cpp | 12 ++++++------ engines/lastexpress/data/snd.cpp | 9 ++++++++- engines/lastexpress/data/subtitle.cpp | 2 +- engines/lastexpress/detection.cpp | 3 ++- engines/lastexpress/fight/fight.cpp | 5 +++++ engines/lastexpress/fight/fighter.cpp | 27 ++++++++++++++++++--------- engines/lastexpress/fight/fighter.h | 3 --- engines/lastexpress/game/inventory.cpp | 14 +++++++------- engines/lastexpress/game/inventory.h | 12 ++++++------ engines/lastexpress/lastexpress.cpp | 13 ++++++------- engines/lastexpress/resource.cpp | 5 +---- engines/lastexpress/resource.h | 2 +- engines/lastexpress/sound/entry.cpp | 19 +++++++++++++++++-- engines/lastexpress/sound/queue.cpp | 13 ++++++++----- engines/lastexpress/sound/sound.cpp | 22 +++++++++++----------- 16 files changed, 98 insertions(+), 65 deletions(-) diff --git a/engines/lastexpress/data/cursor.cpp b/engines/lastexpress/data/cursor.cpp index 205c46f667..d176d963d1 100644 --- a/engines/lastexpress/data/cursor.cpp +++ b/engines/lastexpress/data/cursor.cpp @@ -128,7 +128,7 @@ Common::Rect Icon::draw(Graphics::Surface *surface) { for (int i = 0; i < 32; i++) { // Adjust brightness - if (_brightnessIndex == -1) + if (_brightnessIndex == -1 || _brightnessIndex >= ARRAYSIZE(brigthnessData)) *s = *image; else *s = (*image & brigthnessData[_brightnessIndex]) >> _brightnessIndex; diff --git a/engines/lastexpress/data/scene.cpp b/engines/lastexpress/data/scene.cpp index 79683d8067..fdb1ac6d46 100644 --- a/engines/lastexpress/data/scene.cpp +++ b/engines/lastexpress/data/scene.cpp @@ -121,7 +121,7 @@ bool SceneHotspot::isInside(const Common::Point &point) { // Scene Scene::~Scene() { // Free the hotspots - for (int i = 0; i < (int)_hotspots.size(); i++) + for (uint i = 0; i < _hotspots.size(); i++) delete _hotspots[i]; } @@ -171,7 +171,7 @@ bool Scene::checkHotSpot(const Common::Point &coord, SceneHotspot **hotspot) { bool found = false; int _location = 0; - for (int i = 0; i < (int)_hotspots.size(); i++) { + for (uint i = 0; i < _hotspots.size(); i++) { if (_hotspots[i]->isInside(coord)) { if (_location <= _hotspots[i]->location) { _location = _hotspots[i]->location; @@ -223,7 +223,7 @@ Common::String Scene::toString() { // Hotspots if (_hotspots.size() != 0) { output += "\nHotspots:\n"; - for (int i = 0; i < (int)_hotspots.size(); i++) + for (uint i = 0; i < _hotspots.size(); i++) output += _hotspots[i]->toString() + "\n"; } @@ -240,7 +240,7 @@ SceneLoader::~SceneLoader() { void SceneLoader::clear() { // Remove all scenes - for (int i = 0; i < (int)_scenes.size(); i++) + for (uint i = 0; i < _scenes.size(); i++) delete _scenes[i]; _scenes.clear(); @@ -291,9 +291,9 @@ Scene *SceneLoader::get(SceneIndex index) { return NULL; // Load the hotspots if needed - _scenes[(int)index]->loadHotspots(_stream); + _scenes[(uint)index]->loadHotspots(_stream); - return _scenes[(int)index]; + return _scenes[(uint)index]; } } // End of namespace LastExpress diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp index 5010d6e763..6d64f6b82c 100644 --- a/engines/lastexpress/data/snd.cpp +++ b/engines/lastexpress/data/snd.cpp @@ -356,6 +356,8 @@ public: Audio::ADPCMStream(stream, disposeAfterUse, size, 44100, 1, blockSize) { _currentFilterId = -1; _nextFilterId = filterId; + _stepAdjust1 = 0; + _stepAdjust2 = 0; } int readBuffer(int16 *buffer, const int numSamples) { @@ -453,7 +455,9 @@ void SimpleSound::play(Audio::AudioStream *as) { ////////////////////////////////////////////////////////////////////////// StreamedSound::StreamedSound() : _as(NULL), _loaded(false) {} -StreamedSound::~StreamedSound() {} +StreamedSound::~StreamedSound() { + _as = NULL; +} bool StreamedSound::load(Common::SeekableReadStream *stream, int32 filterId) { if (!stream) @@ -482,6 +486,9 @@ bool StreamedSound::isFinished() { } void StreamedSound::setFilterId(int32 filterId) { + if (_as == NULL) + return; + ((LastExpress_ADPCMStream *)_as)->setFilterId(filterId); } diff --git a/engines/lastexpress/data/subtitle.cpp b/engines/lastexpress/data/subtitle.cpp index 9918cf7689..a9a8284588 100644 --- a/engines/lastexpress/data/subtitle.cpp +++ b/engines/lastexpress/data/subtitle.cpp @@ -150,7 +150,7 @@ SubtitleManager::~SubtitleManager() { } void SubtitleManager::reset() { - for (int i = 0; i < (int)_subtitles.size(); i++) + for (uint i = 0; i < _subtitles.size(); i++) delete _subtitles[i]; _subtitles.clear(); diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp index 82a6520522..2fdeef910a 100644 --- a/engines/lastexpress/detection.cpp +++ b/engines/lastexpress/detection.cpp @@ -173,7 +173,7 @@ static const ADGameDescription gameDescriptions[] = { ADGF_UNSTABLE, GUIO1(GUIO_NOASPECT) }, - + // The Last Express (Russian) // expressw.exe 1999-04-05 15:33:56 // express.exe ??? @@ -211,6 +211,7 @@ public: return "LastExpress Engine (C) 1997 Smoking Car Productions"; } +protected: bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const; }; diff --git a/engines/lastexpress/fight/fight.cpp b/engines/lastexpress/fight/fight.cpp index be1653092f..22d9da80be 100644 --- a/engines/lastexpress/fight/fight.cpp +++ b/engines/lastexpress/fight/fight.cpp @@ -52,6 +52,8 @@ Fight::FightData::FightData() { index = 0; isFightRunning = false; + + memset(&sequences, 0, sizeof(sequences)); } Fight::FightData::~FightData() { @@ -398,6 +400,9 @@ end_load: } void Fight::setOpponents() { + if (!_data) + error("[Fight::setOpponents] Data not initialized"); + _data->player->setOpponent(_data->opponent); _data->opponent->setOpponent(_data->player); diff --git a/engines/lastexpress/fight/fighter.cpp b/engines/lastexpress/fight/fighter.cpp index bae7728a2b..4b1cddabd4 100644 --- a/engines/lastexpress/fight/fighter.cpp +++ b/engines/lastexpress/fight/fighter.cpp @@ -53,20 +53,20 @@ Fighter::Fighter(LastExpressEngine *engine) : _engine(engine) { } Fighter::~Fighter() { - clearSequences(); -} - -////////////////////////////////////////////////////////////////////////// -// Cleanup -////////////////////////////////////////////////////////////////////////// -void Fighter::clearSequences() { // The original game resets the function pointers to default values, just before deleting the struct getScenes()->removeAndRedraw(&_frame, false); // Free sequences - for (int i = 0; i < (int)_sequences.size(); i++) + for (uint i = 0; i < _sequences.size(); i++) SAFE_DELETE(_sequences[i]); + + // Zero-out passed pointers + _sequence = NULL; + _opponent = NULL; + _fight = NULL; + + _engine = NULL; } ////////////////////////////////////////////////////////////////////////// @@ -113,6 +113,9 @@ void Fighter::draw() { // Processing ////////////////////////////////////////////////////////////////////////// void Fighter::process() { + if (!_fight) + error("[Fighter::handleAction] Fighter not initialized properly"); + if (!_sequence) { if (_frame) { getScenes()->removeFromQueue(_frame); @@ -188,6 +191,9 @@ void Fighter::process() { // Default actions ////////////////////////////////////////////////////////////////////////// void Fighter::handleAction(FightAction action) { + if (!_opponent || !_fight) + error("[Fighter::handleAction] Fighter not initialized properly"); + switch (action) { default: return; @@ -243,7 +249,10 @@ void Opponent::update() { // Helpers ////////////////////////////////////////////////////////////////////////// bool Fighter::checkFrame(uint32 val) { - return (_frame->getInfo()->field_33 & val); + if (!_frame) + error("[Fighter::checkFrame] Invalid current frame"); + + return (bool)(_frame->getInfo()->field_33 & val); } } // End of namespace LastExpress diff --git a/engines/lastexpress/fight/fighter.h b/engines/lastexpress/fight/fighter.h index e37fe49d86..dad95af186 100644 --- a/engines/lastexpress/fight/fighter.h +++ b/engines/lastexpress/fight/fighter.h @@ -99,9 +99,6 @@ protected: void draw(); void process(); - // Cleanup - void clearSequences(); - // Helpers bool checkFrame(uint32 val); }; diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index 7b803bb1ca..bb382ea38e 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -259,7 +259,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { // Change item highlight on list if (getFlags()->mouseLeftPressed) { - uint32 index = ev.mouse.y / 40; + uint32 index = (unsigned) (int) ev.mouse.y / 40; if (_highlightedItemIndex && _highlightedItemIndex != index) drawHighlight(_highlightedItemIndex, true); @@ -416,12 +416,12 @@ void Inventory::show() { drawEgg(); } -void Inventory::setPortrait(InventoryItem item) { +void Inventory::setPortrait(InventoryItem item) const { getProgress().portrait = item; drawItem((CursorStyle)getProgress().portrait, 0, 0); } -void Inventory::showHourGlass(){ +void Inventory::showHourGlass() const { if (!getMenu()->isShown()) drawItem(kCursorHourGlass, 608, 448); @@ -611,7 +611,7 @@ void Inventory::examine(InventoryItem item) { } } -void Inventory::drawEgg() { +void Inventory::drawEgg() const { if (!getMenu()->isShown()) drawItem((CursorStyle)(getMenu()->getGameId() + 39), 608, 448, _eggHightlighted ? 0 : 1); @@ -652,7 +652,7 @@ void Inventory::drawBlinkingEgg() { askForRedraw(); } -void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, int16 brightnessIndex) { +void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, int16 brightnessIndex) const { Icon icon(id); icon.setPosition(x, y); @@ -676,7 +676,7 @@ void Inventory::drawSelectedItem() { } } -void Inventory::clearSelectedItem() { +void Inventory::clearSelectedItem() const { _engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(44, 0, 44 + 32, 32)); } @@ -731,7 +731,7 @@ void Inventory::drawHighlight(uint32 currentIndex, bool reset) { } } -uint32 Inventory::getItemIndex(uint32 currentIndex) { +uint32 Inventory::getItemIndex(uint32 currentIndex) const { uint32 count = 0; for (uint32 i = 1; i < ARRAYSIZE(_entries); i++) { diff --git a/engines/lastexpress/game/inventory.h b/engines/lastexpress/game/inventory.h index b1995adce3..15dd29053d 100644 --- a/engines/lastexpress/game/inventory.h +++ b/engines/lastexpress/game/inventory.h @@ -107,9 +107,9 @@ public: // UI Control void show(); void blinkEgg(bool enabled); - void showHourGlass(); - void setPortrait(InventoryItem item); - void drawEgg(); + void showHourGlass() const; + void setPortrait(InventoryItem item) const; + void drawEgg() const; void drawBlinkingEgg(); // Handle inventory UI events. @@ -168,14 +168,14 @@ private: void close(); void examine(InventoryItem item); void drawHighlight(uint32 currentIndex, bool reset); - uint32 getItemIndex(uint32 currentIndex); + uint32 getItemIndex(uint32 currentIndex) const; bool isItemSceneParameter(InventoryItem item) const; - void drawItem(CursorStyle id, uint16 x, uint16 y, int16 brighnessIndex = -1); + void drawItem(CursorStyle id, uint16 x, uint16 y, int16 brighnessIndex = -1) const; void drawSelectedItem(); - void clearSelectedItem(); + void clearSelectedItem() const; }; } // End of namespace LastExpress diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp index cc3795651d..74d1969e01 100644 --- a/engines/lastexpress/lastexpress.cpp +++ b/engines/lastexpress/lastexpress.cpp @@ -52,18 +52,17 @@ const char *g_entityNames[] = { "Player", "Anna", "August", "Mertens", "Coudert" namespace LastExpress { LastExpressEngine::LastExpressEngine(OSystem *syst, const ADGameDescription *gd) : - Engine(syst), _gameDescription(gd), - _debugger(NULL), _cursor(NULL), - _font(NULL), _logic(NULL), _menu(NULL), - _frameCounter(0), _lastFrameCount(0), + Engine(syst), _gameDescription(gd), + _debugger(NULL), _random("lastexpress"), _cursor(NULL), + _font(NULL), _logic(NULL), _menu(NULL), + _frameCounter(0), _lastFrameCount(0), _graphicsMan(NULL), _resMan(NULL), _sceneMan(NULL), _soundMan(NULL), _eventMouse(NULL), _eventTick(NULL), - _eventMouseBackup(NULL), _eventTickBackup(NULL), - _random("lastexpress") + _eventMouseBackup(NULL), _eventTickBackup(NULL) { // Setup mixer - syncSoundSettings(); + Engine::syncSoundSettings(); // Adding the default directories const Common::FSNode gameDataDir(ConfMan.get("path")); diff --git a/engines/lastexpress/resource.cpp b/engines/lastexpress/resource.cpp index bbbd139b97..1d010355ac 100644 --- a/engines/lastexpress/resource.cpp +++ b/engines/lastexpress/resource.cpp @@ -128,13 +128,10 @@ bool ResourceManager::loadArchive(const Common::String &name) { // Get a stream to file in the archive // - same as createReadStreamForMember except it checks if the file exists and will assert / output a debug message if not -Common::SeekableReadStream *ResourceManager::getFileStream(const Common::String &name) { +Common::SeekableReadStream *ResourceManager::getFileStream(const Common::String &name) const { // Check if the file exits in the archive if (!hasFile(name)) { -//#ifdef _DEBUG -// error("[ResourceManager::getFileStream] Cannot open file: %s", name.c_str()); -//#endif debugC(2, kLastExpressDebugResource, "Error opening file: %s", name.c_str()); return NULL; } diff --git a/engines/lastexpress/resource.h b/engines/lastexpress/resource.h index f2f5d63bce..90ac9b87ad 100644 --- a/engines/lastexpress/resource.h +++ b/engines/lastexpress/resource.h @@ -42,7 +42,7 @@ public: // Loading bool loadArchive(ArchiveIndex type); static bool isArchivePresent(ArchiveIndex type); - Common::SeekableReadStream *getFileStream(const Common::String &name); + Common::SeekableReadStream *getFileStream(const Common::String &name) const; // Archive functions bool hasFile(const Common::String &name) const; diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp index 85bb8eb479..3d2b05895f 100644 --- a/engines/lastexpress/sound/entry.cpp +++ b/engines/lastexpress/sound/entry.cpp @@ -44,6 +44,8 @@ namespace LastExpress { SoundEntry::SoundEntry(LastExpressEngine *engine) : _engine(engine) { _type = kSoundTypeNone; + _currentDataPtr = NULL; + _blockCount = 0; _time = 0; @@ -68,7 +70,13 @@ SoundEntry::~SoundEntry() { // Entries that have been queued will have their streamed disposed automatically if (!_soundStream) SAFE_DELETE(_stream); - delete _soundStream; + + SAFE_DELETE(_soundStream); + + free(_currentDataPtr); + + _subtitle = NULL; + _stream = NULL; // Zero passed pointers _engine = NULL; @@ -274,7 +282,7 @@ bool SoundEntry::updateSound() { int l = strlen(sub) + 1; if (l - 1 > 4) - sub[l - 1 - 4] = 0; + sub[l - (1 + 4)] = 0; showSubtitle(sub); } } else { @@ -390,6 +398,10 @@ SubtitleEntry::SubtitleEntry(LastExpressEngine *engine) : _engine(engine) { SubtitleEntry::~SubtitleEntry() { SAFE_DELETE(_data); + + // Zero-out passed pointers + _sound = NULL; + _engine = NULL; } void SubtitleEntry::load(Common::String filename, SoundEntry *soundEntry) { @@ -420,6 +432,9 @@ void SubtitleEntry::loadData() { } void SubtitleEntry::setupAndDraw() { + if (!_sound) + error("[SubtitleEntry::setupAndDraw] Sound entry not initialized"); + if (!_data) { _data = new SubtitleManager(_engine->getFont()); _data->load(getArchive(_filename)); diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp index cfbb3091a4..5f3ab96d81 100644 --- a/engines/lastexpress/sound/queue.cpp +++ b/engines/lastexpress/sound/queue.cpp @@ -38,6 +38,7 @@ SoundQueue::SoundQueue(LastExpressEngine *engine) : _engine(engine) { _subtitlesFlag = 0; _currentSubtitle = NULL; + _soundCacheData = NULL; } SoundQueue::~SoundQueue() { @@ -50,6 +51,7 @@ SoundQueue::~SoundQueue() { _subtitles.clear(); _currentSubtitle = NULL; + SAFE_DELETE(_soundCacheData); // Zero passed pointers _engine = NULL; @@ -133,7 +135,7 @@ void SoundQueue::updateQueue() { // Original update the current entry, loading another set of samples to be decoded - getFlags()->flag_3 = 0; + getFlags()->flag_3 = false; --_flag; } @@ -339,13 +341,14 @@ void SoundQueue::updateSubtitles() { return; } + if (!subtitle) + return; + if (_subtitlesFlag & 1) subtitle->drawOnScreen(); - if (subtitle) { - subtitle->loadData(); - subtitle->setupAndDraw(); - } + subtitle->loadData(); + subtitle->setupAndDraw(); } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp index 17d51fe9f4..4f6a7b8f93 100644 --- a/engines/lastexpress/sound/sound.cpp +++ b/engines/lastexpress/sound/sound.cpp @@ -1329,23 +1329,23 @@ void SoundManager::playLoopingSound(int param) { } } else { switch (getEntityData(kEntityPlayer)->car) { - case 1: - case 6: + case kCarBaggageRear: + case kCarBaggage: partNumber = 4; break; - case 2: - case 3: - case 4: - case 5: + case kCarKronos: + case kCarGreenSleeping: + case kCarRedSleeping: + case kCarRestaurant: partNumber = 1; break; - case 7: + case kCarCoalTender: partNumber = 5; break; - case 8: + case kCarLocomotive: partNumber = 99; break; - case 9: + case kCar9: partNumber = 3; break; default: @@ -1356,13 +1356,13 @@ void SoundManager::playLoopingSound(int param) { } if (partNumber != 99) - sprintf(tmp, "LOOP%d%c.SND", partNumber, _engine->getRandom().getRandomNumber(numLoops[partNumber] - 1) + 'A'); + sprintf(tmp, "LOOP%d%c.SND", partNumber, (char)(_engine->getRandom().getRandomNumber(numLoops[partNumber] - 1) + 'A')); } if (getFlags()->flag_3) fnameLen = 5; - if (!entry || scumm_strnicmp(entry->getName2().c_str(), tmp, fnameLen)) { + if (!entry || scumm_strnicmp(entry->getName2().c_str(), tmp, (uint)fnameLen)) { _loopingSoundDuration = _engine->getRandom().getRandomNumber(319) + 260; if (partNumber != 99) { -- cgit v1.2.3 From 13c00d40486201989463d337d5c09720f10a0aeb Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 14 Jul 2012 14:26:22 -0400 Subject: LASTEXPRESS: Fix sound in animated sequences --- engines/lastexpress/data/snd.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp index 6d64f6b82c..3deb2d6300 100644 --- a/engines/lastexpress/data/snd.cpp +++ b/engines/lastexpress/data/snd.cpp @@ -486,7 +486,7 @@ bool StreamedSound::isFinished() { } void StreamedSound::setFilterId(int32 filterId) { - if (_as == NULL) + if (!_as) return; ((LastExpress_ADPCMStream *)_as)->setFilterId(filterId); @@ -526,6 +526,7 @@ void AppendableSound::queueBuffer(Common::SeekableReadStream *bufferIn) { // Setup the ADPCM decoder uint32 sizeIn = (uint32)bufferIn->size(); Audio::AudioStream *adpcm = makeDecoder(bufferIn, sizeIn); + ((LastExpress_ADPCMStream *)adpcm)->setFilterId(1); // Queue the stream _as->queueAudioStream(adpcm); -- cgit v1.2.3 From 4cee0836c9d4dda646f1e76a3440ffb73499dbb5 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 14 Jul 2012 14:32:51 -0400 Subject: LASTEXPRESS: Replace CALLBACK_ACTION macro by member function --- engines/lastexpress/entities/abbot.cpp | 6 +- engines/lastexpress/entities/alexei.cpp | 12 +-- engines/lastexpress/entities/anna.cpp | 30 +++--- engines/lastexpress/entities/august.cpp | 48 ++++----- engines/lastexpress/entities/boutarel.cpp | 16 +-- engines/lastexpress/entities/chapters.cpp | 6 +- engines/lastexpress/entities/cooks.cpp | 12 +-- engines/lastexpress/entities/coudert.cpp | 110 ++++++++++---------- engines/lastexpress/entities/entity.cpp | 39 ++++--- engines/lastexpress/entities/entity.h | 7 +- engines/lastexpress/entities/entity_intern.h | 17 +-- engines/lastexpress/entities/francois.cpp | 24 ++--- engines/lastexpress/entities/gendarmes.cpp | 16 +-- engines/lastexpress/entities/ivo.cpp | 8 +- engines/lastexpress/entities/kahina.cpp | 42 ++++---- engines/lastexpress/entities/mahmud.cpp | 10 +- engines/lastexpress/entities/max.cpp | 4 +- engines/lastexpress/entities/mertens.cpp | 150 +++++++++++++-------------- engines/lastexpress/entities/milos.cpp | 28 ++--- engines/lastexpress/entities/mmeboutarel.cpp | 8 +- engines/lastexpress/entities/pascale.cpp | 30 +++--- engines/lastexpress/entities/rebecca.cpp | 14 +-- engines/lastexpress/entities/salko.cpp | 4 +- engines/lastexpress/entities/servers0.cpp | 22 ++-- engines/lastexpress/entities/servers1.cpp | 12 +-- engines/lastexpress/entities/sophie.cpp | 2 +- engines/lastexpress/entities/tatiana.cpp | 18 ++-- engines/lastexpress/entities/train.cpp | 2 +- engines/lastexpress/entities/verges.cpp | 38 +++---- engines/lastexpress/entities/vesna.cpp | 8 +- engines/lastexpress/entities/yasmin.cpp | 6 +- 31 files changed, 377 insertions(+), 372 deletions(-) diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp index a0aeb05f7f..eef64bdf07 100644 --- a/engines/lastexpress/entities/abbot.cpp +++ b/engines/lastexpress/entities/abbot.cpp @@ -768,7 +768,7 @@ IMPLEMENT_FUNCTION(29, Abbot, function29) getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122358304); getEntities()->drawSequenceLeft(kEntityAbbot, "508B"); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1285,7 +1285,7 @@ IMPLEMENT_FUNCTION_II(40, Abbot, function40, CarIndex, EntityPosition) case kActionNone: if (getEntities()->updateEntity(kEntityAbbot, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); } else if (!getEvent(kEventAbbotInvitationDrink) && getEntities()->isDistanceBetweenEntities(kEntityAbbot, kEntityPlayer, 1000) && !getEntities()->isInsideCompartments(kEntityPlayer) @@ -1300,7 +1300,7 @@ IMPLEMENT_FUNCTION_II(40, Abbot, function40, CarIndex, EntityPosition) case kActionDefault: if (getEntities()->updateEntity(kEntityAbbot, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp index b0f9dd6a42..437c31c476 100644 --- a/engines/lastexpress/entities/alexei.cpp +++ b/engines/lastexpress/entities/alexei.cpp @@ -204,7 +204,7 @@ IMPLEMENT_FUNCTION(13, Alexei, function13) getData()->entityPosition = kPosition_7500; getEntities()->clearSequences(kEntityAlexei); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -239,7 +239,7 @@ IMPLEMENT_FUNCTION(14, Alexei, function14) getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); getEntities()->exitCompartment(kEntityAlexei, kObjectCompartment2, true); - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -289,7 +289,7 @@ IMPLEMENT_FUNCTION(15, Alexei, function15) getData()->location = kLocationInsideCompartment; getEntities()->drawSequenceLeft(kEntityAlexei, "103B"); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -309,7 +309,7 @@ IMPLEMENT_FUNCTION_IS(16, Alexei, function16, TimeValue) getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); getObjects()->update(kObjectHandleInsideBathroom, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -1375,7 +1375,7 @@ label_callback_3: case 2: case 5: - CALLBACK_ACTION(); + callbackAction(); break; case 3: @@ -1445,7 +1445,7 @@ IMPLEMENT_FUNCTION(36, Alexei, function36) break; case 4: - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/anna.cpp b/engines/lastexpress/entities/anna.cpp index e4a25be380..806beaee9d 100644 --- a/engines/lastexpress/entities/anna.cpp +++ b/engines/lastexpress/entities/anna.cpp @@ -225,7 +225,7 @@ IMPLEMENT_FUNCTION(12, Anna, function12) case kActionEndSound: if (params->param2) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -287,7 +287,7 @@ IMPLEMENT_FUNCTION(12, Anna, function12) getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand); getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -422,7 +422,7 @@ IMPLEMENT_FUNCTION_IS(15, Anna, function15, TimeValue) getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -575,7 +575,7 @@ IMPLEMENT_FUNCTION_II(17, Anna, function17, uint32, uint32) if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -613,7 +613,7 @@ IMPLEMENT_FUNCTION_II(17, Anna, function17, uint32, uint32) } if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -662,7 +662,7 @@ IMPLEMENT_FUNCTION_I(18, Anna, function18, TimeValue) case kActionNone: if (params->param1 && params->param1 < getState()->time && getEntities()->isSomebodyInsideRestaurantOrSalon()) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -755,7 +755,7 @@ IMPLEMENT_FUNCTION_I(18, Anna, function18, TimeValue) case kAction259136835: case kAction268773672: getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -1664,7 +1664,7 @@ IMPLEMENT_FUNCTION_II(39, Anna, function39, CarIndex, EntityPosition) if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -1685,7 +1685,7 @@ IMPLEMENT_FUNCTION_II(39, Anna, function39, CarIndex, EntityPosition) if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -1983,7 +1983,7 @@ IMPLEMENT_FUNCTION_I(45, Anna, function45, bool) case 2: getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF, true); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2193,7 +2193,7 @@ IMPLEMENT_FUNCTION(49, Anna, leaveTableWithAugust) getSavePoints()->push(kEntityAnna, kEntityTables3, kActionDrawTablesWithChairs, "010M"); getEntities()->clearSequences(kEntityAugust); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -3038,7 +3038,7 @@ IMPLEMENT_FUNCTION(60, Anna, function60) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityAnna); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3531,7 +3531,7 @@ IMPLEMENT_FUNCTION(71, Anna, function71) getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF); getData()->entityPosition = kPosition_4070; - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -3587,7 +3587,7 @@ IMPLEMENT_FUNCTION_II(72, Anna, function72, CarIndex, EntityPosition) if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -3600,7 +3600,7 @@ IMPLEMENT_FUNCTION_II(72, Anna, function72, CarIndex, EntityPosition) case kActionDefault: if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); } else if (!getEvent(kEventAnnaTired)) getData()->inventoryItem = kItemInvalid; break; diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp index c9e89ab95b..86c02e4301 100644 --- a/engines/lastexpress/entities/august.cpp +++ b/engines/lastexpress/entities/august.cpp @@ -148,7 +148,7 @@ IMPLEMENT_FUNCTION_END IMPLEMENT_FUNCTION_SI(7, August, enterExitCompartment3, ObjectIndex) if (savepoint.action == kAction4) { getEntities()->exitCompartment(kEntityAugust, (ObjectIndex)params->param4); - CALLBACK_ACTION(); + callbackAction(); return; } @@ -175,7 +175,7 @@ IMPLEMENT_FUNCTION_IIS(10, August, callSavepointNoDrawing, EntityIndex, ActionIn if (!params->param6) getSavePoints()->call(kEntityAugust, (EntityIndex)params->param1, (ActionIndex)params->param2, (char *)¶ms->seq); - CALLBACK_ACTION(); + callbackAction(); break; case kAction10: @@ -231,7 +231,7 @@ IMPLEMENT_FUNCTION_I(17, August, function17, TimeValue) case kActionNone: if (params->param1 < getState()->time && !params->param2) { params->param2 = 1; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -260,7 +260,7 @@ IMPLEMENT_FUNCTION_I(17, August, function17, TimeValue) case 1: if (ENTITY_PARAM(0, 1)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -270,7 +270,7 @@ IMPLEMENT_FUNCTION_I(17, August, function17, TimeValue) case 2: case 3: if (ENTITY_PARAM(0, 1)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -287,7 +287,7 @@ IMPLEMENT_FUNCTION_I(17, August, function17, TimeValue) case 5: if (ENTITY_PARAM(0, 1)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -306,7 +306,7 @@ IMPLEMENT_FUNCTION_II(18, August, updateEntity2, CarIndex, EntityPosition) case kActionNone: if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); } else if (getEntities()->isDistanceBetweenEntities(kEntityAugust, kEntityPlayer, 1000) && !getEntities()->isInGreenCarEntrance(kEntityPlayer) && !getEntities()->isInsideCompartments(kEntityPlayer) @@ -314,14 +314,14 @@ IMPLEMENT_FUNCTION_II(18, August, updateEntity2, CarIndex, EntityPosition) if (getData()->car == kCarGreenSleeping || getData()->car == kCarRedSleeping) { ENTITY_PARAM(0, 1) = 1; - CALLBACK_ACTION(); + callbackAction(); } } break; case kActionDefault: if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -405,7 +405,7 @@ IMPLEMENT_FUNCTION_II(19, August, function19, bool, bool) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityAugust); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -501,7 +501,7 @@ IMPLEMENT_FUNCTION_I(20, August, function20, bool) getObjects()->update(kObjectCompartment3, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); getEntities()->exitCompartment(kEntityAugust, kObjectCompartment3, true); - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -518,7 +518,7 @@ IMPLEMENT_FUNCTION_I(21, August, function21, TimeValue) getObjects()->update(kObjectCompartment3, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -784,7 +784,7 @@ IMPLEMENT_FUNCTION_I(23, August, function23, TimeValue) } else { getEntities()->exitCompartment(kEntityAugust, kObjectCompartment1, true); getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -865,7 +865,7 @@ label_callback_9: if (params->param8 >= 3) { getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -957,7 +957,7 @@ label_callback_9: case 2: getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 3: @@ -984,7 +984,7 @@ label_callback_9: getScenes()->loadScene(kScene41); - CALLBACK_ACTION(); + callbackAction(); break; case 5: @@ -1026,7 +1026,7 @@ label_callback_9: case 12: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 13: @@ -1054,7 +1054,7 @@ label_callback_9: getScenes()->loadScene(kScene41); - CALLBACK_ACTION(); + callbackAction(); break; case 15: @@ -1094,7 +1094,7 @@ IMPLEMENT_FUNCTION(24, August, dinner) getScenes()->loadSceneFromPosition(kCarRestaurant, 61); - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -2108,7 +2108,7 @@ IMPLEMENT_FUNCTION_II(41, August, function41, CarIndex, EntityPosition) getData()->inventoryItem = kItemNone; if (getEntities()->updateEntity(kEntityAugust, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -2145,7 +2145,7 @@ IMPLEMENT_FUNCTION_II(41, August, function41, CarIndex, EntityPosition) case kActionDefault: if (getEntities()->updateEntity(kEntityAugust, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -2170,7 +2170,7 @@ IMPLEMENT_FUNCTION_III(42, August, function42, CarIndex, EntityPosition, bool) if (getEntities()->updateEntity(kEntityAugust, (CarIndex)params->param1, (EntityPosition)params->param2)) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -2189,7 +2189,7 @@ IMPLEMENT_FUNCTION_III(42, August, function42, CarIndex, EntityPosition, bool) case kActionDefault: if (getEntities()->updateEntity(kEntityAugust, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -2471,7 +2471,7 @@ IMPLEMENT_FUNCTION(47, August, function47) break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp index bba07f5aa4..95ec37bf50 100644 --- a/engines/lastexpress/entities/boutarel.cpp +++ b/engines/lastexpress/entities/boutarel.cpp @@ -229,7 +229,7 @@ IMPLEMENT_FUNCTION_I(11, Boutarel, function11, bool) case 7: getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -247,7 +247,7 @@ IMPLEMENT_FUNCTION(12, Boutarel, enterTableWithMmeBoutarel) getSavePoints()->push(kEntityBoutarel, kEntityTables2, kAction136455232); getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -274,7 +274,7 @@ IMPLEMENT_FUNCTION(13, Boutarel, leaveTableWithMmeBoutarel) getSavePoints()->push(kEntityBoutarel, kEntityTables2, kActionDrawTablesWithChairs, "008F"); getEntities()->clearSequences(kEntityMmeBoutarel); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -356,7 +356,7 @@ IMPLEMENT_FUNCTION_I(14, Boutarel, function14, bool) getEntities()->clearSequences(kEntityBoutarel); getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -414,7 +414,7 @@ IMPLEMENT_FUNCTION_IS(15, Boutarel, function15, bool) case 5: getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -462,7 +462,7 @@ IMPLEMENT_FUNCTION_IS(16, Boutarel, function16, bool) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityBoutarel); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -509,7 +509,7 @@ IMPLEMENT_FUNCTION_I(18, Boutarel, function18, TimeValue) getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); getObjects()->update(kObject50, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -680,7 +680,7 @@ IMPLEMENT_FUNCTION(20, Boutarel, function20) case 4: getSavePoints()->push(kEntityBoutarel, kEntityCooks, kAction224849280); - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp index b9384cbab9..eab4dfe2c1 100644 --- a/engines/lastexpress/entities/chapters.cpp +++ b/engines/lastexpress/entities/chapters.cpp @@ -150,7 +150,7 @@ IMPLEMENT_FUNCTION(5, Chapters, resetMainEntities) RESET_ENTITY_STATE(kEntityVesna, Vesna, setup_reset); RESET_ENTITY_STATE(kEntityYasmin, Yasmin, setup_reset); - CALLBACK_ACTION(); + callbackAction(); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// @@ -189,7 +189,7 @@ IMPLEMENT_FUNCTION(6, Chapters, chapter1End) getScenes()->loadScene(kScene41); - CALLBACK_ACTION(); + callbackAction(); } else { getSound()->playSound(kEntityPlayer, "LIB014"); getSound()->playSound(kEntityPlayer, "LIB015", kFlagDefault, 15); @@ -1813,7 +1813,7 @@ void Chapters::enterExitHelper(bool isEnteringStation) { ENTITY_PARAM(0, 3) = 1; } - CALLBACK_ACTION(); + callbackAction(); } } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/cooks.cpp b/engines/lastexpress/entities/cooks.cpp index d962d21f8a..63494e6062 100644 --- a/engines/lastexpress/entities/cooks.cpp +++ b/engines/lastexpress/entities/cooks.cpp @@ -94,7 +94,7 @@ IMPLEMENT_FUNCTION(3, Cooks, function3) case kActionDrawScene: if (!getEntities()->isInKitchen(kEntityPlayer)) { getEntities()->clearSequences(kEntityCooks); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -106,7 +106,7 @@ IMPLEMENT_FUNCTION(3, Cooks, function3) if (!getEntities()->hasValidFrame(kEntityCooks)) { getSound()->playSound(kEntityCooks, "LIB015"); getEntities()->clearSequences(kEntityCooks); - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -120,7 +120,7 @@ IMPLEMENT_FUNCTION(3, Cooks, function3) if (params->param1 && !getEntities()->hasValidFrame(kEntityCooks)) { getSound()->playSound(kEntityCooks, "LIB015"); getEntities()->clearSequences(kEntityCooks); - CALLBACK_ACTION(); + callbackAction(); } break; @@ -180,7 +180,7 @@ IMPLEMENT_FUNCTION(4, Cooks, function4) case kActionDrawScene: if (!getEntities()->isInKitchen(kEntityPlayer)) { getEntities()->clearSequences(kEntityCooks); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -192,7 +192,7 @@ IMPLEMENT_FUNCTION(4, Cooks, function4) if (!getEntities()->hasValidFrame(kEntityCooks)) { getSound()->playSound(kEntityCooks, "LIB015"); getEntities()->clearSequences(kEntityCooks); - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -206,7 +206,7 @@ IMPLEMENT_FUNCTION(4, Cooks, function4) if (params->param1 && !getEntities()->hasValidFrame(kEntityCooks)) { getSound()->playSound(kEntityCooks, "LIB015"); getEntities()->clearSequences(kEntityCooks); - CALLBACK_ACTION(); + callbackAction(); } break; diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index e735f50d52..dc7beb3167 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -128,7 +128,7 @@ IMPLEMENT_FUNCTION_S(2, Coudert, bloodJacket) break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -173,7 +173,7 @@ IMPLEMENT_FUNCTION(4, Coudert, callbackActionOnDirection) case kActionNone: if (getData()->direction != kDirectionRight) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -181,7 +181,7 @@ IMPLEMENT_FUNCTION(4, Coudert, callbackActionOnDirection) break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -225,7 +225,7 @@ IMPLEMENT_FUNCTION_S(6, Coudert, playSound) break; case kActionEndSound: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -254,7 +254,7 @@ IMPLEMENT_FUNCTION_NOSETUP(7, Coudert, playSound16) break; case kActionEndSound: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -294,7 +294,7 @@ IMPLEMENT_FUNCTION_II(9, Coudert, updateEntity, CarIndex, EntityPosition) if (getEntities()->updateEntity(kEntityCoudert, (CarIndex)params->param1, (EntityPosition)params->param2)) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -330,7 +330,7 @@ IMPLEMENT_FUNCTION_II(9, Coudert, updateEntity, CarIndex, EntityPosition) params->param3 = kItemInvalid; if (getEntities()->updateEntity(kEntityCoudert, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -367,7 +367,7 @@ IMPLEMENT_FUNCTION_I(10, Coudert, updateFromTime, uint32) UPDATE_PARAM(params->param2, getState()->time, params->param1); - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -390,7 +390,7 @@ IMPLEMENT_FUNCTION_I(11, Coudert, updateFromTicks, uint32) UPDATE_PARAM(params->param2, getState()->timeTicks, params->param1); - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -410,7 +410,7 @@ IMPLEMENT_FUNCTION_I(12, Coudert, excuseMe, EntityIndex) return; if (getSoundQueue()->isBuffered(kEntityCoudert)) { - CALLBACK_ACTION(); + callbackAction(); return; } @@ -450,7 +450,7 @@ IMPLEMENT_FUNCTION_I(12, Coudert, excuseMe, EntityIndex) getSound()->playSound(kEntityCoudert, "JAC1112E"); } - CALLBACK_ACTION(); + callbackAction(); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// @@ -559,7 +559,7 @@ IMPLEMENT_FUNCTION_II(13, Coudert, function13, bool, EntityIndex) case 5: case 6: case 7: - CALLBACK_ACTION(); + callbackAction(); break; case 9: @@ -627,7 +627,7 @@ IMPLEMENT_FUNCTION_I(14, Coudert, function14, EntityIndex) break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -704,7 +704,7 @@ IMPLEMENT_FUNCTION_I(15, Coudert, function15, bool) break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -722,7 +722,7 @@ IMPLEMENT_FUNCTION(16, Coudert, function16) ENTITY_PARAM(2, 1) = 0; getInventory()->setLocationAndProcess(kItem5, kObjectLocation1); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -741,7 +741,7 @@ IMPLEMENT_FUNCTION(16, Coudert, function16) if (!getEntities()->isPlayerPosition(kCarRedSleeping, 2)) getData()->entityPosition = kPosition_2088; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -759,7 +759,7 @@ IMPLEMENT_FUNCTION_I(17, Coudert, function17, bool) if (ENTITY_PARAM(2, 1)) { ENTITY_PARAM(2, 1) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -787,7 +787,7 @@ IMPLEMENT_FUNCTION_I(17, Coudert, function17, bool) case 1: case 2: case 3: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -815,7 +815,7 @@ IMPLEMENT_FUNCTION(18, Coudert, function18) getEntities()->drawSequenceLeft(kEntityCoudert, "627K"); getScenes()->loadSceneFromItemPosition(kItem5); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -847,7 +847,7 @@ IMPLEMENT_FUNCTION(18, Coudert, function18) break; case 2: - CALLBACK_ACTION(); + callbackAction(); break; case 3: @@ -855,7 +855,7 @@ IMPLEMENT_FUNCTION(18, Coudert, function18) ENTITY_PARAM(0, 1) = 0; getSavePoints()->push(kEntityCoudert, kEntityCoudert, kActionDrawScene); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -874,14 +874,14 @@ IMPLEMENT_FUNCTION_I(19, Coudert, function19, bool) || ENTITY_PARAM(2, 4) || ENTITY_PARAM(2, 6)) { getInventory()->setLocationAndProcess(kItem5, kObjectLocation1); ENTITY_PARAM(2, 1) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } if (ENTITY_PARAM(0, 3) || ENTITY_PARAM(0, 5) || ENTITY_PARAM(0, 4)) { getScenes()->loadSceneFromItemPosition(kItem5); ENTITY_PARAM(2, 1) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -901,7 +901,7 @@ IMPLEMENT_FUNCTION_I(19, Coudert, function19, bool) getEntities()->drawSequenceLeft(kEntityCoudert, ENTITY_PARAM(0, 2) ? "627B" : "627E"); ENTITY_PARAM(0, 1) = 0; - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -928,7 +928,7 @@ IMPLEMENT_FUNCTION_II(20, Coudert, function20, ObjectIndex, ObjectIndex) if (params->param2) getObjects()->update((ObjectIndex)params->param2, (EntityIndex)params->param7, (ObjectLocation)params->param8, (CursorStyle)CURRENT_PARAM(1, 1), (CursorStyle)CURRENT_PARAM(1, 2)); - CALLBACK_ACTION(); + callbackAction(); break; case kActionKnock: @@ -1042,7 +1042,7 @@ IMPLEMENT_FUNCTION(21, Coudert, function21) case 5: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1071,7 +1071,7 @@ IMPLEMENT_FUNCTION(21, Coudert, function21) getData()->location = kLocationOutsideCompartment; getSavePoints()->push(kEntityCoudert, kEntityIvo, kAction123852928); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1143,7 +1143,7 @@ IMPLEMENT_FUNCTION(22, Coudert, function22) case 5: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1172,7 +1172,7 @@ IMPLEMENT_FUNCTION(22, Coudert, function22) getData()->location = kLocationOutsideCompartment; getSavePoints()->push(kEntityCoudert, kEntityMilos, kAction123852928); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1223,7 +1223,7 @@ IMPLEMENT_FUNCTION(23, Coudert, function23) case 3: getEntities()->exitCompartment(kEntityCoudert, kObjectCompartmentF, true); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1294,7 +1294,7 @@ IMPLEMENT_FUNCTION(25, Coudert, function25) getData()->location = kLocationOutsideCompartment; getSavePoints()->push(kEntityCoudert, kEntityRebecca, kAction123852928); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1355,7 +1355,7 @@ IMPLEMENT_FUNCTION(26, Coudert, function26) case 5: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1373,7 +1373,7 @@ IMPLEMENT_FUNCTION(26, Coudert, function26) getData()->location = kLocationOutsideCompartment; getSavePoints()->push(kEntityCoudert, kEntityMmeBoutarel, kAction123852928); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1444,7 +1444,7 @@ IMPLEMENT_FUNCTION(27, Coudert, function27) case 5: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1471,7 +1471,7 @@ IMPLEMENT_FUNCTION(27, Coudert, function27) getData()->location = kLocationOutsideCompartment; getSavePoints()->push(kEntityCoudert, kEntityBoutarel, kAction123852928); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1513,7 +1513,7 @@ IMPLEMENT_FUNCTION_I(30, Coudert, function30, ObjectIndex) case kActionDefault: switch (parameters->param1) { default: - CALLBACK_ACTION(); + callbackAction(); // Stop processing here return; @@ -1613,7 +1613,7 @@ IMPLEMENT_FUNCTION_I(30, Coudert, function30, ObjectIndex) break; case 6: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1652,7 +1652,7 @@ IMPLEMENT_FUNCTION_I(31, Coudert, function31, uint32) case 2: case 3: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1697,7 +1697,7 @@ IMPLEMENT_FUNCTION(32, Coudert, function32) break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1724,7 +1724,7 @@ IMPLEMENT_FUNCTION(33, Coudert, function33) setup_updateEntity(kCarRedSleeping, kPosition_540); } } else { - CALLBACK_ACTION(); + callbackAction(); } break; @@ -1761,7 +1761,7 @@ IMPLEMENT_FUNCTION(33, Coudert, function33) case 4: ENTITY_PARAM(2, 6) = 0; - CALLBACK_ACTION(); + callbackAction(); break; case 5: @@ -1806,7 +1806,7 @@ IMPLEMENT_FUNCTION(33, Coudert, function33) case 10: ENTITY_PARAM(2, 6) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1880,7 +1880,7 @@ IMPLEMENT_FUNCTION_I(34, Coudert, function34, bool) break; case 7: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1949,7 +1949,7 @@ IMPLEMENT_FUNCTION_I(35, Coudert, function35, bool) break; case 4: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2172,7 +2172,7 @@ IMPLEMENT_FUNCTION(39, Coudert, function39) getSavePoints()->push(kEntityCoudert, kEntityVerges, kAction167854368); ENTITY_PARAM(2, 2) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2534,7 +2534,7 @@ IMPLEMENT_FUNCTION(41, Coudert, function41) case 18: getSavePoints()->push(kEntityCoudert, kEntityMilos, kAction208228224); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3049,7 +3049,7 @@ IMPLEMENT_FUNCTION(46, Coudert, function46) break; case 11: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3114,7 +3114,7 @@ IMPLEMENT_FUNCTION_I(47, Coudert, function47, bool) break; case 7: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3162,7 +3162,7 @@ IMPLEMENT_FUNCTION(48, Coudert, function48) break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3259,7 +3259,7 @@ IMPLEMENT_FUNCTION(49, Coudert, function49) break; case 11: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3345,7 +3345,7 @@ IMPLEMENT_FUNCTION(50, Coudert, function50) break; case 9: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3694,7 +3694,7 @@ IMPLEMENT_FUNCTION(54, Coudert, function54) break; case 3: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3762,7 +3762,7 @@ IMPLEMENT_FUNCTION(55, Coudert, function55) break; case 7: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3866,7 +3866,7 @@ IMPLEMENT_FUNCTION(56, Coudert, function56) break; case 16: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -4166,7 +4166,7 @@ void Coudert::visitCompartment(const SavePoint &savepoint, EntityPosition positi case 6: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index dbce2246d0..7fdfd53d2f 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -242,12 +242,12 @@ void Entity::savegame(const SavePoint &savepoint) { break; case kActionNone: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: getSaveLoad()->saveGame((SavegameType)params->param1, _entityIndex, (EventIndex)params->param2); - CALLBACK_ACTION(); + callbackAction(); break; } } @@ -260,7 +260,7 @@ void Entity::playSound(const SavePoint &savepoint, bool resetItem, SoundFlag fla break; case kActionEndSound: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -280,7 +280,7 @@ void Entity::draw(const SavePoint &savepoint, bool handleExcuseMe) { break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMeCath: @@ -304,7 +304,7 @@ void Entity::draw2(const SavePoint &savepoint) { break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -323,7 +323,7 @@ void Entity::updateFromTicks(const SavePoint &savepoint) { case kActionNone: UPDATE_PARAM(params->param2, getState()->timeTicks, params->param1) - CALLBACK_ACTION(); + callbackAction(); break; } } @@ -337,7 +337,7 @@ void Entity::updateFromTime(const SavePoint &savepoint) { case kActionNone: UPDATE_PARAM(params->param2, getState()->time, params->param1) - CALLBACK_ACTION(); + callbackAction(); break; } } @@ -348,12 +348,12 @@ void Entity::callbackActionOnDirection(const SavePoint &savepoint) { break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: if (getData()->direction != kDirectionRight) - CALLBACK_ACTION(); + callbackAction(); break; } } @@ -366,7 +366,7 @@ void Entity::callbackActionRestaurantOrSalon(const SavePoint &savepoint) { case kActionNone: case kActionDefault: if (getEntities()->isSomebodyInsideRestaurantOrSalon()) - CALLBACK_ACTION(); + callbackAction(); break; } } @@ -391,7 +391,7 @@ void Entity::updateEntity(const SavePoint &savepoint, bool handleExcuseMe) { case kActionNone: case kActionDefault: if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; } } @@ -406,7 +406,7 @@ void Entity::callSavepoint(const SavePoint &savepoint, bool handleExcuseMe) { case kActionExitCompartment: if (!CURRENT_PARAM(1, 1)) getSavePoints()->call(_entityIndex, (EntityIndex)params->param4, (ActionIndex)params->param5, (char *)¶ms->seq2); - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMeCath: @@ -444,7 +444,7 @@ void Entity::enterExitCompartment(const SavePoint &savepoint, EntityPosition pos if (updateLocation) getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -473,7 +473,7 @@ void Entity::updatePosition(const SavePoint &savepoint, bool handleExcuseMe) { case kActionExitCompartment: getEntities()->updatePositionExit(_entityIndex, (CarIndex)params->param4, (Position)params->param5); - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMeCath: @@ -490,4 +490,15 @@ void Entity::updatePosition(const SavePoint &savepoint, bool handleExcuseMe) { } } +void Entity::callbackAction() { + if (getData()->currentCall == 0) + error("[Entity::callbackAction] currentCall is already 0, cannot proceed"); + + getData()->currentCall--; + + getSavePoints()->setCallback(_entityIndex, _callbacks[_data->getCurrentCallback()]); + + getSavePoints()->call(_entityIndex, _entityIndex, kActionCallback); +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 039f461c7b..3fd2009313 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -784,13 +784,18 @@ protected: /** * Updates the position * - * @param savepoint The savepoint + * @param savepoint The savepoint * - Sequence name * - CarIndex * - Position * @param handleExcuseMe true to handle excuseMe actions */ void updatePosition(const SavePoint &savepoint, bool handleExcuseMe = false); + + /** + * Store the current callback information and perform the callback action + */ + void callbackAction(); }; diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 2da0da15b3..c21f2c14e2 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -378,7 +378,7 @@ void class::setup_##name() { \ #define TIME_CHECK_CALLBACK_ACTION(timeValue, parameter) \ if (getState()->time > timeValue && !parameter) { \ parameter = 1; \ - CALLBACK_ACTION(); \ + callbackAction(); \ break; \ } @@ -408,17 +408,6 @@ void class::setup_##name() { \ } \ } -////////////////////////////////////////////////////////////////////////// -// Callback action -////////////////////////////////////////////////////////////////////////// -#define CALLBACK_ACTION() { \ - if (getData()->currentCall == 0) \ - error("[CALLBACK_ACTION] currentCall is already 0, cannot proceed"); \ - getData()->currentCall--; \ - getSavePoints()->setCallback(_entityIndex, _callbacks[_data->getCurrentCallback()]); \ - getSavePoints()->call(_entityIndex, _entityIndex, kActionCallback); \ - } - ////////////////////////////////////////////////////////////////////////// // Param update ////////////////////////////////////////////////////////////////////////// @@ -486,7 +475,7 @@ void class::setup_##name() { \ case 2: \ getData()->entityPosition = positionFrom; \ getEntities()->clearSequences(_entityIndex); \ - CALLBACK_ACTION(); \ + callbackAction(); \ } \ break; \ } @@ -516,7 +505,7 @@ void class::setup_##name() { \ case 3: \ getData()->location = kLocationInsideCompartment; \ getEntities()->clearSequences(_entityIndex); \ - CALLBACK_ACTION(); \ + callbackAction(); \ break; \ } \ break; \ diff --git a/engines/lastexpress/entities/francois.cpp b/engines/lastexpress/entities/francois.cpp index 3cbfc68734..b99dbe466b 100644 --- a/engines/lastexpress/entities/francois.cpp +++ b/engines/lastexpress/entities/francois.cpp @@ -113,7 +113,7 @@ IMPLEMENT_FUNCTION_II(8, Francois, updateEntity, CarIndex, EntityPosition) case kActionNone: if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); } else { if (!getEntities()->isDistanceBetweenEntities(kEntityFrancois, kEntityPlayer, 2000) || !getInventory()->hasItem(kItemFirebird) @@ -168,7 +168,7 @@ IMPLEMENT_FUNCTION_II(8, Francois, updateEntity, CarIndex, EntityPosition) case kActionDefault: if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -224,7 +224,7 @@ IMPLEMENT_FUNCTION(9, Francois, function9) case 2: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -262,7 +262,7 @@ IMPLEMENT_FUNCTION(10, Francois, function10) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityFrancois); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -441,7 +441,7 @@ label_callback: break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -464,7 +464,7 @@ label_callback: getData()->field_4A3 = 30; getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); break; case kAction205346192: @@ -523,7 +523,7 @@ IMPLEMENT_FUNCTION(12, Francois, function12) break; case 7: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -608,7 +608,7 @@ IMPLEMENT_FUNCTION(13, Francois, function13) break; case 11: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -707,7 +707,7 @@ IMPLEMENT_FUNCTION_IIS(14, Francois, function14, ObjectIndex, EntityPosition) break; case 13: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -763,7 +763,7 @@ IMPLEMENT_FUNCTION(15, Francois, function15) case 7: if (!getEntities()->isInsideCompartment(kEntityMmeBoutarel, kCarRedSleeping, kPosition_5790)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -772,7 +772,7 @@ IMPLEMENT_FUNCTION(15, Francois, function15) break; case 8: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -829,7 +829,7 @@ IMPLEMENT_FUNCTION(16, Francois, function16) getData()->entityPosition = kPosition_5790; getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/gendarmes.cpp b/engines/lastexpress/entities/gendarmes.cpp index 6f08c4cd62..877c0c29b3 100644 --- a/engines/lastexpress/entities/gendarmes.cpp +++ b/engines/lastexpress/entities/gendarmes.cpp @@ -194,7 +194,7 @@ IMPLEMENT_FUNCTION_IISS(9, Gendarmes, function9, CarIndex, EntityPosition) break; case 1: - CALLBACK_ACTION(); + callbackAction(); break; case 2: @@ -232,7 +232,7 @@ IMPLEMENT_FUNCTION_IISS(9, Gendarmes, function9, CarIndex, EntityPosition) case 6: getData()->location = kLocationOutsideCompartment; getEntities()->exitCompartment(kEntityGendarmes, (ObjectIndex)parameters2->param5); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -270,7 +270,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje if (!params->param4 && getEntities()->isOutsideAlexeiWindow()) { getObjects()->update((ObjectIndex)params->param3, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); } else { if (getEntities()->isOutsideAlexeiWindow()) getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49); @@ -321,7 +321,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneGameOverBloodJacket, true); getObjects()->update((ObjectIndex)params->param3, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 4: @@ -329,7 +329,7 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneGameOverPolice1, true); getObjects()->update((ObjectIndex)params->param3, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 5: @@ -557,7 +557,7 @@ void Gendarmes::arrest(const SavePoint &savepoint, bool shouldPlaySound, SoundFl if (shouldUpdateEntity) { EXPOSE_PARAMS(EntityData::EntityParametersIIII); if (getEntities()->updateEntity(kEntityGendarmes, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); break; } } @@ -581,7 +581,7 @@ void Gendarmes::arrest(const SavePoint &savepoint, bool shouldPlaySound, SoundFl break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -598,7 +598,7 @@ void Gendarmes::arrest(const SavePoint &savepoint, bool shouldPlaySound, SoundFl if (shouldUpdateEntity) { EXPOSE_PARAMS(EntityData::EntityParametersIIII); if (getEntities()->updateEntity(kEntityGendarmes, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); break; } } diff --git a/engines/lastexpress/entities/ivo.cpp b/engines/lastexpress/entities/ivo.cpp index a097251f0d..cb0fb92b74 100644 --- a/engines/lastexpress/entities/ivo.cpp +++ b/engines/lastexpress/entities/ivo.cpp @@ -181,7 +181,7 @@ IMPLEMENT_FUNCTION(11, Ivo, function11) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityIvo); - CALLBACK_ACTION(); + callbackAction(); break; case 4: @@ -190,7 +190,7 @@ IMPLEMENT_FUNCTION(11, Ivo, function11) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityIvo); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -207,7 +207,7 @@ IMPLEMENT_FUNCTION(12, Ivo, sitAtTableWithSalko) getEntities()->clearSequences(kEntitySalko); getSavePoints()->push(kEntityIvo, kEntityTables2, kAction136455232); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -228,7 +228,7 @@ IMPLEMENT_FUNCTION(13, Ivo, leaveTableWithSalko) getSavePoints()->push(kEntityIvo, kEntityTables2, kActionDrawTablesWithChairs, "009E"); getEntities()->clearSequences(kEntitySalko); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: diff --git a/engines/lastexpress/entities/kahina.cpp b/engines/lastexpress/entities/kahina.cpp index 8916f14911..0c4045097a 100644 --- a/engines/lastexpress/entities/kahina.cpp +++ b/engines/lastexpress/entities/kahina.cpp @@ -88,7 +88,7 @@ IMPLEMENT_FUNCTION_END IMPLEMENT_FUNCTION_I(4, Kahina, updateFromTime, uint32) if (savepoint.action == kAction137503360) { ENTITY_PARAM(0, 2) = 1; - CALLBACK_ACTION(); + callbackAction(); } Entity::updateFromTime(savepoint); @@ -109,7 +109,7 @@ IMPLEMENT_FUNCTION_I(6, Kahina, function6, TimeValue) if (params->param1 < getState()->time && !params->param2) { params->param2 = 1; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -139,7 +139,7 @@ IMPLEMENT_FUNCTION_I(6, Kahina, function6, TimeValue) case 1: if (ENTITY_PARAM(0, 1) || ENTITY_PARAM(0, 2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -149,7 +149,7 @@ IMPLEMENT_FUNCTION_I(6, Kahina, function6, TimeValue) case 2: case 3: if (ENTITY_PARAM(0, 1) || ENTITY_PARAM(0, 2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -161,7 +161,7 @@ IMPLEMENT_FUNCTION_I(6, Kahina, function6, TimeValue) case 4: if (ENTITY_PARAM(0, 2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -171,7 +171,7 @@ IMPLEMENT_FUNCTION_I(6, Kahina, function6, TimeValue) case 5: if (ENTITY_PARAM(0, 1) || ENTITY_PARAM(0, 2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -183,7 +183,7 @@ IMPLEMENT_FUNCTION_I(6, Kahina, function6, TimeValue) case kAction137503360: ENTITY_PARAM(0, 2) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -196,12 +196,12 @@ IMPLEMENT_FUNCTION_II(7, Kahina, updateEntity2, CarIndex, EntityPosition) case kActionNone: if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: if (getEntities()->updateEntity(_entityIndex, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); } else if (getEntities()->isDistanceBetweenEntities(kEntityKahina, kEntityPlayer, 1000) && !getEntities()->isInGreenCarEntrance(kEntityPlayer) && !getEntities()->isInsideCompartments(kEntityPlayer) @@ -209,14 +209,14 @@ IMPLEMENT_FUNCTION_II(7, Kahina, updateEntity2, CarIndex, EntityPosition) if (getData()->car == kCarGreenSleeping || getData()->car == kCarRedSleeping) { ENTITY_PARAM(0, 1) = 1; - CALLBACK_ACTION(); + callbackAction(); } } break; case kAction137503360: ENTITY_PARAM(0, 2) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -370,12 +370,12 @@ IMPLEMENT_FUNCTION(14, Kahina, function14) case kActionExitCompartment: getEntities()->exitCompartment(kEntityKahina, kObjectCompartmentF); - CALLBACK_ACTION(); + callbackAction(); break; case kAction4: getEntities()->exitCompartment(kEntityKahina, kObjectCompartmentF); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -540,7 +540,7 @@ IMPLEMENT_FUNCTION(15, Kahina, function15) case 17: getEntities()->clearSequences(kEntityKahina); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -727,7 +727,7 @@ IMPLEMENT_FUNCTION_II(19, Kahina, function19, CarIndex, EntityPosition) RESET_ENTITY_STATE(kEntityKahina, Kahina, setup_function22); if (getEntities()->updateEntity(kEntityKahina, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMeCath: @@ -743,7 +743,7 @@ IMPLEMENT_FUNCTION_II(19, Kahina, function19, CarIndex, EntityPosition) case kActionDefault: if (getEntities()->updateEntity(kEntityKahina, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -1123,7 +1123,7 @@ IMPLEMENT_FUNCTION(23, Kahina, function23) case 7: getEntities()->clearSequences(kEntityKahina); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1260,7 +1260,7 @@ IMPLEMENT_FUNCTION(25, Kahina, function25) getProgress().field_78 = 1; ENTITY_PARAM(0, 3) = 0; - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -1301,7 +1301,7 @@ IMPLEMENT_FUNCTION(25, Kahina, function25) case 13: getEntities()->clearSequences(kEntityKahina); - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1385,7 +1385,7 @@ IMPLEMENT_FUNCTION(26, Kahina, function26) getInventory()->setLocationAndProcess(kItemBriefcase, kObjectLocation2); getProgress().field_78 = 1; - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -1427,7 +1427,7 @@ IMPLEMENT_FUNCTION(26, Kahina, function26) case 9: getEntities()->clearSequences(kEntityKahina); - CALLBACK_ACTION(); + callbackAction(); break; case 6: diff --git a/engines/lastexpress/entities/mahmud.cpp b/engines/lastexpress/entities/mahmud.cpp index a6fbd1a443..ebe754bfa4 100644 --- a/engines/lastexpress/entities/mahmud.cpp +++ b/engines/lastexpress/entities/mahmud.cpp @@ -93,7 +93,7 @@ IMPLEMENT_FUNCTION_SIII(4, Mahmud, enterExitCompartment2, ObjectIndex, uint32, O case kActionExitCompartment: getEntities()->exitCompartment(kEntityMahmud, (ObjectIndex)params->param4); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -265,7 +265,7 @@ IMPLEMENT_FUNCTION_II(10, Mahmud, function10, ObjectIndex, bool) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityMahmud); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -390,7 +390,7 @@ IMPLEMENT_FUNCTION(11, Mahmud, function11) getEntities()->clearSequences(kEntityMahmud); getObjects()->update(kObjectCompartment4, kEntityMahmud, kObjectLocation3, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -469,7 +469,7 @@ IMPLEMENT_FUNCTION(12, Mahmud, function12) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityMahmud); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -535,7 +535,7 @@ IMPLEMENT_FUNCTION(13, Mahmud, function13) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityMahmud); - CALLBACK_ACTION(); + callbackAction(); break; } diff --git a/engines/lastexpress/entities/max.cpp b/engines/lastexpress/entities/max.cpp index 7911a5e5b6..cecfe64dc6 100644 --- a/engines/lastexpress/entities/max.cpp +++ b/engines/lastexpress/entities/max.cpp @@ -184,7 +184,7 @@ IMPLEMENT_FUNCTION(7, Max, function7) case kAction101687594: getEntities()->clearSequences(kEntityMax); - CALLBACK_ACTION(); + callbackAction(); break; case kAction122358304: @@ -193,7 +193,7 @@ IMPLEMENT_FUNCTION(7, Max, function7) getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); getObjects()->update(kObject53, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case kAction158007856: diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index e465bac3c9..5672fe4d49 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -119,7 +119,7 @@ IMPLEMENT_FUNCTION_S(2, Mertens, bloodJacket) break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -168,7 +168,7 @@ IMPLEMENT_FUNCTION_SI(4, Mertens, enterExitCompartment2, ObjectIndex) case kAction4: getEntities()->exitCompartment(kEntityMertens, (ObjectIndex)params->param4); - CALLBACK_ACTION(); + callbackAction(); return; case kActionCallback: @@ -195,7 +195,7 @@ IMPLEMENT_FUNCTION_SIII(5, Mertens, enterExitCompartment3, ObjectIndex, EntityPo case kActionExitCompartment: getEntities()->exitCompartment(_entityIndex, (ObjectIndex)params->param4); getData()->entityPosition = (EntityPosition)params->param5; - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -227,7 +227,7 @@ IMPLEMENT_FUNCTION(6, Mertens, callbackActionOnDirection) case kActionNone: if (getData()->direction != kDirectionRight) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -235,7 +235,7 @@ IMPLEMENT_FUNCTION(6, Mertens, callbackActionOnDirection) break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -258,7 +258,7 @@ IMPLEMENT_FUNCTION_S(7, Mertens, playSound) break; case kActionEndSound: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -285,7 +285,7 @@ IMPLEMENT_FUNCTION_S(8, Mertens, playSound16) break; case kActionEndSound: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -331,7 +331,7 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition) || getEntities()->checkFields10(kEntityPlayer)) { if (getEntities()->updateEntity(kEntityMertens, (CarIndex)params->param1, (EntityPosition)params->param2)) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -362,7 +362,7 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition) if (getEntities()->updateEntity(kEntityMertens, (CarIndex)params->param1, (EntityPosition)params->param2)) { getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -393,7 +393,7 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition) params->param3 = 1; if (getEntities()->updateEntity(kEntityMertens, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -426,7 +426,7 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition) getEntities()->updateEntity(kEntityMertens, kCarGreenSleeping, kPosition_2000); getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + 750)); - CALLBACK_ACTION(); + callbackAction(); break; case 3: @@ -442,7 +442,7 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition) getEntities()->updateEntity(kEntityMertens, kCarGreenSleeping, kPosition_2000); getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + 750)); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -484,7 +484,7 @@ IMPLEMENT_FUNCTION_I(11, Mertens, function11, uint32) UPDATE_PARAM(params->param2, getState()->time, params->param1) - CALLBACK_ACTION(); + callbackAction(); break; case kActionCallback: @@ -504,7 +504,7 @@ IMPLEMENT_FUNCTION_I(12, Mertens, bonsoir, EntityIndex) return; if (getSoundQueue()->isBuffered(kEntityMertens)) { - CALLBACK_ACTION(); + callbackAction(); return; } @@ -538,7 +538,7 @@ IMPLEMENT_FUNCTION_I(12, Mertens, bonsoir, EntityIndex) getSound()->playSound(kEntityMertens, "CON1112G"); } - CALLBACK_ACTION(); + callbackAction(); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// @@ -638,7 +638,7 @@ IMPLEMENT_FUNCTION_II(13, Mertens, function13, bool, bool) case 6: case 9: case 10: - CALLBACK_ACTION(); + callbackAction(); break; case 7: @@ -717,7 +717,7 @@ IMPLEMENT_FUNCTION_I(14, Mertens, function14, EntityIndex) break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -781,7 +781,7 @@ IMPLEMENT_FUNCTION_I(15, Mertens, function15, bool) break; case 6: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -858,7 +858,7 @@ IMPLEMENT_FUNCTION_I(16, Mertens, function16, bool) break; case 6: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -886,7 +886,7 @@ IMPLEMENT_FUNCTION(17, Mertens, function17) getScenes()->loadSceneFromItemPosition(kItem7); ENTITY_PARAM(2, 1) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -924,7 +924,7 @@ IMPLEMENT_FUNCTION(17, Mertens, function17) break; case 2: - CALLBACK_ACTION(); + callbackAction(); break; case 3: @@ -942,7 +942,7 @@ IMPLEMENT_FUNCTION(17, Mertens, function17) getSavePoints()->push(kEntityMertens, kEntityMertens, kActionDrawScene); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -968,7 +968,7 @@ IMPLEMENT_FUNCTION(18, Mertens, function18) getInventory()->setLocationAndProcess(kItem7, kObjectLocation1); ENTITY_PARAM(2, 1) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -976,7 +976,7 @@ IMPLEMENT_FUNCTION(18, Mertens, function18) getScenes()->loadSceneFromItemPosition(kItem7); ENTITY_PARAM(2, 1) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -1007,7 +1007,7 @@ IMPLEMENT_FUNCTION(18, Mertens, function18) ENTITY_PARAM(0, 1) = 0; getData()->inventoryItem = kItemNone; - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -1023,7 +1023,7 @@ IMPLEMENT_FUNCTION(19, Mertens, function19) if (ENTITY_PARAM(2, 1)) { getInventory()->setLocationAndProcess(kItem7, kObjectLocation1); ENTITY_PARAM(2, 1) = 0; - CALLBACK_ACTION(); + callbackAction(); } else { setCallback(1); setup_bloodJacket("601C"); @@ -1037,7 +1037,7 @@ IMPLEMENT_FUNCTION(19, Mertens, function19) if (!getEntities()->isPlayerPosition(kCarGreenSleeping, 2)) getData()->entityPosition = kPosition_2088; - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -1055,7 +1055,7 @@ IMPLEMENT_FUNCTION(20, Mertens, function20) if (ENTITY_PARAM(2, 1)) { ENTITY_PARAM(2, 1) = 0; - CALLBACK_ACTION(); + callbackAction(); } else { setCallback(1); setup_bloodJacket("601C"); @@ -1064,7 +1064,7 @@ IMPLEMENT_FUNCTION(20, Mertens, function20) case kActionCallback: if (getCallback() == 1) - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -1090,7 +1090,7 @@ IMPLEMENT_FUNCTION_II(21, Mertens, function21, ObjectIndex, ObjectIndex) if (params->param2) getObjects()->update((ObjectIndex)params->param2, (EntityIndex)params->param8, (ObjectLocation)CURRENT_PARAM(1, 1), (CursorStyle)CURRENT_PARAM(1, 2), (CursorStyle)CURRENT_PARAM(1, 3)); - CALLBACK_ACTION(); + callbackAction(); break; case kActionKnock: @@ -1220,7 +1220,7 @@ IMPLEMENT_FUNCTION(22, Mertens, function22) break; case 9: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1289,7 +1289,7 @@ IMPLEMENT_FUNCTION(23, Mertens, function23) case 6: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1349,7 +1349,7 @@ IMPLEMENT_FUNCTION(24, Mertens, function24) case 5: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1378,7 +1378,7 @@ IMPLEMENT_FUNCTION(24, Mertens, function24) break; case 9: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1456,7 +1456,7 @@ IMPLEMENT_FUNCTION(25, Mertens, function25) case 5: getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1490,7 +1490,7 @@ IMPLEMENT_FUNCTION(25, Mertens, function25) break; case 9: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1545,7 +1545,7 @@ IMPLEMENT_FUNCTION_I(26, Mertens, function26, bool) case 2: getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 3: @@ -1611,7 +1611,7 @@ IMPLEMENT_FUNCTION_I(26, Mertens, function26, bool) getData()->location = kLocationOutsideCompartment; getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1626,7 +1626,7 @@ IMPLEMENT_FUNCTION_I(27, Mertens, tylerCompartment, MertensActionType) case kActionNone: if (getProgress().field_14 == 29) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -1678,7 +1678,7 @@ label_callback11: getSound()->playSound(kEntityPlayer, "LIB015"); getScenes()->loadScene(kScene41); - CALLBACK_ACTION(); + callbackAction(); break; } } else { @@ -1736,7 +1736,7 @@ label_callback11: getSound()->playSound(kEntityPlayer, "LIB015"); getScenes()->loadScene(kScene41); - CALLBACK_ACTION(); + callbackAction(); break; } } else { @@ -1761,7 +1761,7 @@ label_callback11: default: getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 1: @@ -1819,7 +1819,7 @@ label_callback11: getSound()->playSound(kEntityPlayer, "LIB015"); getScenes()->loadScene(kScene41); - CALLBACK_ACTION(); + callbackAction(); break; } } else { @@ -1928,7 +1928,7 @@ label_callback11: getData()->location = kLocationOutsideCompartment; getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 8: @@ -1955,7 +1955,7 @@ label_callback11: case 19: case 22: case 28: - CALLBACK_ACTION(); + callbackAction(); break; case 15: @@ -1967,7 +1967,7 @@ label_callback11: getSound()->playSound(kEntityPlayer, "LIB015"); getScenes()->loadScene(kScene41); - CALLBACK_ACTION(); + callbackAction(); break; case 16: @@ -1979,27 +1979,27 @@ label_callback11: getSound()->playSound(kEntityPlayer, "LIB015"); getScenes()->loadScene(kScene41); - CALLBACK_ACTION(); + callbackAction(); break; case 23: getProgress().eventMertensAugustWaiting = true; getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 24: getProgress().eventMertensKronosInvitation = true; getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 25: getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2051,7 +2051,7 @@ IMPLEMENT_FUNCTION_S(28, Mertens, function28) break; case 4: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2113,7 +2113,7 @@ IMPLEMENT_FUNCTION_SS(29, Mertens, function29) break; case 4: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2138,14 +2138,14 @@ IMPLEMENT_FUNCTION_I(30, Mertens, function30, MertensActionType) case kActionDefault: switch (params->param1) { default: - CALLBACK_ACTION(); + callbackAction(); return; case 1: params->param2 = kPosition_8200; if (getProgress().field_14) { - CALLBACK_ACTION(); + callbackAction(); return; } @@ -2271,7 +2271,7 @@ IMPLEMENT_FUNCTION_I(30, Mertens, function30, MertensActionType) break; case 9: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2310,7 +2310,7 @@ IMPLEMENT_FUNCTION_I(31, Mertens, function31, MertensActionType) case 2: case 3: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2358,7 +2358,7 @@ IMPLEMENT_FUNCTION(32, Mertens, function32) break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2380,7 +2380,7 @@ IMPLEMENT_FUNCTION(33, Mertens, function33) setCallback(ENTITY_PARAM(0, 8) ? 1 : 3); setup_updateEntity(kCarGreenSleeping, ENTITY_PARAM(0, 8) ? kPosition_1500 : kPosition_540); } else { - CALLBACK_ACTION(); + callbackAction(); } break; @@ -2399,7 +2399,7 @@ IMPLEMENT_FUNCTION(33, Mertens, function33) case 2: ENTITY_PARAM(1, 8) = 0; - CALLBACK_ACTION(); + callbackAction(); break; case 3: @@ -2478,7 +2478,7 @@ IMPLEMENT_FUNCTION(33, Mertens, function33) break; } - CALLBACK_ACTION(); + callbackAction(); break; case 12: @@ -2491,13 +2491,13 @@ IMPLEMENT_FUNCTION(33, Mertens, function33) break; } - CALLBACK_ACTION(); + callbackAction(); break; case 13: ENTITY_PARAM(2, 2) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2546,7 +2546,7 @@ IMPLEMENT_FUNCTION(35, Mertens, function35) case kActionDefault: if (getProgress().field_14 == 29) { - CALLBACK_ACTION(); + callbackAction(); break; } else { getProgress().field_14 = 3; @@ -2587,7 +2587,7 @@ IMPLEMENT_FUNCTION(35, Mertens, function35) break; case 4: - CALLBACK_ACTION(); + callbackAction(); break; case 5: @@ -2609,7 +2609,7 @@ IMPLEMENT_FUNCTION(35, Mertens, function35) break; case 7: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2624,7 +2624,7 @@ IMPLEMENT_FUNCTION(36, Mertens, function36) case kActionDefault: if (getProgress().field_14 == 29) { - CALLBACK_ACTION(); + callbackAction(); } else { getProgress().field_14 = 3; @@ -2710,7 +2710,7 @@ IMPLEMENT_FUNCTION(36, Mertens, function36) case 6: case 9: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2765,7 +2765,7 @@ IMPLEMENT_FUNCTION(37, Mertens, function37) break; case 4: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2789,12 +2789,12 @@ IMPLEMENT_FUNCTION(38, Mertens, function38) case kActionDefault: if (!ENTITY_PARAM(0, 4)) { - CALLBACK_ACTION(); + callbackAction(); break; } if (getProgress().field_14 == 29) { - CALLBACK_ACTION(); + callbackAction(); } else { setCallback(1); setup_updateEntity(kCarGreenSleeping, kPosition_8200); @@ -2808,7 +2808,7 @@ IMPLEMENT_FUNCTION(38, Mertens, function38) case 1: if (!ENTITY_PARAM(0, 4)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -2818,7 +2818,7 @@ IMPLEMENT_FUNCTION(38, Mertens, function38) case 2: ENTITY_PARAM(0, 4) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2892,7 +2892,7 @@ IMPLEMENT_FUNCTION(39, Mertens, function39) break; case 10: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -2938,7 +2938,7 @@ IMPLEMENT_FUNCTION(40, Mertens, function40) case 5: ENTITY_PARAM(0, 6) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -3911,7 +3911,7 @@ IMPLEMENT_FUNCTION(49, Mertens, function49) break; case 11: - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp index 2e0da272ba..21f3b06896 100644 --- a/engines/lastexpress/entities/milos.cpp +++ b/engines/lastexpress/entities/milos.cpp @@ -133,7 +133,7 @@ IMPLEMENT_FUNCTION_II(10, Milos, enterCompartmentDialog, CarIndex, EntityPositio case kActionNone: case kActionDefault: if (getEntities()->updateEntity(kEntityMilos, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMeCath: @@ -171,7 +171,7 @@ IMPLEMENT_FUNCTION_I(11, Milos, function11, TimeValue) if (!params->param5 && params->param1 < getState()->time && !params->param7) { params->param7 = 1; - CALLBACK_ACTION(); + callbackAction(); break; } @@ -392,7 +392,7 @@ IMPLEMENT_FUNCTION(13, Milos, function13) getEntities()->clearSequences(kEntityIvo); getEntities()->clearSequences(kEntitySalko); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -420,7 +420,7 @@ IMPLEMENT_FUNCTION(14, Milos, function14) getEntities()->exitCompartment(kEntityMilos, kObjectCompartment1, true); getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -472,7 +472,7 @@ IMPLEMENT_FUNCTION(14, Milos, function14) getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } } else { @@ -591,7 +591,7 @@ label_callback_12: getData()->location = kLocationOutsideCompartment; getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; case 2: @@ -631,7 +631,7 @@ label_callback_12: getScenes()->loadScene(kScene41); getData()->location = kLocationOutsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1384,7 +1384,7 @@ IMPLEMENT_FUNCTION_I(26, Milos, function26, TimeValue) case kActionNone: if (params->param1 < getState()->time && !params->param2) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -1413,7 +1413,7 @@ IMPLEMENT_FUNCTION_I(26, Milos, function26, TimeValue) case 1: if (ENTITY_PARAM(0, 2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -1423,7 +1423,7 @@ IMPLEMENT_FUNCTION_I(26, Milos, function26, TimeValue) case 2: case 3: if (ENTITY_PARAM(0, 2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -1440,7 +1440,7 @@ IMPLEMENT_FUNCTION_I(26, Milos, function26, TimeValue) case 5: if (ENTITY_PARAM(0, 2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -1459,7 +1459,7 @@ IMPLEMENT_FUNCTION_II(27, Milos, function27, CarIndex, EntityPosition) case kActionNone: if (getEntities()->updateEntity(kEntityMilos, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -1470,14 +1470,14 @@ IMPLEMENT_FUNCTION_II(27, Milos, function27, CarIndex, EntityPosition) if (getData()->car == kCarRedSleeping || getData()->car == kCarGreenSleeping) { ENTITY_PARAM(0, 2) = 1; - CALLBACK_ACTION(); + callbackAction(); } } break; case kActionDefault: if (getEntities()->updateEntity(kEntityMilos, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END diff --git a/engines/lastexpress/entities/mmeboutarel.cpp b/engines/lastexpress/entities/mmeboutarel.cpp index a72bd1578b..ace8637556 100644 --- a/engines/lastexpress/entities/mmeboutarel.cpp +++ b/engines/lastexpress/entities/mmeboutarel.cpp @@ -122,7 +122,7 @@ IMPLEMENT_FUNCTION_S(8, MmeBoutarel, function8) if (!getEntities()->isPlayerPosition(kCarRedSleeping, 2)) getData()->entityPosition = kPosition_2088; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -209,7 +209,7 @@ IMPLEMENT_FUNCTION(9, MmeBoutarel, function9) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityMmeBoutarel); - CALLBACK_ACTION(); + callbackAction(); break; case 5: @@ -218,7 +218,7 @@ IMPLEMENT_FUNCTION(9, MmeBoutarel, function9) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityMmeBoutarel); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -310,7 +310,7 @@ IMPLEMENT_FUNCTION(11, MmeBoutarel, function11) break; case 4: - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/pascale.cpp b/engines/lastexpress/entities/pascale.cpp index 1f8504c566..6620634ade 100644 --- a/engines/lastexpress/entities/pascale.cpp +++ b/engines/lastexpress/entities/pascale.cpp @@ -169,7 +169,7 @@ IMPLEMENT_FUNCTION(8, Pascale, welcomeSophieAndRebecca) getData()->entityPosition = kPosition_5900; ENTITY_PARAM(0, 4) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -183,7 +183,7 @@ IMPLEMENT_FUNCTION(9, Pascale, sitSophieAndRebecca) break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -215,7 +215,7 @@ IMPLEMENT_FUNCTION(10, Pascale, welcomeCath) getScenes()->loadSceneFromPosition(kCarRestaurant, 69); } - CALLBACK_ACTION(); + callbackAction(); break; case kAction4: @@ -237,7 +237,7 @@ IMPLEMENT_FUNCTION(10, Pascale, welcomeCath) getScenes()->loadSceneFromPosition(kCarRestaurant, 69); - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -281,7 +281,7 @@ IMPLEMENT_FUNCTION(11, Pascale, function11) getEntities()->clearSequences(kEntityPascale); getData()->entityPosition = kPosition_5900; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -364,7 +364,7 @@ IMPLEMENT_FUNCTION(13, Pascale, getMessageFromAugustToTyler) getSavePoints()->push(kEntityPascale, kEntityVerges, kActionDeliverMessageToTyler); ENTITY_PARAM(0, 1) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -380,7 +380,7 @@ IMPLEMENT_FUNCTION(14, Pascale, sitAnna) case kActionExitCompartment: getEntities()->updatePositionExit(kEntityPascale, kCarRestaurant, 62); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -431,7 +431,7 @@ IMPLEMENT_FUNCTION(15, Pascale, welcomeAnna) getData()->entityPosition = kPosition_5900; ENTITY_PARAM(0, 2) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -484,7 +484,7 @@ IMPLEMENT_FUNCTION(16, Pascale, serveTatianaVassili) getData()->entityPosition = kPosition_5900; ENTITY_PARAM(0, 3) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -725,7 +725,7 @@ IMPLEMENT_FUNCTION(23, Pascale, function23) ENTITY_PARAM(0, 7) = 0; getEntities()->clearSequences(kEntityPascale); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -746,7 +746,7 @@ IMPLEMENT_FUNCTION(24, Pascale, welcomeAbbot) break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kAction10: @@ -951,7 +951,7 @@ IMPLEMENT_FUNCTION(27, Pascale, function27) ENTITY_PARAM(1, 1) = 0; ENTITY_PARAM(1, 2) = 1; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -997,7 +997,7 @@ IMPLEMENT_FUNCTION(28, Pascale, messageFromAnna) getData()->entityPosition = kPosition_5900; ENTITY_PARAM(1, 2) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1035,7 +1035,7 @@ IMPLEMENT_FUNCTION(29, Pascale, function29) case 2: getData()->entityPosition = kPosition_850; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1073,7 +1073,7 @@ IMPLEMENT_FUNCTION(30, Pascale, function30) case 2: getData()->entityPosition = kPosition_5900; - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index a5f2d66793..4f7be385ce 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -177,7 +177,7 @@ IMPLEMENT_FUNCTION(15, Rebecca, function15) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityRebecca); - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -259,7 +259,7 @@ IMPLEMENT_FUNCTION_I(16, Rebecca, function16, bool) getSavePoints()->push(kEntityRebecca, kEntityTables3, kAction136455232); getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -332,7 +332,7 @@ IMPLEMENT_FUNCTION_I(17, Rebecca, function17, bool) case 5: getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -341,7 +341,7 @@ IMPLEMENT_FUNCTION_I(17, Rebecca, function17, bool) getData()->location = kLocationInsideCompartment; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -395,7 +395,7 @@ IMPLEMENT_FUNCTION(18, Rebecca, function18) case 2: case 3: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -471,7 +471,7 @@ IMPLEMENT_FUNCTION(19, Rebecca, function19) case 5: case 6: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -491,7 +491,7 @@ IMPLEMENT_FUNCTION_I(20, Rebecca, function20, TimeValue) getObjects()->update(kObjectCompartmentE, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); getObjects()->update(kObject52, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } diff --git a/engines/lastexpress/entities/salko.cpp b/engines/lastexpress/entities/salko.cpp index c95269fc90..70a26b515a 100644 --- a/engines/lastexpress/entities/salko.cpp +++ b/engines/lastexpress/entities/salko.cpp @@ -135,7 +135,7 @@ IMPLEMENT_FUNCTION_II(7, Salko, function7, CarIndex, EntityPosition) break; case kAction123668192: - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -388,7 +388,7 @@ label_callback3: getData()->entityPosition = kPosition_2740; getEntities()->clearSequences(kEntitySalko); - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/servers0.cpp b/engines/lastexpress/entities/servers0.cpp index 60f5295fc6..56fc0e6056 100644 --- a/engines/lastexpress/entities/servers0.cpp +++ b/engines/lastexpress/entities/servers0.cpp @@ -110,11 +110,11 @@ IMPLEMENT_FUNCTION_NOSETUP(5, Servers0, callbackActionOnDirection) case kActionNone: if (getData()->direction != kDirectionRight) - CALLBACK_ACTION(); + callbackAction(); break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMeCath: @@ -160,7 +160,7 @@ IMPLEMENT_FUNCTION(7, Servers0, function7) case 2: getEntities()->clearSequences(kEntityServers0); getData()->entityPosition = kPosition_5900; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -217,7 +217,7 @@ IMPLEMENT_FUNCTION(9, Servers0, function9) ENTITY_PARAM(2, 2) = 0; ENTITY_PARAM(1, 6) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -483,7 +483,7 @@ IMPLEMENT_FUNCTION(25, Servers0, function25) getEntities()->clearSequences(kEntityServers0); ENTITY_PARAM(1, 3) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -644,7 +644,7 @@ IMPLEMENT_FUNCTION(29, Servers0, augustAnnaDateOrder) getEntities()->clearSequences(kEntityServers0); ENTITY_PARAM(1, 5) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -690,7 +690,7 @@ IMPLEMENT_FUNCTION(30, Servers0, function30) getEntities()->clearSequences(kEntityServers0); ENTITY_PARAM(2, 4) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -856,7 +856,7 @@ IMPLEMENT_FUNCTION(33, Servers0, augustOrderSteak) getEntities()->clearSequences(kEntityServers0); ENTITY_PARAM(1, 7) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -899,7 +899,7 @@ IMPLEMENT_FUNCTION(34, Servers0, augustServeDuck) getEntities()->clearSequences(kEntityServers0); ENTITY_PARAM(1, 8) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -969,7 +969,7 @@ void Servers0::handleServer(const SavePoint &savepoint, const char *name, Entity getSavePoints()->push(kEntityServers0, entity, action); *parameter = 0; - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -1024,7 +1024,7 @@ void Servers0::serveTable(const SavePoint &savepoint, const char *seq1, EntityIn getEntities()->clearSequences(kEntityServers0); *parameter = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/servers1.cpp b/engines/lastexpress/entities/servers1.cpp index 76a35a4071..24bf678f3a 100644 --- a/engines/lastexpress/entities/servers1.cpp +++ b/engines/lastexpress/entities/servers1.cpp @@ -140,7 +140,7 @@ IMPLEMENT_FUNCTION(7, Servers1, function7) getData()->entityPosition = kPosition_5900; ENTITY_PARAM(1, 2) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -216,7 +216,7 @@ IMPLEMENT_FUNCTION(9, Servers1, function9) getData()->entityPosition = kPosition_5900; ENTITY_PARAM(0, 1) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -262,7 +262,7 @@ IMPLEMENT_FUNCTION(10, Servers1, function10) getData()->entityPosition = kPosition_5900; ENTITY_PARAM(0, 2) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -466,7 +466,7 @@ IMPLEMENT_FUNCTION(20, Servers1, function20) getEntities()->drawSequenceLeft(kEntityServers1, "BLANK"); ENTITY_PARAM(0, 7) = 0; - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -702,7 +702,7 @@ void Servers1::serveTable(const SavePoint &savepoint, const char *seq1, EntityIn if (parameter2 != NULL) *parameter2 = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -772,7 +772,7 @@ void Servers1::serveSalon(const SavePoint &savepoint, const char *seq1, const ch getData()->entityPosition = kPosition_5900; *parameter = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/sophie.cpp b/engines/lastexpress/entities/sophie.cpp index 65c718a8c4..c2f25b7eb1 100644 --- a/engines/lastexpress/entities/sophie.cpp +++ b/engines/lastexpress/entities/sophie.cpp @@ -120,7 +120,7 @@ IMPLEMENT_FUNCTION_II(2, Sophie, updateEntity, CarIndex, EntityPosition) break; case kAction123668192: - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp index b97538818f..3b9cc6d322 100644 --- a/engines/lastexpress/entities/tatiana.cpp +++ b/engines/lastexpress/entities/tatiana.cpp @@ -190,7 +190,7 @@ IMPLEMENT_FUNCTION(14, Tatiana, function14) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityTatiana); - CALLBACK_ACTION(); + callbackAction(); } break; @@ -226,7 +226,7 @@ IMPLEMENT_FUNCTION(15, Tatiana, function15) getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentB, true); getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -244,7 +244,7 @@ IMPLEMENT_FUNCTION_I(16, Tatiana, function16, uint32) getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); getObjects()->update(kObject49, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } @@ -384,14 +384,14 @@ IMPLEMENT_FUNCTION(18, Tatiana, function18) getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction157159392); getEntities()->clearSequences(kEntityTatiana); - CALLBACK_ACTION(); + callbackAction(); } break; case kActionExitCompartment: getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction188784532); - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -1533,7 +1533,7 @@ IMPLEMENT_FUNCTION(40, Tatiana, function40) if (getEntities()->isInsideTrainCar(kEntityPlayer, kCarKronos) || getData()->car != getEntityData(kEntityPlayer)->car || getEntities()->updateEntity(kEntityTatiana, kCarKronos, kPosition_9270)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMe: @@ -1545,7 +1545,7 @@ IMPLEMENT_FUNCTION(40, Tatiana, function40) case kActionDefault: if (getEntities()->updateEntity(kEntityTatiana, kCarKronos, kPosition_9270)) - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -1593,7 +1593,7 @@ IMPLEMENT_FUNCTION(41, Tatiana, function41) } getEntities()->clearSequences(kEntityTatiana); - CALLBACK_ACTION(); + callbackAction(); } break; @@ -1627,7 +1627,7 @@ IMPLEMENT_FUNCTION(41, Tatiana, function41) case 6: getEntities()->clearSequences(kEntityTatiana); - CALLBACK_ACTION(); + callbackAction(); break; case 4: diff --git a/engines/lastexpress/entities/train.cpp b/engines/lastexpress/entities/train.cpp index 1a1b6efaa7..0830dffbef 100644 --- a/engines/lastexpress/entities/train.cpp +++ b/engines/lastexpress/entities/train.cpp @@ -550,7 +550,7 @@ void Train::handleCompartmentAction() { ENTITY_PARAM(0, 8) = params->param1; - CALLBACK_ACTION(); + callbackAction(); } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp index d4b2a1716e..bdd758a5be 100644 --- a/engines/lastexpress/entities/verges.cpp +++ b/engines/lastexpress/entities/verges.cpp @@ -100,11 +100,11 @@ IMPLEMENT_FUNCTION(3, Verges, callbackActionOnDirection) case kActionNone: if (getData()->direction != kDirectionRight) - CALLBACK_ACTION(); + callbackAction(); break; case kActionExitCompartment: - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMeCath: @@ -217,7 +217,7 @@ switch (savepoint.action) { break; case 6: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -239,7 +239,7 @@ IMPLEMENT_FUNCTION_IIS(10, Verges, function10, CarIndex, EntityPosition) } if (getEntities()->updateEntity(kEntityVerges, (CarIndex)params->param1, (EntityPosition)params->param2)) { - CALLBACK_ACTION(); + callbackAction(); break; } @@ -264,7 +264,7 @@ IMPLEMENT_FUNCTION_IIS(10, Verges, function10, CarIndex, EntityPosition) } if (getEntities()->updateEntity(kEntityVerges, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -335,7 +335,7 @@ IMPLEMENT_FUNCTION(11, Verges, function11) getObjects()->update(kObject104, kEntityVerges, kObjectLocationNone, kCursorNormal, kCursorHand); getObjects()->update(kObject105, kEntityVerges, kObjectLocationNone, kCursorNormal, kCursorHand); - CALLBACK_ACTION(); + callbackAction(); break; } } @@ -395,7 +395,7 @@ IMPLEMENT_FUNCTION(12, Verges, function12) getData()->entityPosition = kPosition_850; getEntities()->clearSequences(kEntityVerges); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -436,7 +436,7 @@ IMPLEMENT_FUNCTION_I(13, Verges, function13, bool) getEntities()->clearSequences(kEntityVerges); getScenes()->loadSceneFromPosition(kCarBaggage, 91); - CALLBACK_ACTION(); + callbackAction(); } break; } @@ -460,7 +460,7 @@ IMPLEMENT_FUNCTION_IS(15, Verges, function15, EntityIndex) if (!getEntities()->isPlayerPosition(kCarGreenSleeping, 2) && !getEntities()->isPlayerPosition(kCarRedSleeping, 2)) getData()->entityPosition = kPosition_2088; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -497,7 +497,7 @@ IMPLEMENT_FUNCTION_ISS(16, Verges, function16, EntityIndex) if (!getEntities()->isPlayerPosition(kCarGreenSleeping, 2) && !getEntities()->isPlayerPosition(kCarRedSleeping, 2)) getData()->entityPosition = kPosition_2088; - CALLBACK_ACTION(); + callbackAction(); } break; @@ -557,7 +557,7 @@ IMPLEMENT_FUNCTION(17, Verges, function17) case 4: ENTITY_PARAM(0, 3) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -649,7 +649,7 @@ IMPLEMENT_FUNCTION(22, Verges, function22) break; case 5: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -695,7 +695,7 @@ IMPLEMENT_FUNCTION(24, Verges, policeGettingOffTrain) break; case kActionEndSound: - CALLBACK_ACTION(); + callbackAction(); break; case kActionDefault: @@ -816,7 +816,7 @@ IMPLEMENT_FUNCTION(25, Verges, function25) case 11: ENTITY_PARAM(0, 7) = 0; - CALLBACK_ACTION(); + callbackAction(); break; case 6: @@ -1222,7 +1222,7 @@ IMPLEMENT_FUNCTION_S(30, Verges, function30) break; case 4: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1264,7 +1264,7 @@ IMPLEMENT_FUNCTION(31, Verges, function31) getProgress().field_48 = 1; ENTITY_PARAM(0, 4) = 0; - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1341,7 +1341,7 @@ IMPLEMENT_FUNCTION(32, Verges, function32) break; case 6: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1546,7 +1546,7 @@ IMPLEMENT_FUNCTION(35, Verges, function35) break; case 6: - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -1885,7 +1885,7 @@ void Verges::talk(const SavePoint &savepoint, const char *sound1, const char *so break; case 6: - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/vesna.cpp b/engines/lastexpress/entities/vesna.cpp index b5ffd9c979..b0ee9bcbc1 100644 --- a/engines/lastexpress/entities/vesna.cpp +++ b/engines/lastexpress/entities/vesna.cpp @@ -131,7 +131,7 @@ IMPLEMENT_FUNCTION_II(7, Vesna, updateEntity2, CarIndex, EntityPosition) break; case kAction123668192: - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -242,7 +242,7 @@ IMPLEMENT_FUNCTION(11, Vesna, function11) case kAction55996766: case kAction101687594: - CALLBACK_ACTION(); + callbackAction(); break; } IMPLEMENT_FUNCTION_END @@ -455,7 +455,7 @@ IMPLEMENT_FUNCTION(18, Vesna, function18) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityVesna); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -708,7 +708,7 @@ IMPLEMENT_FUNCTION(21, Vesna, function21) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityVesna); - CALLBACK_ACTION(); + callbackAction(); break; } break; diff --git a/engines/lastexpress/entities/yasmin.cpp b/engines/lastexpress/entities/yasmin.cpp index d2e8cd6b68..ebf90744f5 100644 --- a/engines/lastexpress/entities/yasmin.cpp +++ b/engines/lastexpress/entities/yasmin.cpp @@ -130,7 +130,7 @@ IMPLEMENT_FUNCTION(6, Yasmin, function6) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityYasmin); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -170,7 +170,7 @@ IMPLEMENT_FUNCTION(7, Yasmin, function7) getData()->location = kLocationInsideCompartment; getEntities()->clearSequences(kEntityYasmin); - CALLBACK_ACTION(); + callbackAction(); break; } break; @@ -470,7 +470,7 @@ IMPLEMENT_FUNCTION(21, Yasmin, function21) case kActionNone: case kActionDefault: if (getEntities()->updateEntity(kEntityYasmin, (CarIndex)params->param1, (EntityPosition)params->param2)) - CALLBACK_ACTION(); + callbackAction(); break; case kActionExcuseMeCath: -- cgit v1.2.3 From 67751f77c8abae0f6326cb0daec67cd6dd272c7d Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 14 Jul 2012 16:33:41 -0400 Subject: CREATE_PROJECT: Output Groups and File references in XCode provider --- devtools/create_project/create_project.cpp | 26 ++++++++------------- devtools/create_project/create_project.h | 8 +++++++ devtools/create_project/xcode.cpp | 36 ++++++++++++++++++++++++------ 3 files changed, 46 insertions(+), 24 deletions(-) diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index c96b83414a..8499fec400 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -75,14 +75,6 @@ namespace { */ std::string unifyPath(const std::string &path); -/** - * Returns the last path component. - * - * @param path Path string. - * @return Last path component. - */ -std::string getLastPathComponent(const std::string &path); - /** * Display the help text for the program. * @@ -606,14 +598,6 @@ std::string unifyPath(const std::string &path) { return result; } -std::string getLastPathComponent(const std::string &path) { - std::string::size_type pos = path.find_last_of('/'); - if (pos == std::string::npos) - return path; - else - return path.substr(pos + 1); -} - void displayHelp(const char *exe) { using std::cout; @@ -1001,7 +985,7 @@ bool isInList(const std::string &dir, const std::string &fileName, const StringL continue; } - const std::string lastPathComponent = getLastPathComponent(*i); + const std::string lastPathComponent = ProjectProvider::getLastPathComponent(*i); if (extensionName == "o") { return false; } else if (!producesObjectFile(fileName) && extensionName != "h") { @@ -1304,6 +1288,14 @@ std::string ProjectProvider::createUUID() const { #endif } +std::string ProjectProvider::getLastPathComponent(const std::string &path) { + std::string::size_type pos = path.find_last_of('/'); + if (pos == std::string::npos) + return path; + else + return path.substr(pos + 1); +} + void ProjectProvider::addFilesToProject(const std::string &dir, std::ofstream &projectFile, const StringList &includeList, const StringList &excludeList, const std::string &filePrefix) { diff --git a/devtools/create_project/create_project.h b/devtools/create_project/create_project.h index 8719143f4a..b4eda8f8d2 100644 --- a/devtools/create_project/create_project.h +++ b/devtools/create_project/create_project.h @@ -317,6 +317,14 @@ public: */ void createProject(const BuildSetup &setup); + /** + * Returns the last path component. + * + * @param path Path string. + * @return Last path component. + */ + static std::string getLastPathComponent(const std::string &path); + protected: const int _version; ///< Target project version StringList &_globalWarnings; ///< Global warnings diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index 9784bb0bf5..0574814e02 100644 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -202,18 +202,38 @@ void XCodeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &p // Init root group _groups.comment = "PBXGroup"; - Object *group = new Object(this, "PBXGroup", "PBXGroup", "PBXGroup", "", ""); - //Property children; - //children.flags = SettingsAsList; - //group->properties["children"] = children; - group->addProperty("children", "", "", SettingsNoValue|SettingsAsList); + // Create group + std::string name = getLastPathComponent(dir.name); + Object *group = new Object(this, "PBXGroup_" + name , "PBXGroup", "PBXGroup", "", name); + + // List of children + Property children; + children.hasOrder = true; + children.flags = SettingsAsList; + group->addProperty("name", name, "", SettingsNoValue|SettingsQuoteVariable); group->addProperty("sourceTree", "", "", SettingsNoValue|SettingsQuoteVariable); - _groups.add(group); + int order = 0; + for (FileNode::NodeList::const_iterator i = dir.children.begin(); i != dir.children.end(); ++i) { + const FileNode *node = *i; + + std::string id = "FileReference_" + node->name; + FileProperty property = FileProperty(node->name, node->name, node->name, ""); + + ADD_SETTING_ORDER_NOVALUE(children, getHash(id), node->name, order++); + ADD_BUILD_FILE(id, node->name, node->name + " in Sources"); + ADD_FILE_REFERENCE(node->name, property); + + // Process child nodes + if (!node->children.empty()) + writeFileListToProject(*node, projectFile, indentation + 1, duplicate, objPrefix + node->name + '_', filePrefix + node->name + '/'); + } - // TODO Add files + group->properties["children"] = children; + + _groups.add(group); } ////////////////////////////////////////////////////////////////////////// @@ -717,6 +737,7 @@ void XCodeProvider::setupBuildConfiguration() { ADD_SETTING_QUOTE(scummvmSimulator_Debug, "FRAMEWORK_SEARCH_PATHS", "$(inherited)"); ADD_SETTING_LIST(scummvmSimulator_Debug, "GCC_PREPROCESSOR_DEFINITIONS", scummvm_defines, SettingsNoQuote|SettingsAsList, 5); ADD_SETTING(scummvmSimulator_Debug, "SDKROOT", "iphonesimulator3.2"); + ADD_SETTING_QUOTE(scummvmSimulator_Debug, "VALID_ARCHS", "i386 x86_64"); REMOVE_SETTING(scummvmSimulator_Debug, "TARGETED_DEVICE_FAMILY"); scummvmSimulator_Debug_Object->addProperty("name", "Debug", "", SettingsNoValue); @@ -726,6 +747,7 @@ void XCodeProvider::setupBuildConfiguration() { Object *scummvmSimulator_Release_Object = new Object(this, "XCBuildConfiguration_" PROJECT_DESCRIPTION "-Simulator_Release", _targets[2] /* ScummVM-Simulator */, "XCBuildConfiguration", "PBXNativeTarget", "Release"); Property scummvmSimulator_Release(scummvmSimulator_Debug); ADD_SETTING(scummvmSimulator_Release, "COPY_PHASE_STRIP", "YES"); + ADD_SETTING(scummvmSimulator_Release, "GCC_OPTIMIZATION_LEVEL", "3"); REMOVE_SETTING(scummvmSimulator_Release, "GCC_DYNAMIC_NO_PIC"); ADD_SETTING(scummvmSimulator_Release, "WRAPPER_EXTENSION", "app"); -- cgit v1.2.3 From 2c5cf9f860ffe5264268379ce6e0c0aa5ff25c0e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 01:32:11 +0300 Subject: SCI: Properly detect the Polish version of KQ5 Thanks to jacek909 for the extra MD5 checksums of the Polish version. This fixes bugs #2725722 (Polish version checksums) and #3536863 (SCI: KQ5 Floppy English detected as Polish) --- engines/sci/detection_tables.h | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 8a6184c7e4..268914edba 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1241,10 +1241,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { // King's Quest 5 - English DOS Floppy // VERSION file reports "0.000.051" // Supplied by misterhands in bug report #3536863. - // FIXME: According to bug #3536863, there exists another English version - // with the same file checksums as the vanilla English version, patched to - // Polish. We need a better way of distinguishing the two versions. Until - // we do, this is a duplicate entry of the Polish version below. + // This is the original English version, which has been externally patched to + // Polish in the Polish release below. {"kq5", "", { {"resource.map", 0, "70010c20138541f89013bb5e1b30f16a", 7998}, {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 276398}, @@ -1374,12 +1372,10 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::IT_ITA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, - // King's Quest 5 - Polish DOS Floppy (supplied by jacek909 in bug report #2725722, includes english language?!) + // King's Quest 5 - Polish DOS Floppy (supplied by jacek909 in bug report #2725722) // SCI interpreter version 1.000.060 - // FIXME: According to bug #3536863, this is actually a patched English version. - // The vanilla English version has the same MD5 checksums. - // We need a better way of detecting this. Until we do, a duplicate English - // entry has been placed above. + // VERSION file reports "0.000.051". + // This is actually an English version with external text resource patches (bug #3536863). {"kq5", "", { {"resource.map", 0, "70010c20138541f89013bb5e1b30f16a", 7998}, {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 276398}, @@ -1390,6 +1386,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "6556ff8e7c4d1acf6a78aea154daa76c", 1287869}, {"resource.006", 0, "da82e4beb744731d0a151f1d4922fafa", 1170456}, {"resource.007", 0, "431def14ca29cdb5e6a5e84d3f38f679", 1240176}, + {"text.000", 0, "601aa35a3ddeb558e1280e0963e955a2", 1517}, AD_LISTEND}, Common::PL_POL, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, -- cgit v1.2.3 From 13a5e5812af635477626de6a13f54ed8b8e4afa5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 02:14:37 +0300 Subject: TEENAGENT: Unpack teenagent.dat and remove the engine's zlib dependency This addresses bug #3539822 - "TEENAGENT: Not working without zlib" --- devtools/create_teenagent/create_teenagent.cpp | 2 -- dists/engine-data/teenagent.dat | Bin 70047 -> 141090 bytes engines/teenagent/resources.cpp | 46 ++++++++++++++++--------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/devtools/create_teenagent/create_teenagent.cpp b/devtools/create_teenagent/create_teenagent.cpp index 9551acbaea..fc2ba4da0e 100644 --- a/devtools/create_teenagent/create_teenagent.cpp +++ b/devtools/create_teenagent/create_teenagent.cpp @@ -106,7 +106,5 @@ int main(int argc, char *argv[]) { fclose(fin); fclose(fout); - fprintf(stderr, "please run \"gzip -n %s\"\n", dat_name); - return 0; } diff --git a/dists/engine-data/teenagent.dat b/dists/engine-data/teenagent.dat index 0dd31dad14..1492326920 100644 Binary files a/dists/engine-data/teenagent.dat and b/dists/engine-data/teenagent.dat differ diff --git a/engines/teenagent/resources.cpp b/engines/teenagent/resources.cpp index 597ca670c0..74ebae9c9b 100644 --- a/engines/teenagent/resources.cpp +++ b/engines/teenagent/resources.cpp @@ -22,7 +22,6 @@ #include "teenagent/resources.h" #include "teenagent/teenagent.h" #include "common/textconsole.h" -#include "common/zlib.h" namespace TeenAgent { @@ -69,24 +68,37 @@ bool Resources::loadArchives(const ADGameDescription *gd) { warning("%s", errorMessage.c_str()); return false; } - Common::SeekableReadStream *dat = Common::wrapCompressedReadStream(dat_file); - cseg.read(dat, 0xb3b0); - dseg.read(dat, 0xe790); - eseg.read(dat, 0x8be2); - - delete dat; - - { - FilePack varia; - varia.open("varia.res"); - font7.load(varia, 7); - font7.width_pack = 1; - font7.height = 11; - font8.load(varia, 8); - font8.height = 31; - varia.close(); + + // Check if teenagent.dat is compressed (older versions of the file) + uint16 header = dat_file->readUint16BE(); + bool isCompressed = (header == 0x1F8B || + ((header & 0x0F00) == 0x0800 && + header % 31 == 0)); + dat_file->seek(-2, SEEK_CUR); + + if (isCompressed) { + delete dat_file; + Common::String errorMessage = "The teenagent.dat file is compressed. Please decompress it"; + GUIErrorMessage(errorMessage); + warning("%s", errorMessage.c_str()); + return false; } + cseg.read(dat_file, 0xb3b0); + dseg.read(dat_file, 0xe790); + eseg.read(dat_file, 0x8be2); + + delete dat_file; + + FilePack varia; + varia.open("varia.res"); + font7.load(varia, 7); + font7.width_pack = 1; + font7.height = 11; + font8.load(varia, 8); + font8.height = 31; + varia.close(); + off.open("off.res"); on.open("on.res"); ons.open("ons.res"); -- cgit v1.2.3 From c54f95ee86b001676fbdc44aa5e1c74191fae459 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 02:27:51 +0300 Subject: TEENAGENT: Readd the zlib code, to maintain backwards compatibility --- engines/teenagent/resources.cpp | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/engines/teenagent/resources.cpp b/engines/teenagent/resources.cpp index 74ebae9c9b..49a429d5b7 100644 --- a/engines/teenagent/resources.cpp +++ b/engines/teenagent/resources.cpp @@ -22,6 +22,7 @@ #include "teenagent/resources.h" #include "teenagent/teenagent.h" #include "common/textconsole.h" +#include "common/zlib.h" namespace TeenAgent { @@ -69,26 +70,15 @@ bool Resources::loadArchives(const ADGameDescription *gd) { return false; } - // Check if teenagent.dat is compressed (older versions of the file) - uint16 header = dat_file->readUint16BE(); - bool isCompressed = (header == 0x1F8B || - ((header & 0x0F00) == 0x0800 && - header % 31 == 0)); - dat_file->seek(-2, SEEK_CUR); - - if (isCompressed) { - delete dat_file; - Common::String errorMessage = "The teenagent.dat file is compressed. Please decompress it"; - GUIErrorMessage(errorMessage); - warning("%s", errorMessage.c_str()); - return false; - } - - cseg.read(dat_file, 0xb3b0); - dseg.read(dat_file, 0xe790); - eseg.read(dat_file, 0x8be2); + // teenagent.dat used to be compressed with zlib compression. The usage of + // zlib here is no longer needed, and it's maintained only for backwards + // compatibility. + Common::SeekableReadStream *dat = Common::wrapCompressedReadStream(dat_file); + cseg.read(dat, 0xb3b0); + dseg.read(dat, 0xe790); + eseg.read(dat, 0x8be2); - delete dat_file; + delete dat; FilePack varia; varia.open("varia.res"); -- cgit v1.2.3 From f4e395b4a185ac4aabd4e0a19c7e00682365d893 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 02:47:06 +0300 Subject: TEENAGENT: Show a verbose warning when a compressed data file is used and zlib hasn't been included in the executable --- engines/teenagent/resources.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/engines/teenagent/resources.cpp b/engines/teenagent/resources.cpp index 49a429d5b7..0dc6ea2f3c 100644 --- a/engines/teenagent/resources.cpp +++ b/engines/teenagent/resources.cpp @@ -74,10 +74,27 @@ bool Resources::loadArchives(const ADGameDescription *gd) { // zlib here is no longer needed, and it's maintained only for backwards // compatibility. Common::SeekableReadStream *dat = Common::wrapCompressedReadStream(dat_file); + +#if !defined(USE_ZLIB) + uint16 header = dat->readUint16BE(); + bool isCompressed = (header == 0x1F8B || + ((header & 0x0F00) == 0x0800 && + header % 31 == 0)); + dat->seek(-2, SEEK_CUR); + + if (isCompressed) { + // teenagent.dat is compressed, but zlib hasn't been compiled in + delete dat; + Common::String errorMessage = "The teenagent.dat file is compressed and zlib hasn't been included in this executable. Please decompress it"; + GUIErrorMessage(errorMessage); + warning("%s", errorMessage.c_str()); + return false; + } +#endif + cseg.read(dat, 0xb3b0); dseg.read(dat, 0xe790); eseg.read(dat, 0x8be2); - delete dat; FilePack varia; -- cgit v1.2.3 From a97f4466fdf7320cf184d0d4974670b4b4e4bee4 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 03:07:01 +0300 Subject: TEENAGENT: Add translatable strings in resources.cpp --- engines/teenagent/resources.cpp | 9 +++++---- po/POTFILES | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/engines/teenagent/resources.cpp b/engines/teenagent/resources.cpp index 0dc6ea2f3c..dff58f98e2 100644 --- a/engines/teenagent/resources.cpp +++ b/engines/teenagent/resources.cpp @@ -22,6 +22,7 @@ #include "teenagent/resources.h" #include "teenagent/teenagent.h" #include "common/textconsole.h" +#include "common/translation.h" #include "common/zlib.h" namespace TeenAgent { @@ -64,9 +65,9 @@ bool Resources::loadArchives(const ADGameDescription *gd) { Common::File *dat_file = new Common::File(); if (!dat_file->open("teenagent.dat")) { delete dat_file; - Common::String errorMessage = "You're missing the 'teenagent.dat' file. Get it from the ScummVM website"; - GUIErrorMessage(errorMessage); + Common::String errorMessage = _("You're missing the 'teenagent.dat' file. Get it from the ScummVM website"); warning("%s", errorMessage.c_str()); + GUIErrorMessage(errorMessage); return false; } @@ -85,9 +86,9 @@ bool Resources::loadArchives(const ADGameDescription *gd) { if (isCompressed) { // teenagent.dat is compressed, but zlib hasn't been compiled in delete dat; - Common::String errorMessage = "The teenagent.dat file is compressed and zlib hasn't been included in this executable. Please decompress it"; - GUIErrorMessage(errorMessage); + Common::String errorMessage = _("The teenagent.dat file is compressed and zlib hasn't been included in this executable. Please decompress it"); warning("%s", errorMessage.c_str()); + GUIErrorMessage(errorMessage); return false; } #endif diff --git a/po/POTFILES b/po/POTFILES index 8b74115939..36bd2ff4c7 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -53,6 +53,7 @@ engines/sword1/logic.cpp engines/sword1/sword1.cpp engines/sword2/animation.cpp engines/sword2/sword2.cpp +engines/teenagent/resources.cpp engines/tinsel/saveload.cpp engines/parallaction/saveload.cpp -- cgit v1.2.3 From aa8dec9a722e1b85374a215cba9a7066040a5e6e Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sat, 14 Jul 2012 23:39:28 -0500 Subject: MAEMO: Fix compile without keymapper --- backends/platform/maemo/maemo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/maemo/maemo.cpp b/backends/platform/maemo/maemo.cpp index e296d4787c..eb9b144ab2 100644 --- a/backends/platform/maemo/maemo.cpp +++ b/backends/platform/maemo/maemo.cpp @@ -180,6 +180,7 @@ void OSystem_SDL_Maemo::setupIcon() { // http://bugzilla.libsdl.org/show_bug.cgi?id=586 } +#ifdef ENABLE_KEYMAPPER static const Common::KeyTableEntry maemoKeys[] = { // Function keys {"MENU", Common::KEYCODE_F11, 0, "Menu", false}, @@ -191,7 +192,6 @@ static const Common::KeyTableEntry maemoKeys[] = { {0, Common::KEYCODE_INVALID, 0, 0, false} }; -#ifdef ENABLE_KEYMAPPER Common::HardwareInputSet *OSystem_SDL_Maemo::getHardwareInputSet() { return new Common::HardwareInputSet(true, maemoKeys); } -- cgit v1.2.3 From 6abb3501b50101760885efaf4a9721beadb18052 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sat, 14 Jul 2012 23:42:28 -0500 Subject: MAEMO: Set defaults for fullscreen and aspect ratio correction New installs now have fullscreen and aspect ratio correction on by default --- backends/platform/maemo/maemo.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backends/platform/maemo/maemo.cpp b/backends/platform/maemo/maemo.cpp index eb9b144ab2..61fe56e816 100644 --- a/backends/platform/maemo/maemo.cpp +++ b/backends/platform/maemo/maemo.cpp @@ -84,6 +84,10 @@ static void registerDefaultKeyBindings(Common::KeymapperDefaultBindings *_keymap #endif void OSystem_SDL_Maemo::initBackend() { + + ConfMan.registerDefault("fullscreen", true); + ConfMan.registerDefault("aspect_ratio", true); + // Create the events manager if (_eventSource == 0) _eventSource = new MaemoSdlEventSource(); -- cgit v1.2.3 From 848b6daeb980199a948fd5d067e5f199c1ee1593 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sun, 15 Jul 2012 00:07:24 -0500 Subject: MAEMO: Minor whitespace fix --- backends/platform/maemo/maemo.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/backends/platform/maemo/maemo.cpp b/backends/platform/maemo/maemo.cpp index 61fe56e816..4e50d04715 100644 --- a/backends/platform/maemo/maemo.cpp +++ b/backends/platform/maemo/maemo.cpp @@ -84,7 +84,6 @@ static void registerDefaultKeyBindings(Common::KeymapperDefaultBindings *_keymap #endif void OSystem_SDL_Maemo::initBackend() { - ConfMan.registerDefault("fullscreen", true); ConfMan.registerDefault("aspect_ratio", true); -- cgit v1.2.3 From 2f08f95e117dbeb3d4b0e431e73a1a49c9809f23 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Sun, 15 Jul 2012 00:18:49 -0500 Subject: MAEMO: Fix uninitialized member --- backends/platform/maemo/maemo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/backends/platform/maemo/maemo.cpp b/backends/platform/maemo/maemo.cpp index 4e50d04715..6bd229177b 100644 --- a/backends/platform/maemo/maemo.cpp +++ b/backends/platform/maemo/maemo.cpp @@ -43,6 +43,7 @@ namespace Maemo { OSystem_SDL_Maemo::OSystem_SDL_Maemo() : + _eventObserver(0), OSystem_POSIX() { } -- cgit v1.2.3 From 212551fe4e98ac7d16cdac317b5c87be3190ab18 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 15 Jul 2012 20:58:14 +1000 Subject: TINSEL: Added script workaround for #3543624 - DW1 PSX demo idle animation --- engines/tinsel/detection.cpp | 4 ++++ engines/tinsel/pcode.cpp | 43 ++++++++++++++++++++++++++++--------------- engines/tinsel/tinsel.h | 1 + 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp index 0f662e22bd..6d20f8bee2 100644 --- a/engines/tinsel/detection.cpp +++ b/engines/tinsel/detection.cpp @@ -63,6 +63,10 @@ uint16 TinselEngine::getVersion() const { return _gameDescription->version; } +bool TinselEngine::getIsADGFDemo() const { + return (bool)(_gameDescription->desc.flags & ADGF_DEMO); +} + } // End of namespace Tinsel static const PlainGameDescriptor tinselGames[] = { diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp index 60f04b47fd..6ea18c8268 100644 --- a/engines/tinsel/pcode.cpp +++ b/engines/tinsel/pcode.cpp @@ -122,6 +122,8 @@ static uint32 g_hMasterScript; struct WorkaroundEntry { TinselEngineVersion version; ///< Engine version this workaround applies to bool scnFlag; ///< Only applicable for Tinsel 1 (DW 1) + bool isDemo; ///< Flags whether it's for a demo + Common::Platform platform; ///< Platform filter SCNHANDLE hCode; ///< Script to apply fragment to int ip; ///< Script offset to run this fragment before int numBytes; ///< Number of bytes in the script @@ -129,6 +131,7 @@ struct WorkaroundEntry { }; #define FRAGMENT_WORD(x) (byte)(x & 0xFF), (byte)(x >> 8) +#define FRAGMENT_DWORD(x) (byte)(x & 0xFF), (byte)(x >> 8), (byte)(x >> 16), (byte)(x >> 24) static const byte fragment1[] = {OP_ZERO, OP_GSTORE | OPSIZE16, 206, 0}; static const byte fragment2[] = {OP_LIBCALL | OPSIZE8, 110}; @@ -149,6 +152,10 @@ static const byte fragment12[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1491), OP_IMM | OPSIZE16, FRAGMENT_WORD(322), OP_LIBCALL | OPSIZE8, 46, // Give back the whistle OP_JUMP | OPSIZE16, FRAGMENT_WORD(1568)}; static const byte fragment13[] = {OP_ZERO, OP_GSTORE | OPSIZE16, FRAGMENT_WORD(306)}; +static const byte fragment14[] = {OP_LIBCALL | OPSIZE8, 58, + OP_IMM, FRAGMENT_DWORD((42 << 23)), OP_ONE, OP_ZERO, OP_LIBCALL | OPSIZE8, 44, + OP_LIBCALL | OPSIZE8, 97, OP_JUMP | OPSIZE16, FRAGMENT_WORD(2220) +}; #undef FRAGMENT_WORD @@ -157,7 +164,7 @@ const WorkaroundEntry workaroundList[] = { // book back to the present. In the GRA version, it was global 373, // and was reset when he is returned to the past, but was forgotten // in the SCN version, so this ensures the flag is properly reset. - {TINSEL_V1, true, 427942095, 1, sizeof(fragment1), fragment1}, + {TINSEL_V1, true, false, Common::kPlatformUnknown, 427942095, 1, sizeof(fragment1), fragment1}, // DW1-GRA: Rincewind exiting the Inn is blocked by the luggage. // Whilst you can then move into walkable areas, saving and @@ -165,26 +172,26 @@ const WorkaroundEntry workaroundList[] = { // fragment turns off NPC blocking for the Outside Inn rooms so that // the luggage won't block Past Outside Inn. // See bug report #2525010. - {TINSEL_V1, false, 444622076, 0, sizeof(fragment2), fragment2}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 444622076, 0, sizeof(fragment2), fragment2}, // Present Outside Inn - {TINSEL_V1, false, 352600876, 0, sizeof(fragment2), fragment2}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 352600876, 0, sizeof(fragment2), fragment2}, // DW1-GRA: Talking to palace guards in Act 2 gives !!!HIGH // STRING||| - this happens if you initiate dialog with one of the // guards, but not the other. So these fragments provide the correct // talk parameters where needed. // See bug report #2831159. - {TINSEL_V1, false, 310506872, 463, sizeof(fragment4), fragment4}, - {TINSEL_V1, false, 310506872, 485, sizeof(fragment5), fragment5}, - {TINSEL_V1, false, 310506872, 513, sizeof(fragment6), fragment6}, - {TINSEL_V1, false, 310506872, 613, sizeof(fragment7), fragment7}, - {TINSEL_V1, false, 310506872, 641, sizeof(fragment8), fragment8}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 310506872, 463, sizeof(fragment4), fragment4}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 310506872, 485, sizeof(fragment5), fragment5}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 310506872, 513, sizeof(fragment6), fragment6}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 310506872, 613, sizeof(fragment7), fragment7}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 310506872, 641, sizeof(fragment8), fragment8}, // DW1-SCN: The script for the lovable street-Starfish does a // 'StopSample' after flicking the coin to ensure it's sound is // stopped, but which also accidentally can stop any active // conversation with the Amazon. - {TINSEL_V1, true, 394640351, 121, sizeof(fragment9), fragment9}, + {TINSEL_V1, true, false, Common::kPlatformUnknown, 394640351, 121, sizeof(fragment9), fragment9}, // DW2: In the garden, global #490 is set when the bees begin their // 'out of hive' animation, and reset when done. But if the game is @@ -197,25 +204,29 @@ const WorkaroundEntry workaroundList[] = { // * Stealing the mallets from the wizards (bug #2820788). // This fix ensures that the global is reset when the Garden scene // is loaded (both entering and restoring a game). - {TINSEL_V2, true, 2888147476U, 0, sizeof(fragment3), fragment3}, + {TINSEL_V2, true, false, Common::kPlatformUnknown, 2888147476U, 0, sizeof(fragment3), fragment3}, // DW1-GRA: Corrects text being drawn partially off-screen during // the blackboard description of the Librarian. - {TINSEL_V1, false, 293831402, 133, sizeof(fragment10), fragment10}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 293831402, 133, sizeof(fragment10), fragment10}, // DW1-GRA/SCN: Corrects the dead-end of being able to give the // whistle back to the pirate before giving him the parrot. // See bug report #2934211. - {TINSEL_V1, true, 352601285, 1569, sizeof(fragment11), fragment11}, - {TINSEL_V1, false, 352602304, 1488, sizeof(fragment12), fragment12}, + {TINSEL_V1, true, false, Common::kPlatformUnknown, 352601285, 1569, sizeof(fragment11), fragment11}, + {TINSEL_V1, false, false, Common::kPlatformUnknown, 352602304, 1488, sizeof(fragment12), fragment12}, // DW2: Corrects a bug with global 306 not being cleared if you leave // the marketplace scene whilst D'Blah is talking (even if it's not // actually audible); returning to the scene and clicking on him multiple // times would cause the game to crash - {TINSEL_V2, true, 1109294728, 0, sizeof(fragment13), fragment13}, + {TINSEL_V2, true, false, Common::kPlatformUnknown, 1109294728, 0, sizeof(fragment13), fragment13}, + + // DW1 PSX DEMO: Alters a script in the PSX DW1 demo to show the Idle animation scene rather than + // quitting the game when no user input happens for a while + {TINSEL_V1, true, true, Common::kPlatformPSX, 0, 2186, sizeof(fragment14), fragment14}, - {TINSEL_V0, false, 0, 0, 0, NULL} + {TINSEL_V0, false, false, Common::kPlatformUnknown, 0, 0, 0, NULL} }; //----------------- LOCAL GLOBAL DATA -------------------- @@ -582,6 +593,8 @@ void Interpret(CORO_PARAM, INT_CONTEXT *ic) { if ((wkEntry->version == TinselVersion) && (wkEntry->hCode == ic->hCode) && (wkEntry->ip == ip) && + (wkEntry->isDemo == _vm->getIsADGFDemo()) && + ((wkEntry->platform == Common::kPlatformUnknown) || (wkEntry->platform == _vm->getPlatform())) && (!TinselV1 || (wkEntry->scnFlag == ((_vm->getFeatures() & GF_SCNFILES) != 0)))) { // Point to start of workaround fragment ip = 0; diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h index bac7ef6efb..5660366657 100644 --- a/engines/tinsel/tinsel.h +++ b/engines/tinsel/tinsel.h @@ -186,6 +186,7 @@ public: uint16 getVersion() const; uint32 getFlags() const; Common::Platform getPlatform() const; + bool getIsADGFDemo() const; const char *getSampleIndex(LANGUAGE lang); const char *getSampleFile(LANGUAGE lang); -- cgit v1.2.3 From 89aa6573fed989131da5e34648f70b0669e39501 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 14:38:26 +0300 Subject: TINSEL: Remove the GF_DEMO flag --- engines/tinsel/detection_tables.h | 4 ++-- engines/tinsel/music.cpp | 2 +- engines/tinsel/scene.h | 6 +++--- engines/tinsel/sound.cpp | 2 +- engines/tinsel/tinlib.cpp | 4 ++-- engines/tinsel/tinsel.h | 22 ++++++++++------------ 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index ef562a5e08..dc3b5f1382 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -47,7 +47,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_DEMO, + 0, TINSEL_V0, }, @@ -551,7 +551,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW2, 0, - GF_CD | GF_SCNFILES | GF_DEMO, + GF_CD | GF_SCNFILES, TINSEL_V2, }, diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp index a226feb656..637e043e11 100644 --- a/engines/tinsel/music.cpp +++ b/engines/tinsel/music.cpp @@ -300,7 +300,7 @@ void OpenMidiFiles() { Common::File midiStream; // Demo version has no midi file - if ((_vm->getFeatures() & GF_DEMO) || (TinselVersion == TINSEL_V2)) + if (TinselV0 || TinselV2) return; if (g_midiBuffer.pDat) diff --git a/engines/tinsel/scene.h b/engines/tinsel/scene.h index baaff27a3e..06e5c096d9 100644 --- a/engines/tinsel/scene.h +++ b/engines/tinsel/scene.h @@ -75,9 +75,9 @@ enum REEL { typedef enum { TRANS_DEF, TRANS_CUT, TRANS_FADE } TRANSITS; // amount to shift scene handles by -#define SCNHANDLE_SHIFT ((TinselV2 && !IsDemo) ? 25 : 23) -#define OFFSETMASK ((TinselV2 && !IsDemo) ? 0x01ffffffL : 0x007fffffL) -#define HANDLEMASK ((TinselV2 && !IsDemo) ? 0xFE000000L : 0xFF800000L) +#define SCNHANDLE_SHIFT ((TinselV2 && !TinselV2Demo) ? 25 : 23) +#define OFFSETMASK ((TinselV2 && !TinselV2Demo) ? 0x01ffffffL : 0x007fffffL) +#define HANDLEMASK ((TinselV2 && !TinselV2Demo) ? 0xFE000000L : 0xFF800000L) void DoHailScene(SCNHANDLE scene); diff --git a/engines/tinsel/sound.cpp b/engines/tinsel/sound.cpp index f575b03270..f0ad62a091 100644 --- a/engines/tinsel/sound.cpp +++ b/engines/tinsel/sound.cpp @@ -471,7 +471,7 @@ void SoundManager::setSFXVolumes(uint8 volume) { */ void SoundManager::openSampleFiles() { // Floppy and demo versions have no sample files, except for the Discworld 2 demo - if (_vm->getFeatures() & GF_FLOPPY || (IsDemo && !TinselV2)) + if (_vm->getFeatures() & GF_FLOPPY || TinselV0) return; TinselFile f; diff --git a/engines/tinsel/tinlib.cpp b/engines/tinsel/tinlib.cpp index 5dda836144..7c4fec6592 100644 --- a/engines/tinsel/tinlib.cpp +++ b/engines/tinsel/tinlib.cpp @@ -3412,7 +3412,7 @@ static void TalkOrSay(CORO_PARAM, SPEECH_TYPE speechType, SCNHANDLE hText, int x // Kick off the sample now (perhaps with a delay) if (g_bNoPause) g_bNoPause = false; - else if (!IsDemo) + else if (!TinselV2Demo) CORO_SLEEP(SysVar(SV_SPEECHDELAY)); //SamplePlay(VOICE, hText, _ctx->sub, false, -1, -1, PRIORITY_TALK); @@ -4244,7 +4244,7 @@ int CallLibraryRoutine(CORO_PARAM, int operand, int32 *pp, const INT_CONTEXT *pi int libCode; if (TinselV0) libCode = DW1DEMO_CODES[operand]; else if (!TinselV2) libCode = DW1_CODES[operand]; - else if (_vm->getFeatures() & GF_DEMO) libCode = DW2DEMO_CODES[operand]; + else if (TinselV2Demo) libCode = DW2DEMO_CODES[operand]; else libCode = DW2_CODES[operand]; debug(7, "CallLibraryRoutine op %d (escOn %d, myEscape %d)", operand, pic->escOn, pic->myEscape); diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h index 5660366657..ef04669f5f 100644 --- a/engines/tinsel/tinsel.h +++ b/engines/tinsel/tinsel.h @@ -63,21 +63,20 @@ enum TinselGameID { }; enum TinselGameFeatures { - GF_DEMO = 1 << 0, - GF_CD = 1 << 1, - GF_FLOPPY = 1 << 2, - GF_SCNFILES = 1 << 3, - GF_ENHANCED_AUDIO_SUPPORT = 1 << 4, - GF_ALT_MIDI = 1 << 5, // Alternate sequence in midi.dat file + GF_CD = 1 << 0, + GF_FLOPPY = 1 << 1, + GF_SCNFILES = 1 << 2, + GF_ENHANCED_AUDIO_SUPPORT = 1 << 3, + GF_ALT_MIDI = 1 << 4, // Alternate sequence in midi.dat file // The GF_USE_?FLAGS values specify how many country flags are displayed // in the subtitles options dialog. // None of these defined -> 1 language, in ENGLISH.TXT - GF_USE_3FLAGS = 1 << 6, // French, German, Spanish - GF_USE_4FLAGS = 1 << 7, // French, German, Spanish, Italian - GF_USE_5FLAGS = 1 << 8, // All 5 flags + GF_USE_3FLAGS = 1 << 5, // French, German, Spanish + GF_USE_4FLAGS = 1 << 6, // French, German, Spanish, Italian + GF_USE_5FLAGS = 1 << 7, // All 5 flags - GF_BIG_ENDIAN = 1 << 9 + GF_BIG_ENDIAN = 1 << 8 }; /** @@ -134,11 +133,10 @@ typedef bool (*KEYFPTR)(const Common::KeyState &); #define TinselV0 (TinselVersion == TINSEL_V0) #define TinselV1 (TinselVersion == TINSEL_V1) #define TinselV2 (TinselVersion == TINSEL_V2) +#define TinselV2Demo (TinselVersion == TINSEL_V2 && _vm->getIsADGFDemo()) #define TinselV1PSX (TinselVersion == TINSEL_V1 && _vm->getPlatform() == Common::kPlatformPSX) #define TinselV1Mac (TinselVersion == TINSEL_V1 && _vm->getPlatform() == Common::kPlatformMacintosh) -#define IsDemo (_vm->getFeatures() & GF_DEMO) - #define READ_16(v) ((_vm->getFeatures() & GF_BIG_ENDIAN) ? READ_BE_UINT16(v) : READ_LE_UINT16(v)) #define READ_32(v) ((_vm->getFeatures() & GF_BIG_ENDIAN) ? READ_BE_UINT32(v) : READ_LE_UINT32(v)) -- cgit v1.2.3 From bd09eb06557514b4e68e6dc915cd71976af677bb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 14:41:27 +0300 Subject: TINSEL: Reorder the detection entries to split the DW1 and DW2 entries --- engines/tinsel/detection_tables.h | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index dc3b5f1382..23d8d2242b 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -535,26 +535,6 @@ static const TinselGameDescription gameDescriptions[] = { TINSEL_V1, }, - { // English DW2 demo - { - "dw2", - "Demo", - { - {"dw2.scn", 0, "853ab998f5136b69bc586991175d6eeb", 4231121}, - {"english.smp", 0, "b5660a0e031cb4710bcb0ef5629ea61d", 28562357}, - {NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DEMO, - GUIO1(GUIO_NOASPECT) - }, - GID_DW2, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V2, - }, - { // Polish fan translaction Discworld 1 { "dw", @@ -576,6 +556,26 @@ static const TinselGameDescription gameDescriptions[] = { TINSEL_V1, }, + { // English Discworld 2 demo + { + "dw2", + "Demo", + { + {"dw2.scn", 0, "853ab998f5136b69bc586991175d6eeb", 4231121}, + {"english.smp", 0, "b5660a0e031cb4710bcb0ef5629ea61d", 28562357}, + {NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO, + GUIO1(GUIO_NOASPECT) + }, + GID_DW2, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V2, + }, + { // European/Australian Discworld 2 release { "dw2", -- cgit v1.2.3 From d4a354c17f811faa916bf548a11a88cb51c3b7b2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 14:55:06 +0300 Subject: TINSEL: Remove the GF_CD and GF_FLOPPY flags --- engines/tinsel/detection.cpp | 4 ++ engines/tinsel/detection_tables.h | 92 +++++++++++++++++++-------------------- engines/tinsel/sound.cpp | 6 +-- engines/tinsel/tinsel.h | 17 ++++---- 4 files changed, 61 insertions(+), 58 deletions(-) diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp index 6d20f8bee2..2e4be33e53 100644 --- a/engines/tinsel/detection.cpp +++ b/engines/tinsel/detection.cpp @@ -67,6 +67,10 @@ bool TinselEngine::getIsADGFDemo() const { return (bool)(_gameDescription->desc.flags & ADGF_DEMO); } +bool TinselEngine::isCD() const { + return (bool)(_gameDescription->desc.flags & ADGF_CD); +} + } // End of namespace Tinsel static const PlainGameDescriptor tinselGames[] = { diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index 23d8d2242b..5f305f06e4 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -61,12 +61,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_DEMO, + ADGF_DEMO | ADGF_CD, GUIO0() }, GID_DW1, 0, - GF_CD, + 0, TINSEL_V1, }, #if 0 @@ -81,12 +81,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_DEMO, + ADGF_DEMO | ADGF_CD, GUIO0() }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_BIG_ENDIAN, + GF_SCNFILES | GF_BIG_ENDIAN, TINSEL_V1, }, #endif @@ -110,7 +110,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_FLOPPY | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -133,7 +133,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_FLOPPY | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -156,7 +156,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_FLOPPY | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -179,7 +179,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_FLOPPY | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -195,7 +195,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_FLOPPY | GF_ENHANCED_AUDIO_SUPPORT, + GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -214,7 +214,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_ENHANCED_AUDIO_SUPPORT, + GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -228,12 +228,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, 0, - GF_CD | GF_ENHANCED_AUDIO_SUPPORT, + GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -249,7 +249,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_FLOPPY | GF_ENHANCED_AUDIO_SUPPORT, + GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -271,7 +271,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -296,7 +296,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -315,12 +315,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, + ADGF_DROPLANGUAGE, GUIO0() }, GID_DW1, 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, { @@ -343,7 +343,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, { @@ -366,7 +366,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -386,7 +386,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -406,7 +406,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -425,7 +425,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -443,12 +443,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPSX, - ADGF_DEMO, + ADGF_CD | ADGF_DEMO, GUIO0() }, GID_DW1, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V1, }, @@ -469,7 +469,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, #endif @@ -491,7 +491,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT | GF_BIG_ENDIAN, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT | GF_BIG_ENDIAN, TINSEL_V1, }, @@ -510,7 +510,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT | GF_ALT_MIDI, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT | GF_ALT_MIDI, TINSEL_V1, }, @@ -531,7 +531,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -547,12 +547,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::PL_POL, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO_NONE }, GID_DW1, 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, @@ -567,12 +567,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_DEMO, + ADGF_DEMO | ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_DW2, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V2, }, @@ -587,12 +587,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_GRB, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_DW2, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V2, }, @@ -607,12 +607,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::EN_USA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_DW2, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V2, }, @@ -627,12 +627,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_DW2, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V2, }, @@ -647,12 +647,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_DW2, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V2, }, @@ -668,12 +668,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_DW2, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V2, }, { @@ -688,12 +688,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_DW2, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V2, }, @@ -709,12 +709,12 @@ static const TinselGameDescription gameDescriptions[] = { }, Common::RU_RUS, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_CD, GUIO1(GUIO_NOASPECT) }, GID_DW2, 0, - GF_CD | GF_SCNFILES, + GF_SCNFILES, TINSEL_V2, }, diff --git a/engines/tinsel/sound.cpp b/engines/tinsel/sound.cpp index f0ad62a091..e052302cfd 100644 --- a/engines/tinsel/sound.cpp +++ b/engines/tinsel/sound.cpp @@ -75,7 +75,7 @@ SoundManager::~SoundManager() { // playSample for DiscWorld 1 bool SoundManager::playSample(int id, Audio::Mixer::SoundType type, Audio::SoundHandle *handle) { // Floppy version has no sample file - if (_vm->getFeatures() & GF_FLOPPY) + if (!_vm->isCD()) return false; // no sample driver? @@ -182,7 +182,7 @@ bool SoundManager::playSample(int id, int sub, bool bLooped, int x, int y, int p Audio::Mixer::SoundType type, Audio::SoundHandle *handle) { // Floppy version has no sample file - if (_vm->getFeatures() & GF_FLOPPY) + if (!_vm->isCD()) return false; // no sample driver? @@ -471,7 +471,7 @@ void SoundManager::setSFXVolumes(uint8 volume) { */ void SoundManager::openSampleFiles() { // Floppy and demo versions have no sample files, except for the Discworld 2 demo - if (_vm->getFeatures() & GF_FLOPPY || TinselV0) + if (!_vm->isCD() || TinselV0) return; TinselFile f; diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h index ef04669f5f..38c17812b4 100644 --- a/engines/tinsel/tinsel.h +++ b/engines/tinsel/tinsel.h @@ -63,20 +63,18 @@ enum TinselGameID { }; enum TinselGameFeatures { - GF_CD = 1 << 0, - GF_FLOPPY = 1 << 1, - GF_SCNFILES = 1 << 2, - GF_ENHANCED_AUDIO_SUPPORT = 1 << 3, - GF_ALT_MIDI = 1 << 4, // Alternate sequence in midi.dat file + GF_SCNFILES = 1 << 0, + GF_ENHANCED_AUDIO_SUPPORT = 1 << 1, + GF_ALT_MIDI = 1 << 2, // Alternate sequence in midi.dat file // The GF_USE_?FLAGS values specify how many country flags are displayed // in the subtitles options dialog. // None of these defined -> 1 language, in ENGLISH.TXT - GF_USE_3FLAGS = 1 << 5, // French, German, Spanish - GF_USE_4FLAGS = 1 << 6, // French, German, Spanish, Italian - GF_USE_5FLAGS = 1 << 7, // All 5 flags + GF_USE_3FLAGS = 1 << 3, // French, German, Spanish + GF_USE_4FLAGS = 1 << 4, // French, German, Spanish, Italian + GF_USE_5FLAGS = 1 << 5, // All 5 flags - GF_BIG_ENDIAN = 1 << 8 + GF_BIG_ENDIAN = 1 << 6 }; /** @@ -185,6 +183,7 @@ public: uint32 getFlags() const; Common::Platform getPlatform() const; bool getIsADGFDemo() const; + bool isCD() const; const char *getSampleIndex(LANGUAGE lang); const char *getSampleFile(LANGUAGE lang); -- cgit v1.2.3 From a5af61005c4a2f3daacc40c81da06ff344c9bbd3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 15:00:00 +0300 Subject: TINSEL: Remove the GF_BIG_ENDIAN flag --- engines/tinsel/detection_tables.h | 4 ++-- engines/tinsel/drives.cpp | 2 +- engines/tinsel/tinsel.h | 8 +++----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index 5f305f06e4..631c2dce14 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -86,7 +86,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_SCNFILES | GF_BIG_ENDIAN, + GF_SCNFILES, TINSEL_V1, }, #endif @@ -491,7 +491,7 @@ static const TinselGameDescription gameDescriptions[] = { }, GID_DW1, 0, - GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT | GF_BIG_ENDIAN, + GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, TINSEL_V1, }, diff --git a/engines/tinsel/drives.cpp b/engines/tinsel/drives.cpp index 5c4b939e4e..3ecef83753 100644 --- a/engines/tinsel/drives.cpp +++ b/engines/tinsel/drives.cpp @@ -149,7 +149,7 @@ bool GotoCD() { bool TinselFile::_warningShown = false; -TinselFile::TinselFile() : ReadStreamEndian((_vm->getFeatures() & GF_BIG_ENDIAN) != 0) { +TinselFile::TinselFile() : ReadStreamEndian(TinselV1Mac) { _stream = NULL; } diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h index 38c17812b4..123249125e 100644 --- a/engines/tinsel/tinsel.h +++ b/engines/tinsel/tinsel.h @@ -72,9 +72,7 @@ enum TinselGameFeatures { // None of these defined -> 1 language, in ENGLISH.TXT GF_USE_3FLAGS = 1 << 3, // French, German, Spanish GF_USE_4FLAGS = 1 << 4, // French, German, Spanish, Italian - GF_USE_5FLAGS = 1 << 5, // All 5 flags - - GF_BIG_ENDIAN = 1 << 6 + GF_USE_5FLAGS = 1 << 5 // All 5 flags }; /** @@ -135,8 +133,8 @@ typedef bool (*KEYFPTR)(const Common::KeyState &); #define TinselV1PSX (TinselVersion == TINSEL_V1 && _vm->getPlatform() == Common::kPlatformPSX) #define TinselV1Mac (TinselVersion == TINSEL_V1 && _vm->getPlatform() == Common::kPlatformMacintosh) -#define READ_16(v) ((_vm->getFeatures() & GF_BIG_ENDIAN) ? READ_BE_UINT16(v) : READ_LE_UINT16(v)) -#define READ_32(v) ((_vm->getFeatures() & GF_BIG_ENDIAN) ? READ_BE_UINT32(v) : READ_LE_UINT32(v)) +#define READ_16(v) (TinselV1Mac ? READ_BE_UINT16(v) : READ_LE_UINT16(v)) +#define READ_32(v) (TinselV1Mac ? READ_BE_UINT32(v) : READ_LE_UINT32(v)) // Global reference to the TinselEngine object extern TinselEngine *_vm; -- cgit v1.2.3 From 3ef5baed129fc739a65d846769debed67d5772db Mon Sep 17 00:00:00 2001 From: Simon Sawatzki Date: Sat, 14 Jul 2012 23:38:53 +0200 Subject: I18N: Updated German GUI translation. --- po/de_DE.po | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/po/de_DE.po b/po/de_DE.po index c40e08034a..bb53f4e2ff 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -8,10 +8,10 @@ msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-07-08 12:25+0100\n" -"PO-Revision-Date: 2012-01-29 21:11+0100\n" +"PO-Revision-Date: 2012-07-14 22:49+0100\n" "Last-Translator: Simon Sawatzki \n" "Language-Team: Simon Sawatzki (Lead), Lothar Serra Mari " -" (Contributor)\n" +"(Contributor)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" @@ -2210,7 +2210,6 @@ msgid "Choose Spell" msgstr "Zauberspruch auswhlen" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2220,10 +2219,10 @@ msgid "" msgstr "" "Sie scheinen ein General-MIDI-Gert zu\n" "verwenden, aber das Spiel untersttzt nur\n" -"Roland MT-32 MIDI. Es wird versucht, die\n" -"Roland-MT-32-Instrumente denen von\n" -"General MIDI zuzuordnen. Es kann jedoch\n" -"vorkommen, dass ein paar Musikstcke nicht\n" +"Roland MT32 MIDI. Es wird versucht, die\n" +"Roland-MT32-Instrumente denen von\n" +"General MIDI zuzuordnen. Es ist dennoch\n" +"mglich, dass ein paar Musikstcke nicht\n" "richtig abgespielt werden." #: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -- cgit v1.2.3 From 8865ece35904e51f8fb4e6432cb2590f27ac2362 Mon Sep 17 00:00:00 2001 From: Simon Sawatzki Date: Sat, 14 Jul 2012 23:40:32 +0200 Subject: DOCS: Updated German README (Liesmich) and NEWS (Neues). Liesmich now based on README SHA1 ID: 604c6bde91a9f1fb71d18f8fdcc172fc738ff9ef Neues now based on NEWS SHA1 ID: 3de8c4b07d6f15fe6e9ca4bcb8da92532ebf5692 --- doc/de/Liesmich | 2 +- doc/de/Neues | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/doc/de/Liesmich b/doc/de/Liesmich index e8ee4ca3f8..88b6ce6de8 100644 --- a/doc/de/Liesmich +++ b/doc/de/Liesmich @@ -2241,7 +2241,7 @@ folgende nicht standardmäßige Schlüsselwörter: erweiterten von ScummVM verwendet. native_fb01 Bool Falls „true“, wird für die MIDI-Ausgabe der Musiktreiber für eine Music-Feature-Karte - von IBM oder für ein Yahama-FB-01-FM- + von IBM oder für ein Yamaha-FB-01-FM- Synthetisierungsmodul verwendet. Baphomets Fluch II verfügt zusätzlich über folgende nicht standardmäßige diff --git a/doc/de/Neues b/doc/de/Neues index 7c6699fcb0..74203148e7 100644 --- a/doc/de/Neues +++ b/doc/de/Neues @@ -2,7 +2,7 @@ Umfangreichere Änderungsaufzeichnungen des neusten experimentellen Codes finden Sie auf Englisch unter: https://github.com/scummvm/scummvm/commits/ -1.5.0 (??.??.????) +1.5.0 (27.07.2012) Neue Spiele: - Unterstützung für Backyard Baseball 2003 hinzugefügt. - Unterstützung für Blue Force hinzugefügt. @@ -10,10 +10,7 @@ Sie auf Englisch unter: - Unterstützung für Dreamweb hinzugefügt. - Unterstützung für Geisha hinzugefügt. - Unterstützung für Gregor und der Heißluftballon hinzugefügt. - - Unterstützung für Magic Tales: Baba Yaga and the Magic Geese hinzugefügt. - - Unterstützung für Magic Tales: Imo and the King hinzugefügt. - Unterstützung für Magic Tales: Liam Finds a Story hinzugefügt. - - Unterstützung für Magic Tales: The Little Samurai hinzugefügt. - Unterstützung für Once Upon A Time: Little Red Riding Hood hinzugefügt. - Unterstützung für Sleeping Cub's Test of Courage hinzugefügt. - Unterstützung für Soltys hinzugefügt. @@ -36,12 +33,10 @@ Allgemein: - Aussehen von vorhersagendem Eingabedialog verbessert. - Verschiedene Verbesserungen der grafischen Benutzeroberfläche. - SDL-Portierungen: - - Unterstützung für OpenGL hinzugefügt. (GSoC-Aufgabe) - Baphomets Fluch 1: - Falsche Soundeffekte in der DOS-/Windows-Demo korrigiert. - Unterstützung für PlayStation-Videos hinzugefügt. + - Fehlende Untertitel zur Demo hinzugefügt. Baphomets Fluch 2: - Unterstützung für PlayStation-Videos hinzugefügt. @@ -49,6 +44,10 @@ Allgemein: Cine: - Roland-MT-32-Ausgabetreiber integriert. + Drascula: + - Spanische Untertitel zur Zwischensequenz mit Von Braun + hinzugefügt (3069981: Keine Untertitel in Szene mit „Von Braun“). + Gob: - Absturz in Lost in Time beseitigt. - AdLib-Abspieler umgeschrieben. Den nun funktionierenden MDY-Abspieler in @@ -69,6 +68,10 @@ Allgemein: - Unterstützung für Seitenverhältniskorrektur hinzugefügt. - Unterstützung für 16 Bits pro Pixel bei Spielen integriert. + Maemo-Portierung: + - Unterstützung für Nokia 770 mit dem Betriebssystem OS2008 HE hinzugefügt. + - Konfigurierbare Tastenzuweisung hinzugefügt. + Windows-Portierung: - Standard-Verzeichnis für Spielstände bei Windows NT4/2000/XP/Vista/7 geändert. -- cgit v1.2.3 From 790b0ca83cee7f4d7d11e6b310407501ed58a3ee Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 15 Jul 2012 14:07:35 +0100 Subject: I18N: Update French translation --- po/fr_FR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/fr_FR.po b/po/fr_FR.po index 4631d4c91a..5faab55d83 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -1262,7 +1262,7 @@ msgstr "Jouer quand m #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "Utiliser les dialogues sauvegarde/chargement d'origine" +msgstr "Dialogues sauvegarde/chargement d'origine" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 -- cgit v1.2.3 From 093a48989a9cbdb88c5833299c2b574950d677a1 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 15 Jul 2012 14:13:33 +0100 Subject: I18N: Regenerate translations data file --- gui/themes/translations.dat | Bin 342141 -> 342397 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 0e32008bd9..4b35fdb9a8 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From 4c3b4835aae1fe671253a65f6a10649c5ab2014c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 16:54:29 +0300 Subject: TINSEL: Fix bug #3459999 - "TINSEL: DW Crash in Subtitle Menu" --- engines/tinsel/dialogs.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/engines/tinsel/dialogs.cpp b/engines/tinsel/dialogs.cpp index fbe9e8d1f6..c33b412f6f 100644 --- a/engines/tinsel/dialogs.cpp +++ b/engines/tinsel/dialogs.cpp @@ -1038,18 +1038,20 @@ static bool RePosition(); static bool LanguageChange() { LANGUAGE nLang = _vm->_config->_language; - if (_vm->getFeatures() & GF_USE_3FLAGS) { - // VERY quick dodgy bodge - if (cd.selBox == 0) - nLang = TXT_FRENCH; // = 1 - else if (cd.selBox == 1) - nLang = TXT_GERMAN; // = 2 - else - nLang = TXT_SPANISH; // = 4 - } else if (_vm->getFeatures() & GF_USE_4FLAGS) { - nLang = (LANGUAGE)(cd.selBox + 1); - } else if (_vm->getFeatures() & GF_USE_5FLAGS) { - nLang = (LANGUAGE)cd.selBox; + if ((_vm->getFeatures() & GF_USE_3FLAGS) || (_vm->getFeatures() & GF_USE_4FLAGS) || (_vm->getFeatures() & GF_USE_5FLAGS)) { + // Languages: TXT_ENGLISH, TXT_FRENCH, TXT_GERMAN, TXT_ITALIAN, TXT_SPANISH + // 5 flag versions include English + int selected = (_vm->getFeatures() & GF_USE_5FLAGS) ? cd.selBox : cd.selBox + 1; + // Make sure that a language flag has been selected. If the user has + // changed the language speed slider and hasn't clicked on a flag, it + // won't be selected. + if (selected >= 0 && selected <= 4) { + nLang = (LANGUAGE)selected; + + // 3 flag versions don't include Italian + if (selected >= 3 && (_vm->getFeatures() & GF_USE_3FLAGS)) + nLang = TXT_SPANISH; + } } if (nLang != _vm->_config->_language) { -- cgit v1.2.3 From 1fffbe40ceb82bec77479c56176abeff0d2bd5e5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 17:37:55 +0300 Subject: TINSEL: Change SetMidiVolume() so that it doesn't start/stop music tracks Previously, SetMidiVolume() would stop the currently playing track when the MIDI volume was set to 0. Now, the music track always plays, even when the volume is set to 0. This fixes bug #3541533 - "DW: Silencing music volume stops music" and resolves two FIXME comments --- engines/tinsel/music.cpp | 44 ++++++++++---------------------------------- engines/tinsel/tinlib.cpp | 21 ++++++--------------- 2 files changed, 16 insertions(+), 49 deletions(-) diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp index 637e043e11..b3bfbcc5dc 100644 --- a/engines/tinsel/music.cpp +++ b/engines/tinsel/music.cpp @@ -131,13 +131,11 @@ bool PlayMidiSequence(uint32 dwFileOffset, bool bLoop) { g_currentMidi = dwFileOffset; g_currentLoop = bLoop; - if (_vm->_config->_musicVolume != 0) { - bool mute = false; - if (ConfMan.hasKey("mute")) - mute = ConfMan.getBool("mute"); + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); - SetMidiVolume(mute ? 0 : _vm->_config->_musicVolume); - } + SetMidiVolume(mute ? 0 : _vm->_config->_musicVolume); // the index and length of the last tune loaded uint32 dwSeqLen = 0; // length of the sequence @@ -270,27 +268,7 @@ int GetMidiVolume() { */ void SetMidiVolume(int vol) { assert(vol >= 0 && vol <= Audio::Mixer::kMaxChannelVolume); - - static int priorVolMusic = 0; // FIXME: Avoid non-const global vars - - if (vol == 0 && priorVolMusic == 0) { - // Nothing to do - } else if (vol == 0 && priorVolMusic != 0) { - // Stop current midi sequence - StopMidi(); - _vm->_midiMusic->setVolume(vol); - } else if (vol != 0 && priorVolMusic == 0) { - // Perhaps restart last midi sequence - if (g_currentLoop) - PlayMidiSequence(g_currentMidi, true); - - _vm->_midiMusic->setVolume(vol); - } else if (vol != 0 && priorVolMusic != 0) { - // Alter current volume - _vm->_midiMusic->setVolume(vol); - } - - priorVolMusic = vol; + _vm->_midiMusic->setVolume(vol); } /** @@ -933,14 +911,12 @@ void RestoreMidiFacts(SCNHANDLE Midi, bool Loop) { g_currentMidi = Midi; g_currentLoop = Loop; - if (_vm->_config->_musicVolume != 0 && Loop) { - bool mute = false; - if (ConfMan.hasKey("mute")) - mute = ConfMan.getBool("mute"); + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); - PlayMidiSequence(g_currentMidi, true); - SetMidiVolume(mute ? 0 : _vm->_config->_musicVolume); - } + PlayMidiSequence(g_currentMidi, true); + SetMidiVolume(mute ? 0 : _vm->_config->_musicVolume); } #if 0 diff --git a/engines/tinsel/tinlib.cpp b/engines/tinsel/tinlib.cpp index 7c4fec6592..058f8eb6fd 100644 --- a/engines/tinsel/tinlib.cpp +++ b/engines/tinsel/tinlib.cpp @@ -1625,10 +1625,6 @@ static void Play(CORO_PARAM, SCNHANDLE hFilm, int x, int y, bool bComplete, int * Play a midi file. */ static void PlayMidi(CORO_PARAM, SCNHANDLE hMidi, int loop, bool complete) { - // FIXME: This is a workaround for the FIXME below - if (GetMidiVolume() == 0) - return; - CORO_BEGIN_CONTEXT; CORO_END_CONTEXT(_ctx); @@ -1637,18 +1633,13 @@ static void PlayMidi(CORO_PARAM, SCNHANDLE hMidi, int loop, bool complete) { PlayMidiSequence(hMidi, loop == MIDI_LOOP); - // FIXME: The following check messes up the script arguments when - // entering the secret door in the bookshelf in the library, - // leading to a crash, when the music volume is set to 0 (MidiPlaying() - // always false then). - // - // Why exactly this happens is unclear. An analysis of the involved - // script(s) might reveal more. - // - // Note: This check&sleep was added in DW v2. It was most likely added - // to ensure that the MIDI song started playing before the next opcode + // This check&sleep was added in DW v2. It was most likely added to + // ensure that the MIDI song started playing before the next opcode // is executed. - if (!MidiPlaying()) + // In DW1, it messes up the script arguments when entering the secret + // door in the bookshelf in the library, leading to a crash, when the + // music volume is set to 0. + if (!MidiPlaying() && TinselV2) CORO_SLEEP(1); if (complete) { -- cgit v1.2.3 From b17667cbcf64f68d94b9228f09c6c2fd6b9f1ed5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 15 Jul 2012 22:19:10 +0300 Subject: TINSEL: Fix bug #3541745 - "DW: PSX version has a too small Re-Start window" --- engines/tinsel/dialogs.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/tinsel/dialogs.cpp b/engines/tinsel/dialogs.cpp index c33b412f6f..dde34841cf 100644 --- a/engines/tinsel/dialogs.cpp +++ b/engines/tinsel/dialogs.cpp @@ -753,6 +753,11 @@ static CONFBOX t1RestartBox[] = { #endif }; +static CONFBOX t1RestartBoxPSX[] = { + { AAGBUT, INITGAME, TM_NONE, NULL, USE_POINTER, 122, 48, 23, 19, NULL, IX1_TICK1 }, + { AAGBUT, CLOSEWIN, TM_NONE, NULL, USE_POINTER, 82, 48, 23, 19, NULL, IX1_CROSS1 } +}; + static CONFBOX t2RestartBox[] = { { AAGBUT, INITGAME, TM_NONE, NULL, 0, 140, 78, BW, BH, NULL, IX2_TICK1 }, { AAGBUT, CLOSEWIN, TM_NONE, NULL, 0, 60, 78, BW, BH, NULL, IX2_CROSS1 } @@ -763,10 +768,10 @@ static CONFINIT t1ciRestart = { 6, 2, 72, 53, false, t1RestartBox, ARRAYSIZE(t1R #else static CONFINIT t1ciRestart = { 4, 2, 98, 53, false, t1RestartBox, ARRAYSIZE(t1RestartBox), SIX_RESTART_HEADING }; #endif +static CONFINIT t1ciRestartPSX = { 8, 2, 46, 53, false, t1RestartBoxPSX, ARRAYSIZE(t1RestartBoxPSX), SIX_RESTART_HEADING }; static CONFINIT t2ciRestart = { 4, 2, 196, 53, false, t2RestartBox, sizeof(t2RestartBox)/sizeof(CONFBOX), SS_RESTART_HEADING }; -#define ciRestart (TinselV2 ? t2ciRestart : t1ciRestart) -#define restartBox (TinselV2 ? t2RestartBox : t1RestartBox) +#define ciRestart (TinselV2 ? t2ciRestart : (TinselV1PSX ? t1ciRestartPSX : t1ciRestart)) /*-------------------------------------------------------------*\ | This is the sound control 'menu'. In Discworld 2, it also | -- cgit v1.2.3 From 1a90ca5ecd9eeaaca3b6de79dd940e9b29e472aa Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 16 Jul 2012 11:49:50 +0300 Subject: SCI: Handle all negative priority values. Fixes graphics in the SQ6 demo --- engines/sci/graphics/frameout.cpp | 17 ++++++----------- engines/sci/graphics/frameout.h | 4 ++-- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index cb56e24de9..fedae2eb6f 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -159,7 +159,7 @@ void GfxFrameout::kernelAddPlane(reg_t object) { newPlane.object = object; newPlane.priority = readSelectorValue(_segMan, object, SELECTOR(priority)); - newPlane.lastPriority = 0xFFFF; // hidden + newPlane.lastPriority = -1; // hidden newPlane.planeOffsetX = 0; newPlane.planeOffsetY = 0; newPlane.pictureId = kPlanePlainColored; @@ -465,15 +465,10 @@ bool sortHelper(const FrameoutEntry* entry1, const FrameoutEntry* entry2) { } bool planeSortHelper(const PlaneEntry &entry1, const PlaneEntry &entry2) { -// SegManager *segMan = g_sci->getEngineState()->_segMan; - -// uint16 plane1Priority = readSelectorValue(segMan, entry1, SELECTOR(priority)); -// uint16 plane2Priority = readSelectorValue(segMan, entry2, SELECTOR(priority)); - - if (entry1.priority == 0xffff) + if (entry1.priority < 0) return true; - if (entry2.priority == 0xffff) + if (entry2.priority < 0) return false; return entry1.priority < entry2.priority; @@ -639,13 +634,13 @@ void GfxFrameout::kernelFrameout() { _screen->drawLine(startPoint, endPoint, it2->color, it2->priority, it2->control); } - uint16 planeLastPriority = it->lastPriority; + int16 planeLastPriority = it->lastPriority; // Update priority here, sq6 sets it w/o UpdatePlane - uint16 planePriority = it->priority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); + int16 planePriority = it->priority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); it->lastPriority = planePriority; - if (planePriority == 0xffff) { // Plane currently not meant to be shown + if (planePriority < 0) { // Plane currently not meant to be shown // If plane was shown before, delete plane rect if (planePriority != planeLastPriority) _paint32->fillRect(it->planeRect, 0); diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index ecaf450d89..5fd2824224 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -40,8 +40,8 @@ typedef Common::List PlaneLineList; struct PlaneEntry { reg_t object; - uint16 priority; - uint16 lastPriority; + int16 priority; + int16 lastPriority; int16 planeOffsetX; int16 planeOffsetY; GuiResourceId pictureId; -- cgit v1.2.3 From 59ea9187457da7b771fbb760ad76805d3a6e3c6e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 16 Jul 2012 12:04:34 +0300 Subject: SCI: Temporarily disable text display in the demo of SQ6 to stop crashes --- engines/sci/engine/kgraphics32.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 16e54a5429..f0989f5f00 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -173,6 +173,10 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { debugC(kDebugLevelStrings, "%s", text.c_str()); uint16 maxWidth = argv[1].toUint16(); // nsRight - nsLeft + 1 uint16 maxHeight = argv[2].toUint16(); // nsBottom - nsTop + 1 + // These values can be larger than the screen in the SQ6 demo + // TODO: Find out why. For now, don't show any text in the SQ6 demo. + if (g_sci->getGameId() == GID_SQ6 && g_sci->isDemo()) + return NULL_REG; return g_sci->_gfxText32->createTextBitmap(object, maxWidth, maxHeight); } case 1: { -- cgit v1.2.3 From 49c76c835bf000622bd5b078ef87275a335934fa Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 16 Jul 2012 12:11:22 +0300 Subject: SCI: Only skip text in room 100 in the SQ6 demo --- engines/sci/engine/kgraphics32.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index f0989f5f00..093920e148 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -173,9 +173,9 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { debugC(kDebugLevelStrings, "%s", text.c_str()); uint16 maxWidth = argv[1].toUint16(); // nsRight - nsLeft + 1 uint16 maxHeight = argv[2].toUint16(); // nsBottom - nsTop + 1 - // These values can be larger than the screen in the SQ6 demo - // TODO: Find out why. For now, don't show any text in the SQ6 demo. - if (g_sci->getGameId() == GID_SQ6 && g_sci->isDemo()) + // These values can be larger than the screen in the SQ6 demo, room 100 + // TODO: Find out why. For now, don't show any text in that room. + if (g_sci->getGameId() == GID_SQ6 && g_sci->isDemo() && s->currentRoomNumber() == 100) return NULL_REG; return g_sci->_gfxText32->createTextBitmap(object, maxWidth, maxHeight); } -- cgit v1.2.3 From 85d87e834587517604872b52bc0a9877002d76b0 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Mon, 16 Jul 2012 21:20:01 +0100 Subject: CINE: Mark Operation Stealth as Unstable. Since the cine engine's support for Operation Stealth is still incomplete with significant GFX glitches, this should be marked as "ADGF_UNSTABLE" to warn users and prevent invalid bug reports. However, it should be noted that the game is completable. --- engines/cine/detection_tables.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/engines/cine/detection_tables.h b/engines/cine/detection_tables.h index 0ec2768bae..bf02f0519c 100644 --- a/engines/cine/detection_tables.h +++ b/engines/cine/detection_tables.h @@ -251,7 +251,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs00", "d6752e7d25924cb866b61eb7cb0c8b56"), Common::EN_GRB, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -267,7 +267,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs1", "9629129b86979fa592c1787385bf3695"), Common::EN_GRB, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -281,7 +281,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs1", "d8c3a9d05a63e4cfa801826a7063a126"), Common::EN_USA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -295,7 +295,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs00", "862a75d76fb7fffec30e52be9ad1c474"), Common::EN_USA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -309,7 +309,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs1", "39b91ae35d1297ce0a76a1a803ca1593"), Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -323,7 +323,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs1", "74c2dabd9d212525fca8875a5f6d8994"), Common::ES_ESP, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -341,7 +341,7 @@ static const CINEGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -355,7 +355,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs00", "f143567f08cfd1a9b1c9a41c89eadfef"), Common::FR_FRA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -369,7 +369,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs1", "da066e6b8dd93f2502c2a3755f08dc12"), Common::IT_ITA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO0() }, GType_OS, @@ -383,7 +383,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs0", "a9da5531ead0ebf9ad387fa588c0cbb0"), Common::EN_GRB, Common::kPlatformAmiga, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, @@ -397,7 +397,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs0", "8a429ced2f4acff8a15ae125174042e8"), Common::EN_GRB, Common::kPlatformAmiga, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, @@ -411,7 +411,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs0", "d5f27e33fc29c879f36f15b86ccfa58c"), Common::EN_USA, Common::kPlatformAmiga, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, @@ -425,7 +425,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs0", "8b7dce249821d3a62b314399c4334347"), Common::DE_DEU, Common::kPlatformAmiga, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, @@ -439,7 +439,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs0", "35fc295ddd0af9da932d256ba799a4b0"), Common::ES_ESP, Common::kPlatformAmiga, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, @@ -453,7 +453,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs0", "d4ea4a97e01fa67ea066f9e785050ed2"), Common::FR_FRA, Common::kPlatformAmiga, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, @@ -467,7 +467,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("demo", "8d3a750d1c840b1b1071e42f9e6f6aa2"), Common::EN_GRB, Common::kPlatformAmiga, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, @@ -481,7 +481,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs0", "1501d5ae364b2814a33ed19347c3fcae"), Common::EN_GRB, Common::kPlatformAtariST, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, @@ -495,7 +495,7 @@ static const CINEGameDescription gameDescriptions[] = { AD_ENTRY1("procs0", "2148d25de3219dd4a36580ca735d0afa"), Common::FR_FRA, Common::kPlatformAtariST, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, GType_OS, -- cgit v1.2.3 From eba2ed99f8b8bf0d3aaf6a314ffbd9e196da8c8c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 17 Jul 2012 00:49:09 +0300 Subject: SCI: Bugfix for kCreateTextBitmap(). Fixes the ComPost text in the SQ6 demo --- engines/sci/engine/kgraphics32.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 093920e148..7cfac57675 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -39,6 +39,7 @@ #include "sci/graphics/cache.h" #include "sci/graphics/compare.h" #include "sci/graphics/controls16.h" +#include "sci/graphics/coordadjuster.h" #include "sci/graphics/cursor.h" #include "sci/graphics/palette.h" #include "sci/graphics/paint16.h" @@ -171,8 +172,9 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { debugC(kDebugLevelStrings, "kCreateTextBitmap case 0 (%04x:%04x, %04x:%04x, %04x:%04x)", PRINT_REG(argv[1]), PRINT_REG(argv[2]), PRINT_REG(argv[3])); debugC(kDebugLevelStrings, "%s", text.c_str()); - uint16 maxWidth = argv[1].toUint16(); // nsRight - nsLeft + 1 - uint16 maxHeight = argv[2].toUint16(); // nsBottom - nsTop + 1 + int16 maxWidth = argv[1].toUint16(); + int16 maxHeight = argv[2].toUint16(); + g_sci->_gfxCoordAdjuster->fromScriptToDisplay(maxHeight, maxWidth); // These values can be larger than the screen in the SQ6 demo, room 100 // TODO: Find out why. For now, don't show any text in that room. if (g_sci->getGameId() == GID_SQ6 && g_sci->isDemo() && s->currentRoomNumber() == 100) -- cgit v1.2.3 From 43d3b2f378220278f508bfcea89d1aea6decaf6e Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 14 Jul 2012 16:55:14 -0400 Subject: LASTEXPRESS: Remove strange casts --- engines/lastexpress/data/font.cpp | 6 +++--- engines/lastexpress/game/inventory.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/lastexpress/data/font.cpp b/engines/lastexpress/data/font.cpp index 79cf64e617..8ac1afce9a 100644 --- a/engines/lastexpress/data/font.cpp +++ b/engines/lastexpress/data/font.cpp @@ -149,7 +149,7 @@ uint8 Font::getCharWidth(uint16 c) const{ uint16 Font::getStringWidth(Common::String str) const { uint16 width = 0; for (uint i = 0; i < str.size(); i++) - width += getCharWidth((unsigned) (int)str[i]); + width += getCharWidth((unsigned char)str[i]); return width; } @@ -185,8 +185,8 @@ void Font::drawChar(Graphics::Surface *surface, int16 x, int16 y, uint16 c) { Common::Rect Font::drawString(Graphics::Surface *surface, int16 x, int16 y, Common::String str) { int16 currentX = x; for (uint i = 0; i < str.size(); i++) { - drawChar(surface, currentX, y, (unsigned) (int)str[i]); - currentX += getCharWidth((unsigned) (int)str[i]); + drawChar(surface, currentX, y, (unsigned char)str[i]); + currentX += getCharWidth((unsigned char)str[i]); } return Common::Rect(x, y, x + currentX, y + (int16)_charHeight); diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index bb382ea38e..70536b7a6d 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -259,7 +259,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { // Change item highlight on list if (getFlags()->mouseLeftPressed) { - uint32 index = (unsigned) (int) ev.mouse.y / 40; + uint32 index = (uint16)ev.mouse.y / 40; if (_highlightedItemIndex && _highlightedItemIndex != index) drawHighlight(_highlightedItemIndex, true); -- cgit v1.2.3 From 9e64e62c08a9a170382bdeb394ad8ef39e0bb700 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 14 Jul 2012 18:12:11 -0400 Subject: LASTEXPRESS: Comment unused variable --- engines/lastexpress/sound/queue.cpp | 4 ++-- engines/lastexpress/sound/queue.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp index 5f3ab96d81..1fbb4138e3 100644 --- a/engines/lastexpress/sound/queue.cpp +++ b/engines/lastexpress/sound/queue.cpp @@ -38,7 +38,7 @@ SoundQueue::SoundQueue(LastExpressEngine *engine) : _engine(engine) { _subtitlesFlag = 0; _currentSubtitle = NULL; - _soundCacheData = NULL; + //_soundCacheData = NULL; } SoundQueue::~SoundQueue() { @@ -51,7 +51,7 @@ SoundQueue::~SoundQueue() { _subtitles.clear(); _currentSubtitle = NULL; - SAFE_DELETE(_soundCacheData); + //SAFE_DELETE(_soundCacheData); // Zero passed pointers _engine = NULL; diff --git a/engines/lastexpress/sound/queue.h b/engines/lastexpress/sound/queue.h index 75fe06883a..e1f9be1cf7 100644 --- a/engines/lastexpress/sound/queue.h +++ b/engines/lastexpress/sound/queue.h @@ -106,7 +106,7 @@ private: // Entries Common::List _soundList; ///< List of all sound entries - void *_soundCacheData; + //void *_soundCacheData; // Subtitles int _subtitlesFlag; -- cgit v1.2.3 From 876a8f9377b6c5533ca81c3c358e8b74014dc93f Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 15 Jul 2012 14:10:39 -0400 Subject: LASTEXPRESS: Replace COMPARTMENT_TO and COMPARTMENT_FROM_TO macros --- engines/lastexpress/entities/alouan.cpp | 8 ++-- engines/lastexpress/entities/entity.cpp | 68 ++++++++++++++++++++++++++++ engines/lastexpress/entities/entity.h | 51 +++++++++++++++++---- engines/lastexpress/entities/entity_intern.h | 60 ------------------------ engines/lastexpress/entities/hadija.cpp | 8 ++-- 5 files changed, 118 insertions(+), 77 deletions(-) diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp index 3ae38dcf27..8e56ae4c5b 100644 --- a/engines/lastexpress/entities/alouan.cpp +++ b/engines/lastexpress/entities/alouan.cpp @@ -86,22 +86,22 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(6, Alouan, compartment6) - COMPARTMENT_TO(Alouan, kObjectCompartment6, kPosition_4070, "621Cf", "621Df"); + Entity::goToCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Cf", "621Df", WRAP_ENTER_FUNCTION(Alouan, setup_enterExitCompartment)); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(7, Alouan, compartment8) - COMPARTMENT_TO(Alouan, kObjectCompartment8, kPosition_2740, "621Ch", "621Dh"); + Entity::goToCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Ch", "621Dh", WRAP_ENTER_FUNCTION(Alouan, setup_enterExitCompartment)); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(8, Alouan, compartment6to8) - COMPARTMENT_FROM_TO(Alouan, kObjectCompartment6, kPosition_4070, "621Bf", kObjectCompartment8, kPosition_2740, "621Ah"); + Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Bf", kObjectCompartment8, kPosition_2740, "621Ah", WRAP_ENTER_FUNCTION(Alouan, setup_enterExitCompartment), WRAP_UPDATE_FUNCTION(Alouan, setup_updateEntity)); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(9, Alouan, compartment8to6) - COMPARTMENT_FROM_TO(Alouan, kObjectCompartment8, kPosition_2740, "621Bh", kObjectCompartment6, kPosition_4070, "621Af"); + Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Bh", kObjectCompartment6, kPosition_4070, "621Af", WRAP_ENTER_FUNCTION(Alouan, setup_enterExitCompartment), WRAP_UPDATE_FUNCTION(Alouan, setup_updateEntity)); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 7fdfd53d2f..776b9f6c40 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -464,6 +464,74 @@ void Entity::enterExitCompartment(const SavePoint &savepoint, EntityPosition pos } } +void Entity::goToCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, Common::String sequenceTo, Entity::EnterFunction *enterFunction) { + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getData()->entityPosition = positionFrom; + setCallback(1); + (*enterFunction)(sequenceFrom.c_str(), compartmentFrom); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + setCallback(2); + (*enterFunction)(sequenceTo.c_str(), compartmentFrom); + break; + + case 2: + getData()->entityPosition = positionFrom; + getEntities()->clearSequences(_entityIndex); + callbackAction(); + break; + } + break; + } +} + +void Entity::goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, ObjectIndex compartmentTo, EntityPosition positionTo, Common::String sequenceTo, Entity::EnterFunction *enterFunction, Entity::UpdateFunction *updateFunction) { + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getData()->entityPosition = positionFrom; + getData()->location = kLocationOutsideCompartment; + setCallback(1); + (*enterFunction)(sequenceFrom.c_str(), compartmentFrom); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + setCallback(2); + (*updateFunction)(kCarGreenSleeping, positionTo); + break; + + case 2: + setCallback(3); + (*enterFunction)(sequenceTo.c_str(), compartmentTo); + break; + + case 3: + getData()->location = kLocationInsideCompartment; + getEntities()->clearSequences(_entityIndex); + callbackAction(); + break; + } + break; + } +} + void Entity::updatePosition(const SavePoint &savepoint, bool handleExcuseMe) { EXPOSE_PARAMS(EntityData::EntityParametersSIII) diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 3fd2009313..bb2b96618e 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -616,19 +616,19 @@ public: EntityParameters *getParameters(uint callback, byte index) const; EntityParameters *getCurrentParameters(byte index = 0) { return getParameters(_data.currentCall, index); } - int getCallback(uint callback) const; - int getCurrentCallback() { return getCallback(_data.currentCall); } - void setCallback(uint callback, byte index); - void setCurrentCallback(uint index) { setCallback(_data.currentCall, index); } + int getCallback(uint callback) const; + int getCurrentCallback() { return getCallback(_data.currentCall); } + void setCallback(uint callback, byte index); + void setCurrentCallback(uint index) { setCallback(_data.currentCall, index); } void updateParameters(uint32 index) const; // Serializable - void saveLoadWithSerializer(Common::Serializer &ser); + void saveLoadWithSerializer(Common::Serializer &ser); private: - EntityCallData _data; + EntityCallData _data; EntityCallParameters _parameters[9]; }; @@ -665,9 +665,15 @@ public: protected: LastExpressEngine *_engine; - EntityIndex _entityIndex; - EntityData *_data; - Common::Array _callbacks; + EntityIndex _entityIndex; + EntityData *_data; + Common::Array _callbacks; + + typedef Common::Functor2 EnterFunction; + typedef Common::Functor2 UpdateFunction; + + #define WRAP_ENTER_FUNCTION(className, method) new Common::Functor2Mem(this, &className::method) + #define WRAP_UPDATE_FUNCTION(className, method) new Common::Functor2Mem(this, &className::method) /** * Saves the game @@ -781,6 +787,33 @@ protected: */ void enterExitCompartment(const SavePoint &savepoint, EntityPosition position1 = kPositionNone, EntityPosition position2 = kPositionNone, CarIndex car = kCarNone, ObjectIndex compartment = kObjectNone, bool alternate = false, bool updateLocation = false); + /** + * Go to compartment. + * + * @param savepoint The savepoint. + * @param compartmentFrom The compartment from. + * @param positionFrom The position from. + * @param sequenceFrom The sequence from. + * @param sequenceTo The sequence to. + * @param enterFunction The enter/exit compartment function. + */ + void goToCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, Common::String sequenceTo, EnterFunction *enterFunction); + + /** + * Go to compartment from compartment. + * + * @param savepoint The savepoint. + * @param compartmentFrom The compartment from. + * @param positionFrom The position from. + * @param sequenceFrom The sequence from. + * @param compartmentTo The compartment to. + * @param positionTo The position to. + * @param sequenceTo The sequence to. + * @param enterFunction The enter/exit compartment function. + * @param enterFunction The update entity function. + */ + void goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, ObjectIndex compartmentTo, EntityPosition positionTo, Common::String sequenceTo, Entity::EnterFunction *enterFunction, Entity::UpdateFunction *updateFunction); + /** * Updates the position * diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index c21f2c14e2..0613b7bb0b 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -451,66 +451,6 @@ void class::setup_##name() { \ if (!parameter) \ parameter = (uint)(type + value); -////////////////////////////////////////////////////////////////////////// -// Compartments -////////////////////////////////////////////////////////////////////////// -// Go from one compartment to another (or the same one if no optional args are passed -#define COMPARTMENT_TO(class, compartmentFrom, positionFrom, sequenceFrom, sequenceTo) \ - switch (savepoint.action) { \ - default: \ - break; \ - case kActionDefault: \ - getData()->entityPosition = positionFrom; \ - setCallback(1); \ - setup_enterExitCompartment(sequenceFrom, compartmentFrom); \ - break; \ - case kActionCallback: \ - switch (getCallback()) { \ - default: \ - break; \ - case 1: \ - setCallback(2); \ - setup_enterExitCompartment(sequenceTo, compartmentFrom); \ - break; \ - case 2: \ - getData()->entityPosition = positionFrom; \ - getEntities()->clearSequences(_entityIndex); \ - callbackAction(); \ - } \ - break; \ - } - -#define COMPARTMENT_FROM_TO(class, compartmentFrom, positionFrom, sequenceFrom, compartmentTo, positionTo, sequenceTo) \ - switch (savepoint.action) { \ - default: \ - break; \ - case kActionDefault: \ - getData()->entityPosition = positionFrom; \ - getData()->location = kLocationOutsideCompartment; \ - setCallback(1); \ - setup_enterExitCompartment(sequenceFrom, compartmentFrom); \ - break; \ - case kActionCallback: \ - switch (getCallback()) { \ - default: \ - break; \ - case 1: \ - setCallback(2); \ - setup_updateEntity(kCarGreenSleeping, positionTo); \ - break; \ - case 2: \ - setCallback(3); \ - setup_enterExitCompartment(sequenceTo, compartmentTo); \ - break; \ - case 3: \ - getData()->location = kLocationInsideCompartment; \ - getEntities()->clearSequences(_entityIndex); \ - callbackAction(); \ - break; \ - } \ - break; \ - } - } // End of namespace LastExpress #endif // LASTEXPRESS_ENTITY_INTERN_H diff --git a/engines/lastexpress/entities/hadija.cpp b/engines/lastexpress/entities/hadija.cpp index 09c80247d4..2dd239d4c9 100644 --- a/engines/lastexpress/entities/hadija.cpp +++ b/engines/lastexpress/entities/hadija.cpp @@ -86,22 +86,22 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(6, Hadija, compartment6) - COMPARTMENT_TO(Hadija, kObjectCompartment6, kPosition_4070, "619Cf", "619Df"); + Entity::goToCompartment(savepoint, kObjectCompartment6, kPosition_4070, "619Cf", "619Df", WRAP_ENTER_FUNCTION(Hadija, setup_enterExitCompartment)); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(7, Hadija, compartment8) - COMPARTMENT_TO(Hadija, kObjectCompartment8, kPosition_2740, "619Ch", "619Dh"); + Entity::goToCompartment(savepoint, kObjectCompartment8, kPosition_2740, "619Ch", "619Dh", WRAP_ENTER_FUNCTION(Hadija, setup_enterExitCompartment)); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(8, Hadija, compartment6to8) - COMPARTMENT_FROM_TO(Hadija, kObjectCompartment6, kPosition_4070, "619Bf", kObjectCompartment8, kPosition_2740, "619Ah"); + Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment6, kPosition_4070, "619Bf", kObjectCompartment8, kPosition_2740, "619Ah", WRAP_ENTER_FUNCTION(Hadija, setup_enterExitCompartment), WRAP_UPDATE_FUNCTION(Hadija, setup_updateEntity)); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(9, Hadija, compartment8to6) - COMPARTMENT_FROM_TO(Hadija, kObjectCompartment8, kPosition_2740, "619Bh", kObjectCompartment6, kPosition_4070, "619Af"); + Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment8, kPosition_2740, "619Bh", kObjectCompartment6, kPosition_4070, "619Af", WRAP_ENTER_FUNCTION(Hadija, setup_enterExitCompartment), WRAP_UPDATE_FUNCTION(Hadija, setup_updateEntity)); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3 From 96d0aedba93e4ba2691a5ee1eba24a1f07539c96 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 15 Jul 2012 17:21:36 -0400 Subject: LASTEXPRESS: Replace SAVEGAME_BLOOD_JACKET macro by function --- engines/lastexpress/entities/coudert.cpp | 39 ++++++++++++++++---------------- engines/lastexpress/entities/coudert.h | 1 + 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index dc7beb3167..66733acc16 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -37,15 +37,6 @@ namespace LastExpress { -#define SAVEGAME_BLOOD_JACKET() \ - if (getProgress().jacket == kJacketBlood \ - && getEntities()->isDistanceBetweenEntities(kEntityCoudert, kEntityPlayer, 1000) \ - && !getEntities()->isInsideCompartments(kEntityPlayer) \ - && !getEntities()->checkFields10(kEntityPlayer)) { \ - setCallback(1); \ - setup_savegame(kSavegameTypeEvent, kEventMertensBloodJacket); \ - } - Coudert::Coudert(LastExpressEngine *engine) : Entity(engine, kEntityCoudert) { ADD_CALLBACK_FUNCTION(Coudert, reset); ADD_CALLBACK_FUNCTION(Coudert, bloodJacket); @@ -124,7 +115,7 @@ IMPLEMENT_FUNCTION_S(2, Coudert, bloodJacket) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); break; case kActionExitCompartment: @@ -151,7 +142,7 @@ IMPLEMENT_FUNCTION_SI(3, Coudert, enterExitCompartment, ObjectIndex) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); return; case kActionCallback: @@ -177,7 +168,7 @@ IMPLEMENT_FUNCTION(4, Coudert, callbackActionOnDirection) break; } - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); break; case kActionExitCompartment: @@ -200,7 +191,7 @@ IMPLEMENT_FUNCTION_SIII(5, Coudert, enterExitCompartment2, ObjectIndex, EntityPo break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); return; case kActionCallback: @@ -221,7 +212,7 @@ IMPLEMENT_FUNCTION_S(6, Coudert, playSound) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); break; case kActionEndSound: @@ -250,7 +241,7 @@ IMPLEMENT_FUNCTION_NOSETUP(7, Coudert, playSound16) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); break; case kActionEndSound: @@ -363,7 +354,7 @@ IMPLEMENT_FUNCTION_I(10, Coudert, updateFromTime, uint32) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); UPDATE_PARAM(params->param2, getState()->time, params->param1); @@ -386,7 +377,7 @@ IMPLEMENT_FUNCTION_I(11, Coudert, updateFromTicks, uint32) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); UPDATE_PARAM(params->param2, getState()->timeTicks, params->param1); @@ -460,7 +451,7 @@ IMPLEMENT_FUNCTION_II(13, Coudert, function13, bool, EntityIndex) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); if (!params->param2 && !params->param3) { @@ -582,7 +573,7 @@ IMPLEMENT_FUNCTION_I(14, Coudert, function14, EntityIndex) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + savegameBloodJacket(); break; case kActionDefault: @@ -4173,4 +4164,14 @@ void Coudert::visitCompartment(const SavePoint &savepoint, EntityPosition positi } } +void Coudert::savegameBloodJacket() { + if (getProgress().jacket == kJacketBlood + && getEntities()->isDistanceBetweenEntities(kEntityCoudert, kEntityPlayer, 1000) + && !getEntities()->isInsideCompartments(kEntityPlayer) + && !getEntities()->checkFields10(kEntityPlayer)) { + setCallback(1); + setup_savegame(kSavegameTypeEvent, kEventMertensBloodJacket); + } +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/coudert.h b/engines/lastexpress/entities/coudert.h index 45d13ce9bb..d06bb95ce9 100644 --- a/engines/lastexpress/entities/coudert.h +++ b/engines/lastexpress/entities/coudert.h @@ -219,6 +219,7 @@ public: private: void visitCompartment(const SavePoint &savepoint, EntityPosition position, const char *seq1, ObjectIndex compartment, const char *seq2, const char *seq3, EntityPosition sittingPosition, ObjectIndex object, const char *seq4); + void savegameBloodJacket(); }; } // End of namespace LastExpress -- cgit v1.2.3 From d4f7c0232380b94b42d280c3680e473cd0c2d9b5 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 15 Jul 2012 19:24:11 -0400 Subject: LASTEXPRESS: Replace PLAY_STEAM macro by function --- engines/lastexpress/entities/chapters.cpp | 40 +++++++++++++++---------------- engines/lastexpress/entities/chapters.h | 1 + 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp index eab4dfe2c1..b4978165b9 100644 --- a/engines/lastexpress/entities/chapters.cpp +++ b/engines/lastexpress/entities/chapters.cpp @@ -384,12 +384,6 @@ IMPLEMENT_FUNCTION(7, Chapters, chapter1Init) IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// -#define PLAY_STEAM() { \ - getSoundQueue()->resetState(); \ - getSound()->playSteam((CityIndex)ENTITY_PARAM(0, 4)); \ - ENTITY_PARAM(0, 2) = 0; \ - } - IMPLEMENT_FUNCTION(8, Chapters, chapter1Handler) switch (savepoint.action) { default: @@ -522,43 +516,43 @@ label_chapter1_next: getSavePoints()->push(kEntityChapters, kEntityTrain, kActionTrainStopRunning); if (getEntityData(kEntityPlayer)->location != kLocationOutsideTrain) { - PLAY_STEAM(); + playSteam(); break; } if (getEntities()->isOutsideAlexeiWindow()) { getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49); - PLAY_STEAM(); + playSteam(); break; } if (getEntities()->isOutsideAnnaWindow()) { getScenes()->loadSceneFromPosition(kCarRedSleeping, 49); - PLAY_STEAM(); + playSteam(); break; } CarIndex car = getEntityData(kEntityPlayer)->car; if (car < kCarRedSleeping || car > kCarCoalTender) { if (car < kCarBaggageRear || car > kCarGreenSleeping) { - PLAY_STEAM(); + playSteam(); break; } if (getEntities()->isPlayerPosition(kCarGreenSleeping, 98)) { getSound()->playSound(kEntityPlayer, "LIB015"); getScenes()->loadSceneFromPosition(kCarGreenSleeping, 71); - PLAY_STEAM(); + playSteam(); break; } getScenes()->loadSceneFromPosition(kCarGreenSleeping, 82); - PLAY_STEAM(); + playSteam(); break; } getScenes()->loadSceneFromPosition(kCarRestaurant, 82); - PLAY_STEAM(); + playSteam(); break; } @@ -1278,43 +1272,43 @@ label_callback_4: getSavePoints()->push(kEntityChapters, kEntityTrain, kActionTrainStopRunning); if (getEntityData(kEntityPlayer)->location != kLocationOutsideTrain) { - PLAY_STEAM(); + playSteam(); break; } if (getEntities()->isOutsideAlexeiWindow()) { getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49); - PLAY_STEAM(); + playSteam(); break; } if (getEntities()->isOutsideAnnaWindow()) { getScenes()->loadSceneFromPosition(kCarRedSleeping, 49); - PLAY_STEAM(); + playSteam(); break; } CarIndex car = getEntityData(kEntityPlayer)->car; if (car < kCarRedSleeping || car > kCarCoalTender) { if (car < kCarBaggageRear || car > kCarGreenSleeping) { - PLAY_STEAM(); + playSteam(); break; } if (getEntities()->isPlayerPosition(kCarGreenSleeping, 98)) { getSound()->playSound(kEntityPlayer, "LIB015"); getScenes()->loadSceneFromPosition(kCarGreenSleeping, 71); - PLAY_STEAM(); + playSteam(); break; } getScenes()->loadSceneFromPosition(kCarGreenSleeping, 82); - PLAY_STEAM(); + playSteam(); break; } getScenes()->loadSceneFromPosition(kCarRestaurant, 82); - PLAY_STEAM(); + playSteam(); break; } @@ -1816,4 +1810,10 @@ void Chapters::enterExitHelper(bool isEnteringStation) { callbackAction(); } +void Chapters::playSteam() { + getSoundQueue()->resetState(); + getSound()->playSteam((CityIndex)ENTITY_PARAM(0, 4)); + ENTITY_PARAM(0, 2) = 0; +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/chapters.h b/engines/lastexpress/entities/chapters.h index 353d3a6b5b..62b8af9270 100644 --- a/engines/lastexpress/entities/chapters.h +++ b/engines/lastexpress/entities/chapters.h @@ -156,6 +156,7 @@ public: private: void enterExitStation(const SavePoint &savepoint, bool isEnteringStation); void enterExitHelper(bool isEnteringStation); + void playSteam(); }; } // End of namespace LastExpress -- cgit v1.2.3 From 132dd5b4bc236f805babe0187797ef03bbb16310 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 15 Jul 2012 19:25:16 -0400 Subject: LASTEXPRESS: Replace SYNC_STRING macro by function --- engines/lastexpress/entities/entity.cpp | 29 +++++++++++++++-------------- engines/lastexpress/entities/entity.h | 9 +++++++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 776b9f6c40..120c1f2d85 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -51,6 +51,17 @@ EntityData::EntityCallData::~EntityCallData() { SAFE_DELETE(sequence3); } +void EntityData::EntityCallData::syncString(Common::Serializer &s, Common::String &string, int length) { + char seqName[13]; + memset(&seqName, 0, length); + + if (s.isSaving()) strcpy((char *)&seqName, string.c_str()); + s.syncBytes((byte *)&seqName, length); + + if (s.isLoading()) + string = seqName; +} + void EntityData::EntityCallData::saveLoadWithSerializer(Common::Serializer &s) { for (uint i = 0; i < ARRAYSIZE(callbacks); i++) s.syncAsByte(callbacks[i]); @@ -77,20 +88,10 @@ void EntityData::EntityCallData::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsByte(directionSwitch); // Sync strings -#define SYNC_STRING(varName, count) { \ - char seqName[13]; \ - memset(&seqName, 0, count); \ - if (s.isSaving()) strcpy((char *)&seqName, varName.c_str()); \ - s.syncBytes((byte *)&seqName, count); \ - if (s.isLoading()) varName = seqName; \ -} - - SYNC_STRING(sequenceName, 13); - SYNC_STRING(sequenceName2, 13); - SYNC_STRING(sequenceNamePrefix, 7); - SYNC_STRING(sequenceNameCopy, 13); - -#undef SYNC_STRING + syncString(s, sequenceName, 13); + syncString(s, sequenceName2, 13); + syncString(s, sequenceNamePrefix, 7); + syncString(s, sequenceNameCopy, 13); // Skip pointers to frame & sequences s.skip(5 * 4); diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index bb2b96618e..4dca5424b1 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -596,6 +596,15 @@ public: return str; } + /** + * Synchronizes a string. + * + * @param s The Common::Serializer to use. + * @param string The string. + * @param length Length of the string. + */ + void syncString(Common::Serializer &s, Common::String &string, int length); + // Serializable void saveLoadWithSerializer(Common::Serializer &s); }; -- cgit v1.2.3 From e517c1199a0a187d865fbf22ce964a7dad069eb9 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 15 Jul 2012 19:26:35 -0400 Subject: LASTEXPRESS: Move LOW_BYTE macro to helpers.h --- engines/lastexpress/entities/entity_intern.h | 2 -- engines/lastexpress/helpers.h | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 0613b7bb0b..c622ff9f0e 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -25,8 +25,6 @@ namespace LastExpress { -#define LOW_BYTE(w) ((unsigned char)(((unsigned long)(w)) & 0xff)) - ////////////////////////////////////////////////////////////////////////// // Callbacks #define ENTITY_CALLBACK(class, name, pointer) \ diff --git a/engines/lastexpress/helpers.h b/engines/lastexpress/helpers.h index 7f3f1e246c..02454be13d 100644 --- a/engines/lastexpress/helpers.h +++ b/engines/lastexpress/helpers.h @@ -27,6 +27,8 @@ // Misc helpers ////////////////////////////////////////////////////////////////////////// +#define LOW_BYTE(w) ((unsigned char)(((unsigned long)(w)) & 0xff)) + // Misc #define getArchive(name) _engine->getResourceManager()->getFileStream(name) #define rnd(value) _engine->getRandom().getRandomNumber(value - 1) -- cgit v1.2.3 From 3d1b7b2d962ac37d8fb706ac8b884d3e560f97b5 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 15 Jul 2012 22:36:29 -0400 Subject: LASTEXPRESS: Merge the two savegameBloodJacket functions into the base Entity class --- engines/lastexpress/entities/coudert.cpp | 30 ++++++++++-------------------- engines/lastexpress/entities/coudert.h | 1 - engines/lastexpress/entities/entity.cpp | 22 ++++++++++++++++++++++ engines/lastexpress/entities/entity.h | 7 +++++++ engines/lastexpress/entities/entity39.h | 2 +- engines/lastexpress/entities/mertens.cpp | 28 ++++++++++------------------ engines/lastexpress/entities/mertens.h | 3 +++ 7 files changed, 53 insertions(+), 40 deletions(-) diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index 66733acc16..eea9dda718 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -115,7 +115,7 @@ IMPLEMENT_FUNCTION_S(2, Coudert, bloodJacket) break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); break; case kActionExitCompartment: @@ -142,7 +142,7 @@ IMPLEMENT_FUNCTION_SI(3, Coudert, enterExitCompartment, ObjectIndex) break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); return; case kActionCallback: @@ -168,7 +168,7 @@ IMPLEMENT_FUNCTION(4, Coudert, callbackActionOnDirection) break; } - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); break; case kActionExitCompartment: @@ -191,7 +191,7 @@ IMPLEMENT_FUNCTION_SIII(5, Coudert, enterExitCompartment2, ObjectIndex, EntityPo break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); return; case kActionCallback: @@ -212,7 +212,7 @@ IMPLEMENT_FUNCTION_S(6, Coudert, playSound) break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); break; case kActionEndSound: @@ -241,7 +241,7 @@ IMPLEMENT_FUNCTION_NOSETUP(7, Coudert, playSound16) break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); break; case kActionEndSound: @@ -354,7 +354,7 @@ IMPLEMENT_FUNCTION_I(10, Coudert, updateFromTime, uint32) break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); UPDATE_PARAM(params->param2, getState()->time, params->param1); @@ -377,7 +377,7 @@ IMPLEMENT_FUNCTION_I(11, Coudert, updateFromTicks, uint32) break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); UPDATE_PARAM(params->param2, getState()->timeTicks, params->param1); @@ -451,7 +451,7 @@ IMPLEMENT_FUNCTION_II(13, Coudert, function13, bool, EntityIndex) break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); if (!params->param2 && !params->param3) { @@ -573,7 +573,7 @@ IMPLEMENT_FUNCTION_I(14, Coudert, function14, EntityIndex) break; case kActionNone: - savegameBloodJacket(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); break; case kActionDefault: @@ -4164,14 +4164,4 @@ void Coudert::visitCompartment(const SavePoint &savepoint, EntityPosition positi } } -void Coudert::savegameBloodJacket() { - if (getProgress().jacket == kJacketBlood - && getEntities()->isDistanceBetweenEntities(kEntityCoudert, kEntityPlayer, 1000) - && !getEntities()->isInsideCompartments(kEntityPlayer) - && !getEntities()->checkFields10(kEntityPlayer)) { - setCallback(1); - setup_savegame(kSavegameTypeEvent, kEventMertensBloodJacket); - } -} - } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/coudert.h b/engines/lastexpress/entities/coudert.h index d06bb95ce9..45d13ce9bb 100644 --- a/engines/lastexpress/entities/coudert.h +++ b/engines/lastexpress/entities/coudert.h @@ -219,7 +219,6 @@ public: private: void visitCompartment(const SavePoint &savepoint, EntityPosition position, const char *seq1, ObjectIndex compartment, const char *seq2, const char *seq3, EntityPosition sittingPosition, ObjectIndex object, const char *seq4); - void savegameBloodJacket(); }; } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 120c1f2d85..a412dc9b65 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -253,6 +253,28 @@ void Entity::savegame(const SavePoint &savepoint) { } } +void Entity::savegameBloodJacket(SaveFunction *savegame) { + if (getProgress().jacket == kJacketBlood + && getEntities()->isDistanceBetweenEntities(_entityIndex, kEntityPlayer, 1000) + && !getEntities()->isInsideCompartments(kEntityPlayer) + && !getEntities()->checkFields10(kEntityPlayer)) { + setCallback(1); + + switch (_entityIndex) { + default: + break; + + case kEntityCoudert: + (*savegame)(kSavegameTypeEvent, kEventCoudertBloodJacket); + break; + + case kEntityMertens: + (*savegame)(kSavegameTypeEvent, kEventCoudertBloodJacket); + break; + } + } +} + void Entity::playSound(const SavePoint &savepoint, bool resetItem, SoundFlag flag) { EXPOSE_PARAMS(EntityData::EntityParametersSIIS) diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 4dca5424b1..01a19553ec 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -680,9 +680,11 @@ protected: typedef Common::Functor2 EnterFunction; typedef Common::Functor2 UpdateFunction; + typedef Common::Functor2 SaveFunction; #define WRAP_ENTER_FUNCTION(className, method) new Common::Functor2Mem(this, &className::method) #define WRAP_UPDATE_FUNCTION(className, method) new Common::Functor2Mem(this, &className::method) + #define WRAP_SAVE_FUNCTION(className, method) new Common::Functor2Mem(this, &className::method) /** * Saves the game @@ -693,6 +695,11 @@ protected: */ void savegame(const SavePoint &savepoint); + /** + * Saves the game before being found out with a blood covered jacket + */ + void savegameBloodJacket(SaveFunction *savegame); + /** * Play sound * diff --git a/engines/lastexpress/entities/entity39.h b/engines/lastexpress/entities/entity39.h index 4335a9566e..148bca5c33 100644 --- a/engines/lastexpress/entities/entity39.h +++ b/engines/lastexpress/entities/entity39.h @@ -72,4 +72,4 @@ private: } // End of namespace LastExpress -#endif // LASTEXPRESS_##define##_H +#endif // LASTEXPRESS_ENTITY39_H diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index 5672fe4d49..dd69aea2a6 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -37,14 +37,6 @@ namespace LastExpress { -#define SAVEGAME_BLOOD_JACKET() \ - if (getProgress().jacket == kJacketBlood \ - && getEntities()->isDistanceBetweenEntities(kEntityMertens, kEntityPlayer, 1000) \ - && !getEntities()->isInsideCompartments(kEntityPlayer) \ - && !getEntities()->checkFields10(kEntityPlayer)) { \ - setCallback(1); \ - setup_savegame(kSavegameTypeEvent, kEventMertensBloodJacket); \ - } Mertens::Mertens(LastExpressEngine *engine) : Entity(engine, kEntityMertens) { ADD_CALLBACK_FUNCTION(Mertens, reset); @@ -115,7 +107,7 @@ IMPLEMENT_FUNCTION_S(2, Mertens, bloodJacket) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); break; case kActionExitCompartment: @@ -142,7 +134,7 @@ IMPLEMENT_FUNCTION_SI(3, Mertens, enterExitCompartment, ObjectIndex) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); return; case kActionCallback: @@ -163,7 +155,7 @@ IMPLEMENT_FUNCTION_SI(4, Mertens, enterExitCompartment2, ObjectIndex) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); return; case kAction4: @@ -189,7 +181,7 @@ IMPLEMENT_FUNCTION_SIII(5, Mertens, enterExitCompartment3, ObjectIndex, EntityPo break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); break; case kActionExitCompartment: @@ -231,7 +223,7 @@ IMPLEMENT_FUNCTION(6, Mertens, callbackActionOnDirection) break; } - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); break; case kActionExitCompartment: @@ -254,7 +246,7 @@ IMPLEMENT_FUNCTION_S(7, Mertens, playSound) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); break; case kActionEndSound: @@ -281,7 +273,7 @@ IMPLEMENT_FUNCTION_S(8, Mertens, playSound16) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); break; case kActionEndSound: @@ -480,7 +472,7 @@ IMPLEMENT_FUNCTION_I(11, Mertens, function11, uint32) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); UPDATE_PARAM(params->param2, getState()->time, params->param1) @@ -548,7 +540,7 @@ IMPLEMENT_FUNCTION_II(13, Mertens, function13, bool, bool) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); if (!params->param2 && !params->param3) { UPDATE_PARAM_PROC(params->param4, getState()->timeTicks, 75) @@ -670,7 +662,7 @@ IMPLEMENT_FUNCTION_I(14, Mertens, function14, EntityIndex) break; case kActionNone: - SAVEGAME_BLOOD_JACKET(); + Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/mertens.h b/engines/lastexpress/entities/mertens.h index 31b7a97dcd..55c2a76140 100644 --- a/engines/lastexpress/entities/mertens.h +++ b/engines/lastexpress/entities/mertens.h @@ -210,6 +210,9 @@ public: DECLARE_FUNCTION(function53) DECLARE_NULL_FUNCTION() + +private: + void loadSceneFromPosition(); }; } // End of namespace LastExpress -- cgit v1.2.3 From 2b116592cb5654656d2b8118e1a3674e195bb00e Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 15 Jul 2012 22:39:26 -0400 Subject: LASTEXPRESS: Remove LOADSCENE_FROM_POSITION macro --- engines/lastexpress/entities/mertens.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index dd69aea2a6..517ff76362 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -300,14 +300,6 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition) - -#define LOADSCENE_FROM_POSITION() \ - if (getData()->direction != kDirectionUp) { \ - getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + 750)); \ - } else { \ - getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition - 750), true); \ - } - switch (savepoint.action) { default: break; @@ -406,7 +398,7 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition) ENTITY_PARAM(0, 7) = 0; if (params->param1 != 3 || (params->param2 != kPosition_8200 && params->param2 != kPosition_9510)) { - LOADSCENE_FROM_POSITION(); + loadSceneFromPosition(); break; } @@ -438,31 +430,29 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition) break; } - LOADSCENE_FROM_POSITION(); + loadSceneFromPosition(); break; case 4: getAction()->playAnimation(kEventMertensKronosConcertInvitation); ENTITY_PARAM(2, 4) = 0; - LOADSCENE_FROM_POSITION(); + loadSceneFromPosition(); break; case 5: getAction()->playAnimation(getData()->entityPosition < getEntityData(kEntityPlayer)->entityPosition ? kEventMertensAskTylerCompartmentD : kEventMertensAskTylerCompartment); - LOADSCENE_FROM_POSITION(); + loadSceneFromPosition(); break; case 6: getAction()->playAnimation(kEventMertensDontMakeBed); - LOADSCENE_FROM_POSITION(); + loadSceneFromPosition(); ENTITY_PARAM(0, 4) = 0; break; } break; } - -#undef LOADSCENE_FROM_POSITION IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// @@ -4098,4 +4088,15 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_NULL_FUNCTION(54, Mertens) +////////////////////////////////////////////////////////////////////////// +// Helper functions +////////////////////////////////////////////////////////////////////////// + +void Mertens::loadSceneFromPosition() { + if (getData()->direction != kDirectionUp) + getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + 750)); + else + getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition - 750), true); +} + } // End of namespace LastExpress -- cgit v1.2.3 From 04a181a787befb9ef5bc2a3d524f622a5fcfaeeb Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 15 Jul 2012 22:48:00 -0400 Subject: LASTEXPRESS: Replace 2 macros in Sophie entity implementation --- engines/lastexpress/entities/sophie.cpp | 68 ++++++++++++++++++--------------- engines/lastexpress/entities/sophie.h | 4 ++ 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/engines/lastexpress/entities/sophie.cpp b/engines/lastexpress/entities/sophie.cpp index c2f25b7eb1..10c414763c 100644 --- a/engines/lastexpress/entities/sophie.cpp +++ b/engines/lastexpress/entities/sophie.cpp @@ -31,31 +31,6 @@ namespace LastExpress { -#define CHAPTER_IMPLEMENTATION() \ - switch (savepoint.action) { \ - default: \ - break; \ - case kActionNone: \ - setup_chaptersHandler(); \ - break; \ - case kActionDefault: \ - getEntities()->clearSequences(kEntitySophie); \ - getData()->entityPosition = kPosition_4840; \ - getData()->location = kLocationInsideCompartment; \ - getData()->car = kCarRedSleeping; \ - getData()->clothes = kClothesDefault; \ - getData()->inventoryItem = kItemNone; \ - break; \ - } - -#define DEFAULT_ACTION_IMPLEMENTATION() \ - if (savepoint.action == kActionDefault) { \ - getData()->entityPosition = kPosition_4840; \ - getData()->location = kLocationInsideCompartment; \ - getData()->car = kCarRedSleeping; \ - getEntities()->clearSequences(kEntitySophie); \ - } - Sophie::Sophie(LastExpressEngine *engine) : Entity(engine, kEntitySophie) { ADD_CALLBACK_FUNCTION(Sophie, reset); ADD_CALLBACK_FUNCTION(Sophie, updateEntity); @@ -217,27 +192,27 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(5, Sophie, function5) - DEFAULT_ACTION_IMPLEMENTATION() + handleAction(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(6, Sophie, chapter2) - CHAPTER_IMPLEMENTATION() + handleChapter(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(7, Sophie, chapter3) - CHAPTER_IMPLEMENTATION() + handleChapter(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(8, Sophie, chapter4) - CHAPTER_IMPLEMENTATION() + handleChapter(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(9, Sophie, function9) - DEFAULT_ACTION_IMPLEMENTATION() + handleAction(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// @@ -271,4 +246,37 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_NULL_FUNCTION(12, Sophie) +////////////////////////////////////////////////////////////////////////// +// Helpers functions +////////////////////////////////////////////////////////////////////////// + +void Sophie::handleAction(const SavePoint &savepoint) { + if (savepoint.action == kActionDefault) { + getData()->entityPosition = kPosition_4840; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRedSleeping; + getEntities()->clearSequences(kEntitySophie); + } +} + +void Sophie::handleChapter(const SavePoint &savepoint) { + switch (savepoint.action) { + default: + break; + + case kActionNone: + setup_chaptersHandler(); + break; + + case kActionDefault: + getEntities()->clearSequences(kEntitySophie); + getData()->entityPosition = kPosition_4840; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRedSleeping; + getData()->clothes = kClothesDefault; + getData()->inventoryItem = kItemNone; + break; + } +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/sophie.h b/engines/lastexpress/entities/sophie.h index c2ca348027..47cfa8065c 100644 --- a/engines/lastexpress/entities/sophie.h +++ b/engines/lastexpress/entities/sophie.h @@ -88,6 +88,10 @@ public: DECLARE_FUNCTION(chapter5Handler) DECLARE_NULL_FUNCTION() + +private: + void handleAction(const SavePoint &savepoint); + void handleChapter(const SavePoint &savepoint); }; } // End of namespace LastExpress -- cgit v1.2.3 From 3cf7e8ccf347fd57a82eb5df39ac4941a4f6c2b1 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Mon, 16 Jul 2012 23:14:14 -0400 Subject: LASTEXPRESS: Replace INCREMENT_DIRECTION_COUNTER macro --- engines/lastexpress/game/entities.cpp | 19 ++++++++++--------- engines/lastexpress/game/entities.h | 1 + 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/engines/lastexpress/game/entities.cpp b/engines/lastexpress/game/entities.cpp index f2201ac9a7..4cdefcd334 100644 --- a/engines/lastexpress/game/entities.cpp +++ b/engines/lastexpress/game/entities.cpp @@ -669,11 +669,12 @@ void Entities::executeCallbacks() { ////////////////////////////////////////////////////////////////////////// // Processing ////////////////////////////////////////////////////////////////////////// -#define INCREMENT_DIRECTION_COUNTER() { \ - data->doProcessEntity = false; \ - if (data->direction == kDirectionRight || (data->direction == kDirectionSwitch && data->directionSwitch == kDirectionRight)) \ - ++data->field_4A1; \ - } +void Entities::incrementDirectionCounter(EntityData::EntityCallData *data) { + data->doProcessEntity = false; + + if (data->direction == kDirectionRight || (data->direction == kDirectionSwitch && data->directionSwitch == kDirectionRight)) + ++data->field_4A1; +} void Entities::processEntity(EntityIndex entityIndex) { EntityData::EntityCallData *data = getData(entityIndex); @@ -692,7 +693,7 @@ void Entities::processEntity(EntityIndex entityIndex) { getScenes()->removeAndRedraw(&data->frame, false); getScenes()->removeAndRedraw(&data->frame1, false); - INCREMENT_DIRECTION_COUNTER(); + incrementDirectionCounter(data); return; } @@ -722,7 +723,7 @@ label_nosequence: processFrame(entityIndex, false, true); if (!getFlags()->flag_entities_0 && !data->doProcessEntity) { - INCREMENT_DIRECTION_COUNTER(); + incrementDirectionCounter(data); return; } } else { @@ -740,7 +741,7 @@ label_nosequence: data->position = 0; } - INCREMENT_DIRECTION_COUNTER(); + incrementDirectionCounter(data); } return; } @@ -789,7 +790,7 @@ label_nosequence: } } - INCREMENT_DIRECTION_COUNTER(); + incrementDirectionCounter(data); } void Entities::computeCurrentFrame(EntityIndex entityIndex) const { diff --git a/engines/lastexpress/game/entities.h b/engines/lastexpress/game/entities.h index eb5eae461f..a9de7931f0 100644 --- a/engines/lastexpress/game/entities.h +++ b/engines/lastexpress/game/entities.h @@ -344,6 +344,7 @@ private: uint _positions[_positionsCount]; void executeCallbacks(); + void incrementDirectionCounter(EntityData::EntityCallData *data); void processEntity(EntityIndex entity); void drawSequence(EntityIndex entity, const char *sequence, EntityDirection direction) const; -- cgit v1.2.3 From be94a24fd2cf3e89e3976eb52581c5a8a65d81a1 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Mon, 16 Jul 2012 23:16:17 -0400 Subject: LASTEXPRESS: Replace INVERT_Y macro --- engines/lastexpress/game/beetle.cpp | 32 +++++++++++++++++--------------- engines/lastexpress/game/beetle.h | 1 + 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/engines/lastexpress/game/beetle.cpp b/engines/lastexpress/game/beetle.cpp index f95947617a..2a72459697 100644 --- a/engines/lastexpress/game/beetle.cpp +++ b/engines/lastexpress/game/beetle.cpp @@ -336,26 +336,13 @@ void Beetle::drawUpdate() { } } -#define INVERT_Y() \ - switch (_data->indexes[_data->offset]) { \ - default: \ - break; \ - case 24: \ - case 25: \ - case 26: \ - case 27: \ - case 28: \ - _data->coordY = -_data->coordY; \ - break; \ - } - // Invert direction - INVERT_Y(); + invertDirection(); SequenceFrame *frame = new SequenceFrame(_data->currentSequence, (uint16)_data->currentFrame); updateFrame(frame); - INVERT_Y(); + invertDirection(); getScenes()->addToQueue(frame); @@ -363,6 +350,21 @@ void Beetle::drawUpdate() { _data->frame = frame; } +void Beetle::invertDirection() { + switch (_data->indexes[_data->offset]) { + default: + break; + + case 24: + case 25: + case 26: + case 27: + case 28: + _data->coordY = -_data->coordY; + break; + } +} + void Beetle::move() { if (!_data) error("[Beetle::move] Sequences have not been loaded"); diff --git a/engines/lastexpress/game/beetle.h b/engines/lastexpress/game/beetle.h index d3c47f39e5..034ebbd557 100644 --- a/engines/lastexpress/game/beetle.h +++ b/engines/lastexpress/game/beetle.h @@ -111,6 +111,7 @@ private: void updateFrame(SequenceFrame *frame) const; void updateData(uint32 index); void drawUpdate(); + void invertDirection(); }; } // End of namespace LastExpress -- cgit v1.2.3 From 0181a464eb864e15a02acd3ab7fb700a7cac0007 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Mon, 16 Jul 2012 23:27:43 -0400 Subject: LASTEXPRESS: Use filter 16 as default filter for NIS animations This makes sure the sound is at the correct volume --- engines/lastexpress/data/snd.cpp | 2 +- engines/lastexpress/shared.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp index 3deb2d6300..51d0815c1e 100644 --- a/engines/lastexpress/data/snd.cpp +++ b/engines/lastexpress/data/snd.cpp @@ -526,7 +526,7 @@ void AppendableSound::queueBuffer(Common::SeekableReadStream *bufferIn) { // Setup the ADPCM decoder uint32 sizeIn = (uint32)bufferIn->size(); Audio::AudioStream *adpcm = makeDecoder(bufferIn, sizeIn); - ((LastExpress_ADPCMStream *)adpcm)->setFilterId(1); + ((LastExpress_ADPCMStream *)adpcm)->setFilterId(16); // Queue the stream _as->queueAudioStream(adpcm); diff --git a/engines/lastexpress/shared.h b/engines/lastexpress/shared.h index d60a498447..bebd149b9b 100644 --- a/engines/lastexpress/shared.h +++ b/engines/lastexpress/shared.h @@ -80,7 +80,8 @@ enum SoundFlag { kFlagMusic = 0x5000010, kFlagType3 = 0x6000000, kFlagLoop = 0x6001008, - kFlagType9 = 0x7000000 + kFlagType9 = 0x7000000, + kFlagNIS = 0x7002010 }; enum SoundState { -- cgit v1.2.3 From d830c0edc9e53b5a3274535139179c2ef029a5d5 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Mon, 16 Jul 2012 23:47:49 -0400 Subject: LASTEXPRESS: Replace TIME_CHECK_SAVEPOINT and TIME_CHECK_OBJECT macros --- engines/lastexpress/entities/abbot.cpp | 4 ++-- engines/lastexpress/entities/august.cpp | 6 +++--- engines/lastexpress/entities/coudert.cpp | 12 ++++++------ engines/lastexpress/entities/entity.cpp | 19 +++++++++++++++++++ engines/lastexpress/entities/entity.h | 7 +++++++ engines/lastexpress/entities/entity_intern.h | 22 +++++----------------- engines/lastexpress/entities/kahina.cpp | 2 +- engines/lastexpress/entities/mertens.cpp | 2 +- engines/lastexpress/entities/milos.cpp | 4 ++-- engines/lastexpress/entities/rebecca.cpp | 2 +- engines/lastexpress/entities/tatiana.cpp | 2 +- 11 files changed, 48 insertions(+), 34 deletions(-) diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp index eef64bdf07..9280068fae 100644 --- a/engines/lastexpress/entities/abbot.cpp +++ b/engines/lastexpress/entities/abbot.cpp @@ -415,7 +415,7 @@ IMPLEMENT_FUNCTION(22, Abbot, function22) break; case kActionNone: - TIME_CHECK_SAVEPOINT(kTime1971000, params->param1, kEntityAbbot, kEntityServers0, kAction218586752); + Entity::timeCheckSavepoint(kTime1971000, params->param1, kEntityAbbot, kEntityServers0, kAction218586752); if (getState()->time > kTime1989000 && getEntities()->isSomebodyInsideRestaurantOrSalon()) { getData()->inventoryItem = kItemNone; @@ -1319,7 +1319,7 @@ IMPLEMENT_FUNCTION(41, Abbot, chapter4Handler) break; case kActionNone: - TIME_CHECK_SAVEPOINT(kTime2358000, params->param1, kEntityAbbot, kEntityServers0, kAction218128129); + Entity::timeCheckSavepoint(kTime2358000, params->param1, kEntityAbbot, kEntityServers0, kAction218128129); if (getState()->time > kTime2389500 && getEntities()->isSomebodyInsideRestaurantOrSalon()) setup_function42(); diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp index 86c02e4301..f255d041f8 100644 --- a/engines/lastexpress/entities/august.cpp +++ b/engines/lastexpress/entities/august.cpp @@ -1811,7 +1811,7 @@ IMPLEMENT_FUNCTION(36, August, chapter2Handler) break; case kActionNone: - TIME_CHECK_SAVEPOINT(kTime1755000, params->param2, kEntityAugust, kEntityServers0, kAction252568704); + Entity::timeCheckSavepoint(kTime1755000, params->param2, kEntityAugust, kEntityServers0, kAction252568704); if (getState()->time > kTime1773000 && params->param1 && getEntities()->isSomebodyInsideRestaurantOrSalon()) { getData()->inventoryItem = kItemNone; @@ -1960,7 +1960,7 @@ IMPLEMENT_FUNCTION(38, August, function38) break; case kActionNone: - TIME_CHECK_SAVEPOINT(kTime1801800, params->param1, kEntityAugust, kEntityRebecca, kAction155980128); + Entity::timeCheckSavepoint(kTime1801800, params->param1, kEntityAugust, kEntityRebecca, kAction155980128); TIME_CHECK_CALLBACK(kTime1820700, params->param2, 3, setup_callbackActionRestaurantOrSalon); break; @@ -2210,7 +2210,7 @@ IMPLEMENT_FUNCTION(43, August, chapter3Handler) break; case kActionNone: - TIME_CHECK_SAVEPOINT(kTime1953000, params->param2, kEntityAugust, kEntityAnna, kAction291662081); + Entity::timeCheckSavepoint(kTime1953000, params->param2, kEntityAugust, kEntityAnna, kAction291662081); // Set as same position as Anna if (params->param1) { diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index eea9dda718..77cddddf48 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -2285,9 +2285,9 @@ label_callback_10: if (!ENTITY_PARAM(0, 2)) break; - TIME_CHECK_OBJECT(kTime1107000, params->param4, kObject111, kObjectLocation2); - TIME_CHECK_OBJECT(kTime1161000, params->param5, kObject111, kObjectLocation3); - TIME_CHECK_OBJECT(kTime1206000, params->param6, kObject111, kObjectLocation4); + timeCheckObject(kTime1107000, params->param4, kObject111, kObjectLocation2); + timeCheckObject(kTime1161000, params->param5, kObject111, kObjectLocation3); + timeCheckObject(kTime1206000, params->param6, kObject111, kObjectLocation4); break; case kAction1: @@ -2835,9 +2835,9 @@ label_callback_18: label_callback_19: if (ENTITY_PARAM(0, 2)) { - TIME_CHECK_OBJECT(kTime2025000, params->param7, kObject111, kObjectLocation7); - TIME_CHECK_OBJECT(kTime2133000, params->param8, kObject111, kObjectLocation8); - TIME_CHECK_OBJECT(kTime2173500, CURRENT_PARAM(1, 1), kObject111, kObjectLocation9); + timeCheckObject(kTime2025000, params->param7, kObject111, kObjectLocation7); + timeCheckObject(kTime2133000, params->param8, kObject111, kObjectLocation8); + timeCheckObject(kTime2173500, CURRENT_PARAM(1, 1), kObject111, kObjectLocation9); } break; diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index a412dc9b65..743adc3201 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -29,6 +29,7 @@ #include "lastexpress/game/action.h" #include "lastexpress/game/entities.h" #include "lastexpress/game/logic.h" +#include "lastexpress/game/object.h" #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" #include "lastexpress/game/savegame.h" @@ -592,4 +593,22 @@ void Entity::callbackAction() { getSavePoints()->call(_entityIndex, _entityIndex, kActionCallback); } +////////////////////////////////////////////////////////////////////////// +// Helper functions +////////////////////////////////////////////////////////////////////////// + +void Entity::timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + getSavePoints()->push(entity1, entity2, action); + } +} + +void Entity::timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex object, ObjectLocation location) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + getObjects()->updateLocation2(object, location); + } +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 01a19553ec..f29d78e181 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -845,6 +845,13 @@ protected: * Store the current callback information and perform the callback action */ void callbackAction(); + + ////////////////////////////////////////////////////////////////////////// + // Helper functions + ////////////////////////////////////////////////////////////////////////// + + void timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action); + void timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex index, ObjectLocation location); }; diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index c622ff9f0e..64814a1b40 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -326,12 +326,6 @@ void class::setup_##name() { \ break; \ } -#define TIME_CHECK_SAVEPOINT(timeValue, parameter, entity1, entity2, action) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - getSavePoints()->push(entity1, entity2, action); \ - } - #define TIME_CHECK_CALLBACK(timeValue, parameter, callback, function) \ if (getState()->time > timeValue && !parameter) { \ parameter = 1; \ @@ -366,11 +360,11 @@ void class::setup_##name() { \ #define TIME_CHECK_CALLBACK_INVENTORY(timeValue, parameter, callback, function) \ if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - getData()->inventoryItem = kItemNone; \ - setCallback(callback); \ - function(); \ - break; \ + parameter = 1; \ + getData()->inventoryItem = kItemNone; \ + setCallback(callback); \ + function(); \ + break; \ } #define TIME_CHECK_CALLBACK_ACTION(timeValue, parameter) \ @@ -389,12 +383,6 @@ void class::setup_##name() { \ break; \ } -#define TIME_CHECK_OBJECT(timeValue, parameter, object, location) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - getObjects()->updateLocation2(object, location); \ - } - #define TIME_CHECK_CAR(timeValue, parameter, callback, function) {\ if ((getState()->time <= timeValue && !getEntities()->isPlayerInCar(kCarGreenSleeping)) || !parameter) \ parameter = (uint)getState()->time + 75; \ diff --git a/engines/lastexpress/entities/kahina.cpp b/engines/lastexpress/entities/kahina.cpp index 0c4045097a..6bb2e6b90a 100644 --- a/engines/lastexpress/entities/kahina.cpp +++ b/engines/lastexpress/entities/kahina.cpp @@ -267,7 +267,7 @@ IMPLEMENT_FUNCTION(11, Kahina, chapter1Handler) return; if (getProgress().jacket != kJacketOriginal) - TIME_CHECK_SAVEPOINT(kTime1107000, params->param1, kEntityKahina, kEntityMertens, kAction238732837); + Entity::timeCheckSavepoint(kTime1107000, params->param1, kEntityKahina, kEntityMertens, kAction238732837); if (getProgress().eventMertensKronosInvitation) setup_function12(); diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index 517ff76362..328c8e88d8 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -2993,7 +2993,7 @@ IMPLEMENT_FUNCTION(42, Mertens, function42) getData()->inventoryItem = kItemInvalid; if (!params->param2) { - TIME_CHECK_SAVEPOINT(kTime1125000, params->param3, kEntityMertens, kEntityMahmud, kAction170483072); + Entity::timeCheckSavepoint(kTime1125000, params->param3, kEntityMertens, kEntityMahmud, kAction170483072); if (params->param4 != kTimeInvalid && getState()->time > kTimeCityChalons) { diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp index 21f3b06896..c33a8b887e 100644 --- a/engines/lastexpress/entities/milos.cpp +++ b/engines/lastexpress/entities/milos.cpp @@ -720,7 +720,7 @@ IMPLEMENT_FUNCTION(15, Milos, chapter1Handler) break; case kActionNone: - TIME_CHECK_SAVEPOINT(kTime1071000, params->param3, kEntityMilos, kEntityServers1, kAction223002560); + Entity::timeCheckSavepoint(kTime1071000, params->param3, kEntityMilos, kEntityServers1, kAction223002560); if (getState()->time > kTime1089000 && getEntities()->isSomebodyInsideRestaurantOrSalon()) { setup_function16(); @@ -1534,7 +1534,7 @@ IMPLEMENT_FUNCTION(29, Milos, chapter4Handler) TIME_CHECK_PLAYSOUND_MILOS(kTime2370600, params->param5, "Mil4015"); - TIME_CHECK_SAVEPOINT(kTime2407500, params->param6, kEntityMilos, kEntityVesna, kAction55996766); + Entity::timeCheckSavepoint(kTime2407500, params->param6, kEntityMilos, kEntityVesna, kAction55996766); break; case kActionCallback: diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index 4f7be385ce..3ef266994f 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -841,7 +841,7 @@ IMPLEMENT_FUNCTION(24, Rebecca, function24) break; case kActionNone: - TIME_CHECK_SAVEPOINT(kTime1134000, params->param2, kEntityRebecca, kEntityServers0, kAction223712416); + Entity::timeCheckSavepoint(kTime1134000, params->param2, kEntityRebecca, kEntityServers0, kAction223712416); if (!params->param1) break; diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp index 3b9cc6d322..b15a0a18b2 100644 --- a/engines/lastexpress/entities/tatiana.cpp +++ b/engines/lastexpress/entities/tatiana.cpp @@ -440,7 +440,7 @@ IMPLEMENT_FUNCTION(19, Tatiana, chapter1Handler) } label_tatiana_chapter1_2: - TIME_CHECK_SAVEPOINT(kTime1084500, params->param7, kEntityTatiana, kEntityPascale, kAction257489762); + Entity::timeCheckSavepoint(kTime1084500, params->param7, kEntityTatiana, kEntityPascale, kAction257489762); if (params->param1) { UPDATE_PARAM(params->param8, getState()->timeTicks, 90); -- cgit v1.2.3 From 58f9d3345de84208dd2e05855adff909689f9c04 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 18 Jul 2012 00:41:06 +1000 Subject: TSAGE: Altered the ADGF_TESTING flags for Blue Force --- engines/tsage/detection_tables.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index d538cbacbf..02d4a6ab9b 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -105,7 +105,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "17c3993415e8a2cf93040eef7e88ec93", 1156508), Common::EN_ANY, Common::kPlatformPC, - ADGF_TESTING, + ADGF_UNSTABLE, GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, @@ -120,7 +120,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "17eabb456cb1546c66baf1aff387ba6a", 10032614), Common::EN_ANY, Common::kPlatformPC, - ADGF_TESTING, + 0, GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, @@ -134,7 +134,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "99983f48cb218f1f3760cf2f9a7ef11d", 63863322), Common::EN_ANY, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, @@ -150,7 +150,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "5b2b35c51b62e82d82b0791540bfae2d", 10082565), Common::ES_ESP, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD | ADGF_UNSTABLE, GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, -- cgit v1.2.3 From b6000da8753c1a28c2f2f3d0bbd2f1e704674d85 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 18 Jul 2012 00:49:28 +1000 Subject: DREAMWEB: Marked Dreamweb as stable --- engines/dreamweb/detection_tables.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/engines/dreamweb/detection_tables.h b/engines/dreamweb/detection_tables.h index 063aabbd89..8a2f94f99b 100644 --- a/engines/dreamweb/detection_tables.h +++ b/engines/dreamweb/detection_tables.h @@ -46,7 +46,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_TESTING, + 0, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -63,7 +63,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -84,7 +84,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::EN_GRB, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -101,7 +101,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::EN_USA, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -118,7 +118,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -136,7 +136,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -153,7 +153,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_TESTING, + 0, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -170,7 +170,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -187,7 +187,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_TESTING, + 0, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -204,7 +204,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -222,7 +222,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_CD | ADGF_TESTING, + ADGF_CD, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, @@ -239,7 +239,7 @@ static const DreamWebGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformPC, - ADGF_TESTING, + 0, GUIO2(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_BRIGHTPALETTE) }, }, -- cgit v1.2.3 From b398dcabaffbbc53d24d296fed3f64b0b8ecd519 Mon Sep 17 00:00:00 2001 From: Einar Johan Trøan Sømåen Date: Wed, 18 Jul 2012 13:54:15 +0200 Subject: COMMON: Add an optional argument to wrapCompressedReadStream, to simplify using streams that can't tell their size() --- common/zlib.cpp | 9 +++++---- common/zlib.h | 10 +++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/common/zlib.cpp b/common/zlib.cpp index 7d765fc539..76e34485da 100644 --- a/common/zlib.cpp +++ b/common/zlib.cpp @@ -107,7 +107,7 @@ protected: public: - GZipReadStream(SeekableReadStream *w) : _wrapped(w), _stream() { + GZipReadStream(SeekableReadStream *w, uint32 knownSize = 0) : _wrapped(w), _stream() { assert(w != 0); // Verify file header is correct @@ -122,7 +122,8 @@ public: _origSize = w->readUint32LE(); } else { // Original size not available in zlib format - _origSize = 0; + // use an otherwise known size if supplied. + _origSize = knownSize; } _pos = 0; w->seek(0, SEEK_SET); @@ -336,7 +337,7 @@ public: #endif // USE_ZLIB -SeekableReadStream *wrapCompressedReadStream(SeekableReadStream *toBeWrapped) { +SeekableReadStream *wrapCompressedReadStream(SeekableReadStream *toBeWrapped, uint32 knownSize) { #if defined(USE_ZLIB) if (toBeWrapped) { uint16 header = toBeWrapped->readUint16BE(); @@ -345,7 +346,7 @@ SeekableReadStream *wrapCompressedReadStream(SeekableReadStream *toBeWrapped) { header % 31 == 0)); toBeWrapped->seek(-2, SEEK_CUR); if (isCompressed) - return new GZipReadStream(toBeWrapped); + return new GZipReadStream(toBeWrapped, knownSize); } #endif return toBeWrapped; diff --git a/common/zlib.h b/common/zlib.h index 61322c286a..8372499922 100644 --- a/common/zlib.h +++ b/common/zlib.h @@ -86,10 +86,18 @@ bool inflateZlibHeaderless(byte *dst, uint dstLen, const byte *src, uint srcLen, * format. In the former case, the original stream is returned unmodified * (and in particular, not wrapped). * + * Certain GZip-formats don't supply an easily readable length, if you + * still need the length carried along with the stream, and you know + * the decompressed length at wrap-time, then it can be supplied as knownSize + * here. knownSize will be ignored if the GZip-stream DOES include a length. + * * It is safe to call this with a NULL parameter (in this case, NULL is * returned). + * + * @param toBeWrapped the stream to be wrapped (if it is in gzip-format) + * @param knownSize a supplied length of the compressed data (if not available directly) */ -SeekableReadStream *wrapCompressedReadStream(SeekableReadStream *toBeWrapped); +SeekableReadStream *wrapCompressedReadStream(SeekableReadStream *toBeWrapped, uint32 knownSize = 0); /** * Take an arbitrary WriteStream and wrap it in a custom stream which provides -- cgit v1.2.3 From 0b8fa3248b331616e8b09648a091446d325ef6ac Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Wed, 18 Jul 2012 22:25:44 +0200 Subject: DISTS/FEDORA: Add new dependencies --- dists/redhat/scummvm.spec | 3 ++- dists/redhat/scummvm.spec.in | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dists/redhat/scummvm.spec b/dists/redhat/scummvm.spec index d80404a3c6..bd17017fbf 100644 --- a/dists/redhat/scummvm.spec +++ b/dists/redhat/scummvm.spec @@ -27,6 +27,7 @@ BuildRequires: flac-devel BuildRequires: zlib-devel BuildRequires: nasm BuildRequires: SDL-devel >= 1.2.2 +BuildRequires: freetype-devel #------------------------------------------------------------------------------ # Description @@ -94,7 +95,7 @@ fi #------------------------------------------------------------------------------ %files %defattr(0644,root,root,0755) -%doc AUTHORS README NEWS COPYING COPYING.LGPL COPYING.BSD COPYRIGHT +%doc AUTHORS README NEWS COPYING COPYING.LGPL COPYING.FREEFONT COPYING.BSD COPYRIGHT %attr(0755,root,root)%{_bindir}/scummvm %{_datadir}/applications/* %{_datadir}/pixmaps/scummvm.xpm diff --git a/dists/redhat/scummvm.spec.in b/dists/redhat/scummvm.spec.in index 3beef2f960..9dbd8add5b 100644 --- a/dists/redhat/scummvm.spec.in +++ b/dists/redhat/scummvm.spec.in @@ -27,6 +27,7 @@ BuildRequires: flac-devel BuildRequires: zlib-devel BuildRequires: nasm BuildRequires: SDL-devel >= 1.2.2 +BuildRequires: freetype-devel #------------------------------------------------------------------------------ # Description @@ -94,7 +95,7 @@ fi #------------------------------------------------------------------------------ %files %defattr(0644,root,root,0755) -%doc AUTHORS README NEWS COPYING COPYING.LGPL COPYING.BSD COPYRIGHT +%doc AUTHORS README NEWS COPYING COPYING.LGPL COPYING.FREEFONT COPYING.BSD COPYRIGHT %attr(0755,root,root)%{_bindir}/scummvm %{_datadir}/applications/* %{_datadir}/pixmaps/scummvm.xpm -- cgit v1.2.3 From 2151500934d0e97bf2dcdcd7697d9b6bcc4114ac Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Wed, 18 Jul 2012 21:34:17 -0500 Subject: MAEMO: Add new build dependencies Since libfaad doesn't exist in maemo.org extras-devel, it cannot be added. --- backends/platform/maemo/debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/maemo/debian/control b/backends/platform/maemo/debian/control index 6e1dfe2fd4..bdaccd2359 100644 --- a/backends/platform/maemo/debian/control +++ b/backends/platform/maemo/debian/control @@ -2,7 +2,7 @@ Source: scummvm Section: user/games Priority: optional Maintainer: Tarek Soliman -Build-Depends: debhelper (>> 4.0.0), libsdl1.2-dev, libmad0-dev, libasound2-dev, libvorbisidec-dev, libmpeg2-4-dev, libflac-dev (>= 1.1.2), libz-dev, quilt +Build-Depends: debhelper (>> 4.0.0), libsdl1.2-dev, libmad0-dev, libasound2-dev, libvorbisidec-dev, libmpeg2-4-dev, libflac-dev (>= 1.1.2), libfreetype6-dev, libz-dev, quilt Standards-Version: 3.6.1.1 Package: scummvm -- cgit v1.2.3 From e21bd107495f5749eb3d8edb58bde499a5cf8f6e Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Thu, 19 Jul 2012 05:53:55 +0200 Subject: QUEEN: Change description on the "alt_intro" option It's not a floppy version intro, so call it "Alternative intro" instead. It's too late to make this change in 1.5.0 because it would need translation changes. (When the option was first added, it *was* called "Alternative intro" but it got changed along the way.) --- engines/queen/queen.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index 3acc87b856..f3b183c84f 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -56,8 +56,8 @@ static const PlainGameDescriptor queenGameDescriptor = { }; static const ExtraGuiOption queenExtraGuiOption = { - _s("Floppy intro"), - _s("Use the floppy version's intro (CD version only)"), + _s("Alternative intro"), + _s("Use an alternative game intro (CD version only)"), "alt_intro", false }; -- cgit v1.2.3 From e160f62ade8821a507e5d07551751a1a75308a53 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 19 Jul 2012 19:13:43 +1000 Subject: TSAGE: Changed '0' to 'ADGF_NO_FLAGS' in detection tables --- engines/tsage/detection_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index 02d4a6ab9b..a84ee5662f 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -120,7 +120,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "17eabb456cb1546c66baf1aff387ba6a", 10032614), Common::EN_ANY, Common::kPlatformPC, - 0, + ADGF_NO_FLAGS, GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, -- cgit v1.2.3 From 6a8d037af1703f6820ae2d42217e2bc8367e46b8 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Mon, 16 Jul 2012 23:56:35 -0400 Subject: LASTEXPRESS: Fix variable shadowing and update comments --- engines/lastexpress/entities/entity.cpp | 6 +++--- engines/lastexpress/entities/entity.h | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 743adc3201..1ad6d08035 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -254,7 +254,7 @@ void Entity::savegame(const SavePoint &savepoint) { } } -void Entity::savegameBloodJacket(SaveFunction *savegame) { +void Entity::savegameBloodJacket(SaveFunction *saveFunction) { if (getProgress().jacket == kJacketBlood && getEntities()->isDistanceBetweenEntities(_entityIndex, kEntityPlayer, 1000) && !getEntities()->isInsideCompartments(kEntityPlayer) @@ -266,11 +266,11 @@ void Entity::savegameBloodJacket(SaveFunction *savegame) { break; case kEntityCoudert: - (*savegame)(kSavegameTypeEvent, kEventCoudertBloodJacket); + (*saveFunction)(kSavegameTypeEvent, kEventCoudertBloodJacket); break; case kEntityMertens: - (*savegame)(kSavegameTypeEvent, kEventCoudertBloodJacket); + (*saveFunction)(kSavegameTypeEvent, kEventCoudertBloodJacket); break; } } diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index f29d78e181..5ba78abc17 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -696,9 +696,11 @@ protected: void savegame(const SavePoint &savepoint); /** - * Saves the game before being found out with a blood covered jacket + * Saves the game before being found out with a blood covered jacket. + * + * @param saveFunction The setup function to call to save the game */ - void savegameBloodJacket(SaveFunction *savegame); + void savegameBloodJacket(SaveFunction *saveFunction); /** * Play sound @@ -826,7 +828,7 @@ protected: * @param positionTo The position to. * @param sequenceTo The sequence to. * @param enterFunction The enter/exit compartment function. - * @param enterFunction The update entity function. + * @param updateFunction The update entity function. */ void goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, ObjectIndex compartmentTo, EntityPosition positionTo, Common::String sequenceTo, Entity::EnterFunction *enterFunction, Entity::UpdateFunction *updateFunction); -- cgit v1.2.3 From b4d10631614ae8b75154a4006ce3683a05200af7 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 20 Jul 2012 14:04:45 -0400 Subject: NEWS: Set 1.5.0 release date --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 43e755f4ac..3f5f10ce05 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,10 @@ For a more comprehensive changelog of the latest experimental code, see: https://github.com/scummvm/scummvm/commits/ -1.5.0 (????-??-??) +1.6.0 (????-??-??) + + +1.5.0 (2012-07-27) New Games: - Added support for Backyard Baseball 2003. - Added support for Blue Force. -- cgit v1.2.3 From 6d18bddbb5d2b6f61edbf6a1b7014ca1fbca81a9 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 20 Jul 2012 14:50:00 -0400 Subject: CREDITS: Credits for original sources --- AUTHORS | 7 +++++++ devtools/credits.pl | 11 +++++++++++ gui/credits.h | 4 ++++ 3 files changed, 22 insertions(+) diff --git a/AUTHORS b/AUTHORS index 387c602b84..7272d6baf6 100644 --- a/AUTHORS +++ b/AUTHORS @@ -597,3 +597,10 @@ Special thanks to Broken Sword 2.5 team for providing sources of their engine and their great support. + Neil Dodwell and David Dew from Creative Reality for providing the source + of Dreamweb and for their tremendous support. + + Janusz Wisniewski and Miroslaw Liminowicz from Laboratorium Komputerowe + Avalon for providing full source code for Soltys and letting us to + redistribute the game. + diff --git a/devtools/credits.pl b/devtools/credits.pl index 411ec3c10d..7a7766657b 100755 --- a/devtools/credits.pl +++ b/devtools/credits.pl @@ -69,6 +69,7 @@ sub html_entities_to_ascii { # å -> aa # & -> & # ł -> l + # ś -> s # Š -> S $text =~ s/á/a/g; $text =~ s/é/e/g; @@ -76,6 +77,7 @@ sub html_entities_to_ascii { $text =~ s/ó/o/g; $text =~ s/ø/o/g; $text =~ s/ł/l/g; + $text =~ s/ś/s/g; $text =~ s/Š/S/g; $text =~ s/å/aa/g; @@ -101,6 +103,7 @@ sub html_entities_to_cpp { $text =~ s/ó/\\363/g; $text =~ s/ø/\\370/g; $text =~ s/ł/l/g; + $text =~ s/ś/s/g; $text =~ s/Š/S/g; $text =~ s/å/\\345/g; @@ -1127,6 +1130,14 @@ begin_credits("Credits"); "Broken Sword 2.5 team for providing sources of their engine and their great ". "support."); + add_paragraph( + "Neil Dodwell and David Dew from Creative Reality for providing the source ". + "of Dreamweb and for their tremendous support."); + + add_paragraph( + "Janusz Wiśniewski and Miroslaw Liminowicz from Laboratorium Komputerowe Avalon ". + "for providing full source code for Sołtys and letting us to redistribute the game."); + end_section(); end_credits(); diff --git a/gui/credits.h b/gui/credits.h index 7226864543..1b3ba82017 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -710,5 +710,9 @@ static const char *credits[] = { "C0""", "C0""Broken Sword 2.5 team for providing sources of their engine and their great support.", "C0""", +"C0""Neil Dodwell and David Dew from Creative Reality for providing the source of Dreamweb and for their tremendous support.", +"C0""", +"C0""Janusz Wisniewski and Miroslaw Liminowicz from Laboratorium Komputerowe Avalon for providing full source code for Soltys and letting us to redistribute the game.", +"C0""", "", }; -- cgit v1.2.3 From a523fc186a9210aabfc9ab4d480726a483fdfbb5 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Fri, 20 Jul 2012 14:49:40 -0500 Subject: MAEMO: Fix date in debian/changelog (cherry picked from commit 831cfc89345299034e94160088d2ad3ff20eff5e) --- backends/platform/maemo/debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/maemo/debian/changelog b/backends/platform/maemo/debian/changelog index f3e4c4eadb..ea44574e96 100644 --- a/backends/platform/maemo/debian/changelog +++ b/backends/platform/maemo/debian/changelog @@ -8,7 +8,7 @@ scummvm (1.5.0) unstable; urgency=low * 1.5.0 release - -- Tarek Soliman Tue, 10 Jul 2012 22:57:32 -0500 + -- Tarek Soliman Fri, 20 Jul 2012 14:48:44 -0500 scummvm (1.4.1) unstable; urgency=low -- cgit v1.2.3 From b5feb0dcc70ccaab77e2005d32a33cfc614a57e3 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Fri, 20 Jul 2012 21:03:34 +0200 Subject: CREDITS: Update dreamweb team --- AUTHORS | 2 ++ devtools/credits.pl | 2 ++ gui/credits.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/AUTHORS b/AUTHORS index 7272d6baf6..02c805b833 100644 --- a/AUTHORS +++ b/AUTHORS @@ -89,7 +89,9 @@ ScummVM Team DreamWeb: Torbjorn Andersson Bertrand Augereau + Filippos Karapetis Vladimir Menshakov - (retired) + Willem Jan Palenstijn Gob: Torbjorn Andersson diff --git a/devtools/credits.pl b/devtools/credits.pl index 7a7766657b..6a4b97b89d 100755 --- a/devtools/credits.pl +++ b/devtools/credits.pl @@ -553,7 +553,9 @@ begin_credits("Credits"); begin_section("DreamWeb"); add_person("Torbjörn Andersson", "eriktorbjorn", ""); add_person("Bertrand Augereau", "Tramb", ""); + add_person("Filippos Karapetis", "[md5]", ""); add_person("Vladimir Menshakov", "whoozle", "(retired)"); + add_person("Willem Jan Palenstijn", "wjp", ""); end_section(); begin_section("Gob"); diff --git a/gui/credits.h b/gui/credits.h index 1b3ba82017..34c6f21026 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -106,8 +106,10 @@ static const char *credits[] = { "C1""DreamWeb", "C0""Torbj\366rn Andersson", "C0""Bertrand Augereau", +"C0""Filippos Karapetis", "C0""Vladimir Menshakov", "C2""(retired)", +"C0""Willem Jan Palenstijn", "", "C1""Gob", "C0""Torbj\366rn Andersson", -- cgit v1.2.3 From f0304ee0bb09f2b57d755e5e3100fe157512af56 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Fri, 20 Jul 2012 16:00:37 -0500 Subject: MAEMO: Package missing docs --- backends/platform/maemo/debian/rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/maemo/debian/rules b/backends/platform/maemo/debian/rules index 64add08de8..43a34399a3 100755 --- a/backends/platform/maemo/debian/rules +++ b/backends/platform/maemo/debian/rules @@ -50,7 +50,7 @@ install: build install -m0644 dists/engine-data/drascula.dat dists/engine-data/hugo.dat dists/engine-data/kyra.dat dists/engine-data/lure.dat dists/engine-data/queen.tbl dists/engine-data/sky.cpt dists/engine-data/teenagent.dat dists/engine-data/toon.dat debian/scummvm/opt/scummvm/share install -m0644 -d debian/scummvm/usr/share/doc/scummvm - install -m0644 NEWS README COPYRIGHT debian/scummvm/usr/share/doc/scummvm + install -m0644 AUTHORS COPYING COPYING.BSD COPYING.FREEFONT COPYING.LGPL COPYRIGHT NEWS README debian/scummvm/usr/share/doc/scummvm binary: binary-arch binary-arch: build install -- cgit v1.2.3 From 818c16bdd09f4aa92c4a46de5256f28331c35cbb Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 20 Jul 2012 20:51:42 -0400 Subject: VIDEO: Add first draft of the new VideoDecoder API It is currently named "AdvancedVideoDecoder" until all current VideoDecoders are converted to the new API. --- video/video_decoder.cpp | 405 ++++++++++++++++++++++++++++++++++++++++++++++-- video/video_decoder.h | 358 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 744 insertions(+), 19 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 44d7917652..ef2aeae94f 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -22,6 +22,7 @@ #include "video/video_decoder.h" +#include "audio/audiostream.h" #include "audio/mixer.h" // for kMaxChannelVolume #include "common/rational.h" @@ -51,26 +52,10 @@ uint32 VideoDecoder::getTime() const { return g_system->getMillis() - _startTime; } -void VideoDecoder::setSystemPalette() { - g_system->getPaletteManager()->setPalette(getPalette(), 0, 256); -} - bool VideoDecoder::needsUpdate() const { return !endOfVideo() && getTimeToNextFrame() == 0; } -void VideoDecoder::reset() { - _curFrame = -1; - _startTime = 0; - _pauseLevel = 0; - _audioVolume = Audio::Mixer::kMaxChannelVolume; - _audioBalance = 0; -} - -bool VideoDecoder::endOfVideo() const { - return !isVideoLoaded() || (getCurFrame() >= (int32)getFrameCount() - 1); -} - void VideoDecoder::pauseVideo(bool pause) { if (pause) { _pauseLevel++; @@ -108,6 +93,394 @@ void VideoDecoder::setBalance(int8 balance) { updateBalance(); } +AdvancedVideoDecoder::AdvancedVideoDecoder() { + _needsRewind = false; + _dirtyPalette = false; + _palette = 0; + _isPlaying = false; +} + +void AdvancedVideoDecoder::close() { + if (_isPlaying) + stop(); + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + delete *it; + + _tracks.clear(); + _needsRewind = false; + _dirtyPalette = false; + _palette = 0; + _startTime = 0; + reset(); +} + +bool AdvancedVideoDecoder::isVideoLoaded() const { + return !_tracks.empty(); +} + +const Graphics::Surface *AdvancedVideoDecoder::decodeNextFrame() { + readNextPacket(); + VideoTrack *track = findNextVideoTrack(); + + if (!track) + return 0; + + const Graphics::Surface *frame = track->decodeNextFrame(); + + if (track->hasDirtyPalette()) { + _palette = track->getPalette(); + _dirtyPalette = true; + } + + return frame; +} + +const byte *AdvancedVideoDecoder::getPalette() { + _dirtyPalette = false; + return _palette; +} + +int AdvancedVideoDecoder::getCurFrame() const { + int32 frame = -1; + + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeVideo) + frame += ((VideoTrack *)*it)->getCurFrame() + 1; + + return frame; +} + +uint32 AdvancedVideoDecoder::getFrameCount() const { + int count = 0; + + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeVideo) + count += ((VideoTrack *)*it)->getFrameCount(); + + return count; +} + +uint32 AdvancedVideoDecoder::getTime() const { + if (isPaused()) + return _pauseStartTime - _startTime; + + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { + if ((*it)->getTrackType() == Track::kTrackTypeAudio) { + uint32 time = ((const AudioTrack *)*it)->getRunningTime(); + + if (time != 0) + return time + _audioStartOffset.msecs(); + } + } + + return g_system->getMillis() - _startTime; +} + +uint32 AdvancedVideoDecoder::getTimeToNextFrame() const { + if (endOfVideo()) + return 0; + + const VideoTrack *track = findNextVideoTrack(); + + if (!track) + return 0; + + uint32 elapsedTime = getTime(); + uint32 nextFrameStartTime = track->getNextFrameStartTime(); + + if (nextFrameStartTime <= elapsedTime) + return 0; + + return nextFrameStartTime - elapsedTime; +} + +bool AdvancedVideoDecoder::endOfVideo() const { + // TODO: Bring _isPlaying into account? + + if (!isVideoLoaded()) + return true; + + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if (!(*it)->endOfTrack()) + return false; + + return true; +} + +bool AdvancedVideoDecoder::isRewindable() const { + if (_tracks.empty()) + return false; + + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if (!(*it)->isRewindable()) + return false; + + return true; +} + +bool AdvancedVideoDecoder::rewind() { + if (!isRewindable()) + return false; + + _needsRewind = false; + + // TODO: Pause status + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + if (!(*it)->rewind()) + return false; + + _audioStartOffset = 0; + return true; +} + +bool AdvancedVideoDecoder::isSeekable() const { + if (_tracks.empty()) + return false; + + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if (!(*it)->isSeekable()) + return false; + + return true; +} + +bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { + if (!isSeekable()) + return false; + + _needsRewind = false; + + // TODO: Pause status + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + if (!(*it)->seek(time)) + return false; + + _audioStartOffset = time; + return true; +} + +void AdvancedVideoDecoder::start() { + if (_isPlaying || !isVideoLoaded()) + return; + + _isPlaying = true; + _startTime = g_system->getMillis(); + _audioStartOffset = 0; + + // If someone previously called stop(), we'll rewind it. + if (_needsRewind) + rewind(); + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + (*it)->start(); +} + +void AdvancedVideoDecoder::stop() { + if (!_isPlaying) + return; + + _isPlaying = false; + _startTime = 0; + _audioStartOffset = 0; + _palette = 0; + _dirtyPalette = false; + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + (*it)->stop(); + + // Also reset the pause state. + _pauseLevel = 0; + + // If this is a rewindable video, don't close it too. We'll just rewind() the video + // the next time someone calls start(). Otherwise, since it can't be rewound, we + // just close it. + if (isRewindable()) + _needsRewind = true; + else + close(); +} + +Audio::Timestamp AdvancedVideoDecoder::getDuration() const { + return Audio::Timestamp(0, 1000); +} + +void AdvancedVideoDecoder::pauseVideoIntern(bool pause) { + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + (*it)->pause(pause); +} + +void AdvancedVideoDecoder::updateVolume() { + // For API compatibility only + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeAudio) + ((AudioTrack *)*it)->setVolume(_audioVolume); +} + +void AdvancedVideoDecoder::updateBalance() { + // For API compatibility only + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeAudio) + ((AudioTrack *)*it)->setBalance(_audioBalance); +} + +AdvancedVideoDecoder::Track::Track() { + _paused = false; +} + +bool AdvancedVideoDecoder::Track::isRewindable() const { + return isSeekable(); +} + +bool AdvancedVideoDecoder::Track::rewind() { + return seek(Audio::Timestamp(0, 1000)); +} + +uint32 AdvancedVideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const { + if (endOfTrack() || getCurFrame() < 0) + return 0; + + Common::Rational time = (getCurFrame() + 1) * 1000; + time /= getFrameRate(); + return time.toInt(); +} + +bool AdvancedVideoDecoder::FixedLengthVideoTrack::endOfTrack() const { + return getCurFrame() >= (getFrameCount() - 1); +} + +bool AdvancedVideoDecoder::AudioTrack::endOfTrack() const { + Audio::AudioStream *stream = getAudioStream(); + return !stream || (!g_system->getMixer()->isSoundHandleActive(_handle) && stream->endOfData()); +} + +void AdvancedVideoDecoder::AudioTrack::setVolume(byte volume) { + _volume = volume; + + if (g_system->getMixer()->isSoundHandleActive(_handle)) + g_system->getMixer()->setChannelVolume(_handle, _volume); +} + +void AdvancedVideoDecoder::AudioTrack::setBalance(int8 balance) { + _balance = balance; + + if (g_system->getMixer()->isSoundHandleActive(_handle)) + g_system->getMixer()->setChannelBalance(_handle, _balance); +} + +void AdvancedVideoDecoder::AudioTrack::start() { + stop(); + + Audio::AudioStream *stream = getAudioStream(); + assert(stream); + + g_system->getMixer()->playStream(getSoundType(), &_handle, stream, -1, getVolume(), getBalance(), DisposeAfterUse::NO); + + // Pause the audio again if we're still paused + if (isPaused()) + g_system->getMixer()->pauseHandle(_handle, true); +} + +void AdvancedVideoDecoder::AudioTrack::stop() { + g_system->getMixer()->stopHandle(_handle); +} + +uint32 AdvancedVideoDecoder::AudioTrack::getRunningTime() const { + if (g_system->getMixer()->isSoundHandleActive(_handle)) + return g_system->getMixer()->getSoundElapsedTime(_handle); + + return 0; +} + +void AdvancedVideoDecoder::AudioTrack::pauseIntern(bool shouldPause) { + if (g_system->getMixer()->isSoundHandleActive(_handle)) + g_system->getMixer()->pauseHandle(_handle, shouldPause); +} + +Audio::AudioStream *AdvancedVideoDecoder::RewindableAudioTrack::getAudioStream() const { + return getRewindableAudioStream(); +} + +bool AdvancedVideoDecoder::RewindableAudioTrack::rewind() { + Audio::RewindableAudioStream *stream = getRewindableAudioStream(); + assert(stream); + return stream->rewind(); +} + +Audio::AudioStream *AdvancedVideoDecoder::SeekableAudioTrack::getAudioStream() const { + return getSeekableAudioStream(); +} + +bool AdvancedVideoDecoder::SeekableAudioTrack::seek(const Audio::Timestamp &time) { + Audio::SeekableAudioStream *stream = getSeekableAudioStream(); + assert(stream); + return stream->seek(time); +} + +void AdvancedVideoDecoder::addTrack(Track *track) { + _tracks.push_back(track); +} + +AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() { + VideoTrack *bestTrack = 0; + uint32 bestTime = 0xFFFFFFFF; + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) { + if ((*it)->getTrackType() == Track::kTrackTypeVideo) { + VideoTrack *track = (VideoTrack *)*it; + uint32 time = track->getNextFrameStartTime(); + + if (time < bestTime) { + bestTime = time; + bestTrack = track; + } + } + } + + return bestTrack; +} + +const AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() const { + const VideoTrack *bestTrack = 0; + uint32 bestTime = 0xFFFFFFFF; + + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { + if ((*it)->getTrackType() == Track::kTrackTypeVideo) { + const VideoTrack *track = (const VideoTrack *)*it; + uint32 time = track->getNextFrameStartTime(); + + if (time < bestTime) { + bestTime = time; + bestTrack = track; + } + } + } + + return bestTrack; +} + +////////////////////////////////////////////// +///////////////// DEPRECATED ///////////////// +////////////////////////////////////////////// + +void VideoDecoder::reset() { + _curFrame = -1; + _startTime = 0; + _pauseLevel = 0; + _audioVolume = Audio::Mixer::kMaxChannelVolume; + _audioBalance = 0; +} + +bool VideoDecoder::endOfVideo() const { + return !isVideoLoaded() || (getCurFrame() >= (int32)getFrameCount() - 1); +} + +void VideoDecoder::setSystemPalette() { + g_system->getPaletteManager()->setPalette(getPalette(), 0, 256); +} + uint32 FixedRateVideoDecoder::getTimeToNextFrame() const { if (endOfVideo() || _curFrame < 0) return 0; diff --git a/video/video_decoder.h b/video/video_decoder.h index 3bb75ade09..1c359591b3 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -23,10 +23,16 @@ #ifndef VIDEO_DECODER_H #define VIDEO_DECODER_H -#include "common/str.h" - +#include "audio/mixer.h" #include "audio/timestamp.h" // TODO: Move this to common/ ? +#include "common/list.h" +#include "common/str.h" +namespace Audio { +class AudioStream; +class RewindableAudioStream; +class SeekableAudioStream; +} namespace Common { class Rational; @@ -42,6 +48,7 @@ namespace Video { /** * Generic interface for video decoder classes. + * @note This class is now deprecated in favor of AdvancedVideoDecoder. */ class VideoDecoder { public: @@ -109,6 +116,7 @@ public: /** * Set the system palette to the palette returned by getPalette. * @see getPalette + * @note This function is now deprecated. There is no replacement. */ void setSystemPalette(); @@ -222,47 +230,389 @@ public: protected: /** * Resets _curFrame and _startTime. Should be called from every close() function. + * @note This function is now deprecated. There is no replacement. */ void reset(); /** * Actual implementation of pause by subclasses. See pause() * for details. + * @note This function is now deprecated. There is no replacement. */ virtual void pauseVideoIntern(bool pause) {} /** * Add the time the video has been paused to maintain sync + * @note This function is now deprecated. There is no replacement. */ virtual void addPauseTime(uint32 ms) { _startTime += ms; } /** * Reset the pause start time (which should be called when seeking) + * @note This function is now deprecated. There is no replacement. */ void resetPauseStartTime(); /** * Update currently playing audio tracks with the new volume setting + * @note This function is now deprecated. There is no replacement. */ virtual void updateVolume() {} /** * Update currently playing audio tracks with the new balance setting + * @note This function is now deprecated. There is no replacement. */ virtual void updateBalance() {} int32 _curFrame; int32 _startTime; -private: +// FIXME: These are protected until the new API takes over this one +//private: uint32 _pauseLevel; uint32 _pauseStartTime; byte _audioVolume; int8 _audioBalance; }; +/** + * Improved interface for video decoder classes. + */ +class AdvancedVideoDecoder : public VideoDecoder { +public: + AdvancedVideoDecoder(); + virtual ~AdvancedVideoDecoder() {} + + // Old API Non-changing + // loadFile() + // loadStream() + // getWidth() + // getHeight() + // needsUpdate() + + // Old API Changing + virtual void close(); + bool isVideoLoaded() const; + virtual const Graphics::Surface *decodeNextFrame(); + const byte *getPalette(); + bool hasDirtyPalette() const { return _dirtyPalette; } + int getCurFrame() const; + uint32 getFrameCount() const; + uint32 getTime() const; + uint32 getTimeToNextFrame() const; + bool endOfVideo() const; + + // New API + /** + * Returns if a video is rewindable or not. + */ + bool isRewindable() const; + + /** + * Rewind a video to its beginning. + * + * If the video is playing, it will continue to play. + * + * @return true on success, false otherwise + */ + bool rewind(); + + /** + * Returns if a video is seekable or not. + */ + bool isSeekable() const; + + /** + * Seek to a given time in the video. + * + * If the video is playing, it will continue to play. + * + * @param time The time to seek to + * @return true on success, false otherwise + */ + bool seek(const Audio::Timestamp &time); + + /** + * Begin playback of the video. + * + * @note This has no effect is the video is already playing. + */ + void start(); + + /** + * Stop playback of the video. + * + * @note This will close() the video if it is not rewindable. + */ + void stop(); + + /** + * Returns if the video is currently playing or not. + * @todo Differentiate this function from endOfVideo() + */ + bool isPlaying() const { return _isPlaying; } + + /** + * Get the duration of the video. + * + * If the duration is unknown, this will return 0. + */ + virtual Audio::Timestamp getDuration() const; + + // Future API + //void setRate(const Common::Rational &rate); + //Common::Rational getRate() const; + //void setStartTime(const Audio::Timestamp &startTime); + //Audio::Timestamp getStartTime() const; + //void setStopTime(const Audio::Timestamp &stopTime); + //Audio::Timestamp getStopTime() const; + //void setSegment(const Audio::Timestamp &startTime, const Audio::Timestamp &stopTime); + +protected: + // Old API + void pauseVideoIntern(bool pause); + void updateVolume(); + void updateBalance(); + + // New API + + /** + * An abstract representation of a track in a movie. + */ + class Track { + public: + Track(); + virtual ~Track() {} + + /** + * The types of tracks this class can be. + */ + enum TrackType { + kTrackTypeNone, + kTrackTypeVideo, + kTrackTypeAudio + }; + + /** + * Get the type of track. + */ + virtual TrackType getTrackType() const = 0; + + /** + * Return if the track has finished. + */ + virtual bool endOfTrack() const = 0; + + /** + * Return if the track is rewindable. + */ + virtual bool isRewindable() const; + + /** + * Rewind the video to the beginning. + * @return true on success, false otherwise. + */ + virtual bool rewind(); + + /** + * Return if the track is seekable. + */ + virtual bool isSeekable() const { return false; } + + /** + * Seek to the given time. + * @param time The time to seek to. + * @return true on success, false otherwise. + */ + virtual bool seek(const Audio::Timestamp &time) { return false; } + + /** + * Start playback of the track. + */ + virtual void start() {} + + /** + * Stop playback of the track. + */ + virtual void stop() {} + + /** + * Set the pause status of the track. + */ + void pause(bool shouldPause) {} + + /** + * Return if the track is paused. + */ + bool isPaused() const { return _paused; } + + protected: + /** + * Function called by pause() for subclasses to implement. + */ + void pauseIntern(bool pause); + + private: + bool _paused; + }; + + /** + * An abstract representation of a video track. + */ + class VideoTrack : public Track { + public: + VideoTrack() {} + virtual ~VideoTrack() {} + + TrackType getTrackType() const { return kTrackTypeVideo; } + + // TODO: Document + virtual int getCurFrame() const = 0; + virtual int getFrameCount() const { return 0; } + virtual uint32 getNextFrameStartTime() const = 0; + virtual const Graphics::Surface *decodeNextFrame() = 0; + virtual const byte *getPalette() const { return 0; } + virtual bool hasDirtyPalette() const { return false; } + }; + + /** + * A VideoTrack that is played at a constant rate. + */ + class FixedRateVideoTrack : public virtual VideoTrack { + public: + FixedRateVideoTrack() {} + virtual ~FixedRateVideoTrack() {} + + uint32 getNextFrameStartTime() const; + + protected: + /** + * Get the rate at which this track is played. + */ + virtual Common::Rational getFrameRate() const = 0; + }; + + /** + * A VideoTrack with a known frame count that can be reliably + * used to figure out if the track has finished. + */ + class FixedLengthVideoTrack : public virtual VideoTrack { + public: + FixedLengthVideoTrack() {} + virtual ~FixedLengthVideoTrack() {} + + bool endOfTrack() const; + }; + + /** + * An abstract representation of an audio track. + */ + class AudioTrack : public Track { + public: + AudioTrack() {} + virtual ~AudioTrack() {} + + TrackType getTrackType() const { return kTrackTypeAudio; } + + virtual bool endOfTrack() const; + void start(); + void stop(); + + // TODO: Document + byte getVolume() const { return _volume; } + void setVolume(byte volume); + int8 getBalance() const { return _balance; } + void setBalance(int8 balance); + uint32 getRunningTime() const; + + virtual Audio::Mixer::SoundType getSoundType() const { return Audio::Mixer::kPlainSoundType; } + + protected: + void pauseIntern(bool pause); + + // TODO: Document + virtual Audio::AudioStream *getAudioStream() const = 0; + + private: + Audio::SoundHandle _handle; + byte _volume; + int8 _balance; + }; + + /** + * An AudioTrack that implements isRewindable() and rewind() using + * the RewindableAudioStream API. + */ + class RewindableAudioTrack : public AudioTrack { + public: + RewindableAudioTrack() {} + virtual ~RewindableAudioTrack() {} + + bool isRewindable() const { return true; } + bool rewind(); + + protected: + Audio::AudioStream *getAudioStream() const; + + // TODO: Document + virtual Audio::RewindableAudioStream *getRewindableAudioStream() const = 0; + }; + + /** + * An AudioTrack that implements isSeekable() and seek() using + * the SeekableAudioStream API. + */ + class SeekableAudioTrack : public AudioTrack { + public: + SeekableAudioTrack() {} + virtual ~SeekableAudioTrack() {} + + bool isSeekable() const { return true; } + bool seek(const Audio::Timestamp &time); + + protected: + Audio::AudioStream *getAudioStream() const; + + // TODO: Document + virtual Audio::SeekableAudioStream *getSeekableAudioStream() const = 0; + }; + + /** + * Decode enough data for the next frame and enough audio to last that long. + * + * This function is used by the default decodeNextFrame() function. A subclass + * of a Track may decide to just have its decodeNextFrame() function read + * and decode the frame. + */ + virtual void readNextPacket() {} + + /** + * Define a track to be used by this class. + * + * The pointer is then owned by this base class. + */ + void addTrack(Track *track); + +private: + // Tracks owned by this AdvancedVideoDecoder + typedef Common::List TrackList; + TrackList _tracks; + VideoTrack *findNextVideoTrack(); + const VideoTrack *findNextVideoTrack() const; + + // Current playback status + bool _isPlaying, _needsRewind; + Audio::Timestamp _audioStartOffset; + + // Palette settings from individual tracks + mutable bool _dirtyPalette; + const byte *_palette; +}; + /** * A VideoDecoder wrapper that implements getTimeToNextFrame() based on getFrameRate(). + * @note This class is now deprecated. Use AdvancedVideoDecoder instead. */ class FixedRateVideoDecoder : public virtual VideoDecoder { public: @@ -282,6 +632,7 @@ private: /** * A VideoDecoder that can be rewound back to the beginning. + * @note This class is now deprecated. Use AdvancedVideoDecoder instead. */ class RewindableVideoDecoder : public virtual VideoDecoder { public: @@ -293,6 +644,7 @@ public: /** * A VideoDecoder that can seek to a frame or point in time. + * @note This class is now deprecated. Use AdvancedVideoDecoder instead. */ class SeekableVideoDecoder : public virtual RewindableVideoDecoder { public: -- cgit v1.2.3 From a12b3ea2dde9db348424f401a35fca3167120011 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 20 Jul 2012 20:52:58 -0400 Subject: SCI: Move the SEQ code to the new VideoDecoder API --- engines/sci/console.cpp | 5 ++-- engines/sci/engine/kvideo.cpp | 7 +++-- engines/sci/video/seq_decoder.cpp | 61 +++++++++++++++++++-------------------- engines/sci/video/seq_decoder.h | 52 ++++++++++++++++++--------------- 4 files changed, 64 insertions(+), 61 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 564bbbbd79..2a4ad1743d 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -250,9 +250,8 @@ void Console::postEnter() { #endif if (_videoFile.hasSuffix(".seq")) { - SeqDecoder *seqDecoder = new SeqDecoder(); - seqDecoder->setFrameDelay(_videoFrameDelay); - videoDecoder = seqDecoder; + videoDecoder = new SEQDecoder(_videoFrameDelay); + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); // TODO: Remove after new API is complete #ifdef ENABLE_SCI32 } else if (_videoFile.hasSuffix(".vmd")) { videoDecoder = new Video::VMDDecoder(g_system->getMixer()); diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index cb2a763da9..bfe32a8d82 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -162,15 +162,16 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { } else { // DOS SEQ // SEQ's are called with no subops, just the string and delay - SeqDecoder *seqDecoder = new SeqDecoder(); - seqDecoder->setFrameDelay(argv[1].toUint16()); // Time between frames in ticks - videoDecoder = seqDecoder; + // Time is specified as ticks + videoDecoder = new SEQDecoder(argv[1].toUint16()); if (!videoDecoder->loadFile(filename)) { warning("Failed to open movie file %s", filename.c_str()); delete videoDecoder; videoDecoder = 0; } + + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); // TODO: Remove after new API is complete } } else { // Windows AVI diff --git a/engines/sci/video/seq_decoder.cpp b/engines/sci/video/seq_decoder.cpp index abd64911a7..a7b6346eca 100644 --- a/engines/sci/video/seq_decoder.cpp +++ b/engines/sci/video/seq_decoder.cpp @@ -41,33 +41,44 @@ enum seqFrameTypes { kSeqFrameDiff = 1 }; -SeqDecoder::SeqDecoder() { - _fileStream = 0; - _surface = 0; - _dirtyPalette = false; +SEQDecoder::SEQDecoder(uint frameDelay) : _frameDelay(frameDelay) { } -SeqDecoder::~SeqDecoder() { +SEQDecoder::~SEQDecoder() { close(); } -bool SeqDecoder::loadStream(Common::SeekableReadStream *stream) { +bool SEQDecoder::loadStream(Common::SeekableReadStream *stream) { close(); + addTrack(new SEQVideoTrack(stream, _frameDelay)); + + return true; +} + +SEQDecoder::SEQVideoTrack::SEQVideoTrack(Common::SeekableReadStream *stream, uint frameDelay) { + assert(stream); + assert(frameDelay != 0); _fileStream = stream; + _frameDelay = frameDelay; + _curFrame = -1; + _surface = new Graphics::Surface(); _surface->create(SEQ_SCREEN_WIDTH, SEQ_SCREEN_HEIGHT, Graphics::PixelFormat::createFormatCLUT8()); _frameCount = _fileStream->readUint16LE(); - // Set palette - int paletteChunkSize = _fileStream->readUint32LE(); - readPaletteChunk(paletteChunkSize); + // Set initial palette + readPaletteChunk(_fileStream->readUint32LE()); +} - return true; +SEQDecoder::SEQVideoTrack::~SEQVideoTrack() { + delete _fileStream; + _surface->free(); + delete _surface; } -void SeqDecoder::readPaletteChunk(uint16 chunkSize) { +void SEQDecoder::SEQVideoTrack::readPaletteChunk(uint16 chunkSize) { byte *paletteData = new byte[chunkSize]; _fileStream->read(paletteData, chunkSize); @@ -91,23 +102,7 @@ void SeqDecoder::readPaletteChunk(uint16 chunkSize) { delete[] paletteData; } -void SeqDecoder::close() { - if (!_fileStream) - return; - - _frameDelay = 0; - - delete _fileStream; - _fileStream = 0; - - _surface->free(); - delete _surface; - _surface = 0; - - reset(); -} - -const Graphics::Surface *SeqDecoder::decodeNextFrame() { +const Graphics::Surface *SEQDecoder::SEQVideoTrack::decodeNextFrame() { int16 frameWidth = _fileStream->readUint16LE(); int16 frameHeight = _fileStream->readUint16LE(); int16 frameLeft = _fileStream->readUint16LE(); @@ -142,9 +137,6 @@ const Graphics::Surface *SeqDecoder::decodeNextFrame() { delete[] buf; } - if (_curFrame == -1) - _startTime = g_system->getMillis(); - _curFrame++; return _surface; } @@ -159,7 +151,7 @@ const Graphics::Surface *SeqDecoder::decodeNextFrame() { } \ memcpy(dest + writeRow * SEQ_SCREEN_WIDTH + writeCol, litData + litPos, n); -bool SeqDecoder::decodeFrame(byte *rleData, int rleSize, byte *litData, int litSize, byte *dest, int left, int width, int height, int colorKey) { +bool SEQDecoder::SEQVideoTrack::decodeFrame(byte *rleData, int rleSize, byte *litData, int litSize, byte *dest, int left, int width, int height, int colorKey) { int writeRow = 0; int writeCol = left; int litPos = 0; @@ -237,4 +229,9 @@ bool SeqDecoder::decodeFrame(byte *rleData, int rleSize, byte *litData, int litS return true; } +const byte *SEQDecoder::SEQVideoTrack::getPalette() const { + _dirtyPalette = false; + return _palette; +} + } // End of namespace Sci diff --git a/engines/sci/video/seq_decoder.h b/engines/sci/video/seq_decoder.h index 800a3c9024..c07bcd748b 100644 --- a/engines/sci/video/seq_decoder.h +++ b/engines/sci/video/seq_decoder.h @@ -40,27 +40,16 @@ namespace Sci { /** * Implementation of the Sierra SEQ decoder, used in KQ6 DOS floppy/CD and GK1 DOS */ -class SeqDecoder : public Video::FixedRateVideoDecoder { +class SEQDecoder : public Video::AdvancedVideoDecoder { public: - SeqDecoder(); - virtual ~SeqDecoder(); + SEQDecoder(uint frameDelay); + virtual ~SEQDecoder(); bool loadStream(Common::SeekableReadStream *stream); - void close(); - void setFrameDelay(int frameDelay) { _frameDelay = frameDelay; } - - bool isVideoLoaded() const { return _fileStream != 0; } uint16 getWidth() const { return SEQ_SCREEN_WIDTH; } uint16 getHeight() const { return SEQ_SCREEN_HEIGHT; } - uint32 getFrameCount() const { return _frameCount; } - const Graphics::Surface *decodeNextFrame(); Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } - const byte *getPalette() { _dirtyPalette = false; return _palette; } - bool hasDirtyPalette() const { return _dirtyPalette; } - -protected: - Common::Rational getFrameRate() const { assert(_frameDelay); return Common::Rational(60, _frameDelay); } private: enum { @@ -68,16 +57,33 @@ private: SEQ_SCREEN_HEIGHT = 200 }; - void readPaletteChunk(uint16 chunkSize); - bool decodeFrame(byte *rleData, int rleSize, byte *litData, int litSize, byte *dest, int left, int width, int height, int colorKey); + class SEQVideoTrack : public FixedRateVideoTrack, public FixedLengthVideoTrack { + public: + SEQVideoTrack(Common::SeekableReadStream *stream, uint frameDelay); + ~SEQVideoTrack(); + + int getCurFrame() const { return _curFrame; } + int getFrameCount() const { return _frameCount; } + const Graphics::Surface *decodeNextFrame(); + const byte *getPalette() const; + bool hasDirtyPalette() const { return _dirtyPalette; } + + protected: + Common::Rational getFrameRate() const { return Common::Rational(60, _frameDelay); } + + private: + void readPaletteChunk(uint16 chunkSize); + bool decodeFrame(byte *rleData, int rleSize, byte *litData, int litSize, byte *dest, int left, int width, int height, int colorKey); + + Common::SeekableReadStream *_fileStream; + int _curFrame, _frameCount; + byte _palette[256 * 3]; + mutable bool _dirtyPalette; + Graphics::Surface *_surface; + uint _frameDelay; + }; - uint16 _width, _height; - uint16 _frameDelay; - Common::SeekableReadStream *_fileStream; - byte _palette[256 * 3]; - bool _dirtyPalette; - uint32 _frameCount; - Graphics::Surface *_surface; + uint _frameDelay; }; } // End of namespace Sci -- cgit v1.2.3 From 5636c1fee05d1b718597017e003fa046c9791902 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sat, 21 Jul 2012 16:20:24 +0200 Subject: WII: Adapt to mouse cursor dontScale API change --- backends/platform/wii/osystem.cpp | 2 +- backends/platform/wii/osystem.h | 2 +- backends/platform/wii/osystem_gfx.cpp | 28 ++++++++++++++-------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/backends/platform/wii/osystem.cpp b/backends/platform/wii/osystem.cpp index 681675529a..22a6495f8f 100644 --- a/backends/platform/wii/osystem.cpp +++ b/backends/platform/wii/osystem.cpp @@ -39,7 +39,7 @@ OSystem_Wii::OSystem_Wii() : _startup_time(0), - _cursorScale(1), + _cursorDontScale(true), _cursorPaletteDisabled(true), _cursorPalette(NULL), _cursorPaletteDirty(false), diff --git a/backends/platform/wii/osystem.h b/backends/platform/wii/osystem.h index abafa7f642..5d6998d0b6 100644 --- a/backends/platform/wii/osystem.h +++ b/backends/platform/wii/osystem.h @@ -56,7 +56,7 @@ class OSystem_Wii : public EventsBaseBackend, public PaletteManager { private: s64 _startup_time; - int _cursorScale; + bool _cursorDontScale; bool _cursorPaletteDisabled; u16 *_cursorPalette; bool _cursorPaletteDirty; diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp index 90e4d98c6b..fc0802dd4c 100644 --- a/backends/platform/wii/osystem_gfx.cpp +++ b/backends/platform/wii/osystem_gfx.cpp @@ -451,7 +451,7 @@ bool OSystem_Wii::needsScreenUpdate() { void OSystem_Wii::updateScreen() { static f32 ar; static gfx_screen_coords_t cc; - static int cs; + static f32 csx, csy; u32 now = getMillis(); if (now - _lastScreenUpdate < 1000 / MAX_FPS) @@ -466,7 +466,6 @@ void OSystem_Wii::updateScreen() { wii_memstats(); #endif - cs = _cursorScale; _lastScreenUpdate = now; if (_overlayVisible || _consoleVisible) @@ -488,12 +487,6 @@ void OSystem_Wii::updateScreen() { if (_gameRunning) ar = gfx_set_ar(4.0 / 3.0); - // ugly, but the modern theme sets a factor of 3, only god knows why - if (cs > 2) - cs = 1; - else - cs *= 2; - if (_overlayDirty) { gfx_tex_convert(&_texOverlay, _overlayPixels); _overlayDirty = false; @@ -503,10 +496,18 @@ void OSystem_Wii::updateScreen() { } if (_mouseVisible) { - cc.x = f32(_mouseX - cs * _mouseHotspotX) * _currentXScale; - cc.y = f32(_mouseY - cs * _mouseHotspotY) * _currentYScale; - cc.w = f32(_texMouse.width) * _currentXScale * cs; - cc.h = f32(_texMouse.height) * _currentYScale * cs; + if (_cursorDontScale) { + csx = 1.0f / _currentXScale; + csy = 1.0f / _currentYScale; + } else { + csx = 1.0f; + csy = 1.0f; + } + + cc.x = f32(_mouseX - csx * _mouseHotspotX) * _currentXScale; + cc.y = f32(_mouseY - csy * _mouseHotspotY) * _currentYScale; + cc.w = f32(_texMouse.width) * _currentXScale * csx; + cc.h = f32(_texMouse.height) * _currentYScale * csy; if (_texMouse.palette && _cursorPaletteDirty) { _texMouse.palette[_mouseKeyColor] = 0; @@ -745,8 +746,7 @@ void OSystem_Wii::setMouseCursor(const void *buf, uint w, uint h, int hotspotX, _mouseHotspotX = hotspotX; _mouseHotspotY = hotspotY; - // TODO: Adapt to new dontScale logic! - _cursorScale = 1; + _cursorDontScale = dontScale; if ((_texMouse.palette) && (oldKeycolor != _mouseKeyColor)) _cursorPaletteDirty = true; -- cgit v1.2.3 From e68d6c23fefde8df2ee23f3e23035c3b73a641e6 Mon Sep 17 00:00:00 2001 From: Klaus Reimer Date: Sat, 21 Jul 2012 16:39:28 +0200 Subject: WEBOS: Remove broken keymapper code which is not needed anymore anyway --- backends/platform/webos/webos.cpp | 20 -------------------- backends/platform/webos/webos.h | 3 --- 2 files changed, 23 deletions(-) diff --git a/backends/platform/webos/webos.cpp b/backends/platform/webos/webos.cpp index 4ec153a7e9..fc18628235 100644 --- a/backends/platform/webos/webos.cpp +++ b/backends/platform/webos/webos.cpp @@ -45,24 +45,4 @@ void OSystem_SDL_WebOS::initBackend() { OSystem_SDL::initBackend(); } -/** - * Gets the original SDL hardware key set, adds WebOS specific keys and - * returns the new key set. - * - * @return The hardware key set with added webOS specific keys. - */ -#ifdef ENABLE_KEYMAPPER -HardwareInputSet *OSystem_SDL_WebOS::getHardwareInputSet() { - // Get the original SDL hardware key set - HardwareInputSet *inputSet = OSystem_SDL::getHardwareInputSet(); - - // Add WebOS specific keys - inputSet->addHardwareInput(new HardwareInput("FORWARD", - KeyState((KeyCode) 229, 229, 0), "Forward")); - - // Return the modified hardware key set - return inputSet; -} -#endif - #endif diff --git a/backends/platform/webos/webos.h b/backends/platform/webos/webos.h index 8dfa43239c..dda56a70da 100644 --- a/backends/platform/webos/webos.h +++ b/backends/platform/webos/webos.h @@ -31,9 +31,6 @@ public: OSystem_SDL_WebOS(); virtual void initBackend(); -#ifdef ENABLE_KEYMAPPER - virtual Common::HardwareInputSet *getHardwareInputSet(); -#endif }; #endif -- cgit v1.2.3 From fb1edcd4fef7fd750b4af18745ca7b3151b56aae Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 12:40:16 -0400 Subject: VIDEO: Add getWidth()/getHeight()/getPixelFormat() functions to VideoTrack The default implementations of those functions in AdvancedVideoDecoder now call into them. --- engines/sci/video/seq_decoder.h | 17 ++++++++--------- video/video_decoder.cpp | 24 ++++++++++++++++++++++++ video/video_decoder.h | 8 ++++++-- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/engines/sci/video/seq_decoder.h b/engines/sci/video/seq_decoder.h index c07bcd748b..ac801d3f19 100644 --- a/engines/sci/video/seq_decoder.h +++ b/engines/sci/video/seq_decoder.h @@ -47,21 +47,15 @@ public: bool loadStream(Common::SeekableReadStream *stream); - uint16 getWidth() const { return SEQ_SCREEN_WIDTH; } - uint16 getHeight() const { return SEQ_SCREEN_HEIGHT; } - Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } - private: - enum { - SEQ_SCREEN_WIDTH = 320, - SEQ_SCREEN_HEIGHT = 200 - }; - class SEQVideoTrack : public FixedRateVideoTrack, public FixedLengthVideoTrack { public: SEQVideoTrack(Common::SeekableReadStream *stream, uint frameDelay); ~SEQVideoTrack(); + uint16 getWidth() const { return SEQ_SCREEN_WIDTH; } + uint16 getHeight() const { return SEQ_SCREEN_HEIGHT; } + Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } int getCurFrame() const { return _curFrame; } int getFrameCount() const { return _frameCount; } const Graphics::Surface *decodeNextFrame(); @@ -72,6 +66,11 @@ private: Common::Rational getFrameRate() const { return Common::Rational(60, _frameDelay); } private: + enum { + SEQ_SCREEN_WIDTH = 320, + SEQ_SCREEN_HEIGHT = 200 + }; + void readPaletteChunk(uint16 chunkSize); bool decodeFrame(byte *rleData, int rleSize, byte *litData, int litSize, byte *dest, int left, int width, int height, int colorKey); diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index ef2aeae94f..a8cf32575a 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -119,6 +119,30 @@ bool AdvancedVideoDecoder::isVideoLoaded() const { return !_tracks.empty(); } +uint16 AdvancedVideoDecoder::getWidth() const { + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeVideo) + return ((VideoTrack *)*it)->getWidth(); + + return 0; +} + +uint16 AdvancedVideoDecoder::getHeight() const { + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeVideo) + return ((VideoTrack *)*it)->getHeight(); + + return 0; +} + +Graphics::PixelFormat AdvancedVideoDecoder::getPixelFormat() const { + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeVideo) + return ((VideoTrack *)*it)->getPixelFormat(); + + return Graphics::PixelFormat(); +} + const Graphics::Surface *AdvancedVideoDecoder::decodeNextFrame() { readNextPacket(); VideoTrack *track = findNextVideoTrack(); diff --git a/video/video_decoder.h b/video/video_decoder.h index 1c359591b3..ede2872c6a 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -287,13 +287,14 @@ public: // Old API Non-changing // loadFile() // loadStream() - // getWidth() - // getHeight() // needsUpdate() // Old API Changing virtual void close(); bool isVideoLoaded() const; + virtual uint16 getWidth() const; + virtual uint16 getHeight() const; + virtual Graphics::PixelFormat getPixelFormat() const; virtual const Graphics::Surface *decodeNextFrame(); const byte *getPalette(); bool hasDirtyPalette() const { return _dirtyPalette; } @@ -468,6 +469,9 @@ protected: TrackType getTrackType() const { return kTrackTypeVideo; } // TODO: Document + virtual uint16 getWidth() const = 0; + virtual uint16 getHeight() const = 0; + virtual Graphics::PixelFormat getPixelFormat() const = 0; virtual int getCurFrame() const = 0; virtual int getFrameCount() const { return 0; } virtual uint32 getNextFrameStartTime() const = 0; -- cgit v1.2.3 From 10341d2b5722fb39cba39356c8596d857319a1ba Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 14:39:03 -0400 Subject: VIDEO: Add getDuration() and getStartTime() functions to Track The AdvancedVideoDecoder::getDuration() function now attempts to calculate duration based on the longest track. --- video/video_decoder.cpp | 40 ++++++++++++++++++++++++++++++++++++++-- video/video_decoder.h | 29 ++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index a8cf32575a..285290da6e 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -328,7 +328,21 @@ void AdvancedVideoDecoder::stop() { } Audio::Timestamp AdvancedVideoDecoder::getDuration() const { - return Audio::Timestamp(0, 1000); + Audio::Timestamp maxDuration(0, 1000); + + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { + Audio::Timestamp startTime = (*it)->getStartTime(); + Audio::Timestamp duration = (*it)->getDuration(); + + if (duration.totalNumberOfFrames() != 0) { + // HACK: Timestamp's + operator doesn't do framerate conversion :( + duration = duration + startTime.convertToFramerate(duration.framerate()); + if (duration > maxDuration) + maxDuration = duration; + } + } + + return maxDuration; } void AdvancedVideoDecoder::pauseVideoIntern(bool pause) { @@ -359,7 +373,15 @@ bool AdvancedVideoDecoder::Track::isRewindable() const { } bool AdvancedVideoDecoder::Track::rewind() { - return seek(Audio::Timestamp(0, 1000)); + return seek(getStartTime()); +} + +Audio::Timestamp AdvancedVideoDecoder::Track::getStartTime() const { + return Audio::Timestamp(0, 1000); +} + +Audio::Timestamp AdvancedVideoDecoder::Track::getDuration() const { + return Audio::Timestamp(0, 1000); } uint32 AdvancedVideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const { @@ -375,6 +397,14 @@ bool AdvancedVideoDecoder::FixedLengthVideoTrack::endOfTrack() const { return getCurFrame() >= (getFrameCount() - 1); } +Audio::Timestamp AdvancedVideoDecoder::FixedDurationVideoTrack::getDuration() const { + // Since Audio::Timestamp doesn't support a fractional frame rate, we're currently + // just converting to milliseconds. + Common::Rational time = getFrameCount() * 1000; + time /= getFrameRate(); + return time.toInt(); +} + bool AdvancedVideoDecoder::AudioTrack::endOfTrack() const { Audio::AudioStream *stream = getAudioStream(); return !stream || (!g_system->getMixer()->isSoundHandleActive(_handle) && stream->endOfData()); @@ -433,6 +463,12 @@ bool AdvancedVideoDecoder::RewindableAudioTrack::rewind() { return stream->rewind(); } +Audio::Timestamp AdvancedVideoDecoder::SeekableAudioTrack::getDuration() const { + Audio::SeekableAudioStream *stream = getSeekableAudioStream(); + assert(stream); + return stream->getLength(); +} + Audio::AudioStream *AdvancedVideoDecoder::SeekableAudioTrack::getAudioStream() const { return getSeekableAudioStream(); } diff --git a/video/video_decoder.h b/video/video_decoder.h index ede2872c6a..87d832eeb9 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -423,7 +423,7 @@ protected: /** * Seek to the given time. - * @param time The time to seek to. + * @param time The time to seek to, from the beginning of the video. * @return true on success, false otherwise. */ virtual bool seek(const Audio::Timestamp &time) { return false; } @@ -448,6 +448,19 @@ protected: */ bool isPaused() const { return _paused; } + /** + * Get the start time of the track (starting from the beginning of the + * movie). + */ + virtual Audio::Timestamp getStartTime() const; + + /** + * Get the duration of the track (starting from this track's start time). + * + * By default, this returns 0 for unknown. + */ + virtual Audio::Timestamp getDuration() const; + protected: /** * Function called by pause() for subclasses to implement. @@ -509,6 +522,18 @@ protected: bool endOfTrack() const; }; + /** + * A FixedRateVideoTrack and FixedLengthVideoTrack that implements the getDuration() + * function. + */ + class FixedDurationVideoTrack : public FixedRateVideoTrack, public FixedLengthVideoTrack { + public: + FixedDurationVideoTrack() {} + virtual ~FixedDurationVideoTrack() {} + + virtual Audio::Timestamp getDuration() const; + }; + /** * An abstract representation of an audio track. */ @@ -575,6 +600,8 @@ protected: bool isSeekable() const { return true; } bool seek(const Audio::Timestamp &time); + Audio::Timestamp getDuration() const; + protected: Audio::AudioStream *getAudioStream() const; -- cgit v1.2.3 From e74c306a7f3847128eb786c2d56f04d559e5a822 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 14:43:08 -0400 Subject: SCI: Switch SEQDecoder to using the new FixedDurationVideoTrack subclass --- engines/sci/video/seq_decoder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/video/seq_decoder.h b/engines/sci/video/seq_decoder.h index ac801d3f19..75d7ce6c3d 100644 --- a/engines/sci/video/seq_decoder.h +++ b/engines/sci/video/seq_decoder.h @@ -48,7 +48,7 @@ public: bool loadStream(Common::SeekableReadStream *stream); private: - class SEQVideoTrack : public FixedRateVideoTrack, public FixedLengthVideoTrack { + class SEQVideoTrack : public FixedDurationVideoTrack { public: SEQVideoTrack(Common::SeekableReadStream *stream, uint frameDelay); ~SEQVideoTrack(); -- cgit v1.2.3 From c3cc3620c0d66a2ea7eac9738ead934f3b6381b0 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 14:50:10 -0400 Subject: VIDEO: When adding tracks, keep them in sync with the main video status --- video/video_decoder.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 285290da6e..67e53c6b47 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -481,6 +481,12 @@ bool AdvancedVideoDecoder::SeekableAudioTrack::seek(const Audio::Timestamp &time void AdvancedVideoDecoder::addTrack(Track *track) { _tracks.push_back(track); + + if (isPaused()) + track->pause(true); + + if (isPlaying()) + track->start(); } AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() { -- cgit v1.2.3 From 1d565a26610a174c16b58b569fe413f3acf9bd75 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 17:11:09 -0400 Subject: VIDEO: Fix volume/balance settings in AdvancedVideoDecoder --- video/video_decoder.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 67e53c6b47..07fd225dcf 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -98,6 +98,9 @@ AdvancedVideoDecoder::AdvancedVideoDecoder() { _dirtyPalette = false; _palette = 0; _isPlaying = false; + _audioVolume = Audio::Mixer::kMaxChannelVolume; + _audioBalance = 0; + _pauseLevel = 0; } void AdvancedVideoDecoder::close() { @@ -112,7 +115,9 @@ void AdvancedVideoDecoder::close() { _dirtyPalette = false; _palette = 0; _startTime = 0; - reset(); + _audioVolume = Audio::Mixer::kMaxChannelVolume; + _audioBalance = 0; + _pauseLevel = 0; } bool AdvancedVideoDecoder::isVideoLoaded() const { @@ -482,9 +487,17 @@ bool AdvancedVideoDecoder::SeekableAudioTrack::seek(const Audio::Timestamp &time void AdvancedVideoDecoder::addTrack(Track *track) { _tracks.push_back(track); + // Update volume settings if it's an audio track + if (track->getTrackType() == Track::kTrackTypeAudio) { + ((AudioTrack *)track)->setVolume(_audioVolume); + ((AudioTrack *)track)->setBalance(_audioBalance); + } + + // Keep the track paused if we're paused if (isPaused()) track->pause(true); + // Start the track if we're playing if (isPlaying()) track->start(); } -- cgit v1.2.3 From fc1163ac28aae1c7bc9f8f9d3877c6f368b4b19c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 17:30:06 -0400 Subject: VIDEO: Allow for disabling of automatic audio sync in AdvancedVideoDecoder --- video/video_decoder.cpp | 12 +++++++----- video/video_decoder.h | 7 +++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 07fd225dcf..3312b2530d 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -194,12 +194,14 @@ uint32 AdvancedVideoDecoder::getTime() const { if (isPaused()) return _pauseStartTime - _startTime; - for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { - if ((*it)->getTrackType() == Track::kTrackTypeAudio) { - uint32 time = ((const AudioTrack *)*it)->getRunningTime(); + if (useAudioSync()) { + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { + if ((*it)->getTrackType() == Track::kTrackTypeAudio) { + uint32 time = ((const AudioTrack *)*it)->getRunningTime(); - if (time != 0) - return time + _audioStartOffset.msecs(); + if (time != 0) + return time + _audioStartOffset.msecs(); + } } } diff --git a/video/video_decoder.h b/video/video_decoder.h index 87d832eeb9..9496148de6 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -625,6 +625,13 @@ protected: */ void addTrack(Track *track); + /** + * Whether or not getTime() will sync with a playing audio track. + * + * A subclass should override this to disable this feature. + */ + virtual bool useAudioSync() const { return true; } + private: // Tracks owned by this AdvancedVideoDecoder typedef Common::List TrackList; -- cgit v1.2.3 From 5cdb0f71a499250d36d79d0f8ba85ff2d370f9aa Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 17:30:43 -0400 Subject: VIDEO: Fix AudioTrack::endOfTrack() --- video/video_decoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 3312b2530d..82cba7e6e2 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -414,7 +414,7 @@ Audio::Timestamp AdvancedVideoDecoder::FixedDurationVideoTrack::getDuration() co bool AdvancedVideoDecoder::AudioTrack::endOfTrack() const { Audio::AudioStream *stream = getAudioStream(); - return !stream || (!g_system->getMixer()->isSoundHandleActive(_handle) && stream->endOfData()); + return !stream || !g_system->getMixer()->isSoundHandleActive(_handle) || stream->endOfData(); } void AdvancedVideoDecoder::AudioTrack::setVolume(byte volume) { -- cgit v1.2.3 From 24c97b89138190d211b1f19d5575c9029c0329b2 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 17:31:00 -0400 Subject: VIDEO: Move PSXStreamDecoder to the new VideoDecoder API --- engines/sword1/animation.cpp | 1 + engines/sword2/animation.cpp | 1 + video/psx_decoder.cpp | 256 +++++++++++++++++++++---------------------- video/psx_decoder.h | 112 +++++++++++-------- 4 files changed, 195 insertions(+), 175 deletions(-) diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index ddafd964eb..49c5ef7312 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -189,6 +189,7 @@ bool MoviePlayer::load(uint32 id) { // Need to load here in case it fails in which case we'd need // to go back to paletted mode if (_decoder->loadFile(filename)) { + ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete return true; } else { initGraphics(g_system->getWidth(), g_system->getHeight(), true); diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index 5e3f8929e9..c1cf33ff09 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -99,6 +99,7 @@ bool MoviePlayer::load(const char *name) { // Need to load here in case it fails in which case we'd need // to go back to paletted mode if (_decoder->loadFile(filename)) { + ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete return true; } else { initGraphics(640, 480, true); diff --git a/video/psx_decoder.cpp b/video/psx_decoder.cpp index df91a2badd..93bf711c25 100644 --- a/video/psx_decoder.cpp +++ b/video/psx_decoder.cpp @@ -149,22 +149,12 @@ static const uint32 s_huffmanACSymbols[AC_CODE_COUNT] = { END_OF_BLOCK }; -PSXStreamDecoder::PSXStreamDecoder(CDSpeed speed, uint32 frameCount) : _nextFrameStartTime(0, speed), _frameCount(frameCount) { +PSXStreamDecoder::PSXStreamDecoder(CDSpeed speed, uint32 frameCount) : _speed(speed), _frameCount(frameCount) { _stream = 0; - _audStream = 0; - _surface = new Graphics::Surface(); - _yBuffer = _cbBuffer = _crBuffer = 0; - _acHuffman = new Common::Huffman(0, AC_CODE_COUNT, s_huffmanACCodes, s_huffmanACLengths, s_huffmanACSymbols); - _dcHuffmanChroma = new Common::Huffman(0, DC_CODE_COUNT, s_huffmanDCChromaCodes, s_huffmanDCChromaLengths, s_huffmanDCSymbols); - _dcHuffmanLuma = new Common::Huffman(0, DC_CODE_COUNT, s_huffmanDCLumaCodes, s_huffmanDCLumaLengths, s_huffmanDCSymbols); } PSXStreamDecoder::~PSXStreamDecoder() { close(); - delete _surface; - delete _acHuffman; - delete _dcHuffmanLuma; - delete _dcHuffmanChroma; } #define RAW_CD_SECTOR_SIZE 2352 @@ -178,95 +168,30 @@ bool PSXStreamDecoder::loadStream(Common::SeekableReadStream *stream) { close(); _stream = stream; - - Common::SeekableReadStream *sector = readSector(); - - if (!sector) { - close(); - return false; - } - - // Rip out video info from the first frame - sector->seek(18); - byte sectorType = sector->readByte() & CDXA_TYPE_MASK; - - if (sectorType != CDXA_TYPE_VIDEO && sectorType != CDXA_TYPE_DATA) { - close(); - return false; - } - - sector->seek(40); - - uint16 width = sector->readUint16LE(); - uint16 height = sector->readUint16LE(); - _surface->create(width, height, g_system->getScreenFormat()); - - _macroBlocksW = (width + 15) / 16; - _macroBlocksH = (height + 15) / 16; - _yBuffer = new byte[_macroBlocksW * _macroBlocksH * 16 * 16]; - _cbBuffer = new byte[_macroBlocksW * _macroBlocksH * 8 * 8]; - _crBuffer = new byte[_macroBlocksW * _macroBlocksH * 8 * 8]; - - delete sector; - _stream->seek(0); + readNextPacket(); return true; } void PSXStreamDecoder::close() { - if (!_stream) - return; + AdvancedVideoDecoder::close(); + _audioTrack = 0; + _videoTrack = 0; + _frameCount = 0; delete _stream; _stream = 0; - - // Deinitialize sound - g_system->getMixer()->stopHandle(_audHandle); - _audStream = 0; - - _surface->free(); - - memset(&_adpcmStatus, 0, sizeof(_adpcmStatus)); - - _macroBlocksW = _macroBlocksH = 0; - delete[] _yBuffer; _yBuffer = 0; - delete[] _cbBuffer; _cbBuffer = 0; - delete[] _crBuffer; _crBuffer = 0; - - reset(); -} - -uint32 PSXStreamDecoder::getTime() const { - // TODO: Currently, the audio is always after the video so using this - // can often lead to gaps in the audio... - //if (_audStream) - // return _mixer->getSoundElapsedTime(_audHandle); - - return VideoDecoder::getTime(); -} - -uint32 PSXStreamDecoder::getTimeToNextFrame() const { - if (!isVideoLoaded() || endOfVideo()) - return 0; - - uint32 nextTimeMillis = _nextFrameStartTime.msecs(); - uint32 elapsedTime = getTime(); - - if (elapsedTime > nextTimeMillis) - return 0; - - return nextTimeMillis - elapsedTime; } #define VIDEO_DATA_CHUNK_SIZE 2016 #define VIDEO_DATA_HEADER_SIZE 56 -const Graphics::Surface *PSXStreamDecoder::decodeNextFrame() { +void PSXStreamDecoder::readNextPacket() { Common::SeekableReadStream *sector = 0; byte *partialFrame = 0; int sectorsRead = 0; - while (!endOfVideo()) { + while (_stream->pos() < _stream->size()) { sector = readSector(); sectorsRead++; @@ -284,6 +209,11 @@ const Graphics::Surface *PSXStreamDecoder::decodeNextFrame() { case CDXA_TYPE_DATA: case CDXA_TYPE_VIDEO: if (track == 1) { + if (!_videoTrack) { + _videoTrack = new PSXVideoTrack(sector, _speed, _frameCount); + addTrack(_videoTrack); + } + sector->seek(28); uint16 curSector = sector->readUint16LE(); uint16 sectorCount = sector->readUint16LE(); @@ -303,35 +233,27 @@ const Graphics::Surface *PSXStreamDecoder::decodeNextFrame() { // Done assembling the frame Common::SeekableReadStream *frame = new Common::MemoryReadStream(partialFrame, frameSize, DisposeAfterUse::YES); - decodeFrame(frame); + _videoTrack->decodeFrame(frame, sectorsRead); delete frame; delete sector; - - _curFrame++; - if (_curFrame == 0) - _startTime = g_system->getMillis(); - - // Increase the time by the amount of sectors we read - // One may notice that this is still not the most precise - // method since a frame takes up the time its sectors took - // up instead of the amount of time it takes the next frame - // to be read from the sectors. The actual frame rate should - // be constant instead of variable, so the slight difference - // in a frame's showing time is negligible (1/150 of a second). - _nextFrameStartTime = _nextFrameStartTime.addFrames(sectorsRead); - - return _surface; + return; } } else error("Unhandled multi-track video"); break; case CDXA_TYPE_AUDIO: // We only handle one audio channel so far - if (track == 1) - queueAudioFromSector(sector); - else + if (track == 1) { + if (!_audioTrack) { + _audioTrack = new PSXAudioTrack(sector); + addTrack(_audioTrack); + } + + _audioTrack->queueAudioFromSector(sector); + } else { warning("Unhandled multi-track audio"); + } break; default: // This shows up way too often, but the other sectors @@ -343,7 +265,19 @@ const Graphics::Surface *PSXStreamDecoder::decodeNextFrame() { delete sector; } - return 0; + if (_stream->pos() >= _stream->size()) { + if (_videoTrack) + _videoTrack->setEndOfTrack(); + + if (_audioTrack) + _audioTrack->setEndOfTrack(); + } +} + +bool PSXStreamDecoder::useAudioSync() const { + // Audio sync is disabled since most audio data comes after video + // data. + return false; } static const byte s_syncHeader[12] = { 0x00, 0xff ,0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 }; @@ -373,20 +307,29 @@ static const int s_xaTable[5][2] = { { 122, -60 } }; -void PSXStreamDecoder::queueAudioFromSector(Common::SeekableReadStream *sector) { +PSXStreamDecoder::PSXAudioTrack::PSXAudioTrack(Common::SeekableReadStream *sector) { assert(sector); + _endOfTrack = false; - if (!_audStream) { - // Initialize audio stream - sector->seek(19); - byte format = sector->readByte(); + sector->seek(19); + byte format = sector->readByte(); + bool stereo = (format & (1 << 0)) != 0; + uint rate = (format & (1 << 2)) ? 18900 : 37800; + _audStream = Audio::makeQueuingAudioStream(rate, stereo); - bool stereo = (format & (1 << 0)) != 0; - uint rate = (format & (1 << 2)) ? 18900 : 37800; + memset(&_adpcmStatus, 0, sizeof(_adpcmStatus)); +} - _audStream = Audio::makeQueuingAudioStream(rate, stereo); - g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audHandle, _audStream, -1, getVolume(), getBalance()); - } +PSXStreamDecoder::PSXAudioTrack::~PSXAudioTrack() { + delete _audStream; +} + +bool PSXStreamDecoder::PSXAudioTrack::endOfTrack() const { + return AudioTrack::endOfTrack() && _endOfTrack; +} + +void PSXStreamDecoder::PSXAudioTrack::queueAudioFromSector(Common::SeekableReadStream *sector) { + assert(sector); sector->seek(24); @@ -472,7 +415,54 @@ void PSXStreamDecoder::queueAudioFromSector(Common::SeekableReadStream *sector) delete[] buf; } -void PSXStreamDecoder::decodeFrame(Common::SeekableReadStream *frame) { +Audio::AudioStream *PSXStreamDecoder::PSXAudioTrack::getAudioStream() const { + return _audStream; +} + + +PSXStreamDecoder::PSXVideoTrack::PSXVideoTrack(Common::SeekableReadStream *firstSector, CDSpeed speed, int frameCount) : _nextFrameStartTime(0, speed), _frameCount(frameCount) { + assert(firstSector); + + firstSector->seek(40); + uint16 width = firstSector->readUint16LE(); + uint16 height = firstSector->readUint16LE(); + _surface = new Graphics::Surface(); + _surface->create(width, height, g_system->getScreenFormat()); + + _macroBlocksW = (width + 15) / 16; + _macroBlocksH = (height + 15) / 16; + _yBuffer = new byte[_macroBlocksW * _macroBlocksH * 16 * 16]; + _cbBuffer = new byte[_macroBlocksW * _macroBlocksH * 8 * 8]; + _crBuffer = new byte[_macroBlocksW * _macroBlocksH * 8 * 8]; + + _endOfTrack = false; + _curFrame = -1; + _acHuffman = new Common::Huffman(0, AC_CODE_COUNT, s_huffmanACCodes, s_huffmanACLengths, s_huffmanACSymbols); + _dcHuffmanChroma = new Common::Huffman(0, DC_CODE_COUNT, s_huffmanDCChromaCodes, s_huffmanDCChromaLengths, s_huffmanDCSymbols); + _dcHuffmanLuma = new Common::Huffman(0, DC_CODE_COUNT, s_huffmanDCLumaCodes, s_huffmanDCLumaLengths, s_huffmanDCSymbols); +} + +PSXStreamDecoder::PSXVideoTrack::~PSXVideoTrack() { + _surface->free(); + delete _surface; + + delete[] _yBuffer; + delete[] _cbBuffer; + delete[] _crBuffer; + delete _acHuffman; + delete _dcHuffmanChroma; + delete _dcHuffmanLuma; +} + +uint32 PSXStreamDecoder::PSXVideoTrack::getNextFrameStartTime() const { + return _nextFrameStartTime.msecs(); +} + +const Graphics::Surface *PSXStreamDecoder::PSXVideoTrack::decodeNextFrame() { + return _surface; +} + +void PSXStreamDecoder::PSXVideoTrack::decodeFrame(Common::SeekableReadStream *frame, uint sectorCount) { // A frame is essentially an MPEG-1 intra frame Common::BitStream16LEMSB bits(frame); @@ -494,9 +484,20 @@ void PSXStreamDecoder::decodeFrame(Common::SeekableReadStream *frame) { // Output data onto the frame Graphics::convertYUV420ToRGB(_surface, _yBuffer, _cbBuffer, _crBuffer, _surface->w, _surface->h, _macroBlocksW * 16, _macroBlocksW * 8); + + _curFrame++; + + // Increase the time by the amount of sectors we read + // One may notice that this is still not the most precise + // method since a frame takes up the time its sectors took + // up instead of the amount of time it takes the next frame + // to be read from the sectors. The actual frame rate should + // be constant instead of variable, so the slight difference + // in a frame's showing time is negligible (1/150 of a second). + _nextFrameStartTime = _nextFrameStartTime.addFrames(sectorCount); } -void PSXStreamDecoder::decodeMacroBlock(Common::BitStream *bits, int mbX, int mbY, uint16 scale, uint16 version) { +void PSXStreamDecoder::PSXVideoTrack::decodeMacroBlock(Common::BitStream *bits, int mbX, int mbY, uint16 scale, uint16 version) { int pitchY = _macroBlocksW * 16; int pitchC = _macroBlocksW * 8; @@ -533,7 +534,7 @@ static const byte s_quantizationTable[8 * 8] = { 27, 29, 35, 38, 46, 56, 69, 83 }; -void PSXStreamDecoder::dequantizeBlock(int *coefficients, float *block, uint16 scale) { +void PSXStreamDecoder::PSXVideoTrack::dequantizeBlock(int *coefficients, float *block, uint16 scale) { // Dequantize the data, un-zig-zagging as we go along for (int i = 0; i < 8 * 8; i++) { if (i == 0) // Special case for the DC coefficient @@ -543,7 +544,7 @@ void PSXStreamDecoder::dequantizeBlock(int *coefficients, float *block, uint16 s } } -int PSXStreamDecoder::readDC(Common::BitStream *bits, uint16 version, PlaneType plane) { +int PSXStreamDecoder::PSXVideoTrack::readDC(Common::BitStream *bits, uint16 version, PlaneType plane) { // Version 2 just has its coefficient as 10-bits if (version == 2) return readSignedCoefficient(bits); @@ -573,7 +574,7 @@ int PSXStreamDecoder::readDC(Common::BitStream *bits, uint16 version, PlaneType if (count > 63) \ error("PSXStreamDecoder::readAC(): Too many coefficients") -void PSXStreamDecoder::readAC(Common::BitStream *bits, int *block) { +void PSXStreamDecoder::PSXVideoTrack::readAC(Common::BitStream *bits, int *block) { // Clear the block first for (int i = 0; i < 63; i++) block[i] = 0; @@ -608,7 +609,7 @@ void PSXStreamDecoder::readAC(Common::BitStream *bits, int *block) { } } -int PSXStreamDecoder::readSignedCoefficient(Common::BitStream *bits) { +int PSXStreamDecoder::PSXVideoTrack::readSignedCoefficient(Common::BitStream *bits) { uint val = bits->getBits(10); // extend the sign @@ -630,7 +631,7 @@ static const double s_idct8x8[8][8] = { { 0.353553390593274, -0.490392640201615, 0.461939766255643, -0.415734806151273, 0.353553390593273, -0.277785116509801, 0.191341716182545, -0.097545161008064 } }; -void PSXStreamDecoder::idct(float *dequantData, float *result) { +void PSXStreamDecoder::PSXVideoTrack::idct(float *dequantData, float *result) { // IDCT code based on JPEG's IDCT code // TODO: Switch to the integer-based one mentioned in the docs // This is by far the costliest operation here @@ -669,7 +670,7 @@ void PSXStreamDecoder::idct(float *dequantData, float *result) { } } -void PSXStreamDecoder::decodeBlock(Common::BitStream *bits, byte *block, int pitch, uint16 scale, uint16 version, PlaneType plane) { +void PSXStreamDecoder::PSXVideoTrack::decodeBlock(Common::BitStream *bits, byte *block, int pitch, uint16 scale, uint16 version, PlaneType plane) { // Version 2 just has signed 10 bits for DC // Version 3 has them huffman coded int coefficients[8 * 8]; @@ -686,22 +687,13 @@ void PSXStreamDecoder::decodeBlock(Common::BitStream *bits, byte *block, int pit // Now output the data for (int y = 0; y < 8; y++) { - byte *start = block + pitch * y; + byte *dst = block + pitch * y; // Convert the result to be in the range [0, 255] for (int x = 0; x < 8; x++) - *start++ = (int)CLIP(idctData[y * 8 + x], -128.0f, 127.0f) + 128; + *dst++ = (int)CLIP(idctData[y * 8 + x], -128.0f, 127.0f) + 128; } } -void PSXStreamDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(_audHandle)) - g_system->getMixer()->setChannelVolume(_audHandle, getVolume()); -} - -void PSXStreamDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(_audHandle)) - g_system->getMixer()->setChannelBalance(_audHandle, getBalance()); -} } // End of namespace Video diff --git a/video/psx_decoder.h b/video/psx_decoder.h index 4364ec4bbb..2a9dedf77f 100644 --- a/video/psx_decoder.h +++ b/video/psx_decoder.h @@ -56,7 +56,7 @@ namespace Video { * - sword1 (psx) * - sword2 (psx) */ -class PSXStreamDecoder : public VideoDecoder { +class PSXStreamDecoder : public AdvancedVideoDecoder { public: // CD speed in sectors/second // Calling code should use these enum values instead of the constants @@ -71,59 +71,85 @@ public: bool loadStream(Common::SeekableReadStream *stream); void close(); - bool isVideoLoaded() const { return _stream != 0; } - uint16 getWidth() const { return _surface->w; } - uint16 getHeight() const { return _surface->h; } - uint32 getFrameCount() const { return _frameCount; } - uint32 getTime() const; - uint32 getTimeToNextFrame() const; - const Graphics::Surface *decodeNextFrame(); - Graphics::PixelFormat getPixelFormat() const { return _surface->format; } - bool endOfVideo() const { return _stream->pos() >= _stream->size(); } - protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); + void readNextPacket(); + bool useAudioSync() const; private: - void initCommon(); - Common::SeekableReadStream *_stream; - Graphics::Surface *_surface; + class PSXVideoTrack : public VideoTrack { + public: + PSXVideoTrack(Common::SeekableReadStream *firstSector, CDSpeed speed, int frameCount); + ~PSXVideoTrack(); + + uint16 getWidth() const { return _surface->w; } + uint16 getHeight() const { return _surface->h; } + Graphics::PixelFormat getPixelFormat() const { return _surface->format; } + bool endOfTrack() const { return _endOfTrack; } + int getCurFrame() const { return _curFrame; } + int getFrameCount() const { return _frameCount; } + uint32 getNextFrameStartTime() const; + const Graphics::Surface *decodeNextFrame(); + + void setEndOfTrack() { _endOfTrack = true; } + void decodeFrame(Common::SeekableReadStream *frame, uint sectorCount); + + private: + Graphics::Surface *_surface; + uint32 _frameCount; + Audio::Timestamp _nextFrameStartTime; + bool _endOfTrack; + int _curFrame; + + enum PlaneType { + kPlaneY = 0, + kPlaneU = 1, + kPlaneV = 2 + }; + + uint16 _macroBlocksW, _macroBlocksH; + byte *_yBuffer, *_cbBuffer, *_crBuffer; + void decodeMacroBlock(Common::BitStream *bits, int mbX, int mbY, uint16 scale, uint16 version); + void decodeBlock(Common::BitStream *bits, byte *block, int pitch, uint16 scale, uint16 version, PlaneType plane); + + void readAC(Common::BitStream *bits, int *block); + Common::Huffman *_acHuffman; + + int readDC(Common::BitStream *bits, uint16 version, PlaneType plane); + Common::Huffman *_dcHuffmanLuma, *_dcHuffmanChroma; + int _lastDC[3]; + + void dequantizeBlock(int *coefficients, float *block, uint16 scale); + void idct(float *dequantData, float *result); + int readSignedCoefficient(Common::BitStream *bits); + }; - uint32 _frameCount; - Audio::Timestamp _nextFrameStartTime; + class PSXAudioTrack : public AudioTrack { + public: + PSXAudioTrack(Common::SeekableReadStream *sector); + ~PSXAudioTrack(); - Audio::SoundHandle _audHandle; - Audio::QueuingAudioStream *_audStream; - void queueAudioFromSector(Common::SeekableReadStream *sector); + bool endOfTrack() const; - enum PlaneType { - kPlaneY = 0, - kPlaneU = 1, - kPlaneV = 2 - }; + void setEndOfTrack() { _endOfTrack = true; } + void queueAudioFromSector(Common::SeekableReadStream *sector); - uint16 _macroBlocksW, _macroBlocksH; - byte *_yBuffer, *_cbBuffer, *_crBuffer; - void decodeFrame(Common::SeekableReadStream *frame); - void decodeMacroBlock(Common::BitStream *bits, int mbX, int mbY, uint16 scale, uint16 version); - void decodeBlock(Common::BitStream *bits, byte *block, int pitch, uint16 scale, uint16 version, PlaneType plane); + private: + Audio::AudioStream *getAudioStream() const; - void readAC(Common::BitStream *bits, int *block); - Common::Huffman *_acHuffman; + Audio::QueuingAudioStream *_audStream; - int readDC(Common::BitStream *bits, uint16 version, PlaneType plane); - Common::Huffman *_dcHuffmanLuma, *_dcHuffmanChroma; - int _lastDC[3]; + struct ADPCMStatus { + int16 sample[2]; + } _adpcmStatus[2]; - void dequantizeBlock(int *coefficients, float *block, uint16 scale); - void idct(float *dequantData, float *result); - int readSignedCoefficient(Common::BitStream *bits); + bool _endOfTrack; + }; - struct ADPCMStatus { - int16 sample[2]; - } _adpcmStatus[2]; + CDSpeed _speed; + uint32 _frameCount; + Common::SeekableReadStream *_stream; + PSXVideoTrack *_videoTrack; + PSXAudioTrack *_audioTrack; Common::SeekableReadStream *readSector(); }; -- cgit v1.2.3 From 144b9ce9189260973994ca83b6e2b29126ef269a Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 17:38:24 -0400 Subject: VIDEO: Don't try to sync video off of finished audio tracks --- video/video_decoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 82cba7e6e2..3cce2dea02 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -196,7 +196,7 @@ uint32 AdvancedVideoDecoder::getTime() const { if (useAudioSync()) { for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { - if ((*it)->getTrackType() == Track::kTrackTypeAudio) { + if ((*it)->getTrackType() == Track::kTrackTypeAudio && !(*it)->endOfTrack()) { uint32 time = ((const AudioTrack *)*it)->getRunningTime(); if (time != 0) -- cgit v1.2.3 From 067e02e90b7fbe3406cbc7b5b08d63ae281b360c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 21 Jul 2012 17:52:16 -0400 Subject: VIDEO: Add StreamFileAudioTrack wrapper --- video/video_decoder.cpp | 15 +++++++++++++++ video/video_decoder.h | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 3cce2dea02..4ac914927e 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -486,6 +486,21 @@ bool AdvancedVideoDecoder::SeekableAudioTrack::seek(const Audio::Timestamp &time return stream->seek(time); } +AdvancedVideoDecoder::StreamFileAudioTrack::StreamFileAudioTrack() { + _stream = 0; +} + +AdvancedVideoDecoder::StreamFileAudioTrack::~StreamFileAudioTrack() { + delete _stream; +} + +bool AdvancedVideoDecoder::StreamFileAudioTrack::loadFromFile(const Common::String &baseName) { + // TODO: Make sure the stream isn't being played + delete _stream; + _stream = Audio::SeekableAudioStream::openStreamFile(baseName); + return _stream != 0; +} + void AdvancedVideoDecoder::addTrack(Track *track) { _tracks.push_back(track); diff --git a/video/video_decoder.h b/video/video_decoder.h index 9496148de6..3e991ade66 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -609,6 +609,27 @@ protected: virtual Audio::SeekableAudioStream *getSeekableAudioStream() const = 0; }; + /** + * A SeekableAudioTrack that constructs its SeekableAudioStream using + * SeekableAudioStream::openStreamFile() + */ + class StreamFileAudioTrack : public SeekableAudioTrack { + public: + StreamFileAudioTrack(); + ~StreamFileAudioTrack(); + + /** + * Load the track from a file with the given base name. + * + * @return true on success, false otherwise + */ + bool loadFromFile(const Common::String &baseName); + + protected: + Audio::SeekableAudioStream *_stream; + Audio::SeekableAudioStream *getSeekableAudioStream() const { return _stream; } + }; + /** * Decode enough data for the next frame and enough audio to last that long. * -- cgit v1.2.3 From 31b00ac139ee7a4fa49b876a0560ad7282f47d59 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sun, 22 Jul 2012 04:14:58 +0100 Subject: TEENAGENT: Fix for bug #3540542 ("string truncated after diving"). This was a typo in the string offset. --- engines/teenagent/callbacks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/teenagent/callbacks.cpp b/engines/teenagent/callbacks.cpp index 8882531d27..b0ccb8844d 100644 --- a/engines/teenagent/callbacks.cpp +++ b/engines/teenagent/callbacks.cpp @@ -3925,7 +3925,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { displayMessage(0x39ae); break; default: - displayMessage(0x39b7); + displayMessage(0x3ab7); } return true; -- cgit v1.2.3 From 4c9c22b374569e9f93b30137b57eaa2912beffc4 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 22 Jul 2012 00:39:10 -0400 Subject: VIDEO: Make seek/rewind functions in AdvancedVideoDecoder virtual This is to allow for seeking in videos where not everything is indexed --- video/video_decoder.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/video/video_decoder.h b/video/video_decoder.h index 3e991ade66..3d8b09f26e 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -306,33 +306,37 @@ public: // New API /** - * Returns if a video is rewindable or not. + * Returns if a video is rewindable or not. The default implementation + * polls each track for rewindability. */ - bool isRewindable() const; + virtual bool isRewindable() const; /** * Rewind a video to its beginning. * - * If the video is playing, it will continue to play. + * If the video is playing, it will continue to play. The default + * implementation will rewind each track. * * @return true on success, false otherwise */ - bool rewind(); + virtual bool rewind(); /** - * Returns if a video is seekable or not. + * Returns if a video is seekable or not. The default implementation + * polls each track for seekability. */ - bool isSeekable() const; + virtual bool isSeekable() const; /** * Seek to a given time in the video. * - * If the video is playing, it will continue to play. + * If the video is playing, it will continue to play. The default + * implementation will seek each track. * * @param time The time to seek to * @return true on success, false otherwise */ - bool seek(const Audio::Timestamp &time); + virtual bool seek(const Audio::Timestamp &time); /** * Begin playback of the video. -- cgit v1.2.3 From 9bf17934d3fb6ab30c64dd87dfed1e5f154bca51 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 22 Jul 2012 00:58:38 -0400 Subject: VIDEO: Take audio start time into account when syncing to audio --- video/video_decoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 4ac914927e..5946a7d79c 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -200,7 +200,7 @@ uint32 AdvancedVideoDecoder::getTime() const { uint32 time = ((const AudioTrack *)*it)->getRunningTime(); if (time != 0) - return time + _audioStartOffset.msecs(); + return time + (*it)->getStartTime().msecs() + _audioStartOffset.msecs(); } } } -- cgit v1.2.3 From 29541dc5f4dd492f7443463f709a5c6396dab9d8 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 22 Jul 2012 12:17:54 -0400 Subject: VIDEO: Hold tracks in an Array instead of a List Decoders such as AVI will need to access them by index --- video/video_decoder.cpp | 14 ++++++++++++++ video/video_decoder.h | 18 ++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 5946a7d79c..b2fcdda04c 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -519,6 +519,20 @@ void AdvancedVideoDecoder::addTrack(Track *track) { track->start(); } +AdvancedVideoDecoder::Track *AdvancedVideoDecoder::getTrack(uint track) { + if (track > _tracks.size()) + return 0; + + return _tracks[track]; +} + +const AdvancedVideoDecoder::Track *AdvancedVideoDecoder::getTrack(uint track) const { + if (track > _tracks.size()) + return 0; + + return _tracks[track]; +} + AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() { VideoTrack *bestTrack = 0; uint32 bestTime = 0xFFFFFFFF; diff --git a/video/video_decoder.h b/video/video_decoder.h index 3d8b09f26e..2a5eebfc60 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -25,7 +25,7 @@ #include "audio/mixer.h" #include "audio/timestamp.h" // TODO: Move this to common/ ? -#include "common/list.h" +#include "common/array.h" #include "common/str.h" namespace Audio { @@ -657,9 +657,23 @@ protected: */ virtual bool useAudioSync() const { return true; } + /** + * Get the given track based on its index. + * + * @return A valid track pointer on success, 0 otherwise + */ + Track *getTrack(uint track); + + /** + * Get the given track based on its index + * + * @return A valid track pointer on success, 0 otherwise + */ + const Track *getTrack(uint track) const; + private: // Tracks owned by this AdvancedVideoDecoder - typedef Common::List TrackList; + typedef Common::Array TrackList; TrackList _tracks; VideoTrack *findNextVideoTrack(); const VideoTrack *findNextVideoTrack() const; -- cgit v1.2.3 From 7654b2036268bb56f3b08b88858f2a9e4862b056 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 22 Jul 2012 14:11:11 -0400 Subject: VIDEO: Merge the three Fixed* VideoTrack classes Avoids diamond inheritance, which makes it impossible to downcast without rtti --- engines/sci/video/seq_decoder.h | 2 +- video/video_decoder.cpp | 4 ++-- video/video_decoder.h | 30 +++++------------------------- 3 files changed, 8 insertions(+), 28 deletions(-) diff --git a/engines/sci/video/seq_decoder.h b/engines/sci/video/seq_decoder.h index 75d7ce6c3d..82254990d6 100644 --- a/engines/sci/video/seq_decoder.h +++ b/engines/sci/video/seq_decoder.h @@ -48,7 +48,7 @@ public: bool loadStream(Common::SeekableReadStream *stream); private: - class SEQVideoTrack : public FixedDurationVideoTrack { + class SEQVideoTrack : public FixedRateVideoTrack { public: SEQVideoTrack(Common::SeekableReadStream *stream, uint frameDelay); ~SEQVideoTrack(); diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index b2fcdda04c..ad176da73b 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -400,11 +400,11 @@ uint32 AdvancedVideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const return time.toInt(); } -bool AdvancedVideoDecoder::FixedLengthVideoTrack::endOfTrack() const { +bool AdvancedVideoDecoder::FixedRateVideoTrack::endOfTrack() const { return getCurFrame() >= (getFrameCount() - 1); } -Audio::Timestamp AdvancedVideoDecoder::FixedDurationVideoTrack::getDuration() const { +Audio::Timestamp AdvancedVideoDecoder::FixedRateVideoTrack::getDuration() const { // Since Audio::Timestamp doesn't support a fractional frame rate, we're currently // just converting to milliseconds. Common::Rational time = getFrameCount() * 1000; diff --git a/video/video_decoder.h b/video/video_decoder.h index 2a5eebfc60..efc8f7a37d 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -499,13 +499,17 @@ protected: /** * A VideoTrack that is played at a constant rate. + * + * If the frame count is unknown, you must override endOfTrack(). */ - class FixedRateVideoTrack : public virtual VideoTrack { + class FixedRateVideoTrack : public VideoTrack { public: FixedRateVideoTrack() {} virtual ~FixedRateVideoTrack() {} + virtual bool endOfTrack() const; uint32 getNextFrameStartTime() const; + virtual Audio::Timestamp getDuration() const; protected: /** @@ -514,30 +518,6 @@ protected: virtual Common::Rational getFrameRate() const = 0; }; - /** - * A VideoTrack with a known frame count that can be reliably - * used to figure out if the track has finished. - */ - class FixedLengthVideoTrack : public virtual VideoTrack { - public: - FixedLengthVideoTrack() {} - virtual ~FixedLengthVideoTrack() {} - - bool endOfTrack() const; - }; - - /** - * A FixedRateVideoTrack and FixedLengthVideoTrack that implements the getDuration() - * function. - */ - class FixedDurationVideoTrack : public FixedRateVideoTrack, public FixedLengthVideoTrack { - public: - FixedDurationVideoTrack() {} - virtual ~FixedDurationVideoTrack() {} - - virtual Audio::Timestamp getDuration() const; - }; - /** * An abstract representation of an audio track. */ -- cgit v1.2.3 From 0f0c6f935443212d76422959d040b87fc78d02c7 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 22 Jul 2012 14:13:20 -0400 Subject: VIDEO: Rewrite the AVI code to use AdvancedVideoDecoder In addition to using the new API, it should theoretically support multiple audio and video tracks now but that has not been tested. --- engines/sci/console.cpp | 6 +- engines/sci/engine/kvideo.cpp | 7 +- video/avi_decoder.cpp | 554 +++++++++++++++++++++--------------------- video/avi_decoder.h | 317 ++++++++++++------------ 4 files changed, 441 insertions(+), 443 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 2a4ad1743d..a6a6d4496f 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -259,10 +259,12 @@ void Console::postEnter() { videoDecoder = new RobotDecoder(g_system->getMixer(), _engine->getPlatform() == Common::kPlatformMacintosh); } else if (_videoFile.hasSuffix(".duk")) { duckMode = true; - videoDecoder = new Video::AviDecoder(g_system->getMixer()); + videoDecoder = new Video::AVIDecoder(); + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); #endif } else if (_videoFile.hasSuffix(".avi")) { - videoDecoder = new Video::AviDecoder(g_system->getMixer()); + videoDecoder = new Video::AVIDecoder(); + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); } else { warning("Unrecognized video type"); } diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index bfe32a8d82..2c1532cc46 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -191,7 +191,7 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case 0: { Common::String filename = s->_segMan->getString(argv[1]); - videoDecoder = new Video::AviDecoder(g_system->getMixer()); + videoDecoder = new Video::AVIDecoder(); if (filename.equalsIgnoreCase("gk2a.avi")) { // HACK: Switch to 16bpp graphics for Indeo3. @@ -212,6 +212,7 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { videoDecoder = 0; } else { s->_videoState.fileName = filename; + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); } break; } @@ -407,13 +408,15 @@ reg_t kPlayDuck(EngineState *s, int argc, reg_t *argv) { s->_videoState.reset(); s->_videoState.fileName = Common::String::format("%d.duk", argv[1].toUint16()); - videoDecoder = new Video::AviDecoder(g_system->getMixer()); + videoDecoder = new Video::AVIDecoder(); if (!videoDecoder->loadFile(s->_videoState.fileName)) { warning("Could not open Duck %s", s->_videoState.fileName.c_str()); break; } + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); + if (reshowCursor) g_sci->_gfxCursor->kernelHide(); diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp index 2ea7e8d90e..375cc6f0f3 100644 --- a/video/avi_decoder.cpp +++ b/video/avi_decoder.cpp @@ -42,106 +42,128 @@ namespace Video { -/* +#define UNKNOWN_HEADER(a) error("Unknown header found -- \'%s\'", tag2str(a)) + +// IDs used throughout the AVI files +// that will be handled by this player +#define ID_RIFF MKTAG('R','I','F','F') +#define ID_AVI MKTAG('A','V','I',' ') +#define ID_LIST MKTAG('L','I','S','T') +#define ID_HDRL MKTAG('h','d','r','l') +#define ID_AVIH MKTAG('a','v','i','h') +#define ID_STRL MKTAG('s','t','r','l') +#define ID_STRH MKTAG('s','t','r','h') +#define ID_VIDS MKTAG('v','i','d','s') +#define ID_AUDS MKTAG('a','u','d','s') +#define ID_MIDS MKTAG('m','i','d','s') +#define ID_TXTS MKTAG('t','x','t','s') +#define ID_JUNK MKTAG('J','U','N','K') +#define ID_STRF MKTAG('s','t','r','f') +#define ID_MOVI MKTAG('m','o','v','i') +#define ID_REC MKTAG('r','e','c',' ') +#define ID_VEDT MKTAG('v','e','d','t') +#define ID_IDX1 MKTAG('i','d','x','1') +#define ID_STRD MKTAG('s','t','r','d') +#define ID_00AM MKTAG('0','0','A','M') +//#define ID_INFO MKTAG('I','N','F','O') + +// Codec tags +#define ID_RLE MKTAG('R','L','E',' ') +#define ID_CRAM MKTAG('C','R','A','M') +#define ID_MSVC MKTAG('m','s','v','c') +#define ID_WHAM MKTAG('W','H','A','M') +#define ID_CVID MKTAG('c','v','i','d') +#define ID_IV32 MKTAG('i','v','3','2') +#define ID_DUCK MKTAG('D','U','C','K') + static byte char2num(char c) { - return (c >= 48 && c <= 57) ? c - 48 : 0; + c = tolower((byte)c); + return (c >= 'a' && c <= 'f') ? c - 'a' + 10 : c - '0'; } -static byte getStreamNum(uint32 tag) { - return char2num((char)(tag >> 24)) * 16 + char2num((char)(tag >> 16)); +static byte getStreamIndex(uint32 tag) { + return char2num((tag >> 24) & 0xFF) << 4 | char2num((tag >> 16) & 0xFF); } -*/ static uint16 getStreamType(uint32 tag) { return tag & 0xffff; } -AviDecoder::AviDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType) : _mixer(mixer) { - _soundType = soundType; - - _videoCodec = NULL; +AVIDecoder::AVIDecoder(Audio::Mixer::SoundType soundType) : _soundType(soundType) { _decodedHeader = false; - _audStream = NULL; - _fileStream = NULL; - _audHandle = new Audio::SoundHandle(); - _dirtyPalette = false; - memset(_palette, 0, sizeof(_palette)); - memset(&_wvInfo, 0, sizeof(PCMWAVEFORMAT)); - memset(&_bmInfo, 0, sizeof(BITMAPINFOHEADER)); - memset(&_vidsHeader, 0, sizeof(AVIStreamHeader)); - memset(&_audsHeader, 0, sizeof(AVIStreamHeader)); - memset(&_ixInfo, 0, sizeof(AVIOLDINDEX)); + _fileStream = 0; + memset(&_ixInfo, 0, sizeof(_ixInfo)); + memset(&_header, 0, sizeof(_header)); } -AviDecoder::~AviDecoder() { +AVIDecoder::~AVIDecoder() { close(); - delete _audHandle; } -void AviDecoder::runHandle(uint32 tag) { - assert (_fileStream); +void AVIDecoder::runHandle(uint32 tag) { + assert(_fileStream); if (_fileStream->eos()) return; - debug (3, "Decoding tag %s", tag2str(tag)); + debug(3, "Decoding tag %s", tag2str(tag)); switch (tag) { - case ID_RIFF: - /*_filesize = */_fileStream->readUint32LE(); - if (_fileStream->readUint32BE() != ID_AVI) - error("RIFF file is not an AVI video"); - break; - case ID_LIST: - handleList(); - break; - case ID_AVIH: - _header.size = _fileStream->readUint32LE(); - _header.microSecondsPerFrame = _fileStream->readUint32LE(); - _header.maxBytesPerSecond = _fileStream->readUint32LE(); - _header.padding = _fileStream->readUint32LE(); - _header.flags = _fileStream->readUint32LE(); - _header.totalFrames = _fileStream->readUint32LE(); - _header.initialFrames = _fileStream->readUint32LE(); - _header.streams = _fileStream->readUint32LE(); - _header.bufferSize = _fileStream->readUint32LE(); - _header.width = _fileStream->readUint32LE(); - _header.height = _fileStream->readUint32LE(); - //Ignore 16 bytes of reserved data - _fileStream->skip(16); - break; - case ID_STRH: - handleStreamHeader(); - break; - case ID_STRD: // Extra stream info, safe to ignore - case ID_VEDT: // Unknown, safe to ignore - case ID_JUNK: // Alignment bytes, should be ignored - { - uint32 junkSize = _fileStream->readUint32LE(); - _fileStream->skip(junkSize + (junkSize & 1)); // Alignment - } break; - case ID_IDX1: - _ixInfo.size = _fileStream->readUint32LE(); - _ixInfo.indices = new AVIOLDINDEX::Index[_ixInfo.size / 16]; - debug (0, "%d Indices", (_ixInfo.size / 16)); - for (uint32 i = 0; i < (_ixInfo.size / 16); i++) { - _ixInfo.indices[i].id = _fileStream->readUint32BE(); - _ixInfo.indices[i].flags = _fileStream->readUint32LE(); - _ixInfo.indices[i].offset = _fileStream->readUint32LE(); - _ixInfo.indices[i].size = _fileStream->readUint32LE(); - debug (0, "Index %d == Tag \'%s\', Offset = %d, Size = %d", i, tag2str(_ixInfo.indices[i].id), _ixInfo.indices[i].offset, _ixInfo.indices[i].size); - } - break; - default: - error ("Unknown tag \'%s\' found", tag2str(tag)); + case ID_RIFF: + /*_filesize = */_fileStream->readUint32LE(); + if (_fileStream->readUint32BE() != ID_AVI) + error("RIFF file is not an AVI video"); + break; + case ID_LIST: + handleList(); + break; + case ID_AVIH: + _header.size = _fileStream->readUint32LE(); + _header.microSecondsPerFrame = _fileStream->readUint32LE(); + _header.maxBytesPerSecond = _fileStream->readUint32LE(); + _header.padding = _fileStream->readUint32LE(); + _header.flags = _fileStream->readUint32LE(); + _header.totalFrames = _fileStream->readUint32LE(); + _header.initialFrames = _fileStream->readUint32LE(); + _header.streams = _fileStream->readUint32LE(); + _header.bufferSize = _fileStream->readUint32LE(); + _header.width = _fileStream->readUint32LE(); + _header.height = _fileStream->readUint32LE(); + // Ignore 16 bytes of reserved data + _fileStream->skip(16); + break; + case ID_STRH: + handleStreamHeader(); + break; + case ID_STRD: // Extra stream info, safe to ignore + case ID_VEDT: // Unknown, safe to ignore + case ID_JUNK: // Alignment bytes, should be ignored + { + uint32 junkSize = _fileStream->readUint32LE(); + _fileStream->skip(junkSize + (junkSize & 1)); // Alignment + } break; + case ID_IDX1: + _ixInfo.size = _fileStream->readUint32LE(); + _ixInfo.indices = new OldIndex::Index[_ixInfo.size / 16]; + debug(0, "%d Indices", (_ixInfo.size / 16)); + for (uint32 i = 0; i < (_ixInfo.size / 16); i++) { + _ixInfo.indices[i].id = _fileStream->readUint32BE(); + _ixInfo.indices[i].flags = _fileStream->readUint32LE(); + _ixInfo.indices[i].offset = _fileStream->readUint32LE(); + _ixInfo.indices[i].size = _fileStream->readUint32LE(); + debug(0, "Index %d == Tag \'%s\', Offset = %d, Size = %d", i, tag2str(_ixInfo.indices[i].id), _ixInfo.indices[i].offset, _ixInfo.indices[i].size); + } + break; + default: + error("Unknown tag \'%s\' found", tag2str(tag)); } } -void AviDecoder::handleList() { +void AVIDecoder::handleList() { uint32 listSize = _fileStream->readUint32LE() - 4; // Subtract away listType's 4 bytes uint32 listType = _fileStream->readUint32BE(); uint32 curPos = _fileStream->pos(); - debug (0, "Found LIST of type %s", tag2str(listType)); + debug(0, "Found LIST of type %s", tag2str(listType)); while ((_fileStream->pos() - curPos) < listSize) runHandle(_fileStream->readUint32BE()); @@ -151,12 +173,14 @@ void AviDecoder::handleList() { _decodedHeader = true; } -void AviDecoder::handleStreamHeader() { +void AVIDecoder::handleStreamHeader() { AVIStreamHeader sHeader; sHeader.size = _fileStream->readUint32LE(); sHeader.streamType = _fileStream->readUint32BE(); + if (sHeader.streamType == ID_MIDS || sHeader.streamType == ID_TXTS) - error ("Unhandled MIDI/Text stream"); + error("Unhandled MIDI/Text stream"); + sHeader.streamHandler = _fileStream->readUint32BE(); sHeader.flags = _fileStream->readUint32LE(); sHeader.priority = _fileStream->readUint16LE(); @@ -174,63 +198,67 @@ void AviDecoder::handleStreamHeader() { if (_fileStream->readUint32BE() != ID_STRF) error("Could not find STRF tag"); + uint32 strfSize = _fileStream->readUint32LE(); uint32 startPos = _fileStream->pos(); if (sHeader.streamType == ID_VIDS) { - _vidsHeader = sHeader; - - _bmInfo.size = _fileStream->readUint32LE(); - _bmInfo.width = _fileStream->readUint32LE(); - assert (_header.width == _bmInfo.width); - _bmInfo.height = _fileStream->readUint32LE(); - assert (_header.height == _bmInfo.height); - _bmInfo.planes = _fileStream->readUint16LE(); - _bmInfo.bitCount = _fileStream->readUint16LE(); - _bmInfo.compression = _fileStream->readUint32BE(); - _bmInfo.sizeImage = _fileStream->readUint32LE(); - _bmInfo.xPelsPerMeter = _fileStream->readUint32LE(); - _bmInfo.yPelsPerMeter = _fileStream->readUint32LE(); - _bmInfo.clrUsed = _fileStream->readUint32LE(); - _bmInfo.clrImportant = _fileStream->readUint32LE(); - - if (_bmInfo.bitCount == 8) { - if (_bmInfo.clrUsed == 0) - _bmInfo.clrUsed = 256; - - for (uint32 i = 0; i < _bmInfo.clrUsed; i++) { - _palette[i * 3 + 2] = _fileStream->readByte(); - _palette[i * 3 + 1] = _fileStream->readByte(); - _palette[i * 3] = _fileStream->readByte(); + BitmapInfoHeader bmInfo; + bmInfo.size = _fileStream->readUint32LE(); + bmInfo.width = _fileStream->readUint32LE(); + bmInfo.height = _fileStream->readUint32LE(); + bmInfo.planes = _fileStream->readUint16LE(); + bmInfo.bitCount = _fileStream->readUint16LE(); + bmInfo.compression = _fileStream->readUint32BE(); + bmInfo.sizeImage = _fileStream->readUint32LE(); + bmInfo.xPelsPerMeter = _fileStream->readUint32LE(); + bmInfo.yPelsPerMeter = _fileStream->readUint32LE(); + bmInfo.clrUsed = _fileStream->readUint32LE(); + bmInfo.clrImportant = _fileStream->readUint32LE(); + + if (bmInfo.clrUsed == 0) + bmInfo.clrUsed = 256; + + if (sHeader.streamHandler == 0) + sHeader.streamHandler = bmInfo.compression; + + AVIVideoTrack *track = new AVIVideoTrack(_header.totalFrames, sHeader, bmInfo); + + if (bmInfo.bitCount == 8) { + byte *palette = const_cast(track->getPalette()); + for (uint32 i = 0; i < bmInfo.clrUsed; i++) { + palette[i * 3 + 2] = _fileStream->readByte(); + palette[i * 3 + 1] = _fileStream->readByte(); + palette[i * 3] = _fileStream->readByte(); _fileStream->readByte(); } - _dirtyPalette = true; + track->markPaletteDirty(); } - if (!_vidsHeader.streamHandler) - _vidsHeader.streamHandler = _bmInfo.compression; + addTrack(track); } else if (sHeader.streamType == ID_AUDS) { - _audsHeader = sHeader; - - _wvInfo.tag = _fileStream->readUint16LE(); - _wvInfo.channels = _fileStream->readUint16LE(); - _wvInfo.samplesPerSec = _fileStream->readUint32LE(); - _wvInfo.avgBytesPerSec = _fileStream->readUint32LE(); - _wvInfo.blockAlign = _fileStream->readUint16LE(); - _wvInfo.size = _fileStream->readUint16LE(); + PCMWaveFormat wvInfo; + wvInfo.tag = _fileStream->readUint16LE(); + wvInfo.channels = _fileStream->readUint16LE(); + wvInfo.samplesPerSec = _fileStream->readUint32LE(); + wvInfo.avgBytesPerSec = _fileStream->readUint32LE(); + wvInfo.blockAlign = _fileStream->readUint16LE(); + wvInfo.size = _fileStream->readUint16LE(); // AVI seems to treat the sampleSize as including the second // channel as well, so divide for our sake. - if (_wvInfo.channels == 2) - _audsHeader.sampleSize /= 2; + if (wvInfo.channels == 2) + sHeader.sampleSize /= 2; + + addTrack(new AVIAudioTrack(sHeader, wvInfo, _soundType)); } // Ensure that we're at the end of the chunk _fileStream->seek(startPos + strfSize); } -bool AviDecoder::loadStream(Common::SeekableReadStream *stream) { +bool AVIDecoder::loadStream(Common::SeekableReadStream *stream) { close(); _fileStream = stream; @@ -252,74 +280,31 @@ bool AviDecoder::loadStream(Common::SeekableReadStream *stream) { if (nextTag == ID_LIST) { _fileStream->readUint32BE(); // Skip size if (_fileStream->readUint32BE() != ID_MOVI) - error ("Expected 'movi' LIST"); - } else - error ("Expected 'movi' LIST"); - - // Now, create the codec - _videoCodec = createCodec(); - - // Initialize the video stuff too - _audStream = createAudioStream(); - if (_audStream) - _mixer->playStream(_soundType, _audHandle, _audStream, -1, getVolume(), getBalance()); - - debug (0, "Frames = %d, Dimensions = %d x %d", _header.totalFrames, _header.width, _header.height); - debug (0, "Frame Rate = %d", _vidsHeader.rate / _vidsHeader.scale); - if (_wvInfo.samplesPerSec != 0) - debug (0, "Sound Rate = %d", _wvInfo.samplesPerSec); - debug (0, "Video Codec = \'%s\'", tag2str(_vidsHeader.streamHandler)); - - if (!_videoCodec) - return false; + error("Expected 'movi' LIST"); + } else { + error("Expected 'movi' LIST"); + } return true; } -void AviDecoder::close() { - if (!_fileStream) - return; +void AVIDecoder::close() { + AdvancedVideoDecoder::close(); delete _fileStream; _fileStream = 0; - - // Deinitialize sound - _mixer->stopHandle(*_audHandle); - _audStream = 0; - _decodedHeader = false; - delete _videoCodec; - _videoCodec = 0; - delete[] _ixInfo.indices; - _ixInfo.indices = 0; - - memset(_palette, 0, sizeof(_palette)); - memset(&_wvInfo, 0, sizeof(PCMWAVEFORMAT)); - memset(&_bmInfo, 0, sizeof(BITMAPINFOHEADER)); - memset(&_vidsHeader, 0, sizeof(AVIStreamHeader)); - memset(&_audsHeader, 0, sizeof(AVIStreamHeader)); - memset(&_ixInfo, 0, sizeof(AVIOLDINDEX)); - - reset(); -} - -uint32 AviDecoder::getTime() const { - if (_audStream) - return _mixer->getSoundElapsedTime(*_audHandle); - - return FixedRateVideoDecoder::getTime(); + memset(&_ixInfo, 0, sizeof(_ixInfo)); + memset(&_header, 0, sizeof(_header)); } -const Graphics::Surface *AviDecoder::decodeNextFrame() { +void AVIDecoder::readNextPacket() { uint32 nextTag = _fileStream->readUint32BE(); if (_fileStream->eos()) - return NULL; - - if (_curFrame == -1) - _startTime = g_system->getMillis(); + return; if (nextTag == ID_LIST) { // A list of audio/video chunks @@ -327,138 +312,159 @@ const Graphics::Surface *AviDecoder::decodeNextFrame() { int32 startPos = _fileStream->pos(); if (_fileStream->readUint32BE() != ID_REC) - error ("Expected 'rec ' LIST"); - - // Decode chunks in the list and see if we get a frame - const Graphics::Surface *frame = NULL; - while (_fileStream->pos() < startPos + (int32)listSize) { - const Graphics::Surface *temp = decodeNextFrame(); - if (temp) - frame = temp; - } + error("Expected 'rec ' LIST"); - return frame; - } else if (getStreamType(nextTag) == 'wb') { - // Audio Chunk - uint32 chunkSize = _fileStream->readUint32LE(); - queueAudioBuffer(chunkSize); - _fileStream->skip(chunkSize & 1); // Alignment - } else if (getStreamType(nextTag) == 'dc' || getStreamType(nextTag) == 'id' || - getStreamType(nextTag) == 'AM' || getStreamType(nextTag) == '32' || - getStreamType(nextTag) == 'iv') { - // Compressed Frame - _curFrame++; - uint32 chunkSize = _fileStream->readUint32LE(); - - if (chunkSize == 0) // Keep last frame on screen - return NULL; - - Common::SeekableReadStream *frameData = _fileStream->readStream(chunkSize); - const Graphics::Surface *surface = _videoCodec->decodeImage(frameData); - delete frameData; - _fileStream->skip(chunkSize & 1); // Alignment - return surface; - } else if (getStreamType(nextTag) == 'pc') { - // Palette Change - _fileStream->readUint32LE(); // Chunk size, not needed here - byte firstEntry = _fileStream->readByte(); - uint16 numEntries = _fileStream->readByte(); - _fileStream->readUint16LE(); // Reserved - - // 0 entries means all colors are going to be changed - if (numEntries == 0) - numEntries = 256; - - for (uint16 i = firstEntry; i < numEntries + firstEntry; i++) { - _palette[i * 3] = _fileStream->readByte(); - _palette[i * 3 + 1] = _fileStream->readByte(); - _palette[i * 3 + 2] = _fileStream->readByte(); - _fileStream->readByte(); // Flags that don't serve us any purpose - } + // Decode chunks in the list + while (_fileStream->pos() < startPos + (int32)listSize) + readNextPacket(); - _dirtyPalette = true; + return; + } else if (nextTag == ID_JUNK || nextTag == ID_IDX1) { + runHandle(nextTag); + return; + } - // No alignment necessary. It's always even. - } else if (nextTag == ID_JUNK) { - runHandle(ID_JUNK); - } else if (nextTag == ID_IDX1) { - runHandle(ID_IDX1); - } else - error("Tag = \'%s\', %d", tag2str(nextTag), _fileStream->pos()); + Track *track = getTrack(getStreamIndex(nextTag)); - return NULL; -} + if (!track) + error("Cannot get track from tag '%s'", tag2str(nextTag)); -Codec *AviDecoder::createCodec() { - switch (_vidsHeader.streamHandler) { - case ID_CRAM: - case ID_MSVC: - case ID_WHAM: - return new MSVideo1Decoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount); - case ID_RLE: - return new MSRLEDecoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount); - case ID_CVID: - return new CinepakDecoder(_bmInfo.bitCount); - case ID_IV32: - return new Indeo3Decoder(_bmInfo.width, _bmInfo.height); -#ifdef VIDEO_CODECS_TRUEMOTION1_H - case ID_DUCK: - return new TrueMotion1Decoder(_bmInfo.width, _bmInfo.height); -#endif - default: - warning ("Unknown/Unhandled compression format \'%s\'", tag2str(_vidsHeader.streamHandler)); + uint32 chunkSize = _fileStream->readUint32LE(); + Common::SeekableReadStream *chunk = _fileStream->readStream(chunkSize); + _fileStream->skip(chunkSize & 1); + + if (track->getTrackType() == Track::kTrackTypeAudio) { + if (getStreamType(nextTag) != 'wb') + error("Invalid audio track tag '%s'", tag2str(nextTag)); + + ((AVIAudioTrack *)track)->queueSound(chunk); + } else { + AVIVideoTrack *videoTrack = (AVIVideoTrack *)track; + + if (getStreamType(nextTag) == 'pc') { + // Palette Change + byte firstEntry = chunk->readByte(); + uint16 numEntries = chunk->readByte(); + chunk->readUint16LE(); // Reserved + + // 0 entries means all colors are going to be changed + if (numEntries == 0) + numEntries = 256; + + byte *palette = const_cast(videoTrack->getPalette()); + + for (uint16 i = firstEntry; i < numEntries + firstEntry; i++) { + palette[i * 3] = chunk->readByte(); + palette[i * 3 + 1] = chunk->readByte(); + palette[i * 3 + 2] = chunk->readByte(); + chunk->readByte(); // Flags that don't serve us any purpose + } + + delete chunk; + videoTrack->markPaletteDirty(); + } else if (getStreamType(nextTag) == 'db') { + // TODO: Check if this really is uncompressed. Many videos + // falsely put compressed data in here. + error("Uncompressed AVI frame found"); + } else { + // Otherwise, assume it's a compressed frame + videoTrack->decodeFrame(chunk); + } } +} - return NULL; +AVIDecoder::AVIVideoTrack::AVIVideoTrack(int frameCount, const AVIStreamHeader &streamHeader, const BitmapInfoHeader &bitmapInfoHeader) + : _frameCount(frameCount), _vidsHeader(streamHeader), _bmInfo(bitmapInfoHeader) { + memset(_palette, 0, sizeof(_palette)); + _videoCodec = createCodec(); + _dirtyPalette = false; + _lastFrame = 0; + _curFrame = -1; } -Graphics::PixelFormat AviDecoder::getPixelFormat() const { - assert(_videoCodec); - return _videoCodec->getPixelFormat(); +AVIDecoder::AVIVideoTrack::~AVIVideoTrack() { + delete _videoCodec; } -Audio::QueuingAudioStream *AviDecoder::createAudioStream() { - if (_wvInfo.tag == kWaveFormatPCM || _wvInfo.tag == kWaveFormatDK3) - return Audio::makeQueuingAudioStream(_wvInfo.samplesPerSec, _wvInfo.channels == 2); - else if (_wvInfo.tag != kWaveFormatNone) // No sound - warning("Unsupported AVI audio format %d", _wvInfo.tag); +void AVIDecoder::AVIVideoTrack::decodeFrame(Common::SeekableReadStream *stream) { + if (_videoCodec) + _lastFrame = _videoCodec->decodeImage(stream); - return NULL; + delete stream; + _curFrame++; } -void AviDecoder::queueAudioBuffer(uint32 chunkSize) { - // Return if we haven't created the queue (unsupported audio format) - if (!_audStream) { - _fileStream->skip(chunkSize); - return; +Graphics::PixelFormat AVIDecoder::AVIVideoTrack::getPixelFormat() const { + if (_videoCodec) + return _videoCodec->getPixelFormat(); + + return Graphics::PixelFormat(); +} + +Codec *AVIDecoder::AVIVideoTrack::createCodec() { + switch (_vidsHeader.streamHandler) { + case ID_CRAM: + case ID_MSVC: + case ID_WHAM: + return new MSVideo1Decoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount); + case ID_RLE: + return new MSRLEDecoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount); + case ID_CVID: + return new CinepakDecoder(_bmInfo.bitCount); + case ID_IV32: + return new Indeo3Decoder(_bmInfo.width, _bmInfo.height); +#ifdef VIDEO_CODECS_TRUEMOTION1_H + case ID_DUCK: + return new TrueMotion1Decoder(_bmInfo.width, _bmInfo.height); +#endif + default: + warning("Unknown/Unhandled compression format \'%s\'", tag2str(_vidsHeader.streamHandler)); } - Common::SeekableReadStream *stream = _fileStream->readStream(chunkSize); + return 0; +} - if (_wvInfo.tag == kWaveFormatPCM) { - byte flags = 0; - if (_audsHeader.sampleSize == 2) - flags |= Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN; - else - flags |= Audio::FLAG_UNSIGNED; +AVIDecoder::AVIAudioTrack::AVIAudioTrack(const AVIStreamHeader &streamHeader, const PCMWaveFormat &waveFormat, Audio::Mixer::SoundType soundType) + : _audsHeader(streamHeader), _wvInfo(waveFormat), _soundType(soundType) { + _audStream = createAudioStream(); +} - if (_wvInfo.channels == 2) - flags |= Audio::FLAG_STEREO; +AVIDecoder::AVIAudioTrack::~AVIAudioTrack() { + delete _audStream; +} - _audStream->queueAudioStream(Audio::makeRawStream(stream, _wvInfo.samplesPerSec, flags, DisposeAfterUse::YES), DisposeAfterUse::YES); - } else if (_wvInfo.tag == kWaveFormatDK3) { - _audStream->queueAudioStream(Audio::makeADPCMStream(stream, DisposeAfterUse::YES, chunkSize, Audio::kADPCMDK3, _wvInfo.samplesPerSec, _wvInfo.channels, _wvInfo.blockAlign), DisposeAfterUse::YES); +void AVIDecoder::AVIAudioTrack::queueSound(Common::SeekableReadStream *stream) { + if (_audStream) { + if (_wvInfo.tag == kWaveFormatPCM) { + byte flags = 0; + if (_audsHeader.sampleSize == 2) + flags |= Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN; + else + flags |= Audio::FLAG_UNSIGNED; + + if (_wvInfo.channels == 2) + flags |= Audio::FLAG_STEREO; + + _audStream->queueAudioStream(Audio::makeRawStream(stream, _wvInfo.samplesPerSec, flags, DisposeAfterUse::YES), DisposeAfterUse::YES); + } else if (_wvInfo.tag == kWaveFormatDK3) { + _audStream->queueAudioStream(Audio::makeADPCMStream(stream, DisposeAfterUse::YES, stream->size(), Audio::kADPCMDK3, _wvInfo.samplesPerSec, _wvInfo.channels, _wvInfo.blockAlign), DisposeAfterUse::YES); + } + } else { + delete stream; } } -void AviDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(*_audHandle)) - g_system->getMixer()->setChannelVolume(*_audHandle, getVolume()); +Audio::AudioStream *AVIDecoder::AVIAudioTrack::getAudioStream() const { + return _audStream; } -void AviDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(*_audHandle)) - g_system->getMixer()->setChannelBalance(*_audHandle, getBalance()); +Audio::QueuingAudioStream *AVIDecoder::AVIAudioTrack::createAudioStream() { + if (_wvInfo.tag == kWaveFormatPCM || _wvInfo.tag == kWaveFormatDK3) + return Audio::makeQueuingAudioStream(_wvInfo.samplesPerSec, _wvInfo.channels == 2); + else if (_wvInfo.tag != kWaveFormatNone) // No sound + warning("Unsupported AVI audio format %d", _wvInfo.tag); + + return 0; } } // End of namespace Video diff --git a/video/avi_decoder.h b/video/avi_decoder.h index fb4dae6711..010702cce3 100644 --- a/video/avi_decoder.h +++ b/video/avi_decoder.h @@ -47,196 +47,183 @@ namespace Video { class Codec; -#define UNKNOWN_HEADER(a) error("Unknown header found -- \'%s\'", tag2str(a)) - -// IDs used throughout the AVI files -// that will be handled by this player -#define ID_RIFF MKTAG('R','I','F','F') -#define ID_AVI MKTAG('A','V','I',' ') -#define ID_LIST MKTAG('L','I','S','T') -#define ID_HDRL MKTAG('h','d','r','l') -#define ID_AVIH MKTAG('a','v','i','h') -#define ID_STRL MKTAG('s','t','r','l') -#define ID_STRH MKTAG('s','t','r','h') -#define ID_VIDS MKTAG('v','i','d','s') -#define ID_AUDS MKTAG('a','u','d','s') -#define ID_MIDS MKTAG('m','i','d','s') -#define ID_TXTS MKTAG('t','x','t','s') -#define ID_JUNK MKTAG('J','U','N','K') -#define ID_STRF MKTAG('s','t','r','f') -#define ID_MOVI MKTAG('m','o','v','i') -#define ID_REC MKTAG('r','e','c',' ') -#define ID_VEDT MKTAG('v','e','d','t') -#define ID_IDX1 MKTAG('i','d','x','1') -#define ID_STRD MKTAG('s','t','r','d') -#define ID_00AM MKTAG('0','0','A','M') -//#define ID_INFO MKTAG('I','N','F','O') - -// Codec tags -#define ID_RLE MKTAG('R','L','E',' ') -#define ID_CRAM MKTAG('C','R','A','M') -#define ID_MSVC MKTAG('m','s','v','c') -#define ID_WHAM MKTAG('W','H','A','M') -#define ID_CVID MKTAG('c','v','i','d') -#define ID_IV32 MKTAG('i','v','3','2') -#define ID_DUCK MKTAG('D','U','C','K') - -struct BITMAPINFOHEADER { - uint32 size; - uint32 width; - uint32 height; - uint16 planes; - uint16 bitCount; - uint32 compression; - uint32 sizeImage; - uint32 xPelsPerMeter; - uint32 yPelsPerMeter; - uint32 clrUsed; - uint32 clrImportant; -}; - -struct WAVEFORMAT { - uint16 tag; - uint16 channels; - uint32 samplesPerSec; - uint32 avgBytesPerSec; - uint16 blockAlign; -}; - -struct PCMWAVEFORMAT : public WAVEFORMAT { - uint16 size; -}; - -struct WAVEFORMATEX : public WAVEFORMAT { - uint16 bitsPerSample; - uint16 size; -}; - -struct AVIOLDINDEX { - uint32 size; - struct Index { - uint32 id; - uint32 flags; - uint32 offset; - uint32 size; - } *indices; -}; - -// Index Flags -enum IndexFlags { - AVIIF_INDEX = 0x10 -}; - -// Audio Codecs -enum { - kWaveFormatNone = 0, - kWaveFormatPCM = 1, - kWaveFormatDK3 = 98 -}; - -struct AVIHeader { - uint32 size; - uint32 microSecondsPerFrame; - uint32 maxBytesPerSecond; - uint32 padding; - uint32 flags; - uint32 totalFrames; - uint32 initialFrames; - uint32 streams; - uint32 bufferSize; - uint32 width; - uint32 height; -}; - -// Flags from the AVIHeader -enum AviFlags { - AVIF_HASINDEX = 0x00000010, - AVIF_MUSTUSEINDEX = 0x00000020, - AVIF_ISINTERLEAVED = 0x00000100, - AVIF_TRUSTCKTYPE = 0x00000800, - AVIF_WASCAPTUREFILE = 0x00010000, - AVIF_WASCOPYRIGHTED = 0x00020000 -}; - -struct AVIStreamHeader { - uint32 size; - uint32 streamType; - uint32 streamHandler; - uint32 flags; - uint16 priority; - uint16 language; - uint32 initialFrames; - uint32 scale; - uint32 rate; - uint32 start; - uint32 length; - uint32 bufferSize; - uint32 quality; - uint32 sampleSize; - Common::Rect frame; -}; - /** * Decoder for AVI videos. * * Video decoder used in engines: * - sci */ -class AviDecoder : public FixedRateVideoDecoder { +class AVIDecoder : public AdvancedVideoDecoder { public: - AviDecoder(Audio::Mixer *mixer, - Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); - virtual ~AviDecoder(); + AVIDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); + virtual ~AVIDecoder(); bool loadStream(Common::SeekableReadStream *stream); void close(); - - bool isVideoLoaded() const { return _fileStream != 0; } uint16 getWidth() const { return _header.width; } uint16 getHeight() const { return _header.height; } - uint32 getFrameCount() const { return _header.totalFrames; } - uint32 getTime() const; - const Graphics::Surface *decodeNextFrame(); - Graphics::PixelFormat getPixelFormat() const; - const byte *getPalette() { _dirtyPalette = false; return _palette; } - bool hasDirtyPalette() const { return _dirtyPalette; } protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); - - // FixedRateVideoDecoder API - Common::Rational getFrameRate() const { return Common::Rational(_vidsHeader.rate, _vidsHeader.scale); } + void readNextPacket(); private: - Audio::Mixer *_mixer; - BITMAPINFOHEADER _bmInfo; - PCMWAVEFORMAT _wvInfo; - AVIOLDINDEX _ixInfo; - AVIHeader _header; - AVIStreamHeader _vidsHeader; - AVIStreamHeader _audsHeader; - byte _palette[3 * 256]; - bool _dirtyPalette; + struct BitmapInfoHeader { + uint32 size; + uint32 width; + uint32 height; + uint16 planes; + uint16 bitCount; + uint32 compression; + uint32 sizeImage; + uint32 xPelsPerMeter; + uint32 yPelsPerMeter; + uint32 clrUsed; + uint32 clrImportant; + }; + + struct WaveFormat { + uint16 tag; + uint16 channels; + uint32 samplesPerSec; + uint32 avgBytesPerSec; + uint16 blockAlign; + }; + + struct PCMWaveFormat : public WaveFormat { + uint16 size; + }; + + struct WaveFormatEX : public WaveFormat { + uint16 bitsPerSample; + uint16 size; + }; + + struct OldIndex { + uint32 size; + struct Index { + uint32 id; + uint32 flags; + uint32 offset; + uint32 size; + } *indices; + }; + + // Index Flags + enum IndexFlags { + AVIIF_INDEX = 0x10 + }; + + struct AVIHeader { + uint32 size; + uint32 microSecondsPerFrame; + uint32 maxBytesPerSecond; + uint32 padding; + uint32 flags; + uint32 totalFrames; + uint32 initialFrames; + uint32 streams; + uint32 bufferSize; + uint32 width; + uint32 height; + }; + + // Flags from the AVIHeader + enum AVIFlags { + AVIF_HASINDEX = 0x00000010, + AVIF_MUSTUSEINDEX = 0x00000020, + AVIF_ISINTERLEAVED = 0x00000100, + AVIF_TRUSTCKTYPE = 0x00000800, + AVIF_WASCAPTUREFILE = 0x00010000, + AVIF_WASCOPYRIGHTED = 0x00020000 + }; + + struct AVIStreamHeader { + uint32 size; + uint32 streamType; + uint32 streamHandler; + uint32 flags; + uint16 priority; + uint16 language; + uint32 initialFrames; + uint32 scale; + uint32 rate; + uint32 start; + uint32 length; + uint32 bufferSize; + uint32 quality; + uint32 sampleSize; + Common::Rect frame; + }; + + class AVIVideoTrack : public FixedRateVideoTrack { + public: + AVIVideoTrack(int frameCount, const AVIStreamHeader &streamHeader, const BitmapInfoHeader &bitmapInfoHeader); + ~AVIVideoTrack(); + + void decodeFrame(Common::SeekableReadStream *stream); + + uint16 getWidth() const { return _bmInfo.width; } + uint16 getHeight() const { return _bmInfo.height; } + Graphics::PixelFormat getPixelFormat() const; + int getCurFrame() const { return _curFrame; } + int getFrameCount() const { return _frameCount; } + const Graphics::Surface *decodeNextFrame() { return _lastFrame; } + const byte *getPalette() const { _dirtyPalette = false; return _palette; } + bool hasDirtyPalette() const { return _dirtyPalette; } + void markPaletteDirty() { _dirtyPalette = true; } + + protected: + Common::Rational getFrameRate() const { return Common::Rational(_vidsHeader.rate, _vidsHeader.scale); } + + private: + AVIStreamHeader _vidsHeader; + BitmapInfoHeader _bmInfo; + byte _palette[3 * 256]; + mutable bool _dirtyPalette; + int _frameCount, _curFrame; + + Codec *_videoCodec; + const Graphics::Surface *_lastFrame; + Codec *createCodec(); + }; + + class AVIAudioTrack : public AudioTrack { + public: + AVIAudioTrack(const AVIStreamHeader &streamHeader, const PCMWaveFormat &waveFormat, Audio::Mixer::SoundType soundType); + ~AVIAudioTrack(); + + void queueSound(Common::SeekableReadStream *stream); + Audio::Mixer::SoundType getSoundType() const { return _soundType; } + + protected: + Audio::AudioStream *getAudioStream() const; + + private: + // Audio Codecs + enum { + kWaveFormatNone = 0, + kWaveFormatPCM = 1, + kWaveFormatDK3 = 98 + }; + + AVIStreamHeader _audsHeader; + PCMWaveFormat _wvInfo; + Audio::Mixer::SoundType _soundType; + Audio::QueuingAudioStream *_audStream; + Audio::QueuingAudioStream *createAudioStream(); + }; + + OldIndex _ixInfo; + AVIHeader _header; Common::SeekableReadStream *_fileStream; bool _decodedHeader; - Codec *_videoCodec; - Codec *createCodec(); - Audio::Mixer::SoundType _soundType; void runHandle(uint32 tag); void handleList(); void handleStreamHeader(); - void handlePalChange(); - - Audio::SoundHandle *_audHandle; - Audio::QueuingAudioStream *_audStream; - Audio::QueuingAudioStream *createAudioStream(); - void queueAudioBuffer(uint32 chunkSize); }; } // End of namespace Video -- cgit v1.2.3 From 8ac70ac94a6ecfcbb74c65aac730fa707ab6fa6e Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sun, 22 Jul 2012 21:15:49 +0100 Subject: TEENAGENT: Fix another invalid string offset. This typo caused an incorrect string output when Mark examines the car trunk when it is empty. --- engines/teenagent/callbacks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/teenagent/callbacks.cpp b/engines/teenagent/callbacks.cpp index b0ccb8844d..46d9b7d2f9 100644 --- a/engines/teenagent/callbacks.cpp +++ b/engines/teenagent/callbacks.cpp @@ -2265,7 +2265,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { case 0x78f5: if (CHECK_FLAG(0xDB95, 1)) { - displayMessage(0x3575); + displayMessage(0x3E75); return true; } else return false; -- cgit v1.2.3 From d4231fda1cb2399e123054ddaaeca2b4c2749966 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 22 Jul 2012 23:17:36 -0400 Subject: SCI: Rewrite RobotDecoder to use the AdvancedVideoDecoder API --- engines/sci/console.cpp | 8 +- engines/sci/engine/kvideo.cpp | 9 +- engines/sci/sci.cpp | 2 +- engines/sci/video/robot_decoder.cpp | 377 +++++++++++++++++++----------------- engines/sci/video/robot_decoder.h | 129 ++++++------ 5 files changed, 282 insertions(+), 243 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index a6a6d4496f..9b5ef35e92 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -251,25 +251,25 @@ void Console::postEnter() { if (_videoFile.hasSuffix(".seq")) { videoDecoder = new SEQDecoder(_videoFrameDelay); - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); // TODO: Remove after new API is complete #ifdef ENABLE_SCI32 } else if (_videoFile.hasSuffix(".vmd")) { videoDecoder = new Video::VMDDecoder(g_system->getMixer()); } else if (_videoFile.hasSuffix(".rbt")) { - videoDecoder = new RobotDecoder(g_system->getMixer(), _engine->getPlatform() == Common::kPlatformMacintosh); + videoDecoder = new RobotDecoder(_engine->getPlatform() == Common::kPlatformMacintosh); } else if (_videoFile.hasSuffix(".duk")) { duckMode = true; videoDecoder = new Video::AVIDecoder(); - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); #endif } else if (_videoFile.hasSuffix(".avi")) { videoDecoder = new Video::AVIDecoder(); - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); } else { warning("Unrecognized video type"); } if (videoDecoder && videoDecoder->loadFile(_videoFile)) { + if (!_videoFile.hasSuffix(".vmd")) // TODO: Remove after new API is complete + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); + _engine->_gfxCursor->kernelHide(); #ifdef ENABLE_SCI32 diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index 2c1532cc46..456f860493 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -254,6 +254,7 @@ reg_t kRobot(EngineState *s, int argc, reg_t *argv) { int16 y = argv[5].toUint16(); warning("kRobot(init), id %d, obj %04x:%04x, flag %d, x=%d, y=%d", id, PRINT_REG(obj), flag, x, y); g_sci->_robotDecoder->load(id); + g_sci->_robotDecoder->start(); g_sci->_robotDecoder->setPos(x, y); } break; @@ -269,13 +270,13 @@ reg_t kRobot(EngineState *s, int argc, reg_t *argv) { warning("kRobot(%d)", subop); break; case 8: // sync - //if (false) { // debug: automatically skip all robot videos - if ((uint32)g_sci->_robotDecoder->getCurFrame() != g_sci->_robotDecoder->getFrameCount() - 1) { - writeSelector(s->_segMan, argv[1], SELECTOR(signal), NULL_REG); - } else { + //if (true) { // debug: automatically skip all robot videos + if (g_sci->_robotDecoder->endOfVideo()) { g_sci->_robotDecoder->close(); // Signal the engine scripts that the video is done writeSelector(s->_segMan, argv[1], SELECTOR(signal), SIGNAL_REG); + } else { + writeSelector(s->_segMan, argv[1], SELECTOR(signal), NULL_REG); } break; default: diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index d43a9d06fc..42ae00b525 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -632,7 +632,7 @@ void SciEngine::initGraphics() { _gfxPaint = _gfxPaint32; _gfxText32 = new GfxText32(_gamestate->_segMan, _gfxCache, _gfxScreen); _gfxControls32 = new GfxControls32(_gamestate->_segMan, _gfxCache, _gfxScreen, _gfxText32); - _robotDecoder = new RobotDecoder(g_system->getMixer(), getPlatform() == Common::kPlatformMacintosh); + _robotDecoder = new RobotDecoder(getPlatform() == Common::kPlatformMacintosh); _gfxFrameout = new GfxFrameout(_gamestate->_segMan, _resMan, _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette, _gfxPaint32); } else { #endif diff --git a/engines/sci/video/robot_decoder.cpp b/engines/sci/video/robot_decoder.cpp index ebcfac6054..6fe4c645f4 100644 --- a/engines/sci/video/robot_decoder.cpp +++ b/engines/sci/video/robot_decoder.cpp @@ -22,11 +22,13 @@ #include "common/archive.h" #include "common/stream.h" +#include "common/substream.h" #include "common/system.h" #include "common/textconsole.h" #include "common/util.h" #include "graphics/surface.h" +#include "audio/audiostream.h" #include "audio/decoders/raw.h" #include "sci/resource.h" @@ -63,57 +65,26 @@ namespace Sci { // our graphics engine, it looks just like a part of the room. A RBT can move // around the screen and go behind other objects. (...) -#ifdef ENABLE_SCI32 - -enum robotPalTypes { +enum RobotPalTypes { kRobotPalVariable = 0, kRobotPalConstant = 1 }; -RobotDecoder::RobotDecoder(Audio::Mixer *mixer, bool isBigEndian) { - _surface = 0; - _width = 0; - _height = 0; +RobotDecoder::RobotDecoder(bool isBigEndian) { _fileStream = 0; - _audioStream = 0; - _dirtyPalette = false; _pos = Common::Point(0, 0); - _mixer = mixer; _isBigEndian = isBigEndian; + _frameTotalSize = 0; } RobotDecoder::~RobotDecoder() { close(); } -bool RobotDecoder::load(GuiResourceId id) { - // TODO: RAMA's robot 1003 cannot be played (shown at the menu screen) - - // its drawn at odd coordinates. SV can't play it either (along with some - // others), so it must be some new functionality added in RAMA's robot - // videos. Skip it for now. - if (g_sci->getGameId() == GID_RAMA && id == 1003) - return false; - - // TODO: The robot video in the Lighthouse demo gets stuck - if (g_sci->getGameId() == GID_LIGHTHOUSE && id == 16) - return false; - - Common::String fileName = Common::String::format("%d.rbt", id); - Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(fileName); - - if (!stream) { - warning("Unable to open robot file %s", fileName.c_str()); - return false; - } - - return loadStream(stream); -} - bool RobotDecoder::loadStream(Common::SeekableReadStream *stream) { close(); _fileStream = new Common::SeekableSubReadStreamEndian(stream, 0, stream->size(), _isBigEndian, DisposeAfterUse::YES); - _surface = new Graphics::Surface(); readHeaderChunk(); @@ -125,131 +96,60 @@ bool RobotDecoder::loadStream(Common::SeekableReadStream *stream) { if (_header.version < 4 || _header.version > 6) error("Unknown robot version: %d", _header.version); - if (_header.hasSound) { - _audioStream = Audio::makeQueuingAudioStream(11025, false); - _mixer->playStream(Audio::Mixer::kMusicSoundType, &_audioHandle, _audioStream, -1, getVolume(), getBalance()); - } + RobotVideoTrack *videoTrack = new RobotVideoTrack(_header.frameCount); + addTrack(videoTrack); - readPaletteChunk(_header.paletteDataSize); - readFrameSizesChunk(); - calculateVideoDimensions(); - _surface->create(_width, _height, Graphics::PixelFormat::createFormatCLUT8()); + if (_header.hasSound) + addTrack(new RobotAudioTrack()); + videoTrack->readPaletteChunk(_fileStream, _header.paletteDataSize); + readFrameSizesChunk(); + videoTrack->calculateVideoDimensions(_fileStream, _frameTotalSize); return true; } -void RobotDecoder::readHeaderChunk() { - // Header (60 bytes) - _fileStream->skip(6); - _header.version = _fileStream->readUint16(); - _header.audioChunkSize = _fileStream->readUint16(); - _header.audioSilenceSize = _fileStream->readUint16(); - _fileStream->skip(2); - _header.frameCount = _fileStream->readUint16(); - _header.paletteDataSize = _fileStream->readUint16(); - _header.unkChunkDataSize = _fileStream->readUint16(); - _fileStream->skip(5); - _header.hasSound = _fileStream->readByte(); - _fileStream->skip(34); - - // Some videos (e.g. robot 1305 in Phantasmagoria and - // robot 184 in Lighthouse) have an unknown chunk before - // the palette chunk (probably used for sound preloading). - // Skip it here. - if (_header.unkChunkDataSize) - _fileStream->skip(_header.unkChunkDataSize); -} - -void RobotDecoder::readPaletteChunk(uint16 chunkSize) { - byte *paletteData = new byte[chunkSize]; - _fileStream->read(paletteData, chunkSize); - - // SCI1.1 palette - byte palFormat = paletteData[32]; - uint16 palColorStart = paletteData[25]; - uint16 palColorCount = READ_SCI11ENDIAN_UINT16(paletteData + 29); +bool RobotDecoder::load(GuiResourceId id) { + // TODO: RAMA's robot 1003 cannot be played (shown at the menu screen) - + // its drawn at odd coordinates. SV can't play it either (along with some + // others), so it must be some new functionality added in RAMA's robot + // videos. Skip it for now. + if (g_sci->getGameId() == GID_RAMA && id == 1003) + return false; + + // TODO: The robot video in the Lighthouse demo gets stuck + if (g_sci->getGameId() == GID_LIGHTHOUSE && id == 16) + return false; - int palOffset = 37; - memset(_palette, 0, 256 * 3); + Common::String fileName = Common::String::format("%d.rbt", id); + Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(fileName); - for (uint16 colorNo = palColorStart; colorNo < palColorStart + palColorCount; colorNo++) { - if (palFormat == kRobotPalVariable) - palOffset++; - _palette[colorNo * 3 + 0] = paletteData[palOffset++]; - _palette[colorNo * 3 + 1] = paletteData[palOffset++]; - _palette[colorNo * 3 + 2] = paletteData[palOffset++]; + if (!stream) { + warning("Unable to open robot file %s", fileName.c_str()); + return false; } - _dirtyPalette = true; - delete[] paletteData; + return loadStream(stream); } +void RobotDecoder::close() { + AdvancedVideoDecoder::close(); -void RobotDecoder::readFrameSizesChunk() { - // The robot video file contains 2 tables, with one entry for each frame: - // - A table containing the size of the image in each video frame - // - A table containing the total size of each video frame. - // In v5 robots, the tables contain 16-bit integers, whereas in v6 robots, - // they contain 32-bit integers. - - _frameTotalSize = new uint32[_header.frameCount]; - - // TODO: The table reading code can probably be removed once the - // audio chunk size is figured out (check the TODO inside processNextFrame()) -#if 0 - // We don't need any of the two tables to play the video, so we ignore - // both of them. - uint16 wordSize = _header.version == 6 ? 4 : 2; - _fileStream->skip(_header.frameCount * wordSize * 2); -#else - switch (_header.version) { - case 4: - case 5: // sizes are 16-bit integers - // Skip table with frame image sizes, as we don't need it - _fileStream->skip(_header.frameCount * 2); - for (int i = 0; i < _header.frameCount; ++i) - _frameTotalSize[i] = _fileStream->readUint16(); - break; - case 6: // sizes are 32-bit integers - // Skip table with frame image sizes, as we don't need it - _fileStream->skip(_header.frameCount * 4); - for (int i = 0; i < _header.frameCount; ++i) - _frameTotalSize[i] = _fileStream->readUint32(); - break; - default: - error("Can't yet handle index table for robot version %d", _header.version); - } -#endif - - // 2 more unknown tables - _fileStream->skip(1024 + 512); + delete _fileStream; + _fileStream = 0; - // Pad to nearest 2 kilobytes - uint32 curPos = _fileStream->pos(); - if (curPos & 0x7ff) - _fileStream->seek((curPos & ~0x7ff) + 2048); + delete[] _frameTotalSize; + _frameTotalSize = 0; } -void RobotDecoder::calculateVideoDimensions() { - // This is an O(n) operation, as each frame has a different size. - // We need to know the actual frame size to have a constant video size. - uint32 pos = _fileStream->pos(); - - for (uint32 curFrame = 0; curFrame < _header.frameCount; curFrame++) { - _fileStream->skip(4); - uint16 frameWidth = _fileStream->readUint16(); - uint16 frameHeight = _fileStream->readUint16(); - if (frameWidth > _width) - _width = frameWidth; - if (frameHeight > _height) - _height = frameHeight; - _fileStream->skip(_frameTotalSize[curFrame] - 8); - } +void RobotDecoder::readNextPacket() { + // Get our track + RobotVideoTrack *videoTrack = (RobotVideoTrack *)getTrack(0); + videoTrack->increaseCurFrame(); + Graphics::Surface *surface = videoTrack->getSurface(); - _fileStream->seek(pos); -} + if (videoTrack->endOfTrack()) + return; -const Graphics::Surface *RobotDecoder::decodeNextFrame() { // Read frame image header (24 bytes) _fileStream->skip(3); byte frameScale = _fileStream->readByte(); @@ -258,23 +158,28 @@ const Graphics::Surface *RobotDecoder::decodeNextFrame() { _fileStream->skip(4); // unknown, almost always 0 uint16 frameX = _fileStream->readUint16(); uint16 frameY = _fileStream->readUint16(); + // TODO: In v4 robot files, frameX and frameY have a different meaning. // Set them both to 0 for v4 for now, so that robots in PQ:SWAT show up // correctly. if (_header.version == 4) frameX = frameY = 0; + uint16 compressedSize = _fileStream->readUint16(); uint16 frameFragments = _fileStream->readUint16(); _fileStream->skip(4); // unknown uint32 decompressedSize = frameWidth * frameHeight * frameScale / 100; + // FIXME: A frame's height + position can go off limits... why? With the // following, we cut the contents to fit the frame - uint16 scaledHeight = CLIP(decompressedSize / frameWidth, 0, _height - frameY); + uint16 scaledHeight = CLIP(decompressedSize / frameWidth, 0, surface->h - frameY); + // FIXME: Same goes for the frame's width + position. In this case, we // modify the position to fit the contents on screen. - if (frameWidth + frameX > _width) - frameX = _width - frameWidth; - assert (frameWidth + frameX <= _width && scaledHeight + frameY <= _height); + if (frameWidth + frameX > surface->w) + frameX = surface->w - frameWidth; + + assert(frameWidth + frameX <= surface->w && scaledHeight + frameY <= surface->h); DecompressorLZS lzs; byte *decompressedFrame = new byte[decompressedSize]; @@ -305,24 +210,23 @@ const Graphics::Surface *RobotDecoder::decodeNextFrame() { // Copy over the decompressed frame byte *inFrame = decompressedFrame; - byte *outFrame = (byte *)_surface->pixels; + byte *outFrame = (byte *)surface->pixels; // Black out the surface - memset(outFrame, 0, _width * _height); + memset(outFrame, 0, surface->w * surface->h); // Move to the correct y coordinate - outFrame += _width * frameY; + outFrame += surface->w * frameY; for (uint16 y = 0; y < scaledHeight; y++) { memcpy(outFrame + frameX, inFrame, frameWidth); inFrame += frameWidth; - outFrame += _width; + outFrame += surface->w; } delete[] decompressedFrame; - // +1 because we start with frame number -1 - uint32 audioChunkSize = _frameTotalSize[_curFrame + 1] - (24 + compressedSize); + uint32 audioChunkSize = _frameTotalSize[videoTrack->getCurFrame()] - (24 + compressedSize); // TODO: The audio chunk size below is usually correct, but there are some // exceptions (e.g. robot 4902 in Phantasmagoria, towards its end) @@ -337,51 +241,166 @@ const Graphics::Surface *RobotDecoder::decodeNextFrame() { // Queue the next audio frame // FIXME: For some reason, there are audio hiccups/gaps if (_header.hasSound) { - _fileStream->skip(8); // header - _audioStream->queueBuffer(g_sci->_audio->getDecodedRobotAudioFrame(_fileStream, audioChunkSize - 8), - (audioChunkSize - 8) * 2, DisposeAfterUse::NO, - Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN); + RobotAudioTrack *audioTrack = (RobotAudioTrack *)getTrack(1); + _fileStream->skip(8); // header + audioChunkSize -= 8; + audioTrack->queueBuffer(g_sci->_audio->getDecodedRobotAudioFrame(_fileStream, audioChunkSize), audioChunkSize * 2); } else { _fileStream->skip(audioChunkSize); - } - - if (_curFrame == -1) - _startTime = g_system->getMillis(); + } +} - _curFrame++; +void RobotDecoder::readHeaderChunk() { + // Header (60 bytes) + _fileStream->skip(6); + _header.version = _fileStream->readUint16(); + _header.audioChunkSize = _fileStream->readUint16(); + _header.audioSilenceSize = _fileStream->readUint16(); + _fileStream->skip(2); + _header.frameCount = _fileStream->readUint16(); + _header.paletteDataSize = _fileStream->readUint16(); + _header.unkChunkDataSize = _fileStream->readUint16(); + _fileStream->skip(5); + _header.hasSound = _fileStream->readByte(); + _fileStream->skip(34); - return _surface; + // Some videos (e.g. robot 1305 in Phantasmagoria and + // robot 184 in Lighthouse) have an unknown chunk before + // the palette chunk (probably used for sound preloading). + // Skip it here. + if (_header.unkChunkDataSize) + _fileStream->skip(_header.unkChunkDataSize); } -void RobotDecoder::close() { - if (!_fileStream) - return; +void RobotDecoder::readFrameSizesChunk() { + // The robot video file contains 2 tables, with one entry for each frame: + // - A table containing the size of the image in each video frame + // - A table containing the total size of each video frame. + // In v5 robots, the tables contain 16-bit integers, whereas in v6 robots, + // they contain 32-bit integers. - delete _fileStream; - _fileStream = 0; + _frameTotalSize = new uint32[_header.frameCount]; + // TODO: The table reading code can probably be removed once the + // audio chunk size is figured out (check the TODO inside processNextFrame()) +#if 0 + // We don't need any of the two tables to play the video, so we ignore + // both of them. + uint16 wordSize = _header.version == 6 ? 4 : 2; + _fileStream->skip(_header.frameCount * wordSize * 2); +#else + switch (_header.version) { + case 4: + case 5: // sizes are 16-bit integers + // Skip table with frame image sizes, as we don't need it + _fileStream->skip(_header.frameCount * 2); + for (int i = 0; i < _header.frameCount; ++i) + _frameTotalSize[i] = _fileStream->readUint16(); + break; + case 6: // sizes are 32-bit integers + // Skip table with frame image sizes, as we don't need it + _fileStream->skip(_header.frameCount * 4); + for (int i = 0; i < _header.frameCount; ++i) + _frameTotalSize[i] = _fileStream->readUint32(); + break; + default: + error("Can't yet handle index table for robot version %d", _header.version); + } +#endif + + // 2 more unknown tables + _fileStream->skip(1024 + 512); + + // Pad to nearest 2 kilobytes + uint32 curPos = _fileStream->pos(); + if (curPos & 0x7ff) + _fileStream->seek((curPos & ~0x7ff) + 2048); +} + +RobotDecoder::RobotVideoTrack::RobotVideoTrack(int frameCount) : _frameCount(frameCount) { + _surface = new Graphics::Surface(); + _curFrame = -1; + _dirtyPalette = false; +} + +RobotDecoder::RobotVideoTrack::~RobotVideoTrack() { _surface->free(); delete _surface; - _surface = 0; +} - if (_header.hasSound) { - _mixer->stopHandle(_audioHandle); - //delete _audioStream; _audioStream = 0; +uint16 RobotDecoder::RobotVideoTrack::getWidth() const { + return _surface->w; +} + +uint16 RobotDecoder::RobotVideoTrack::getHeight() const { + return _surface->h; +} + +Graphics::PixelFormat RobotDecoder::RobotVideoTrack::getPixelFormat() const { + return _surface->format; +} + +void RobotDecoder::RobotVideoTrack::readPaletteChunk(Common::SeekableSubReadStreamEndian *stream, uint16 chunkSize) { + byte *paletteData = new byte[chunkSize]; + stream->read(paletteData, chunkSize); + + // SCI1.1 palette + byte palFormat = paletteData[32]; + uint16 palColorStart = paletteData[25]; + uint16 palColorCount = READ_SCI11ENDIAN_UINT16(paletteData + 29); + + int palOffset = 37; + memset(_palette, 0, 256 * 3); + + for (uint16 colorNo = palColorStart; colorNo < palColorStart + palColorCount; colorNo++) { + if (palFormat == kRobotPalVariable) + palOffset++; + _palette[colorNo * 3 + 0] = paletteData[palOffset++]; + _palette[colorNo * 3 + 1] = paletteData[palOffset++]; + _palette[colorNo * 3 + 2] = paletteData[palOffset++]; } - reset(); + _dirtyPalette = true; + delete[] paletteData; } -void RobotDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelVolume(_audioHandle, getVolume()); +void RobotDecoder::RobotVideoTrack::calculateVideoDimensions(Common::SeekableSubReadStreamEndian *stream, uint32 *frameSizes) { + // This is an O(n) operation, as each frame has a different size. + // We need to know the actual frame size to have a constant video size. + uint32 pos = stream->pos(); + + uint16 width = 0, height = 0; + + for (int curFrame = 0; curFrame < _frameCount; curFrame++) { + stream->skip(4); + uint16 frameWidth = stream->readUint16(); + uint16 frameHeight = stream->readUint16(); + if (frameWidth > width) + width = frameWidth; + if (frameHeight > height) + height = frameHeight; + stream->skip(frameSizes[curFrame] - 8); + } + + stream->seek(pos); + + _surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); } -void RobotDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelBalance(_audioHandle, getBalance()); +RobotDecoder::RobotAudioTrack::RobotAudioTrack() { + _audioStream = Audio::makeQueuingAudioStream(11025, false); } -#endif +RobotDecoder::RobotAudioTrack::~RobotAudioTrack() { + delete _audioStream; +} + +void RobotDecoder::RobotAudioTrack::queueBuffer(byte *buffer, int size) { + _audioStream->queueBuffer(buffer, size, DisposeAfterUse::YES, Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN); +} + +Audio::AudioStream *RobotDecoder::RobotAudioTrack::getAudioStream() const { + return _audioStream; +} } // End of namespace Sci diff --git a/engines/sci/video/robot_decoder.h b/engines/sci/video/robot_decoder.h index e9cefe7d91..de5b669ab8 100644 --- a/engines/sci/video/robot_decoder.h +++ b/engines/sci/video/robot_decoder.h @@ -25,84 +25,103 @@ #include "common/rational.h" #include "common/rect.h" -#include "common/stream.h" -#include "common/substream.h" -#include "audio/audiostream.h" -#include "audio/mixer.h" -#include "graphics/pixelformat.h" #include "video/video_decoder.h" -namespace Sci { +namespace Audio { +class QueuingAudioStream; +} -#ifdef ENABLE_SCI32 - -struct RobotHeader { - // 6 bytes, identifier bytes - uint16 version; - uint16 audioChunkSize; - uint16 audioSilenceSize; - // 2 bytes, unknown - uint16 frameCount; - uint16 paletteDataSize; - uint16 unkChunkDataSize; - // 5 bytes, unknown - byte hasSound; - // 34 bytes, unknown -}; +namespace Common { +class SeekableSubReadStreamEndian; +} + +namespace Sci { -class RobotDecoder : public Video::FixedRateVideoDecoder { +class RobotDecoder : public Video::AdvancedVideoDecoder { public: - RobotDecoder(Audio::Mixer *mixer, bool isBigEndian); + RobotDecoder(bool isBigEndian); virtual ~RobotDecoder(); bool loadStream(Common::SeekableReadStream *stream); bool load(GuiResourceId id); void close(); - - bool isVideoLoaded() const { return _fileStream != 0; } - uint16 getWidth() const { return _width; } - uint16 getHeight() const { return _height; } - uint32 getFrameCount() const { return _header.frameCount; } - const Graphics::Surface *decodeNextFrame(); - Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } - const byte *getPalette() { _dirtyPalette = false; return _palette; } - bool hasDirtyPalette() const { return _dirtyPalette; } + void setPos(uint16 x, uint16 y) { _pos = Common::Point(x, y); } Common::Point getPos() const { return _pos; } protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); - - // FixedRateVideoDecoder API - Common::Rational getFrameRate() const { return Common::Rational(60, 10); } - + void readNextPacket(); + private: + class RobotVideoTrack : public FixedRateVideoTrack { + public: + RobotVideoTrack(int frameCount); + ~RobotVideoTrack(); + + uint16 getWidth() const; + uint16 getHeight() const; + Graphics::PixelFormat getPixelFormat() const; + int getCurFrame() const { return _curFrame; } + int getFrameCount() const { return _frameCount; } + const Graphics::Surface *decodeNextFrame() { return _surface; } + const byte *getPalette() const { _dirtyPalette = false; return _palette; } + bool hasDirtyPalette() const { return _dirtyPalette; } + + void readPaletteChunk(Common::SeekableSubReadStreamEndian *stream, uint16 chunkSize); + void calculateVideoDimensions(Common::SeekableSubReadStreamEndian *stream, uint32 *frameSizes); + Graphics::Surface *getSurface() { return _surface; } + void increaseCurFrame() { _curFrame++; } + + protected: + Common::Rational getFrameRate() const { return Common::Rational(60, 10); } + + private: + int _frameCount; + int _curFrame; + byte _palette[256 * 3]; + mutable bool _dirtyPalette; + Graphics::Surface *_surface; + }; + + class RobotAudioTrack : public AudioTrack { + public: + RobotAudioTrack(); + ~RobotAudioTrack(); + + Audio::Mixer::SoundType getSoundType() const { return Audio::Mixer::kMusicSoundType; } + + void queueBuffer(byte *buffer, int size); + + protected: + Audio::AudioStream *getAudioStream() const; + + private: + Audio::QueuingAudioStream *_audioStream; + }; + + struct RobotHeader { + // 6 bytes, identifier bytes + uint16 version; + uint16 audioChunkSize; + uint16 audioSilenceSize; + // 2 bytes, unknown + uint16 frameCount; + uint16 paletteDataSize; + uint16 unkChunkDataSize; + // 5 bytes, unknown + byte hasSound; + // 34 bytes, unknown + } _header; + void readHeaderChunk(); - void readPaletteChunk(uint16 chunkSize); void readFrameSizesChunk(); - void calculateVideoDimensions(); - - void freeData(); - RobotHeader _header; Common::Point _pos; bool _isBigEndian; + uint32 *_frameTotalSize; Common::SeekableSubReadStreamEndian *_fileStream; - - uint16 _width; - uint16 _height; - uint32 *_frameTotalSize; - byte _palette[256 * 3]; - bool _dirtyPalette; - Graphics::Surface *_surface; - Audio::QueuingAudioStream *_audioStream; - Audio::SoundHandle _audioHandle; - Audio::Mixer *_mixer; }; -#endif } // End of namespace Sci -- cgit v1.2.3 From 61e8fdbf1d05bbe37910a787fa53958f4aa5e7f1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 24 Jul 2012 00:16:42 +0300 Subject: SCI: Separate the early SCI11 version of kRemapColors from the SCI32 one --- engines/sci/engine/kernel.h | 1 + engines/sci/engine/kernel_tables.h | 5 ++- engines/sci/engine/kgraphics.cpp | 60 ++++--------------------------- engines/sci/engine/kgraphics32.cpp | 74 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 55 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 441ea2624f..f985a69ebc 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -412,6 +412,7 @@ reg_t kListAt(EngineState *s, int argc, reg_t *argv); reg_t kString(EngineState *s, int argc, reg_t *argv); reg_t kMulDiv(EngineState *s, int argc, reg_t *argv); reg_t kCantBeHere32(EngineState *s, int argc, reg_t *argv); +reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv); // "Screen items" in SCI32 are views reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv); reg_t kUpdateScreenItem(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 825ec90fa9..f5f46285be 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -419,7 +419,10 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, { MAP_CALL(Random), SIG_EVERYWHERE, "i(i)(i)", NULL, NULL }, { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(RemapColors), SIG_EVERYWHERE, "i(i)(i)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(RemapColors), SIG_SCI11, SIGFOR_ALL, "i(i)(i)(i)(i)", NULL, NULL }, +#ifdef ENABLE_SCI32 + { "RemapColors", kRemapColors32, SIG_SCI32, SIGFOR_ALL, "i(i)(i)(i)(i)(i)", NULL, NULL }, +#endif { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL }, { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 6d938b6d22..2ce44db772 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1221,73 +1221,25 @@ reg_t kShow(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } +// Early variant of the SCI32 remapcolors kernel function, used in the demo of QFG4 reg_t kRemapColors(EngineState *s, int argc, reg_t *argv) { uint16 operation = argv[0].toUint16(); switch (operation) { - case 0: { // Set remapping to base. 0 turns remapping off. - int16 base = (argc >= 2) ? argv[1].toSint16() : 0; - if (base != 0) // 0 is the default behavior when changing rooms in GK1, thus silencing the warning - warning("kRemapColors: Set remapping to base %d", base); + case 0: { // remap by percent + uint16 percent = argv[1].toUint16(); + warning("RemapColors(RemapByPercent) %d", percent); } break; case 1: { // unknown - // The demo of QFG4 calls this with 1+3 parameters, thus there are differences here //int16 unk1 = argv[1].toSint16(); //int16 unk2 = argv[2].toSint16(); //int16 unk3 = argv[3].toSint16(); - //uint16 unk4 = argv[4].toUint16(); - //uint16 unk5 = (argc >= 6) ? argv[5].toUint16() : 0; kStub(s, argc, argv); } break; - case 2: { // remap by percent - // This adjusts the alpha value of a specific color, and it operates on - // an RGBA palette. Since we're operating on an RGB palette, we just - // modify the color intensity instead - // TODO: From what I understand, palette remapping should be placed - // separately, so that it can be reset by case 0 above. Thus, we - // should adjust the functionality of the Palette class accordingly. - int16 color = argv[1].toSint16(); - if (color >= 10) - color -= 10; - uint16 percent = argv[2].toUint16(); // 0 - 100 - if (argc >= 4) - warning("RemapByPercent called with 4 parameters, unknown parameter is %d", argv[3].toUint16()); - warning("kRemapColors: RemapByPercent color %d by %d percent", color, percent); - // TODO: It's not correct to set intensity here - //g_sci->_gfxPalette->kernelSetIntensity(color, 255, percent, false); - } - break; - case 3: { // remap to gray - // NOTE: This adjusts the alpha value of a specific color, and it operates on - // an RGBA palette - int16 color = argv[1].toSint16(); // this is subtracted from a maximum color value, and can be offset by 10 - int16 percent = argv[2].toSint16(); // 0 - 100 - uint16 unk3 = (argc >= 4) ? argv[3].toUint16() : 0; - warning("kRemapColors: RemapToGray color %d by %d percent (unk3 = %d)", color, percent, unk3); - } - break; - case 4: { // unknown - //int16 unk1 = argv[1].toSint16(); - //uint16 unk2 = argv[2].toUint16(); - //uint16 unk3 = argv[3].toUint16(); - //uint16 unk4 = (argc >= 5) ? argv[4].toUint16() : 0; - kStub(s, argc, argv); - } - break; - case 5: { // set color intensity - // TODO: This isn't right, it should be setting a mapping table instead. - // For PQ4, we can emulate this with kernelSetIntensity(). In QFG4, this - // won't do. - //int16 mapping = argv[1].toSint16(); - uint16 intensity = argv[2].toUint16(); - // HACK for PQ4 - if (g_sci->getGameId() == GID_PQ4) - g_sci->_gfxPalette->kernelSetIntensity(0, 255, intensity, true); - - kStub(s, argc, argv); - } + case 2: // turn remapping off (unused) + error("Unused subop kRemapColors(2) has been called"); break; default: break; diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 7cfac57675..245c265ba6 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -733,6 +733,80 @@ reg_t kPalCycle(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } +reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { + uint16 operation = argv[0].toUint16(); + + switch (operation) { + case 0: { // Set remapping to base. 0 turns remapping off. + int16 base = (argc >= 2) ? argv[1].toSint16() : 0; + if (base != 0) // 0 is the default behavior when changing rooms in GK1, thus silencing the warning + warning("kRemapColors: Set remapping to base %d", base); + } + break; + case 1: { // unknown + //int16 unk1 = argv[1].toSint16(); + //int16 unk2 = argv[2].toSint16(); + //int16 unk3 = argv[3].toSint16(); + //uint16 unk4 = argv[4].toUint16(); + //uint16 unk5 = (argc >= 6) ? argv[5].toUint16() : 0; + kStub(s, argc, argv); + } + break; + case 2: { // remap by percent + // This adjusts the alpha value of a specific color, and it operates on + // an RGBA palette. Since we're operating on an RGB palette, we just + // modify the color intensity instead + // TODO: From what I understand, palette remapping should be placed + // separately, so that it can be reset by case 0 above. Thus, we + // should adjust the functionality of the Palette class accordingly. + int16 color = argv[1].toSint16(); + if (color >= 10) + color -= 10; + uint16 percent = argv[2].toUint16(); // 0 - 100 + if (argc >= 4) + warning("RemapByPercent called with 4 parameters, unknown parameter is %d", argv[3].toUint16()); + warning("kRemapColors: RemapByPercent color %d by %d percent", color, percent); + // TODO: It's not correct to set intensity here + //g_sci->_gfxPalette->kernelSetIntensity(color, 255, percent, false); + } + break; + case 3: { // remap to gray + // NOTE: This adjusts the alpha value of a specific color, and it operates on + // an RGBA palette + int16 color = argv[1].toSint16(); // this is subtracted from a maximum color value, and can be offset by 10 + int16 percent = argv[2].toSint16(); // 0 - 100 + uint16 unk3 = (argc >= 4) ? argv[3].toUint16() : 0; + warning("kRemapColors: RemapToGray color %d by %d percent (unk3 = %d)", color, percent, unk3); + } + break; + case 4: { // unknown + //int16 unk1 = argv[1].toSint16(); + //uint16 unk2 = argv[2].toUint16(); + //uint16 unk3 = argv[3].toUint16(); + //uint16 unk4 = (argc >= 5) ? argv[4].toUint16() : 0; + kStub(s, argc, argv); + } + break; + case 5: { // set color intensity + // TODO: This isn't right, it should be setting a mapping table instead. + // For PQ4, we can emulate this with kernelSetIntensity(). In QFG4, this + // won't do. + //int16 mapping = argv[1].toSint16(); + uint16 intensity = argv[2].toUint16(); + // HACK for PQ4 + if (g_sci->getGameId() == GID_PQ4) + g_sci->_gfxPalette->kernelSetIntensity(0, 255, intensity, true); + + kStub(s, argc, argv); + } + break; + default: + break; + } + + return s->r_acc; +} + #endif } // End of namespace Sci -- cgit v1.2.3 From bd281928cb6e87cfb7175189cafd2b25991f3e01 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 24 Jul 2012 03:53:44 +0300 Subject: SCI: Initial implementation of kRemapColors(kRemapByPercent) Fixes some graphics glitches in the QFG4 demo and the menus of QFG4, by implementing one of the transparency effects used mainly in SCI32. Many thanks to fuzzie for her debugging info on QFG4 demo and to wjp for his great help on the dissassembly --- engines/sci/engine/kgraphics.cpp | 7 ++++--- engines/sci/engine/kgraphics32.cpp | 21 +++++++++------------ engines/sci/graphics/palette.cpp | 23 +++++++++++++++++++++++ engines/sci/graphics/palette.h | 9 +++++++++ engines/sci/graphics/view.cpp | 10 ++++++++-- 5 files changed, 53 insertions(+), 17 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 2ce44db772..bd78c56416 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1221,17 +1221,18 @@ reg_t kShow(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -// Early variant of the SCI32 remapcolors kernel function, used in the demo of QFG4 +// Early variant of the SCI32 kRemapColors kernel function, used in the demo of QFG4 reg_t kRemapColors(EngineState *s, int argc, reg_t *argv) { uint16 operation = argv[0].toUint16(); switch (operation) { case 0: { // remap by percent uint16 percent = argv[1].toUint16(); - warning("RemapColors(RemapByPercent) %d", percent); + g_sci->_gfxPalette->toggleRemap(true); + g_sci->_gfxPalette->setRemappingPercent(percent); } break; - case 1: { // unknown + case 1: { // set remapping base //int16 unk1 = argv[1].toSint16(); //int16 unk2 = argv[2].toSint16(); //int16 unk3 = argv[3].toSint16(); diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 245c265ba6..1b7b628e7d 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -742,8 +742,11 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { if (base != 0) // 0 is the default behavior when changing rooms in GK1, thus silencing the warning warning("kRemapColors: Set remapping to base %d", base); } + // TODO: Don't turn remapping off always + g_sci->_gfxPalette->toggleRemap(false); + g_sci->_gfxPalette->setRemappingPercent(0); break; - case 1: { // unknown + case 1: { // set remapping base //int16 unk1 = argv[1].toSint16(); //int16 unk2 = argv[2].toSint16(); //int16 unk3 = argv[3].toSint16(); @@ -753,21 +756,15 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { } break; case 2: { // remap by percent - // This adjusts the alpha value of a specific color, and it operates on - // an RGBA palette. Since we're operating on an RGB palette, we just - // modify the color intensity instead - // TODO: From what I understand, palette remapping should be placed - // separately, so that it can be reset by case 0 above. Thus, we - // should adjust the functionality of the Palette class accordingly. - int16 color = argv[1].toSint16(); + // TODO: Use the color index. The -10 offset is wrong. + /*int16 color = argv[1].toSint16(); if (color >= 10) - color -= 10; + color -= 10;*/ uint16 percent = argv[2].toUint16(); // 0 - 100 if (argc >= 4) warning("RemapByPercent called with 4 parameters, unknown parameter is %d", argv[3].toUint16()); - warning("kRemapColors: RemapByPercent color %d by %d percent", color, percent); - // TODO: It's not correct to set intensity here - //g_sci->_gfxPalette->kernelSetIntensity(color, 255, percent, false); + g_sci->_gfxPalette->toggleRemap(true); + g_sci->_gfxPalette->setRemappingPercent(percent); } break; case 3: { // remap to gray diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index ea154c5037..f16d607a29 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -100,6 +100,9 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) default: error("GfxPalette: Unknown view type"); } + + _remapOn = false; + _remappingPercent = 0; } GfxPalette::~GfxPalette() { @@ -329,6 +332,26 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { } } +bool GfxPalette::isRemapColor(byte color) { + // TODO: Expand this for SCI32 (more than one remap color can be set). + // Now, it is assumed that colors 253 and 254 are the remap colors. + return _remapOn && (color == 253 || color == 254); +} + +byte GfxPalette::remapColor(byte color) { + assert(_remapOn); + + // TODO: Change this to use a table instead, like the original. + if (_remappingPercent) { + byte r = _sysPalette.colors[color].r * _remappingPercent / 100; + byte g = _sysPalette.colors[color].g * _remappingPercent / 100; + byte b = _sysPalette.colors[color].b * _remappingPercent / 100; + return kernelFindColor(r, g, b); + } else { + return color; + } +} + bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) { bool paletteChanged = false; diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index a9ea1c32de..5b9ae9e016 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -53,6 +53,11 @@ public: void getSys(Palette *pal); uint16 getTotalColorCount() const { return _totalScreenColors; } + void toggleRemap(bool remap) { _remapOn = remap; } + void setRemappingPercent(uint16 percent) { _remappingPercent = percent; } + bool isRemapColor(byte color); + byte remapColor(byte color); + void setOnScreen(); void copySysPaletteToScreen(); @@ -123,6 +128,10 @@ private: int _palVarySignal; uint16 _totalScreenColors; + bool _remapOn; + uint16 _remappingBaseR, _remappingBaseG, _remappingBaseB; + uint16 _remappingPercent; + void loadMacIconBarPalette(); byte *_macClut; diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 4e5c4da8b2..ae135d141c 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -741,8 +741,14 @@ void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const const int x2 = clipRectTranslated.left + x; const int y2 = clipRectTranslated.top + y; if (!upscaledHires) { - if (priority >= _screen->getPriority(x2, y2)) - _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); + if (priority >= _screen->getPriority(x2, y2)) { + if (!_palette->isRemapColor(palette->mapping[color])) { + _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); + } else { + byte remappedColor = _palette->remapColor(_screen->getVisual(x2, y2)); + _screen->putPixel(x2, y2, drawMask, remappedColor, priority, 0); + } + } } else { // UpscaledHires means view is hires and is supposed to // get drawn onto lowres screen. -- cgit v1.2.3 From 3a780a63db79c2a1b2527e6510182a74f6fcfe12 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 23 Jul 2012 21:03:49 -0400 Subject: VIDEO: Set _startTime when rewinding and seeking --- video/video_decoder.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index ad176da73b..97f8eec7bb 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -263,6 +263,7 @@ bool AdvancedVideoDecoder::rewind() { return false; _audioStartOffset = 0; + _startTime = g_system->getMillis(); return true; } @@ -290,6 +291,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { return false; _audioStartOffset = time; + _startTime = g_system->getMillis() - time.msecs(); return true; } -- cgit v1.2.3 From a652f6669e2e9225aee17431784b433397b41ae3 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 23 Jul 2012 21:04:51 -0400 Subject: VIDEO: Rewrite SmackerDecoder to use the new API --- engines/agos/animation.cpp | 12 +- engines/agos/animation.h | 4 +- engines/saga/introproc_saga2.cpp | 4 +- engines/scumm/he/animation_he.cpp | 5 +- engines/sword1/animation.cpp | 9 +- engines/sword2/animation.cpp | 9 +- engines/toon/movie.cpp | 35 ++-- engines/toon/movie.h | 14 +- engines/toon/toon.cpp | 2 +- video/smk_decoder.cpp | 391 ++++++++++++++++++++------------------ video/smk_decoder.h | 117 ++++++++---- 11 files changed, 338 insertions(+), 264 deletions(-) diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp index 10c01741ae..3e8488d7d5 100644 --- a/engines/agos/animation.cpp +++ b/engines/agos/animation.cpp @@ -415,7 +415,7 @@ void MoviePlayerDXA::updateBalance() { MoviePlayerSMK::MoviePlayerSMK(AGOSEngine_Feeble *vm, const char *name) - : MoviePlayer(vm), SmackerDecoder(vm->_mixer) { + : MoviePlayer(vm), SmackerDecoder() { debug(0, "Creating SMK cutscene player"); memset(baseName, 0, sizeof(baseName)); @@ -431,12 +431,12 @@ bool MoviePlayerSMK::load() { if (!loadStream(videoStream)) error("Failed to load video stream from file %s", videoName.c_str()); + start(); + debug(0, "Playing video %s", videoName.c_str()); CursorMan.showMouse(false); - _firstFrameOffset = _fileStream->pos(); - return true; } @@ -477,10 +477,8 @@ void MoviePlayerSMK::handleNextFrame() { } void MoviePlayerSMK::nextFrame() { - if (_vm->_interactiveVideo == TYPE_LOOPING && endOfVideo()) { - _fileStream->seek(_firstFrameOffset); - _curFrame = -1; - } + if (_vm->_interactiveVideo == TYPE_LOOPING && endOfVideo()) + rewind(); if (!endOfVideo()) { decodeNextFrame(); diff --git a/engines/agos/animation.h b/engines/agos/animation.h index d1ff074b03..37a666b201 100644 --- a/engines/agos/animation.h +++ b/engines/agos/animation.h @@ -67,9 +67,6 @@ protected: virtual void handleNextFrame(); virtual bool processFrame() = 0; virtual void startSound() {} - -protected: - uint32 _firstFrameOffset; }; class MoviePlayerDXA : public MoviePlayer, Video::DXADecoder { @@ -93,6 +90,7 @@ private: bool processFrame(); void startSound(); void copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch); + uint32 _firstFrameOffset; }; class MoviePlayerSMK : public MoviePlayer, Video::SmackerDecoder { diff --git a/engines/saga/introproc_saga2.cpp b/engines/saga/introproc_saga2.cpp index b6470370af..15f7f4dc15 100644 --- a/engines/saga/introproc_saga2.cpp +++ b/engines/saga/introproc_saga2.cpp @@ -92,7 +92,7 @@ int Scene::FTA2EndProc(FTA2Endings whichEnding) { } void Scene::playMovie(const char *filename) { - Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(_vm->_mixer); + Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(); if (!smkDecoder->loadFile(filename)) return; @@ -101,6 +101,8 @@ void Scene::playMovie(const char *filename) { uint16 y = (g_system->getHeight() - smkDecoder->getHeight()) / 2; bool skipVideo = false; + smkDecoder->start(); + while (!_vm->shouldQuit() && !smkDecoder->endOfVideo() && !skipVideo) { if (smkDecoder->needsUpdate()) { const Graphics::Surface *frame = smkDecoder->decodeNextFrame(); diff --git a/engines/scumm/he/animation_he.cpp b/engines/scumm/he/animation_he.cpp index 40e99c26a8..b37a565aab 100644 --- a/engines/scumm/he/animation_he.cpp +++ b/engines/scumm/he/animation_he.cpp @@ -40,7 +40,10 @@ MoviePlayer::MoviePlayer(ScummEngine_v90he *vm, Audio::Mixer *mixer) : _vm(vm) { _video = new Video::BinkDecoder(); else #endif - _video = new Video::SmackerDecoder(mixer); + { + _video = new Video::SmackerDecoder(); + ((Video::AdvancedVideoDecoder *)_video)->start(); + } _flags = 0; _wizResNum = 0; diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index 49c5ef7312..8f863d1e09 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -179,6 +179,13 @@ bool MoviePlayer::load(uint32 id) { break; case kVideoDecoderSMK: filename = Common::String::format("%s.smk", sequenceList[id]); + + if (_decoder->loadFile(filename)) { + ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete + return true; + } else { + return false; + } break; case kVideoDecoderPSX: filename = Common::String::format("%s.str", (_vm->_systemVars.isDemo) ? sequenceList[id] : sequenceListPSX[id]); @@ -547,7 +554,7 @@ MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan * filename = Common::String::format("%s.smk", sequenceList[id]); if (Common::File::exists(filename)) { - Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(snd); + Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(); return new MoviePlayer(vm, textMan, resMan, snd, system, bgSoundHandle, smkDecoder, kVideoDecoderSMK); } diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index c1cf33ff09..e257ec9029 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -89,6 +89,13 @@ bool MoviePlayer::load(const char *name) { break; case kVideoDecoderSMK: filename = Common::String::format("%s.smk", name); + + if (_decoder->loadFile(filename)) { + ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete + return true; + } else { + return false; + } break; case kVideoDecoderPSX: filename = Common::String::format("%s.str", name); @@ -442,7 +449,7 @@ MoviePlayer *makeMoviePlayer(const char *name, Sword2Engine *vm, Audio::Mixer *s filename = Common::String::format("%s.smk", name); if (Common::File::exists(filename)) { - Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(snd); + Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(); return new MoviePlayer(vm, snd, system, bgSoundHandle, smkDecoder, kVideoDecoderSMK); } diff --git a/engines/toon/movie.cpp b/engines/toon/movie.cpp index 93e41adf57..d988a3ed60 100644 --- a/engines/toon/movie.cpp +++ b/engines/toon/movie.cpp @@ -33,6 +33,10 @@ namespace Toon { +ToonstruckSmackerDecoder::ToonstruckSmackerDecoder() : Video::SmackerDecoder() { + _lowRes = false; +} + void ToonstruckSmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize) { debugC(6, kDebugMovie, "handleAudioTrack(%d, %d, %d)", track, chunkSize, unpackedSize); @@ -40,33 +44,21 @@ void ToonstruckSmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, ui /* uint16 width = */ _fileStream->readUint16LE(); uint16 height = _fileStream->readUint16LE(); _lowRes = (height == getHeight() / 2); - } else + } else { Video::SmackerDecoder::handleAudioTrack(track, chunkSize, unpackedSize); + } } -bool ToonstruckSmackerDecoder::loadFile(const Common::String &filename) { - debugC(1, kDebugMovie, "loadFile(%s)", filename.c_str()); +bool ToonstruckSmackerDecoder::loadStream(Common::SeekableReadStream *stream) { + if (!Video::SmackerDecoder::loadStream(stream)) + return false; _lowRes = false; - - if (Video::SmackerDecoder::loadFile(filename)) { - if (_surface->h == 200) { - if (_surface) { - _surface->free(); - delete _surface; - } - _surface = new Graphics::Surface(); - _surface->create(640, 400, Graphics::PixelFormat::createFormatCLUT8()); - _header.flags = 4; - } - - return true; - } - return false; + return true; } -ToonstruckSmackerDecoder::ToonstruckSmackerDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType) : Video::SmackerDecoder(mixer, soundType) { - _lowRes = false; +Video::SmackerDecoder::SmackerVideoTrack *ToonstruckSmackerDecoder::createVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature) const { + return Video::SmackerDecoder::createVideoTrack(width, height, frameCount, frameRate, (height == 200) ? 4 : flags, signature); } // decoder is deallocated with Movie destruction i.e. new ToonstruckSmackerDecoder is needed @@ -103,6 +95,9 @@ void Movie::play(const Common::String &video, int32 flags) { bool Movie::playVideo(bool isFirstIntroVideo) { debugC(1, kDebugMovie, "playVideo(isFirstIntroVideo: %d)", isFirstIntroVideo); + + _decoder->start(); + while (!_vm->shouldQuit() && !_decoder->endOfVideo()) { if (_decoder->needsUpdate()) { const Graphics::Surface *frame = _decoder->decodeNextFrame(); diff --git a/engines/toon/movie.h b/engines/toon/movie.h index 2cd33302f2..e795182cba 100644 --- a/engines/toon/movie.h +++ b/engines/toon/movie.h @@ -30,13 +30,17 @@ namespace Toon { class ToonstruckSmackerDecoder : public Video::SmackerDecoder { public: - ToonstruckSmackerDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType = Audio::Mixer::kSFXSoundType); - virtual ~ToonstruckSmackerDecoder() {} - void handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize); - bool loadFile(const Common::String &filename); + ToonstruckSmackerDecoder(); + + bool loadStream(Common::SeekableReadStream *stream); bool isLowRes() { return _lowRes; } + protected: - bool _lowRes; + void handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize); + SmackerVideoTrack *createVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature) const; + +private: + bool _lowRes; }; class Movie { diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp index ee427652d8..9fd8415676 100644 --- a/engines/toon/toon.cpp +++ b/engines/toon/toon.cpp @@ -51,7 +51,7 @@ void ToonEngine::init() { _currentScriptRegion = 0; _resources = new Resources(this); _animationManager = new AnimationManager(this); - _moviePlayer = new Movie(this, new ToonstruckSmackerDecoder(_mixer)); + _moviePlayer = new Movie(this, new ToonstruckSmackerDecoder()); _hotspots = new Hotspots(this); _mainSurface = new Graphics::Surface(); diff --git a/video/smk_decoder.cpp b/video/smk_decoder.cpp index 359f4cb9bd..d707ad519f 100644 --- a/video/smk_decoder.cpp +++ b/video/smk_decoder.cpp @@ -204,8 +204,7 @@ BigHuffmanTree::BigHuffmanTree(Common::BitStream &bs, int allocSize) delete _hiBytes; } -BigHuffmanTree::~BigHuffmanTree() -{ +BigHuffmanTree::~BigHuffmanTree() { delete[] _tree; } @@ -278,24 +277,17 @@ uint32 BigHuffmanTree::getCode(Common::BitStream &bs) { return v; } -SmackerDecoder::SmackerDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType) - : _audioStarted(false), _audioStream(0), _mixer(mixer), _soundType(soundType) { - _surface = 0; +SmackerDecoder::SmackerDecoder(Audio::Mixer::SoundType soundType) : _soundType(soundType) { _fileStream = 0; - _dirtyPalette = false; + _firstFrameStart = 0; + _frameTypes = 0; + _frameSizes = 0; } SmackerDecoder::~SmackerDecoder() { close(); } -uint32 SmackerDecoder::getTime() const { - if (_audioStream && _audioStarted) - return _mixer->getSoundElapsedTime(_audioHandle); - - return FixedRateVideoDecoder::getTime(); -} - bool SmackerDecoder::loadStream(Common::SeekableReadStream *stream) { close(); @@ -309,16 +301,17 @@ bool SmackerDecoder::loadStream(Common::SeekableReadStream *stream) { uint32 width = _fileStream->readUint32LE(); uint32 height = _fileStream->readUint32LE(); - _frameCount = _fileStream->readUint32LE(); - int32 frameRate = _fileStream->readSint32LE(); - - // framerate contains 2 digits after the comma, so 1497 is actually 14.97 fps - if (frameRate > 0) - _frameRate = Common::Rational(1000, frameRate); - else if (frameRate < 0) - _frameRate = Common::Rational(100000, -frameRate); + uint32 frameCount = _fileStream->readUint32LE(); + int32 frameDelay = _fileStream->readSint32LE(); + + // frame rate contains 2 digits after the comma, so 1497 is actually 14.97 fps + Common::Rational frameRate; + if (frameDelay > 0) + frameRate = Common::Rational(1000, frameDelay); + else if (frameDelay < 0) + frameRate = Common::Rational(100000, -frameDelay); else - _frameRate = 1000; + frameRate = 1000; // Flags are determined by which bit is set, which can be one of the following: // 0 - set to 1 if file contains a ring frame. @@ -328,6 +321,9 @@ bool SmackerDecoder::loadStream(Common::SeekableReadStream *stream) { // before it is displayed. _header.flags = _fileStream->readUint32LE(); + SmackerVideoTrack *videoTrack = createVideoTrack(width, height, frameCount, frameRate, _header.flags, _header.signature); + addTrack(videoTrack); + // TODO: should we do any extra processing for Smacker files with ring frames? // TODO: should we do any extra processing for Y-doubled videos? Are they the @@ -374,92 +370,78 @@ bool SmackerDecoder::loadStream(Common::SeekableReadStream *stream) { warning("Unhandled Smacker v2 audio compression"); if (i == 0) - _audioStream = Audio::makeQueuingAudioStream(_header.audioInfo[0].sampleRate, _header.audioInfo[0].isStereo); + addTrack(new SmackerAudioTrack(_header.audioInfo[i], _soundType)); } } _header.dummy = _fileStream->readUint32LE(); - _frameSizes = new uint32[_frameCount]; - for (i = 0; i < _frameCount; ++i) + _frameSizes = new uint32[frameCount]; + for (i = 0; i < frameCount; ++i) _frameSizes[i] = _fileStream->readUint32LE(); - _frameTypes = new byte[_frameCount]; - for (i = 0; i < _frameCount; ++i) + _frameTypes = new byte[frameCount]; + for (i = 0; i < frameCount; ++i) _frameTypes[i] = _fileStream->readByte(); byte *huffmanTrees = (byte *) malloc(_header.treesSize); _fileStream->read(huffmanTrees, _header.treesSize); Common::BitStream8LSB bs(new Common::MemoryReadStream(huffmanTrees, _header.treesSize, DisposeAfterUse::YES), true); + videoTrack->readTrees(bs, _header.mMapSize, _header.mClrSize, _header.fullSize, _header.typeSize); - _MMapTree = new BigHuffmanTree(bs, _header.mMapSize); - _MClrTree = new BigHuffmanTree(bs, _header.mClrSize); - _FullTree = new BigHuffmanTree(bs, _header.fullSize); - _TypeTree = new BigHuffmanTree(bs, _header.typeSize); - - _surface = new Graphics::Surface(); + _firstFrameStart = _fileStream->pos(); - // Height needs to be doubled if we have flags (Y-interlaced or Y-doubled) - _surface->create(width, height * (_header.flags ? 2 : 1), Graphics::PixelFormat::createFormatCLUT8()); - - memset(_palette, 0, 3 * 256); return true; } void SmackerDecoder::close() { - if (!_fileStream) - return; - - if (_audioStream) { - if (_audioStarted) { - // The mixer will delete the stream. - _mixer->stopHandle(_audioHandle); - _audioStarted = false; - } else { - delete _audioStream; - } - _audioStream = 0; - } + AdvancedVideoDecoder::close(); delete _fileStream; _fileStream = 0; - _surface->free(); - delete _surface; - _surface = 0; - - delete _MMapTree; - delete _MClrTree; - delete _FullTree; - delete _TypeTree; + delete[] _frameTypes; + _frameTypes = 0; delete[] _frameSizes; - delete[] _frameTypes; + _frameSizes = 0; +} - reset(); +bool SmackerDecoder::rewind() { + // Call the parent method to rewind the tracks first + // In particular, only videos without sound can be rewound + if (!AdvancedVideoDecoder::rewind()) + return false; + + // And seek back to where the first frame begins + _fileStream->seek(_firstFrameStart); + return true; } -const Graphics::Surface *SmackerDecoder::decodeNextFrame() { +void SmackerDecoder::readNextPacket() { + SmackerVideoTrack *videoTrack = (SmackerVideoTrack *)getTrack(0); + + if (videoTrack->endOfTrack()) + return; + + videoTrack->increaseCurFrame(); + uint i; uint32 chunkSize = 0; uint32 dataSizeUnpacked = 0; uint32 startPos = _fileStream->pos(); - _curFrame++; - // Check if we got a frame with palette data, and // call back the virtual setPalette function to set // the current palette - if (_frameTypes[_curFrame] & 1) { - unpackPalette(); - _dirtyPalette = true; - } + if (_frameTypes[videoTrack->getCurFrame()] & 1) + videoTrack->unpackPalette(_fileStream); // Load audio tracks for (i = 0; i < 7; ++i) { - if (!(_frameTypes[_curFrame] & (2 << i))) + if (!(_frameTypes[videoTrack->getCurFrame()] & (2 << i))) continue; chunkSize = _fileStream->readUint32LE(); @@ -475,29 +457,109 @@ const Graphics::Surface *SmackerDecoder::decodeNextFrame() { handleAudioTrack(i, chunkSize, dataSizeUnpacked); } - uint32 frameSize = _frameSizes[_curFrame] & ~3; -// uint32 remainder = _frameSizes[_curFrame] & 3; + uint32 frameSize = _frameSizes[videoTrack->getCurFrame()] & ~3; +// uint32 remainder = _frameSizes[videoTrack->getCurFrame()] & 3; if (_fileStream->pos() - startPos > frameSize) error("Smacker actual frame size exceeds recorded frame size"); uint32 frameDataSize = frameSize - (_fileStream->pos() - startPos); - _frameData = (byte *)malloc(frameDataSize + 1); + byte *frameData = (byte *)malloc(frameDataSize + 1); // Padding to keep the BigHuffmanTrees from reading past the data end - _frameData[frameDataSize] = 0x00; + frameData[frameDataSize] = 0x00; + + _fileStream->read(frameData, frameDataSize); - _fileStream->read(_frameData, frameDataSize); + Common::BitStream8LSB bs(new Common::MemoryReadStream(frameData, frameDataSize + 1, DisposeAfterUse::YES), true); + videoTrack->decodeFrame(bs); - Common::BitStream8LSB bs(new Common::MemoryReadStream(_frameData, frameDataSize + 1, DisposeAfterUse::YES), true); + _fileStream->seek(startPos + frameSize); +} +void SmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize) { + if (_header.audioInfo[track].hasAudio && chunkSize > 0 && track == 0) { + // Get the audio track, which start at offset 1 (first track is video) + SmackerAudioTrack *audioTrack = (SmackerAudioTrack *)getTrack(track + 1); + + // If it's track 0, play the audio data + byte *soundBuffer = (byte *)malloc(chunkSize + 1); + // Padding to keep the SmallHuffmanTrees from reading past the data end + soundBuffer[chunkSize] = 0x00; + + _fileStream->read(soundBuffer, chunkSize); + + if (_header.audioInfo[track].compression == kCompressionRDFT || _header.audioInfo[track].compression == kCompressionDCT) { + // TODO: Compressed audio (Bink RDFT/DCT encoded) + free(soundBuffer); + return; + } else if (_header.audioInfo[track].compression == kCompressionDPCM) { + // Compressed audio (Huffman DPCM encoded) + audioTrack->queueCompressedBuffer(soundBuffer, chunkSize + 1, unpackedSize); + free(soundBuffer); + } else { + // Uncompressed audio (PCM) + audioTrack->queuePCM(soundBuffer, chunkSize); + } + } else { + // Ignore the rest of the audio tracks, if they exist + // TODO: Are there any Smacker videos with more than one audio stream? + // If yes, we should play the rest of the audio streams as well + if (chunkSize > 0) + _fileStream->skip(chunkSize); + } +} + +SmackerDecoder::SmackerVideoTrack::SmackerVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature) { + _surface = new Graphics::Surface(); + _surface->create(width, height * (flags ? 2 : 1), Graphics::PixelFormat::createFormatCLUT8()); + _frameCount = frameCount; + _frameRate = frameRate; + _flags = flags; + _signature = signature; + _curFrame = -1; + _dirtyPalette = false; + _MMapTree = _MClrTree = _FullTree = _TypeTree = 0; + memset(_palette, 0, 3 * 256); +} + +SmackerDecoder::SmackerVideoTrack::~SmackerVideoTrack() { + _surface->free(); + delete _surface; + + delete _MMapTree; + delete _MClrTree; + delete _FullTree; + delete _TypeTree; +} + +uint16 SmackerDecoder::SmackerVideoTrack::getWidth() const { + return _surface->w; +} + +uint16 SmackerDecoder::SmackerVideoTrack::getHeight() const { + return _surface->h; +} + +Graphics::PixelFormat SmackerDecoder::SmackerVideoTrack::getPixelFormat() const { + return _surface->format; +} + +void SmackerDecoder::SmackerVideoTrack::readTrees(Common::BitStream &bs, uint32 mMapSize, uint32 mClrSize, uint32 fullSize, uint32 typeSize) { + _MMapTree = new BigHuffmanTree(bs, mMapSize); + _MClrTree = new BigHuffmanTree(bs, mClrSize); + _FullTree = new BigHuffmanTree(bs, fullSize); + _TypeTree = new BigHuffmanTree(bs, typeSize); +} + +void SmackerDecoder::SmackerVideoTrack::decodeFrame(Common::BitStream &bs) { _MMapTree->reset(); _MClrTree->reset(); _FullTree->reset(); _TypeTree->reset(); // Height needs to be doubled if we have flags (Y-interlaced or Y-doubled) - uint doubleY = _header.flags ? 2 : 1; + uint doubleY = _flags ? 2 : 1; uint bw = getWidth() / 4; uint bh = getHeight() / doubleY / 4; @@ -508,6 +570,7 @@ const Graphics::Surface *SmackerDecoder::decodeNextFrame() { uint type, run, j, mode; uint32 p1, p2, clr, map; byte hi, lo; + uint i; while (block < blocks) { type = _TypeTree->getCode(bs); @@ -536,7 +599,7 @@ const Graphics::Surface *SmackerDecoder::decodeNextFrame() { break; case SMK_BLOCK_FULL: // Smacker v2 has one mode, Smacker v4 has three - if (_header.signature == MKTAG('S','M','K','2')) { + if (_signature == MKTAG('S','M','K','2')) { mode = 0; } else { // 00 - mode 0 @@ -628,60 +691,75 @@ const Graphics::Surface *SmackerDecoder::decodeNextFrame() { break; } } +} - _fileStream->seek(startPos + frameSize); +void SmackerDecoder::SmackerVideoTrack::unpackPalette(Common::SeekableReadStream *stream) { + uint startPos = stream->pos(); + uint32 len = 4 * stream->readByte(); - if (_curFrame == 0) - _startTime = g_system->getMillis(); + byte *chunk = (byte *)malloc(len); + stream->read(chunk, len); + byte *p = chunk; - return _surface; -} + byte oldPalette[3 * 256]; + memcpy(oldPalette, _palette, 3 * 256); -void SmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize) { - if (_header.audioInfo[track].hasAudio && chunkSize > 0 && track == 0) { - // If it's track 0, play the audio data - byte *soundBuffer = (byte *)malloc(chunkSize + 1); - // Padding to keep the SmallHuffmanTrees from reading past the data end - soundBuffer[chunkSize] = 0x00; + byte *pal = _palette; - _fileStream->read(soundBuffer, chunkSize); + int sz = 0; + byte b0; + while (sz < 256) { + b0 = *p++; + if (b0 & 0x80) { // if top bit is 1 (0x80 = 10000000) + sz += (b0 & 0x7f) + 1; // get lower 7 bits + 1 (0x7f = 01111111) + pal += 3 * ((b0 & 0x7f) + 1); + } else if (b0 & 0x40) { // if top 2 bits are 01 (0x40 = 01000000) + byte c = (b0 & 0x3f) + 1; // get lower 6 bits + 1 (0x3f = 00111111) + uint s = 3 * *p++; + sz += c; - if (_header.audioInfo[track].compression == kCompressionRDFT || _header.audioInfo[track].compression == kCompressionDCT) { - // TODO: Compressed audio (Bink RDFT/DCT encoded) - free(soundBuffer); - return; - } else if (_header.audioInfo[track].compression == kCompressionDPCM) { - // Compressed audio (Huffman DPCM encoded) - queueCompressedBuffer(soundBuffer, chunkSize + 1, unpackedSize, track); - free(soundBuffer); - } else { - // Uncompressed audio (PCM) - byte flags = 0; - if (_header.audioInfo[track].is16Bits) - flags = flags | Audio::FLAG_16BITS; - if (_header.audioInfo[track].isStereo) - flags = flags | Audio::FLAG_STEREO; - - _audioStream->queueBuffer(soundBuffer, chunkSize, DisposeAfterUse::YES, flags); - // The sound buffer will be deleted by QueuingAudioStream - } + while (c--) { + *pal++ = oldPalette[s + 0]; + *pal++ = oldPalette[s + 1]; + *pal++ = oldPalette[s + 2]; + s += 3; + } + } else { // top 2 bits are 00 + sz++; + // get the lower 6 bits for each component (0x3f = 00111111) + byte b = b0 & 0x3f; + byte g = (*p++) & 0x3f; + byte r = (*p++) & 0x3f; + + assert(g < 0xc0 && b < 0xc0); - if (!_audioStarted) { - _mixer->playStream(_soundType, &_audioHandle, _audioStream, -1, getVolume(), getBalance()); - _audioStarted = true; + // upscale to full 8-bit color values by multiplying by 4 + *pal++ = b * 4; + *pal++ = g * 4; + *pal++ = r * 4; } - } else { - // Ignore the rest of the audio tracks, if they exist - // TODO: Are there any Smacker videos with more than one audio stream? - // If yes, we should play the rest of the audio streams as well - if (chunkSize > 0) - _fileStream->skip(chunkSize); } + + stream->seek(startPos + len); + free(chunk); + + _dirtyPalette = true; } -void SmackerDecoder::queueCompressedBuffer(byte *buffer, uint32 bufferSize, - uint32 unpackedSize, int streamNum) { +SmackerDecoder::SmackerAudioTrack::SmackerAudioTrack(const AudioInfo &audioInfo, Audio::Mixer::SoundType soundType) : + _audioInfo(audioInfo), _soundType(soundType) { + _audioStream = Audio::makeQueuingAudioStream(_audioInfo.sampleRate, _audioInfo.isStereo); +} +SmackerDecoder::SmackerAudioTrack::~SmackerAudioTrack() { + delete _audioStream; +} + +Audio::AudioStream *SmackerDecoder::SmackerAudioTrack::getAudioStream() const { + return _audioStream; +} + +void SmackerDecoder::SmackerAudioTrack::queueCompressedBuffer(byte *buffer, uint32 bufferSize, uint32 unpackedSize) { Common::BitStream8LSB audioBS(new Common::MemoryReadStream(buffer, bufferSize), true); bool dataPresent = audioBS.getBit(); @@ -689,9 +767,9 @@ void SmackerDecoder::queueCompressedBuffer(byte *buffer, uint32 bufferSize, return; bool isStereo = audioBS.getBit(); - assert(isStereo == _header.audioInfo[streamNum].isStereo); + assert(isStereo == _audioInfo.isStereo); bool is16Bits = audioBS.getBit(); - assert(is16Bits == _header.audioInfo[streamNum].is16Bits); + assert(is16Bits == _audioInfo.is16Bits); int numBytes = 1 * (isStereo ? 2 : 1) * (is16Bits ? 2 : 1); @@ -759,74 +837,21 @@ void SmackerDecoder::queueCompressedBuffer(byte *buffer, uint32 bufferSize, for (int k = 0; k < numBytes; k++) delete audioTrees[k]; - byte flags = 0; - if (_header.audioInfo[0].is16Bits) - flags = flags | Audio::FLAG_16BITS; - if (_header.audioInfo[0].isStereo) - flags = flags | Audio::FLAG_STEREO; - _audioStream->queueBuffer(unpackedBuffer, unpackedSize, DisposeAfterUse::YES, flags); - // unpackedBuffer will be deleted by QueuingAudioStream + queuePCM(unpackedBuffer, unpackedSize); } -void SmackerDecoder::unpackPalette() { - uint startPos = _fileStream->pos(); - uint32 len = 4 * _fileStream->readByte(); - - byte *chunk = (byte *)malloc(len); - _fileStream->read(chunk, len); - byte *p = chunk; - - byte oldPalette[3*256]; - memcpy(oldPalette, _palette, 3 * 256); - - byte *pal = _palette; - - int sz = 0; - byte b0; - while (sz < 256) { - b0 = *p++; - if (b0 & 0x80) { // if top bit is 1 (0x80 = 10000000) - sz += (b0 & 0x7f) + 1; // get lower 7 bits + 1 (0x7f = 01111111) - pal += 3 * ((b0 & 0x7f) + 1); - } else if (b0 & 0x40) { // if top 2 bits are 01 (0x40 = 01000000) - byte c = (b0 & 0x3f) + 1; // get lower 6 bits + 1 (0x3f = 00111111) - uint s = 3 * *p++; - sz += c; - - while (c--) { - *pal++ = oldPalette[s + 0]; - *pal++ = oldPalette[s + 1]; - *pal++ = oldPalette[s + 2]; - s += 3; - } - } else { // top 2 bits are 00 - sz++; - // get the lower 6 bits for each component (0x3f = 00111111) - byte b = b0 & 0x3f; - byte g = (*p++) & 0x3f; - byte r = (*p++) & 0x3f; - - assert(g < 0xc0 && b < 0xc0); - - // upscale to full 8-bit color values by multiplying by 4 - *pal++ = b * 4; - *pal++ = g * 4; - *pal++ = r * 4; - } - } - - _fileStream->seek(startPos + len); - free(chunk); -} +void SmackerDecoder::SmackerAudioTrack::queuePCM(byte *buffer, uint32 bufferSize) { + byte flags = 0; + if (_audioInfo.is16Bits) + flags |= Audio::FLAG_16BITS; + if (_audioInfo.isStereo) + flags |= Audio::FLAG_STEREO; -void SmackerDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelVolume(_audioHandle, getVolume()); + _audioStream->queueBuffer(buffer, bufferSize, DisposeAfterUse::YES, flags); } -void SmackerDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelBalance(_audioHandle, getBalance()); +SmackerDecoder::SmackerVideoTrack *SmackerDecoder::createVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature) const { + return new SmackerVideoTrack(width, height, frameCount, frameRate, flags, signature); } } // End of namespace Video diff --git a/video/smk_decoder.h b/video/smk_decoder.h index 516882e7c8..78a4ded0fc 100644 --- a/video/smk_decoder.h +++ b/video/smk_decoder.h @@ -34,6 +34,7 @@ class QueuingAudioStream; } namespace Common { +class BitStream; class SeekableReadStream; } @@ -56,42 +57,72 @@ class BigHuffmanTree; * - sword2 * - toon */ -class SmackerDecoder : public FixedRateVideoDecoder { +class SmackerDecoder : public AdvancedVideoDecoder { public: - SmackerDecoder(Audio::Mixer *mixer, - Audio::Mixer::SoundType soundType = Audio::Mixer::kSFXSoundType); + SmackerDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kSFXSoundType); virtual ~SmackerDecoder(); - bool loadStream(Common::SeekableReadStream *stream); + virtual bool loadStream(Common::SeekableReadStream *stream); void close(); - bool isVideoLoaded() const { return _fileStream != 0; } - uint16 getWidth() const { return _surface->w; } - uint16 getHeight() const { return _surface->h; } - uint32 getFrameCount() const { return _frameCount; } - uint32 getTime() const; - const Graphics::Surface *decodeNextFrame(); - Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } - const byte *getPalette() { _dirtyPalette = false; return _palette; } - bool hasDirtyPalette() const { return _dirtyPalette; } - virtual void handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize); + bool rewind(); protected: - Common::SeekableReadStream *_fileStream; + void readNextPacket(); + + virtual void handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize); - // VideoDecoder API - void updateVolume(); - void updateBalance(); + class SmackerVideoTrack : public FixedRateVideoTrack { + public: + SmackerVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature); + ~SmackerVideoTrack(); - // FixedRateVideoDecoder API - Common::Rational getFrameRate() const { return _frameRate; } + bool isRewindable() const { return true; } + bool rewind() { _curFrame = -1; return true; } -protected: - void unpackPalette(); - // Possible runs of blocks - uint getBlockRun(int index) { return (index <= 58) ? index + 1 : 128 << (index - 59); } - void queueCompressedBuffer(byte *buffer, uint32 bufferSize, uint32 unpackedSize, int streamNum); + uint16 getWidth() const; + uint16 getHeight() const; + Graphics::PixelFormat getPixelFormat() const; + int getCurFrame() const { return _curFrame; } + int getFrameCount() const { return _frameCount; } + const Graphics::Surface *decodeNextFrame() { return _surface; } + const byte *getPalette() const { _dirtyPalette = false; return _palette; } + bool hasDirtyPalette() const { return _dirtyPalette; } + + void readTrees(Common::BitStream &bs, uint32 mMapSize, uint32 mClrSize, uint32 fullSize, uint32 typeSize); + void increaseCurFrame() { _curFrame++; } + void decodeFrame(Common::BitStream &bs); + void unpackPalette(Common::SeekableReadStream *stream); + + protected: + Common::Rational getFrameRate() const { return _frameRate; } + + Graphics::Surface *_surface; + + private: + Common::Rational _frameRate; + uint32 _flags, _signature; + + byte _palette[3 * 256]; + mutable bool _dirtyPalette; + + int _curFrame; + uint32 _frameCount; + + BigHuffmanTree *_MMapTree; + BigHuffmanTree *_MClrTree; + BigHuffmanTree *_FullTree; + BigHuffmanTree *_TypeTree; + // Possible runs of blocks + static uint getBlockRun(int index) { return (index <= 58) ? index + 1 : 128 << (index - 59); } + }; + + virtual SmackerVideoTrack *createVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature) const; + + Common::SeekableReadStream *_fileStream; + +private: enum AudioCompression { kCompressionNone, kCompressionDPCM, @@ -120,6 +151,25 @@ protected: uint32 dummy; } _header; + class SmackerAudioTrack : public AudioTrack { + public: + SmackerAudioTrack(const AudioInfo &audioInfo, Audio::Mixer::SoundType soundType); + ~SmackerAudioTrack(); + + Audio::Mixer::SoundType getSoundType() const { return _soundType; } + + void queueCompressedBuffer(byte *buffer, uint32 bufferSize, uint32 unpackedSize); + void queuePCM(byte *buffer, uint32 bufferSize); + + protected: + Audio::AudioStream *getAudioStream() const; + + private: + Audio::Mixer::SoundType _soundType; + Audio::QueuingAudioStream *_audioStream; + AudioInfo _audioInfo; + }; + uint32 *_frameSizes; // The FrameTypes section of a Smacker file contains an array of bytes, where // the 8 bits of each byte describe the contents of the corresponding frame. @@ -127,25 +177,10 @@ protected: // and so on), so there can be up to 7 different audio tracks. When the lowest bit // (bit 0) is set, it denotes a frame that contains a palette record byte *_frameTypes; - byte *_frameData; - // The RGB palette - byte _palette[3 * 256]; - bool _dirtyPalette; - Common::Rational _frameRate; - uint32 _frameCount; - Graphics::Surface *_surface; + uint32 _firstFrameStart; Audio::Mixer::SoundType _soundType; - Audio::Mixer *_mixer; - bool _audioStarted; - Audio::QueuingAudioStream *_audioStream; - Audio::SoundHandle _audioHandle; - - BigHuffmanTree *_MMapTree; - BigHuffmanTree *_MClrTree; - BigHuffmanTree *_FullTree; - BigHuffmanTree *_TypeTree; }; } // End of namespace Video -- cgit v1.2.3 From 3d395545cb1514ba4a07a785e58782462a3b1a94 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 24 Jul 2012 04:07:08 +0300 Subject: SCI: Remove unused variables --- engines/sci/graphics/palette.h | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 5b9ae9e016..6774094810 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -129,7 +129,6 @@ private: uint16 _totalScreenColors; bool _remapOn; - uint16 _remappingBaseR, _remappingBaseG, _remappingBaseB; uint16 _remappingPercent; void loadMacIconBarPalette(); -- cgit v1.2.3 From 45354676ebe14df8d382681621f1d994258dbb72 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Mon, 23 Jul 2012 22:28:10 +0100 Subject: OPENPANDORA: Move SDL_CreateCursor hacklet from init to loadGFXMode. * Fixes a bug that can occur on load. --- backends/graphics/gph/gph-graphics.cpp | 3 +- backends/graphics/openpandora/op-graphics.cpp | 22 ++++++++++- backends/platform/openpandora/op-backend.cpp | 55 --------------------------- 3 files changed, 22 insertions(+), 58 deletions(-) diff --git a/backends/graphics/gph/gph-graphics.cpp b/backends/graphics/gph/gph-graphics.cpp index 8521e88eaf..5d4baefc6e 100644 --- a/backends/graphics/gph/gph-graphics.cpp +++ b/backends/graphics/gph/gph-graphics.cpp @@ -36,7 +36,8 @@ static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { }; GPHGraphicsManager::GPHGraphicsManager(SdlEventSource *sdlEventSource) - : SurfaceSdlGraphicsManager(sdlEventSource) { + : SurfaceSdlGraphicsManager(sdlEventSource), + _cursorDontScale(true) { } const OSystem::GraphicsMode *GPHGraphicsManager::getSupportedGraphicsModes() const { diff --git a/backends/graphics/openpandora/op-graphics.cpp b/backends/graphics/openpandora/op-graphics.cpp index 5f0301a0c8..1a3d7d3e2e 100644 --- a/backends/graphics/openpandora/op-graphics.cpp +++ b/backends/graphics/openpandora/op-graphics.cpp @@ -31,17 +31,35 @@ #include "common/mutex.h" #include "common/textconsole.h" +static SDL_Cursor *hiddenCursor; + OPGraphicsManager::OPGraphicsManager(SdlEventSource *sdlEventSource) : SurfaceSdlGraphicsManager(sdlEventSource) { } bool OPGraphicsManager::loadGFXMode() { + + uint8_t hiddenCursorData = 0; + hiddenCursor = SDL_CreateCursor(&hiddenCursorData, &hiddenCursorData, 8, 1, 0, 0); + + /* On the OpenPandora we need to work around an SDL assumption that + returns relative mouse coordinates when you get to the screen + edges using the touchscreen. The workaround is to set a blank + SDL cursor and not disable it (Hackish I know). + + The root issues likes in the Windows Manager GRAB code in SDL. + That is why the issue is not seen on framebuffer devices like the + GP2X (there is no X window manager ;)). + */ + SDL_ShowCursor(SDL_ENABLE); + SDL_SetCursor(hiddenCursor); + /* FIXME: For now we just cheat and set the overlay to 640*480 not 800*480 and let SDL deal with the boarders (it saves cleaning up the overlay when the game screen is smaller than the overlay ;) */ - _videoMode.overlayWidth = 640; - _videoMode.overlayHeight = 480; + //_videoMode.overlayWidth = 640; + //_videoMode.overlayHeight = 480; _videoMode.fullscreen = true; if (_videoMode.screenHeight != 200 && _videoMode.screenHeight != 400) diff --git a/backends/platform/openpandora/op-backend.cpp b/backends/platform/openpandora/op-backend.cpp index dcec387f97..47cff1c740 100644 --- a/backends/platform/openpandora/op-backend.cpp +++ b/backends/platform/openpandora/op-backend.cpp @@ -54,8 +54,6 @@ /* Dump console info to files. */ #define DUMP_STDOUT -static SDL_Cursor *hiddenCursor; - OSystem_OP::OSystem_OP() : OSystem_POSIX() { @@ -179,32 +177,12 @@ void OSystem_OP::initBackend() { /* Make sure SDL knows that we have a joystick we want to use. */ ConfMan.setInt("joystick_num", 0); -// _graphicsMutex = createMutex(); - /* Pass to POSIX method to do the heavy lifting */ OSystem_POSIX::initBackend(); _inited = true; } -// enable joystick -// if (joystick_num > -1 && SDL_NumJoysticks() > 0) { -// printf("Using joystick: %s\n", SDL_JoystickName(0)); -// _joystick = SDL_JoystickOpen(joystick_num); -// } -// -// setupMixer(); - -// Note: We could implement a custom SDLTimerManager by using -// SDL_AddTimer. That might yield better timer resolution, but it would -// also change the semantics of a timer: Right now, ScummVM timers -// *never* run in parallel, due to the way they are implemented. If we -// switched to SDL_AddTimer, each timer might run in a separate thread. -// However, not all our code is prepared for that, so we can't just -// switch. Still, it's a potential future change to keep in mind. -// _timer = new DefaultTimerManager(); -// _timerID = SDL_AddTimer(10, &timer_handler, _timer); - void OSystem_OP::initSDL() { // Check if SDL has not been initialized if (!_initedSDL) { @@ -217,38 +195,7 @@ void OSystem_OP::initSDL() { if (SDL_Init(sdlFlags) == -1) error("Could not initialize SDL: %s", SDL_GetError()); - uint8_t hiddenCursorData = 0; - - hiddenCursor = SDL_CreateCursor(&hiddenCursorData, &hiddenCursorData, 8, 1, 0, 0); - - /* On the OpenPandora we need to work around an SDL assumption that - returns relative mouse coordinates when you get to the screen - edges using the touchscreen. The workaround is to set a blank - SDL cursor and not disable it (Hackish I know). - - The root issues likes in the Windows Manager GRAB code in SDL. - That is why the issue is not seen on framebuffer devices like the - GP2X (there is no X window manager ;)). - */ - SDL_ShowCursor(SDL_ENABLE); - SDL_SetCursor(hiddenCursor); - SDL_EnableUNICODE(1); - -// memset(&_oldVideoMode, 0, sizeof(_oldVideoMode)); -// memset(&_videoMode, 0, sizeof(_videoMode)); -// memset(&_transactionDetails, 0, sizeof(_transactionDetails)); - -// _videoMode.mode = GFX_DOUBLESIZE; -// _videoMode.scaleFactor = 2; -// _videoMode.aspectRatioCorrection = ConfMan.getBool("aspect_ratio"); -// _scalerProc = Normal2x; -// _scalerType = 0; - -// _videoMode.fullscreen = true; - _initedSDL = true; - -// OSystem_POSIX::initSDL(); } } @@ -275,8 +222,6 @@ void OSystem_OP::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { void OSystem_OP::quit() { - SDL_FreeCursor(hiddenCursor); - #ifdef DUMP_STDOUT printf("%s\n", "Debug: STDOUT and STDERR text files closed."); fclose(stdout); -- cgit v1.2.3 From 6f978ee78b19be19329adef2618d814012440071 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Tue, 24 Jul 2012 10:05:42 +0100 Subject: OPENPANDORA: Free hiddenCursor on unloadGFXMode and cleanup screen setup. * Also remove some old cruft in the form of commented code. --- backends/graphics/openpandora/op-graphics.cpp | 27 ++++++++++++++++++++------- backends/graphics/openpandora/op-graphics.h | 23 +---------------------- 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/backends/graphics/openpandora/op-graphics.cpp b/backends/graphics/openpandora/op-graphics.cpp index 1a3d7d3e2e..f371081fde 100644 --- a/backends/graphics/openpandora/op-graphics.cpp +++ b/backends/graphics/openpandora/op-graphics.cpp @@ -26,7 +26,6 @@ #include "backends/graphics/openpandora/op-graphics.h" #include "backends/events/openpandora/op-events.h" -//#include "backends/platform/openpandora/op-sdl.h" #include "graphics/scaler/aspect.h" #include "common/mutex.h" #include "common/textconsole.h" @@ -54,18 +53,32 @@ bool OPGraphicsManager::loadGFXMode() { SDL_ShowCursor(SDL_ENABLE); SDL_SetCursor(hiddenCursor); - /* FIXME: For now we just cheat and set the overlay to 640*480 not 800*480 and let SDL - deal with the boarders (it saves cleaning up the overlay when the game screen is - smaller than the overlay ;) - */ - //_videoMode.overlayWidth = 640; - //_videoMode.overlayHeight = 480; _videoMode.fullscreen = true; + _videoMode.overlayWidth = _videoMode.screenWidth * _videoMode.scaleFactor; + _videoMode.overlayHeight = _videoMode.screenHeight * _videoMode.scaleFactor; + if (_videoMode.screenHeight != 200 && _videoMode.screenHeight != 400) _videoMode.aspectRatioCorrection = false; + if (_videoMode.aspectRatioCorrection) + _videoMode.overlayHeight = real2Aspect(_videoMode.overlayHeight); + + _videoMode.hardwareWidth = _videoMode.screenWidth * _videoMode.scaleFactor; + _videoMode.hardwareHeight = effectiveScreenHeight(); + return SurfaceSdlGraphicsManager::loadGFXMode(); } +void OPGraphicsManager::unloadGFXMode() { + + uint8_t hiddenCursorData = 0; + hiddenCursor = SDL_CreateCursor(&hiddenCursorData, &hiddenCursorData, 8, 1, 0, 0); + + // Free the hidden SDL cursor created in loadGFXMode + SDL_FreeCursor(hiddenCursor); + + SurfaceSdlGraphicsManager::unloadGFXMode(); +} + #endif diff --git a/backends/graphics/openpandora/op-graphics.h b/backends/graphics/openpandora/op-graphics.h index 0b3eeae8ec..2e3d63e3ad 100644 --- a/backends/graphics/openpandora/op-graphics.h +++ b/backends/graphics/openpandora/op-graphics.h @@ -24,7 +24,6 @@ #define BACKENDS_GRAPHICS_OP_H #include "backends/graphics/surfacesdl/surfacesdl-graphics.h" -#include "graphics/scaler/aspect.h" // for aspect2Real #include "graphics/scaler/downscaler.h" enum { @@ -35,28 +34,8 @@ class OPGraphicsManager : public SurfaceSdlGraphicsManager { public: OPGraphicsManager(SdlEventSource *sdlEventSource); -// bool hasFeature(OSystem::Feature f); -// void setFeatureState(OSystem::Feature f, bool enable); -// bool getFeatureState(OSystem::Feature f); -// int getDefaultGraphicsMode() const; - -// void initSize(uint w, uint h, const Graphics::PixelFormat *format = NULL); -// const OSystem::GraphicsMode *getSupportedGraphicsModes() const; -// bool setGraphicsMode(const char *name); -// bool setGraphicsMode(int mode); -// void setGraphicsModeIntern(); -// void internUpdateScreen(); -// void showOverlay(); -// void hideOverlay(); bool loadGFXMode(); -// void drawMouse(); -// void undrawMouse(); -// virtual void warpMouse(int x, int y); - -// SurfaceSdlGraphicsManager::MousePos *getMouseCurState(); -// SurfaceSdlGraphicsManager::VideoState *getVideoMode(); - -// virtual void adjustMouseEvent(const Common::Event &event); + void unloadGFXMode(); }; #endif /* BACKENDS_GRAPHICS_OP_H */ -- cgit v1.2.3 From b157269ff432c8ed08352683c1d6c7c4c246e429 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Tue, 24 Jul 2012 10:07:32 +0100 Subject: OPENPANDORA: Clean up old commented code. --- backends/platform/openpandora/op-backend.cpp | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/backends/platform/openpandora/op-backend.cpp b/backends/platform/openpandora/op-backend.cpp index 47cff1c740..b2d53f9fb5 100644 --- a/backends/platform/openpandora/op-backend.cpp +++ b/backends/platform/openpandora/op-backend.cpp @@ -59,11 +59,6 @@ OSystem_OP::OSystem_OP() OSystem_POSIX() { } -//static Uint32 timer_handler(Uint32 interval, void *param) { -// ((DefaultTimerManager *)param)->handler(); -// return interval; -//} - void OSystem_OP::initBackend() { assert(!_inited); @@ -77,28 +72,6 @@ void OSystem_OP::initBackend() { _graphicsManager = new OPGraphicsManager(_eventSource); } -// int joystick_num = ConfMan.getInt("joystick_num"); -// uint32 sdlFlags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER; -// -// if (ConfMan.hasKey("disable_sdl_parachute")) -// sdlFlags |= SDL_INIT_NOPARACHUTE; -// -// if (joystick_num > -1) -// sdlFlags |= SDL_INIT_JOYSTICK; -// -// if (SDL_Init(sdlFlags) == -1) { -// error("Could not initialize SDL: %s", SDL_GetError()); -// } -// - - // Create the mixer manager -// if (_mixer == 0) { -// _mixerManager = new DoubleBufferSDLMixerManager(); - - // Setup and start mixer -// _mixerManager->init(); -// } - /* Setup default save path to be workingdir/saves */ char savePath[PATH_MAX+1]; -- cgit v1.2.3 From d83764f05591ab552316fb6aa59ac92abc7c4680 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Tue, 24 Jul 2012 10:12:54 +0100 Subject: GPH: Fix accidental commit. * I did not mean to commit any of the GPH backend with the OP stuff. Cleanup of this backend will follow later. --- backends/graphics/gph/gph-graphics.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backends/graphics/gph/gph-graphics.cpp b/backends/graphics/gph/gph-graphics.cpp index 5d4baefc6e..8521e88eaf 100644 --- a/backends/graphics/gph/gph-graphics.cpp +++ b/backends/graphics/gph/gph-graphics.cpp @@ -36,8 +36,7 @@ static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { }; GPHGraphicsManager::GPHGraphicsManager(SdlEventSource *sdlEventSource) - : SurfaceSdlGraphicsManager(sdlEventSource), - _cursorDontScale(true) { + : SurfaceSdlGraphicsManager(sdlEventSource) { } const OSystem::GraphicsMode *GPHGraphicsManager::getSupportedGraphicsModes() const { -- cgit v1.2.3 From 84e0b3a167fb282fb7e29614a9806f665af844c2 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 24 Jul 2012 13:23:45 -0400 Subject: VIDEO: Add helper functions to easily add an external audio track --- video/video_decoder.cpp | 11 +++++++++++ video/video_decoder.h | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 97f8eec7bb..1461f5dc3d 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -521,6 +521,17 @@ void AdvancedVideoDecoder::addTrack(Track *track) { track->start(); } +bool AdvancedVideoDecoder::addStreamFileTrack(const Common::String &baseName) { + StreamFileAudioTrack *track = new StreamFileAudioTrack(); + + bool result = track->loadFromFile(baseName); + + if (result) + addTrack(track); + + return result; +} + AdvancedVideoDecoder::Track *AdvancedVideoDecoder::getTrack(uint track) { if (track > _tracks.size()) return 0; diff --git a/video/video_decoder.h b/video/video_decoder.h index efc8f7a37d..616d6c4f96 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -365,6 +365,11 @@ public: */ virtual Audio::Timestamp getDuration() const; + /** + * Add an audio track from a stream file. + */ + bool addStreamFileTrack(const Common::String &baseName); + // Future API //void setRate(const Common::Rational &rate); //Common::Rational getRate() const; -- cgit v1.2.3 From 3117e4a8ff12c3a2ba4f2d4c69e8539040d49eb0 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 24 Jul 2012 13:24:01 -0400 Subject: VIDEO: Convert DXADecoder to the AdvancedVideoDecoder API --- engines/agos/animation.cpp | 80 ++++++++++++-------------- engines/agos/animation.h | 5 +- engines/sword1/animation.cpp | 74 ++++++++---------------- engines/sword1/animation.h | 32 ++++------- engines/sword1/logic.cpp | 2 +- engines/sword2/animation.cpp | 62 ++++++--------------- engines/sword2/animation.h | 30 ++++------ engines/sword2/function.cpp | 2 +- video/dxa_decoder.cpp | 130 ++++++++++++++++++++----------------------- video/dxa_decoder.h | 102 ++++++++++++++++++--------------- 10 files changed, 215 insertions(+), 304 deletions(-) diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp index 3e8488d7d5..ec8293c91f 100644 --- a/engines/agos/animation.cpp +++ b/engines/agos/animation.cpp @@ -260,9 +260,6 @@ bool MoviePlayerDXA::load() { debug(0, "Playing video %s", videoName.c_str()); CursorMan.showMouse(false); - - _firstFrameOffset = _fileStream->pos(); - return true; } @@ -302,35 +299,6 @@ void MoviePlayerDXA::stopVideo() { } void MoviePlayerDXA::startSound() { - uint32 offset, size; - - if (getSoundTag() == MKTAG('W','A','V','E')) { - size = _fileStream->readUint32BE(); - - if (_sequenceNum) { - Common::File in; - - _fileStream->seek(size, SEEK_CUR); - - in.open("audio.wav"); - if (!in.isOpen()) { - error("Can't read offset file 'audio.wav'"); - } - - in.seek(_sequenceNum * 8, SEEK_SET); - offset = in.readUint32LE(); - size = in.readUint32LE(); - - in.seek(offset, SEEK_SET); - _bgSoundStream = Audio::makeWAVStream(in.readStream(size), DisposeAfterUse::YES); - in.close(); - } else { - _bgSoundStream = Audio::makeWAVStream(_fileStream->readStream(size), DisposeAfterUse::YES); - } - } else { - _bgSoundStream = Audio::SeekableAudioStream::openStreamFile(baseName); - } - if (_bgSoundStream != NULL) { _vm->_mixer->stopHandle(_bgSound); _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream, -1, getVolume(), getBalance()); @@ -344,8 +312,7 @@ void MoviePlayerDXA::nextFrame() { } if (_vm->_interactiveVideo == TYPE_LOOPING && endOfVideo()) { - _fileStream->seek(_firstFrameOffset); - _curFrame = -1; + rewind(); startSound(); } @@ -374,13 +341,15 @@ bool MoviePlayerDXA::processFrame() { copyFrameToBuffer((byte *)screen->pixels, (_vm->_screenWidth - getWidth()) / 2, (_vm->_screenHeight - getHeight()) / 2, screen->pitch); _vm->_system->unlockScreen(); - Common::Rational soundTime(_mixer->getSoundElapsedTime(_bgSound), 1000); - if ((_bgSoundStream == NULL) || ((soundTime * getFrameRate()).toInt() / 1000 < getCurFrame() + 1)) { + uint32 soundTime = _mixer->getSoundElapsedTime(_bgSound); + uint32 nextFrameStartTime = ((Video::AdvancedVideoDecoder::VideoTrack *)getTrack(0))->getNextFrameStartTime(); + + if ((_bgSoundStream == NULL) || soundTime < nextFrameStartTime) { if (_bgSoundStream && _mixer->isSoundHandleActive(_bgSound)) { - while (_mixer->isSoundHandleActive(_bgSound) && (soundTime * getFrameRate()).toInt() < getCurFrame()) { + while (_mixer->isSoundHandleActive(_bgSound) && soundTime < nextFrameStartTime) { _vm->_system->delayMillis(10); - soundTime = Common::Rational(_mixer->getSoundElapsedTime(_bgSound), 1000); + soundTime = _mixer->getSoundElapsedTime(_bgSound); } // In case the background sound ends prematurely, update // _ticks so that we can still fall back on the no-sound @@ -399,14 +368,35 @@ bool MoviePlayerDXA::processFrame() { return false; } -void MoviePlayerDXA::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(_bgSound)) - g_system->getMixer()->setChannelVolume(_bgSound, getVolume()); -} +void MoviePlayerDXA::readSoundData(Common::SeekableReadStream *stream) { + uint32 tag = stream->readUint32BE(); + + if (tag == MKTAG('W','A','V','E')) { + uint32 size = stream->readUint32BE(); + + if (_sequenceNum) { + Common::File in; + + stream->skip(size); + + in.open("audio.wav"); + if (!in.isOpen()) { + error("Can't read offset file 'audio.wav'"); + } + + in.seek(_sequenceNum * 8, SEEK_SET); + uint32 offset = in.readUint32LE(); + size = in.readUint32LE(); -void MoviePlayerDXA::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(_bgSound)) - g_system->getMixer()->setChannelBalance(_bgSound, getBalance()); + in.seek(offset, SEEK_SET); + _bgSoundStream = Audio::makeWAVStream(in.readStream(size), DisposeAfterUse::YES); + in.close(); + } else { + _bgSoundStream = Audio::makeWAVStream(stream->readStream(size), DisposeAfterUse::YES); + } + } else { + _bgSoundStream = Audio::SeekableAudioStream::openStreamFile(baseName); + } } /////////////////////////////////////////////////////////////////////////////// diff --git a/engines/agos/animation.h b/engines/agos/animation.h index 37a666b201..9e31fced6d 100644 --- a/engines/agos/animation.h +++ b/engines/agos/animation.h @@ -81,16 +81,13 @@ public: virtual void stopVideo(); protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); + void readSoundData(Common::SeekableReadStream *stream); private: void handleNextFrame(); bool processFrame(); void startSound(); void copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch); - uint32 _firstFrameOffset; }; class MoviePlayerSMK : public MoviePlayer, Video::SmackerDecoder { diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index 8f863d1e09..70f1e5dc03 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -37,6 +37,7 @@ #include "gui/message.h" +#include "video/dxa_decoder.h" #include "video/psx_decoder.h" #include "video/smk_decoder.h" @@ -96,9 +97,8 @@ static const char *const sequenceListPSX[20] = { // Basic movie player /////////////////////////////////////////////////////////////////////////////// -MoviePlayer::MoviePlayer(SwordEngine *vm, Text *textMan, ResMan *resMan, Audio::Mixer *snd, OSystem *system, Audio::SoundHandle *bgSoundHandle, Video::VideoDecoder *decoder, DecoderType decoderType) - : _vm(vm), _textMan(textMan), _resMan(resMan), _snd(snd), _bgSoundHandle(bgSoundHandle), _system(system) { - _bgSoundStream = NULL; +MoviePlayer::MoviePlayer(SwordEngine *vm, Text *textMan, ResMan *resMan, OSystem *system, Video::VideoDecoder *decoder, DecoderType decoderType) + : _vm(vm), _textMan(textMan), _resMan(resMan), _system(system) { _decoderType = decoderType; _decoder = decoder; @@ -107,7 +107,6 @@ MoviePlayer::MoviePlayer(SwordEngine *vm, Text *textMan, ResMan *resMan, Audio:: } MoviePlayer::~MoviePlayer() { - delete _bgSoundHandle; delete _decoder; } @@ -116,16 +115,12 @@ MoviePlayer::~MoviePlayer() { * @param id the id of the file */ bool MoviePlayer::load(uint32 id) { - Common::File f; Common::String filename; - if (_decoderType == kVideoDecoderDXA) - _bgSoundStream = Audio::SeekableAudioStream::openStreamFile(sequenceList[id]); - else - _bgSoundStream = NULL; - if (SwordEngine::_systemVars.showText) { + Common::File f; filename = Common::String::format("%s.txt", sequenceList[id]); + if (f.open(filename)) { Common::String line; int lineNo = 0; @@ -169,7 +164,6 @@ bool MoviePlayer::load(uint32 id) { _movieTexts.push_back(MovieText(startFrame, endFrame, ptr, color)); lastEnd = endFrame; } - f.close(); } } @@ -179,13 +173,6 @@ bool MoviePlayer::load(uint32 id) { break; case kVideoDecoderSMK: filename = Common::String::format("%s.smk", sequenceList[id]); - - if (_decoder->loadFile(filename)) { - ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete - return true; - } else { - return false; - } break; case kVideoDecoderPSX: filename = Common::String::format("%s.str", (_vm->_systemVars.isDemo) ? sequenceList[id] : sequenceListPSX[id]); @@ -205,30 +192,27 @@ bool MoviePlayer::load(uint32 id) { break; } - return _decoder->loadFile(filename.c_str()); -} + if (!_decoder->loadFile(filename)) + return false; -void MoviePlayer::play() { - if (_bgSoundStream) - _snd->playStream(Audio::Mixer::kSFXSoundType, _bgSoundHandle, _bgSoundStream); + // For DXA, also add the external sound file + if (_decoderType == kVideoDecoderDXA) + ((Video::AdvancedVideoDecoder *)_decoder)->addStreamFileTrack(sequenceList[id]); - bool terminated = false; + ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete + return true; +} +void MoviePlayer::play() { _textX = 0; _textY = 0; - terminated = !playVideo(); - - if (terminated) - _snd->stopHandle(*_bgSoundHandle); + playVideo(); _textMan->releaseText(2, false); _movieTexts.clear(); - while (_snd->isSoundHandleActive(*_bgSoundHandle)) - _system->delayMillis(100); - // It's tempting to call _screen->fullRefresh() here to restore the old // palette. However, that causes glitches with DXA movies, where the // previous location would be momentarily drawn, before switching to @@ -514,24 +498,12 @@ void MoviePlayer::drawFramePSX(const Graphics::Surface *frame) { scaledFrame.free(); } -DXADecoderWithSound::DXADecoderWithSound(Audio::Mixer *mixer, Audio::SoundHandle *bgSoundHandle) - : _mixer(mixer), _bgSoundHandle(bgSoundHandle) { -} - -uint32 DXADecoderWithSound::getTime() const { - if (_mixer->isSoundHandleActive(*_bgSoundHandle)) - return _mixer->getSoundElapsedTime(*_bgSoundHandle); - - return DXADecoder::getTime(); -} - /////////////////////////////////////////////////////////////////////////////// // Factory function for creating the appropriate cutscene player /////////////////////////////////////////////////////////////////////////////// -MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan *resMan, Audio::Mixer *snd, OSystem *system) { +MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan *resMan, OSystem *system) { Common::String filename; - Audio::SoundHandle *bgSoundHandle = new Audio::SoundHandle; // For the PSX version, we'll try the PlayStation stream files if (vm->isPsx()) { @@ -542,7 +514,7 @@ MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan * #ifdef USE_RGB_COLOR // All BS1 PSX videos run the videos at 2x speed Video::VideoDecoder *psxDecoder = new Video::PSXStreamDecoder(Video::PSXStreamDecoder::kCD2x); - return new MoviePlayer(vm, textMan, resMan, snd, system, bgSoundHandle, psxDecoder, kVideoDecoderPSX); + return new MoviePlayer(vm, textMan, resMan, system, psxDecoder, kVideoDecoderPSX); #else GUI::MessageDialog dialog(Common::String::format(_("PSX stream cutscene '%s' cannot be played in paletted mode"), filename.c_str()), _("OK")); dialog.runModal(); @@ -555,19 +527,19 @@ MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan * if (Common::File::exists(filename)) { Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(); - return new MoviePlayer(vm, textMan, resMan, snd, system, bgSoundHandle, smkDecoder, kVideoDecoderSMK); + return new MoviePlayer(vm, textMan, resMan, system, smkDecoder, kVideoDecoderSMK); } filename = Common::String::format("%s.dxa", sequenceList[id]); if (Common::File::exists(filename)) { #ifdef USE_ZLIB - DXADecoderWithSound *dxaDecoder = new DXADecoderWithSound(snd, bgSoundHandle); - return new MoviePlayer(vm, textMan, resMan, snd, system, bgSoundHandle, dxaDecoder, kVideoDecoderDXA); + Video::VideoDecoder *dxaDecoder = new Video::DXADecoder(); + return new MoviePlayer(vm, textMan, resMan, system, dxaDecoder, kVideoDecoderDXA); #else GUI::MessageDialog dialog(_("DXA cutscenes found but ScummVM has been built without zlib support"), _("OK")); dialog.runModal(); - return NULL; + return 0; #endif } @@ -577,7 +549,7 @@ MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan * if (Common::File::exists(filename)) { GUI::MessageDialog dialog(_("MPEG2 cutscenes are no longer supported"), _("OK")); dialog.runModal(); - return NULL; + return 0; } if (!vm->isPsx() || scumm_stricmp(sequenceList[id], "enddemo") != 0) { @@ -586,7 +558,7 @@ MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan * dialog.runModal(); } - return NULL; + return 0; } } // End of namespace Sword1 diff --git a/engines/sword1/animation.h b/engines/sword1/animation.h index c2ed86a1a3..d0c61f5eb3 100644 --- a/engines/sword1/animation.h +++ b/engines/sword1/animation.h @@ -23,16 +23,19 @@ #ifndef SWORD1_ANIMATION_H #define SWORD1_ANIMATION_H -#include "video/dxa_decoder.h" -#include "video/video_decoder.h" - #include "common/list.h" -#include "audio/audiostream.h" - #include "sword1/screen.h" #include "sword1/sound.h" +namespace Graphics { +struct Surface; +} + +namespace Video { +class VideoDecoder; +} + namespace Sword1 { enum DecoderType { @@ -55,21 +58,9 @@ public: } }; -class DXADecoderWithSound : public Video::DXADecoder { -public: - DXADecoderWithSound(Audio::Mixer *mixer, Audio::SoundHandle *bgSoundHandle); - ~DXADecoderWithSound() {} - - uint32 getTime() const; - -private: - Audio::Mixer *_mixer; - Audio::SoundHandle *_bgSoundHandle; -}; - class MoviePlayer { public: - MoviePlayer(SwordEngine *vm, Text *textMan, ResMan *resMan, Audio::Mixer *snd, OSystem *system, Audio::SoundHandle *bgSoundHandle, Video::VideoDecoder *decoder, DecoderType decoderType); + MoviePlayer(SwordEngine *vm, Text *textMan, ResMan *resMan, OSystem *system, Video::VideoDecoder *decoder, DecoderType decoderType); virtual ~MoviePlayer(); bool load(uint32 id); void play(); @@ -78,7 +69,6 @@ protected: SwordEngine *_vm; Text *_textMan; ResMan *_resMan; - Audio::Mixer *_snd; OSystem *_system; Common::List _movieTexts; int _textX, _textY, _textWidth, _textHeight; @@ -88,8 +78,6 @@ protected: DecoderType _decoderType; Video::VideoDecoder *_decoder; - Audio::SoundHandle *_bgSoundHandle; - Audio::AudioStream *_bgSoundStream; bool playVideo(); void performPostProcessing(byte *screen); @@ -100,7 +88,7 @@ protected: void convertColor(byte r, byte g, byte b, float &h, float &s, float &v); }; -MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan *resMan, Audio::Mixer *snd, OSystem *system); +MoviePlayer *makeMoviePlayer(uint32 id, SwordEngine *vm, Text *textMan, ResMan *resMan, OSystem *system); } // End of namespace Sword1 diff --git a/engines/sword1/logic.cpp b/engines/sword1/logic.cpp index 8e04861edf..757d768780 100644 --- a/engines/sword1/logic.cpp +++ b/engines/sword1/logic.cpp @@ -959,7 +959,7 @@ int Logic::fnPlaySequence(Object *cpt, int32 id, int32 sequenceId, int32 d, int3 // meantime, we don't want any looping sound effects still playing. _sound->quitScreen(); - MoviePlayer *player = makeMoviePlayer(sequenceId, _vm, _textMan, _resMan, _mixer, _system); + MoviePlayer *player = makeMoviePlayer(sequenceId, _vm, _textMan, _resMan, _system); if (player) { _screen->clearScreen(); if (player->load(sequenceId)) diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index e257ec9029..e603925e73 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -40,6 +40,7 @@ #include "gui/message.h" +#include "video/dxa_decoder.h" #include "video/smk_decoder.h" #include "video/psx_decoder.h" @@ -51,9 +52,8 @@ namespace Sword2 { // Basic movie player /////////////////////////////////////////////////////////////////////////////// -MoviePlayer::MoviePlayer(Sword2Engine *vm, Audio::Mixer *snd, OSystem *system, Audio::SoundHandle *bgSoundHandle, Video::VideoDecoder *decoder, DecoderType decoderType) - : _vm(vm), _snd(snd), _bgSoundHandle(bgSoundHandle), _system(system) { - _bgSoundStream = NULL; +MoviePlayer::MoviePlayer(Sword2Engine *vm, OSystem *system, Video::VideoDecoder *decoder, DecoderType decoderType) + : _vm(vm), _system(system) { _decoderType = decoderType; _decoder = decoder; @@ -62,7 +62,6 @@ MoviePlayer::MoviePlayer(Sword2Engine *vm, Audio::Mixer *snd, OSystem *system, A } MoviePlayer::~MoviePlayer() { - delete _bgSoundHandle; delete _decoder; } @@ -75,11 +74,6 @@ bool MoviePlayer::load(const char *name) { if (_vm->shouldQuit()) return false; - if (_decoderType == kVideoDecoderDXA) - _bgSoundStream = Audio::SeekableAudioStream::openStreamFile(name); - else - _bgSoundStream = NULL; - _textSurface = NULL; Common::String filename; @@ -89,13 +83,6 @@ bool MoviePlayer::load(const char *name) { break; case kVideoDecoderSMK: filename = Common::String::format("%s.smk", name); - - if (_decoder->loadFile(filename)) { - ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete - return true; - } else { - return false; - } break; case kVideoDecoderPSX: filename = Common::String::format("%s.str", name); @@ -114,7 +101,15 @@ bool MoviePlayer::load(const char *name) { } } - return _decoder->loadFile(filename.c_str()); + if (!_decoder->loadFile(filename)) + return false; + + // For DXA, also add the external sound file + if (_decoderType == kVideoDecoderDXA) + ((Video::AdvancedVideoDecoder *)_decoder)->addStreamFileTrack(name); + + ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete + return true; } void MoviePlayer::play(MovieText *movieTexts, uint32 numMovieTexts, uint32 leadIn, uint32 leadOut) { @@ -130,24 +125,15 @@ void MoviePlayer::play(MovieText *movieTexts, uint32 numMovieTexts, uint32 leadI if (leadIn) _vm->_sound->playMovieSound(leadIn, kLeadInSound); - if (_bgSoundStream) - _snd->playStream(Audio::Mixer::kSFXSoundType, _bgSoundHandle, _bgSoundStream); - - bool terminated = false; - - terminated = !playVideo(); + bool terminated = !playVideo(); closeTextObject(_currentMovieText, NULL, 0); if (terminated) { - _snd->stopHandle(*_bgSoundHandle); _vm->_sound->stopMovieSounds(); _vm->_sound->stopSpeech(); } - while (_snd->isSoundHandleActive(*_bgSoundHandle)) - _system->delayMillis(100); - if (_decoderType == kVideoDecoderPSX) { // Need to jump back to paletted color initGraphics(640, 480, true); @@ -414,31 +400,19 @@ void MoviePlayer::drawFramePSX(const Graphics::Surface *frame) { scaledFrame.free(); } -DXADecoderWithSound::DXADecoderWithSound(Audio::Mixer *mixer, Audio::SoundHandle *bgSoundHandle) - : _mixer(mixer), _bgSoundHandle(bgSoundHandle) { -} - -uint32 DXADecoderWithSound::getTime() const { - if (_mixer->isSoundHandleActive(*_bgSoundHandle)) - return _mixer->getSoundElapsedTime(*_bgSoundHandle); - - return DXADecoder::getTime(); -} - /////////////////////////////////////////////////////////////////////////////// // Factory function for creating the appropriate cutscene player /////////////////////////////////////////////////////////////////////////////// -MoviePlayer *makeMoviePlayer(const char *name, Sword2Engine *vm, Audio::Mixer *snd, OSystem *system, uint32 frameCount) { +MoviePlayer *makeMoviePlayer(const char *name, Sword2Engine *vm, OSystem *system, uint32 frameCount) { Common::String filename; - Audio::SoundHandle *bgSoundHandle = new Audio::SoundHandle; filename = Common::String::format("%s.str", name); if (Common::File::exists(filename)) { #ifdef USE_RGB_COLOR Video::VideoDecoder *psxDecoder = new Video::PSXStreamDecoder(Video::PSXStreamDecoder::kCD2x, frameCount); - return new MoviePlayer(vm, snd, system, bgSoundHandle, psxDecoder, kVideoDecoderPSX); + return new MoviePlayer(vm, system, psxDecoder, kVideoDecoderPSX); #else GUI::MessageDialog dialog(_("PSX cutscenes found but ScummVM has been built without RGB color support"), _("OK")); dialog.runModal(); @@ -450,15 +424,15 @@ MoviePlayer *makeMoviePlayer(const char *name, Sword2Engine *vm, Audio::Mixer *s if (Common::File::exists(filename)) { Video::SmackerDecoder *smkDecoder = new Video::SmackerDecoder(); - return new MoviePlayer(vm, snd, system, bgSoundHandle, smkDecoder, kVideoDecoderSMK); + return new MoviePlayer(vm, system, smkDecoder, kVideoDecoderSMK); } filename = Common::String::format("%s.dxa", name); if (Common::File::exists(filename)) { #ifdef USE_ZLIB - DXADecoderWithSound *dxaDecoder = new DXADecoderWithSound(snd, bgSoundHandle); - return new MoviePlayer(vm, snd, system, bgSoundHandle, dxaDecoder, kVideoDecoderDXA); + Video::DXADecoder *dxaDecoder = new Video::DXADecoder(); + return new MoviePlayer(vm, system, dxaDecoder, kVideoDecoderDXA); #else GUI::MessageDialog dialog(_("DXA cutscenes found but ScummVM has been built without zlib support"), _("OK")); dialog.runModal(); diff --git a/engines/sword2/animation.h b/engines/sword2/animation.h index 3d5c42b7f7..b2a243b2ca 100644 --- a/engines/sword2/animation.h +++ b/engines/sword2/animation.h @@ -25,12 +25,16 @@ #ifndef SWORD2_ANIMATION_H #define SWORD2_ANIMATION_H -#include "video/dxa_decoder.h" -#include "video/video_decoder.h" -#include "audio/mixer.h" - #include "sword2/screen.h" +namespace Graphics { +struct Surface; +} + +namespace Video { +class VideoDecoder; +} + namespace Sword2 { enum DecoderType { @@ -55,20 +59,9 @@ struct MovieText { } }; -class DXADecoderWithSound : public Video::DXADecoder { -public: - DXADecoderWithSound(Audio::Mixer *mixer, Audio::SoundHandle *bgSoundHandle); - ~DXADecoderWithSound() {} - - uint32 getTime() const; -private: - Audio::Mixer *_mixer; - Audio::SoundHandle *_bgSoundHandle; -}; - class MoviePlayer { public: - MoviePlayer(Sword2Engine *vm, Audio::Mixer *snd, OSystem *system, Audio::SoundHandle *bgSoundHandle, Video::VideoDecoder *decoder, DecoderType decoderType); + MoviePlayer(Sword2Engine *vm, OSystem *system, Video::VideoDecoder *decoder, DecoderType decoderType); virtual ~MoviePlayer(); bool load(const char *name); @@ -76,7 +69,6 @@ public: protected: Sword2Engine *_vm; - Audio::Mixer *_snd; OSystem *_system; MovieText *_movieTexts; uint32 _numMovieTexts; @@ -87,8 +79,6 @@ protected: DecoderType _decoderType; Video::VideoDecoder *_decoder; - Audio::SoundHandle *_bgSoundHandle; - Audio::AudioStream *_bgSoundStream; uint32 _leadOut; int _leadOutFrame; @@ -105,7 +95,7 @@ protected: uint32 getWhiteColor(); }; -MoviePlayer *makeMoviePlayer(const char *name, Sword2Engine *vm, Audio::Mixer *snd, OSystem *system, uint32 frameCount); +MoviePlayer *makeMoviePlayer(const char *name, Sword2Engine *vm, OSystem *system, uint32 frameCount); } // End of namespace Sword2 diff --git a/engines/sword2/function.cpp b/engines/sword2/function.cpp index 836b252d6c..07fcaa094b 100644 --- a/engines/sword2/function.cpp +++ b/engines/sword2/function.cpp @@ -2139,7 +2139,7 @@ int32 Logic::fnPlaySequence(int32 *params) { uint32 frameCount = Sword2Engine::isPsx() ? params[1] : 0; - _moviePlayer = makeMoviePlayer(filename, _vm, _vm->_mixer, _vm->_system, frameCount); + _moviePlayer = makeMoviePlayer(filename, _vm, _vm->_system, frameCount); if (_moviePlayer && _moviePlayer->load(filename)) { _moviePlayer->play(_sequenceTextList, _sequenceTextLines, _smackerLeadIn, _smackerLeadOut); diff --git a/video/dxa_decoder.cpp b/video/dxa_decoder.cpp index 7d1112a59c..5ac9bd2088 100644 --- a/video/dxa_decoder.cpp +++ b/video/dxa_decoder.cpp @@ -37,41 +37,43 @@ namespace Video { DXADecoder::DXADecoder() { - _fileStream = 0; - _surface = 0; - _dirtyPalette = false; +} - _frameBuffer1 = 0; - _frameBuffer2 = 0; - _scaledBuffer = 0; +DXADecoder::~DXADecoder() { + close(); +} - _inBuffer = 0; - _inBufferSize = 0; +bool DXADecoder::loadStream(Common::SeekableReadStream *stream) { + close(); - _decompBuffer = 0; - _decompBufferSize = 0; + uint32 tag = stream->readUint32BE(); - _width = 0; - _height = 0; + if (tag != MKTAG('D','E','X','A')) { + close(); + return false; + } - _frameSize = 0; - _frameCount = 0; - _frameRate = 0; + DXAVideoTrack *track = new DXAVideoTrack(stream); + addTrack(track); - _scaleMode = S_NONE; -} + readSoundData(stream); -DXADecoder::~DXADecoder() { - close(); + track->setFrameStartPos(); + return true; } -bool DXADecoder::loadStream(Common::SeekableReadStream *stream) { - close(); +void DXADecoder::readSoundData(Common::SeekableReadStream *stream) { + // Skip over the tag by default + stream->readUint32BE(); +} +DXADecoder::DXAVideoTrack::DXAVideoTrack(Common::SeekableReadStream *stream) { _fileStream = stream; - - uint32 tag = _fileStream->readUint32BE(); - assert(tag == MKTAG('D','E','X','A')); + _curFrame = -1; + _frameStartOffset = 0; + _decompBuffer = 0; + _inBuffer = 0; + memset(_palette, 0, 256 * 3); uint8 flags = _fileStream->readByte(); _frameCount = _fileStream->readUint16BE(); @@ -105,18 +107,14 @@ bool DXADecoder::loadStream(Common::SeekableReadStream *stream) { _frameSize = _width * _height; _decompBufferSize = _frameSize; - _frameBuffer1 = (uint8 *)malloc(_frameSize); + _frameBuffer1 = new byte[_frameSize]; memset(_frameBuffer1, 0, _frameSize); - _frameBuffer2 = (uint8 *)malloc(_frameSize); + _frameBuffer2 = new byte[_frameSize]; memset(_frameBuffer2, 0, _frameSize); - if (!_frameBuffer1 || !_frameBuffer2) - error("DXADecoder: Error allocating frame buffers (size %u)", _frameSize); _scaledBuffer = 0; if (_scaleMode != S_NONE) { - _scaledBuffer = (uint8 *)malloc(_frameSize); - if (!_scaledBuffer) - error("Error allocating scale buffer (size %u)", _frameSize); + _scaledBuffer = new byte[_frameSize]; memset(_scaledBuffer, 0, _frameSize); } @@ -148,36 +146,33 @@ bool DXADecoder::loadStream(Common::SeekableReadStream *stream) { } while (tag != 0); } #endif - - // Read the sound header - _soundTag = _fileStream->readUint32BE(); - - return true; } -void DXADecoder::close() { - if (!_fileStream) - return; - +DXADecoder::DXAVideoTrack::~DXAVideoTrack() { delete _fileStream; - _fileStream = 0; - delete _surface; - _surface = 0; + delete[] _frameBuffer1; + delete[] _frameBuffer2; + delete[] _scaledBuffer; + delete[] _inBuffer; + delete[] _decompBuffer; +} - free(_frameBuffer1); - free(_frameBuffer2); - free(_scaledBuffer); - free(_inBuffer); - free(_decompBuffer); +bool DXADecoder::DXAVideoTrack::rewind() { + _curFrame = -1; + _fileStream->seek(_frameStartOffset); + return true; +} - _inBuffer = 0; - _decompBuffer = 0; +Graphics::PixelFormat DXADecoder::DXAVideoTrack::getPixelFormat() const { + return _surface->format; +} - reset(); +void DXADecoder::DXAVideoTrack::setFrameStartPos() { + _frameStartOffset = _fileStream->pos(); } -void DXADecoder::decodeZlib(byte *data, int size, int totalSize) { +void DXADecoder::DXAVideoTrack::decodeZlib(byte *data, int size, int totalSize) { #ifdef USE_ZLIB unsigned long dstLen = totalSize; Common::uncompress(data, &dstLen, _inBuffer, size); @@ -187,14 +182,13 @@ void DXADecoder::decodeZlib(byte *data, int size, int totalSize) { #define BLOCKW 4 #define BLOCKH 4 -void DXADecoder::decode12(int size) { +void DXADecoder::DXAVideoTrack::decode12(int size) { #ifdef USE_ZLIB - if (_decompBuffer == NULL) { - _decompBuffer = (byte *)malloc(_decompBufferSize); + if (!_decompBuffer) { + _decompBuffer = new byte[_decompBufferSize]; memset(_decompBuffer, 0, _decompBufferSize); - if (_decompBuffer == NULL) - error("Error allocating decomp buffer (size %u)", _decompBufferSize); } + /* decompress the input data */ decodeZlib(_decompBuffer, size, _decompBufferSize); @@ -287,15 +281,13 @@ void DXADecoder::decode12(int size) { #endif } -void DXADecoder::decode13(int size) { +void DXADecoder::DXAVideoTrack::decode13(int size) { #ifdef USE_ZLIB uint8 *codeBuf, *dataBuf, *motBuf, *maskBuf; - if (_decompBuffer == NULL) { - _decompBuffer = (byte *)malloc(_decompBufferSize); + if (!_decompBuffer) { + _decompBuffer = new byte[_decompBufferSize]; memset(_decompBuffer, 0, _decompBufferSize); - if (_decompBuffer == NULL) - error("Error allocating decomp buffer (size %u)", _decompBufferSize); } /* decompress the input data */ @@ -475,7 +467,7 @@ void DXADecoder::decode13(int size) { #endif } -const Graphics::Surface *DXADecoder::decodeNextFrame() { +const Graphics::Surface *DXADecoder::DXAVideoTrack::decodeNextFrame() { uint32 tag = _fileStream->readUint32BE(); if (tag == MKTAG('C','M','A','P')) { _fileStream->read(_palette, 256 * 3); @@ -486,11 +478,10 @@ const Graphics::Surface *DXADecoder::decodeNextFrame() { if (tag == MKTAG('F','R','A','M')) { byte type = _fileStream->readByte(); uint32 size = _fileStream->readUint32BE(); - if ((_inBuffer == NULL) || (_inBufferSize < size)) { - free(_inBuffer); - _inBuffer = (byte *)malloc(size); - if (_inBuffer == NULL) - error("Error allocating input buffer (size %u)", size); + + if (!_inBuffer || _inBufferSize < size) { + delete[] _inBuffer; + _inBuffer = new byte[size]; memset(_inBuffer, 0, size); _inBufferSize = size; } @@ -551,9 +542,6 @@ const Graphics::Surface *DXADecoder::decodeNextFrame() { _curFrame++; - if (_curFrame == 0) - _startTime = g_system->getMillis(); - return _surface; } diff --git a/video/dxa_decoder.h b/video/dxa_decoder.h index d13cd3076c..a0caca4b95 100644 --- a/video/dxa_decoder.h +++ b/video/dxa_decoder.h @@ -41,62 +41,74 @@ namespace Video { * - sword1 * - sword2 */ -class DXADecoder : public FixedRateVideoDecoder { +class DXADecoder : public AdvancedVideoDecoder { public: DXADecoder(); virtual ~DXADecoder(); bool loadStream(Common::SeekableReadStream *stream); - void close(); - - bool isVideoLoaded() const { return _fileStream != 0; } - uint16 getWidth() const { return _width; } - uint16 getHeight() const { return _height; } - uint32 getFrameCount() const { return _frameCount; } - const Graphics::Surface *decodeNextFrame(); - Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } - const byte *getPalette() { _dirtyPalette = false; return _palette; } - bool hasDirtyPalette() const { return _dirtyPalette; } +protected: /** - * Get the sound chunk tag of the loaded DXA file + * Read the sound data out of the given DXA stream */ - uint32 getSoundTag() { return _soundTag; } - -protected: - Common::Rational getFrameRate() const { return _frameRate; } - - Common::SeekableReadStream *_fileStream; + virtual void readSoundData(Common::SeekableReadStream *stream); private: - void decodeZlib(byte *data, int size, int totalSize); - void decode12(int size); - void decode13(int size); - - enum ScaleMode { - S_NONE, - S_INTERLACED, - S_DOUBLE + class DXAVideoTrack : public FixedRateVideoTrack { + public: + DXAVideoTrack(Common::SeekableReadStream *stream); + ~DXAVideoTrack(); + + bool isRewindable() const { return true; } + bool rewind(); + + uint16 getWidth() const { return _width; } + uint16 getHeight() const { return _height; } + Graphics::PixelFormat getPixelFormat() const; + int getCurFrame() const { return _curFrame; } + int getFrameCount() const { return _frameCount; } + const Graphics::Surface *decodeNextFrame(); + const byte *getPalette() const { _dirtyPalette = false; return _palette; } + bool hasDirtyPalette() const { return _dirtyPalette; } + + void setFrameStartPos(); + + protected: + Common::Rational getFrameRate() const { return _frameRate; } + + private: + void decodeZlib(byte *data, int size, int totalSize); + void decode12(int size); + void decode13(int size); + + enum ScaleMode { + S_NONE, + S_INTERLACED, + S_DOUBLE + }; + + Common::SeekableReadStream *_fileStream; + Graphics::Surface *_surface; + + byte *_frameBuffer1; + byte *_frameBuffer2; + byte *_scaledBuffer; + byte *_inBuffer; + uint32 _inBufferSize; + byte *_decompBuffer; + uint32 _decompBufferSize; + uint16 _curHeight; + uint32 _frameSize; + ScaleMode _scaleMode; + uint16 _width, _height; + uint32 _frameRate; + uint32 _frameCount; + byte _palette[256 * 3]; + mutable bool _dirtyPalette; + int _curFrame; + uint32 _frameStartOffset; }; - - Graphics::Surface *_surface; - byte _palette[256 * 3]; - bool _dirtyPalette; - - byte *_frameBuffer1; - byte *_frameBuffer2; - byte *_scaledBuffer; - byte *_inBuffer; - uint32 _inBufferSize; - byte *_decompBuffer; - uint32 _decompBufferSize; - uint16 _curHeight; - uint32 _frameSize; - ScaleMode _scaleMode; - uint32 _soundTag; - uint16 _width, _height; - uint32 _frameRate; - uint32 _frameCount; }; } // End of namespace Video -- cgit v1.2.3 From 6f351302040be620aa039a7c605f3c23463b27db Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 24 Jul 2012 22:34:03 +0300 Subject: SCI: More work on color remapping More transparency/color mapping effects are now working (e.g. the flashlight at the Gedde tomb in GK1, the rays of light at Schloss Ritter in GK1, the torch in the QFG4 demo and the shadows in QFG4, PQ4 and KQ7) --- engines/sci/engine/kgraphics.cpp | 17 +++++----- engines/sci/engine/kgraphics32.cpp | 47 +++++++++++++--------------- engines/sci/graphics/palette.cpp | 64 ++++++++++++++++++++++++++++++-------- engines/sci/graphics/palette.h | 12 ++++--- engines/sci/graphics/view.cpp | 9 ++++-- 5 files changed, 97 insertions(+), 52 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index bd78c56416..55c0202048 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1228,15 +1228,18 @@ reg_t kRemapColors(EngineState *s, int argc, reg_t *argv) { switch (operation) { case 0: { // remap by percent uint16 percent = argv[1].toUint16(); - g_sci->_gfxPalette->toggleRemap(true); - g_sci->_gfxPalette->setRemappingPercent(percent); + g_sci->_gfxPalette->toggleRemapping(true); + g_sci->_gfxPalette->resetRemapping(); + g_sci->_gfxPalette->setRemappingPercent(254, percent); } break; - case 1: { // set remapping base - //int16 unk1 = argv[1].toSint16(); - //int16 unk2 = argv[2].toSint16(); - //int16 unk3 = argv[3].toSint16(); - kStub(s, argc, argv); + case 1: { // remap by range + uint16 from = argv[1].toUint16(); + uint16 to = argv[2].toUint16(); + uint16 base = argv[3].toUint16(); + g_sci->_gfxPalette->toggleRemapping(true); + g_sci->_gfxPalette->resetRemapping(); + g_sci->_gfxPalette->setRemappingRange(254, from, to, base); } break; case 2: // turn remapping off (unused) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 1b7b628e7d..7240308f4a 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -737,46 +737,44 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { uint16 operation = argv[0].toUint16(); switch (operation) { - case 0: { // Set remapping to base. 0 turns remapping off. + case 0: { // turn remapping off int16 base = (argc >= 2) ? argv[1].toSint16() : 0; - if (base != 0) // 0 is the default behavior when changing rooms in GK1, thus silencing the warning - warning("kRemapColors: Set remapping to base %d", base); + if (base > 0) + warning("kRemapColors(0) called with base %d", base); + g_sci->_gfxPalette->toggleRemapping(false); + g_sci->_gfxPalette->resetRemapping(); } - // TODO: Don't turn remapping off always - g_sci->_gfxPalette->toggleRemap(false); - g_sci->_gfxPalette->setRemappingPercent(0); break; - case 1: { // set remapping base - //int16 unk1 = argv[1].toSint16(); - //int16 unk2 = argv[2].toSint16(); - //int16 unk3 = argv[3].toSint16(); - //uint16 unk4 = argv[4].toUint16(); - //uint16 unk5 = (argc >= 6) ? argv[5].toUint16() : 0; - kStub(s, argc, argv); + case 1: { // remap by range + uint16 color = argv[1].toUint16(); + uint16 from = argv[2].toUint16(); + uint16 to = argv[3].toUint16(); + uint16 base = argv[4].toUint16(); + uint16 unk5 = (argc >= 6) ? argv[5].toUint16() : 0; + if (unk5 > 0) + warning("kRemapColors(1) called with 6 parameters, unknown parameter is %d", unk5); + g_sci->_gfxPalette->toggleRemapping(true); + g_sci->_gfxPalette->setRemappingRange(color, from, to, base); } break; case 2: { // remap by percent - // TODO: Use the color index. The -10 offset is wrong. - /*int16 color = argv[1].toSint16(); - if (color >= 10) - color -= 10;*/ + uint16 color = argv[1].toUint16(); uint16 percent = argv[2].toUint16(); // 0 - 100 if (argc >= 4) warning("RemapByPercent called with 4 parameters, unknown parameter is %d", argv[3].toUint16()); - g_sci->_gfxPalette->toggleRemap(true); - g_sci->_gfxPalette->setRemappingPercent(percent); + g_sci->_gfxPalette->toggleRemapping(true); + g_sci->_gfxPalette->setRemappingPercent(color, percent); } break; case 3: { // remap to gray - // NOTE: This adjusts the alpha value of a specific color, and it operates on - // an RGBA palette int16 color = argv[1].toSint16(); // this is subtracted from a maximum color value, and can be offset by 10 int16 percent = argv[2].toSint16(); // 0 - 100 uint16 unk3 = (argc >= 4) ? argv[3].toUint16() : 0; warning("kRemapColors: RemapToGray color %d by %d percent (unk3 = %d)", color, percent, unk3); + // TODO } break; - case 4: { // unknown + case 4: { // remap to percent gray //int16 unk1 = argv[1].toSint16(); //uint16 unk2 = argv[2].toUint16(); //uint16 unk3 = argv[3].toUint16(); @@ -784,10 +782,7 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { kStub(s, argc, argv); } break; - case 5: { // set color intensity - // TODO: This isn't right, it should be setting a mapping table instead. - // For PQ4, we can emulate this with kernelSetIntensity(). In QFG4, this - // won't do. + case 5: { // don't map to range //int16 mapping = argv[1].toSint16(); uint16 intensity = argv[2].toUint16(); // HACK for PQ4 diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index f16d607a29..b5154ef860 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -102,7 +102,7 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) } _remapOn = false; - _remappingPercent = 0; + resetRemapping(); } GfxPalette::~GfxPalette() { @@ -332,24 +332,62 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { } } -bool GfxPalette::isRemapColor(byte color) { - // TODO: Expand this for SCI32 (more than one remap color can be set). - // Now, it is assumed that colors 253 and 254 are the remap colors. - return _remapOn && (color == 253 || color == 254); +bool GfxPalette::isRemapMask(byte color) { + return (_remapOn && (color >= _remappingMaskFrom && color <= _remappingMaskTo)); +} + +void GfxPalette::resetRemapping() { + _remappingMaskFrom = 0; + _remappingMaskTo = 0; + _remappingPercentToSet = 0; + + for (int i = 0; i < 256; i++) { + _remappingTable[i] = i; + } +} + +void GfxPalette::setRemappingPercent(byte color, byte percent) { + // We need to defer the setup of the remapping table until something is + // shown on screen, otherwise kernelFindColor() won't find correct + // colors. The actual setup of the remapping table will be performed in + // remapColor(). + _remappingPercentToSet = percent; + + if (_remappingMaskFrom > color || _remappingMaskFrom == 0) + _remappingMaskFrom = color; + if (_remappingMaskTo < color) + _remappingMaskTo = color; +} + +void GfxPalette::setRemappingRange(byte color, byte from, byte to, byte base) { + for (int i = from; i <= to; i++) { + _remappingTable[i] = i + base; + } + + if (_remappingMaskFrom > color || _remappingMaskFrom == 0) + _remappingMaskFrom = color; + if (_remappingMaskTo < color) + _remappingMaskTo = color; } byte GfxPalette::remapColor(byte color) { assert(_remapOn); - // TODO: Change this to use a table instead, like the original. - if (_remappingPercent) { - byte r = _sysPalette.colors[color].r * _remappingPercent / 100; - byte g = _sysPalette.colors[color].g * _remappingPercent / 100; - byte b = _sysPalette.colors[color].b * _remappingPercent / 100; - return kernelFindColor(r, g, b); - } else { - return color; + // Check if we need to set remapping by percent. This can only be + // performed when something is shown on screen, so that the screen + // palette is set up and kernelFindColor() can work correctly. + if (_remappingPercentToSet) { + for (int i = 0; i < 256; i++) { + byte r = _sysPalette.colors[i].r * _remappingPercentToSet / 100; + byte g = _sysPalette.colors[i].g * _remappingPercentToSet / 100; + byte b = _sysPalette.colors[i].b * _remappingPercentToSet / 100; + _remappingTable[i] = kernelFindColor(r, g, b); + } + + _remappingPercentToSet = 0; } + + return _remappingTable[color]; } bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) { diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 6774094810..372f3c7090 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -53,9 +53,11 @@ public: void getSys(Palette *pal); uint16 getTotalColorCount() const { return _totalScreenColors; } - void toggleRemap(bool remap) { _remapOn = remap; } - void setRemappingPercent(uint16 percent) { _remappingPercent = percent; } - bool isRemapColor(byte color); + void toggleRemapping(bool remap) { _remapOn = remap; } + void resetRemapping(); + void setRemappingPercent(byte color, byte percent); + void setRemappingRange(byte color, byte from, byte to, byte base); + bool isRemapMask(byte color); byte remapColor(byte color); void setOnScreen(); @@ -129,7 +131,9 @@ private: uint16 _totalScreenColors; bool _remapOn; - uint16 _remappingPercent; + byte _remappingTable[256]; + uint16 _remappingMaskFrom, _remappingMaskTo; + uint16 _remappingPercentToSet; void loadMacIconBarPalette(); byte *_macClut; diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index ae135d141c..f68ed1443a 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -742,7 +742,7 @@ void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const const int y2 = clipRectTranslated.top + y; if (!upscaledHires) { if (priority >= _screen->getPriority(x2, y2)) { - if (!_palette->isRemapColor(palette->mapping[color])) { + if (!_palette->isRemapMask(palette->mapping[color])) { _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); } else { byte remappedColor = _palette->remapColor(_screen->getVisual(x2, y2)); @@ -857,7 +857,12 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, const int x2 = clipRectTranslated.left + x; const int y2 = clipRectTranslated.top + y; if (color != clearKey && priority >= _screen->getPriority(x2, y2)) { - _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); + if (!_palette->isRemapMask(palette->mapping[color])) { + _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); + } else { + byte remappedColor = _palette->remapColor(_screen->getVisual(x2, y2)); + _screen->putPixel(x2, y2, drawMask, remappedColor, priority, 0); + } } } } -- cgit v1.2.3 From fe3fb1873c60e7ed21c573e09030bd6d0a5018cb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 24 Jul 2012 22:54:37 +0300 Subject: SCI: Cleanup of the palette remapping code --- engines/sci/engine/kgraphics.cpp | 2 -- engines/sci/engine/kgraphics32.cpp | 3 --- engines/sci/graphics/palette.cpp | 5 +++++ engines/sci/graphics/palette.h | 1 - 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 55c0202048..da377319c0 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1228,7 +1228,6 @@ reg_t kRemapColors(EngineState *s, int argc, reg_t *argv) { switch (operation) { case 0: { // remap by percent uint16 percent = argv[1].toUint16(); - g_sci->_gfxPalette->toggleRemapping(true); g_sci->_gfxPalette->resetRemapping(); g_sci->_gfxPalette->setRemappingPercent(254, percent); } @@ -1237,7 +1236,6 @@ reg_t kRemapColors(EngineState *s, int argc, reg_t *argv) { uint16 from = argv[1].toUint16(); uint16 to = argv[2].toUint16(); uint16 base = argv[3].toUint16(); - g_sci->_gfxPalette->toggleRemapping(true); g_sci->_gfxPalette->resetRemapping(); g_sci->_gfxPalette->setRemappingRange(254, from, to, base); } diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 7240308f4a..3d2c2af81b 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -741,7 +741,6 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { int16 base = (argc >= 2) ? argv[1].toSint16() : 0; if (base > 0) warning("kRemapColors(0) called with base %d", base); - g_sci->_gfxPalette->toggleRemapping(false); g_sci->_gfxPalette->resetRemapping(); } break; @@ -753,7 +752,6 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { uint16 unk5 = (argc >= 6) ? argv[5].toUint16() : 0; if (unk5 > 0) warning("kRemapColors(1) called with 6 parameters, unknown parameter is %d", unk5); - g_sci->_gfxPalette->toggleRemapping(true); g_sci->_gfxPalette->setRemappingRange(color, from, to, base); } break; @@ -762,7 +760,6 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { uint16 percent = argv[2].toUint16(); // 0 - 100 if (argc >= 4) warning("RemapByPercent called with 4 parameters, unknown parameter is %d", argv[3].toUint16()); - g_sci->_gfxPalette->toggleRemapping(true); g_sci->_gfxPalette->setRemappingPercent(color, percent); } break; diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index b5154ef860..5a551bab2c 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -337,6 +337,7 @@ bool GfxPalette::isRemapMask(byte color) { } void GfxPalette::resetRemapping() { + _remapOn = false; _remappingMaskFrom = 0; _remappingMaskTo = 0; _remappingPercentToSet = 0; @@ -347,6 +348,8 @@ void GfxPalette::resetRemapping() { } void GfxPalette::setRemappingPercent(byte color, byte percent) { + _remapOn = true; + // We need to defer the setup of the remapping table until something is // shown on screen, otherwise kernelFindColor() won't find correct // colors. The actual setup of the remapping table will be performed in @@ -360,6 +363,8 @@ void GfxPalette::setRemappingPercent(byte color, byte percent) { } void GfxPalette::setRemappingRange(byte color, byte from, byte to, byte base) { + _remapOn = true; + for (int i = from; i <= to; i++) { _remappingTable[i] = i + base; } diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 372f3c7090..134ade5e36 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -53,7 +53,6 @@ public: void getSys(Palette *pal); uint16 getTotalColorCount() const { return _totalScreenColors; } - void toggleRemapping(bool remap) { _remapOn = remap; } void resetRemapping(); void setRemappingPercent(byte color, byte percent); void setRemappingRange(byte color, byte from, byte to, byte base); -- cgit v1.2.3 From 37b209dac14bea6b8f08c3ee3f66e3d5772652bb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 24 Jul 2012 22:55:34 +0300 Subject: SCI: Refresh remapping by percent whenever the screen palette changes --- engines/sci/graphics/palette.cpp | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 5a551bab2c..cb5c0fe614 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -350,10 +350,10 @@ void GfxPalette::resetRemapping() { void GfxPalette::setRemappingPercent(byte color, byte percent) { _remapOn = true; - // We need to defer the setup of the remapping table until something is - // shown on screen, otherwise kernelFindColor() won't find correct + // We need to defer the setup of the remapping table every time the screen + // palette is changed, so that kernelFindColor() can find the correct // colors. The actual setup of the remapping table will be performed in - // remapColor(). + // copySysPaletteToScreen(). _remappingPercentToSet = percent; if (_remappingMaskFrom > color || _remappingMaskFrom == 0) @@ -377,21 +377,6 @@ void GfxPalette::setRemappingRange(byte color, byte from, byte to, byte base) { byte GfxPalette::remapColor(byte color) { assert(_remapOn); - - // Check if we need to set remapping by percent. This can only be - // performed when something is shown on screen, so that the screen - // palette is set up and kernelFindColor() can work correctly. - if (_remappingPercentToSet) { - for (int i = 0; i < 256; i++) { - byte r = _sysPalette.colors[i].r * _remappingPercentToSet / 100; - byte g = _sysPalette.colors[i].g * _remappingPercentToSet / 100; - byte b = _sysPalette.colors[i].b * _remappingPercentToSet / 100; - _remappingTable[i] = kernelFindColor(r, g, b); - } - - _remappingPercentToSet = 0; - } - return _remappingTable[color]; } @@ -557,6 +542,16 @@ void GfxPalette::copySysPaletteToScreen() { } } + // Check if we need to reset remapping by percent with the new colors. + if (_remappingPercentToSet) { + for (int i = 0; i < 256; i++) { + byte r = _sysPalette.colors[i].r * _remappingPercentToSet / 100; + byte g = _sysPalette.colors[i].g * _remappingPercentToSet / 100; + byte b = _sysPalette.colors[i].b * _remappingPercentToSet / 100; + _remappingTable[i] = kernelFindColor(r, g, b); + } + } + g_system->getPaletteManager()->setPalette(bpal, 0, 256); } -- cgit v1.2.3 From 90eb773c5d862d38f3dc834d51c5a57319c61c3f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 13 Jul 2012 17:17:58 +0200 Subject: GUI: Implement saving in the grid based save/load chooser. --- gui/ThemeEngine.h | 2 +- gui/saveload-dialog.cpp | 179 ++++++++++++++++++--- gui/saveload-dialog.h | 32 +++- gui/saveload.cpp | 4 +- gui/themes/default.inc | 40 +++++ gui/themes/scummclassic.zip | Bin 94215 -> 95181 bytes gui/themes/scummclassic/THEMERC | 2 +- gui/themes/scummclassic/classic_layout.stx | 21 +++ gui/themes/scummclassic/classic_layout_lowres.stx | 20 +++ gui/themes/scummmodern.zip | Bin 1452523 -> 1453476 bytes gui/themes/scummmodern/THEMERC | 2 +- gui/themes/scummmodern/scummmodern_layout.stx | 21 +++ .../scummmodern/scummmodern_layout_lowres.stx | 20 +++ gui/widget.cpp | 2 +- 14 files changed, 318 insertions(+), 27 deletions(-) diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index de4a92be16..6fb93d3b46 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -35,7 +35,7 @@ #include "graphics/pixelformat.h" -#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.15" +#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.16" class OSystem; diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index cf97737a1b..8f61d038e5 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -26,14 +26,15 @@ #include "gui/message.h" #include "gui/gui-manager.h" #include "gui/ThemeEval.h" +#include "gui/widgets/edittext.h" #include "graphics/scaler.h" namespace GUI { -SaveLoadChooserType getRequestedSaveLoadDialog(const bool saveMode, const MetaEngine &metaEngine) { +SaveLoadChooserType getRequestedSaveLoadDialog(const MetaEngine &metaEngine) { const Common::String &userConfig = ConfMan.get("gui_saveload_chooser", Common::ConfigManager::kApplicationDomain); - if (!saveMode && g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400 + if (g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400 && metaEngine.hasFeature(MetaEngine::kSavesSupportMetaInfo) && metaEngine.hasFeature(MetaEngine::kSavesSupportThumbnail) && userConfig.equalsIgnoreCase("grid")) { @@ -124,7 +125,7 @@ void SaveLoadChooserDialog::addChooserButtons() { _listButton = createSwitchButton("SaveLoadChooser.ListSwitch", "L", _("List view"), ThemeEngine::kImageList, kListSwitchCmd); _gridButton = createSwitchButton("SaveLoadChooser.GridSwitch", "G", _("Grid view"), ThemeEngine::kImageGrid, kGridSwitchCmd); - if (!_metaInfoSupport || !_thumbnailSupport || _saveMode || !(g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400)) + if (!_metaInfoSupport || !_thumbnailSupport || !(g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400)) _gridButton->setEnabled(false); } @@ -132,7 +133,7 @@ void SaveLoadChooserDialog::reflowLayout() { addChooserButtons(); const SaveLoadChooserType currentType = getType(); - const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(_saveMode, *_metaEngine); + const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(*_metaEngine); // Change the dialog type if there is any need for it. if (requestedType != currentType) { @@ -479,12 +480,13 @@ void SaveLoadChooserSimple::updateSaveList() { enum { kNextCmd = 'NEXT', - kPrevCmd = 'PREV' + kPrevCmd = 'PREV', + kNewSaveCmd = 'SAVE' }; -LoadChooserThumbnailed::LoadChooserThumbnailed(const Common::String &title) - : SaveLoadChooserDialog("SaveLoadChooser", false), _lines(0), _columns(0), _entriesPerPage(0), - _curPage(0), _buttons() { +LoadChooserThumbnailed::LoadChooserThumbnailed(const Common::String &title, bool saveMode) + : SaveLoadChooserDialog("SaveLoadChooser", saveMode), _lines(0), _columns(0), _entriesPerPage(0), + _curPage(0), _newSaveContainer(0), _nextFreeSaveSlot(0), _buttons() { _backgroundType = ThemeEngine::kDialogBackgroundSpecial; new StaticTextWidget(this, "SaveLoadChooser.Title", title); @@ -508,14 +510,18 @@ LoadChooserThumbnailed::~LoadChooserThumbnailed() { } const Common::String &LoadChooserThumbnailed::getResultString() const { - // FIXME: This chooser is only for loading, thus the result is never used - // anyway. But this is still an ugly hack. - return _target; + return _resultString; } void LoadChooserThumbnailed::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { if (cmd <= _entriesPerPage) { - setResult(_saveList[cmd - 1 + _curPage * _entriesPerPage].getSaveSlot()); + const SaveStateDescriptor &desc = _saveList[cmd - 1 + _curPage * _entriesPerPage]; + + if (_saveMode) { + _resultString = desc.getDescription(); + } + + setResult(desc.getSaveSlot()); close(); } @@ -532,6 +538,11 @@ void LoadChooserThumbnailed::handleCommand(GUI::CommandSender *sender, uint32 cm draw(); break; + case kNewSaveCmd: + setResult(_nextFreeSaveSlot); + close(); + break; + case kCloseCmd: setResult(-1); default: @@ -560,6 +571,30 @@ void LoadChooserThumbnailed::open() { _curPage = 0; _saveList = _metaEngine->listSaves(_target.c_str()); + _resultString.clear(); + + // Determine the next free save slot for save mode + if (_saveMode) { + int lastSlot = -1; + _nextFreeSaveSlot = -1; + for (SaveStateList::const_iterator x = _saveList.begin(); x != _saveList.end(); ++x) { + const int curSlot = x->getSaveSlot(); + + // In case there was a gap found use the slot. + if (lastSlot + 1 < curSlot) { + _nextFreeSaveSlot = lastSlot + 1; + break; + } + + lastSlot = curSlot; + } + + // Use the next available slot otherwise. + if (_nextFreeSaveSlot == -1 && lastSlot + 1 < _metaEngine->getMaximumSaveSlot()) { + _nextFreeSaveSlot = lastSlot + 1; + } + } + updateSaves(); } @@ -596,9 +631,20 @@ void LoadChooserThumbnailed::reflowLayout() { _columns = MAX(1, availableWidth / slotAreaWidth); _lines = MAX(1, availableHeight / slotAreaHeight); _entriesPerPage = _columns * _lines; + + // In save mode the first button is always "New Save", thus we need to + // adjust the entries per page here. + if (_saveMode) { + --_entriesPerPage; + } + // Recalculate the page number if (!_saveList.empty() && oldEntriesPerPage != 0) { - _curPage = (_curPage * oldEntriesPerPage) / _entriesPerPage; + if (_entriesPerPage != 0) { + _curPage = (_curPage * oldEntriesPerPage) / _entriesPerPage; + } else { + _curPage = 0; + } } const uint addX = _columns > 1 ? (availableWidth % slotAreaWidth) / (_columns - 1) : 0; @@ -608,13 +654,32 @@ void LoadChooserThumbnailed::reflowLayout() { y += defaultSpacingVertical / 2; for (uint curLine = 0; curLine < _lines; ++curLine, y += slotAreaHeight/* + addY*/) { for (uint curColumn = 0, curX = x + defaultSpacingHorizontal / 2; curColumn < _columns; ++curColumn, curX += slotAreaWidth + addX) { - ContainerWidget *container = new ContainerWidget(this, curX, y, containerWidth, containerHeight); - container->setVisible(false); - int dstY = containerFrameHeightAdd / 2; int dstX = containerFrameWidthAdd / 2; - PicButtonWidget *button = new PicButtonWidget(container, dstX, dstY, buttonWidth, buttonHeight, 0, curLine * _columns + curColumn + 1); + // In the save mode we will always create a new save button as the first button. + if (_saveMode && curLine == 0 && curColumn == 0) { + _newSaveContainer = new ContainerWidget(this, curX, y, containerWidth, containerHeight); + ButtonWidget *newSave = new ButtonWidget(_newSaveContainer, dstX, dstY, buttonWidth, buttonHeight, _("New Save"), _("Create a new save game"), kNewSaveCmd); + // In case no more slots are free, we will disable the new save button + if (_nextFreeSaveSlot == -1) { + newSave->setEnabled(false); + } + continue; + } + + ContainerWidget *container = new ContainerWidget(this, curX, y, containerWidth, containerHeight); + container->setVisible(false); + + // Command 0 cannot be used, since it won't be send. Thus we will adjust + // command number here, if required. This is only the case for load mode + // since for save mode, the first button used is index 1 anyway. + uint buttonCmd = curLine * _columns + curColumn; + if (!_saveMode) { + buttonCmd += 1; + } + + PicButtonWidget *button = new PicButtonWidget(container, dstX, dstY, buttonWidth, buttonHeight, 0, buttonCmd); dstY += buttonHeight; StaticTextWidget *description = new StaticTextWidget(container, dstX, dstY, buttonWidth, kLineHeight, Common::String(), Graphics::kTextAlignLeft); @@ -633,10 +698,41 @@ void LoadChooserThumbnailed::close() { } int LoadChooserThumbnailed::runIntern() { - return SaveLoadChooserDialog::runModal(); + int slot; + do { + const SaveLoadChooserType currentType = getType(); + const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(*_metaEngine); + + // Catch resolution changes when the save name dialog was open. + if (currentType != requestedType) { + setResult(kSwitchSaveLoadDialog); + return kSwitchSaveLoadDialog; + } + + slot = runModal(); + } while (_saveMode && slot >= 0 && !selectDescription()); + + return slot; +} + +bool LoadChooserThumbnailed::selectDescription() { + _savenameDialog.setDescription(_resultString); + _savenameDialog.setTargetSlot(getResult()); + if (_savenameDialog.runModal() == 0) { + _resultString = _savenameDialog.getDescription(); + return true; + } else { + return false; + } } void LoadChooserThumbnailed::destroyButtons() { + if (_newSaveContainer) { + removeWidget(_newSaveContainer); + delete _newSaveContainer; + _newSaveContainer = 0; + } + for (ButtonArray::iterator i = _buttons.begin(), end = _buttons.end(); i != end; ++i) { removeWidget(i->container); delete i->container; @@ -696,9 +792,17 @@ void LoadChooserThumbnailed::updateSaves() { } curButton.button->setTooltip(tooltip); + + // In save mode we disable the button, when it's write protected. + // TODO: Maybe we should not display it at all then? + if (_saveMode && desc.getWriteProtectedFlag()) { + curButton.button->setEnabled(false); + } else { + curButton.button->setEnabled(true); + } } - const uint numPages = _saveList.size() / _entriesPerPage + 1; + const uint numPages = (_entriesPerPage != 0) ? (_saveList.size() / _entriesPerPage + 1) : 1; _pageDisplay->setLabel(Common::String::format("%u/%u", _curPage + 1, numPages)); if (_curPage > 0) @@ -712,4 +816,41 @@ void LoadChooserThumbnailed::updateSaves() { _nextButton->setEnabled(false); } +SavenameDialog::SavenameDialog() + : Dialog("SavenameDialog") { + _title = new StaticTextWidget(this, "SavenameDialog.DescriptionText", Common::String()); + + new ButtonWidget(this, "SavenameDialog.Cancel", _("Cancel"), 0, kCloseCmd); + new ButtonWidget(this, "SavenameDialog.Ok", _("Ok"), 0, kOKCmd); + + _description = new EditTextWidget(this, "SavenameDialog.Description", Common::String(), 0, 0, kOKCmd); +} + +void SavenameDialog::setDescription(const Common::String &desc) { + _description->setEditString(desc); +} + +const Common::String &SavenameDialog::getDescription() { + return _description->getEditString(); +} + +void SavenameDialog::open() { + Dialog::open(); + setResult(-1); + + _title->setLabel(Common::String::format(_("Enter a description for slot %d:"), _targetSlot)); +} + +void SavenameDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { + switch (cmd) { + case kOKCmd: + setResult(0); + close(); + break; + + default: + Dialog::handleCommand(sender, cmd, data); + } +} + } // End of namespace GUI diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index a604773142..46799ad853 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -36,7 +36,7 @@ enum SaveLoadChooserType { kSaveLoadDialogGrid = 1 }; -SaveLoadChooserType getRequestedSaveLoadDialog(const bool saveMode, const MetaEngine &metaEngine); +SaveLoadChooserType getRequestedSaveLoadDialog(const MetaEngine &metaEngine); class SaveLoadChooserDialog : protected Dialog { public: @@ -109,9 +109,30 @@ private: void updateSelection(bool redraw); }; + +class EditTextWidget; + +class SavenameDialog : public Dialog { +public: + SavenameDialog(); + + void setDescription(const Common::String &desc); + const Common::String &getDescription(); + + void setTargetSlot(int slot) { _targetSlot = slot; } + + virtual void open(); +protected: + virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); +private: + int _targetSlot; + StaticTextWidget *_title; + EditTextWidget *_description; +}; + class LoadChooserThumbnailed : public SaveLoadChooserDialog { public: - LoadChooserThumbnailed(const Common::String &title); + LoadChooserThumbnailed(const Common::String &title, bool saveMode); ~LoadChooserThumbnailed(); virtual const Common::String &getResultString() const; @@ -139,6 +160,13 @@ private: GUI::StaticTextWidget *_pageDisplay; + ContainerWidget *_newSaveContainer; + int _nextFreeSaveSlot; + Common::String _resultString; + + SavenameDialog _savenameDialog; + bool selectDescription(); + struct SlotButton { SlotButton() : container(0), button(0), description(0) {} SlotButton(ContainerWidget *c, PicButtonWidget *b, StaticTextWidget *d) : container(c), button(b), description(d) {} diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 12e62122fe..1eceff79cd 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -40,14 +40,14 @@ SaveLoadChooser::~SaveLoadChooser() { } void SaveLoadChooser::selectChooser(const MetaEngine &engine) { - const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(_saveMode, engine); + const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(engine); if (!_impl || _impl->getType() != requestedType) { delete _impl; _impl = 0; switch (requestedType) { case kSaveLoadDialogGrid: - _impl = new LoadChooserThumbnailed(_title); + _impl = new LoadChooserThumbnailed(_title, _saveMode); break; case kSaveLoadDialogList: diff --git a/gui/themes/default.inc b/gui/themes/default.inc index dc8d5c1a0e..bfd78db3ae 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1386,6 +1386,26 @@ "
" "
" "
" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " " " " " " " " " " " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " " " " " " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = 0 && x < _w && y >= 0 && y < _h) { - sendCommand(_cmd, 0); startAnimatePressedState(); + sendCommand(_cmd, 0); } } -- cgit v1.2.3 From 89b638128ff0482a01cfd3d058d87aa95faf58c3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 24 Jul 2012 23:24:17 +0200 Subject: GUI: Rename LoadChooserThumbnailed to SaveLoadChooserGrid. --- gui/saveload-dialog.cpp | 28 ++++++++++++++-------------- gui/saveload-dialog.h | 6 +++--- gui/saveload.cpp | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 8f61d038e5..2ceace2c8a 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -476,7 +476,7 @@ void SaveLoadChooserSimple::updateSaveList() { _list->setList(saveNames, &colors); } -// LoadChooserThumbnailed implementation +// SaveLoadChooserGrid implementation enum { kNextCmd = 'NEXT', @@ -484,7 +484,7 @@ enum { kNewSaveCmd = 'SAVE' }; -LoadChooserThumbnailed::LoadChooserThumbnailed(const Common::String &title, bool saveMode) +SaveLoadChooserGrid::SaveLoadChooserGrid(const Common::String &title, bool saveMode) : SaveLoadChooserDialog("SaveLoadChooser", saveMode), _lines(0), _columns(0), _entriesPerPage(0), _curPage(0), _newSaveContainer(0), _nextFreeSaveSlot(0), _buttons() { _backgroundType = ThemeEngine::kDialogBackgroundSpecial; @@ -504,16 +504,16 @@ LoadChooserThumbnailed::LoadChooserThumbnailed(const Common::String &title, bool _pageDisplay->setAlign(Graphics::kTextAlignRight); } -LoadChooserThumbnailed::~LoadChooserThumbnailed() { +SaveLoadChooserGrid::~SaveLoadChooserGrid() { removeWidget(_pageDisplay); delete _pageDisplay; } -const Common::String &LoadChooserThumbnailed::getResultString() const { +const Common::String &SaveLoadChooserGrid::getResultString() const { return _resultString; } -void LoadChooserThumbnailed::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { +void SaveLoadChooserGrid::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { if (cmd <= _entriesPerPage) { const SaveStateDescriptor &desc = _saveList[cmd - 1 + _curPage * _entriesPerPage]; @@ -550,7 +550,7 @@ void LoadChooserThumbnailed::handleCommand(GUI::CommandSender *sender, uint32 cm } } -void LoadChooserThumbnailed::handleMouseWheel(int x, int y, int direction) { +void SaveLoadChooserGrid::handleMouseWheel(int x, int y, int direction) { if (direction > 0) { if (_nextButton->isEnabled()) { ++_curPage; @@ -566,7 +566,7 @@ void LoadChooserThumbnailed::handleMouseWheel(int x, int y, int direction) { } } -void LoadChooserThumbnailed::open() { +void SaveLoadChooserGrid::open() { SaveLoadChooserDialog::open(); _curPage = 0; @@ -598,7 +598,7 @@ void LoadChooserThumbnailed::open() { updateSaves(); } -void LoadChooserThumbnailed::reflowLayout() { +void SaveLoadChooserGrid::reflowLayout() { removeWidget(_pageDisplay); if (g_gui.xmlEval()->getVar("Globals.ShowChooserPageDisplay") == 1) { _pageDisplay->init(); @@ -692,12 +692,12 @@ void LoadChooserThumbnailed::reflowLayout() { updateSaves(); } -void LoadChooserThumbnailed::close() { +void SaveLoadChooserGrid::close() { SaveLoadChooserDialog::close(); hideButtons(); } -int LoadChooserThumbnailed::runIntern() { +int SaveLoadChooserGrid::runIntern() { int slot; do { const SaveLoadChooserType currentType = getType(); @@ -715,7 +715,7 @@ int LoadChooserThumbnailed::runIntern() { return slot; } -bool LoadChooserThumbnailed::selectDescription() { +bool SaveLoadChooserGrid::selectDescription() { _savenameDialog.setDescription(_resultString); _savenameDialog.setTargetSlot(getResult()); if (_savenameDialog.runModal() == 0) { @@ -726,7 +726,7 @@ bool LoadChooserThumbnailed::selectDescription() { } } -void LoadChooserThumbnailed::destroyButtons() { +void SaveLoadChooserGrid::destroyButtons() { if (_newSaveContainer) { removeWidget(_newSaveContainer); delete _newSaveContainer; @@ -741,7 +741,7 @@ void LoadChooserThumbnailed::destroyButtons() { _buttons.clear(); } -void LoadChooserThumbnailed::hideButtons() { +void SaveLoadChooserGrid::hideButtons() { for (ButtonArray::iterator i = _buttons.begin(), end = _buttons.end(); i != end; ++i) { i->button->setGfx(0); i->setVisible(false); @@ -749,7 +749,7 @@ void LoadChooserThumbnailed::hideButtons() { } -void LoadChooserThumbnailed::updateSaves() { +void SaveLoadChooserGrid::updateSaves() { hideButtons(); for (uint i = _curPage * _entriesPerPage, curNum = 0; i < _saveList.size() && curNum < _entriesPerPage; ++i, ++curNum) { diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 46799ad853..351d0f682f 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -130,10 +130,10 @@ private: EditTextWidget *_description; }; -class LoadChooserThumbnailed : public SaveLoadChooserDialog { +class SaveLoadChooserGrid : public SaveLoadChooserDialog { public: - LoadChooserThumbnailed(const Common::String &title, bool saveMode); - ~LoadChooserThumbnailed(); + SaveLoadChooserGrid(const Common::String &title, bool saveMode); + ~SaveLoadChooserGrid(); virtual const Common::String &getResultString() const; diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 1eceff79cd..0650be388c 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -47,7 +47,7 @@ void SaveLoadChooser::selectChooser(const MetaEngine &engine) { switch (requestedType) { case kSaveLoadDialogGrid: - _impl = new LoadChooserThumbnailed(_title, _saveMode); + _impl = new SaveLoadChooserGrid(_title, _saveMode); break; case kSaveLoadDialogList: -- cgit v1.2.3 From 91196e53750f328b30703ffd09cbf3f5e877dc8e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 24 Jul 2012 23:25:10 +0200 Subject: GUI: Also disable the switch-to-list button in the choosers, when the grid one isn't available. --- gui/saveload-dialog.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 2ceace2c8a..159e9617ad 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -125,8 +125,10 @@ void SaveLoadChooserDialog::addChooserButtons() { _listButton = createSwitchButton("SaveLoadChooser.ListSwitch", "L", _("List view"), ThemeEngine::kImageList, kListSwitchCmd); _gridButton = createSwitchButton("SaveLoadChooser.GridSwitch", "G", _("Grid view"), ThemeEngine::kImageGrid, kGridSwitchCmd); - if (!_metaInfoSupport || !_thumbnailSupport || !(g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400)) + if (!_metaInfoSupport || !_thumbnailSupport || !(g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400)) { _gridButton->setEnabled(false); + _listButton->setEnabled(false); + } } void SaveLoadChooserDialog::reflowLayout() { -- cgit v1.2.3 From 8e791896b80009dc779770d8761abc89755fee93 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 24 Jul 2012 23:26:47 +0200 Subject: GUI: Remove an unnecessary empty line. --- gui/saveload-dialog.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 159e9617ad..f81fdc210c 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -748,7 +748,6 @@ void SaveLoadChooserGrid::hideButtons() { i->button->setGfx(0); i->setVisible(false); } - } void SaveLoadChooserGrid::updateSaves() { -- cgit v1.2.3 From bab992ab98dba252e6106161502ec2b945540ea1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 24 Jul 2012 23:27:59 +0200 Subject: GUI: Remove unecessary explicit GUI namespace uses. --- gui/saveload-dialog.cpp | 40 ++++++++++++++++++++-------------------- gui/saveload-dialog.h | 36 ++++++++++++++++++------------------ 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index f81fdc210c..9f7664b809 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -87,7 +87,7 @@ int SaveLoadChooserDialog::run(const Common::String &target, const MetaEngine *m return runIntern(); } -void SaveLoadChooserDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { +void SaveLoadChooserDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { case kListSwitchCmd: setResult(kSwitchSaveLoadDialog); @@ -146,7 +146,7 @@ void SaveLoadChooserDialog::reflowLayout() { Dialog::reflowLayout(); } -GUI::ButtonWidget *SaveLoadChooserDialog::createSwitchButton(const Common::String &name, const char *desc, const char *tooltip, const char *image, uint32 cmd) { +ButtonWidget *SaveLoadChooserDialog::createSwitchButton(const Common::String &name, const char *desc, const char *tooltip, const char *image, uint32 cmd) { ButtonWidget *button; #ifndef DISABLE_FANCY_THEMES @@ -175,28 +175,28 @@ SaveLoadChooserSimple::SaveLoadChooserSimple(const String &title, const String & new StaticTextWidget(this, "SaveLoadChooser.Title", title); // Add choice list - _list = new GUI::ListWidget(this, "SaveLoadChooser.List"); - _list->setNumberingMode(GUI::kListNumberingZero); + _list = new ListWidget(this, "SaveLoadChooser.List"); + _list->setNumberingMode(kListNumberingZero); _list->setEditable(saveMode); - _gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10); + _gfxWidget = new GraphicsWidget(this, 0, 0, 10, 10); _date = new StaticTextWidget(this, 0, 0, 10, 10, _("No date saved"), Graphics::kTextAlignCenter); _time = new StaticTextWidget(this, 0, 0, 10, 10, _("No time saved"), Graphics::kTextAlignCenter); _playtime = new StaticTextWidget(this, 0, 0, 10, 10, _("No playtime saved"), Graphics::kTextAlignCenter); // Buttons - new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), 0, kCloseCmd); - _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, 0, kChooseCmd); + new ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), 0, kCloseCmd); + _chooseButton = new ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, 0, kChooseCmd); _chooseButton->setEnabled(false); - _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), 0, kDelCmd); + _deleteButton = new ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), 0, kDelCmd); _deleteButton->setEnabled(false); _delSupport = _metaInfoSupport = _thumbnailSupport = false; - _container = new GUI::ContainerWidget(this, 0, 0, 10, 10); -// _container->setHints(GUI::THEME_HINT_USE_SHADOW); + _container = new ContainerWidget(this, 0, 0, 10, 10); +// _container->setHints(THEME_HINT_USE_SHADOW); } int SaveLoadChooserSimple::runIntern() { @@ -219,8 +219,8 @@ void SaveLoadChooserSimple::handleCommand(CommandSender *sender, uint32 cmd, uin int selItem = _list->getSelected(); switch (cmd) { - case GUI::kListItemActivatedCmd: - case GUI::kListItemDoubleClickedCmd: + case kListItemActivatedCmd: + case kListItemDoubleClickedCmd: if (selItem >= 0 && _chooseButton->isEnabled()) { if (_list->isEditable() || !_list->getSelectedString().empty()) { _list->endEditMode(); @@ -240,14 +240,14 @@ void SaveLoadChooserSimple::handleCommand(CommandSender *sender, uint32 cmd, uin } close(); break; - case GUI::kListSelectionChangedCmd: + case kListSelectionChangedCmd: updateSelection(true); break; case kDelCmd: if (selItem >= 0 && _delSupport) { MessageDialog alert(_("Do you really want to delete this savegame?"), _("Delete"), _("Cancel")); - if (alert.runModal() == GUI::kMessageOK) { + if (alert.runModal() == kMessageOK) { _metaEngine->removeSaveState(_target.c_str(), _saveList[selItem].getSaveSlot()); setResult(-1); @@ -494,15 +494,15 @@ SaveLoadChooserGrid::SaveLoadChooserGrid(const Common::String &title, bool saveM new StaticTextWidget(this, "SaveLoadChooser.Title", title); // Buttons - new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Cancel"), 0, kCloseCmd); - _nextButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", _("Next"), 0, kNextCmd); + new ButtonWidget(this, "SaveLoadChooser.Delete", _("Cancel"), 0, kCloseCmd); + _nextButton = new ButtonWidget(this, "SaveLoadChooser.Choose", _("Next"), 0, kNextCmd); _nextButton->setEnabled(false); - _prevButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Prev"), 0, kPrevCmd); + _prevButton = new ButtonWidget(this, "SaveLoadChooser.Cancel", _("Prev"), 0, kPrevCmd); _prevButton->setEnabled(false); // Page display - _pageDisplay = new GUI::StaticTextWidget(this, "SaveLoadChooser.PageDisplay", Common::String()); + _pageDisplay = new StaticTextWidget(this, "SaveLoadChooser.PageDisplay", Common::String()); _pageDisplay->setAlign(Graphics::kTextAlignRight); } @@ -515,7 +515,7 @@ const Common::String &SaveLoadChooserGrid::getResultString() const { return _resultString; } -void SaveLoadChooserGrid::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { +void SaveLoadChooserGrid::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { if (cmd <= _entriesPerPage) { const SaveStateDescriptor &desc = _saveList[cmd - 1 + _curPage * _entriesPerPage]; @@ -842,7 +842,7 @@ void SavenameDialog::open() { _title->setLabel(Common::String::format(_("Enter a description for slot %d:"), _targetSlot)); } -void SavenameDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) { +void SavenameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { case kOKCmd: setResult(0); diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 351d0f682f..05c0715fe0 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -47,7 +47,7 @@ public: virtual void reflowLayout(); - virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); virtual SaveLoadChooserType getType() const = 0; @@ -66,11 +66,11 @@ protected: bool _playTimeSupport; Common::String _target; - GUI::ButtonWidget *_listButton; - GUI::ButtonWidget *_gridButton; + ButtonWidget *_listButton; + ButtonWidget *_gridButton; void addChooserButtons(); - GUI::ButtonWidget *createSwitchButton(const Common::String &name, const char *desc, const char *tooltip, const char *image, uint32 cmd = 0); + ButtonWidget *createSwitchButton(const Common::String &name, const char *desc, const char *tooltip, const char *image, uint32 cmd = 0); }; class SaveLoadChooserSimple : public SaveLoadChooserDialog { @@ -79,7 +79,7 @@ class SaveLoadChooserSimple : public SaveLoadChooserDialog { public: SaveLoadChooserSimple(const String &title, const String &buttonLabel, bool saveMode); - virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); virtual const Common::String &getResultString() const; @@ -91,14 +91,14 @@ public: private: virtual int runIntern(); - GUI::ListWidget *_list; - GUI::ButtonWidget *_chooseButton; - GUI::ButtonWidget *_deleteButton; - GUI::GraphicsWidget *_gfxWidget; - GUI::ContainerWidget *_container; - GUI::StaticTextWidget *_date; - GUI::StaticTextWidget *_time; - GUI::StaticTextWidget *_playtime; + ListWidget *_list; + ButtonWidget *_chooseButton; + ButtonWidget *_deleteButton; + GraphicsWidget *_gfxWidget; + ContainerWidget *_container; + StaticTextWidget *_date; + StaticTextWidget *_time; + StaticTextWidget *_playtime; SaveStateList _saveList; String _resultString; @@ -123,7 +123,7 @@ public: virtual void open(); protected: - virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); private: int _targetSlot; StaticTextWidget *_title; @@ -145,7 +145,7 @@ public: virtual void close(); protected: - virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); + virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); virtual void handleMouseWheel(int x, int y, int direction); private: virtual int runIntern(); @@ -155,10 +155,10 @@ private: uint _curPage; SaveStateList _saveList; - GUI::ButtonWidget *_nextButton; - GUI::ButtonWidget *_prevButton; + ButtonWidget *_nextButton; + ButtonWidget *_prevButton; - GUI::StaticTextWidget *_pageDisplay; + StaticTextWidget *_pageDisplay; ContainerWidget *_newSaveContainer; int _nextFreeSaveSlot; -- cgit v1.2.3 From f006eddac56fdf4305a3d63914245b8707210725 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 24 Jul 2012 23:32:17 +0200 Subject: GUI: Let SaveLoadChooser::getResultString return a const reference. --- gui/saveload.cpp | 8 +++----- gui/saveload.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 0650be388c..d6a8688ce3 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -103,11 +103,9 @@ int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, con return ret; } -Common::String SaveLoadChooser::getResultString() const { - if (_impl) - return _impl->getResultString(); - else - return Common::String(); +const Common::String &SaveLoadChooser::getResultString() const { + assert(_impl); + return _impl->getResultString(); } } // End of namespace GUI diff --git a/gui/saveload.h b/gui/saveload.h index 26a8cd1bad..17fd99a31d 100644 --- a/gui/saveload.h +++ b/gui/saveload.h @@ -52,7 +52,7 @@ public: int runModalWithCurrentTarget(); int runModalWithPluginAndTarget(const EnginePlugin *plugin, const String &target); - Common::String getResultString() const; + const Common::String &getResultString() const; /** * Creates a default save description for the specified slot. Depending -- cgit v1.2.3 From ca225cc7e0affd4bca287def475e34dabe251d8a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 24 Jul 2012 23:34:35 +0200 Subject: GUI: Strip a trailing whitespace. --- gui/saveload-dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 9f7664b809..f59d67e490 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -604,7 +604,7 @@ void SaveLoadChooserGrid::reflowLayout() { removeWidget(_pageDisplay); if (g_gui.xmlEval()->getVar("Globals.ShowChooserPageDisplay") == 1) { _pageDisplay->init(); - } + } SaveLoadChooserDialog::reflowLayout(); destroyButtons(); -- cgit v1.2.3 From 7d519074053ab0482c1d163a626a9554b52a8783 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 24 Jul 2012 23:46:54 +0200 Subject: GUI: Add possibility to disable the grid based chooser via DISABLE_SAVELOADCHOOSER_GRID. --- gui/saveload-dialog.cpp | 60 +++++++++++++++++++++++++++++++++---------------- gui/saveload-dialog.h | 19 ++++++++++++++++ gui/saveload.cpp | 7 +++++- 3 files changed, 66 insertions(+), 20 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index f59d67e490..3c793c9e25 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -32,6 +32,7 @@ namespace GUI { +#ifndef DISABLE_SAVELOADCHOOSER_GRID SaveLoadChooserType getRequestedSaveLoadDialog(const MetaEngine &metaEngine) { const Common::String &userConfig = ConfMan.get("gui_saveload_chooser", Common::ConfigManager::kApplicationDomain); if (g_gui.getWidth() >= 640 && g_gui.getHeight() >= 400 @@ -52,19 +53,30 @@ enum { kListSwitchCmd = 'LIST', kGridSwitchCmd = 'GRID' }; +#endif // !DISABLE_SAVELOADCHOOSER_GRID SaveLoadChooserDialog::SaveLoadChooserDialog(const Common::String &dialogName, const bool saveMode) : Dialog(dialogName), _metaEngine(0), _delSupport(false), _metaInfoSupport(false), - _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false), _saveMode(saveMode), - _listButton(0), _gridButton(0) { + _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false), _saveMode(saveMode) +#ifndef DISABLE_SAVELOADCHOOSER_GRID + , _listButton(0), _gridButton(0) +#endif // !DISABLE_SAVELOADCHOOSER_GRID + { +#ifndef DISABLE_SAVELOADCHOOSER_GRID addChooserButtons(); +#endif // !DISABLE_SAVELOADCHOOSER_GRID } SaveLoadChooserDialog::SaveLoadChooserDialog(int x, int y, int w, int h, const bool saveMode) : Dialog(x, y, w, h), _metaEngine(0), _delSupport(false), _metaInfoSupport(false), - _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false), _saveMode(saveMode), - _listButton(0), _gridButton(0) { + _thumbnailSupport(false), _saveDateSupport(false), _playTimeSupport(false), _saveMode(saveMode) +#ifndef DISABLE_SAVELOADCHOOSER_GRID + , _listButton(0), _gridButton(0) +#endif // !DISABLE_SAVELOADCHOOSER_GRID + { +#ifndef DISABLE_SAVELOADCHOOSER_GRID addChooserButtons(); +#endif // !DISABLE_SAVELOADCHOOSER_GRID } void SaveLoadChooserDialog::open() { @@ -88,6 +100,7 @@ int SaveLoadChooserDialog::run(const Common::String &target, const MetaEngine *m } void SaveLoadChooserDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { +#ifndef DISABLE_SAVELOADCHOOSER_GRID switch (cmd) { case kListSwitchCmd: setResult(kSwitchSaveLoadDialog); @@ -108,10 +121,29 @@ void SaveLoadChooserDialog::handleCommand(CommandSender *sender, uint32 cmd, uin default: break; } +#endif // !DISABLE_SAVELOADCHOOSER_GRID return Dialog::handleCommand(sender, cmd, data); } +void SaveLoadChooserDialog::reflowLayout() { +#ifndef DISABLE_SAVELOADCHOOSER_GRID + addChooserButtons(); + + const SaveLoadChooserType currentType = getType(); + const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(*_metaEngine); + + // Change the dialog type if there is any need for it. + if (requestedType != currentType) { + setResult(kSwitchSaveLoadDialog); + close(); + } +#endif // !DISABLE_SAVELOADCHOOSER_GRID + + Dialog::reflowLayout(); +} + +#ifndef DISABLE_SAVELOADCHOOSER_GRID void SaveLoadChooserDialog::addChooserButtons() { if (_listButton) { removeWidget(_listButton); @@ -131,21 +163,6 @@ void SaveLoadChooserDialog::addChooserButtons() { } } -void SaveLoadChooserDialog::reflowLayout() { - addChooserButtons(); - - const SaveLoadChooserType currentType = getType(); - const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(*_metaEngine); - - // Change the dialog type if there is any need for it. - if (requestedType != currentType) { - setResult(kSwitchSaveLoadDialog); - close(); - } - - Dialog::reflowLayout(); -} - ButtonWidget *SaveLoadChooserDialog::createSwitchButton(const Common::String &name, const char *desc, const char *tooltip, const char *image, uint32 cmd) { ButtonWidget *button; @@ -160,6 +177,7 @@ ButtonWidget *SaveLoadChooserDialog::createSwitchButton(const Common::String &na return button; } +#endif // !DISABLE_SAVELOADCHOOSER_GRID // SaveLoadChooserSimple implementation @@ -480,6 +498,8 @@ void SaveLoadChooserSimple::updateSaveList() { // SaveLoadChooserGrid implementation +#ifndef DISABLE_SAVELOADCHOOSER_GRID + enum { kNextCmd = 'NEXT', kPrevCmd = 'PREV', @@ -854,4 +874,6 @@ void SavenameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat } } +#endif // !DISABLE_SAVELOADCHOOSER_GRID + } // End of namespace GUI diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 05c0715fe0..50b7d419b7 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -31,12 +31,22 @@ namespace GUI { #define kSwitchSaveLoadDialog -2 +// TODO: We might want to disable the grid based save/load chooser for more +// platforms, than those which define DISABLE_FANCY_THEMES. But those are +// probably not able to handle the grid chooser anyway, so disabling it +// for them is a good start. +#ifdef DISABLE_FANCY_THEMES +#define DISABLE_SAVELOADCHOOSER_GRID +#endif // DISABLE_FANCY_THEMES + +#ifndef DISABLE_SAVELOADCHOOSER_GRID enum SaveLoadChooserType { kSaveLoadDialogList = 0, kSaveLoadDialogGrid = 1 }; SaveLoadChooserType getRequestedSaveLoadDialog(const MetaEngine &metaEngine); +#endif // !DISABLE_SAVELOADCHOOSER_GRID class SaveLoadChooserDialog : protected Dialog { public: @@ -49,7 +59,9 @@ public: virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); +#ifndef DISABLE_SAVELOADCHOOSER_GRID virtual SaveLoadChooserType getType() const = 0; +#endif // !DISABLE_SAVELOADCHOOSER_GRID int run(const Common::String &target, const MetaEngine *metaEngine); virtual const Common::String &getResultString() const = 0; @@ -66,11 +78,13 @@ protected: bool _playTimeSupport; Common::String _target; +#ifndef DISABLE_SAVELOADCHOOSER_GRID ButtonWidget *_listButton; ButtonWidget *_gridButton; void addChooserButtons(); ButtonWidget *createSwitchButton(const Common::String &name, const char *desc, const char *tooltip, const char *image, uint32 cmd = 0); +#endif // !DISABLE_SAVELOADCHOOSER_GRID }; class SaveLoadChooserSimple : public SaveLoadChooserDialog { @@ -85,7 +99,9 @@ public: virtual void reflowLayout(); +#ifndef DISABLE_SAVELOADCHOOSER_GRID virtual SaveLoadChooserType getType() const { return kSaveLoadDialogList; } +#endif // !DISABLE_SAVELOADCHOOSER_GRID virtual void close(); private: @@ -109,6 +125,7 @@ private: void updateSelection(bool redraw); }; +#ifndef DISABLE_SAVELOADCHOOSER_GRID class EditTextWidget; @@ -186,6 +203,8 @@ private: void updateSaves(); }; +#endif // !DISABLE_SAVELOADCHOOSER_GRID + } // End of namespace GUI #endif diff --git a/gui/saveload.cpp b/gui/saveload.cpp index d6a8688ce3..c2bbcd9bec 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -40,6 +40,7 @@ SaveLoadChooser::~SaveLoadChooser() { } void SaveLoadChooser::selectChooser(const MetaEngine &engine) { +#ifndef DISABLE_SAVELOADCHOOSER_GRID const SaveLoadChooserType requestedType = getRequestedSaveLoadDialog(engine); if (!_impl || _impl->getType() != requestedType) { delete _impl; @@ -51,10 +52,13 @@ void SaveLoadChooser::selectChooser(const MetaEngine &engine) { break; case kSaveLoadDialogList: +#endif // !DISABLE_SAVELOADCHOOSER_GRID _impl = new SaveLoadChooserSimple(_title, _buttonLabel, _saveMode); +#ifndef DISABLE_SAVELOADCHOOSER_GRID break; } } +#endif // !DISABLE_SAVELOADCHOOSER_GRID } Common::String SaveLoadChooser::createDefaultSaveDescription(const int slot) const { @@ -91,10 +95,11 @@ int SaveLoadChooser::runModalWithPluginAndTarget(const EnginePlugin *plugin, con int ret; do { ret = _impl->run(target, &(**plugin)); - +#ifndef DISABLE_SAVELOADCHOOSER_GRID if (ret == kSwitchSaveLoadDialog) { selectChooser(**plugin); } +#endif // !DISABLE_SAVELOADCHOOSER_GRID } while (ret < -1); // Revert to the old active domain -- cgit v1.2.3 From 537b1969bf896ee4e72e9d042e4b7f41c921d38c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 25 Jul 2012 00:58:16 +0300 Subject: SCI: Rewrite the color remapping code to support simultaneous effects Fixes the torch in the full version of QFG4 --- engines/sci/graphics/palette.cpp | 43 ++++++++++++++++++++-------------------- engines/sci/graphics/palette.h | 17 ++++++++++++---- engines/sci/graphics/view.cpp | 8 ++++---- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index cb5c0fe614..9b8618c0ef 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -143,8 +143,9 @@ void GfxPalette::createFromData(byte *data, int bytesLeft, Palette *paletteOut) memset(paletteOut, 0, sizeof(Palette)); // Setup 1:1 mapping - for (colorNo = 0; colorNo < 256; colorNo++) + for (colorNo = 0; colorNo < 256; colorNo++) { paletteOut->mapping[colorNo] = colorNo; + } if (bytesLeft < 37) { // This happens when loading palette of picture 0 in sq5 - the resource is broken and doesn't contain a full @@ -332,18 +333,26 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { } } -bool GfxPalette::isRemapMask(byte color) { - return (_remapOn && (color >= _remappingMaskFrom && color <= _remappingMaskTo)); +byte GfxPalette::remapColor(byte remappedColor, byte screenColor) { + assert(_remapOn); + if (_remappingType[remappedColor] == kRemappingByRange) + return _remappingByRange[screenColor]; + else if (_remappingType[remappedColor] == kRemappingByPercent) + return _remappingByPercent[screenColor]; + else + error("remapColor(): Color %d isn't remapped", remappedColor); + + return 0; // should never reach here } void GfxPalette::resetRemapping() { _remapOn = false; - _remappingMaskFrom = 0; - _remappingMaskTo = 0; _remappingPercentToSet = 0; for (int i = 0; i < 256; i++) { - _remappingTable[i] = i; + _remappingType[i] = kRemappingNone; + _remappingByPercent[i] = i; + _remappingByRange[i] = i; } } @@ -356,28 +365,17 @@ void GfxPalette::setRemappingPercent(byte color, byte percent) { // copySysPaletteToScreen(). _remappingPercentToSet = percent; - if (_remappingMaskFrom > color || _remappingMaskFrom == 0) - _remappingMaskFrom = color; - if (_remappingMaskTo < color) - _remappingMaskTo = color; + _remappingType[color] = kRemappingByPercent; } void GfxPalette::setRemappingRange(byte color, byte from, byte to, byte base) { _remapOn = true; for (int i = from; i <= to; i++) { - _remappingTable[i] = i + base; + _remappingByRange[i] = i + base; } - if (_remappingMaskFrom > color || _remappingMaskFrom == 0) - _remappingMaskFrom = color; - if (_remappingMaskTo < color) - _remappingMaskTo = color; -} - -byte GfxPalette::remapColor(byte color) { - assert(_remapOn); - return _remappingTable[color]; + _remappingType[color] = kRemappingByRange; } bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) { @@ -548,7 +546,7 @@ void GfxPalette::copySysPaletteToScreen() { byte r = _sysPalette.colors[i].r * _remappingPercentToSet / 100; byte g = _sysPalette.colors[i].g * _remappingPercentToSet / 100; byte b = _sysPalette.colors[i].b * _remappingPercentToSet / 100; - _remappingTable[i] = kernelFindColor(r, g, b); + _remappingByPercent[i] = kernelFindColor(r, g, b); } } @@ -1060,8 +1058,9 @@ bool GfxPalette::loadClut(uint16 clutId) { memset(&pal, 0, sizeof(Palette)); // Setup 1:1 mapping - for (int i = 0; i < 256; i++) + for (int i = 0; i < 256; i++) { pal.mapping[i] = i; + } // Now load in the palette for (int i = 1; i <= 236; i++) { diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 134ade5e36..9898315897 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -31,6 +31,12 @@ namespace Sci { class ResourceManager; class GfxScreen; +enum ColorRemappingType { + kRemappingNone = 0, + kRemappingByRange = 1, + kRemappingByPercent = 2 +}; + /** * Palette class, handles palette operations like changing intensity, setting up the palette, merging different palettes */ @@ -56,8 +62,10 @@ public: void resetRemapping(); void setRemappingPercent(byte color, byte percent); void setRemappingRange(byte color, byte from, byte to, byte base); - bool isRemapMask(byte color); - byte remapColor(byte color); + bool isRemapped(byte color) const { + return _remapOn && (_remappingType[color] != kRemappingNone); + } + byte remapColor(byte remappedColor, byte screenColor); void setOnScreen(); void copySysPaletteToScreen(); @@ -130,8 +138,9 @@ private: uint16 _totalScreenColors; bool _remapOn; - byte _remappingTable[256]; - uint16 _remappingMaskFrom, _remappingMaskTo; + ColorRemappingType _remappingType[256]; + byte _remappingByPercent[256]; + byte _remappingByRange[256]; uint16 _remappingPercentToSet; void loadMacIconBarPalette(); diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index f68ed1443a..36aaae9232 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -742,10 +742,10 @@ void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const const int y2 = clipRectTranslated.top + y; if (!upscaledHires) { if (priority >= _screen->getPriority(x2, y2)) { - if (!_palette->isRemapMask(palette->mapping[color])) { + if (!_palette->isRemapped(palette->mapping[color])) { _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); } else { - byte remappedColor = _palette->remapColor(_screen->getVisual(x2, y2)); + byte remappedColor = _palette->remapColor(palette->mapping[color], _screen->getVisual(x2, y2)); _screen->putPixel(x2, y2, drawMask, remappedColor, priority, 0); } } @@ -857,10 +857,10 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, const int x2 = clipRectTranslated.left + x; const int y2 = clipRectTranslated.top + y; if (color != clearKey && priority >= _screen->getPriority(x2, y2)) { - if (!_palette->isRemapMask(palette->mapping[color])) { + if (!_palette->isRemapped(palette->mapping[color])) { _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); } else { - byte remappedColor = _palette->remapColor(_screen->getVisual(x2, y2)); + byte remappedColor = _palette->remapColor(palette->mapping[color], _screen->getVisual(x2, y2)); _screen->putPixel(x2, y2, drawMask, remappedColor, priority, 0); } } -- cgit v1.2.3 From 797dbfe506d5273c0385997401aa32524995df33 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 25 Jul 2012 01:16:13 +0300 Subject: SCI: Set the RemapByPercent palette initially This needs to be performed because the screen palette might not change after the call. Fixes the display of the bat in the character selection screen in the full version of QFG4 --- engines/sci/graphics/palette.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 9b8618c0ef..68104b0ac8 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -361,10 +361,17 @@ void GfxPalette::setRemappingPercent(byte color, byte percent) { // We need to defer the setup of the remapping table every time the screen // palette is changed, so that kernelFindColor() can find the correct - // colors. The actual setup of the remapping table will be performed in - // copySysPaletteToScreen(). + // colors. Set it once here, in case the palette stays the same and update + // it on each palette change by copySysPaletteToScreen(). _remappingPercentToSet = percent; + for (int i = 0; i < 256; i++) { + byte r = _sysPalette.colors[i].r * _remappingPercentToSet / 100; + byte g = _sysPalette.colors[i].g * _remappingPercentToSet / 100; + byte b = _sysPalette.colors[i].b * _remappingPercentToSet / 100; + _remappingByPercent[i] = kernelFindColor(r, g, b); + } + _remappingType[color] = kRemappingByPercent; } -- cgit v1.2.3 From 55e508b91f840cd4f6358d1a1ff192b16ab1338c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 25 Jul 2012 01:32:34 +0300 Subject: SCI: Add a workaround for QFG4, screen 140 (character selection screen) --- engines/sci/engine/kgraphics32.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 3d2c2af81b..d3db28226a 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -738,6 +738,12 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { switch (operation) { case 0: { // turn remapping off + // WORKAROUND: Game scripts in QFG4 erroneously turn remapping off in room + // 140 (the character point allocation screen) and never turn it back on, + // even if it's clearly used in that screen. + if (g_sci->getGameId() == GID_QFG4 && s->currentRoomNumber() == 140) + return s->r_acc; + int16 base = (argc >= 2) ? argv[1].toSint16() : 0; if (base > 0) warning("kRemapColors(0) called with base %d", base); -- cgit v1.2.3 From 6ade0e145717410cd1268b01f7820d6c851c4375 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 25 Jul 2012 02:29:57 +0300 Subject: SCI: Expand an uninitialized read workaround for SQ6 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 15fca0322c..ccb78776dd 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -165,7 +165,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_SQ4, -1, 928, -1, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // CD: happens in the options dialog and in-game when speech and subtitles are used simultaneously { GID_SQ5, 201, 201, 0, "buttonPanel", "doVerb", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking at the orange or red button - bug #3038563 { GID_SQ6, -1, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // Demo and full version: called when the game starts (demo: room 0, full: room 100) - { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu + { GID_SQ6, -1, 64950, -1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu, when entering the Orion's Belt bar (room 300), and perhaps other places { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game { GID_TORIN, -1, 64017, 0, "oFlags", "clear", -1, 0, { WORKAROUND_FAKE, 0 } }, // entering Torin's home in the French version SCI_WORKAROUNDENTRY_TERMINATOR -- cgit v1.2.3 From 09f1519d6d369e7e59102b53cfb56a731bff99fb Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 Jul 2012 00:39:21 -0400 Subject: VIDEO: Stop and restart tracks when seeking/rewinding --- video/video_decoder.cpp | 32 ++++++++++++++++++++++++++------ video/video_decoder.h | 4 ++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 1461f5dc3d..355c94abb1 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -256,12 +256,18 @@ bool AdvancedVideoDecoder::rewind() { _needsRewind = false; - // TODO: Pause status + // Stop all tracks so they can be rewound + if (_isPlaying) + stopAllTracks(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) if (!(*it)->rewind()) return false; + // Now that we've rewound, start all tracks again + if (_isPlaying) + startAllTracks(); + _audioStartOffset = 0; _startTime = g_system->getMillis(); return true; @@ -284,12 +290,18 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { _needsRewind = false; - // TODO: Pause status + // Stop all tracks so they can be seeked + if (_isPlaying) + stopAllTracks(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) if (!(*it)->seek(time)) return false; + // Now that we've seeked, start all tracks again + if (_isPlaying) + startAllTracks(); + _audioStartOffset = time; _startTime = g_system->getMillis() - time.msecs(); return true; @@ -307,8 +319,7 @@ void AdvancedVideoDecoder::start() { if (_needsRewind) rewind(); - for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) - (*it)->start(); + startAllTracks(); } void AdvancedVideoDecoder::stop() { @@ -321,8 +332,7 @@ void AdvancedVideoDecoder::stop() { _palette = 0; _dirtyPalette = false; - for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) - (*it)->stop(); + stopAllTracks(); // Also reset the pause state. _pauseLevel = 0; @@ -584,6 +594,16 @@ const AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack return bestTrack; } +void AdvancedVideoDecoder::startAllTracks() { + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + (*it)->start(); +} + +void AdvancedVideoDecoder::stopAllTracks() { + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + (*it)->stop(); +} + ////////////////////////////////////////////// ///////////////// DEPRECATED ///////////////// ////////////////////////////////////////////// diff --git a/video/video_decoder.h b/video/video_decoder.h index 616d6c4f96..c77fb44dfe 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -670,6 +670,10 @@ private: // Palette settings from individual tracks mutable bool _dirtyPalette; const byte *_palette; + + // Internal helper functions + void stopAllTracks(); + void startAllTracks(); }; /** -- cgit v1.2.3 From 714c6ae1195ac372998c3d5b6f3739725554bf85 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 Jul 2012 00:44:22 -0400 Subject: VIDEO: Add internal helper function for checking on video track end status --- video/video_decoder.cpp | 8 ++++++++ video/video_decoder.h | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 355c94abb1..80a208fda3 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -556,6 +556,14 @@ const AdvancedVideoDecoder::Track *AdvancedVideoDecoder::getTrack(uint track) co return _tracks[track]; } +bool AdvancedVideoDecoder::endOfVideoTracks() const { + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeVideo && !(*it)->endOfTrack()) + return false; + + return true; +} + AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() { VideoTrack *bestTrack = 0; uint32 bestTime = 0xFFFFFFFF; diff --git a/video/video_decoder.h b/video/video_decoder.h index c77fb44dfe..0848ad09c7 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -656,6 +656,14 @@ protected: */ const Track *getTrack(uint track) const; + /** + * Find out if all video tracks have finished + * + * This is useful if one wants to figure out if they need to buffer all + * remaining audio in a file. + */ + bool endOfVideoTracks() const; + private: // Tracks owned by this AdvancedVideoDecoder typedef Common::Array TrackList; -- cgit v1.2.3 From e7836beabb47c5415c6239cc1e344450b7bb3c8d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 25 Jul 2012 12:13:35 +0300 Subject: SCI: Silence some very chatty warnings Also, add an example room where kRemapToGray is called --- engines/sci/engine/kgraphics32.cpp | 6 ++++-- engines/sci/engine/ksound.cpp | 11 +++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index d3db28226a..685b3c0bd3 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -369,7 +369,8 @@ reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) { case 10: // Where, called by ScrollableWindow::where // TODO // argv[2] is an unknown integer - kStub(s, argc, argv); + // Silenced the warnings because of the high amount of console spam + //kStub(s, argc, argv); break; case 11: // Go, called by ScrollableWindow::scrollTo // 2 extra parameters here @@ -770,7 +771,8 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { } break; case 3: { // remap to gray - int16 color = argv[1].toSint16(); // this is subtracted from a maximum color value, and can be offset by 10 + // Example call: QFG4 room 490 (Baba Yaga's hut) - params are color 253, 75% and 0 + int16 color = argv[1].toSint16(); int16 percent = argv[2].toSint16(); // 0 - 100 uint16 unk3 = (argc >= 4) ? argv[3].toUint16() : 0; warning("kRemapColors: RemapToGray color %d by %d percent (unk3 = %d)", color, percent, unk3); diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index b378b4d58b..0633267db4 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -140,12 +140,14 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { ((argv[3].toUint16() & 0xff) << 16) | ((argv[4].toUint16() & 0xff) << 8) | (argv[5].toUint16() & 0xff); - if (argc == 8) { + // Removed warning because of the high amount of console spam + /*if (argc == 8) { + // TODO: Handle the extra 2 SCI21 params // argv[6] is always 1 // argv[7] is the contents of global 229 (0xE5) warning("kDoAudio: Play called with SCI2.1 extra parameters: %04x:%04x and %04x:%04x", PRINT_REG(argv[6]), PRINT_REG(argv[7])); - } + }*/ } else { warning("kDoAudio: Play called with an unknown number of parameters (%d)", argc); return NULL_REG; @@ -244,6 +246,11 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { // Used in Pharkas whenever a speech sample starts (takes no params) //warning("kDoAudio: Unhandled case 13, %d extra arguments passed", argc - 1); break; + case 17: + // Seems to be some sort of audio sync, used in SQ6. Silenced the + // warning due to the high level of spam it produces. (takes no params) + //warning("kDoAudio: Unhandled case 17, %d extra arguments passed", argc - 1); + break; default: warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); } -- cgit v1.2.3 From 31f9e96aeef546ab5d0bf829fe427ce98a62c40f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 25 Jul 2012 12:14:33 +0300 Subject: SCI: Add a workaround for a script bug in QFG4 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index ccb78776dd..821549bb8c 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -397,6 +397,7 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + { GID_QFG4, 770, 110, 0, "dreamer", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during the dream sequence, a 3rd parameter is passed by accident SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From c0cece8d1335a3397ea980d9a2abc4075656068c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 Jul 2012 11:19:36 -0400 Subject: VIDEO: Add functions for default high color PixelFormat To be used by video that converts from YUV to RGB --- video/video_decoder.cpp | 6 ++++++ video/video_decoder.h | 20 +++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 80a208fda3..8b9a009b98 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -101,6 +101,12 @@ AdvancedVideoDecoder::AdvancedVideoDecoder() { _audioVolume = Audio::Mixer::kMaxChannelVolume; _audioBalance = 0; _pauseLevel = 0; + + // Find the best format for output + _defaultHighColorFormat = g_system->getScreenFormat(); + + if (_defaultHighColorFormat.bytesPerPixel == 1) + _defaultHighColorFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0); } void AdvancedVideoDecoder::close() { diff --git a/video/video_decoder.h b/video/video_decoder.h index 0848ad09c7..a6dbed8fc5 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -27,6 +27,7 @@ #include "audio/timestamp.h" // TODO: Move this to common/ ? #include "common/array.h" #include "common/str.h" +#include "graphics/pixelformat.h" namespace Audio { class AudioStream; @@ -40,7 +41,6 @@ class SeekableReadStream; } namespace Graphics { -struct PixelFormat; struct Surface; } @@ -370,6 +370,16 @@ public: */ bool addStreamFileTrack(const Common::String &baseName); + /** + * Set the default high color format for videos that convert from YUV. + * + * By default, AdvancedVideoDecoder will attempt to use the screen format + * if it's >8bpp and use a 32bpp format when not. + * + * This must be set before calling loadStream(). + */ + void setDefaultHighColorFormat(const Graphics::PixelFormat &format) { _defaultHighColorFormat = format; } + // Future API //void setRate(const Common::Rational &rate); //Common::Rational getRate() const; @@ -664,6 +674,11 @@ protected: */ bool endOfVideoTracks() const; + /** + * Get the default high color format + */ + Graphics::PixelFormat getDefaultHighColorFormat() const { return _defaultHighColorFormat; } + private: // Tracks owned by this AdvancedVideoDecoder typedef Common::Array TrackList; @@ -679,6 +694,9 @@ private: mutable bool _dirtyPalette; const byte *_palette; + // Default PixelFormat settings + Graphics::PixelFormat _defaultHighColorFormat; + // Internal helper functions void stopAllTracks(); void startAllTracks(); -- cgit v1.2.3 From 71daae7bbc03c1d9327f5353b1450f9d0d9774da Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 25 Jul 2012 17:21:36 +0200 Subject: GUI: Use "OK" instead of "Ok" in SavenameDialog. --- gui/saveload-dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 3c793c9e25..c714147488 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -842,7 +842,7 @@ SavenameDialog::SavenameDialog() _title = new StaticTextWidget(this, "SavenameDialog.DescriptionText", Common::String()); new ButtonWidget(this, "SavenameDialog.Cancel", _("Cancel"), 0, kCloseCmd); - new ButtonWidget(this, "SavenameDialog.Ok", _("Ok"), 0, kOKCmd); + new ButtonWidget(this, "SavenameDialog.Ok", _("OK"), 0, kOKCmd); _description = new EditTextWidget(this, "SavenameDialog.Description", Common::String(), 0, 0, kOKCmd); } -- cgit v1.2.3 From 57a06e383b7c3c950653a99c81c1c7fd7dcd5b1d Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 25 Jul 2012 11:22:28 -0400 Subject: VIDEO: Convert Bink to the new AdvancedVideoDecoder API --- engines/scumm/he/animation_he.cpp | 8 +- video/bink_decoder.cpp | 1056 +++++++++++++++++-------------------- video/bink_decoder.h | 420 ++++++++------- 3 files changed, 707 insertions(+), 777 deletions(-) diff --git a/engines/scumm/he/animation_he.cpp b/engines/scumm/he/animation_he.cpp index b37a565aab..8329511c14 100644 --- a/engines/scumm/he/animation_he.cpp +++ b/engines/scumm/he/animation_he.cpp @@ -40,10 +40,7 @@ MoviePlayer::MoviePlayer(ScummEngine_v90he *vm, Audio::Mixer *mixer) : _vm(vm) { _video = new Video::BinkDecoder(); else #endif - { _video = new Video::SmackerDecoder(); - ((Video::AdvancedVideoDecoder *)_video)->start(); - } _flags = 0; _wizResNum = 0; @@ -64,11 +61,16 @@ int MoviePlayer::load(const char *filename, int flags, int image) { if (_video->isVideoLoaded()) _video->close(); + // Ensure that Bink will use our PixelFormat + ((Video::AdvancedVideoDecoder *)_video)->setDefaultHighColorFormat(g_system->getScreenFormat()); + if (!_video->loadFile(filename)) { warning("Failed to load video file %s", filename); return -1; } + ((Video::AdvancedVideoDecoder *)_video)->start(); + debug(1, "Playing video %s", filename); if (flags & 2) diff --git a/video/bink_decoder.cpp b/video/bink_decoder.cpp index 538487f067..cac0b356c5 100644 --- a/video/bink_decoder.cpp +++ b/video/bink_decoder.cpp @@ -24,6 +24,7 @@ // based quite heavily on the Bink decoder found in FFmpeg. // Many thanks to Kostya Shishkov for doing the hard work. +#include "audio/audiostream.h" #include "audio/decoders/raw.h" #include "common/util.h" @@ -60,139 +61,108 @@ static const uint32 kDCStartBits = 11; namespace Video { -BinkDecoder::VideoFrame::VideoFrame() : bits(0) { -} - -BinkDecoder::VideoFrame::~VideoFrame() { - delete bits; +BinkDecoder::BinkDecoder() { + _bink = 0; } - -BinkDecoder::AudioTrack::AudioTrack() : bits(0), bands(0), rdft(0), dct(0) { +BinkDecoder::~BinkDecoder() { + close(); } -BinkDecoder::AudioTrack::~AudioTrack() { - delete bits; - - delete[] bands; - - delete rdft; - delete dct; -} +bool BinkDecoder::loadStream(Common::SeekableReadStream *stream) { + close(); + uint32 id = stream->readUint32BE(); + if ((id != kBIKfID) && (id != kBIKgID) && (id != kBIKhID) && (id != kBIKiID)) + return false; -BinkDecoder::BinkDecoder() { - _bink = 0; - _audioTrack = 0; + uint32 fileSize = stream->readUint32LE() + 8; + uint32 frameCount = stream->readUint32LE(); + uint32 largestFrameSize = stream->readUint32LE(); - for (int i = 0; i < 16; i++) - _huffman[i] = 0; + if (largestFrameSize > fileSize) { + warning("Largest frame size greater than file size"); + return false; + } - for (int i = 0; i < kSourceMAX; i++) { - _bundles[i].countLength = 0; + stream->skip(4); - _bundles[i].huffman.index = 0; - for (int j = 0; j < 16; j++) - _bundles[i].huffman.symbols[j] = j; + uint32 width = stream->readUint32LE(); + uint32 height = stream->readUint32LE(); - _bundles[i].data = 0; - _bundles[i].dataEnd = 0; - _bundles[i].curDec = 0; - _bundles[i].curPtr = 0; + uint32 frameRateNum = stream->readUint32LE(); + uint32 frameRateDen = stream->readUint32LE(); + if (frameRateNum == 0 || frameRateDen == 0) { + warning("Invalid frame rate (%d/%d)", frameRateNum, frameRateDen); + return false; } - for (int i = 0; i < 16; i++) { - _colHighHuffman[i].index = 0; - for (int j = 0; j < 16; j++) - _colHighHuffman[i].symbols[j] = j; - } + _bink = stream; - for (int i = 0; i < 4; i++) { - _curPlanes[i] = 0; - _oldPlanes[i] = 0; - } + uint32 videoFlags = _bink->readUint32LE(); - _audioStream = 0; -} + // BIKh and BIKi swap the chroma planes + addTrack(new BinkVideoTrack(width, height, getDefaultHighColorFormat(), frameCount, + Common::Rational(frameRateNum, frameRateDen), (id == kBIKhID || id == kBIKiID), videoFlags & kVideoFlagAlpha, id)); -void BinkDecoder::startAudio() { - if (_audioTrack < _audioTracks.size()) { - const AudioTrack &audio = _audioTracks[_audioTrack]; + uint32 audioTrackCount = _bink->readUint32LE(); - _audioStream = Audio::makeQueuingAudioStream(audio.outSampleRate, audio.outChannels == 2); - g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audioHandle, _audioStream, -1, getVolume(), getBalance()); - } // else no audio -} + if (audioTrackCount > 0) { + _audioTracks.reserve(audioTrackCount); -void BinkDecoder::stopAudio() { - if (_audioStream) { - g_system->getMixer()->stopHandle(_audioHandle); - _audioStream = 0; - } -} + _bink->skip(4 * audioTrackCount); -BinkDecoder::~BinkDecoder() { - close(); -} + // Reading audio track properties + for (uint32 i = 0; i < audioTrackCount; i++) { + AudioInfo track; -void BinkDecoder::close() { - reset(); + track.sampleRate = _bink->readUint16LE(); + track.flags = _bink->readUint16LE(); - // Stop audio - stopAudio(); + _audioTracks.push_back(track); - for (int i = 0; i < 4; i++) { - delete[] _curPlanes[i]; _curPlanes[i] = 0; - delete[] _oldPlanes[i]; _oldPlanes[i] = 0; + initAudioTrack(_audioTracks[i]); + } + + _bink->skip(4 * audioTrackCount); } - deinitBundles(); + // Reading video frame properties + _frames.resize(frameCount); + for (uint32 i = 0; i < frameCount; i++) { + _frames[i].offset = _bink->readUint32LE(); + _frames[i].keyFrame = _frames[i].offset & 1; - for (int i = 0; i < 16; i++) { - delete _huffman[i]; - _huffman[i] = 0; - } + _frames[i].offset &= ~1; - delete _bink; _bink = 0; - _surface.free(); + if (i != 0) + _frames[i - 1].size = _frames[i].offset - _frames[i - 1].offset; - _audioTrack = 0; + _frames[i].bits = 0; + } - for (int i = 0; i < kSourceMAX; i++) { - _bundles[i].countLength = 0; + _frames[frameCount - 1].size = _bink->size() - _frames[frameCount - 1].offset; - _bundles[i].huffman.index = 0; - for (int j = 0; j < 16; j++) - _bundles[i].huffman.symbols[j] = j; + return true; +} - _bundles[i].data = 0; - _bundles[i].dataEnd = 0; - _bundles[i].curDec = 0; - _bundles[i].curPtr = 0; - } +void BinkDecoder::close() { + AdvancedVideoDecoder::close(); - for (int i = 0; i < 16; i++) { - _colHighHuffman[i].index = 0; - for (int j = 0; j < 16; j++) - _colHighHuffman[i].symbols[j] = j; - } + delete _bink; + _bink = 0; _audioTracks.clear(); _frames.clear(); } -uint32 BinkDecoder::getTime() const { - if (_audioStream && g_system->getMixer()->isSoundHandleActive(_audioHandle)) - return g_system->getMixer()->getSoundElapsedTime(_audioHandle) + _audioStartOffset; - - return g_system->getMillis() - _startTime; -} +void BinkDecoder::readNextPacket() { + BinkVideoTrack *videoTrack = (BinkVideoTrack *)getTrack(0); -const Graphics::Surface *BinkDecoder::decodeNextFrame() { - if (endOfVideo()) - return 0; + if (videoTrack->endOfTrack()) + return; - VideoFrame &frame = _frames[_curFrame + 1]; + VideoFrame &frame = _frames[videoTrack->getCurFrame() + 1]; if (!_bink->seek(frame.offset)) error("Bad bink seek"); @@ -200,7 +170,7 @@ const Graphics::Surface *BinkDecoder::decodeNextFrame() { uint32 frameSize = frame.size; for (uint32 i = 0; i < _audioTracks.size(); i++) { - AudioTrack &audio = _audioTracks[i]; + AudioInfo &audio = _audioTracks[i]; uint32 audioPacketLength = _bink->readUint32LE(); @@ -210,24 +180,21 @@ const Graphics::Surface *BinkDecoder::decodeNextFrame() { error("Audio packet too big for the frame"); if (audioPacketLength >= 4) { + // Get our track - audio index plus one as the first track is video + BinkAudioTrack *audioTrack = (BinkAudioTrack *)getTrack(i + 1); uint32 audioPacketStart = _bink->pos(); uint32 audioPacketEnd = _bink->pos() + audioPacketLength; - if (i == _audioTrack) { - // Only play one audio track + // Number of samples in bytes + audio.sampleCount = _bink->readUint32LE() / (2 * audio.channels); - // Number of samples in bytes - audio.sampleCount = _bink->readUint32LE() / (2 * audio.channels); + audio.bits = new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink, + audioPacketStart + 4, audioPacketEnd), true); - audio.bits = - new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink, - audioPacketStart + 4, audioPacketEnd), true); + audioTrack->decodePacket(); - audioPacket(audio); - - delete audio.bits; - audio.bits = 0; - } + delete audio.bits; + audio.bits = 0; _bink->seek(audioPacketEnd); @@ -238,67 +205,125 @@ const Graphics::Surface *BinkDecoder::decodeNextFrame() { uint32 videoPacketStart = _bink->pos(); uint32 videoPacketEnd = _bink->pos() + frameSize; - frame.bits = - new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink, - videoPacketStart, videoPacketEnd), true); + frame.bits = new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink, + videoPacketStart, videoPacketEnd), true); - videoPacket(frame); + videoTrack->decodePacket(frame); delete frame.bits; frame.bits = 0; +} - _curFrame++; - if (_curFrame == 0) - _startTime = g_system->getMillis(); +BinkDecoder::VideoFrame::VideoFrame() : bits(0) { +} - return &_surface; +BinkDecoder::VideoFrame::~VideoFrame() { + delete bits; } -void BinkDecoder::audioPacket(AudioTrack &audio) { - if (!_audioStream) - return; - int outSize = audio.frameLen * audio.channels; - while (audio.bits->pos() < audio.bits->size()) { - int16 *out = (int16 *)malloc(outSize * 2); - memset(out, 0, outSize * 2); +BinkDecoder::AudioInfo::AudioInfo() : bits(0), bands(0), rdft(0), dct(0) { +} - audioBlock(audio, out); +BinkDecoder::AudioInfo::~AudioInfo() { + delete bits; - byte flags = Audio::FLAG_16BITS; - if (audio.outChannels == 2) - flags |= Audio::FLAG_STEREO; + delete[] bands; -#ifdef SCUMM_LITTLE_ENDIAN - flags |= Audio::FLAG_LITTLE_ENDIAN; -#endif + delete rdft; + delete dct; +} + +BinkDecoder::BinkVideoTrack::BinkVideoTrack(uint32 width, uint32 height, const Graphics::PixelFormat &format, uint32 frameCount, const Common::Rational &frameRate, bool swapPlanes, bool hasAlpha, uint32 id) : + _frameCount(frameCount), _frameRate(frameRate), _swapPlanes(swapPlanes), _hasAlpha(hasAlpha), _id(id) { + _curFrame = -1; + + for (int i = 0; i < 16; i++) + _huffman[i] = 0; - _audioStream->queueBuffer((byte *)out, audio.blockSize * 2, DisposeAfterUse::YES, flags); + for (int i = 0; i < kSourceMAX; i++) { + _bundles[i].countLength = 0; + + _bundles[i].huffman.index = 0; + for (int j = 0; j < 16; j++) + _bundles[i].huffman.symbols[j] = j; - if (audio.bits->pos() & 0x1F) // next data block starts at a 32-byte boundary - audio.bits->skip(32 - (audio.bits->pos() & 0x1F)); + _bundles[i].data = 0; + _bundles[i].dataEnd = 0; + _bundles[i].curDec = 0; + _bundles[i].curPtr = 0; + } + + for (int i = 0; i < 16; i++) { + _colHighHuffman[i].index = 0; + for (int j = 0; j < 16; j++) + _colHighHuffman[i].symbols[j] = j; + } + + _surface.create(width, height, format); + + // Give the planes a bit extra space + width = _surface.w + 32; + height = _surface.h + 32; + + _curPlanes[0] = new byte[ width * height ]; // Y + _curPlanes[1] = new byte[(width >> 1) * (height >> 1)]; // U, 1/4 resolution + _curPlanes[2] = new byte[(width >> 1) * (height >> 1)]; // V, 1/4 resolution + _curPlanes[3] = new byte[ width * height ]; // A + _oldPlanes[0] = new byte[ width * height ]; // Y + _oldPlanes[1] = new byte[(width >> 1) * (height >> 1)]; // U, 1/4 resolution + _oldPlanes[2] = new byte[(width >> 1) * (height >> 1)]; // V, 1/4 resolution + _oldPlanes[3] = new byte[ width * height ]; // A + + // Initialize the video with solid black + memset(_curPlanes[0], 0, width * height ); + memset(_curPlanes[1], 0, (width >> 1) * (height >> 1)); + memset(_curPlanes[2], 0, (width >> 1) * (height >> 1)); + memset(_curPlanes[3], 255, width * height ); + memset(_oldPlanes[0], 0, width * height ); + memset(_oldPlanes[1], 0, (width >> 1) * (height >> 1)); + memset(_oldPlanes[2], 0, (width >> 1) * (height >> 1)); + memset(_oldPlanes[3], 255, width * height ); + + initBundles(); + initHuffman(); +} + +BinkDecoder::BinkVideoTrack::~BinkVideoTrack() { + for (int i = 0; i < 4; i++) { + delete[] _curPlanes[i]; _curPlanes[i] = 0; + delete[] _oldPlanes[i]; _oldPlanes[i] = 0; + } + + deinitBundles(); + + for (int i = 0; i < 16; i++) { + delete _huffman[i]; + _huffman[i] = 0; } + + _surface.free(); } -void BinkDecoder::videoPacket(VideoFrame &video) { - assert(video.bits); +void BinkDecoder::BinkVideoTrack::decodePacket(VideoFrame &frame) { + assert(frame.bits); if (_hasAlpha) { if (_id == kBIKiID) - video.bits->skip(32); + frame.bits->skip(32); - decodePlane(video, 3, false); + decodePlane(frame, 3, false); } if (_id == kBIKiID) - video.bits->skip(32); + frame.bits->skip(32); for (int i = 0; i < 3; i++) { int planeIdx = ((i == 0) || !_swapPlanes) ? i : (i ^ 3); - decodePlane(video, planeIdx, i != 0); + decodePlane(frame, planeIdx, i != 0); - if (video.bits->pos() >= video.bits->size()) + if (frame.bits->pos() >= frame.bits->size()) break; } @@ -311,10 +336,11 @@ void BinkDecoder::videoPacket(VideoFrame &video) { // And swap the planes with the reference planes for (int i = 0; i < 4; i++) SWAP(_curPlanes[i], _oldPlanes[i]); -} -void BinkDecoder::decodePlane(VideoFrame &video, int planeIdx, bool isChroma) { + _curFrame++; +} +void BinkDecoder::BinkVideoTrack::decodePlane(VideoFrame &video, int planeIdx, bool isChroma) { uint32 blockWidth = isChroma ? ((_surface.w + 15) >> 4) : ((_surface.w + 7) >> 3); uint32 blockHeight = isChroma ? ((_surface.h + 15) >> 4) : ((_surface.h + 7) >> 3); uint32 width = isChroma ? (_surface.w >> 1) : _surface.w; @@ -371,48 +397,38 @@ void BinkDecoder::decodePlane(VideoFrame &video, int planeIdx, bool isChroma) { } switch (blockType) { - case kBlockSkip: - blockSkip(ctx); - break; - - case kBlockScaled: - blockScaled(ctx); - break; - - case kBlockMotion: - blockMotion(ctx); - break; - - case kBlockRun: - blockRun(ctx); - break; - - case kBlockResidue: - blockResidue(ctx); - break; - - case kBlockIntra: - blockIntra(ctx); - break; - - case kBlockFill: - blockFill(ctx); - break; - - case kBlockInter: - blockInter(ctx); - break; - - case kBlockPattern: - blockPattern(ctx); - break; - - case kBlockRaw: - blockRaw(ctx); - break; - - default: - error("Unknown block type: %d", blockType); + case kBlockSkip: + blockSkip(ctx); + break; + case kBlockScaled: + blockScaled(ctx); + break; + case kBlockMotion: + blockMotion(ctx); + break; + case kBlockRun: + blockRun(ctx); + break; + case kBlockResidue: + blockResidue(ctx); + break; + case kBlockIntra: + blockIntra(ctx); + break; + case kBlockFill: + blockFill(ctx); + break; + case kBlockInter: + blockInter(ctx); + break; + case kBlockPattern: + blockPattern(ctx); + break; + case kBlockRaw: + blockRaw(ctx); + break; + default: + error("Unknown block type: %d", blockType); } } @@ -424,7 +440,7 @@ void BinkDecoder::decodePlane(VideoFrame &video, int planeIdx, bool isChroma) { } -void BinkDecoder::readBundle(VideoFrame &video, Source source) { +void BinkDecoder::BinkVideoTrack::readBundle(VideoFrame &video, Source source) { if (source == kSourceColors) { for (int i = 0; i < 16; i++) readHuffman(video, _colHighHuffman[i]); @@ -439,12 +455,11 @@ void BinkDecoder::readBundle(VideoFrame &video, Source source) { _bundles[source].curPtr = _bundles[source].data; } -void BinkDecoder::readHuffman(VideoFrame &video, Huffman &huffman) { +void BinkDecoder::BinkVideoTrack::readHuffman(VideoFrame &video, Huffman &huffman) { huffman.index = video.bits->getBits(4); if (huffman.index == 0) { // The first tree always gives raw nibbles - for (int i = 0; i < 16; i++) huffman.symbols[i] = i; @@ -455,7 +470,6 @@ void BinkDecoder::readHuffman(VideoFrame &video, Huffman &huffman) { if (video.bits->getBit()) { // Symbol selection - memset(hasSymbol, 0, 16); uint8 length = video.bits->getBits(3); @@ -493,214 +507,29 @@ void BinkDecoder::readHuffman(VideoFrame &video, Huffman &huffman) { memcpy(huffman.symbols, in, 16); } -void BinkDecoder::mergeHuffmanSymbols(VideoFrame &video, byte *dst, const byte *src, int size) { - const byte *src2 = src + size; - int size2 = size; - - do { - if (!video.bits->getBit()) { - *dst++ = *src++; - size--; - } else { - *dst++ = *src2++; - size2--; - } - - } while (size && size2); - - while (size--) - *dst++ = *src++; - while (size2--) - *dst++ = *src2++; -} - -bool BinkDecoder::loadStream(Common::SeekableReadStream *stream) { - Graphics::PixelFormat format = g_system->getScreenFormat(); - return loadStream(stream, format); -} - -bool BinkDecoder::loadStream(Common::SeekableReadStream *stream, const Graphics::PixelFormat &format) { - close(); - - _id = stream->readUint32BE(); - if ((_id != kBIKfID) && (_id != kBIKgID) && (_id != kBIKhID) && (_id != kBIKiID)) - return false; - - uint32 fileSize = stream->readUint32LE() + 8; - uint32 frameCount = stream->readUint32LE(); - uint32 largestFrameSize = stream->readUint32LE(); - - if (largestFrameSize > fileSize) { - warning("Largest frame size greater than file size"); - return false; - } - - stream->skip(4); - - uint32 width = stream->readUint32LE(); - uint32 height = stream->readUint32LE(); - - uint32 frameRateNum = stream->readUint32LE(); - uint32 frameRateDen = stream->readUint32LE(); - if (frameRateNum == 0 || frameRateDen == 0) { - warning("Invalid frame rate (%d/%d)", frameRateNum, frameRateDen); - return false; - } - - _frameRate = Common::Rational(frameRateNum, frameRateDen); - _bink = stream; - - _videoFlags = _bink->readUint32LE(); - - uint32 audioTrackCount = _bink->readUint32LE(); - - if (audioTrackCount > 1) { - warning("More than one audio track found. Using the first one"); - - _audioTrack = 0; - } - - if (audioTrackCount > 0) { - _audioTracks.reserve(audioTrackCount); - - _bink->skip(4 * audioTrackCount); - - // Reading audio track properties - for (uint32 i = 0; i < audioTrackCount; i++) { - AudioTrack track; - - track.sampleRate = _bink->readUint16LE(); - track.flags = _bink->readUint16LE(); - - _audioTracks.push_back(track); - - initAudioTrack(_audioTracks[i]); - } - - _bink->skip(4 * audioTrackCount); - } - - // Reading video frame properties - _frames.resize(frameCount); - for (uint32 i = 0; i < frameCount; i++) { - _frames[i].offset = _bink->readUint32LE(); - _frames[i].keyFrame = _frames[i].offset & 1; - - _frames[i].offset &= ~1; - - if (i != 0) - _frames[i - 1].size = _frames[i].offset - _frames[i - 1].offset; - - _frames[i].bits = 0; - } - - _frames[frameCount - 1].size = _bink->size() - _frames[frameCount - 1].offset; - - _hasAlpha = _videoFlags & kVideoFlagAlpha; - _swapPlanes = (_id == kBIKhID) || (_id == kBIKiID); // BIKh and BIKi swap the chroma planes - - _surface.create(width, height, format); - - // Give the planes a bit extra space - width = _surface.w + 32; - height = _surface.h + 32; - - _curPlanes[0] = new byte[ width * height ]; // Y - _curPlanes[1] = new byte[(width >> 1) * (height >> 1)]; // U, 1/4 resolution - _curPlanes[2] = new byte[(width >> 1) * (height >> 1)]; // V, 1/4 resolution - _curPlanes[3] = new byte[ width * height ]; // A - _oldPlanes[0] = new byte[ width * height ]; // Y - _oldPlanes[1] = new byte[(width >> 1) * (height >> 1)]; // U, 1/4 resolution - _oldPlanes[2] = new byte[(width >> 1) * (height >> 1)]; // V, 1/4 resolution - _oldPlanes[3] = new byte[ width * height ]; // A - - // Initialize the video with solid black - memset(_curPlanes[0], 0, width * height ); - memset(_curPlanes[1], 0, (width >> 1) * (height >> 1)); - memset(_curPlanes[2], 0, (width >> 1) * (height >> 1)); - memset(_curPlanes[3], 255, width * height ); - memset(_oldPlanes[0], 0, width * height ); - memset(_oldPlanes[1], 0, (width >> 1) * (height >> 1)); - memset(_oldPlanes[2], 0, (width >> 1) * (height >> 1)); - memset(_oldPlanes[3], 255, width * height ); - - initBundles(); - initHuffman(); - - startAudio(); - _audioStartOffset = 0; - - return true; -} - -void BinkDecoder::initAudioTrack(AudioTrack &audio) { - audio.sampleCount = 0; - audio.bits = 0; - - audio.channels = ((audio.flags & kAudioFlagStereo) != 0) ? 2 : 1; - audio.codec = ((audio.flags & kAudioFlagDCT ) != 0) ? kAudioCodecDCT : kAudioCodecRDFT; - - if (audio.channels > kAudioChannelsMax) - error("Too many audio channels: %d", audio.channels); - - uint32 frameLenBits; - // Calculate frame length - if (audio.sampleRate < 22050) - frameLenBits = 9; - else if(audio.sampleRate < 44100) - frameLenBits = 10; - else - frameLenBits = 11; - - audio.frameLen = 1 << frameLenBits; - - audio.outSampleRate = audio.sampleRate; - audio.outChannels = audio.channels; - - if (audio.codec == kAudioCodecRDFT) { - // RDFT audio already interleaves the samples correctly - - if (audio.channels == 2) - frameLenBits++; - - audio.sampleRate *= audio.channels; - audio.frameLen *= audio.channels; - audio.channels = 1; - } - - audio.overlapLen = audio.frameLen / 16; - audio.blockSize = (audio.frameLen - audio.overlapLen) * audio.channels; - audio.root = 2.0 / sqrt((double)audio.frameLen); - - uint32 sampleRateHalf = (audio.sampleRate + 1) / 2; - - // Calculate number of bands - for (audio.bandCount = 1; audio.bandCount < 25; audio.bandCount++) - if (sampleRateHalf <= binkCriticalFreqs[audio.bandCount - 1]) - break; - - audio.bands = new uint32[audio.bandCount + 1]; - - // Populate bands - audio.bands[0] = 1; - for (uint32 i = 1; i < audio.bandCount; i++) - audio.bands[i] = binkCriticalFreqs[i - 1] * (audio.frameLen / 2) / sampleRateHalf; - audio.bands[audio.bandCount] = audio.frameLen / 2; - - audio.first = true; +void BinkDecoder::BinkVideoTrack::mergeHuffmanSymbols(VideoFrame &video, byte *dst, const byte *src, int size) { + const byte *src2 = src + size; + int size2 = size; - for (uint8 i = 0; i < audio.channels; i++) - audio.coeffsPtr[i] = audio.coeffs + i * audio.frameLen; + do { + if (!video.bits->getBit()) { + *dst++ = *src++; + size--; + } else { + *dst++ = *src2++; + size2--; + } - audio.codec = ((audio.flags & kAudioFlagDCT) != 0) ? kAudioCodecDCT : kAudioCodecRDFT; + } while (size && size2); - if (audio.codec == kAudioCodecRDFT) - audio.rdft = new Common::RDFT(frameLenBits, Common::RDFT::DFT_C2R); - else if (audio.codec == kAudioCodecDCT) - audio.dct = new Common::DCT(frameLenBits, Common::DCT::DCT_III); + while (size--) + *dst++ = *src++; + + while (size2--) + *dst++ = *src2++; } -void BinkDecoder::initBundles() { +void BinkDecoder::BinkVideoTrack::initBundles() { uint32 bw = (_surface.w + 7) >> 3; uint32 bh = (_surface.h + 7) >> 3; uint32 blocks = bw * bh; @@ -729,21 +558,21 @@ void BinkDecoder::initBundles() { } } -void BinkDecoder::deinitBundles() { +void BinkDecoder::BinkVideoTrack::deinitBundles() { for (int i = 0; i < kSourceMAX; i++) delete[] _bundles[i].data; } -void BinkDecoder::initHuffman() { +void BinkDecoder::BinkVideoTrack::initHuffman() { for (int i = 0; i < 16; i++) _huffman[i] = new Common::Huffman(binkHuffmanLengths[i][15], 16, binkHuffmanCodes[i], binkHuffmanLengths[i]); } -byte BinkDecoder::getHuffmanSymbol(VideoFrame &video, Huffman &huffman) { +byte BinkDecoder::BinkVideoTrack::getHuffmanSymbol(VideoFrame &video, Huffman &huffman) { return huffman.symbols[_huffman[huffman.index]->getSymbol(*video.bits)]; } -int32 BinkDecoder::getBundleValue(Source source) { +int32 BinkDecoder::BinkVideoTrack::getBundleValue(Source source) { if ((source < kSourceXOff) || (source == kSourceRun)) return *_bundles[source].curPtr++; @@ -757,7 +586,7 @@ int32 BinkDecoder::getBundleValue(Source source) { return ret; } -uint32 BinkDecoder::readBundleCount(VideoFrame &video, Bundle &bundle) { +uint32 BinkDecoder::BinkVideoTrack::readBundleCount(VideoFrame &video, Bundle &bundle) { if (!bundle.curDec || (bundle.curDec > bundle.curPtr)) return 0; @@ -768,7 +597,7 @@ uint32 BinkDecoder::readBundleCount(VideoFrame &video, Bundle &bundle) { return n; } -void BinkDecoder::blockSkip(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockSkip(DecodeContext &ctx) { byte *dest = ctx.dest; byte *prev = ctx.prev; @@ -776,7 +605,7 @@ void BinkDecoder::blockSkip(DecodeContext &ctx) { memcpy(dest, prev, 8); } -void BinkDecoder::blockScaledSkip(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockScaledSkip(DecodeContext &ctx) { byte *dest = ctx.dest; byte *prev = ctx.prev; @@ -784,7 +613,7 @@ void BinkDecoder::blockScaledSkip(DecodeContext &ctx) { memcpy(dest, prev, 16); } -void BinkDecoder::blockScaledRun(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockScaledRun(DecodeContext &ctx) { const uint8 *scan = binkPatterns[ctx.video->bits->getBits(4)]; int i = 0; @@ -820,7 +649,7 @@ void BinkDecoder::blockScaledRun(DecodeContext &ctx) { ctx.dest[ctx.coordScaledMap4[*scan]] = getBundleValue(kSourceColors); } -void BinkDecoder::blockScaledIntra(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockScaledIntra(DecodeContext &ctx) { int16 block[64]; memset(block, 0, 64 * sizeof(int16)); @@ -841,7 +670,7 @@ void BinkDecoder::blockScaledIntra(DecodeContext &ctx) { } } -void BinkDecoder::blockScaledFill(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockScaledFill(DecodeContext &ctx) { byte v = getBundleValue(kSourceColors); byte *dest = ctx.dest; @@ -849,7 +678,7 @@ void BinkDecoder::blockScaledFill(DecodeContext &ctx) { memset(dest, v, 16); } -void BinkDecoder::blockScaledPattern(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockScaledPattern(DecodeContext &ctx) { byte col[2]; for (int i = 0; i < 2; i++) @@ -865,7 +694,7 @@ void BinkDecoder::blockScaledPattern(DecodeContext &ctx) { } } -void BinkDecoder::blockScaledRaw(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockScaledRaw(DecodeContext &ctx) { byte row[8]; byte *dest1 = ctx.dest; @@ -880,32 +709,27 @@ void BinkDecoder::blockScaledRaw(DecodeContext &ctx) { } } -void BinkDecoder::blockScaled(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockScaled(DecodeContext &ctx) { BlockType blockType = (BlockType) getBundleValue(kSourceSubBlockTypes); switch (blockType) { - case kBlockRun: - blockScaledRun(ctx); - break; - - case kBlockIntra: - blockScaledIntra(ctx); - break; - - case kBlockFill: - blockScaledFill(ctx); - break; - - case kBlockPattern: - blockScaledPattern(ctx); - break; - - case kBlockRaw: - blockScaledRaw(ctx); - break; - - default: - error("Invalid 16x16 block type: %d", blockType); + case kBlockRun: + blockScaledRun(ctx); + break; + case kBlockIntra: + blockScaledIntra(ctx); + break; + case kBlockFill: + blockScaledFill(ctx); + break; + case kBlockPattern: + blockScaledPattern(ctx); + break; + case kBlockRaw: + blockScaledRaw(ctx); + break; + default: + error("Invalid 16x16 block type: %d", blockType); } ctx.blockX += 1; @@ -913,7 +737,7 @@ void BinkDecoder::blockScaled(DecodeContext &ctx) { ctx.prev += 8; } -void BinkDecoder::blockMotion(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockMotion(DecodeContext &ctx) { int8 xOff = getBundleValue(kSourceXOff); int8 yOff = getBundleValue(kSourceYOff); @@ -926,7 +750,7 @@ void BinkDecoder::blockMotion(DecodeContext &ctx) { memcpy(dest, prev, 8); } -void BinkDecoder::blockRun(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockRun(DecodeContext &ctx) { const uint8 *scan = binkPatterns[ctx.video->bits->getBits(4)]; int i = 0; @@ -953,7 +777,7 @@ void BinkDecoder::blockRun(DecodeContext &ctx) { ctx.dest[ctx.coordMap[*scan++]] = getBundleValue(kSourceColors); } -void BinkDecoder::blockResidue(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockResidue(DecodeContext &ctx) { blockMotion(ctx); byte v = ctx.video->bits->getBits(7); @@ -970,7 +794,7 @@ void BinkDecoder::blockResidue(DecodeContext &ctx) { dst[j] += src[j]; } -void BinkDecoder::blockIntra(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockIntra(DecodeContext &ctx) { int16 block[64]; memset(block, 0, 64 * sizeof(int16)); @@ -981,7 +805,7 @@ void BinkDecoder::blockIntra(DecodeContext &ctx) { IDCTPut(ctx, block); } -void BinkDecoder::blockFill(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockFill(DecodeContext &ctx) { byte v = getBundleValue(kSourceColors); byte *dest = ctx.dest; @@ -989,7 +813,7 @@ void BinkDecoder::blockFill(DecodeContext &ctx) { memset(dest, v, 8); } -void BinkDecoder::blockInter(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockInter(DecodeContext &ctx) { blockMotion(ctx); int16 block[64]; @@ -1002,7 +826,7 @@ void BinkDecoder::blockInter(DecodeContext &ctx) { IDCTAdd(ctx, block); } -void BinkDecoder::blockPattern(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockPattern(DecodeContext &ctx) { byte col[2]; for (int i = 0; i < 2; i++) @@ -1017,7 +841,7 @@ void BinkDecoder::blockPattern(DecodeContext &ctx) { } } -void BinkDecoder::blockRaw(DecodeContext &ctx) { +void BinkDecoder::BinkVideoTrack::blockRaw(DecodeContext &ctx) { byte *dest = ctx.dest; byte *data = _bundles[kSourceColors].curPtr; for (int i = 0; i < 8; i++, dest += ctx.pitch, data += 8) @@ -1026,7 +850,7 @@ void BinkDecoder::blockRaw(DecodeContext &ctx) { _bundles[kSourceColors].curPtr += 64; } -void BinkDecoder::readRuns(VideoFrame &video, Bundle &bundle) { +void BinkDecoder::BinkVideoTrack::readRuns(VideoFrame &video, Bundle &bundle) { uint32 n = readBundleCount(video, bundle); if (n == 0) return; @@ -1046,7 +870,7 @@ void BinkDecoder::readRuns(VideoFrame &video, Bundle &bundle) { *bundle.curDec++ = getHuffmanSymbol(video, bundle.huffman); } -void BinkDecoder::readMotionValues(VideoFrame &video, Bundle &bundle) { +void BinkDecoder::BinkVideoTrack::readMotionValues(VideoFrame &video, Bundle &bundle) { uint32 n = readBundleCount(video, bundle); if (n == 0) return; @@ -1083,7 +907,7 @@ void BinkDecoder::readMotionValues(VideoFrame &video, Bundle &bundle) { } const uint8 rleLens[4] = { 4, 8, 12, 32 }; -void BinkDecoder::readBlockTypes(VideoFrame &video, Bundle &bundle) { +void BinkDecoder::BinkVideoTrack::readBlockTypes(VideoFrame &video, Bundle &bundle) { uint32 n = readBundleCount(video, bundle); if (n == 0) return; @@ -1120,7 +944,7 @@ void BinkDecoder::readBlockTypes(VideoFrame &video, Bundle &bundle) { } while (bundle.curDec < decEnd); } -void BinkDecoder::readPatterns(VideoFrame &video, Bundle &bundle) { +void BinkDecoder::BinkVideoTrack::readPatterns(VideoFrame &video, Bundle &bundle) { uint32 n = readBundleCount(video, bundle); if (n == 0) return; @@ -1138,7 +962,7 @@ void BinkDecoder::readPatterns(VideoFrame &video, Bundle &bundle) { } -void BinkDecoder::readColors(VideoFrame &video, Bundle &bundle) { +void BinkDecoder::BinkVideoTrack::readColors(VideoFrame &video, Bundle &bundle) { uint32 n = readBundleCount(video, bundle); if (n == 0) return; @@ -1182,7 +1006,7 @@ void BinkDecoder::readColors(VideoFrame &video, Bundle &bundle) { } } -void BinkDecoder::readDCS(VideoFrame &video, Bundle &bundle, int startBits, bool hasSign) { +void BinkDecoder::BinkVideoTrack::readDCS(VideoFrame &video, Bundle &bundle, int startBits, bool hasSign) { uint32 length = readBundleCount(video, bundle); if (length == 0) return; @@ -1228,7 +1052,7 @@ void BinkDecoder::readDCS(VideoFrame &video, Bundle &bundle, int startBits, bool } /** Reads 8x8 block of DCT coefficients. */ -void BinkDecoder::readDCTCoeffs(VideoFrame &video, int16 *block, bool isIntra) { +void BinkDecoder::BinkVideoTrack::readDCTCoeffs(VideoFrame &video, int16 *block, bool isIntra) { int coefCount = 0; int coefIdx[64]; @@ -1326,7 +1150,7 @@ void BinkDecoder::readDCTCoeffs(VideoFrame &video, int16 *block, bool isIntra) { } /** Reads 8x8 block with residue after motion compensation. */ -void BinkDecoder::readResidue(VideoFrame &video, int16 *block, int masksCount) { +void BinkDecoder::BinkVideoTrack::readResidue(VideoFrame &video, int16 *block, int masksCount) { int nzCoeff[64]; int nzCoeffCount = 0; @@ -1417,63 +1241,170 @@ void BinkDecoder::readResidue(VideoFrame &video, int16 *block, int masksCount) { } } -float BinkDecoder::getFloat(AudioTrack &audio) { - int power = audio.bits->getBits(5); +#define A1 2896 /* (1/sqrt(2))<<12 */ +#define A2 2217 +#define A3 3784 +#define A4 -5352 - float f = ldexp((float)audio.bits->getBits(23), power - 23); +#define IDCT_TRANSFORM(dest,s0,s1,s2,s3,s4,s5,s6,s7,d0,d1,d2,d3,d4,d5,d6,d7,munge,src) {\ + const int a0 = (src)[s0] + (src)[s4]; \ + const int a1 = (src)[s0] - (src)[s4]; \ + const int a2 = (src)[s2] + (src)[s6]; \ + const int a3 = (A1*((src)[s2] - (src)[s6])) >> 11; \ + const int a4 = (src)[s5] + (src)[s3]; \ + const int a5 = (src)[s5] - (src)[s3]; \ + const int a6 = (src)[s1] + (src)[s7]; \ + const int a7 = (src)[s1] - (src)[s7]; \ + const int b0 = a4 + a6; \ + const int b1 = (A3*(a5 + a7)) >> 11; \ + const int b2 = ((A4*a5) >> 11) - b0 + b1; \ + const int b3 = (A1*(a6 - a4) >> 11) - b2; \ + const int b4 = ((A2*a7) >> 11) + b3 - b1; \ + (dest)[d0] = munge(a0+a2 +b0); \ + (dest)[d1] = munge(a1+a3-a2+b2); \ + (dest)[d2] = munge(a1-a3+a2+b3); \ + (dest)[d3] = munge(a0-a2 -b4); \ + (dest)[d4] = munge(a0-a2 +b4); \ + (dest)[d5] = munge(a1-a3+a2-b3); \ + (dest)[d6] = munge(a1+a3-a2-b2); \ + (dest)[d7] = munge(a0+a2 -b0); \ +} +/* end IDCT_TRANSFORM macro */ - if (audio.bits->getBit()) - f = -f; +#define MUNGE_NONE(x) (x) +#define IDCT_COL(dest,src) IDCT_TRANSFORM(dest,0,8,16,24,32,40,48,56,0,8,16,24,32,40,48,56,MUNGE_NONE,src) - return f; +#define MUNGE_ROW(x) (((x) + 0x7F)>>8) +#define IDCT_ROW(dest,src) IDCT_TRANSFORM(dest,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,MUNGE_ROW,src) + +static inline void IDCTCol(int16 *dest, const int16 *src) { + if ((src[8] | src[16] | src[24] | src[32] | src[40] | src[48] | src[56]) == 0) { + dest[ 0] = + dest[ 8] = + dest[16] = + dest[24] = + dest[32] = + dest[40] = + dest[48] = + dest[56] = src[0]; + } else { + IDCT_COL(dest, src); + } +} + +void BinkDecoder::BinkVideoTrack::IDCT(int16 *block) { + int i; + int16 temp[64]; + + for (i = 0; i < 8; i++) + IDCTCol(&temp[i], &block[i]); + for (i = 0; i < 8; i++) { + IDCT_ROW( (&block[8*i]), (&temp[8*i]) ); + } +} + +void BinkDecoder::BinkVideoTrack::IDCTAdd(DecodeContext &ctx, int16 *block) { + int i, j; + + IDCT(block); + byte *dest = ctx.dest; + for (i = 0; i < 8; i++, dest += ctx.pitch, block += 8) + for (j = 0; j < 8; j++) + dest[j] += block[j]; +} + +void BinkDecoder::BinkVideoTrack::IDCTPut(DecodeContext &ctx, int16 *block) { + int i; + int16 temp[64]; + for (i = 0; i < 8; i++) + IDCTCol(&temp[i], &block[i]); + for (i = 0; i < 8; i++) { + IDCT_ROW( (&ctx.dest[i*ctx.pitch]), (&temp[8*i]) ); + } +} + +BinkDecoder::BinkAudioTrack::BinkAudioTrack(BinkDecoder::AudioInfo &audio) : _audioInfo(&audio) { + _audioStream = Audio::makeQueuingAudioStream(_audioInfo->outSampleRate, _audioInfo->outChannels == 2); +} + +BinkDecoder::BinkAudioTrack::~BinkAudioTrack() { + delete _audioStream; +} + +Audio::AudioStream *BinkDecoder::BinkAudioTrack::getAudioStream() const { + return _audioStream; +} + +void BinkDecoder::BinkAudioTrack::decodePacket() { + int outSize = _audioInfo->frameLen * _audioInfo->channels; + + while (_audioInfo->bits->pos() < _audioInfo->bits->size()) { + int16 *out = (int16 *)malloc(outSize * 2); + memset(out, 0, outSize * 2); + + audioBlock(out); + + byte flags = Audio::FLAG_16BITS; + if (_audioInfo->outChannels == 2) + flags |= Audio::FLAG_STEREO; + +#ifdef SCUMM_LITTLE_ENDIAN + flags |= Audio::FLAG_LITTLE_ENDIAN; +#endif + + _audioStream->queueBuffer((byte *)out, _audioInfo->blockSize * 2, DisposeAfterUse::YES, flags); + + if (_audioInfo->bits->pos() & 0x1F) // next data block starts at a 32-byte boundary + _audioInfo->bits->skip(32 - (_audioInfo->bits->pos() & 0x1F)); + } } -void BinkDecoder::audioBlock(AudioTrack &audio, int16 *out) { - if (audio.codec == kAudioCodecDCT) - audioBlockDCT (audio); - else if (audio.codec == kAudioCodecRDFT) - audioBlockRDFT(audio); +void BinkDecoder::BinkAudioTrack::audioBlock(int16 *out) { + if (_audioInfo->codec == kAudioCodecDCT) + audioBlockDCT (); + else if (_audioInfo->codec == kAudioCodecRDFT) + audioBlockRDFT(); - floatToInt16Interleave(out, const_cast(audio.coeffsPtr), audio.frameLen, audio.channels); + floatToInt16Interleave(out, const_cast(_audioInfo->coeffsPtr), _audioInfo->frameLen, _audioInfo->channels); - if (!audio.first) { - int count = audio.overlapLen * audio.channels; + if (!_audioInfo->first) { + int count = _audioInfo->overlapLen * _audioInfo->channels; int shift = Common::intLog2(count); for (int i = 0; i < count; i++) { - out[i] = (audio.prevCoeffs[i] * (count - i) + out[i] * i) >> shift; + out[i] = (_audioInfo->prevCoeffs[i] * (count - i) + out[i] * i) >> shift; } } - memcpy(audio.prevCoeffs, out + audio.blockSize, audio.overlapLen * audio.channels * sizeof(*out)); + memcpy(_audioInfo->prevCoeffs, out + _audioInfo->blockSize, _audioInfo->overlapLen * _audioInfo->channels * sizeof(*out)); - audio.first = false; + _audioInfo->first = false; } -void BinkDecoder::audioBlockDCT(AudioTrack &audio) { - audio.bits->skip(2); +void BinkDecoder::BinkAudioTrack::audioBlockDCT() { + _audioInfo->bits->skip(2); - for (uint8 i = 0; i < audio.channels; i++) { - float *coeffs = audio.coeffsPtr[i]; + for (uint8 i = 0; i < _audioInfo->channels; i++) { + float *coeffs = _audioInfo->coeffsPtr[i]; - readAudioCoeffs(audio, coeffs); + readAudioCoeffs(coeffs); coeffs[0] /= 0.5; - audio.dct->calc(coeffs); + _audioInfo->dct->calc(coeffs); - for (uint32 j = 0; j < audio.frameLen; j++) - coeffs[j] *= (audio.frameLen / 2.0); + for (uint32 j = 0; j < _audioInfo->frameLen; j++) + coeffs[j] *= (_audioInfo->frameLen / 2.0); } } -void BinkDecoder::audioBlockRDFT(AudioTrack &audio) { - for (uint8 i = 0; i < audio.channels; i++) { - float *coeffs = audio.coeffsPtr[i]; +void BinkDecoder::BinkAudioTrack::audioBlockRDFT() { + for (uint8 i = 0; i < _audioInfo->channels; i++) { + float *coeffs = _audioInfo->coeffsPtr[i]; - readAudioCoeffs(audio, coeffs); + readAudioCoeffs(coeffs); - audio.rdft->calc(coeffs); + _audioInfo->rdft->calc(coeffs); } } @@ -1481,56 +1412,56 @@ static const uint8 rleLengthTab[16] = { 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 32, 64 }; -void BinkDecoder::readAudioCoeffs(AudioTrack &audio, float *coeffs) { - coeffs[0] = getFloat(audio) * audio.root; - coeffs[1] = getFloat(audio) * audio.root; +void BinkDecoder::BinkAudioTrack::readAudioCoeffs(float *coeffs) { + coeffs[0] = getFloat() * _audioInfo->root; + coeffs[1] = getFloat() * _audioInfo->root; float quant[25]; - for (uint32 i = 0; i < audio.bandCount; i++) { - int value = audio.bits->getBits(8); + for (uint32 i = 0; i < _audioInfo->bandCount; i++) { + int value = _audioInfo->bits->getBits(8); // 0.066399999 / log10(M_E) - quant[i] = exp(MIN(value, 95) * 0.15289164787221953823f) * audio.root; + quant[i] = exp(MIN(value, 95) * 0.15289164787221953823f) * _audioInfo->root; } float q = 0.0; // Find band (k) int k; - for (k = 0; audio.bands[k] < 1; k++) + for (k = 0; _audioInfo->bands[k] < 1; k++) q = quant[k]; // Parse coefficients uint32 i = 2; - while (i < audio.frameLen) { + while (i < _audioInfo->frameLen) { uint32 j = 0; - if (audio.bits->getBit()) - j = i + rleLengthTab[audio.bits->getBits(4)] * 8; + if (_audioInfo->bits->getBit()) + j = i + rleLengthTab[_audioInfo->bits->getBits(4)] * 8; else j = i + 8; - j = MIN(j, audio.frameLen); + j = MIN(j, _audioInfo->frameLen); - int width = audio.bits->getBits(4); + int width = _audioInfo->bits->getBits(4); if (width == 0) { memset(coeffs + i, 0, (j - i) * sizeof(*coeffs)); i = j; - while (audio.bands[k] * 2 < i) + while (_audioInfo->bands[k] * 2 < i) q = quant[k++]; } else { while (i < j) { - if (audio.bands[k] * 2 == i) + if (_audioInfo->bands[k] * 2 == i) q = quant[k++]; - int coeff = audio.bits->getBits(width); + int coeff = _audioInfo->bits->getBits(width); if (coeff) { - if (audio.bits->getBit()) + if (_audioInfo->bits->getBit()) coeffs[i] = -q * coeff; else coeffs[i] = q * coeff; @@ -1548,10 +1479,10 @@ void BinkDecoder::readAudioCoeffs(AudioTrack &audio, float *coeffs) { } static inline int floatToInt16One(float src) { - return (int16) CLIP((int) floor(src + 0.5), -32768, 32767); + return (int16)CLIP((int)floor(src + 0.5), -32768, 32767); } -void BinkDecoder::floatToInt16Interleave(int16 *dst, const float **src, uint32 length, uint8 channels) { +void BinkDecoder::BinkAudioTrack::floatToInt16Interleave(int16 *dst, const float **src, uint32 length, uint8 channels) { if (channels == 2) { for (uint32 i = 0; i < length; i++) { dst[2 * i ] = floatToInt16One(src[0][i]); @@ -1564,97 +1495,84 @@ void BinkDecoder::floatToInt16Interleave(int16 *dst, const float **src, uint32 l } } -#define A1 2896 /* (1/sqrt(2))<<12 */ -#define A2 2217 -#define A3 3784 -#define A4 -5352 +float BinkDecoder::BinkAudioTrack::getFloat() { + int power = _audioInfo->bits->getBits(5); -#define IDCT_TRANSFORM(dest,s0,s1,s2,s3,s4,s5,s6,s7,d0,d1,d2,d3,d4,d5,d6,d7,munge,src) {\ - const int a0 = (src)[s0] + (src)[s4]; \ - const int a1 = (src)[s0] - (src)[s4]; \ - const int a2 = (src)[s2] + (src)[s6]; \ - const int a3 = (A1*((src)[s2] - (src)[s6])) >> 11; \ - const int a4 = (src)[s5] + (src)[s3]; \ - const int a5 = (src)[s5] - (src)[s3]; \ - const int a6 = (src)[s1] + (src)[s7]; \ - const int a7 = (src)[s1] - (src)[s7]; \ - const int b0 = a4 + a6; \ - const int b1 = (A3*(a5 + a7)) >> 11; \ - const int b2 = ((A4*a5) >> 11) - b0 + b1; \ - const int b3 = (A1*(a6 - a4) >> 11) - b2; \ - const int b4 = ((A2*a7) >> 11) + b3 - b1; \ - (dest)[d0] = munge(a0+a2 +b0); \ - (dest)[d1] = munge(a1+a3-a2+b2); \ - (dest)[d2] = munge(a1-a3+a2+b3); \ - (dest)[d3] = munge(a0-a2 -b4); \ - (dest)[d4] = munge(a0-a2 +b4); \ - (dest)[d5] = munge(a1-a3+a2-b3); \ - (dest)[d6] = munge(a1+a3-a2-b2); \ - (dest)[d7] = munge(a0+a2 -b0); \ + float f = ldexp((float)_audioInfo->bits->getBits(23), power - 23); + + if (_audioInfo->bits->getBit()) + f = -f; + + return f; } -/* end IDCT_TRANSFORM macro */ -#define MUNGE_NONE(x) (x) -#define IDCT_COL(dest,src) IDCT_TRANSFORM(dest,0,8,16,24,32,40,48,56,0,8,16,24,32,40,48,56,MUNGE_NONE,src) +void BinkDecoder::initAudioTrack(AudioInfo &audio) { + audio.sampleCount = 0; + audio.bits = 0; -#define MUNGE_ROW(x) (((x) + 0x7F)>>8) -#define IDCT_ROW(dest,src) IDCT_TRANSFORM(dest,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,MUNGE_ROW,src) + audio.channels = ((audio.flags & kAudioFlagStereo) != 0) ? 2 : 1; + audio.codec = ((audio.flags & kAudioFlagDCT ) != 0) ? kAudioCodecDCT : kAudioCodecRDFT; -static inline void IDCTCol(int16 *dest, const int16 *src) -{ - if ((src[8] | src[16] | src[24] | src[32] | src[40] | src[48] | src[56]) == 0) { - dest[ 0] = - dest[ 8] = - dest[16] = - dest[24] = - dest[32] = - dest[40] = - dest[48] = - dest[56] = src[0]; - } else { - IDCT_COL(dest, src); - } -} + if (audio.channels > kAudioChannelsMax) + error("Too many audio channels: %d", audio.channels); -void BinkDecoder::IDCT(int16 *block) { - int i; - int16 temp[64]; + uint32 frameLenBits; + // Calculate frame length + if (audio.sampleRate < 22050) + frameLenBits = 9; + else if(audio.sampleRate < 44100) + frameLenBits = 10; + else + frameLenBits = 11; - for (i = 0; i < 8; i++) - IDCTCol(&temp[i], &block[i]); - for (i = 0; i < 8; i++) { - IDCT_ROW( (&block[8*i]), (&temp[8*i]) ); - } -} + audio.frameLen = 1 << frameLenBits; -void BinkDecoder::IDCTAdd(DecodeContext &ctx, int16 *block) { - int i, j; + audio.outSampleRate = audio.sampleRate; + audio.outChannels = audio.channels; - IDCT(block); - byte *dest = ctx.dest; - for (i = 0; i < 8; i++, dest += ctx.pitch, block += 8) - for (j = 0; j < 8; j++) - dest[j] += block[j]; -} + if (audio.codec == kAudioCodecRDFT) { + // RDFT audio already interleaves the samples correctly -void BinkDecoder::IDCTPut(DecodeContext &ctx, int16 *block) { - int i; - int16 temp[64]; - for (i = 0; i < 8; i++) - IDCTCol(&temp[i], &block[i]); - for (i = 0; i < 8; i++) { - IDCT_ROW( (&ctx.dest[i*ctx.pitch]), (&temp[8*i]) ); + if (audio.channels == 2) + frameLenBits++; + + audio.sampleRate *= audio.channels; + audio.frameLen *= audio.channels; + audio.channels = 1; } -} -void BinkDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelVolume(_audioHandle, getVolume()); -} + audio.overlapLen = audio.frameLen / 16; + audio.blockSize = (audio.frameLen - audio.overlapLen) * audio.channels; + audio.root = 2.0 / sqrt((double)audio.frameLen); + + uint32 sampleRateHalf = (audio.sampleRate + 1) / 2; + + // Calculate number of bands + for (audio.bandCount = 1; audio.bandCount < 25; audio.bandCount++) + if (sampleRateHalf <= binkCriticalFreqs[audio.bandCount - 1]) + break; + + audio.bands = new uint32[audio.bandCount + 1]; + + // Populate bands + audio.bands[0] = 1; + for (uint32 i = 1; i < audio.bandCount; i++) + audio.bands[i] = binkCriticalFreqs[i - 1] * (audio.frameLen / 2) / sampleRateHalf; + audio.bands[audio.bandCount] = audio.frameLen / 2; + + audio.first = true; + + for (uint8 i = 0; i < audio.channels; i++) + audio.coeffsPtr[i] = audio.coeffs + i * audio.frameLen; + + audio.codec = ((audio.flags & kAudioFlagDCT) != 0) ? kAudioCodecDCT : kAudioCodecRDFT; + + if (audio.codec == kAudioCodecRDFT) + audio.rdft = new Common::RDFT(frameLenBits, Common::RDFT::DFT_C2R); + else if (audio.codec == kAudioCodecDCT) + audio.dct = new Common::DCT(frameLenBits, Common::DCT::DCT_III); -void BinkDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelBalance(_audioHandle, getBalance()); + addTrack(new BinkAudioTrack(audio)); } } // End of namespace Video diff --git a/video/bink_decoder.h b/video/bink_decoder.h index a5e1b10270..836238ce99 100644 --- a/video/bink_decoder.h +++ b/video/bink_decoder.h @@ -31,22 +31,27 @@ #ifndef VIDEO_BINK_DECODER_H #define VIDEO_BINK_DECODER_H -#include "audio/audiostream.h" -#include "audio/mixer.h" #include "common/array.h" #include "common/rational.h" -#include "graphics/surface.h" - #include "video/video_decoder.h" +namespace Audio { +class AudioStream; +class QueuingAudioStream; +} + namespace Common { - class SeekableReadStream; - class BitStream; - class Huffman; +class SeekableReadStream; +class BitStream; +class Huffman; - class RDFT; - class DCT; +class RDFT; +class DCT; +} + +namespace Graphics { +struct Surface; } namespace Video { @@ -57,92 +62,28 @@ namespace Video { * Video decoder used in engines: * - scumm (he) */ -class BinkDecoder : public FixedRateVideoDecoder { +class BinkDecoder : public AdvancedVideoDecoder { public: BinkDecoder(); ~BinkDecoder(); - // VideoDecoder API bool loadStream(Common::SeekableReadStream *stream); void close(); - bool isVideoLoaded() const { return _bink != 0; } - uint16 getWidth() const { return _surface.w; } - uint16 getHeight() const { return _surface.h; } - Graphics::PixelFormat getPixelFormat() const { return _surface.format; } - uint32 getFrameCount() const { return _frames.size(); } - uint32 getTime() const; - const Graphics::Surface *decodeNextFrame(); - - // FixedRateVideoDecoder - Common::Rational getFrameRate() const { return _frameRate; } - - // Bink specific - bool loadStream(Common::SeekableReadStream *stream, const Graphics::PixelFormat &format); protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); + void readNextPacket(); +private: static const int kAudioChannelsMax = 2; static const int kAudioBlockSizeMax = (kAudioChannelsMax << 11); - /** IDs for different data types used in Bink video codec. */ - enum Source { - kSourceBlockTypes = 0, ///< 8x8 block types. - kSourceSubBlockTypes , ///< 16x16 block types (a subset of 8x8 block types). - kSourceColors , ///< Pixel values used for different block types. - kSourcePattern , ///< 8-bit values for 2-color pattern fill. - kSourceXOff , ///< X components of motion value. - kSourceYOff , ///< Y components of motion value. - kSourceIntraDC , ///< DC values for intrablocks with DCT. - kSourceInterDC , ///< DC values for interblocks with DCT. - kSourceRun , ///< Run lengths for special fill block. - - kSourceMAX - }; - - /** Bink video block types. */ - enum BlockType { - kBlockSkip = 0, ///< Skipped block. - kBlockScaled , ///< Block has size 16x16. - kBlockMotion , ///< Block is copied from previous frame with some offset. - kBlockRun , ///< Block is composed from runs of colors with custom scan order. - kBlockResidue , ///< Motion block with some difference added. - kBlockIntra , ///< Intra DCT block. - kBlockFill , ///< Block is filled with single color. - kBlockInter , ///< Motion block with DCT applied to the difference. - kBlockPattern , ///< Block is filled with two colors following custom pattern. - kBlockRaw ///< Uncoded 8x8 block. - }; - - /** Data structure for decoding and tranlating Huffman'd data. */ - struct Huffman { - int index; ///< Index of the Huffman codebook to use. - byte symbols[16]; ///< Huffman symbol => Bink symbol tranlation list. - }; - - /** Data structure used for decoding a single Bink data type. */ - struct Bundle { - int countLengths[2]; ///< Lengths of number of entries to decode (in bits). - int countLength; ///< Length of number of entries to decode (in bits) for the current plane. - - Huffman huffman; ///< Huffman codebook. - - byte *data; ///< Buffer for decoded symbols. - byte *dataEnd; ///< Buffer end. - - byte *curDec; ///< Pointer to the data that wasn't yet decoded. - byte *curPtr; ///< Pointer to the data that wasn't yet read. - }; - enum AudioCodec { kAudioCodecDCT, kAudioCodecRDFT }; /** An audio track. */ - struct AudioTrack { + struct AudioInfo { uint16 flags; uint32 sampleRate; @@ -177,8 +118,8 @@ protected: Common::RDFT *rdft; Common::DCT *dct; - AudioTrack(); - ~AudioTrack(); + AudioInfo(); + ~AudioInfo(); }; /** A video frame. */ @@ -194,149 +135,218 @@ protected: ~VideoFrame(); }; - /** A decoder state. */ - struct DecodeContext { - VideoFrame *video; + class BinkVideoTrack : public FixedRateVideoTrack { + public: + BinkVideoTrack(uint32 width, uint32 height, const Graphics::PixelFormat &format, uint32 frameCount, const Common::Rational &frameRate, bool swapPlanes, bool hasAlpha, uint32 id); + ~BinkVideoTrack(); + + uint16 getWidth() const { return _surface.w; } + uint16 getHeight() const { return _surface.h; } + Graphics::PixelFormat getPixelFormat() const { return _surface.format; } + int getCurFrame() const { return _curFrame; } + int getFrameCount() const { return _frameCount; } + const Graphics::Surface *decodeNextFrame() { return &_surface; } + + /** Decode a video packet. */ + void decodePacket(VideoFrame &frame); + + protected: + Common::Rational getFrameRate() const { return _frameRate; } - uint32 planeIdx; + private: + /** A decoder state. */ + struct DecodeContext { + VideoFrame *video; + + uint32 planeIdx; - uint32 blockX; - uint32 blockY; + uint32 blockX; + uint32 blockY; - byte *dest; - byte *prev; + byte *dest; + byte *prev; - byte *destStart, *destEnd; - byte *prevStart, *prevEnd; + byte *destStart, *destEnd; + byte *prevStart, *prevEnd; - uint32 pitch; + uint32 pitch; - int coordMap[64]; - int coordScaledMap1[64]; - int coordScaledMap2[64]; - int coordScaledMap3[64]; - int coordScaledMap4[64]; + int coordMap[64]; + int coordScaledMap1[64]; + int coordScaledMap2[64]; + int coordScaledMap3[64]; + int coordScaledMap4[64]; + }; + + /** IDs for different data types used in Bink video codec. */ + enum Source { + kSourceBlockTypes = 0, ///< 8x8 block types. + kSourceSubBlockTypes , ///< 16x16 block types (a subset of 8x8 block types). + kSourceColors , ///< Pixel values used for different block types. + kSourcePattern , ///< 8-bit values for 2-color pattern fill. + kSourceXOff , ///< X components of motion value. + kSourceYOff , ///< Y components of motion value. + kSourceIntraDC , ///< DC values for intrablocks with DCT. + kSourceInterDC , ///< DC values for interblocks with DCT. + kSourceRun , ///< Run lengths for special fill block. + + kSourceMAX + }; + + /** Bink video block types. */ + enum BlockType { + kBlockSkip = 0, ///< Skipped block. + kBlockScaled , ///< Block has size 16x16. + kBlockMotion , ///< Block is copied from previous frame with some offset. + kBlockRun , ///< Block is composed from runs of colors with custom scan order. + kBlockResidue , ///< Motion block with some difference added. + kBlockIntra , ///< Intra DCT block. + kBlockFill , ///< Block is filled with single color. + kBlockInter , ///< Motion block with DCT applied to the difference. + kBlockPattern , ///< Block is filled with two colors following custom pattern. + kBlockRaw ///< Uncoded 8x8 block. + }; + + /** Data structure for decoding and tranlating Huffman'd data. */ + struct Huffman { + int index; ///< Index of the Huffman codebook to use. + byte symbols[16]; ///< Huffman symbol => Bink symbol tranlation list. + }; + + /** Data structure used for decoding a single Bink data type. */ + struct Bundle { + int countLengths[2]; ///< Lengths of number of entries to decode (in bits). + int countLength; ///< Length of number of entries to decode (in bits) for the current plane. + + Huffman huffman; ///< Huffman codebook. + + byte *data; ///< Buffer for decoded symbols. + byte *dataEnd; ///< Buffer end. + + byte *curDec; ///< Pointer to the data that wasn't yet decoded. + byte *curPtr; ///< Pointer to the data that wasn't yet read. + }; + + int _curFrame; + int _frameCount; + + Graphics::Surface _surface; + + uint32 _id; ///< The BIK FourCC. + + bool _hasAlpha; ///< Do video frames have alpha? + bool _swapPlanes; ///< Are the planes ordered (A)YVU instead of (A)YUV? + + Common::Rational _frameRate; + + Bundle _bundles[kSourceMAX]; ///< Bundles for decoding all data types. + + Common::Huffman *_huffman[16]; ///< The 16 Huffman codebooks used in Bink decoding. + + /** Huffman codebooks to use for decoding high nibbles in color data types. */ + Huffman _colHighHuffman[16]; + /** Value of the last decoded high nibble in color data types. */ + int _colLastVal; + + byte *_curPlanes[4]; ///< The 4 color planes, YUVA, current frame. + byte *_oldPlanes[4]; ///< The 4 color planes, YUVA, last frame. + + /** Initialize the bundles. */ + void initBundles(); + /** Deinitialize the bundles. */ + void deinitBundles(); + + /** Initialize the Huffman decoders. */ + void initHuffman(); + + /** Decode a plane. */ + void decodePlane(VideoFrame &video, int planeIdx, bool isChroma); + + /** Read/Initialize a bundle for decoding a plane. */ + void readBundle(VideoFrame &video, Source source); + + /** Read the symbols for a Huffman code. */ + void readHuffman(VideoFrame &video, Huffman &huffman); + /** Merge two Huffman symbol lists. */ + void mergeHuffmanSymbols(VideoFrame &video, byte *dst, const byte *src, int size); + + /** Read and translate a symbol out of a Huffman code. */ + byte getHuffmanSymbol(VideoFrame &video, Huffman &huffman); + + /** Get a direct value out of a bundle. */ + int32 getBundleValue(Source source); + /** Read a count value out of a bundle. */ + uint32 readBundleCount(VideoFrame &video, Bundle &bundle); + + // Handle the block types + void blockSkip (DecodeContext &ctx); + void blockScaledSkip (DecodeContext &ctx); + void blockScaledRun (DecodeContext &ctx); + void blockScaledIntra (DecodeContext &ctx); + void blockScaledFill (DecodeContext &ctx); + void blockScaledPattern(DecodeContext &ctx); + void blockScaledRaw (DecodeContext &ctx); + void blockScaled (DecodeContext &ctx); + void blockMotion (DecodeContext &ctx); + void blockRun (DecodeContext &ctx); + void blockResidue (DecodeContext &ctx); + void blockIntra (DecodeContext &ctx); + void blockFill (DecodeContext &ctx); + void blockInter (DecodeContext &ctx); + void blockPattern (DecodeContext &ctx); + void blockRaw (DecodeContext &ctx); + + // Read the bundles + void readRuns (VideoFrame &video, Bundle &bundle); + void readMotionValues(VideoFrame &video, Bundle &bundle); + void readBlockTypes (VideoFrame &video, Bundle &bundle); + void readPatterns (VideoFrame &video, Bundle &bundle); + void readColors (VideoFrame &video, Bundle &bundle); + void readDCS (VideoFrame &video, Bundle &bundle, int startBits, bool hasSign); + void readDCTCoeffs (VideoFrame &video, int16 *block, bool isIntra); + void readResidue (VideoFrame &video, int16 *block, int masksCount); + + // Bink video IDCT + void IDCT(int16 *block); + void IDCTPut(DecodeContext &ctx, int16 *block); + void IDCTAdd(DecodeContext &ctx, int16 *block); }; - Common::SeekableReadStream *_bink; + class BinkAudioTrack : public AudioTrack { + public: + BinkAudioTrack(AudioInfo &audio); + ~BinkAudioTrack(); + + /** Decode an audio packet. */ + void decodePacket(); - uint32 _id; ///< The BIK FourCC. + protected: + Audio::AudioStream *getAudioStream() const; - Common::Rational _frameRate; + private: + AudioInfo *_audioInfo; + Audio::QueuingAudioStream *_audioStream; - Graphics::Surface _surface; + float getFloat(); - Audio::SoundHandle _audioHandle; - Audio::QueuingAudioStream *_audioStream; - int32 _audioStartOffset; + /** Decode an audio block. */ + void audioBlock(int16 *out); + /** Decode a DCT'd audio block. */ + void audioBlockDCT(); + /** Decode a RDFT'd audio block. */ + void audioBlockRDFT(); - uint32 _videoFlags; ///< Video frame features. + void readAudioCoeffs(float *coeffs); - bool _hasAlpha; ///< Do video frames have alpha? - bool _swapPlanes; ///< Are the planes ordered (A)YVU instead of (A)YUV? + static void floatToInt16Interleave(int16 *dst, const float **src, uint32 length, uint8 channels); + }; + + Common::SeekableReadStream *_bink; - Common::Array _audioTracks; ///< All audio tracks. + Common::Array _audioTracks; ///< All audio tracks. Common::Array _frames; ///< All video frames. - uint32 _audioTrack; ///< Audio track to use. - - Common::Huffman *_huffman[16]; ///< The 16 Huffman codebooks used in Bink decoding. - - Bundle _bundles[kSourceMAX]; ///< Bundles for decoding all data types. - - /** Huffman codebooks to use for decoding high nibbles in color data types. */ - Huffman _colHighHuffman[16]; - /** Value of the last decoded high nibble in color data types. */ - int _colLastVal; - - byte *_curPlanes[4]; ///< The 4 color planes, YUVA, current frame. - byte *_oldPlanes[4]; ///< The 4 color planes, YUVA, last frame. - - - /** Initialize the bundles. */ - void initBundles(); - /** Deinitialize the bundles. */ - void deinitBundles(); - - /** Initialize the Huffman decoders. */ - void initHuffman(); - - /** Decode an audio packet. */ - void audioPacket(AudioTrack &audio); - /** Decode a video packet. */ - virtual void videoPacket(VideoFrame &video); - - /** Decode a plane. */ - void decodePlane(VideoFrame &video, int planeIdx, bool isChroma); - - /** Read/Initialize a bundle for decoding a plane. */ - void readBundle(VideoFrame &video, Source source); - - /** Read the symbols for a Huffman code. */ - void readHuffman(VideoFrame &video, Huffman &huffman); - /** Merge two Huffman symbol lists. */ - void mergeHuffmanSymbols(VideoFrame &video, byte *dst, const byte *src, int size); - - /** Read and translate a symbol out of a Huffman code. */ - byte getHuffmanSymbol(VideoFrame &video, Huffman &huffman); - - /** Get a direct value out of a bundle. */ - int32 getBundleValue(Source source); - /** Read a count value out of a bundle. */ - uint32 readBundleCount(VideoFrame &video, Bundle &bundle); - - // Handle the block types - void blockSkip (DecodeContext &ctx); - void blockScaledSkip (DecodeContext &ctx); - void blockScaledRun (DecodeContext &ctx); - void blockScaledIntra (DecodeContext &ctx); - void blockScaledFill (DecodeContext &ctx); - void blockScaledPattern(DecodeContext &ctx); - void blockScaledRaw (DecodeContext &ctx); - void blockScaled (DecodeContext &ctx); - void blockMotion (DecodeContext &ctx); - void blockRun (DecodeContext &ctx); - void blockResidue (DecodeContext &ctx); - void blockIntra (DecodeContext &ctx); - void blockFill (DecodeContext &ctx); - void blockInter (DecodeContext &ctx); - void blockPattern (DecodeContext &ctx); - void blockRaw (DecodeContext &ctx); - - // Read the bundles - void readRuns (VideoFrame &video, Bundle &bundle); - void readMotionValues(VideoFrame &video, Bundle &bundle); - void readBlockTypes (VideoFrame &video, Bundle &bundle); - void readPatterns (VideoFrame &video, Bundle &bundle); - void readColors (VideoFrame &video, Bundle &bundle); - void readDCS (VideoFrame &video, Bundle &bundle, int startBits, bool hasSign); - void readDCTCoeffs (VideoFrame &video, int16 *block, bool isIntra); - void readResidue (VideoFrame &video, int16 *block, int masksCount); - - void initAudioTrack(AudioTrack &audio); - - float getFloat(AudioTrack &audio); - - /** Decode an audio block. */ - void audioBlock (AudioTrack &audio, int16 *out); - /** Decode a DCT'd audio block. */ - void audioBlockDCT (AudioTrack &audio); - /** Decode a RDFT'd audio block. */ - void audioBlockRDFT(AudioTrack &audio); - - void readAudioCoeffs(AudioTrack &audio, float *coeffs); - - void floatToInt16Interleave(int16 *dst, const float **src, uint32 length, uint8 channels); - - // Bink video IDCT - void IDCT(int16 *block); - void IDCTPut(DecodeContext &ctx, int16 *block); - void IDCTAdd(DecodeContext &ctx, int16 *block); - - /** Start playing the audio track */ - void startAudio(); - /** Stop playing the audio track */ - void stopAudio(); + void initAudioTrack(AudioInfo &audio); }; } // End of namespace Video -- cgit v1.2.3 From 50a93c2e711f169089f6cfc0e09b82be0cce3210 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 25 Jul 2012 21:07:19 +0200 Subject: GRAPHICS: Small formatting fixes in iff.cpp. --- graphics/iff.cpp | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/graphics/iff.cpp b/graphics/iff.cpp index 7434a6bebc..4011126bd3 100644 --- a/graphics/iff.cpp +++ b/graphics/iff.cpp @@ -68,7 +68,7 @@ void ILBMDecoder::loadBitmap(uint32 mode, byte *buffer, Common::ReadStream *stre Graphics::PackBitsReadStream packStream(*stream); // setup a buffer to hold enough data to build a line in the output - uint32 scanlineWidth = ((_header.width + 15)/16) << 1; + uint32 scanlineWidth = ((_header.width + 15) / 16) << 1; byte *scanline = new byte[scanlineWidth * _header.depth]; for (uint i = 0; i < _header.height; ++i) { @@ -82,7 +82,7 @@ void ILBMDecoder::loadBitmap(uint32 mode, byte *buffer, Common::ReadStream *stre out += outPitch; } - delete []scanline; + delete[] scanline; break; } @@ -121,15 +121,12 @@ void ILBMDecoder::planarToChunky(byte *out, uint32 outPitch, byte *in, uint32 in // then output the pixel according to the requested packing if (!packPlanes) { out[x] = pix; - } else - if (nPlanes == 1) { - out[x/8] |= (pix << (x & 7)); - } else - if (nPlanes == 2) { - out[x/4] |= (pix << ((x & 3) << 1)); - } else - if (nPlanes == 4) { - out[x/2] |= (pix << ((x & 1) << 2)); + } else if (nPlanes == 1) { + out[x / 8] |= (pix << (x & 7)); + } else if (nPlanes == 2) { + out[x / 4] |= (pix << ((x & 3) << 1)); + } else if (nPlanes == 4) { + out[x / 2] |= (pix << ((x & 1) << 2)); } } @@ -187,7 +184,7 @@ struct PBMLoader { _surface = &surface; _colors = colors; Common::IFFParser parser(&input); - Common::Functor1Mem< Common::IFFChunk&, bool, PBMLoader > c(this, &PBMLoader::callback); + Common::Functor1Mem c(this, &PBMLoader::callback); parser.parse(c); } @@ -251,7 +248,7 @@ uint32 PackBitsReadStream::read(void *dataPtr, uint32 dataSize) { for (uint32 j = 0; j < lenW; j++) { *out++ = _input->readByte(); } - for ( ; lenR > lenW; lenR--) { + for (; lenR > lenW; lenR--) { _input->readByte(); } } else { // len > 128 -- cgit v1.2.3 From c7d99c155d28cdd609075278e94aaf91563297e4 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 25 Jul 2012 21:09:15 +0200 Subject: KYRA: Fix delete[] formatting. --- engines/kyra/eobcommon.cpp | 4 ++-- engines/kyra/screen_eob.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/kyra/eobcommon.cpp b/engines/kyra/eobcommon.cpp index a63f123258..fadb1066e0 100644 --- a/engines/kyra/eobcommon.cpp +++ b/engines/kyra/eobcommon.cpp @@ -770,7 +770,7 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() { if (_spellShapes) { for (int i = 0; i < 4; i++) { if (_spellShapes[i]) - delete [] _spellShapes[i]; + delete[] _spellShapes[i]; } delete[] _spellShapes; } @@ -820,7 +820,7 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() { if (_firebeamShapes[i]) delete[] _firebeamShapes[i]; } - delete []_firebeamShapes; + delete[] _firebeamShapes; } delete[] _redSplatShape; diff --git a/engines/kyra/screen_eob.cpp b/engines/kyra/screen_eob.cpp index e06ca42c40..ae75c111b4 100644 --- a/engines/kyra/screen_eob.cpp +++ b/engines/kyra/screen_eob.cpp @@ -607,7 +607,7 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco srcLineStart += SCREEN_W; src = srcLineStart; } - delete [] colorMap; + delete[] colorMap; } return shp; -- cgit v1.2.3 From 93d4eb14ad4a7ae1404a7c374925a7d7a6ad4143 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 25 Jul 2012 21:09:46 +0200 Subject: MOHAWK: Fix delete[] formatting. --- engines/mohawk/riven.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index e54d6fefa2..32613c6185 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -646,7 +646,7 @@ Common::String MohawkEngine_Riven::getName(uint16 nameResource, uint16 nameID) { } delete nameStream; - delete [] stringOffsets; + delete[] stringOffsets; return name; } -- cgit v1.2.3 From d98b4621908215c74fbd307044381c0e7533bb55 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 25 Jul 2012 21:10:43 +0200 Subject: PARALLACTION: Fix delete[] formatting. --- engines/parallaction/disk_br.cpp | 2 +- engines/parallaction/disk_ns.cpp | 2 +- engines/parallaction/graphics.cpp | 2 +- engines/parallaction/graphics.h | 2 +- engines/parallaction/sound_ns.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/engines/parallaction/disk_br.cpp b/engines/parallaction/disk_br.cpp index 5e39c893db..ee981a2c7d 100644 --- a/engines/parallaction/disk_br.cpp +++ b/engines/parallaction/disk_br.cpp @@ -617,7 +617,7 @@ GfxObj* AmigaDisk_br::loadStatic(const char* name) { } } - delete []shadow; + delete[] shadow; delete stream; } diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp index 839b2c6834..8d4afd6847 100644 --- a/engines/parallaction/disk_ns.cpp +++ b/engines/parallaction/disk_ns.cpp @@ -832,7 +832,7 @@ void AmigaDisk_ns::decodeCnv(byte *data, uint16 numFrames, uint16 width, uint16 assert(buf); stream->read(buf, rawsize); unpackBitmap(data, buf, numFrames, bytesPerPlane, height); - delete []buf; + delete[] buf; } #undef NUM_PLANES diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp index 6868505c52..9855830478 100644 --- a/engines/parallaction/graphics.cpp +++ b/engines/parallaction/graphics.cpp @@ -766,7 +766,7 @@ Gfx::~Gfx() { freeLabels(); - delete []_unpackedBitmap; + delete[] _unpackedBitmap; return; } diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h index b43dd193b5..f8cb4b3647 100644 --- a/engines/parallaction/graphics.h +++ b/engines/parallaction/graphics.h @@ -144,7 +144,7 @@ public: ~Cnv() { if (_freeData) - delete []_data; + delete[] _data; } byte* getFramePtr(uint16 index) { diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp index 3cc25b36b0..dcc71e4f2f 100644 --- a/engines/parallaction/sound_ns.cpp +++ b/engines/parallaction/sound_ns.cpp @@ -237,7 +237,7 @@ AmigaSoundMan_ns::~AmigaSoundMan_ns() { stopSfx(2); stopSfx(3); - delete []beepSoundBuffer; + delete[] beepSoundBuffer; } Audio::AudioStream *AmigaSoundMan_ns::loadChannelData(const char *filename, Channel *ch, bool looping) { -- cgit v1.2.3 From 155118dc1e85d4bbb1b678d6835d68c3e01f85f3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 25 Jul 2012 21:11:04 +0200 Subject: SWORD1: Fix delete[] formatting. --- engines/sword1/sound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sword1/sound.cpp b/engines/sword1/sound.cpp index 3574074b00..61bf5257ab 100644 --- a/engines/sword1/sound.cpp +++ b/engines/sword1/sound.cpp @@ -142,7 +142,7 @@ void Sound::checkSpeechFileEndianness() { be_diff_sum += fabs((double)(be_value - prev_be_value)); prev_be_value = be_value; } - delete [] data; + delete[] data; } // Set the big endian flag _bigEndianSpeech = (be_diff_sum < le_diff_sum); -- cgit v1.2.3 From 3351707b2dbaba0d6b4bd21d4f62c2653f5a9354 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 25 Jul 2012 21:11:22 +0200 Subject: TOON: Fix delete[] formatting. --- engines/toon/audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/toon/audio.cpp b/engines/toon/audio.cpp index 77822ab078..bc0e051057 100644 --- a/engines/toon/audio.cpp +++ b/engines/toon/audio.cpp @@ -326,7 +326,7 @@ bool AudioStreamInstance::readPacket() { } if (numDecompressedBytes > _bufferMaxSize) { - delete [] _buffer; + delete[] _buffer; _bufferMaxSize = numDecompressedBytes; _buffer = new int16[numDecompressedBytes]; } -- cgit v1.2.3 From dc8d9f4c9f7498f501b567262d0e90229b973e6e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 25 Jul 2012 21:11:45 +0200 Subject: SCI: Fix delete[] formatting. --- engines/sci/graphics/font.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/font.cpp b/engines/sci/graphics/font.cpp index fcdd057509..30184cc091 100644 --- a/engines/sci/graphics/font.cpp +++ b/engines/sci/graphics/font.cpp @@ -54,7 +54,7 @@ GfxFontFromResource::GfxFontFromResource(ResourceManager *resMan, GfxScreen *scr } GfxFontFromResource::~GfxFontFromResource() { - delete []_chars; + delete[] _chars; _resMan->unlockResource(_resource); } -- cgit v1.2.3 From 321197e9629e6bfebac5e7909549df54a5b035ea Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 26 Jul 2012 01:53:48 +0100 Subject: TEENAGENT: Fix typo in processCallback() address. 0x50c5 is invalid, replaced with valid 0x505c. --- engines/teenagent/callbacks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/teenagent/callbacks.cpp b/engines/teenagent/callbacks.cpp index 46d9b7d2f9..934727a478 100644 --- a/engines/teenagent/callbacks.cpp +++ b/engines/teenagent/callbacks.cpp @@ -2252,7 +2252,7 @@ bool TeenAgentEngine::processCallback(uint16 addr) { return true; case 0x78e0: - processCallback(0x50c5); + processCallback(0x505c); return false; case 0x78e7: -- cgit v1.2.3 From c0beaf2337bdadc8b18425c9a38182ba30910174 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 26 Jul 2012 11:05:50 +0300 Subject: SCI: Differentiate between screen width and pitch This properly addresses the odd screen width (630) in Phantasmagoria 1 --- engines/sci/graphics/frameout.cpp | 36 +++++++++++-------------- engines/sci/graphics/screen.cpp | 55 +++++++++++++++++++++------------------ engines/sci/graphics/screen.h | 1 + 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index fedae2eb6f..0098728e5d 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -125,23 +125,17 @@ void GfxFrameout::kernelAddPlane(reg_t object) { if (_planes.empty()) { // There has to be another way for sierra sci to do this or maybe script resolution is compiled into // interpreter (TODO) - uint16 tmpRunningWidth = readSelectorValue(_segMan, object, SELECTOR(resX)); - uint16 tmpRunningHeight = readSelectorValue(_segMan, object, SELECTOR(resY)); + uint16 scriptWidth = readSelectorValue(_segMan, object, SELECTOR(resX)); + uint16 scriptHeight = readSelectorValue(_segMan, object, SELECTOR(resY)); - // The above can be 0 in SCI3 (e.g. Phantasmagoria 2) - if (tmpRunningWidth == 0 && tmpRunningHeight == 0) { - tmpRunningWidth = 320; - tmpRunningHeight = 200; - } - - // HACK: Phantasmagoria 1 sets a window size of 630x450. - // We can't set a width of 630, as that messes up the pitch, so we hack - // the internal script width here - if (g_sci->getGameId() == GID_PHANTASMAGORIA) { - tmpRunningWidth = 325; + // Phantasmagoria 2 doesn't specify a script width/height + if (g_sci->getGameId() == GID_PHANTASMAGORIA2) { + scriptWidth = 640; + scriptHeight = 480; } - _coordAdjuster->setScriptsResolution(tmpRunningWidth, tmpRunningHeight); + assert(scriptWidth > 0 && scriptHeight > 0); + _coordAdjuster->setScriptsResolution(scriptWidth, scriptHeight); } // Import of QfG character files dialog is shown in QFG4. @@ -704,13 +698,13 @@ void GfxFrameout::kernelFrameout() { // TODO: maybe we should clip the cels rect with this, i'm not sure // the only currently known usage is game menu of gk1 } else if (view) { - if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) - view->getCelRect(itemEntry->loopNo, itemEntry->celNo, - itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); - else - view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, - itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, - itemEntry->scaleY, itemEntry->celRect); + if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) + view->getCelRect(itemEntry->loopNo, itemEntry->celNo, + itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); + else + view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, + itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, + itemEntry->scaleY, itemEntry->celRect); Common::Rect nsRect = itemEntry->celRect; // Translate back to actual coordinate within scrollable plane diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 3030fb4386..246b6bfff9 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -53,23 +53,35 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { #ifdef ENABLE_SCI32 // GK1 Mac uses a 640x480 resolution too - if (g_sci->getGameId() == GID_GK1 && g_sci->getPlatform() == Common::kPlatformMacintosh) - _upscaledHires = GFX_SCREEN_UPSCALED_640x480; + if (g_sci->getPlatform() == Common::kPlatformMacintosh) { + if (g_sci->getGameId() == GID_GK1) + _upscaledHires = GFX_SCREEN_UPSCALED_640x480; + } #endif if (_resMan->detectHires()) { _width = 640; + _pitch = 640; _height = 480; } else { _width = 320; + _pitch = 320; _height = getLowResScreenHeight(); } +#ifdef ENABLE_SCI32 + // Phantasmagoria 1 sets a window area of 630x450 + if (g_sci->getGameId() == GID_PHANTASMAGORIA) { + _width = 630; + _height = 450; + } +#endif + // Japanese versions of games use hi-res font on upscaled version of the game. if ((g_sci->getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1)) _upscaledHires = GFX_SCREEN_UPSCALED_640x400; - _pixels = _width * _height; + _pixels = _pitch * _height; switch (_upscaledHires) { case GFX_SCREEN_UPSCALED_640x400: @@ -91,19 +103,12 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { _upscaledMapping[i] = (i * 12) / 5; break; default: - _displayWidth = _width; + _displayWidth = _pitch; _displayHeight = _height; memset(&_upscaledMapping, 0, sizeof(_upscaledMapping) ); break; } - // Phantasmagoria 1 sets a window area of 630x450 - if (g_sci->getGameId() == GID_PHANTASMAGORIA) { - // TODO: Also set width to 630 (can't be set right now, as it messes up - // the pitch). For now, a hack has been placed in GfxFrameout::kernelAddPlane() - _height = 450; - } - _displayPixels = _displayWidth * _displayHeight; _visualScreen = (byte *)calloc(_pixels, 1); _priorityScreen = (byte *)calloc(_pixels, 1); @@ -214,7 +219,7 @@ byte GfxScreen::getDrawingMask(byte color, byte prio, byte control) { } void GfxScreen::putPixel(int x, int y, byte drawMask, byte color, byte priority, byte control) { - int offset = y * _width + x; + int offset = y * _pitch + x; if (drawMask & GFX_SCREEN_MASK_VISUAL) { _visualScreen[offset] = color; @@ -247,7 +252,7 @@ void GfxScreen::putFontPixel(int startingY, int x, int y, byte color) { // Do not scale ourselves, but put it on the display directly putPixelOnDisplay(x, y + startingY, color); } else { - int offset = (startingY + y) * _width + x; + int offset = (startingY + y) * _pitch + x; _visualScreen[offset] = color; if (!_upscaledHires) { @@ -349,19 +354,19 @@ void GfxScreen::putKanjiChar(Graphics::FontSJIS *commonFont, int16 x, int16 y, u } byte GfxScreen::getVisual(int x, int y) { - return _visualScreen[y * _width + x]; + return _visualScreen[y * _pitch + x]; } byte GfxScreen::getPriority(int x, int y) { - return _priorityScreen[y * _width + x]; + return _priorityScreen[y * _pitch + x]; } byte GfxScreen::getControl(int x, int y) { - return _controlScreen[y * _width + x]; + return _controlScreen[y * _pitch + x]; } byte GfxScreen::isFillMatch(int16 x, int16 y, byte screenMask, byte t_color, byte t_pri, byte t_con, bool isEGA) { - int offset = y * _width + x; + int offset = y * _pitch + x; byte match = 0; if (screenMask & GFX_SCREEN_MASK_VISUAL) { @@ -422,14 +427,14 @@ void GfxScreen::bitsSave(Common::Rect rect, byte mask, byte *memoryPtr) { memcpy(memoryPtr, (void *)&mask, sizeof(mask)); memoryPtr += sizeof(mask); if (mask & GFX_SCREEN_MASK_VISUAL) { - bitsSaveScreen(rect, _visualScreen, _width, memoryPtr); + bitsSaveScreen(rect, _visualScreen, _pitch, memoryPtr); bitsSaveDisplayScreen(rect, memoryPtr); } if (mask & GFX_SCREEN_MASK_PRIORITY) { - bitsSaveScreen(rect, _priorityScreen, _width, memoryPtr); + bitsSaveScreen(rect, _priorityScreen, _pitch, memoryPtr); } if (mask & GFX_SCREEN_MASK_CONTROL) { - bitsSaveScreen(rect, _controlScreen, _width, memoryPtr); + bitsSaveScreen(rect, _controlScreen, _pitch, memoryPtr); } if (mask & GFX_SCREEN_MASK_DISPLAY) { if (!_upscaledHires) @@ -482,14 +487,14 @@ void GfxScreen::bitsRestore(byte *memoryPtr) { memcpy((void *)&mask, memoryPtr, sizeof(mask)); memoryPtr += sizeof(mask); if (mask & GFX_SCREEN_MASK_VISUAL) { - bitsRestoreScreen(rect, memoryPtr, _visualScreen, _width); + bitsRestoreScreen(rect, memoryPtr, _visualScreen, _pitch); bitsRestoreDisplayScreen(rect, memoryPtr); } if (mask & GFX_SCREEN_MASK_PRIORITY) { - bitsRestoreScreen(rect, memoryPtr, _priorityScreen, _width); + bitsRestoreScreen(rect, memoryPtr, _priorityScreen, _pitch); } if (mask & GFX_SCREEN_MASK_CONTROL) { - bitsRestoreScreen(rect, memoryPtr, _controlScreen, _width); + bitsRestoreScreen(rect, memoryPtr, _controlScreen, _pitch); } if (mask & GFX_SCREEN_MASK_DISPLAY) { if (!_upscaledHires) @@ -567,7 +572,7 @@ void GfxScreen::dither(bool addToFlag) { if (!_unditheringEnabled) { // Do dithering on visual and display-screen for (y = 0; y < _height; y++) { - for (x = 0; x < _width; x++) { + for (x = 0; x < _pitch; x++) { color = *visualPtr; if (color & 0xF0) { color ^= color << 4; @@ -592,7 +597,7 @@ void GfxScreen::dither(bool addToFlag) { memset(&_ditheredPicColors, 0, sizeof(_ditheredPicColors)); // Do dithering on visual screen and put decoded but undithered byte onto display-screen for (y = 0; y < _height; y++) { - for (x = 0; x < _width; x++) { + for (x = 0; x < _pitch; x++) { color = *visualPtr; if (color & 0xF0) { color ^= color << 4; diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index 73ea596ba1..01fb899edb 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -132,6 +132,7 @@ public: private: uint16 _width; + uint16 _pitch; uint16 _height; uint _pixels; uint16 _displayWidth; -- cgit v1.2.3 From 34d00f59365cf05a8817ade955a6440ab3019860 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 26 Jul 2012 11:06:19 +0300 Subject: SCI: Add some debug code to op_line --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 5a2a39def2..3f43966976 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1173,6 +1173,7 @@ void run_vm(EngineState *s) { case op_line: // 0x3f (63) // Debug opcode (line number) + //debug("Script %d, line %d", scr->getScriptNumber(), opparams[0]); break; case op_lag: // 0x40 (64) -- cgit v1.2.3 From 7eded163d8088d97f65e482f63e9ecd194d00c68 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 27 Jul 2012 01:30:37 +0300 Subject: SCI: Add support for kCD(0) with a parameter It's now possible to start a chapter in Phantasmagoria 1 --- engines/sci/engine/kfile.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 786276221c..f7cc4f44b5 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -197,8 +197,15 @@ reg_t kCD(EngineState *s, int argc, reg_t *argv) { // TODO: Stub switch (argv[0].toUint16()) { case 0: - // Return whether the contents of disc argv[1] is available. - return TRUE_REG; + if (argc == 1) { + // Check if a disc is in the drive + return TRUE_REG; + } else { + // Check if the specified disc is in the drive + // and return the current disc number. We just + // return the requested disc number. + return argv[1]; + } case 1: // Return the current CD number return make_reg(0, 1); -- cgit v1.2.3 From 831e1b27dc5b114eaceb49bad08576b3bdf81ab5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 27 Jul 2012 01:31:12 +0300 Subject: SCI: Add a workaround for a bug in Phantasmagoria 1 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 821549bb8c..fea3aed9ae 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -40,6 +40,7 @@ const SciWorkaroundEntry arithmeticWorkarounds[] = { { GID_MOTHERGOOSE256, -1, 999, 0, "Event", "new", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_and: constantly during the game (SCI1 version) { GID_MOTHERGOOSE256, -1, 4, 0, "rm004", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_or: when going north and reaching the castle (rooms 4 and 37) - bug #3038228 { GID_MOTHERGOOSEHIRES,90, 90, 0, "newGameButton", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_ge: MUMG Deluxe, when selecting "New Game" in the main menu. It tries to compare an integer with a list. Needs to return false for the game to continue. + { GID_PHANTASMAGORIA, 902, 0, 0, "", "export 7", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_shr: when starting a chapter in Phantasmagoria { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_div: when entering the inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object { GID_QFG2, 200, 200, 0, "astro", "messages", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_lsi: when getting asked for your name by the astrologer bug #3039879 { GID_GK1, 800,64992, 0, "Fwd", "doit", -1, 0, { WORKAROUND_FAKE, 1 } }, // op_gt: when Mosely finds Gabriel and Grace near the end of the game, compares the Grooper object with 7 -- cgit v1.2.3 From af6e98ba0108fc87c5aea2e85a1aef80443937b5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 26 Jul 2012 23:20:25 -0400 Subject: VIDEO: Ignore finished video tracks in findNextVideoTrack() --- video/video_decoder.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 8b9a009b98..9282cd82d0 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -575,7 +575,7 @@ AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() { uint32 bestTime = 0xFFFFFFFF; for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) { - if ((*it)->getTrackType() == Track::kTrackTypeVideo) { + if ((*it)->getTrackType() == Track::kTrackTypeVideo && !(*it)->endOfTrack()) { VideoTrack *track = (VideoTrack *)*it; uint32 time = track->getNextFrameStartTime(); @@ -594,7 +594,7 @@ const AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack uint32 bestTime = 0xFFFFFFFF; for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { - if ((*it)->getTrackType() == Track::kTrackTypeVideo) { + if ((*it)->getTrackType() == Track::kTrackTypeVideo && !(*it)->endOfTrack()) { const VideoTrack *track = (const VideoTrack *)*it; uint32 time = track->getNextFrameStartTime(); -- cgit v1.2.3 From 2eeee33bd878a5cd385b4423f6867d0e6a3ed0b6 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 26 Jul 2012 23:24:54 -0400 Subject: VIDEO: Move findNextVideoTrack() to protected --- video/video_decoder.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/video/video_decoder.h b/video/video_decoder.h index a6dbed8fc5..dfe0fff66b 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -679,12 +679,20 @@ protected: */ Graphics::PixelFormat getDefaultHighColorFormat() const { return _defaultHighColorFormat; } + /** + * Find the video track with the lowest start time for the next frame + */ + VideoTrack *findNextVideoTrack(); + + /** + * Find the video track with the lowest start time for the next frame + */ + const VideoTrack *findNextVideoTrack() const; + private: // Tracks owned by this AdvancedVideoDecoder typedef Common::Array TrackList; TrackList _tracks; - VideoTrack *findNextVideoTrack(); - const VideoTrack *findNextVideoTrack() const; // Current playback status bool _isPlaying, _needsRewind; -- cgit v1.2.3 From 84462fa088d64acc2a7b2811f88a5a292abe00db Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 26 Jul 2012 23:36:21 -0400 Subject: VIDEO: Document more of AdvancedVideoDecoder --- video/video_decoder.h | 83 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/video/video_decoder.h b/video/video_decoder.h index dfe0fff66b..0c569692fc 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -265,7 +265,7 @@ protected: */ virtual void updateBalance() {} - int32 _curFrame; + int32 _curFrame; // This variable is now deprecated. int32 _startTime; // FIXME: These are protected until the new API takes over this one @@ -500,15 +500,56 @@ protected: TrackType getTrackType() const { return kTrackTypeVideo; } - // TODO: Document + /** + * Get the width of this track + */ virtual uint16 getWidth() const = 0; + + /** + * Get the height of this track + */ virtual uint16 getHeight() const = 0; + + /** + * Get the pixel format of this track + */ virtual Graphics::PixelFormat getPixelFormat() const = 0; + + /** + * Get the current frame of this track + * + * @see VideoDecoder::getCurFrame() + */ virtual int getCurFrame() const = 0; + + /** + * Get the frame count of this track + * + * @note If the frame count is unknown, return 0 (which is also + * the default implementation of the function). However, one must + * also implement endOfTrack() in that case. + */ virtual int getFrameCount() const { return 0; } + + /** + * Get the start time of the next frame in milliseconds since + * the start of the video + */ virtual uint32 getNextFrameStartTime() const = 0; + + /** + * Decode the next frame + */ virtual const Graphics::Surface *decodeNextFrame() = 0; + + /** + * Get the palette currently in use by this track + */ virtual const byte *getPalette() const { return 0; } + + /** + * Does the palette currently in use by this track need to be updated? + */ virtual bool hasDirtyPalette() const { return false; } }; @@ -547,19 +588,43 @@ protected: void start(); void stop(); - // TODO: Document + /** + * Get the volume for this track + */ byte getVolume() const { return _volume; } + + /** + * Set the volume for this track + */ void setVolume(byte volume); + + /** + * Get the balance for this track + */ int8 getBalance() const { return _balance; } + + /** + * Set the balance for this track + */ void setBalance(int8 balance); + + /** + * Get the time the AudioStream behind this track has been + * running + */ uint32 getRunningTime() const; + /** + * Get the sound type to be used when playing this audio track + */ virtual Audio::Mixer::SoundType getSoundType() const { return Audio::Mixer::kPlainSoundType; } protected: void pauseIntern(bool pause); - // TODO: Document + /** + * Get the AudioStream that is the representation of this AudioTrack + */ virtual Audio::AudioStream *getAudioStream() const = 0; private: @@ -583,7 +648,10 @@ protected: protected: Audio::AudioStream *getAudioStream() const; - // TODO: Document + /** + * Get the RewindableAudioStream pointer to be used by this class + * for rewind() and getAudioStream() + */ virtual Audio::RewindableAudioStream *getRewindableAudioStream() const = 0; }; @@ -604,7 +672,10 @@ protected: protected: Audio::AudioStream *getAudioStream() const; - // TODO: Document + /** + * Get the SeekableAudioStream pointer to be used by this class + * for seek(), getDuration(), and getAudioStream() + */ virtual Audio::SeekableAudioStream *getSeekableAudioStream() const = 0; }; -- cgit v1.2.3 From df5d6f7d08c30afa270fd7d3e2d0f885eaf3c7bc Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 26 Jul 2012 23:42:35 -0400 Subject: VIDEO: Force an update after a seek --- video/video_decoder.cpp | 8 +++++++- video/video_decoder.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 9282cd82d0..9d6d40f7fb 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -101,6 +101,7 @@ AdvancedVideoDecoder::AdvancedVideoDecoder() { _audioVolume = Audio::Mixer::kMaxChannelVolume; _audioBalance = 0; _pauseLevel = 0; + _needsUpdate = false; // Find the best format for output _defaultHighColorFormat = g_system->getScreenFormat(); @@ -124,6 +125,7 @@ void AdvancedVideoDecoder::close() { _audioVolume = Audio::Mixer::kMaxChannelVolume; _audioBalance = 0; _pauseLevel = 0; + _needsUpdate = false; } bool AdvancedVideoDecoder::isVideoLoaded() const { @@ -155,6 +157,8 @@ Graphics::PixelFormat AdvancedVideoDecoder::getPixelFormat() const { } const Graphics::Surface *AdvancedVideoDecoder::decodeNextFrame() { + _needsUpdate = false; + readNextPacket(); VideoTrack *track = findNextVideoTrack(); @@ -215,7 +219,7 @@ uint32 AdvancedVideoDecoder::getTime() const { } uint32 AdvancedVideoDecoder::getTimeToNextFrame() const { - if (endOfVideo()) + if (endOfVideo() || _needsUpdate) return 0; const VideoTrack *track = findNextVideoTrack(); @@ -310,6 +314,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { _audioStartOffset = time; _startTime = g_system->getMillis() - time.msecs(); + _needsUpdate = true; return true; } @@ -337,6 +342,7 @@ void AdvancedVideoDecoder::stop() { _audioStartOffset = 0; _palette = 0; _dirtyPalette = false; + _needsUpdate = false; stopAllTracks(); diff --git a/video/video_decoder.h b/video/video_decoder.h index 0c569692fc..ffeecd326d 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -766,7 +766,7 @@ private: TrackList _tracks; // Current playback status - bool _isPlaying, _needsRewind; + bool _isPlaying, _needsRewind, _needsUpdate; Audio::Timestamp _audioStartOffset; // Palette settings from individual tracks -- cgit v1.2.3 From 1f67c9dbbed5e92d8b9cb8f4d729366463a05937 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 26 Jul 2012 23:44:40 -0400 Subject: VIDEO: Reset pause time when seeking/rewinding --- video/video_decoder.cpp | 2 ++ video/video_decoder.h | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 9d6d40f7fb..77eab3a6e1 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -280,6 +280,7 @@ bool AdvancedVideoDecoder::rewind() { _audioStartOffset = 0; _startTime = g_system->getMillis(); + resetPauseStartTime(); return true; } @@ -314,6 +315,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { _audioStartOffset = time; _startTime = g_system->getMillis() - time.msecs(); + resetPauseStartTime(); _needsUpdate = true; return true; } diff --git a/video/video_decoder.h b/video/video_decoder.h index ffeecd326d..f0427668a6 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -249,7 +249,6 @@ protected: /** * Reset the pause start time (which should be called when seeking) - * @note This function is now deprecated. There is no replacement. */ void resetPauseStartTime(); -- cgit v1.2.3 From 2c4518d6154a0ae9772fe19a629f05c750ab19c8 Mon Sep 17 00:00:00 2001 From: Julien Date: Sun, 22 Jul 2012 19:22:49 -0400 Subject: LASTEXPRESS: Move some macros to entity.h --- engines/lastexpress/entities/entity.h | 23 +++++++++++++++++++++++ engines/lastexpress/entities/entity_intern.h | 20 -------------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 5ba78abc17..7ff574ddbe 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -41,6 +41,29 @@ class Sequence; class SequenceFrame; struct SavePoint; + +////////////////////////////////////////////////////////////////////////// +// Callbacks +#define ENTITY_CALLBACK(class, name, pointer) \ + Common::Functor1Mem(pointer, &class::name) + +#define ADD_CALLBACK_FUNCTION(class, name) \ + _callbacks.push_back(new ENTITY_CALLBACK(class, name, this)); + +#define ADD_NULL_FUNCTION() \ + _callbacks.push_back(new ENTITY_CALLBACK(Entity, nullfunction, this)); + +////////////////////////////////////////////////////////////////////////// +// Parameters macros +////////////////////////////////////////////////////////////////////////// +#define CURRENT_PARAM(index, id) \ + ((EntityData::EntityParametersIIII*)_data->getCurrentParameters(index))->param##id + +#define ENTITY_PARAM(index, id) \ + ((EntityData::EntityParametersIIII*)_data->getParameters(8, index))->param##id + + + class EntityData : Common::Serializable { public: diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 64814a1b40..576765620f 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -25,17 +25,6 @@ namespace LastExpress { -////////////////////////////////////////////////////////////////////////// -// Callbacks -#define ENTITY_CALLBACK(class, name, pointer) \ - Common::Functor1Mem(pointer, &class::name) - -#define ADD_CALLBACK_FUNCTION(class, name) \ - _callbacks.push_back(new ENTITY_CALLBACK(class, name, this)); - -#define ADD_NULL_FUNCTION() \ - _callbacks.push_back(new ENTITY_CALLBACK(Entity, nullfunction, this)); - ////////////////////////////////////////////////////////////////////////// // Declaration ////////////////////////////////////////////////////////////////////////// @@ -307,15 +296,6 @@ void class::setup_##name() { \ getEntities()->resetState(entity); \ ((class *)getEntities()->get(entity))->function(); -////////////////////////////////////////////////////////////////////////// -// Parameters macros (for default IIII parameters) -////////////////////////////////////////////////////////////////////////// -#define CURRENT_PARAM(index, id) \ - ((EntityData::EntityParametersIIII*)_data->getCurrentParameters(index))->param##id - -#define ENTITY_PARAM(index, id) \ - ((EntityData::EntityParametersIIII*)_data->getParameters(8, index))->param##id - ////////////////////////////////////////////////////////////////////////// // Time check macros ////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3 From 5d4a8f1e15c9b90209cbd4572ef17552cc06d65c Mon Sep 17 00:00:00 2001 From: Julien Date: Sun, 22 Jul 2012 20:27:23 -0400 Subject: LASTEXPRESS: Remove use of function wrappers in shared entity functions --- engines/lastexpress/entities/alouan.cpp | 8 ++++---- engines/lastexpress/entities/coudert.cpp | 20 ++++++++++---------- engines/lastexpress/entities/entity.cpp | 20 ++++++++++---------- engines/lastexpress/entities/entity.h | 22 ++++++++-------------- engines/lastexpress/entities/hadija.cpp | 8 ++++---- engines/lastexpress/entities/mertens.cpp | 20 ++++++++++---------- 6 files changed, 46 insertions(+), 52 deletions(-) diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp index 8e56ae4c5b..589b712b16 100644 --- a/engines/lastexpress/entities/alouan.cpp +++ b/engines/lastexpress/entities/alouan.cpp @@ -86,22 +86,22 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(6, Alouan, compartment6) - Entity::goToCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Cf", "621Df", WRAP_ENTER_FUNCTION(Alouan, setup_enterExitCompartment)); + Entity::goToCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Cf", "621Df"); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(7, Alouan, compartment8) - Entity::goToCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Ch", "621Dh", WRAP_ENTER_FUNCTION(Alouan, setup_enterExitCompartment)); + Entity::goToCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Ch", "621Dh"); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(8, Alouan, compartment6to8) - Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Bf", kObjectCompartment8, kPosition_2740, "621Ah", WRAP_ENTER_FUNCTION(Alouan, setup_enterExitCompartment), WRAP_UPDATE_FUNCTION(Alouan, setup_updateEntity)); + Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment6, kPosition_4070, "621Bf", kObjectCompartment8, kPosition_2740, "621Ah"); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(9, Alouan, compartment8to6) - Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Bh", kObjectCompartment6, kPosition_4070, "621Af", WRAP_ENTER_FUNCTION(Alouan, setup_enterExitCompartment), WRAP_UPDATE_FUNCTION(Alouan, setup_updateEntity)); + Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment8, kPosition_2740, "621Bh", kObjectCompartment6, kPosition_4070, "621Af"); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index 77cddddf48..e79d4cdff7 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -115,7 +115,7 @@ IMPLEMENT_FUNCTION_S(2, Coudert, bloodJacket) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionExitCompartment: @@ -142,7 +142,7 @@ IMPLEMENT_FUNCTION_SI(3, Coudert, enterExitCompartment, ObjectIndex) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); return; case kActionCallback: @@ -168,7 +168,7 @@ IMPLEMENT_FUNCTION(4, Coudert, callbackActionOnDirection) break; } - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionExitCompartment: @@ -191,7 +191,7 @@ IMPLEMENT_FUNCTION_SIII(5, Coudert, enterExitCompartment2, ObjectIndex, EntityPo break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); return; case kActionCallback: @@ -212,7 +212,7 @@ IMPLEMENT_FUNCTION_S(6, Coudert, playSound) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionEndSound: @@ -241,7 +241,7 @@ IMPLEMENT_FUNCTION_NOSETUP(7, Coudert, playSound16) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionEndSound: @@ -354,7 +354,7 @@ IMPLEMENT_FUNCTION_I(10, Coudert, updateFromTime, uint32) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); UPDATE_PARAM(params->param2, getState()->time, params->param1); @@ -377,7 +377,7 @@ IMPLEMENT_FUNCTION_I(11, Coudert, updateFromTicks, uint32) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); UPDATE_PARAM(params->param2, getState()->timeTicks, params->param1); @@ -451,7 +451,7 @@ IMPLEMENT_FUNCTION_II(13, Coudert, function13, bool, EntityIndex) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); if (!params->param2 && !params->param3) { @@ -573,7 +573,7 @@ IMPLEMENT_FUNCTION_I(14, Coudert, function14, EntityIndex) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Coudert, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionDefault: diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 1ad6d08035..4c661a4915 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -254,7 +254,7 @@ void Entity::savegame(const SavePoint &savepoint) { } } -void Entity::savegameBloodJacket(SaveFunction *saveFunction) { +void Entity::savegameBloodJacket() { if (getProgress().jacket == kJacketBlood && getEntities()->isDistanceBetweenEntities(_entityIndex, kEntityPlayer, 1000) && !getEntities()->isInsideCompartments(kEntityPlayer) @@ -266,11 +266,11 @@ void Entity::savegameBloodJacket(SaveFunction *saveFunction) { break; case kEntityCoudert: - (*saveFunction)(kSavegameTypeEvent, kEventCoudertBloodJacket); + setup_savegame(kSavegameTypeEvent, kEventCoudertBloodJacket); break; case kEntityMertens: - (*saveFunction)(kSavegameTypeEvent, kEventCoudertBloodJacket); + setup_savegame(kSavegameTypeEvent, kEventCoudertBloodJacket); break; } } @@ -488,7 +488,7 @@ void Entity::enterExitCompartment(const SavePoint &savepoint, EntityPosition pos } } -void Entity::goToCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, Common::String sequenceTo, Entity::EnterFunction *enterFunction) { +void Entity::goToCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, Common::String sequenceTo) { switch (savepoint.action) { default: break; @@ -496,7 +496,7 @@ void Entity::goToCompartment(const SavePoint &savepoint, ObjectIndex compartment case kActionDefault: getData()->entityPosition = positionFrom; setCallback(1); - (*enterFunction)(sequenceFrom.c_str(), compartmentFrom); + setup_enterExitCompartment(sequenceFrom.c_str(), compartmentFrom); break; case kActionCallback: @@ -506,7 +506,7 @@ void Entity::goToCompartment(const SavePoint &savepoint, ObjectIndex compartment case 1: setCallback(2); - (*enterFunction)(sequenceTo.c_str(), compartmentFrom); + setup_enterExitCompartment(sequenceTo.c_str(), compartmentFrom); break; case 2: @@ -519,7 +519,7 @@ void Entity::goToCompartment(const SavePoint &savepoint, ObjectIndex compartment } } -void Entity::goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, ObjectIndex compartmentTo, EntityPosition positionTo, Common::String sequenceTo, Entity::EnterFunction *enterFunction, Entity::UpdateFunction *updateFunction) { +void Entity::goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, ObjectIndex compartmentTo, EntityPosition positionTo, Common::String sequenceTo) { switch (savepoint.action) { default: break; @@ -528,7 +528,7 @@ void Entity::goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIn getData()->entityPosition = positionFrom; getData()->location = kLocationOutsideCompartment; setCallback(1); - (*enterFunction)(sequenceFrom.c_str(), compartmentFrom); + setup_enterExitCompartment(sequenceFrom.c_str(), compartmentFrom); break; case kActionCallback: @@ -538,12 +538,12 @@ void Entity::goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIn case 1: setCallback(2); - (*updateFunction)(kCarGreenSleeping, positionTo); + setup_updateEntity(kCarGreenSleeping, positionTo); break; case 2: setCallback(3); - (*enterFunction)(sequenceTo.c_str(), compartmentTo); + setup_enterExitCompartment(sequenceTo.c_str(), compartmentTo); break; case 3: diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 7ff574ddbe..77c3793890 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -689,6 +689,11 @@ public: virtual void setup_chapter4() = 0; virtual void setup_chapter5() = 0; + // Shared functions + virtual void setup_savegame(SavegameType, uint32) { error("[Entity::setup_savegame] Trying to call the parent setup function. Use the specific entity function directly"); } + virtual void setup_enterExitCompartment(const char *, ObjectIndex) { error("[Entity::setup_enterExitCompartment] Trying to call the parent setup function. Use the specific entity function directly"); } + virtual void setup_updateEntity(CarIndex, EntityPosition) { error("[Entity::setup_updateEntity] Trying to call the parent setup function. Use the specific entity function directly"); } + // Serializable void saveLoadWithSerializer(Common::Serializer &ser) { _data->saveLoadWithSerializer(ser); } @@ -701,14 +706,6 @@ protected: EntityData *_data; Common::Array _callbacks; - typedef Common::Functor2 EnterFunction; - typedef Common::Functor2 UpdateFunction; - typedef Common::Functor2 SaveFunction; - - #define WRAP_ENTER_FUNCTION(className, method) new Common::Functor2Mem(this, &className::method) - #define WRAP_UPDATE_FUNCTION(className, method) new Common::Functor2Mem(this, &className::method) - #define WRAP_SAVE_FUNCTION(className, method) new Common::Functor2Mem(this, &className::method) - /** * Saves the game * @@ -723,7 +720,7 @@ protected: * * @param saveFunction The setup function to call to save the game */ - void savegameBloodJacket(SaveFunction *saveFunction); + void savegameBloodJacket(); /** * Play sound @@ -836,9 +833,8 @@ protected: * @param positionFrom The position from. * @param sequenceFrom The sequence from. * @param sequenceTo The sequence to. - * @param enterFunction The enter/exit compartment function. */ - void goToCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, Common::String sequenceTo, EnterFunction *enterFunction); + void goToCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, Common::String sequenceTo); /** * Go to compartment from compartment. @@ -850,10 +846,8 @@ protected: * @param compartmentTo The compartment to. * @param positionTo The position to. * @param sequenceTo The sequence to. - * @param enterFunction The enter/exit compartment function. - * @param updateFunction The update entity function. */ - void goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, ObjectIndex compartmentTo, EntityPosition positionTo, Common::String sequenceTo, Entity::EnterFunction *enterFunction, Entity::UpdateFunction *updateFunction); + void goToCompartmentFromCompartment(const SavePoint &savepoint, ObjectIndex compartmentFrom, EntityPosition positionFrom, Common::String sequenceFrom, ObjectIndex compartmentTo, EntityPosition positionTo, Common::String sequenceTo); /** * Updates the position diff --git a/engines/lastexpress/entities/hadija.cpp b/engines/lastexpress/entities/hadija.cpp index 2dd239d4c9..8d757d54fd 100644 --- a/engines/lastexpress/entities/hadija.cpp +++ b/engines/lastexpress/entities/hadija.cpp @@ -86,22 +86,22 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(6, Hadija, compartment6) - Entity::goToCompartment(savepoint, kObjectCompartment6, kPosition_4070, "619Cf", "619Df", WRAP_ENTER_FUNCTION(Hadija, setup_enterExitCompartment)); + Entity::goToCompartment(savepoint, kObjectCompartment6, kPosition_4070, "619Cf", "619Df"); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(7, Hadija, compartment8) - Entity::goToCompartment(savepoint, kObjectCompartment8, kPosition_2740, "619Ch", "619Dh", WRAP_ENTER_FUNCTION(Hadija, setup_enterExitCompartment)); + Entity::goToCompartment(savepoint, kObjectCompartment8, kPosition_2740, "619Ch", "619Dh"); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(8, Hadija, compartment6to8) - Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment6, kPosition_4070, "619Bf", kObjectCompartment8, kPosition_2740, "619Ah", WRAP_ENTER_FUNCTION(Hadija, setup_enterExitCompartment), WRAP_UPDATE_FUNCTION(Hadija, setup_updateEntity)); + Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment6, kPosition_4070, "619Bf", kObjectCompartment8, kPosition_2740, "619Ah"); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(9, Hadija, compartment8to6) - Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment8, kPosition_2740, "619Bh", kObjectCompartment6, kPosition_4070, "619Af", WRAP_ENTER_FUNCTION(Hadija, setup_enterExitCompartment), WRAP_UPDATE_FUNCTION(Hadija, setup_updateEntity)); + Entity::goToCompartmentFromCompartment(savepoint, kObjectCompartment8, kPosition_2740, "619Bh", kObjectCompartment6, kPosition_4070, "619Af"); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index 328c8e88d8..37e7bf5ca6 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -107,7 +107,7 @@ IMPLEMENT_FUNCTION_S(2, Mertens, bloodJacket) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionExitCompartment: @@ -134,7 +134,7 @@ IMPLEMENT_FUNCTION_SI(3, Mertens, enterExitCompartment, ObjectIndex) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); return; case kActionCallback: @@ -155,7 +155,7 @@ IMPLEMENT_FUNCTION_SI(4, Mertens, enterExitCompartment2, ObjectIndex) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); return; case kAction4: @@ -181,7 +181,7 @@ IMPLEMENT_FUNCTION_SIII(5, Mertens, enterExitCompartment3, ObjectIndex, EntityPo break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionExitCompartment: @@ -223,7 +223,7 @@ IMPLEMENT_FUNCTION(6, Mertens, callbackActionOnDirection) break; } - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionExitCompartment: @@ -246,7 +246,7 @@ IMPLEMENT_FUNCTION_S(7, Mertens, playSound) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionEndSound: @@ -273,7 +273,7 @@ IMPLEMENT_FUNCTION_S(8, Mertens, playSound16) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionEndSound: @@ -462,7 +462,7 @@ IMPLEMENT_FUNCTION_I(11, Mertens, function11, uint32) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); UPDATE_PARAM(params->param2, getState()->time, params->param1) @@ -530,7 +530,7 @@ IMPLEMENT_FUNCTION_II(13, Mertens, function13, bool, bool) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); if (!params->param2 && !params->param3) { UPDATE_PARAM_PROC(params->param4, getState()->timeTicks, 75) @@ -652,7 +652,7 @@ IMPLEMENT_FUNCTION_I(14, Mertens, function14, EntityIndex) break; case kActionNone: - Entity::savegameBloodJacket(WRAP_SAVE_FUNCTION(Mertens, setup_savegame)); + Entity::savegameBloodJacket(); break; case kActionDefault: -- cgit v1.2.3 From c589e69ec9f29e59fc4358e5045fcc613f9ab6a8 Mon Sep 17 00:00:00 2001 From: Julien Date: Sun, 22 Jul 2012 21:14:48 -0400 Subject: LASTEXPRESS: Replace TIME_CHECK_CALLBACK_ACTION macro --- engines/lastexpress/entities/boutarel.cpp | 3 ++- engines/lastexpress/entities/entity.cpp | 10 ++++++++++ engines/lastexpress/entities/entity.h | 1 + engines/lastexpress/entities/entity_intern.h | 7 ------- engines/lastexpress/entities/gendarmes.cpp | 3 ++- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp index 95ec37bf50..ab5f019c49 100644 --- a/engines/lastexpress/entities/boutarel.cpp +++ b/engines/lastexpress/entities/boutarel.cpp @@ -476,7 +476,8 @@ IMPLEMENT_FUNCTION_IS(17, Boutarel, function17, TimeValue) break; case kActionNone: - TIME_CHECK_CALLBACK_ACTION(params->param1, params->param6); + if (Entity::timeCheckCallbackAction((TimeValue)params->param1, params->param6)) + break; if (params->param5) { UPDATE_PARAM(params->param7, getState()->timeTicks, 90) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 4c661a4915..9cb6825f79 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -611,4 +611,14 @@ void Entity::timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex o } } +bool Entity::timeCheckCallbackAction(TimeValue timeValue, uint ¶meter) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + callbackAction(); + return true; + } + + return false; +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 77c3793890..fb5c958464 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -871,6 +871,7 @@ protected: void timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action); void timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex index, ObjectLocation location); + bool timeCheckCallbackAction(TimeValue timeValue, uint ¶meter); }; diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 576765620f..cb4f7b941b 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -347,13 +347,6 @@ void class::setup_##name() { \ break; \ } -#define TIME_CHECK_CALLBACK_ACTION(timeValue, parameter) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - callbackAction(); \ - break; \ - } - #define TIME_CHECK_PLAYSOUND_UPDATEPOSITION(timeValue, parameter, callback, sound, position) \ if (getState()->time > timeValue && !parameter) { \ parameter = 1; \ diff --git a/engines/lastexpress/entities/gendarmes.cpp b/engines/lastexpress/entities/gendarmes.cpp index 877c0c29b3..fe9f6f0aa5 100644 --- a/engines/lastexpress/entities/gendarmes.cpp +++ b/engines/lastexpress/entities/gendarmes.cpp @@ -551,7 +551,8 @@ void Gendarmes::arrest(const SavePoint &savepoint, bool shouldPlaySound, SoundFl case kActionNone: if (checkCallback) { EXPOSE_PARAMS(EntityData::EntityParametersIIII); - TIME_CHECK_CALLBACK_ACTION(params->param1, params->param2); + if (Entity::timeCheckCallbackAction((TimeValue)params->param1, params->param2)) + break; } if (shouldUpdateEntity) { -- cgit v1.2.3 From 2e20e1d1e259dc6d9de8a90fa8417245f5a481b4 Mon Sep 17 00:00:00 2001 From: Julien Date: Sun, 22 Jul 2012 21:41:28 -0400 Subject: LASTEXPRESS: Replace TIME_CHECK_PLAYSOUND_UPDATEPOSITION macro --- engines/lastexpress/entities/entity.cpp | 13 +++++++++++++ engines/lastexpress/entities/entity.h | 2 ++ engines/lastexpress/entities/entity_intern.h | 9 --------- engines/lastexpress/entities/hadija.cpp | 3 ++- engines/lastexpress/entities/yasmin.cpp | 6 ++++-- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 9cb6825f79..43f039df43 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -621,4 +621,17 @@ bool Entity::timeCheckCallbackAction(TimeValue timeValue, uint ¶meter) { return false; } +bool Entity::timeCheckPlaySoundUpdatePosition(TimeValue timeValue, uint ¶meter, byte callback, const char* sound, EntityPosition position) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + getData()->entityPosition = position; + setCallback(callback); + setup_playSound(sound); + return true; + } + + return false; +} + + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index fb5c958464..3370659c6e 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -693,6 +693,7 @@ public: virtual void setup_savegame(SavegameType, uint32) { error("[Entity::setup_savegame] Trying to call the parent setup function. Use the specific entity function directly"); } virtual void setup_enterExitCompartment(const char *, ObjectIndex) { error("[Entity::setup_enterExitCompartment] Trying to call the parent setup function. Use the specific entity function directly"); } virtual void setup_updateEntity(CarIndex, EntityPosition) { error("[Entity::setup_updateEntity] Trying to call the parent setup function. Use the specific entity function directly"); } + virtual void setup_playSound(const char*) { error("[Entity::setup_playSound] Trying to call the parent setup function. Use the specific entity function directly"); } // Serializable void saveLoadWithSerializer(Common::Serializer &ser) { _data->saveLoadWithSerializer(ser); } @@ -872,6 +873,7 @@ protected: void timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action); void timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex index, ObjectLocation location); bool timeCheckCallbackAction(TimeValue timeValue, uint ¶meter); + bool timeCheckPlaySoundUpdatePosition(TimeValue timeValue, uint ¶meter, byte callback, const char* sound, EntityPosition position); }; diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index cb4f7b941b..15a0a37c2f 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -347,15 +347,6 @@ void class::setup_##name() { \ break; \ } -#define TIME_CHECK_PLAYSOUND_UPDATEPOSITION(timeValue, parameter, callback, sound, position) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - getData()->entityPosition = position; \ - setCallback(callback); \ - setup_playSound(sound); \ - break; \ - } - #define TIME_CHECK_CAR(timeValue, parameter, callback, function) {\ if ((getState()->time <= timeValue && !getEntities()->isPlayerInCar(kCarGreenSleeping)) || !parameter) \ parameter = (uint)getState()->time + 75; \ diff --git a/engines/lastexpress/entities/hadija.cpp b/engines/lastexpress/entities/hadija.cpp index 8d757d54fd..4e72ce56f1 100644 --- a/engines/lastexpress/entities/hadija.cpp +++ b/engines/lastexpress/entities/hadija.cpp @@ -130,7 +130,8 @@ IMPLEMENT_FUNCTION(11, Hadija, chapter1Handler) break; case kActionNone: - TIME_CHECK_PLAYSOUND_UPDATEPOSITION(kTimeParisEpernay, params->param1, 1, "Har1100", kPosition_4840); + if (Entity::timeCheckPlaySoundUpdatePosition(kTimeParisEpernay, params->param1, 1, "Har1100", kPosition_4840)) + break; label_callback1: TIME_CHECK_CALLBACK(kTime1084500, params->param2, 2, setup_compartment6to8); diff --git a/engines/lastexpress/entities/yasmin.cpp b/engines/lastexpress/entities/yasmin.cpp index ebf90744f5..6fb1936303 100644 --- a/engines/lastexpress/entities/yasmin.cpp +++ b/engines/lastexpress/entities/yasmin.cpp @@ -204,7 +204,8 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler) case kActionNone: TIME_CHECK_CALLBACK(kTime1093500, params->param1, 1, setup_function6); TIME_CHECK_CALLBACK(kTime1161000, params->param2, 3, setup_function7); - TIME_CHECK_PLAYSOUND_UPDATEPOSITION(kTime1162800, params->param3, 4, "Har1102", kPosition_4070); + if (Entity::timeCheckPlaySoundUpdatePosition(kTime1162800, params->param3, 4, "Har1102", kPosition_4070)) + break; TIME_CHECK_CALLBACK_1(kTime1165500, params->param4, 5, setup_playSound, "Har1104"); TIME_CHECK_CALLBACK_1(kTime1174500, params->param5, 6, setup_playSound, "Har1106"); TIME_CHECK_CALLBACK(kTime1183500, params->param6, 7, setup_function6); @@ -226,7 +227,8 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler) // Fallback to case 3 case 3: - TIME_CHECK_PLAYSOUND_UPDATEPOSITION(kTime1162800, params->param3, 4, "Har1102", kPosition_4070); + if (Entity::timeCheckPlaySoundUpdatePosition(kTime1162800, params->param3, 4, "Har1102", kPosition_4070)) + break; // Fallback to case 4 case 4: -- cgit v1.2.3 From 95503250f82c71b4ca6849c5eb5581d3c6645202 Mon Sep 17 00:00:00 2001 From: Julien Date: Sun, 22 Jul 2012 22:24:27 -0400 Subject: LASTEXPRESS: Replace UPDATE_PARAM macro --- engines/lastexpress/entities/abbot.cpp | 21 +++++++++----- engines/lastexpress/entities/alexei.cpp | 13 ++++++--- engines/lastexpress/entities/alouan.cpp | 4 ++- engines/lastexpress/entities/anna.cpp | 43 +++++++++++++++++++--------- engines/lastexpress/entities/august.cpp | 24 ++++++++++------ engines/lastexpress/entities/boutarel.cpp | 7 +++-- engines/lastexpress/entities/chapters.cpp | 3 +- engines/lastexpress/entities/cooks.cpp | 9 ++++-- engines/lastexpress/entities/coudert.cpp | 33 ++++++++++++++------- engines/lastexpress/entities/entity.cpp | 20 +++++++++++-- engines/lastexpress/entities/entity.h | 2 ++ engines/lastexpress/entities/entity_intern.h | 7 ----- engines/lastexpress/entities/gendarmes.cpp | 3 +- engines/lastexpress/entities/hadija.cpp | 4 ++- engines/lastexpress/entities/kahina.cpp | 3 +- engines/lastexpress/entities/mahmud.cpp | 9 ++++-- engines/lastexpress/entities/max.cpp | 15 ++++++---- engines/lastexpress/entities/mertens.cpp | 21 +++++++++----- engines/lastexpress/entities/milos.cpp | 18 ++++++++---- engines/lastexpress/entities/mmeboutarel.cpp | 15 ++++++---- engines/lastexpress/entities/pascale.cpp | 3 +- engines/lastexpress/entities/rebecca.cpp | 10 +++++-- engines/lastexpress/entities/salko.cpp | 6 ++-- engines/lastexpress/entities/tatiana.cpp | 16 +++++++---- engines/lastexpress/entities/vassili.cpp | 9 ++++-- engines/lastexpress/entities/verges.cpp | 3 +- engines/lastexpress/entities/vesna.cpp | 9 ++++-- engines/lastexpress/entities/yasmin.cpp | 4 ++- 28 files changed, 226 insertions(+), 108 deletions(-) diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp index 9280068fae..c224b57abc 100644 --- a/engines/lastexpress/entities/abbot.cpp +++ b/engines/lastexpress/entities/abbot.cpp @@ -514,7 +514,8 @@ IMPLEMENT_FUNCTION(24, Abbot, function24) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->time, 900); + if (!Entity::updateParameter(params->param1, getState()->time, 900)) + break; setup_function25(); break; @@ -615,7 +616,8 @@ IMPLEMENT_FUNCTION(26, Abbot, function26) break; case kActionNone: - UPDATE_PARAM(params->param2, getState()->time, 4500); + if (!Entity::updateParameter(params->param2, getState()->time, 4500)) + break; if (getEntities()->isSomebodyInsideRestaurantOrSalon()) setup_function27(); @@ -862,7 +864,8 @@ IMPLEMENT_FUNCTION(31, Abbot, function31) if (!params->param1) break; - UPDATE_PARAM(params->param5, getState()->time, 450); + if (!Entity::updateParameter(params->param5, getState()->time, 450)) + break; setCallback(6); setup_callbackActionRestaurantOrSalon(); @@ -918,7 +921,8 @@ IMPLEMENT_FUNCTION(31, Abbot, function31) getSavePoints()->push(kEntityAbbot, kEntityAlexei, kAction122288808); params->param1 = 1; - UPDATE_PARAM(params->param5, getState()->time, 450); + if (!Entity::updateParameter(params->param5, getState()->time, 450)) + break; setCallback(6); setup_callbackActionRestaurantOrSalon(); @@ -1161,7 +1165,8 @@ IMPLEMENT_FUNCTION(36, Abbot, function36) break; case 2: - UPDATE_PARAM(params->param4, getState()->time, 900); + if (!Entity::updateParameter(params->param4, getState()->time, 900)) + break; getSound()->playSound(kEntityAbbot, "Abb3042"); break; @@ -1426,7 +1431,8 @@ label_callback_1: TIME_CHECK(kTime2466000, params->param5, setup_function44); if (params->param3) { - UPDATE_PARAM(params->param6, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param6, getState()->timeTicks, 75)) + break; params->param2 = 1; params->param3 = 0; @@ -1748,7 +1754,8 @@ IMPLEMENT_FUNCTION(49, Abbot, pickBomb) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->timeTicks, 150); + if (!Entity::updateParameter(params->param1, getState()->timeTicks, 150)) + break; getSavePoints()->push(kEntityAbbot, kEntityAbbot, kAction157489665); break; diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp index 437c31c476..c77b103f4d 100644 --- a/engines/lastexpress/entities/alexei.cpp +++ b/engines/lastexpress/entities/alexei.cpp @@ -314,7 +314,8 @@ IMPLEMENT_FUNCTION_IS(16, Alexei, function16, TimeValue) } if (params->param5) { - UPDATE_PARAM(CURRENT_PARAM(1, 1), getState()->timeTicks, 75); + if (!Entity::updateParameter(CURRENT_PARAM(1, 1), getState()->timeTicks, 75)) + break; params->param5 = 0; params->param6 = 1; @@ -482,7 +483,9 @@ IMPLEMENT_FUNCTION(18, Alexei, chapter1Handler) } if (params->param1) { - UPDATE_PARAM(params->param3, getState()->timeTicks, 90); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, 90)) + break; + getScenes()->loadSceneFromPosition(kCarRestaurant, 61); } else { params->param3 = 0; @@ -1348,7 +1351,8 @@ IMPLEMENT_FUNCTION(35, Alexei, function35) UPDATE_PARAM_PROC_END label_callback_3: - UPDATE_PARAM(params->param4, getState()->time, 9000); + if (!Entity::updateParameter(params->param4, getState()->time, 9000)) + break; setCallback(4); setup_callbackActionRestaurantOrSalon(); @@ -1397,7 +1401,8 @@ IMPLEMENT_FUNCTION(36, Alexei, function36) if (params->param3 || params->param2) break; - UPDATE_PARAM(params->param4, getState()->timeTicks, params->param1); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, params->param1)) + break; getEntities()->drawSequenceRight(kEntityAlexei, "124B"); diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp index 589b712b16..7549aaf6e6 100644 --- a/engines/lastexpress/entities/alouan.cpp +++ b/engines/lastexpress/entities/alouan.cpp @@ -438,7 +438,9 @@ IMPLEMENT_FUNCTION(22, Alouan, function22) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->time, 2700); + if (!Entity::updateParameter(params->param1, getState()->time, 2700)) + break; + setup_function23(); break; diff --git a/engines/lastexpress/entities/anna.cpp b/engines/lastexpress/entities/anna.cpp index 806beaee9d..80a5144bbe 100644 --- a/engines/lastexpress/entities/anna.cpp +++ b/engines/lastexpress/entities/anna.cpp @@ -207,7 +207,8 @@ IMPLEMENT_FUNCTION(12, Anna, function12) } if (params->param4) { - UPDATE_PARAM(params->param8, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param8, getState()->timeTicks, 75)) + break; params->param4 = 0; params->param5 = 1; @@ -427,7 +428,8 @@ IMPLEMENT_FUNCTION_IS(15, Anna, function15, TimeValue) } if (params->param5) { - UPDATE_PARAM(params->param8, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param8, getState()->timeTicks, 75)) + break; params->param5 = 0; params->param6 = 1; @@ -675,7 +677,8 @@ IMPLEMENT_FUNCTION_I(18, Anna, function18, TimeValue) } if (params->param3) { - UPDATE_PARAM(params->param7, getState()->timeTicks, 90); + if (!Entity::updateParameter(params->param7, getState()->timeTicks, 90)) + break; getScenes()->loadSceneFromPosition(kCarRestaurant, 61); } else { @@ -1157,7 +1160,8 @@ IMPLEMENT_FUNCTION(29, Anna, function29) } if (params->param1) { - UPDATE_PARAM(params->param4, getState()->timeTicks, 90); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, 90)) + break; getScenes()->loadSceneFromPosition(kCarRestaurant, 55); } else { @@ -1279,7 +1283,9 @@ IMPLEMENT_FUNCTION(30, Anna, function30) } if (params->param1) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 90); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 90)) + break; + getScenes()->loadSceneFromPosition(kCarRestaurant, 55); } else { params->param5 = 0; @@ -1483,7 +1489,8 @@ IMPLEMENT_FUNCTION(35, Anna, function35) if (!params->param1) break; - UPDATE_PARAM(params->param3, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, 75)) + break; switch (params->param2) { default: @@ -1797,7 +1804,8 @@ IMPLEMENT_FUNCTION(41, Anna, function41) break; case kActionNone: - UPDATE_PARAM(params->param2, getState()->time, 2700); + if (!Entity::updateParameter(params->param2, getState()->time, 2700)) + break; params->param5++; switch (params->param5) { @@ -2399,7 +2407,8 @@ IMPLEMENT_FUNCTION(53, Anna, function53) } if (params->param1) { - UPDATE_PARAM(params->param7, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param7, getState()->timeTicks, 75)) + break; CursorStyle cursor = getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal; @@ -2545,7 +2554,8 @@ IMPLEMENT_FUNCTION(54, Anna, function54) } if (params->param1) { - UPDATE_PARAM(params->param7, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param7, getState()->timeTicks, 75)) + break; CursorStyle cursor = getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal; @@ -2892,7 +2902,8 @@ IMPLEMENT_FUNCTION(59, Anna, function59) } if (params->param1) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) + break; CursorStyle style = getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal; getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, style); @@ -3275,7 +3286,8 @@ IMPLEMENT_FUNCTION(67, Anna, chapter4Handler) label_next: if (params->param1) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 1; @@ -3405,7 +3417,8 @@ IMPLEMENT_FUNCTION(69, Anna, function69) case kActionNone: if (params->param1) { - UPDATE_PARAM(params->param2, getState()->time, 4500); + if (!Entity::updateParameter(params->param2, getState()->time, 4500)) + break; getData()->car = kCarRedSleeping; getData()->entityPosition = kPosition_9270; @@ -3909,7 +3922,8 @@ IMPLEMENT_FUNCTION(80, Anna, function80) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->timeTicks, 450); + if (!Entity::updateParameter(params->param1, getState()->timeTicks, 450)) + break; getSound()->playSound(kEntityPlayer, "Kro5001", kFlagDefault); break; @@ -3978,7 +3992,8 @@ IMPLEMENT_FUNCTION(81, Anna, finalSequence) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->timeTicks, 180); + if (!Entity::updateParameter(params->param1, getState()->timeTicks, 180)) + break; getSound()->playSound(kEntityTrain, "LIB069"); getLogic()->gameOver(kSavegameTypeIndex, 2, kSceneNone, true); diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp index f255d041f8..d874c666f7 100644 --- a/engines/lastexpress/entities/august.cpp +++ b/engines/lastexpress/entities/august.cpp @@ -840,7 +840,8 @@ label_callback_9: break; if (getObjects()->get(kObjectCompartment1).location == kObjectLocation1) { - UPDATE_PARAM(CURRENT_PARAM(1, 2), getState()->timeTicks, 75); + if (!Entity::updateParameter(CURRENT_PARAM(1, 2), getState()->timeTicks, 75)) + break; getObjects()->update(kObjectCompartment1, kEntityAugust, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal); @@ -1483,7 +1484,8 @@ IMPLEMENT_FUNCTION(30, August, restaurant) break; case kActionNone: - UPDATE_PARAM(params->param3, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, 75)) + break; getData()->inventoryItem = kItemInvalid; break; @@ -1654,7 +1656,8 @@ IMPLEMENT_FUNCTION(32, August, function32) } if (params->param3) { - UPDATE_PARAM(params->param8, getState()->timeTicks, 90); + if (!Entity::updateParameter(params->param8, getState()->timeTicks, 90)) + break; getScenes()->loadSceneFromPosition(kCarRestaurant, 55); } else { @@ -2768,7 +2771,8 @@ IMPLEMENT_FUNCTION(54, August, function54) getData()->inventoryItem = kItemInvalid; if (!params->param2 && params->param1) { - UPDATE_PARAM(params->param5, getState()->time, params->param1); + if (!Entity::updateParameter(params->param5, getState()->time, params->param1)) + break; getData()->inventoryItem = kItemNone; setup_function55(); @@ -3044,7 +3048,8 @@ IMPLEMENT_FUNCTION(60, August, function60) if (!params->param1) break; - UPDATE_PARAM(params->param3, getState()->time, 9000); + if (!Entity::updateParameter(params->param3, getState()->time, 9000)) + break; setCallback(1); setup_callbackActionRestaurantOrSalon(); @@ -3140,7 +3145,8 @@ IMPLEMENT_FUNCTION(62, August, function62) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->time, 900); + if (!Entity::updateParameter(params->param1, getState()->time, 900)) + break; getSound()->playSound(kEntityAugust, "Aug4003A"); @@ -3229,7 +3235,8 @@ IMPLEMENT_FUNCTION(63, August, function63) break; } - UPDATE_PARAM(params->param5, getState()->timeTicks, params->param1); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, params->param1)) + break; params->param2 = (params->param6 < 1 ? 1 : 0); @@ -3386,7 +3393,8 @@ IMPLEMENT_FUNCTION(68, August, function68) case kActionNone: if (params->param1) { - UPDATE_PARAM(params->param4, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 1; diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp index ab5f019c49..ab8a0b9003 100644 --- a/engines/lastexpress/entities/boutarel.cpp +++ b/engines/lastexpress/entities/boutarel.cpp @@ -480,7 +480,9 @@ IMPLEMENT_FUNCTION_IS(17, Boutarel, function17, TimeValue) break; if (params->param5) { - UPDATE_PARAM(params->param7, getState()->timeTicks, 90) + if (!Entity::updateParameter(params->param7, getState()->timeTicks, 90)) + break; + getScenes()->loadSceneFromPosition(kCarRestaurant, 51); } else { params->param7 = 0; @@ -515,7 +517,8 @@ IMPLEMENT_FUNCTION_I(18, Boutarel, function18, TimeValue) } if (params->param2) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) + break; params->param2 = 0; params->param3 = 1; diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp index b4978165b9..76165800f2 100644 --- a/engines/lastexpress/entities/chapters.cpp +++ b/engines/lastexpress/entities/chapters.cpp @@ -809,7 +809,8 @@ IMPLEMENT_FUNCTION(12, Chapters, chapter2Handler) if (!getProgress().isTrainRunning) break; - UPDATE_PARAM(params->param2, getState()->timeTicks, params->param1); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, params->param1)) + break; getSound()->playLocomotiveSound(); diff --git a/engines/lastexpress/entities/cooks.cpp b/engines/lastexpress/entities/cooks.cpp index 63494e6062..a3fb69aeb9 100644 --- a/engines/lastexpress/entities/cooks.cpp +++ b/engines/lastexpress/entities/cooks.cpp @@ -260,7 +260,8 @@ IMPLEMENT_FUNCTION(6, Cooks, chapter1Handler) break; case kActionNone: - UPDATE_PARAM(params->param4, getState()->time, params->param2); + if (!Entity::updateParameter(params->param4, getState()->time, params->param2)) + break; // Broken plate sound getSound()->playSound(kEntityPlayer, "LIB122", getSound()->getSoundFlag(kEntityCooks)); @@ -373,7 +374,8 @@ IMPLEMENT_FUNCTION(9, Cooks, chapter2Handler) break; case kActionNone: - UPDATE_PARAM(params->param3, getState()->time, params->param1); + if (!Entity::updateParameter(params->param3, getState()->time, params->param1)) + break; // Broken plate sound getSound()->playSound(kEntityPlayer, "LIB122", getSound()->getSoundFlag(kEntityCooks)); @@ -524,7 +526,8 @@ IMPLEMENT_FUNCTION(13, Cooks, chapter4Handler) break; case kActionNone: - UPDATE_PARAM(params->param3, getState()->time, params->param1) + if (!Entity::updateParameter(params->param3, getState()->time, params->param1)) + break; // Broken plate sound getSound()->playSound(kEntityPlayer, "LIB122", getSound()->getSoundFlag(kEntityCooks)); diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index e79d4cdff7..c589b8f0f8 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -356,7 +356,8 @@ IMPLEMENT_FUNCTION_I(10, Coudert, updateFromTime, uint32) case kActionNone: Entity::savegameBloodJacket(); - UPDATE_PARAM(params->param2, getState()->time, params->param1); + if (!Entity::updateParameter(params->param2, getState()->time, params->param1)) + break; callbackAction(); break; @@ -379,7 +380,8 @@ IMPLEMENT_FUNCTION_I(11, Coudert, updateFromTicks, uint32) case kActionNone: Entity::savegameBloodJacket(); - UPDATE_PARAM(params->param2, getState()->timeTicks, params->param1); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, params->param1)) + break; callbackAction(); break; @@ -476,7 +478,8 @@ IMPLEMENT_FUNCTION_II(13, Coudert, function13, bool, EntityIndex) } } - UPDATE_PARAM(params->param5, getState()->timeTicks, 225); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 225)) + break; getData()->inventoryItem = kItemNone; setCallback(5); @@ -909,7 +912,8 @@ IMPLEMENT_FUNCTION_II(20, Coudert, function20, ObjectIndex, ObjectIndex) getSound()->playSound(kEntityPlayer, "ZFX1004", getSound()->getSoundFlag(kEntityCoudert)); UPDATE_PARAM_PROC_END - UPDATE_PARAM(CURRENT_PARAM(1, 4), getState()->time, 900); + if (!Entity::updateParameter(CURRENT_PARAM(1, 4), getState()->time, 900)) + break; getObjects()->updateLocation2((ObjectIndex)params->param1, kObjectLocation1); @@ -988,7 +992,8 @@ IMPLEMENT_FUNCTION(21, Coudert, function21) case kActionNone: if (!params->param1) { - UPDATE_PARAM(params->param2, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, 75)) + break; setCallback(3); setup_enterExitCompartment("627Zh", kObjectCompartmentH); @@ -1089,7 +1094,8 @@ IMPLEMENT_FUNCTION(22, Coudert, function22) case kActionNone: if (!params->param1) { - UPDATE_PARAM(params->param2, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, 75)) + break; setCallback(3); setup_enterExitCompartment("627Rg", kObjectCompartmentG); @@ -1300,7 +1306,8 @@ IMPLEMENT_FUNCTION(26, Coudert, function26) case kActionNone: if (params->param1) { - UPDATE_PARAM(params->param2, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, 75)) + break; setCallback(3); setup_enterExitCompartment2("627Zd", kObjectCompartmentD, kPosition_5790, kPosition_6130); @@ -1391,7 +1398,8 @@ IMPLEMENT_FUNCTION(27, Coudert, function27) case kActionNone: if (!params->param1) { - UPDATE_PARAM(params->param2, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, 75)) + break; setCallback(3); setup_enterExitCompartment2("627Rc", kObjectCompartmentC, kPosition_6470, kPosition_6130); @@ -1891,7 +1899,8 @@ IMPLEMENT_FUNCTION_I(35, Coudert, function35, bool) getScenes()->loadSceneFromPosition(kCarRestaurant, 65); } - UPDATE_PARAM(params->param2, getState()->time, 2700); + if (!Entity::updateParameter(params->param2, getState()->time, 2700)) + break; getSavePoints()->push(kEntityCoudert, kEntityMax, kActionMaxFreeFromCage); @@ -3558,7 +3567,8 @@ label_callback_5: label_callback_6: if (getState()->time > kTime2538000 && !ENTITY_PARAM(0, 1) && !ENTITY_PARAM(2, 1)) { - UPDATE_PARAM(params->param7, getState()->time, 2700); + if (!Entity::updateParameter(params->param7, getState()->time, 2700)) + break; ENTITY_PARAM(0, 2) = 0; ENTITY_PARAM(0, 1) = 1; @@ -4023,7 +4033,8 @@ IMPLEMENT_FUNCTION(62, Coudert, function62) case kActionNone: if (params->param1) { - UPDATE_PARAM(params->param4, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 1; diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 43f039df43..1989c4607b 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -346,7 +346,9 @@ void Entity::updateFromTicks(const SavePoint &savepoint) { break; case kActionNone: - UPDATE_PARAM(params->param2, getState()->timeTicks, params->param1) + if (Entity::updateParameter(params->param2, getState()->timeTicks, params->param1)) + break; + callbackAction(); break; } @@ -360,7 +362,9 @@ void Entity::updateFromTime(const SavePoint &savepoint) { break; case kActionNone: - UPDATE_PARAM(params->param2, getState()->time, params->param1) + if (Entity::updateParameter(params->param2, getState()->time, params->param1)) + break; + callbackAction(); break; } @@ -597,6 +601,18 @@ void Entity::callbackAction() { // Helper functions ////////////////////////////////////////////////////////////////////////// +bool Entity::updateParameter(uint ¶meter, uint timeValue, uint delta) { + if (!parameter) + parameter = (uint)(timeValue + delta); + + if (parameter >= timeValue) + return false; + + parameter = kTimeInvalid; + + return true; +} + void Entity::timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action) { if (getState()->time > timeValue && !parameter) { parameter = 1; diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 3370659c6e..139f8ec418 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -870,6 +870,8 @@ protected: // Helper functions ////////////////////////////////////////////////////////////////////////// + bool updateParameter(uint ¶meter, uint time, uint delta); + void timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action); void timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex index, ObjectLocation location); bool timeCheckCallbackAction(TimeValue timeValue, uint ¶meter); diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 15a0a37c2f..23f5e49120 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -361,13 +361,6 @@ void class::setup_##name() { \ ////////////////////////////////////////////////////////////////////////// // Param update ////////////////////////////////////////////////////////////////////////// -#define UPDATE_PARAM(parameter, type, value) { \ - if (!parameter) \ - parameter = (uint)(type + value); \ - if (parameter >= type) \ - break; \ - parameter = kTimeInvalid; \ -} // Todo: replace with UPDATE_PARAM_PROC as appropriate #define UPDATE_PARAM_GOTO(parameter, type, value, label) { \ diff --git a/engines/lastexpress/entities/gendarmes.cpp b/engines/lastexpress/entities/gendarmes.cpp index fe9f6f0aa5..22697b396c 100644 --- a/engines/lastexpress/entities/gendarmes.cpp +++ b/engines/lastexpress/entities/gendarmes.cpp @@ -266,7 +266,8 @@ IMPLEMENT_FUNCTION_III(10, Gendarmes, function10, CarIndex, EntityPosition, Obje getSound()->playSound(kEntityGendarmes, "POL1046A", kFlagDefault); } - UPDATE_PARAM(params->param7, getState()->timeTicks, 300); + if (!Entity::updateParameter(params->param7, getState()->timeTicks, 300)) + break; if (!params->param4 && getEntities()->isOutsideAlexeiWindow()) { getObjects()->update((ObjectIndex)params->param3, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); diff --git a/engines/lastexpress/entities/hadija.cpp b/engines/lastexpress/entities/hadija.cpp index 4e72ce56f1..62badc46a6 100644 --- a/engines/lastexpress/entities/hadija.cpp +++ b/engines/lastexpress/entities/hadija.cpp @@ -466,7 +466,9 @@ IMPLEMENT_FUNCTION(22, Hadija, function22) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->time, 2700); + if (!Entity::updateParameter(params->param1, getState()->time, 2700)) + break; + setup_function23(); break; diff --git a/engines/lastexpress/entities/kahina.cpp b/engines/lastexpress/entities/kahina.cpp index 6bb2e6b90a..2124de1687 100644 --- a/engines/lastexpress/entities/kahina.cpp +++ b/engines/lastexpress/entities/kahina.cpp @@ -794,7 +794,8 @@ label_callback_2: if (getEvent(kEventKahinaAskSpeakFirebird) && !getEvent(kEventKronosConversationFirebird) && getEntities()->isInsideTrainCar(kEntityPlayer, kCarKronos)) { - UPDATE_PARAM(params->param4, getState()->time, 900); + if (!Entity::updateParameter(params->param4, getState()->time, 900)) + break; setCallback(3); setup_savegame(kSavegameTypeEvent, kEventKronosConversationFirebird); diff --git a/engines/lastexpress/entities/mahmud.cpp b/engines/lastexpress/entities/mahmud.cpp index ebe754bfa4..1e7df5c870 100644 --- a/engines/lastexpress/entities/mahmud.cpp +++ b/engines/lastexpress/entities/mahmud.cpp @@ -84,7 +84,8 @@ IMPLEMENT_FUNCTION_SIII(4, Mahmud, enterExitCompartment2, ObjectIndex, uint32, O break; case kActionNone: - UPDATE_PARAM(params->param7, getState()->timeTicks, params->param5); + if (!Entity::updateParameter(params->param7, getState()->timeTicks, params->param5)) + break; if (!getScenes()->checkPosition(kSceneNone, SceneManager::kCheckPositionLookingUp)) getScenes()->loadSceneFromObject((ObjectIndex)params->param6, true); @@ -144,7 +145,8 @@ IMPLEMENT_FUNCTION_II(10, Mahmud, function10, ObjectIndex, bool) break; case kActionNone: - UPDATE_PARAM(params->param6, getState()->time, 13500); + if (!Entity::updateParameter(params->param6, getState()->time, 13500)) + break; getObjects()->update(kObjectCompartment5, kEntityTrain, kObjectLocation3, kCursorHandKnock, kCursorHand); getObjects()->update(kObjectCompartment6, kEntityTrain, kObjectLocation3, kCursorHandKnock, kCursorHand); @@ -570,7 +572,8 @@ IMPLEMENT_FUNCTION(14, Mahmud, chaptersHandler) } if (params->param5) { - UPDATE_PARAM(params->param8, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param8, getState()->timeTicks, 75)) + break; params->param4 = 1; params->param5 = 0; diff --git a/engines/lastexpress/entities/max.cpp b/engines/lastexpress/entities/max.cpp index cecfe64dc6..5c43346cde 100644 --- a/engines/lastexpress/entities/max.cpp +++ b/engines/lastexpress/entities/max.cpp @@ -89,7 +89,8 @@ IMPLEMENT_FUNCTION(6, Max, chapter12_handler) break; case kActionNone: - UPDATE_PARAM(params->param2, getState()->time, params->param1); + if (!Entity::updateParameter(params->param2, getState()->time, params->param1)) + break; if (!getSoundQueue()->isBuffered(kEntityMax)) getSound()->playSound(kEntityMax, "Max1122"); @@ -123,7 +124,8 @@ IMPLEMENT_FUNCTION(7, Max, function7) break; case kActionNone: - UPDATE_PARAM(params->param2, getState()->time, params->param1) + if (!Entity::updateParameter(params->param2, getState()->time, params->param1)) + break; if (!getSoundQueue()->isBuffered(kEntityMax)) getSound()->playSound(kEntityMax, "Max1122"); @@ -212,7 +214,8 @@ IMPLEMENT_FUNCTION(8, Max, chapter4Handler) break; case kActionNone: - UPDATE_PARAM(params->param3, getState()->time, params->param2); + if (!Entity::updateParameter(params->param3, getState()->time, params->param2)) + break; if (!getSoundQueue()->isBuffered(kEntityMax)) getSound()->playSound(kEntityMax, "Max3101"); @@ -390,7 +393,8 @@ IMPLEMENT_FUNCTION(13, Max, chapter3Handler) break; } - UPDATE_PARAM(params->param3, getState()->time, params->param1); + if (!Entity::updateParameter(params->param3, getState()->time, params->param1)) + break; if (!getSoundQueue()->isBuffered(kEntityMax)) getSound()->playSound(kEntityMax, "Max1122"); @@ -512,7 +516,8 @@ IMPLEMENT_FUNCTION(15, Max, function15) } if (!params->param1) { - UPDATE_PARAM(params->param3, getState()->time, 900); + if (!Entity::updateParameter(params->param3, getState()->time, 900)) + break; getSavePoints()->push(kEntityMax, kEntityCoudert, kAction157026693); } diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index 37e7bf5ca6..c093ac4b30 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -464,7 +464,8 @@ IMPLEMENT_FUNCTION_I(11, Mertens, function11, uint32) case kActionNone: Entity::savegameBloodJacket(); - UPDATE_PARAM(params->param2, getState()->time, params->param1) + if (!Entity::updateParameter(params->param2, getState()->time, params->param1)) + break; callbackAction(); break; @@ -1062,7 +1063,8 @@ IMPLEMENT_FUNCTION_II(21, Mertens, function21, ObjectIndex, ObjectIndex) getSound()->playSound(kEntityPlayer, "ZFX1004", getSound()->getSoundFlag(kEntityMertens)); UPDATE_PARAM_PROC_END - UPDATE_PARAM(CURRENT_PARAM(1, 5), getState()->time, 900); + if (!Entity::updateParameter(CURRENT_PARAM(1, 5), getState()->time, 900)) + break; // Update objects getObjects()->updateLocation2((ObjectIndex)params->param1, kObjectLocation1); @@ -1286,7 +1288,8 @@ IMPLEMENT_FUNCTION(24, Mertens, function24) case kActionNone: if (!params->param1) { - UPDATE_PARAM(params->param2, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, 75)) + break; setCallback(3); setup_enterExitCompartment3("601Rc", kObjectCompartment3, kPosition_6470, kPosition_6130); @@ -1389,7 +1392,8 @@ IMPLEMENT_FUNCTION(25, Mertens, function25) case kActionNone: if (!params->param1) { - UPDATE_PARAM(params->param2, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, 75)) + break; setCallback(3); setup_enterExitCompartment3("601Zb", kObjectCompartment2, kPosition_7500, kPositionNone); @@ -1626,7 +1630,8 @@ label_callback10: if (params->param3 >= getState()->timeTicks) { label_callback11: - UPDATE_PARAM(params->param4, getState()->timeTicks, 375); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, 375)) + break; getSound()->playSound(kEntityPlayer, "LIB033"); @@ -3736,7 +3741,8 @@ label_callback_7: label_callback_8: if (getState()->time > kTime2538000 && !ENTITY_PARAM(0, 1) && !ENTITY_PARAM(2, 1)) { - UPDATE_PARAM(params->param6, getState()->time, 2700); + if (!Entity::updateParameter(params->param6, getState()->time, 2700)) + break; getEntities()->drawSequenceLeft(kEntityMertens, "601E"); @@ -3990,7 +3996,8 @@ IMPLEMENT_FUNCTION(53, Mertens, function53) case kActionNone: if (params->param1) { - UPDATE_PARAM(params->param4, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 0; diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp index c33a8b887e..8ebb23b024 100644 --- a/engines/lastexpress/entities/milos.cpp +++ b/engines/lastexpress/entities/milos.cpp @@ -434,7 +434,8 @@ IMPLEMENT_FUNCTION(14, Milos, function14) if (CURRENT_PARAM(1, 1) < getState()->timeTicks) { if (getObjects()->get(kObjectCompartment1).location == kObjectLocation1) { - UPDATE_PARAM(CURRENT_PARAM(1, 2), getState()->timeTicks, 75); + if (!Entity::updateParameter(CURRENT_PARAM(1, 2), getState()->timeTicks, 75)) + break; getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal); @@ -505,7 +506,8 @@ IMPLEMENT_FUNCTION(14, Milos, function14) } label_callback_12: - UPDATE_PARAM(CURRENT_PARAM(1, 4), getState()->timeTicks, 75); + if (!Entity::updateParameter(CURRENT_PARAM(1, 4), getState()->timeTicks, 75)) + break; getEntities()->exitCompartment(kEntityMilos, kObjectCompartment1, true); @@ -736,7 +738,8 @@ IMPLEMENT_FUNCTION(15, Milos, chapter1Handler) } if (getEntities()->isPlayerPosition(kCarRestaurant, 70) && !params->param2) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 45); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 45)) + break; setCallback(2); setup_draw("009C"); @@ -951,7 +954,8 @@ IMPLEMENT_FUNCTION(21, Milos, function21) break; case kActionNone: - UPDATE_PARAM(params->param2, getState()->time, 4500); + if (!Entity::updateParameter(params->param2, getState()->time, 4500)) + break; params->param1 = 1; break; @@ -1116,7 +1120,8 @@ IMPLEMENT_FUNCTION(24, Milos, function24) } if (params->param1) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 1; @@ -1289,7 +1294,8 @@ IMPLEMENT_FUNCTION(25, Milos, function25) } if (params->param1) { - UPDATE_PARAM(params->param4, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 1; diff --git a/engines/lastexpress/entities/mmeboutarel.cpp b/engines/lastexpress/entities/mmeboutarel.cpp index ace8637556..323e686ec3 100644 --- a/engines/lastexpress/entities/mmeboutarel.cpp +++ b/engines/lastexpress/entities/mmeboutarel.cpp @@ -427,7 +427,8 @@ label_callback_1: TIME_CHECK(kTime1094400, params->param8, setup_function14); if (params->param4) { - UPDATE_PARAM(CURRENT_PARAM(1, 1), getState()->timeTicks, 75); + if (!Entity::updateParameter(CURRENT_PARAM(1, 1), getState()->timeTicks, 75)) + break; params->param3 = 1; params->param4 = 0; @@ -587,7 +588,8 @@ IMPLEMENT_FUNCTION(15, MmeBoutarel, function15) label_callback_5: if (params->param2) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) + break; params->param1 = 1; params->param2 = 0; @@ -1016,7 +1018,8 @@ IMPLEMENT_FUNCTION(23, MmeBoutarel, chapter4Handler) case kActionNone: if (params->param1) { - UPDATE_PARAM(params->param2, getState()->time, 900); + if (!Entity::updateParameter(params->param2, getState()->time, 900)) + break; getObjects()->update(kObjectCompartmentD, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue); @@ -1065,7 +1068,8 @@ IMPLEMENT_FUNCTION(24, MmeBoutarel, function24) TIME_CHECK(kTime2470500, params->param4, setup_function25); if (params->param2) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) + break; params->param1 = 1; params->param2 = 0; @@ -1208,7 +1212,8 @@ IMPLEMENT_FUNCTION(28, MmeBoutarel, function28) case kActionNone: if (params->param1) { - UPDATE_PARAM(params->param3, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 1; diff --git a/engines/lastexpress/entities/pascale.cpp b/engines/lastexpress/entities/pascale.cpp index 6620634ade..e74cf3490f 100644 --- a/engines/lastexpress/entities/pascale.cpp +++ b/engines/lastexpress/entities/pascale.cpp @@ -1126,7 +1126,8 @@ IMPLEMENT_FUNCTION(33, Pascale, function33) label_callback1: if (params->param1) { - UPDATE_PARAM(params->param6, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param6, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 2; diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index 3ef266994f..a890ebf258 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -708,7 +708,9 @@ label_callback_4: label_callback_5: if (params->param2) { - UPDATE_PARAM(params->param6, getState()->timeTicks, 90); + if (!Entity::updateParameter(params->param6, getState()->timeTicks, 90)) + break; + getScenes()->loadSceneFromPosition(kCarRestaurant, 55); } else { params->param6 = 0; @@ -966,7 +968,8 @@ IMPLEMENT_FUNCTION(26, Rebecca, function26) TIME_CHECK_CALLBACK_3(kTime1224000, params->param2, 1, setup_updatePosition, "118H", kCarRestaurant, 52); if (params->param1) { - UPDATE_PARAM(params->param3, getState()->timeTicks, 90); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, 90)) + break; getScenes()->loadSceneFromPosition(kCarRestaurant, 51); } @@ -1753,7 +1756,8 @@ IMPLEMENT_FUNCTION(48, Rebecca, function48) case kActionNone: if (params->param1) { - UPDATE_PARAM(params->param3, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, 75)) + break; params->param1 = 0; params->param2 = 1; diff --git a/engines/lastexpress/entities/salko.cpp b/engines/lastexpress/entities/salko.cpp index 70a26b515a..b799564b46 100644 --- a/engines/lastexpress/entities/salko.cpp +++ b/engines/lastexpress/entities/salko.cpp @@ -299,7 +299,8 @@ IMPLEMENT_FUNCTION(15, Salko, chapter3Handler) case kActionNone: if (getState()->time < kTime2200500) { - UPDATE_PARAM(params->param1, getState()->time, 81000); + if (!Entity::updateParameter(params->param1, getState()->time, 81000)) + break; setCallback(1); setup_function16(); @@ -329,7 +330,8 @@ IMPLEMENT_FUNCTION(16, Salko, function16) } label_callback3: - UPDATE_PARAM(params->param1, getState()->time, 4500); + if (!Entity::updateParameter(params->param1, getState()->time, 4500)) + break; getSavePoints()->push(kEntitySalko, kEntitySalko, kAction101169464); break; diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp index b15a0a18b2..76068aad24 100644 --- a/engines/lastexpress/entities/tatiana.cpp +++ b/engines/lastexpress/entities/tatiana.cpp @@ -249,7 +249,8 @@ IMPLEMENT_FUNCTION_I(16, Tatiana, function16, uint32) } if (params->param2) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) + break; params->param2 = 0; params->param3 = 1; @@ -443,7 +444,9 @@ label_tatiana_chapter1_2: Entity::timeCheckSavepoint(kTime1084500, params->param7, kEntityTatiana, kEntityPascale, kAction257489762); if (params->param1) { - UPDATE_PARAM(params->param8, getState()->timeTicks, 90); + if (!Entity::updateParameter(params->param8, getState()->timeTicks, 90)) + break; + getScenes()->loadSceneFromPosition(kCarRestaurant, 65); } else { params->param8 = 0; @@ -1292,7 +1295,8 @@ IMPLEMENT_FUNCTION(37, Tatiana, function37) } if (params->param1) { - UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) + break; getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); @@ -1401,7 +1405,8 @@ IMPLEMENT_FUNCTION(38, Tatiana, function38) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->time, 450); + if (!Entity::updateParameter(params->param1, getState()->time, 450)) + break; getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentF, true); @@ -2197,7 +2202,8 @@ IMPLEMENT_FUNCTION(54, Tatiana, function54) } if (params->param1 > 3) { - UPDATE_PARAM(params->param3, getState()->timeTicks, 225); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, 225)) + break; params->param1 = 0; params->param3 = 0; diff --git a/engines/lastexpress/entities/vassili.cpp b/engines/lastexpress/entities/vassili.cpp index 5079fdb252..6504df7928 100644 --- a/engines/lastexpress/entities/vassili.cpp +++ b/engines/lastexpress/entities/vassili.cpp @@ -400,7 +400,8 @@ IMPLEMENT_FUNCTION(13, Vassili, sleeping) case kActionNone: if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_8200)) { - UPDATE_PARAM(params->param3, getState()->timeTicks, params->param1); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, params->param1)) + break; setCallback(1); setup_draw("303B"); @@ -459,7 +460,8 @@ IMPLEMENT_FUNCTION(15, Vassili, stealEgg) case kActionNone: if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_8200)) { - UPDATE_PARAM(params->param3, getState()->timeTicks, params->param1); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, params->param1)) + break; setCallback(1); setup_draw("303B"); @@ -543,7 +545,8 @@ IMPLEMENT_FUNCTION(17, Vassili, chapter4Handler) case kActionNone: if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_8200)) { - UPDATE_PARAM(params->param3, getState()->timeTicks, params->param1); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, params->param1)) + break; setCallback(1); setup_draw("303B"); diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp index bdd758a5be..f459b6f8e7 100644 --- a/engines/lastexpress/entities/verges.cpp +++ b/engines/lastexpress/entities/verges.cpp @@ -244,7 +244,8 @@ IMPLEMENT_FUNCTION_IIS(10, Verges, function10, CarIndex, EntityPosition) } if (params->param6) { - UPDATE_PARAM(params->param8, getState()->timeTicks, 75); + if (!Entity::updateParameter(params->param8, getState()->timeTicks, 75)) + break; getSound()->playSound(kEntityVerges, (char *)¶ms->seq); diff --git a/engines/lastexpress/entities/vesna.cpp b/engines/lastexpress/entities/vesna.cpp index b0ee9bcbc1..6889be4335 100644 --- a/engines/lastexpress/entities/vesna.cpp +++ b/engines/lastexpress/entities/vesna.cpp @@ -162,7 +162,8 @@ IMPLEMENT_FUNCTION(11, Vesna, function11) case kActionNone: if (parameters->param3) { - UPDATE_PARAM(parameters->param7, getState()->timeTicks, 75); + if (!Entity::updateParameter(parameters->param7, getState()->timeTicks, 75)) + break; parameters->param2 = 1; parameters->param3 = 0; @@ -511,7 +512,8 @@ IMPLEMENT_FUNCTION(20, Vesna, chapter3Handler) } if (parameters->param2) { - UPDATE_PARAM(parameters->param8, getState()->timeTicks, 75); + if (!Entity::updateParameter(parameters->param8, getState()->timeTicks, 75)) + break; parameters->param1 = 1; parameters->param2 = 0; @@ -1086,7 +1088,8 @@ IMPLEMENT_FUNCTION(30, Vesna, function30) UPDATE_PARAM_PROC_END } - UPDATE_PARAM(params->param4, getState()->timeTicks, 180); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, 180)) + break; setCallback(1); setup_savegame(kSavegameTypeEvent, kEventCathVesnaTrainTopKilled); diff --git a/engines/lastexpress/entities/yasmin.cpp b/engines/lastexpress/entities/yasmin.cpp index 6fb1936303..f2b4d2edd1 100644 --- a/engines/lastexpress/entities/yasmin.cpp +++ b/engines/lastexpress/entities/yasmin.cpp @@ -445,7 +445,9 @@ IMPLEMENT_FUNCTION(20, Yasmin, function20) break; case kActionNone: - UPDATE_PARAM(params->param1, getState()->time, 2700); + if (!Entity::updateParameter(params->param1, getState()->time, 2700)) + break; + setup_function21(); break; -- cgit v1.2.3 From e13290a0286e86ee5c76f62ad74cb945a22cb38d Mon Sep 17 00:00:00 2001 From: Julien Date: Sun, 22 Jul 2012 22:43:11 -0400 Subject: LASTEXPRESS: Replace UPDATE_PARAM_CHECK macro --- engines/lastexpress/entities/alexei.cpp | 4 ++-- engines/lastexpress/entities/entity.cpp | 10 ++++++++++ engines/lastexpress/entities/entity.h | 1 + engines/lastexpress/entities/entity_intern.h | 6 ------ engines/lastexpress/entities/rebecca.cpp | 2 +- engines/lastexpress/entities/tatiana.cpp | 2 +- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp index c77b103f4d..a2564dd924 100644 --- a/engines/lastexpress/entities/alexei.cpp +++ b/engines/lastexpress/entities/alexei.cpp @@ -251,7 +251,7 @@ IMPLEMENT_FUNCTION(15, Alexei, function15) break; case kActionNone: - UPDATE_PARAM_CHECK(params->param2, getState()->time, params->param1) + if (Entity::updateParameterCheck(params->param2, getState()->time, params->param1)) { if (getEntities()->isSomebodyInsideRestaurantOrSalon()) { getData()->location = kLocationOutsideCompartment; @@ -689,7 +689,7 @@ IMPLEMENT_FUNCTION(21, Alexei, function21) break; case kActionNone: - UPDATE_PARAM_CHECK(params->param2, getState()->time, params->param1) + if (Entity::updateParameterCheck(params->param2, getState()->time, params->param1)) { getData()->location = kLocationOutsideCompartment; getData()->inventoryItem = kItemNone; diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 1989c4607b..664b3fa70b 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -613,6 +613,16 @@ bool Entity::updateParameter(uint ¶meter, uint timeValue, uint delta) { return true; } +bool Entity::updateParameterCheck(uint ¶meter, uint timeValue, uint delta) { + if (parameter && parameter >= timeValue) + return false; + + if (!parameter) + parameter = (uint)(timeValue + delta); + + return true; +} + void Entity::timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action) { if (getState()->time > timeValue && !parameter) { parameter = 1; diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 139f8ec418..ce8aa168a4 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -871,6 +871,7 @@ protected: ////////////////////////////////////////////////////////////////////////// bool updateParameter(uint ¶meter, uint time, uint delta); + bool updateParameterCheck(uint ¶meter, uint time, uint delta); void timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action); void timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex index, ObjectLocation location); diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 23f5e49120..4b97556a75 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -388,12 +388,6 @@ void class::setup_##name() { \ #define UPDATE_PARAM_PROC_END } -// Updating parameter with an added check (and code inside the check) -#define UPDATE_PARAM_CHECK(parameter, type, value) \ - if (!parameter || parameter < type) { \ - if (!parameter) \ - parameter = (uint)(type + value); - } // End of namespace LastExpress #endif // LASTEXPRESS_ENTITY_INTERN_H diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index a890ebf258..96deaaf97f 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -697,7 +697,7 @@ IMPLEMENT_FUNCTION(22, Rebecca, chapter1Handler) if (params->param4 >= getState()->time) { label_callback_4: if (params->param1) { - UPDATE_PARAM_CHECK(params->param5, getState()->time, 900) + if (Entity::updateParameterCheck(params->param5, getState()->time, 900)) { if (getEntities()->isInSalon(kEntityPlayer)) { setCallback(5); setup_playSound("REB1013"); diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp index 76068aad24..9c2c582130 100644 --- a/engines/lastexpress/entities/tatiana.cpp +++ b/engines/lastexpress/entities/tatiana.cpp @@ -1023,7 +1023,7 @@ IMPLEMENT_FUNCTION(32, Tatiana, chapter3Handler) } if (parameters->param4 && parameters->param5) { - UPDATE_PARAM_CHECK(parameters->param4, getState()->time, 6300) + if (Entity::updateParameterCheck(parameters->param4, getState()->time, 6300)) { if (getEntities()->isSomebodyInsideRestaurantOrSalon()) { getData()->location = kLocationOutsideCompartment; -- cgit v1.2.3 From 8de4cb654782107100aaa3063cac79460546ed67 Mon Sep 17 00:00:00 2001 From: Julien Date: Mon, 23 Jul 2012 01:15:20 -0400 Subject: LASTEXPRESS: Replace UPDATE_PARAM_PROC and UPDATE_PARAM_PROC_TIME macros --- engines/lastexpress/entities/abbot.cpp | 4 ++-- engines/lastexpress/entities/alexei.cpp | 12 +++++------ engines/lastexpress/entities/anna.cpp | 32 ++++++++++++++-------------- engines/lastexpress/entities/august.cpp | 20 ++++++++--------- engines/lastexpress/entities/boutarel.cpp | 8 +++---- engines/lastexpress/entities/chapters.cpp | 20 ++++++++--------- engines/lastexpress/entities/cooks.cpp | 4 ++-- engines/lastexpress/entities/coudert.cpp | 12 +++++------ engines/lastexpress/entities/entity.cpp | 26 ++++++++++++++++------ engines/lastexpress/entities/entity.h | 5 +++-- engines/lastexpress/entities/entity_intern.h | 17 --------------- engines/lastexpress/entities/francois.cpp | 8 +++---- engines/lastexpress/entities/kahina.cpp | 24 ++++++++++----------- engines/lastexpress/entities/kronos.cpp | 8 +++---- engines/lastexpress/entities/mertens.cpp | 20 ++++++++--------- engines/lastexpress/entities/milos.cpp | 16 +++++++------- engines/lastexpress/entities/mmeboutarel.cpp | 8 +++---- engines/lastexpress/entities/pascale.cpp | 4 ++-- engines/lastexpress/entities/rebecca.cpp | 4 ++-- engines/lastexpress/entities/servers0.cpp | 12 +++++------ engines/lastexpress/entities/servers1.cpp | 4 ++-- engines/lastexpress/entities/tatiana.cpp | 20 ++++++++--------- engines/lastexpress/entities/vesna.cpp | 4 ++-- 23 files changed, 145 insertions(+), 147 deletions(-) diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp index c224b57abc..7916f88662 100644 --- a/engines/lastexpress/entities/abbot.cpp +++ b/engines/lastexpress/entities/abbot.cpp @@ -1650,12 +1650,12 @@ IMPLEMENT_FUNCTION(48, Abbot, function48) if (ENTITY_PARAM(0, 1)) getData()->inventoryItem = kItemInvalid; - UPDATE_PARAM_PROC(params->param1, getState()->time, 1800) + if (Entity::updateParameter(params->param1, getState()->time, 1800)) { getData()->inventoryItem = kItemNone; setCallback(4); setup_updatePosition("126C", kCarRedSleeping, 52); - UPDATE_PARAM_PROC_END + } TIME_CHECK_CALLBACK_INVENTORY(kTime2533500, params->param2, 5, setup_callbackActionRestaurantOrSalon); break; diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp index a2564dd924..b31a9956bc 100644 --- a/engines/lastexpress/entities/alexei.cpp +++ b/engines/lastexpress/entities/alexei.cpp @@ -751,7 +751,7 @@ IMPLEMENT_FUNCTION(22, Alexei, function22) break; case kActionNone: - UPDATE_PARAM_PROC(params->param2, getState()->time, params->param2) + if (Entity::updateParameter(params->param2, getState()->time, params->param2)) { if (getEntities()->isSomebodyInsideRestaurantOrSalon()) { getData()->location = kLocationOutsideCompartment; getData()->inventoryItem = kItemNone; @@ -760,7 +760,7 @@ IMPLEMENT_FUNCTION(22, Alexei, function22) setup_updatePosition("103D", kCarRestaurant, 52); break; } - UPDATE_PARAM_PROC_END + } if (params->param3 == kTimeInvalid || getState()->time <= kTime1111500) break; @@ -1333,22 +1333,22 @@ IMPLEMENT_FUNCTION(35, Alexei, function35) case kActionNone: if (getEntities()->isInSalon(kEntityPlayer)) { - UPDATE_PARAM_PROC(params->param2, getState()->time, 2700) + if (Entity::updateParameter(params->param2, getState()->time, 2700)) { setCallback(1); setup_callbackActionRestaurantOrSalon(); break; - UPDATE_PARAM_PROC_END + } } else { params->param2 = 0; } - UPDATE_PARAM_PROC(params->param3, getState()->time, params->param1) + if (Entity::updateParameter(params->param3, getState()->time, params->param1)) { if (getEntities()->isSomebodyInsideRestaurantOrSalon()) { setCallback(3); setup_function15(); break; } - UPDATE_PARAM_PROC_END + } label_callback_3: if (!Entity::updateParameter(params->param4, getState()->time, 9000)) diff --git a/engines/lastexpress/entities/anna.cpp b/engines/lastexpress/entities/anna.cpp index 80a5144bbe..ab7163a67c 100644 --- a/engines/lastexpress/entities/anna.cpp +++ b/engines/lastexpress/entities/anna.cpp @@ -198,12 +198,12 @@ IMPLEMENT_FUNCTION(12, Anna, function12) params->param2 = 1; if (params->param6) { - UPDATE_PARAM_PROC(params->param7, getState()->timeTicks, 75) + if (Entity::updateParameter(params->param7, getState()->timeTicks, 75)) { getSavePoints()->push(kEntityAnna, kEntityAnna, kActionEndSound); params->param6 = 0; params->param7 = 0; - UPDATE_PARAM_PROC_END + } } if (params->param4) { @@ -669,11 +669,11 @@ IMPLEMENT_FUNCTION_I(18, Anna, function18, TimeValue) } if (params->param5 && !params->param4) { - UPDATE_PARAM_PROC(params->param6, getState()->time, 900) + if (Entity::updateParameter(params->param6, getState()->time, 900)) { params->param2 |= kItemScarf; params->param5 = 0; params->param6 = 0; - UPDATE_PARAM_PROC_END + } } if (params->param3) { @@ -1152,11 +1152,11 @@ IMPLEMENT_FUNCTION(29, Anna, function29) case kActionNone: if (params->param2) { - UPDATE_PARAM_PROC(params->param3, getState()->time, 900) + if (Entity::updateParameter(params->param3, getState()->time, 900)) { getData()->inventoryItem = (InventoryItem)(getData()->inventoryItem | kItemScarf); params->param2 = 0; params->param3 = 0; - UPDATE_PARAM_PROC_END + } } if (params->param1) { @@ -1415,11 +1415,11 @@ IMPLEMENT_FUNCTION(34, Anna, function34) case kActionNone: if (!params->param1 && getEntities()->isPlayerPosition(kCarRedSleeping, 60)) { - UPDATE_PARAM_PROC(params->param2, getState()->time, 150) + if (Entity::updateParameter(params->param2, getState()->time, 150)) { setCallback(1); setup_draw("419B"); break; - UPDATE_PARAM_PROC_END + } } label_callback_1: @@ -2098,11 +2098,11 @@ IMPLEMENT_FUNCTION(48, Anna, function48) break; if (params->param3 != kTimeInvalid && getState()->time > kTime1969200) { - UPDATE_PARAM_PROC_TIME(kTime1983600, (!getEntities()->isInRestaurant(kEntityPlayer) || getSoundQueue()->isBuffered(kEntityBoutarel)), params->param3, 150) + if (Entity::updateParameterTime(kTime1983600, (!getEntities()->isInRestaurant(kEntityPlayer) || getSoundQueue()->isBuffered(kEntityBoutarel)), params->param3, 150)) { setCallback(3); setup_playSound("Aug3007A"); break; - UPDATE_PARAM_PROC_END + } } label_callback_4: @@ -2392,18 +2392,18 @@ IMPLEMENT_FUNCTION(53, Anna, function53) case kActionNone: if (getProgress().field_48 && params->param5 != kTimeInvalid) { - UPDATE_PARAM_PROC_TIME(kTime2065500, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param5, 150) + if (Entity::updateParameterTime(kTime2065500, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param5, 150)) { setup_function54(); break; - UPDATE_PARAM_PROC_END + } } if (params->param3) { - UPDATE_PARAM_PROC(params->param6, getState()->time, 9000) + if (Entity::updateParameter(params->param6, getState()->time, 9000)) { params->param4 = !params->param4; getEntities()->drawSequenceLeft(kEntityAnna, params->param4 ? "417B" : "417A"); params->param6 = 0; - UPDATE_PARAM_PROC_END + } } if (params->param1) { @@ -2546,11 +2546,11 @@ IMPLEMENT_FUNCTION(54, Anna, function54) if (params->param3) { TIME_CHECK(kTime2079000, params->param5, setup_function55); - UPDATE_PARAM_PROC(params->param6, getState()->time, 9000) + if (Entity::updateParameter(params->param6, getState()->time, 9000)) { params->param4 = !params->param4; getEntities()->drawSequenceLeft(kEntityAnna, params->param4 ? "417B" : "417A"); params->param6 = 0; - UPDATE_PARAM_PROC_END + } } if (params->param1) { diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp index d874c666f7..5ae8d11b95 100644 --- a/engines/lastexpress/entities/august.cpp +++ b/engines/lastexpress/entities/august.cpp @@ -538,10 +538,10 @@ label_continue: break; if (params->param6) { - UPDATE_PARAM_PROC(CURRENT_PARAM(1, 1), getState()->time, 6300) + if (Entity::updateParameter(CURRENT_PARAM(1, 1), getState()->time, 6300)) { params->param6 = 0; CURRENT_PARAM(1, 1) = 0; - UPDATE_PARAM_PROC_END + } } if (!params->param4 @@ -804,7 +804,7 @@ IMPLEMENT_FUNCTION_I(23, August, function23, TimeValue) } label_callback_8: - UPDATE_PARAM_PROC(CURRENT_PARAM(1, 4), getState()->timeTicks, 75) + if (Entity::updateParameter(CURRENT_PARAM(1, 4), getState()->timeTicks, 75)) { getEntities()->exitCompartment(kEntityAugust, kObjectCompartment1, true); if (getProgress().eventCorpseMovedFromFloor) { @@ -820,7 +820,7 @@ label_callback_8: setup_savegame(kSavegameTypeEvent, kEventAugustFindCorpse); } break; - UPDATE_PARAM_PROC_END + } label_callback_9: if (params->param3 && params->param1 < getState()->time && !CURRENT_PARAM(1, 5)) { @@ -1634,9 +1634,9 @@ IMPLEMENT_FUNCTION(32, August, function32) break; case kActionNone: - UPDATE_PARAM_PROC_TIME(kTime1179000, (!getEntities()->isInSalon(kEntityAnna) || getEntities()->isInSalon(kEntityPlayer)), params->param6, 0); + if (Entity::updateParameterTime(kTime1179000, (!getEntities()->isInSalon(kEntityAnna) || getEntities()->isInSalon(kEntityPlayer)), params->param6, 0)) { getSavePoints()->push(kEntityAugust, kEntityAnna, kAction123712592); - UPDATE_PARAM_PROC_END + } if (params->param1 && getEntities()->isSomebodyInsideRestaurantOrSalon()) { if (!params->param4) { @@ -1645,13 +1645,13 @@ IMPLEMENT_FUNCTION(32, August, function32) } if (params->param7 != kTimeInvalid && params->param4 < getState()->time) { - UPDATE_PARAM_PROC_TIME(params->param5, getEntities()->isInSalon(kEntityPlayer), params->param7, 0); + if (Entity::updateParameterTime((TimeValue)params->param5, getEntities()->isInSalon(kEntityPlayer), params->param7, 0)) { getData()->location = kLocationOutsideCompartment; setCallback(5); setup_updatePosition("109D", kCarRestaurant, 56); break; - UPDATE_PARAM_PROC_END + } } } @@ -3224,9 +3224,9 @@ IMPLEMENT_FUNCTION(63, August, function63) break; case kActionNone: - UPDATE_PARAM_PROC(params->param3, getState()->time, 1800) + if (Entity::updateParameter(params->param3, getState()->time, 1800)) { getData()->inventoryItem = kItemInvalid; - UPDATE_PARAM_PROC_END + } if (getState()->time > kTime2488500 && !params->param4) { params->param4 = 1; diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp index ab8a0b9003..2a8c6603a4 100644 --- a/engines/lastexpress/entities/boutarel.cpp +++ b/engines/lastexpress/entities/boutarel.cpp @@ -646,11 +646,11 @@ IMPLEMENT_FUNCTION(20, Boutarel, function20) break; if (!params->param2) { - UPDATE_PARAM_PROC(params->param3, getState()->time, 4500) + if (Entity::updateParameter(params->param3, getState()->time, 4500)) { setCallback(3); setup_playSound("MRB1078A"); break; - UPDATE_PARAM_PROC_END + } } TIME_CHECK_CALLBACK_1(kTime1138500, params->param4, 4, setup_function14, false); @@ -936,9 +936,9 @@ IMPLEMENT_FUNCTION(29, Boutarel, function29) break; case kActionNone: - UPDATE_PARAM_PROC(params->param2, getState()->time, 450) + if (Entity::updateParameter(params->param2, getState()->time, 450)) { getSavePoints()->push(kEntityBoutarel, kEntityServers1, kAction256200848); - UPDATE_PARAM_PROC_END + } if (!params->param1) break; diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp index 76165800f2..c5631173b4 100644 --- a/engines/lastexpress/entities/chapters.cpp +++ b/engines/lastexpress/entities/chapters.cpp @@ -393,13 +393,13 @@ IMPLEMENT_FUNCTION(8, Chapters, chapter1Handler) if (!getProgress().isTrainRunning || getState()->time >= kTime1458000) goto label_processStations; - UPDATE_PARAM_PROC(params->param6, getState()->timeTicks, params->param2) + if (Entity::updateParameter(params->param6, getState()->timeTicks, params->param2)) { // Play sound FX getSound()->playLocomotiveSound(); params->param2 = 225 * (4 * rnd(5) + 20); params->param6 = 0; - UPDATE_PARAM_PROC_END + } label_processStations: // Process stations @@ -896,15 +896,15 @@ IMPLEMENT_FUNCTION(15, Chapters, chapter3Handler) case kActionNone: if (getProgress().isTrainRunning) { - UPDATE_PARAM_PROC(params->param4, getState()->timeTicks, params->param1) + if (Entity::updateParameter(params->param4, getState()->timeTicks, params->param1)) { getSound()->playLocomotiveSound(); params->param1 = 225 * (4 * rnd(5) + 20); params->param4 = 0; - UPDATE_PARAM_PROC_END + } } - UPDATE_PARAM_PROC(params->param5, getState()->timeTicks, params->param2) + if (Entity::updateParameter(params->param5, getState()->timeTicks, params->param2)) { switch (rnd(2)) { default: break; @@ -920,7 +920,7 @@ IMPLEMENT_FUNCTION(15, Chapters, chapter3Handler) params->param2 = 225 * (4 * rnd(6) + 8); params->param5 = 0; - UPDATE_PARAM_PROC_END + } TIME_CHECK_CALLBACK_2(kTimeEnterSalzbourg, params->param6, 1, setup_enterStation, "Salzburg", kCitySalzbourg); @@ -1195,15 +1195,15 @@ IMPLEMENT_FUNCTION(19, Chapters, chapter4Handler) case kActionNone: if (getProgress().isTrainRunning) { - UPDATE_PARAM_PROC(params->param6, getState()->timeTicks, params->param4); + if (Entity::updateParameter(params->param6, getState()->timeTicks, params->param4)) { getSound()->playLocomotiveSound(); params->param4 = 225 * (4 * rnd(5) + 20); params->param6 = 0; - UPDATE_PARAM_PROC_END + } } - UPDATE_PARAM_PROC(params->param7, getState()->timeTicks, params->param5) + if (Entity::updateParameter(params->param7, getState()->timeTicks, params->param5)) { switch (rnd(2)) { default: break; @@ -1219,7 +1219,7 @@ IMPLEMENT_FUNCTION(19, Chapters, chapter4Handler) params->param5 = 225 * (4 * rnd(6) + 8); params->param7 = 0; - UPDATE_PARAM_PROC_END + } TIME_CHECK_CALLBACK_2(kTimeEnterPoszony, params->param8, 1, setup_enterStation, "Pozsony", kCityPoszony); diff --git a/engines/lastexpress/entities/cooks.cpp b/engines/lastexpress/entities/cooks.cpp index a3fb69aeb9..62a1e0fdb6 100644 --- a/engines/lastexpress/entities/cooks.cpp +++ b/engines/lastexpress/entities/cooks.cpp @@ -434,12 +434,12 @@ IMPLEMENT_FUNCTION(11, Cooks, chapter3Handler) break; case kActionNone: - UPDATE_PARAM_PROC(params->param4, getState()->time, params->param2) + if (Entity::updateParameter(params->param4, getState()->time, params->param2)) { // Broken plate sound getSound()->playSound(kEntityPlayer, "LIB122", getSound()->getSoundFlag(kEntityCooks)); params->param2 = 225 * (4 * rnd(30) + 120); params->param4 = 0; - UPDATE_PARAM_PROC_END + } if (getState()->time > kTime2079000 && !params->param5) { params->param1 = 0; diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index c589b8f0f8..4458632f2d 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -908,9 +908,9 @@ IMPLEMENT_FUNCTION_II(20, Coudert, function20, ObjectIndex, ObjectIndex) break; case kActionNone: - UPDATE_PARAM_PROC(CURRENT_PARAM(1, 3), getState()->time, 300) + if (Entity::updateParameter(CURRENT_PARAM(1, 3), getState()->time, 300)) { getSound()->playSound(kEntityPlayer, "ZFX1004", getSound()->getSoundFlag(kEntityCoudert)); - UPDATE_PARAM_PROC_END + } if (!Entity::updateParameter(CURRENT_PARAM(1, 4), getState()->time, 900)) break; @@ -2281,14 +2281,14 @@ label_callback_9: label_callback_10: if (getState()->time > kTime1189800 && !ENTITY_PARAM(0, 1) && !ENTITY_PARAM(2, 1)) { - UPDATE_PARAM_PROC(params->param3, getState()->time, 2700); + if (Entity::updateParameter(params->param3, getState()->time, 2700)) { ENTITY_PARAM(0, 2) = 1; ENTITY_PARAM(0, 1) = 1; getEntities()->drawSequenceLeft(kEntityCoudert, "697F"); params->param3 = 0; - UPDATE_PARAM_PROC_END + } } if (!ENTITY_PARAM(0, 2)) @@ -3539,11 +3539,11 @@ label_callback_1: params->param2 = (uint)(getState()->time + 4500); if (params->param3 != kTimeInvalid) { - UPDATE_PARAM_PROC_TIME(params->param2, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param3, 0) + if (Entity::updateParameterTime((TimeValue)params->param2, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param3, 0)) { setCallback(2); setup_function55(); break; - UPDATE_PARAM_PROC_END + } } } diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 664b3fa70b..04ae6493c3 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -601,11 +601,11 @@ void Entity::callbackAction() { // Helper functions ////////////////////////////////////////////////////////////////////////// -bool Entity::updateParameter(uint ¶meter, uint timeValue, uint delta) { +bool Entity::updateParameter(uint ¶meter, uint timeType, uint delta) { if (!parameter) - parameter = (uint)(timeValue + delta); + parameter = (uint)(timeType + delta); - if (parameter >= timeValue) + if (parameter >= timeType) return false; parameter = kTimeInvalid; @@ -613,12 +613,26 @@ bool Entity::updateParameter(uint ¶meter, uint timeValue, uint delta) { return true; } -bool Entity::updateParameterCheck(uint ¶meter, uint timeValue, uint delta) { - if (parameter && parameter >= timeValue) +bool Entity::updateParameterTime(TimeValue timeValue, bool check, uint ¶meter, uint delta) { + if (getState()->time <= timeValue) { + if (check || !parameter) + parameter = (uint)(getState()->time + delta); + } + + if (parameter >= getState()->time && getState()->time <= timeValue) + return false; + + parameter = kTimeInvalid; + + return true; +} + +bool Entity::updateParameterCheck(uint ¶meter, uint timeType, uint delta) { + if (parameter && parameter >= timeType) return false; if (!parameter) - parameter = (uint)(timeValue + delta); + parameter = (uint)(timeType + delta); return true; } diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index ce8aa168a4..73114a1436 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -870,8 +870,9 @@ protected: // Helper functions ////////////////////////////////////////////////////////////////////////// - bool updateParameter(uint ¶meter, uint time, uint delta); - bool updateParameterCheck(uint ¶meter, uint time, uint delta); + bool updateParameter(uint ¶meter, uint timeType, uint delta); + bool updateParameterCheck(uint ¶meter, uint timeType, uint delta); + bool updateParameterTime(TimeValue timeValue, bool check, uint ¶meter, uint delta); void timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action); void timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex index, ObjectLocation location); diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 4b97556a75..c4fc36a8ee 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -371,23 +371,6 @@ void class::setup_##name() { \ parameter = kTimeInvalid; \ } -// Updating parameter with code inside the check -#define UPDATE_PARAM_PROC(parameter, type, value) \ - if (!parameter) \ - parameter = (uint)(type + value); \ - if (parameter < type) { \ - parameter = kTimeInvalid; - -#define UPDATE_PARAM_PROC_TIME(timeValue, test, parameter, value) \ - if (getState()->time <= timeValue) { \ - if (test || !parameter) \ - parameter = (uint)(getState()->time + value); \ - } \ - if (parameter < getState()->time || getState()->time > timeValue) { \ - parameter = kTimeInvalid; - -#define UPDATE_PARAM_PROC_END } - } // End of namespace LastExpress #endif // LASTEXPRESS_ENTITY_INTERN_H diff --git a/engines/lastexpress/entities/francois.cpp b/engines/lastexpress/entities/francois.cpp index b99dbe466b..e4d401d202 100644 --- a/engines/lastexpress/entities/francois.cpp +++ b/engines/lastexpress/entities/francois.cpp @@ -278,7 +278,7 @@ IMPLEMENT_FUNCTION_I(11, Francois, function11, TimeValue) case kActionNone: if (!getSoundQueue()->isBuffered(kEntityFrancois)) { - UPDATE_PARAM_PROC(CURRENT_PARAM(1, 1), getState()->timeTicks, params->param6) + if (Entity::updateParameter(CURRENT_PARAM(1, 1), getState()->timeTicks, params->param6)) { switch (rnd(7)) { default: break; @@ -311,7 +311,7 @@ IMPLEMENT_FUNCTION_I(11, Francois, function11, TimeValue) params->param6 = 15 * rnd(7); CURRENT_PARAM(1, 1) = 0; - UPDATE_PARAM_PROC_END + } } if (!getEntities()->hasValidFrame(kEntityFrancois) || !getEntities()->isWalkingOppositeToPlayer(kEntityFrancois)) @@ -998,11 +998,11 @@ label_callback_5: } if (params->param5 != kTimeInvalid) { - UPDATE_PARAM_PROC_TIME(kTimeEnd, !getEntities()->isDistanceBetweenEntities(kEntityFrancois, kEntityPlayer, 2000), params->param5, 75); + if (Entity::updateParameterTime(kTimeEnd, !getEntities()->isDistanceBetweenEntities(kEntityFrancois, kEntityPlayer, 2000), params->param5, 75)) { setCallback(6); setup_playSound("Fra2010"); break; - UPDATE_PARAM_PROC_END + } } label_callback_6: diff --git a/engines/lastexpress/entities/kahina.cpp b/engines/lastexpress/entities/kahina.cpp index 2124de1687..08f845f5ba 100644 --- a/engines/lastexpress/entities/kahina.cpp +++ b/engines/lastexpress/entities/kahina.cpp @@ -394,10 +394,10 @@ IMPLEMENT_FUNCTION(15, Kahina, function15) case kActionNone: if (params->param2 != kTimeInvalid) { - UPDATE_PARAM_PROC_TIME(params->param1, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param2, 0) + if (Entity::updateParameterTime((TimeValue)params->param1, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param2, 0)) { setCallback(9); setup_updateEntity(kCarRedSleeping, kPosition_4070); - UPDATE_PARAM_PROC_END + } } break; @@ -580,18 +580,18 @@ IMPLEMENT_FUNCTION(17, Kahina, chapter2Handler) case kActionNone: if (params->param1) { - UPDATE_PARAM_PROC(params->param2, getState()->time, 9000) + if (Entity::updateParameter(params->param2, getState()->time, 9000)) { params->param1 = 1; params->param2 = 0; - UPDATE_PARAM_PROC_END + } } if (getEvent(kEventKahinaAskSpeakFirebird) && getEvent(kEventKronosConversationFirebird) && getEntities()->isInsideTrainCar(kEntityPlayer, kCarKronos)) { - UPDATE_PARAM_PROC(params->param3, getState()->time, 900) + if (Entity::updateParameter(params->param3, getState()->time, 900)) { setCallback(1); setup_savegame(kSavegameTypeEvent, kEventKronosConversationFirebird); break; - UPDATE_PARAM_PROC_END + } } label_callback_3: @@ -785,10 +785,10 @@ label_callback_2: } if (!params->param1) { - UPDATE_PARAM_PROC(params->param3, getState()->time, 9000) + if (Entity::updateParameter(params->param3, getState()->time, 9000)) { params->param1 = 1; params->param3 = 0; - UPDATE_PARAM_PROC_END + } } if (getEvent(kEventKahinaAskSpeakFirebird) @@ -927,11 +927,11 @@ IMPLEMENT_FUNCTION(21, Kahina, function21) params->param3 = (uint)getState()->time + 4500; if (params->param6 != kTimeInvalid) { - UPDATE_PARAM_PROC_TIME(params->param3, (getEntities()->isPlayerPosition(kCarKronos, 80) || getEntities()->isPlayerPosition(kCarKronos, 88)), params->param5, 0) + if (Entity::updateParameterTime((TimeValue)params->param3, (getEntities()->isPlayerPosition(kCarKronos, 80) || getEntities()->isPlayerPosition(kCarKronos, 88)), params->param5, 0)) { setCallback(2); setup_function23(); break; - UPDATE_PARAM_PROC_END + } } } @@ -942,14 +942,14 @@ label_callback_2: params->param4 = (uint)getState()->time + 4500; if (params->param6 != kTimeInvalid) { - UPDATE_PARAM_PROC_TIME(params->param3, (getEntities()->isPlayerPosition(kCarKronos, 80) || getEntities()->isPlayerPosition(kCarKronos, 88)), params->param6, 0) + if (Entity::updateParameterTime((TimeValue)params->param3, (getEntities()->isPlayerPosition(kCarKronos, 80) || getEntities()->isPlayerPosition(kCarKronos, 88)), params->param6, 0)) { getSound()->playSound(kEntityPlayer, "LIB014", getSound()->getSoundFlag(kEntityKahina)); getSound()->playSound(kEntityPlayer, "LIB015", getSound()->getSoundFlag(kEntityKahina)); getEntities()->drawSequenceLeft(kEntityKahina, "202a"); params->param2 = 0; - UPDATE_PARAM_PROC_END + } } } diff --git a/engines/lastexpress/entities/kronos.cpp b/engines/lastexpress/entities/kronos.cpp index c9fe0dcde1..5dd790ce12 100644 --- a/engines/lastexpress/entities/kronos.cpp +++ b/engines/lastexpress/entities/kronos.cpp @@ -293,10 +293,10 @@ IMPLEMENT_FUNCTION(15, Kronos, function15) case kActionNone: if (params->param1 && !getEntities()->isInSalon(kEntityBoutarel)) { - UPDATE_PARAM_PROC(params->param2, getState()->timeTicks, 75) + if (Entity::updateParameter(params->param2, getState()->timeTicks, 75)) { setup_function16(); break; - UPDATE_PARAM_PROC_END + } } if (params->param3 != kTimeInvalid && getState()->time > kTime2002500) { @@ -526,9 +526,9 @@ IMPLEMENT_FUNCTION(20, Kronos, function20) } if (CURRENT_PARAM(1, 2) != kTimeInvalid && params->param7 < getState()->time) { - UPDATE_PARAM_PROC_TIME(params->param8, !params->param1, CURRENT_PARAM(1, 2), 450) + if (Entity::updateParameterTime((TimeValue)params->param8, !params->param1, CURRENT_PARAM(1, 2), 450)) { getSavePoints()->push(kEntityKronos, kEntityKahina, kAction237555748); - UPDATE_PARAM_PROC_END + } } if (!params->param1) diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index c093ac4b30..9d9225f49b 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -534,20 +534,20 @@ IMPLEMENT_FUNCTION_II(13, Mertens, function13, bool, bool) Entity::savegameBloodJacket(); if (!params->param2 && !params->param3) { - UPDATE_PARAM_PROC(params->param4, getState()->timeTicks, 75) + if (Entity::updateParameter(params->param4, getState()->timeTicks, 75)) { getData()->inventoryItem = kItemNone; setCallback(5); setup_function18(); break; - UPDATE_PARAM_PROC_END + } } - UPDATE_PARAM_PROC(params->param5, getState()->timeTicks, 225) + if (Entity::updateParameter(params->param5, getState()->timeTicks, 225)) { getData()->inventoryItem = kItemNone; setCallback(6); setup_function18(); break; - UPDATE_PARAM_PROC_END + } getData()->inventoryItem = (getProgress().chapter == kChapter1 && !ENTITY_PARAM(2, 1) @@ -1059,9 +1059,9 @@ IMPLEMENT_FUNCTION_II(21, Mertens, function21, ObjectIndex, ObjectIndex) break; case kActionNone: - UPDATE_PARAM_PROC(CURRENT_PARAM(1, 4), getState()->time, 300) + if (Entity::updateParameter(CURRENT_PARAM(1, 4), getState()->time, 300)) { getSound()->playSound(kEntityPlayer, "ZFX1004", getSound()->getSoundFlag(kEntityMertens)); - UPDATE_PARAM_PROC_END + } if (!Entity::updateParameter(CURRENT_PARAM(1, 5), getState()->time, 900)) break; @@ -1616,13 +1616,13 @@ IMPLEMENT_FUNCTION_I(27, Mertens, tylerCompartment, MertensActionType) break; } - UPDATE_PARAM_PROC(params->param2, getState()->timeTicks, 150) + if (Entity::updateParameter(params->param2, getState()->timeTicks, 150)) { getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorNormal); setCallback(10); setup_playSound16("CON1018A"); break; - UPDATE_PARAM_PROC_END + } label_callback10: if (!params->param3) @@ -3025,11 +3025,11 @@ IMPLEMENT_FUNCTION(42, Mertens, function42) label_callback_8: if (getState()->time > kTime1215000 && !ENTITY_PARAM(0, 1) && !ENTITY_PARAM(2, 1)) { - UPDATE_PARAM_PROC(params->param5, getState()->time, 2700) + if (Entity::updateParameter(params->param5, getState()->time, 2700)) { getEntities()->drawSequenceLeft(kEntityMertens, "601E"); ENTITY_PARAM(0, 1) = 1; params->param5 = 0; - UPDATE_PARAM_PROC_END + } } if (ENTITY_PARAM(0, 8)) { diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp index 8ebb23b024..5c5d481938 100644 --- a/engines/lastexpress/entities/milos.cpp +++ b/engines/lastexpress/entities/milos.cpp @@ -176,11 +176,11 @@ IMPLEMENT_FUNCTION_I(11, Milos, function11, TimeValue) } if (params->param2) { - UPDATE_PARAM_PROC(params->param8, getState()->timeTicks, 75) + if (Entity::updateParameter(params->param8, getState()->timeTicks, 75)) { params->param2 = 0; params->param3 = 1; getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation1, kCursorNormal, kCursorNormal); - UPDATE_PARAM_PROC_END + } } params->param8 = 0; @@ -189,10 +189,10 @@ IMPLEMENT_FUNCTION_I(11, Milos, function11, TimeValue) break; if (params->param6) { - UPDATE_PARAM_PROC(CURRENT_PARAM(1, 1), getState()->time, 4500) + if (Entity::updateParameter(CURRENT_PARAM(1, 1), getState()->time, 4500)) { params->param6 = 0; CURRENT_PARAM(1, 1) = 0; - UPDATE_PARAM_PROC_END + } } if (!getProgress().field_CC) { @@ -730,11 +730,11 @@ IMPLEMENT_FUNCTION(15, Milos, chapter1Handler) } if (getEntities()->isPlayerPosition(kCarRestaurant, 61) && !params->param1) { - UPDATE_PARAM_PROC(params->param4, getState()->timeTicks, 45) + if (Entity::updateParameter(params->param4, getState()->timeTicks, 45)) { setCallback(1); setup_draw("009C"); break; - UPDATE_PARAM_PROC_END + } } if (getEntities()->isPlayerPosition(kCarRestaurant, 70) && !params->param2) { @@ -1287,10 +1287,10 @@ IMPLEMENT_FUNCTION(25, Milos, function25) case kActionNone: if (!getEvent(kEventMilosCompartmentVisitTyler) && !getProgress().field_54 && !ENTITY_PARAM(0, 4)) { - UPDATE_PARAM_PROC(params->param3, getState()->time, 13500) + if (Entity::updateParameter(params->param3, getState()->time, 13500)) { getSavePoints()->push(kEntityMilos, kEntityVesna, kAction155913424); params->param3 = 0; - UPDATE_PARAM_PROC_END + } } if (params->param1) { diff --git a/engines/lastexpress/entities/mmeboutarel.cpp b/engines/lastexpress/entities/mmeboutarel.cpp index 323e686ec3..888adeb372 100644 --- a/engines/lastexpress/entities/mmeboutarel.cpp +++ b/engines/lastexpress/entities/mmeboutarel.cpp @@ -400,7 +400,7 @@ IMPLEMENT_FUNCTION(13, MmeBoutarel, function13) case kActionNone: if (!getSoundQueue()->isBuffered(kEntityMmeBoutarel) && params->param6 != kTimeInvalid) { - UPDATE_PARAM_PROC_TIME(params->param1, !getEntities()->isDistanceBetweenEntities(kEntityMmeBoutarel, kEntityPlayer, 2000), params->param6, 0) + if (Entity::updateParameterTime((TimeValue)params->param1, !getEntities()->isDistanceBetweenEntities(kEntityMmeBoutarel, kEntityPlayer, 2000), params->param6, 0)) { getObjects()->update(kObjectCompartmentD, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal); getObjects()->update(kObject51, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal); @@ -412,16 +412,16 @@ IMPLEMENT_FUNCTION(13, MmeBoutarel, function13) setCallback(1); setup_playSound("MME1037"); break; - UPDATE_PARAM_PROC_END + } } label_callback_1: if (getProgress().field_24 && params->param7 != kTimeInvalid) { - UPDATE_PARAM_PROC_TIME(kTime1093500, (!params->param5 || !getEntities()->isPlayerInCar(kCarRedSleeping)), params->param7, 0) + if (Entity::updateParameterTime(kTime1093500, (!params->param5 || !getEntities()->isPlayerInCar(kCarRedSleeping)), params->param7, 0)) { setCallback(2); setup_function11(); break; - UPDATE_PARAM_PROC_END + } } TIME_CHECK(kTime1094400, params->param8, setup_function14); diff --git a/engines/lastexpress/entities/pascale.cpp b/engines/lastexpress/entities/pascale.cpp index e74cf3490f..6e9f992390 100644 --- a/engines/lastexpress/entities/pascale.cpp +++ b/engines/lastexpress/entities/pascale.cpp @@ -1115,13 +1115,13 @@ IMPLEMENT_FUNCTION(33, Pascale, function33) case kActionNone: if (params->param4) { - UPDATE_PARAM_PROC(params->param5, getState()->time, 4500) + if (Entity::updateParameter(params->param5, getState()->time, 4500)) { getObjects()->update(kObjectCompartmentG, kEntityPascale, kObjectLocation1, kCursorNormal, kCursorNormal); setCallback(1); setup_playSound("Wat5010"); break; - UPDATE_PARAM_PROC_END + } } label_callback1: diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index 96deaaf97f..c0c22fa1da 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -498,14 +498,14 @@ IMPLEMENT_FUNCTION_I(20, Rebecca, function20, TimeValue) if (!params->param2) { params->param6 = 0; } else { - UPDATE_PARAM_PROC(params->param6, getState()->timeTicks, 75) + if (Entity::updateParameter(params->param6, getState()->timeTicks, 75)) { params->param2 = 0; params->param3 = 1; getObjects()->update(kObjectCompartmentE, kEntityRebecca, kObjectLocation1, kCursorNormal, kCursorNormal); getObjects()->update(kObject52, kEntityRebecca, kObjectLocation1, kCursorNormal, kCursorNormal); params->param6 = 0; - UPDATE_PARAM_PROC_END + } } if (getProgress().chapter == kChapter1 && !ENTITY_PARAM(0, 3)) { diff --git a/engines/lastexpress/entities/servers0.cpp b/engines/lastexpress/entities/servers0.cpp index 56fc0e6056..73e0d34722 100644 --- a/engines/lastexpress/entities/servers0.cpp +++ b/engines/lastexpress/entities/servers0.cpp @@ -312,17 +312,17 @@ IMPLEMENT_FUNCTION(20, Servers0, chapter1Handler) case kActionNone: if (params->param2) { - UPDATE_PARAM_PROC(params->param3, getState()->time, 2700); + if (Entity::updateParameter(params->param3, getState()->time, 2700)) { ENTITY_PARAM(0, 4) = 1; params->param2 = 0; - UPDATE_PARAM_PROC_END + } } if (params->param1) { - UPDATE_PARAM_PROC(params->param4, getState()->time, 4500) + if (Entity::updateParameter(params->param4, getState()->time, 4500)) { ENTITY_PARAM(0, 5) = 1; params->param1 = 0; - UPDATE_PARAM_PROC_END + } } if (!getEntities()->isInKitchen(kEntityServers0) && !getEntities()->isSomebodyInsideRestaurantOrSalon()) @@ -733,10 +733,10 @@ IMPLEMENT_FUNCTION(32, Servers0, chapter4Handler) break; case kActionNone: - UPDATE_PARAM_PROC(params->param2, getState()->time, 3600) + if (Entity::updateParameter(params->param2, getState()->time, 3600)) { ENTITY_PARAM(1, 8) = 1; params->param1 = 0; - UPDATE_PARAM_PROC_END + } if (!getEntities()->isInKitchen(kEntityServers1) || !getEntities()->isSomebodyInsideRestaurantOrSalon()) break; diff --git a/engines/lastexpress/entities/servers1.cpp b/engines/lastexpress/entities/servers1.cpp index 24bf678f3a..a8f4c0233c 100644 --- a/engines/lastexpress/entities/servers1.cpp +++ b/engines/lastexpress/entities/servers1.cpp @@ -563,10 +563,10 @@ IMPLEMENT_FUNCTION(26, Servers1, chapter4Handler) case kActionNone: if (params->param2) { - UPDATE_PARAM_PROC(params->param2, getState()->time, 900) + if (Entity::updateParameter(params->param2, getState()->time, 900)) { ENTITY_PARAM(1, 5) = 1; params->param1 = 0; - UPDATE_PARAM_PROC_END + } } if (!getEntities()->isInKitchen(kEntityServers1) || !getEntities()->isSomebodyInsideRestaurantOrSalon()) diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp index 9c2c582130..992d38e017 100644 --- a/engines/lastexpress/entities/tatiana.cpp +++ b/engines/lastexpress/entities/tatiana.cpp @@ -374,10 +374,10 @@ IMPLEMENT_FUNCTION(18, Tatiana, function18) } if (!params->param1) { - UPDATE_PARAM_PROC(params->param3, getState()->time, 4500) + if (Entity::updateParameter(params->param3, getState()->time, 4500)) { getEntities()->drawSequenceRight(kEntityTatiana, "806DS"); params->param1 = 1; - UPDATE_PARAM_PROC_END + } } } @@ -424,20 +424,20 @@ IMPLEMENT_FUNCTION(19, Tatiana, chapter1Handler) if (getSoundQueue()->isBuffered(kEntityTatiana) || !params->param4 || params->param3 == 2 || getSoundQueue()->isBuffered("TAT1066")) goto label_tatiana_chapter1_2; - UPDATE_PARAM_PROC(params->param5, getState()->timeTicks, 450) + if (Entity::updateParameter(params->param5, getState()->timeTicks, 450)) { getSound()->playSound(kEntityTatiana, params->param3 ? "TAT1069B" : "TAT1069A"); getProgress().field_64 = 1; params->param3++; params->param5 = 0; - UPDATE_PARAM_PROC_END + } if (getEntities()->isPlayerPosition(kCarRestaurant, 71)) { - UPDATE_PARAM_PROC(params->param6, getState()->timeTicks, 75) + if (Entity::updateParameter(params->param6, getState()->timeTicks, 75)) { getSound()->playSound(kEntityTatiana, params->param3 ? "TAT1069B" : "TAT1069A"); getProgress().field_64 = 1; params->param3++; params->param6 = 0; - UPDATE_PARAM_PROC_END + } } label_tatiana_chapter1_2: @@ -615,7 +615,7 @@ IMPLEMENT_FUNCTION(22, Tatiana, function22) if (params->param1 == kTimeInvalid || getState()->time <= kTime1179000) goto label_update; - UPDATE_PARAM_PROC_TIME(kTime1233000, ((!getEvent(kEventTatianaAskMatchSpeakRussian) && !getEvent(kEventTatianaAskMatch)) || getEntities()->isInGreenCarEntrance(kEntityPlayer)), params->param1, 0) + if (Entity::updateParameterTime(kTime1233000, ((!getEvent(kEventTatianaAskMatchSpeakRussian) && !getEvent(kEventTatianaAskMatch)) || getEntities()->isInGreenCarEntrance(kEntityPlayer)), params->param1, 0)) { label_update: if (!getEvent(kEventTatianaAskMatchSpeakRussian) && !getEvent(kEventTatianaAskMatch) @@ -624,7 +624,7 @@ label_update: getObjects()->update(kObject25, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorForward); getObjects()->update(kObjectTrainTimeTable, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorForward); } - UPDATE_PARAM_PROC_END + } params->param1 = kTimeInvalid; @@ -1284,13 +1284,13 @@ IMPLEMENT_FUNCTION(37, Tatiana, function37) params->param3 = (uint)getState()->time + 900; if (params->param4 != kTimeInvalid && params->param3 < getState()->time) { - UPDATE_PARAM_PROC_TIME(kTime2227500, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param4, 450) + if (Entity::updateParameterTime(kTime2227500, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param4, 450)) { getProgress().field_5C = 1; if (getEntities()->isInsideCompartment(kEntityAnna, kCarRedSleeping, kPosition_4070)) { setup_function38(); break; } - UPDATE_PARAM_PROC_END + } } } diff --git a/engines/lastexpress/entities/vesna.cpp b/engines/lastexpress/entities/vesna.cpp index 6889be4335..f54f0f3231 100644 --- a/engines/lastexpress/entities/vesna.cpp +++ b/engines/lastexpress/entities/vesna.cpp @@ -1082,10 +1082,10 @@ IMPLEMENT_FUNCTION(30, Vesna, function30) case kActionNone: if (!params->param1) { - UPDATE_PARAM_PROC(params->param3, getState()->timeTicks, 120) + if (Entity::updateParameter(params->param3, getState()->timeTicks, 120)) { getSound()->playSound(kEntityVesna, "Ves50001", kFlagDefault); params->param1 = 1; - UPDATE_PARAM_PROC_END + } } if (!Entity::updateParameter(params->param4, getState()->timeTicks, 180)) -- cgit v1.2.3 From 82ad017a8e8614ca4c4141c4d1a8fd2a9c45010d Mon Sep 17 00:00:00 2001 From: Julien Date: Mon, 23 Jul 2012 01:23:41 -0400 Subject: LASTEXPRESS: Replace UPDATE_PARAM_GOTO macro --- engines/lastexpress/entities/anna.cpp | 3 ++- engines/lastexpress/entities/august.cpp | 3 ++- engines/lastexpress/entities/entity_intern.h | 13 ------------- engines/lastexpress/entities/tatiana.cpp | 3 ++- engines/lastexpress/entities/train.cpp | 16 +++++++++------- engines/lastexpress/entities/vassili.cpp | 3 ++- 6 files changed, 17 insertions(+), 24 deletions(-) diff --git a/engines/lastexpress/entities/anna.cpp b/engines/lastexpress/entities/anna.cpp index ab7163a67c..0f326792eb 100644 --- a/engines/lastexpress/entities/anna.cpp +++ b/engines/lastexpress/entities/anna.cpp @@ -3277,7 +3277,8 @@ IMPLEMENT_FUNCTION(67, Anna, chapter4Handler) case kActionNone: if (getEntities()->isPlayerPosition(kCarRedSleeping, 46)) { - UPDATE_PARAM_GOTO(params->param4, getState()->timeTicks, 30, label_next); + if (!Entity::updateParameter(params->param4, getState()->timeTicks, 30)) + goto label_next; getScenes()->loadSceneFromPosition(kCarRedSleeping, 8); } diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp index 5ae8d11b95..e863fe1d87 100644 --- a/engines/lastexpress/entities/august.cpp +++ b/engines/lastexpress/entities/august.cpp @@ -523,7 +523,8 @@ IMPLEMENT_FUNCTION_I(21, August, function21, TimeValue) } if (params->param2) { - UPDATE_PARAM_GOTO(params->param8, getState()->timeTicks, 75, label_continue); + if (!Entity::updateParameter(params->param8, getState()->timeTicks, 75)) + goto label_continue; params->param2 = 0; params->param3 = 1; diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index c4fc36a8ee..4a7aabff28 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -358,19 +358,6 @@ void class::setup_##name() { \ } \ } -////////////////////////////////////////////////////////////////////////// -// Param update -////////////////////////////////////////////////////////////////////////// - -// Todo: replace with UPDATE_PARAM_PROC as appropriate -#define UPDATE_PARAM_GOTO(parameter, type, value, label) { \ - if (!parameter) \ - parameter = (uint)(type + value); \ - if (parameter >= type) \ - goto label; \ - parameter = kTimeInvalid; \ -} - } // End of namespace LastExpress #endif // LASTEXPRESS_ENTITY_INTERN_H diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp index 992d38e017..b7c26bdd1c 100644 --- a/engines/lastexpress/entities/tatiana.cpp +++ b/engines/lastexpress/entities/tatiana.cpp @@ -1955,7 +1955,8 @@ IMPLEMENT_FUNCTION(48, Tatiana, function48) if (!params->param1 || getSoundQueue()->isBuffered(kEntityTatiana)) goto label_end; - UPDATE_PARAM_GOTO(params->param2, getState()->timeTicks, 5 * (3 * rnd(5) + 30), label_end); + if (!Entity::updateParameter(params->param2, getState()->timeTicks, 5 * (3 * rnd(5) + 30))) + goto label_end; getSound()->playSound(kEntityTatiana, "LIB012", kFlagDefault); params->param2 = 0; diff --git a/engines/lastexpress/entities/train.cpp b/engines/lastexpress/entities/train.cpp index 0830dffbef..e3f530ef25 100644 --- a/engines/lastexpress/entities/train.cpp +++ b/engines/lastexpress/entities/train.cpp @@ -267,18 +267,20 @@ IMPLEMENT_FUNCTION(8, Train, process) if ((getEntities()->isPlayerInCar(kCarGreenSleeping) || getEntities()->isPlayerInCar(kCarRedSleeping)) && params->param4 && !params->param5) { - params->param4 -= 1; + params->param4 -= 1; - if (!params->param4 && getProgress().jacket == kJacketGreen) { + if (!params->param4 && getProgress().jacket == kJacketGreen) { - getAction()->playAnimation(isNight() ? kEventCathSmokeNight : kEventCathSmokeDay); - params->param5 = 1; - getScenes()->processScene(); - } + getAction()->playAnimation(isNight() ? kEventCathSmokeNight : kEventCathSmokeDay); + params->param5 = 1; + getScenes()->processScene(); + } } if (params->param6) { - UPDATE_PARAM_GOTO(params1->param7, getState()->time, 900, label_process); + if (!Entity::updateParameter(params1->param7, getState()->time, 900)) + goto label_process; + getScenes()->loadSceneFromPosition(kCarRestaurant, 58); } diff --git a/engines/lastexpress/entities/vassili.cpp b/engines/lastexpress/entities/vassili.cpp index 6504df7928..5344e705f5 100644 --- a/engines/lastexpress/entities/vassili.cpp +++ b/engines/lastexpress/entities/vassili.cpp @@ -144,7 +144,8 @@ IMPLEMENT_FUNCTION(6, Vassili, function6) case kActionNone: if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_8200)) { - UPDATE_PARAM_GOTO(params->param3, getState()->timeTicks, params->param1, label_function7); + if (!Entity::updateParameter(params->param3, getState()->timeTicks, params->param1)) + goto label_function7; setCallback(1); setup_draw("303B"); -- cgit v1.2.3 From e985f7374fd20efc4574bc8320967deef7489d5a Mon Sep 17 00:00:00 2001 From: Julien Date: Mon, 23 Jul 2012 01:25:03 -0400 Subject: LASTEXPRESS: Move Entity function declaration macros to entity.h --- engines/lastexpress/entities/entity.h | 31 +++++++++++++++++++++++++++- engines/lastexpress/entities/entity_intern.h | 30 --------------------------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 73114a1436..76abab6c2f 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -41,9 +41,38 @@ class Sequence; class SequenceFrame; struct SavePoint; +////////////////////////////////////////////////////////////////////////// +// Declaration +////////////////////////////////////////////////////////////////////////// +#define DECLARE_FUNCTION(name) \ + void setup_##name(); \ + void name(const SavePoint &savepoint); + +#define DECLARE_FUNCTION_1(name, param1) \ + void setup_##name(param1); \ + void name(const SavePoint &savepoint); + +#define DECLARE_FUNCTION_2(name, param1, param2) \ + void setup_##name(param1, param2); \ + void name(const SavePoint &savepoint); + +#define DECLARE_FUNCTION_3(name, param1, param2, param3) \ + void setup_##name(param1, param2, param3); \ + void name(const SavePoint &savepoint); + +#define DECLARE_FUNCTION_4(name, param1, param2, param3, param4) \ + void setup_##name(param1, param2, param3, param4); \ + void name(const SavePoint &savepoint); + +#define DECLARE_FUNCTION_NOSETUP(name) \ + void name(const SavePoint &savepoint); + +#define DECLARE_NULL_FUNCTION() \ + void setup_nullfunction(); ////////////////////////////////////////////////////////////////////////// // Callbacks +////////////////////////////////////////////////////////////////////////// #define ENTITY_CALLBACK(class, name, pointer) \ Common::Functor1Mem(pointer, &class::name) @@ -63,7 +92,7 @@ struct SavePoint; ((EntityData::EntityParametersIIII*)_data->getParameters(8, index))->param##id - +////////////////////////////////////////////////////////////////////////// class EntityData : Common::Serializable { public: diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 4a7aabff28..e62eeb0c56 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -25,36 +25,6 @@ namespace LastExpress { -////////////////////////////////////////////////////////////////////////// -// Declaration -////////////////////////////////////////////////////////////////////////// - -#define DECLARE_FUNCTION(name) \ - void setup_##name(); \ - void name(const SavePoint &savepoint); - -#define DECLARE_FUNCTION_1(name, param1) \ - void setup_##name(param1); \ - void name(const SavePoint &savepoint); - -#define DECLARE_FUNCTION_2(name, param1, param2) \ - void setup_##name(param1, param2); \ - void name(const SavePoint &savepoint); - -#define DECLARE_FUNCTION_3(name, param1, param2, param3) \ - void setup_##name(param1, param2, param3); \ - void name(const SavePoint &savepoint); - -#define DECLARE_FUNCTION_4(name, param1, param2, param3, param4) \ - void setup_##name(param1, param2, param3, param4); \ - void name(const SavePoint &savepoint); - -#define DECLARE_FUNCTION_NOSETUP(name) \ - void name(const SavePoint &savepoint); - -#define DECLARE_NULL_FUNCTION() \ - void setup_nullfunction(); - ////////////////////////////////////////////////////////////////////////// // Setup ////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3 From 8545991739848d878e61ff058e8fa1326261e634 Mon Sep 17 00:00:00 2001 From: Julien Date: Mon, 23 Jul 2012 14:28:41 -0400 Subject: LASTEXPRESS: Remove several TIME_CHECK* macros --- engines/lastexpress/entities/abbot.cpp | 9 ++--- engines/lastexpress/entities/alexei.cpp | 4 +-- engines/lastexpress/entities/alouan.cpp | 32 +++++++++++------ engines/lastexpress/entities/anna.cpp | 9 ++--- engines/lastexpress/entities/august.cpp | 8 ++--- engines/lastexpress/entities/boutarel.cpp | 7 ++-- engines/lastexpress/entities/cooks.cpp | 2 +- engines/lastexpress/entities/coudert.cpp | 29 ++++++++++------ engines/lastexpress/entities/entity.cpp | 51 ++++++++++++++++++++++++++++ engines/lastexpress/entities/entity.h | 8 +++++ engines/lastexpress/entities/entity_intern.h | 35 ------------------- engines/lastexpress/entities/francois.cpp | 28 +++++++++------ engines/lastexpress/entities/gendarmes.cpp | 2 +- engines/lastexpress/entities/hadija.cpp | 50 +++++++++++++++++---------- engines/lastexpress/entities/ivo.cpp | 4 +-- engines/lastexpress/entities/kahina.cpp | 4 +-- engines/lastexpress/entities/kronos.cpp | 9 +++-- engines/lastexpress/entities/mahmud.cpp | 5 +-- engines/lastexpress/entities/max.cpp | 2 +- engines/lastexpress/entities/mertens.cpp | 22 +++++++----- engines/lastexpress/entities/milos.cpp | 2 +- engines/lastexpress/entities/mmeboutarel.cpp | 8 +++-- engines/lastexpress/entities/rebecca.cpp | 11 +++--- engines/lastexpress/entities/salko.cpp | 2 +- engines/lastexpress/entities/sophie.cpp | 2 +- engines/lastexpress/entities/tatiana.cpp | 2 +- engines/lastexpress/entities/vassili.cpp | 2 +- engines/lastexpress/entities/verges.cpp | 10 +++--- engines/lastexpress/entities/vesna.cpp | 2 +- engines/lastexpress/entities/yasmin.cpp | 46 +++++++++++++++++-------- 30 files changed, 251 insertions(+), 156 deletions(-) diff --git a/engines/lastexpress/entities/abbot.cpp b/engines/lastexpress/entities/abbot.cpp index 7916f88662..e0fe429520 100644 --- a/engines/lastexpress/entities/abbot.cpp +++ b/engines/lastexpress/entities/abbot.cpp @@ -691,7 +691,7 @@ IMPLEMENT_FUNCTION(28, Abbot, function28) break; case kActionNone: - TIME_CHECK_CALLBACK(kTime2052000, params->param1, 1, setup_function29); + Entity::timeCheckCallback(kTime2052000, params->param1, 1, WRAP_SETUP_FUNCTION(Abbot, setup_function29)); break; case kActionDefault: @@ -1428,7 +1428,8 @@ IMPLEMENT_FUNCTION(43, Abbot, function43) } label_callback_1: - TIME_CHECK(kTime2466000, params->param5, setup_function44); + if (Entity::timeCheck(kTime2466000, params->param5, WRAP_SETUP_FUNCTION(Abbot, setup_function44))) + break; if (params->param3) { if (!Entity::updateParameter(params->param6, getState()->timeTicks, 75)) @@ -1657,7 +1658,7 @@ IMPLEMENT_FUNCTION(48, Abbot, function48) setup_updatePosition("126C", kCarRedSleeping, 52); } - TIME_CHECK_CALLBACK_INVENTORY(kTime2533500, params->param2, 5, setup_callbackActionRestaurantOrSalon); + Entity::timeCheckCallbackInventory(kTime2533500, params->param2, 5, WRAP_SETUP_FUNCTION(Abbot, setup_callbackActionRestaurantOrSalon)); break; case kAction1: @@ -1709,7 +1710,7 @@ IMPLEMENT_FUNCTION(48, Abbot, function48) getEntities()->drawSequenceLeft(kEntityAbbot, "126B"); params->param1 = 0; - TIME_CHECK_CALLBACK_INVENTORY(kTime2533500, params->param2, 5, setup_callbackActionRestaurantOrSalon); + Entity::timeCheckCallbackInventory(kTime2533500, params->param2, 5, WRAP_SETUP_FUNCTION(Abbot, setup_callbackActionRestaurantOrSalon)); break; case 5: diff --git a/engines/lastexpress/entities/alexei.cpp b/engines/lastexpress/entities/alexei.cpp index b31a9956bc..115c890f6f 100644 --- a/engines/lastexpress/entities/alexei.cpp +++ b/engines/lastexpress/entities/alexei.cpp @@ -446,7 +446,7 @@ IMPLEMENT_FUNCTION(17, Alexei, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler) + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Alexei, setup_chapter1Handler)); break; case kActionDefault: @@ -978,7 +978,7 @@ IMPLEMENT_FUNCTION(26, Alexei, function26) break; case kActionNone: - TIME_CHECK(kTime1512000, params->param1, setup_function27) + Entity::timeCheck(kTime1512000, params->param1, WRAP_SETUP_FUNCTION(Alexei, setup_function27)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp index 7549aaf6e6..2f086de46b 100644 --- a/engines/lastexpress/entities/alouan.cpp +++ b/engines/lastexpress/entities/alouan.cpp @@ -111,7 +111,7 @@ IMPLEMENT_FUNCTION(10, Alouan, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Alouan, setup_chapter1Handler)); break; case kActionDefault: @@ -131,7 +131,8 @@ IMPLEMENT_FUNCTION(11, Alouan, chapter1Handler) case kActionNone: - TIME_CHECK_CALLBACK(kTime1096200, params->param1, 1, setup_compartment8to6); + if (Entity::timeCheckCallback(kTime1096200, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8to6))) + break; label_callback1: if (getState()->time > kTime1162800 && !params->param2) { @@ -281,21 +282,27 @@ IMPLEMENT_FUNCTION(16, Alouan, chapter3Handler) break; case kActionNone: - TIME_CHECK_CALLBACK(kTimeCitySalzbourg, params->param1, 1, setup_compartment8to6); + if (Entity::timeCheckCallback(kTimeCitySalzbourg, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8to6))) + break; label_callback1: - if (params->param2 != kTimeInvalid && getState()->time > kTime1989000) - TIME_CHECK_CAR(kTime2119500, params->param5, 5, setup_compartment8); + if (params->param2 != kTimeInvalid && getState()->time > kTime1989000) { + if (Entity::timeCheckCar(kTime2119500, params->param5, 5, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8))) + break; + } label_callback2: TIME_CHECK_CALLBACK_1(kTime2052000, params->param3, 3, setup_playSound, "Har1005"); label_callback3: - TIME_CHECK_CALLBACK(kTime2133000, params->param4, 4, setup_compartment6to8); + if (Entity::timeCheckCallback(kTime2133000, params->param4, 4, WRAP_SETUP_FUNCTION(Alouan, setup_compartment6to8))) + break; label_callback4: - if (params->param5 != kTimeInvalid && getState()->time > kTime2151000) - TIME_CHECK_CAR(kTime2241000, params->param5, 5, setup_compartment8); + if (params->param5 != kTimeInvalid && getState()->time > kTime2151000) { + if (Entity::timeCheckCar(kTime2241000, params->param5, 5, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8))) + break; + } break; case kActionDefault: @@ -352,11 +359,14 @@ IMPLEMENT_FUNCTION(18, Alouan, chapter4Handler) break; case kActionNone: - if (params->param1 != kTimeInvalid) - TIME_CHECK_CAR(kTime2443500, params->param1, 1, setup_compartment8); + if (params->param1 != kTimeInvalid) { + if (Entity::timeCheckCar(kTime2443500, params->param1, 1, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8))) + break; + } label_callback1: - TIME_CHECK_CALLBACK(kTime2455200, params->param2, 2, setup_compartment8to6); + if (Entity::timeCheckCallback(kTime2455200, params->param2, 2, WRAP_SETUP_FUNCTION(Alouan, setup_compartment8to6))) + break; label_callback2: if (getState()->time > kTime2475000 && !params->param3) { diff --git a/engines/lastexpress/entities/anna.cpp b/engines/lastexpress/entities/anna.cpp index 0f326792eb..f8768032b5 100644 --- a/engines/lastexpress/entities/anna.cpp +++ b/engines/lastexpress/entities/anna.cpp @@ -547,7 +547,7 @@ IMPLEMENT_FUNCTION(16, Anna, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Anna, setup_chapter1Handler)); break; case kActionDefault: @@ -1423,7 +1423,7 @@ IMPLEMENT_FUNCTION(34, Anna, function34) } label_callback_1: - TIME_CHECK(kTime1489500, params->param3, setup_function35); + Entity::timeCheck(kTime1489500, params->param3, WRAP_SETUP_FUNCTION(Anna, setup_function35)); break; case kActionKnock: @@ -2544,7 +2544,8 @@ IMPLEMENT_FUNCTION(54, Anna, function54) case kActionNone: if (params->param3) { - TIME_CHECK(kTime2079000, params->param5, setup_function55); + if (Entity::timeCheck(kTime2079000, params->param5, WRAP_SETUP_FUNCTION(Anna, setup_function55))) + break; if (Entity::updateParameter(params->param6, getState()->time, 9000)) { params->param4 = !params->param4; @@ -3429,7 +3430,7 @@ IMPLEMENT_FUNCTION(69, Anna, function69) break; } - TIME_CHECK_CALLBACK(kTime2535300, params->param3, 4, setup_callbackActionRestaurantOrSalon); + Entity::timeCheckCallback(kTime2535300, params->param3, 4, WRAP_SETUP_FUNCTION(Anna, setup_callbackActionRestaurantOrSalon)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp index e863fe1d87..0412da69ac 100644 --- a/engines/lastexpress/entities/august.cpp +++ b/engines/lastexpress/entities/august.cpp @@ -752,7 +752,7 @@ IMPLEMENT_FUNCTION(22, August, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(August, setup_chapter1Handler)); break; case kActionDefault: @@ -1966,7 +1966,7 @@ IMPLEMENT_FUNCTION(38, August, function38) case kActionNone: Entity::timeCheckSavepoint(kTime1801800, params->param1, kEntityAugust, kEntityRebecca, kAction155980128); - TIME_CHECK_CALLBACK(kTime1820700, params->param2, 3, setup_callbackActionRestaurantOrSalon); + Entity::timeCheckCallback(kTime1820700, params->param2, 3, WRAP_SETUP_FUNCTION(August, setup_callbackActionRestaurantOrSalon)); break; case kActionDefault: @@ -2404,7 +2404,7 @@ IMPLEMENT_FUNCTION_END IMPLEMENT_FUNCTION(46, August, function46) switch (savepoint.action) { default: - TIME_CHECK_CALLBACK(kTime2088000, params->param1, 1, setup_function47); + Entity::timeCheckCallback(kTime2088000, params->param1, 1, WRAP_SETUP_FUNCTION(August, setup_function47)); break; case kActionNone: @@ -2489,7 +2489,7 @@ IMPLEMENT_FUNCTION(48, August, function48) break; case kActionNone: - TIME_CHECK(kTimeCityLinz, params->param1, setup_function49); + Entity::timeCheck(kTimeCityLinz, params->param1, WRAP_SETUP_FUNCTION(August, setup_function49)); break; case kActionKnock: diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp index 2a8c6603a4..3c13cb121e 100644 --- a/engines/lastexpress/entities/boutarel.cpp +++ b/engines/lastexpress/entities/boutarel.cpp @@ -617,7 +617,7 @@ IMPLEMENT_FUNCTION(19, Boutarel, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Boutarel, setup_chapter1Handler)); break; case kActionDefault: @@ -1047,7 +1047,7 @@ IMPLEMENT_FUNCTION(32, Boutarel, chapter4Handler) break; case kActionNone: - TIME_CHECK(kTime2367000, params->param1, setup_function33); + Entity::timeCheck(kTime2367000, params->param1, WRAP_SETUP_FUNCTION(Boutarel, setup_function33)); break; case kActionDefault: @@ -1113,7 +1113,8 @@ IMPLEMENT_FUNCTION(34, Boutarel, function34) break; case kActionNone: - TIME_CHECK(kTime2470500, params->param1, setup_function35); + if (Entity::timeCheck(kTime2470500, params->param1, WRAP_SETUP_FUNCTION(Boutarel, setup_function35))) + break; if (getState()->time > kTime2457000 && getEvent(kEventAugustDrink)) { getSavePoints()->push(kEntityBoutarel, kEntityAbbot, kAction159003408); diff --git a/engines/lastexpress/entities/cooks.cpp b/engines/lastexpress/entities/cooks.cpp index 62a1e0fdb6..5e8a2df8cb 100644 --- a/engines/lastexpress/entities/cooks.cpp +++ b/engines/lastexpress/entities/cooks.cpp @@ -239,7 +239,7 @@ IMPLEMENT_FUNCTION(5, Cooks, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Cooks, setup_chapter1Handler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/coudert.cpp b/engines/lastexpress/entities/coudert.cpp index 4458632f2d..b604277903 100644 --- a/engines/lastexpress/entities/coudert.cpp +++ b/engines/lastexpress/entities/coudert.cpp @@ -1963,7 +1963,7 @@ IMPLEMENT_FUNCTION(36, Coudert, chapter1) break; case kActionNone: - TIME_CHECK_CALLBACK(kTimeChapter1, params->param1, 1, setup_chapter1Handler) + Entity::timeCheckCallback(kTimeChapter1, params->param1, 1, WRAP_SETUP_FUNCTION(Coudert, setup_chapter1Handler)); break; case kActionDefault: @@ -2825,22 +2825,28 @@ label_callback_12: } label_callback_13: - TIME_CHECK_CALLBACK(kTime2088900, params->param1, 14, setup_function32); + if (Entity::timeCheckCallback(kTime2088900, params->param1, 14, WRAP_SETUP_FUNCTION(Coudert, setup_function32))) + break; label_callback_14: - TIME_CHECK_CALLBACK(kTime2119500, params->param2, 15, setup_function32); + if (Entity::timeCheckCallback(kTime2119500, params->param2, 15, WRAP_SETUP_FUNCTION(Coudert, setup_function32))) + break; label_callback_15: - TIME_CHECK_CALLBACK(kTime2138400, params->param3, 16, setup_function32); + if (Entity::timeCheckCallback(kTime2138400, params->param3, 16, WRAP_SETUP_FUNCTION(Coudert, setup_function32))) + break; label_callback_16: - TIME_CHECK_CALLBACK(kTime2147400, params->param4, 17, setup_function32); + if (Entity::timeCheckCallback(kTime2147400, params->param4, 17, WRAP_SETUP_FUNCTION(Coudert, setup_function32))) + break; label_callback_17: - TIME_CHECK_CALLBACK(kTime2160000, params->param5, 18, setup_function32); + if (Entity::timeCheckCallback(kTime2160000, params->param5, 18, WRAP_SETUP_FUNCTION(Coudert, setup_function32))) + break; label_callback_18: - TIME_CHECK_CALLBACK(kTime2205000, params->param6, 19, setup_function32); + if (Entity::timeCheckCallback(kTime2205000, params->param6, 19, WRAP_SETUP_FUNCTION(Coudert, setup_function32))) + break; label_callback_19: if (ENTITY_PARAM(0, 2)) { @@ -3556,13 +3562,16 @@ label_callback_2: label_callback_3: if (!params->param1) { - TIME_CHECK_CALLBACK(kTime2394000, params->param4, 4, setup_function56); + if (Entity::timeCheckCallback(kTime2394000, params->param4, 4, WRAP_SETUP_FUNCTION(Coudert, setup_function56))) + break; label_callback_4: - TIME_CHECK_CALLBACK(kTime2434500, params->param5, 5, setup_function32); + if (Entity::timeCheckCallback(kTime2434500, params->param5, 5, WRAP_SETUP_FUNCTION(Coudert, setup_function32))) + break; label_callback_5: - TIME_CHECK_CALLBACK(kTime2448000, params->param6, 6, setup_function32); + if (Entity::timeCheckCallback(kTime2448000, params->param6, 6, WRAP_SETUP_FUNCTION(Coudert, setup_function32))) + break; } label_callback_6: diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 04ae6493c3..48856a7bc4 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -637,6 +637,57 @@ bool Entity::updateParameterCheck(uint ¶meter, uint timeType, uint delta) { return true; } +bool Entity::timeCheck(TimeValue timeValue, uint ¶meter, Common::Functor0 *function) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + (*function)(); + + return true; + } + + return false; +} + +bool Entity::timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + setCallback(callback); + (*function)(); + + return true; + } + + return false; +} + +bool Entity::timeCheckCallbackInventory(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + getData()->inventoryItem = kItemNone; + setCallback(callback); + (*function)(); + + return true; + } + + return false; +} + +bool Entity::timeCheckCar(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function) { + if ((getState()->time <= timeValue && !getEntities()->isPlayerInCar(kCarGreenSleeping)) || !parameter) + parameter = (uint)getState()->time + 75; + + if (getState()->time > timeValue || parameter < getState()->time) { + parameter = kTimeInvalid; + setCallback(callback); + (*function)(); + + return true; + } + + return false; +} + void Entity::timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action) { if (getState()->time > timeValue && !parameter) { parameter = 1; diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 76abab6c2f..6e55e21b74 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -82,6 +82,9 @@ struct SavePoint; #define ADD_NULL_FUNCTION() \ _callbacks.push_back(new ENTITY_CALLBACK(Entity, nullfunction, this)); +#define WRAP_SETUP_FUNCTION(className, method) \ + new Common::Functor0Mem(this, &className::method) + ////////////////////////////////////////////////////////////////////////// // Parameters macros ////////////////////////////////////////////////////////////////////////// @@ -903,10 +906,15 @@ protected: bool updateParameterCheck(uint ¶meter, uint timeType, uint delta); bool updateParameterTime(TimeValue timeValue, bool check, uint ¶meter, uint delta); + bool timeCheck(TimeValue timeValue, uint ¶meter, Common::Functor0 *function); + bool timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function); + bool timeCheckCallbackInventory(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function); + bool timeCheckCar(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function); void timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action); void timeCheckObject(TimeValue timeValue, uint ¶meter, ObjectIndex index, ObjectLocation location); bool timeCheckCallbackAction(TimeValue timeValue, uint ¶meter); bool timeCheckPlaySoundUpdatePosition(TimeValue timeValue, uint ¶meter, byte callback, const char* sound, EntityPosition position); + }; diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index e62eeb0c56..1d6c462a88 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -269,21 +269,6 @@ void class::setup_##name() { \ ////////////////////////////////////////////////////////////////////////// // Time check macros ////////////////////////////////////////////////////////////////////////// -#define TIME_CHECK(timeValue, parameter, function) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - function(); \ - break; \ - } - -#define TIME_CHECK_CALLBACK(timeValue, parameter, callback, function) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - setCallback(callback); \ - function(); \ - break; \ - } - #define TIME_CHECK_CALLBACK_1(timeValue, parameter, callback, function, param1) \ if (getState()->time > timeValue && !parameter) { \ parameter = 1; \ @@ -308,26 +293,6 @@ void class::setup_##name() { \ break; \ } -#define TIME_CHECK_CALLBACK_INVENTORY(timeValue, parameter, callback, function) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - getData()->inventoryItem = kItemNone; \ - setCallback(callback); \ - function(); \ - break; \ - } - -#define TIME_CHECK_CAR(timeValue, parameter, callback, function) {\ - if ((getState()->time <= timeValue && !getEntities()->isPlayerInCar(kCarGreenSleeping)) || !parameter) \ - parameter = (uint)getState()->time + 75; \ - if (getState()->time > timeValue || parameter < getState()->time) { \ - parameter = kTimeInvalid; \ - setCallback(callback); \ - function(); \ - break; \ - } \ -} - } // End of namespace LastExpress #endif // LASTEXPRESS_ENTITY_INTERN_H diff --git a/engines/lastexpress/entities/francois.cpp b/engines/lastexpress/entities/francois.cpp index e4d401d202..89fdcaf668 100644 --- a/engines/lastexpress/entities/francois.cpp +++ b/engines/lastexpress/entities/francois.cpp @@ -848,7 +848,7 @@ IMPLEMENT_FUNCTION(17, Francois, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Francois, setup_chapter1Handler)); break; case kActionDefault: @@ -883,7 +883,7 @@ IMPLEMENT_FUNCTION(19, Francois, function19) break; case kActionNone: - TIME_CHECK_CALLBACK(kTime1161000, params->param1, 2, setup_function12); + Entity::timeCheckCallback(kTime1161000, params->param1, 2, WRAP_SETUP_FUNCTION(Francois, setup_function12)); break; case kAction101107728: @@ -981,7 +981,8 @@ label_callback_1: TIME_CHECK_CALLBACK_1(kTime1764000, params->param1, 2, setup_playSound, "Fra2011"); label_callback_2: - TIME_CHECK_CALLBACK(kTime1800000, params->param2, 3, setup_function13); + if (Entity::timeCheckCallback(kTime1800000, params->param2, 3, WRAP_SETUP_FUNCTION(Francois, setup_function13))) + break; label_callback_3: if (!getInventory()->hasItem(kItemWhistle) && getInventory()->get(kItemWhistle)->location != kObjectLocation3) { @@ -1085,25 +1086,32 @@ IMPLEMENT_FUNCTION(25, Francois, chapter3Handler) } label_callback_2: - TIME_CHECK_CALLBACK(kTime2025000, params->param3, 3, setup_function12); + if (Entity::timeCheckCallback(kTime2025000, params->param3, 3, WRAP_SETUP_FUNCTION(Francois, setup_function12))) + break; label_callback_3: - TIME_CHECK_CALLBACK(kTime2052000, params->param4, 4, setup_function12); + if (Entity::timeCheckCallback(kTime2052000, params->param4, 4, WRAP_SETUP_FUNCTION(Francois, setup_function12))) + break; label_callback_4: - TIME_CHECK_CALLBACK(kTime2079000, params->param5, 5, setup_function12); + if (Entity::timeCheckCallback(kTime2079000, params->param5, 5, WRAP_SETUP_FUNCTION(Francois, setup_function12))) + break; label_callback_5: - TIME_CHECK_CALLBACK(kTime2092500, params->param6, 6, setup_function12); + if (Entity::timeCheckCallback(kTime2092500, params->param6, 6, WRAP_SETUP_FUNCTION(Francois, setup_function12))) + break; label_callback_6: - TIME_CHECK_CALLBACK(kTime2173500, params->param7, 7, setup_function12); + if (Entity::timeCheckCallback(kTime2173500, params->param7, 7, WRAP_SETUP_FUNCTION(Francois, setup_function12))) + break; label_callback_7: - TIME_CHECK_CALLBACK(kTime2182500, params->param8, 8, setup_function12); + if (Entity::timeCheckCallback(kTime2182500, params->param8, 8, WRAP_SETUP_FUNCTION(Francois, setup_function12))) + break; label_callback_8: - TIME_CHECK_CALLBACK(kTime2241000, CURRENT_PARAM(1, 1), 9, setup_function12); + if (Entity::timeCheckCallback(kTime2241000, CURRENT_PARAM(1, 1), 9, WRAP_SETUP_FUNCTION(Francois, setup_function12))) + break; label_callback_9: if (!getInventory()->hasItem(kItemWhistle) && getInventory()->get(kItemWhistle)->location != kObjectLocation3) { diff --git a/engines/lastexpress/entities/gendarmes.cpp b/engines/lastexpress/entities/gendarmes.cpp index 22697b396c..a912fa4ecb 100644 --- a/engines/lastexpress/entities/gendarmes.cpp +++ b/engines/lastexpress/entities/gendarmes.cpp @@ -66,7 +66,7 @@ IMPLEMENT_FUNCTION(2, Gendarmes, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Gendarmes, setup_chapter1Handler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/hadija.cpp b/engines/lastexpress/entities/hadija.cpp index 62badc46a6..e9abcd888a 100644 --- a/engines/lastexpress/entities/hadija.cpp +++ b/engines/lastexpress/entities/hadija.cpp @@ -111,7 +111,7 @@ IMPLEMENT_FUNCTION(10, Hadija, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Hadija, setup_chapter1Handler)); break; case kActionDefault: @@ -134,7 +134,8 @@ IMPLEMENT_FUNCTION(11, Hadija, chapter1Handler) break; label_callback1: - TIME_CHECK_CALLBACK(kTime1084500, params->param2, 2, setup_compartment6to8); + if (Entity::timeCheckCallback(kTime1084500, params->param2, 2, WRAP_SETUP_FUNCTION(Hadija, setup_compartment6to8))) + break; label_callback2: if (params->param3 != kTimeInvalid && getState()->time > kTime1093500) { @@ -162,7 +163,8 @@ label_callback2: } label_callback3: - TIME_CHECK_CALLBACK(kTime1156500, params->param4, 4, setup_compartment8to6); + if (Entity::timeCheckCallback(kTime1156500, params->param4, 4, WRAP_SETUP_FUNCTION(Hadija, setup_compartment8to6))) + break; label_callback4: if (params->param5 != kTimeInvalid && getState()->time > kTime1165500) { @@ -252,7 +254,7 @@ IMPLEMENT_FUNCTION(14, Hadija, chapter2Handler) } if (params->param2 == kTimeInvalid || getState()->time <= kTime1786500) { - TIME_CHECK_CALLBACK(kTime1822500, params->param3, 2, setup_compartment8to6); + Entity::timeCheckCallback(kTime1822500, params->param3, 2, WRAP_SETUP_FUNCTION(Hadija, setup_compartment8to6)); break; } @@ -262,7 +264,7 @@ IMPLEMENT_FUNCTION(14, Hadija, chapter2Handler) params->param2 = (uint)getState()->time + 75; if (params->param2 >= getState()->time) { - TIME_CHECK_CALLBACK(kTime1822500, params->param3, 2, setup_compartment8to6); + Entity::timeCheckCallback(kTime1822500, params->param3, 2, WRAP_SETUP_FUNCTION(Hadija, setup_compartment8to6)); break; } } @@ -279,7 +281,7 @@ IMPLEMENT_FUNCTION(14, Hadija, chapter2Handler) break; case 1: - TIME_CHECK_CALLBACK(kTime1822500, params->param3, 2, setup_compartment8to6); + Entity::timeCheckCallback(kTime1822500, params->param3, 2, WRAP_SETUP_FUNCTION(Hadija, setup_compartment8to6)); break; case 2: @@ -319,20 +321,26 @@ IMPLEMENT_FUNCTION(16, Hadija, chapter3Handler) break; case kActionNone: - TIME_CHECK_CALLBACK(kTime1998000, params->param1, 1, setup_compartment6to8); + if (Entity::timeCheckCallback(kTime1998000, params->param1, 1, WRAP_SETUP_FUNCTION(Hadija, setup_compartment6to8))) + break; label_callback1: - TIME_CHECK_CALLBACK(kTime2020500, params->param2, 2, setup_compartment8to6); + if (Entity::timeCheckCallback(kTime2020500, params->param2, 2, WRAP_SETUP_FUNCTION(Hadija, setup_compartment8to6))) + break; label_callback2: - TIME_CHECK_CALLBACK(kTime2079000, params->param3, 3, setup_compartment6to8); + if (Entity::timeCheckCallback(kTime2079000, params->param3, 3, WRAP_SETUP_FUNCTION(Hadija, setup_compartment6to8))) + break; label_callback3: - TIME_CHECK_CALLBACK(kTime2187000, params->param4, 4, setup_compartment8to6); + if (Entity::timeCheckCallback(kTime2187000, params->param4, 4, WRAP_SETUP_FUNCTION(Hadija, setup_compartment8to6))) + break; label_callback4: - if (params->param5 != kTimeInvalid && getState()->time > kTime2196000) - TIME_CHECK_CAR(kTime2254500, params->param5, 5, setup_compartment6); + if (params->param5 != kTimeInvalid && getState()->time > kTime2196000) { + if (Entity::timeCheckCar(kTime2254500, params->param5, 5, WRAP_SETUP_FUNCTION(Hadija, setup_compartment6))) + break; + } break; case kActionDefault: @@ -385,18 +393,24 @@ IMPLEMENT_FUNCTION(18, Hadija, chapter4Handler) break; case kActionNone: - if (params->param1 != kTimeInvalid) - TIME_CHECK_CAR(kTime1714500, params->param1, 1, setup_compartment6); + if (params->param1 != kTimeInvalid) { + if (Entity::timeCheckCar(kTime1714500, params->param1, 1, WRAP_SETUP_FUNCTION(Hadija, setup_compartment6))) + break; + } label_callback1: - TIME_CHECK_CALLBACK(kTime2367000, params->param2, 2, setup_compartment6to8); + if (Entity::timeCheckCallback(kTime2367000, params->param2, 2, WRAP_SETUP_FUNCTION(Hadija, setup_compartment6to8))) + break; label_callback2: - TIME_CHECK_CALLBACK(kTime2421000, params->param3, 3, setup_compartment8to6); + if (Entity::timeCheckCallback(kTime2421000, params->param3, 3, WRAP_SETUP_FUNCTION(Hadija, setup_compartment8to6))) + break; label_callback3: - if (params->param4 != kTimeInvalid && getState()->time > kTime2425500) - TIME_CHECK_CAR(kTime2484000, params->param4, 4, setup_compartment6); + if (params->param4 != kTimeInvalid && getState()->time > kTime2425500) { + if (Entity::timeCheckCar(kTime2484000, params->param4, 4, WRAP_SETUP_FUNCTION(Hadija, setup_compartment6))) + break; + } break; case kActionCallback: diff --git a/engines/lastexpress/entities/ivo.cpp b/engines/lastexpress/entities/ivo.cpp index cb0fb92b74..c53f4689fb 100644 --- a/engines/lastexpress/entities/ivo.cpp +++ b/engines/lastexpress/entities/ivo.cpp @@ -246,7 +246,7 @@ IMPLEMENT_FUNCTION(14, Ivo, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Ivo, setup_chapter1Handler)); break; case kActionDefault: @@ -371,7 +371,7 @@ IMPLEMENT_FUNCTION(18, Ivo, chapter2) break; case kActionNone: - TIME_CHECK(kTime1777500, params->param1, setup_function19); + Entity::timeCheck(kTime1777500, params->param1, WRAP_SETUP_FUNCTION(Ivo, setup_function19)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/kahina.cpp b/engines/lastexpress/entities/kahina.cpp index 08f845f5ba..7860836a26 100644 --- a/engines/lastexpress/entities/kahina.cpp +++ b/engines/lastexpress/entities/kahina.cpp @@ -247,7 +247,7 @@ IMPLEMENT_FUNCTION(10, Kahina, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Kahina, setup_chapter1Handler)); break; case kActionDefault: @@ -280,7 +280,7 @@ IMPLEMENT_FUNCTION(12, Kahina, function12) break; case kActionNone: - TIME_CHECK(kTime1485000, params->param2, setup_function13); + Entity::timeCheck(kTime1485000, params->param2, WRAP_SETUP_FUNCTION(Kahina, setup_function13)); break; case kActionKnock: diff --git a/engines/lastexpress/entities/kronos.cpp b/engines/lastexpress/entities/kronos.cpp index 5dd790ce12..26ce3ca424 100644 --- a/engines/lastexpress/entities/kronos.cpp +++ b/engines/lastexpress/entities/kronos.cpp @@ -126,7 +126,7 @@ IMPLEMENT_FUNCTION(7, Kronos, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Kronos, setup_chapter1Handler)); break; case kActionDefault: @@ -147,7 +147,7 @@ IMPLEMENT_FUNCTION(8, Kronos, chapter1Handler) break; case kActionNone: - TIME_CHECK(kTime1489500, params->param2, setup_function11); + Entity::timeCheck(kTime1489500, params->param2, WRAP_SETUP_FUNCTION(Kronos, setup_function11)); break; case kAction171849314: @@ -189,7 +189,7 @@ IMPLEMENT_FUNCTION(10, Kronos, function10) break; case kActionNone: - TIME_CHECK(kTime1489500, params->param1, setup_function11); + Entity::timeCheck(kTime1489500, params->param1, WRAP_SETUP_FUNCTION(Kronos, setup_function11)); break; case kActionDefault: @@ -405,8 +405,7 @@ IMPLEMENT_FUNCTION(18, Kronos, function18) params->param2 = 1; } - TIME_CHECK(kTime2106000, params->param3, setup_function19) - else { + if (!Entity::timeCheck(kTime2106000, params->param3, WRAP_SETUP_FUNCTION(Kronos, setup_function19))) { if (params->param1 && getEntities()->isInKronosSanctum(kEntityPlayer)) { setCallback(1); setup_savegame(kSavegameTypeEvent, kEventKahinaPunchSuite4); diff --git a/engines/lastexpress/entities/mahmud.cpp b/engines/lastexpress/entities/mahmud.cpp index 1e7df5c870..af86ef8cdd 100644 --- a/engines/lastexpress/entities/mahmud.cpp +++ b/engines/lastexpress/entities/mahmud.cpp @@ -560,7 +560,8 @@ IMPLEMENT_FUNCTION(14, Mahmud, chaptersHandler) if (!params->param2 && getProgress().chapter == kChapter1) { - TIME_CHECK_CALLBACK(kTime1098000, params->param6, 1, setup_function13); + if (Entity::timeCheckCallback(kTime1098000, params->param6, 1, WRAP_SETUP_FUNCTION(Mahmud, setup_function13))) + break; if (!getSoundQueue()->isBuffered("HAR1104") && getState()->time > kTime1167300 && !params->param7) { params->param7 = 1; @@ -733,7 +734,7 @@ IMPLEMENT_FUNCTION(15, Mahmud, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chaptersHandler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Mahmud, setup_chaptersHandler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/max.cpp b/engines/lastexpress/entities/max.cpp index 5c43346cde..abd2aae9e4 100644 --- a/engines/lastexpress/entities/max.cpp +++ b/engines/lastexpress/entities/max.cpp @@ -324,7 +324,7 @@ IMPLEMENT_FUNCTION(10, Max, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter12_handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Max, setup_chapter12_handler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index 9d9225f49b..b6ea86cd0e 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -2498,7 +2498,7 @@ IMPLEMENT_FUNCTION(34, Mertens, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Mertens, setup_chapter1Handler)); break; case kActionDefault: @@ -3535,16 +3535,18 @@ label_callback_6: TIME_CHECK_CALLBACK_1(kTime1971000, params->param1, 7, setup_function28, "CON3012"); label_callback_7: - TIME_CHECK_CALLBACK(kTime2117700, params->param2, 8, setup_function32); + if (Entity::timeCheckCallback(kTime2117700, params->param2, 8, WRAP_SETUP_FUNCTION(Mertens, setup_function32))) + break; label_callback_8: TIME_CHECK_CALLBACK_1(kTime2124000, params->param3, 9, setup_function28, "CON2010"); label_callback_9: - TIME_CHECK_CALLBACK(kTime2146500, params->param4, 10, setup_function32); + if (Entity::timeCheckCallback(kTime2146500, params->param4, 10, WRAP_SETUP_FUNCTION(Mertens, setup_function32))) + break; label_callback_10: - TIME_CHECK_CALLBACK(kTime2169000, params->param5, 11, setup_function32); + Entity::timeCheckCallback(kTime2169000, params->param5, 11, WRAP_SETUP_FUNCTION(Mertens, setup_function32)); break; case kAction11: @@ -3727,16 +3729,20 @@ label_callback_3: label_callback_4: if (!params->param1) { - TIME_CHECK_CALLBACK(kTime2403000, params->param2, 5, setup_function49); + if (Entity::timeCheckCallback(kTime2403000, params->param2, 5, WRAP_SETUP_FUNCTION(Mertens, setup_function49))) + break; label_callback_5: - TIME_CHECK_CALLBACK(kTime2430000, params->param3, 6, setup_function32); + if (Entity::timeCheckCallback(kTime2430000, params->param3, 6, WRAP_SETUP_FUNCTION(Mertens, setup_function32))) + break; label_callback_6: - TIME_CHECK_CALLBACK(kTime2439000, params->param4, 7, setup_function32); + if (Entity::timeCheckCallback(kTime2439000, params->param4, 7, WRAP_SETUP_FUNCTION(Mertens, setup_function32))) + break; label_callback_7: - TIME_CHECK_CALLBACK(kTime2448000, params->param5, 8, setup_function32); + if (Entity::timeCheckCallback(kTime2448000, params->param5, 8, WRAP_SETUP_FUNCTION(Mertens, setup_function32))) + break; } label_callback_8: diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp index 5c5d481938..519a613497 100644 --- a/engines/lastexpress/entities/milos.cpp +++ b/engines/lastexpress/entities/milos.cpp @@ -362,7 +362,7 @@ IMPLEMENT_FUNCTION(12, Milos, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Milos, setup_chapter1Handler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/mmeboutarel.cpp b/engines/lastexpress/entities/mmeboutarel.cpp index 888adeb372..950644cb8f 100644 --- a/engines/lastexpress/entities/mmeboutarel.cpp +++ b/engines/lastexpress/entities/mmeboutarel.cpp @@ -244,7 +244,7 @@ IMPLEMENT_FUNCTION(10, MmeBoutarel, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(MmeBoutarel, setup_chapter1Handler)); break; case kActionDefault: @@ -424,7 +424,8 @@ label_callback_1: } } - TIME_CHECK(kTime1094400, params->param8, setup_function14); + if (Entity::timeCheck(kTime1094400, params->param8, WRAP_SETUP_FUNCTION(MmeBoutarel, setup_function14))) + break; if (params->param4) { if (!Entity::updateParameter(CURRENT_PARAM(1, 1), getState()->timeTicks, 75)) @@ -1065,7 +1066,8 @@ IMPLEMENT_FUNCTION(24, MmeBoutarel, function24) break; case kActionNone: - TIME_CHECK(kTime2470500, params->param4, setup_function25); + if (Entity::timeCheck(kTime2470500, params->param4, WRAP_SETUP_FUNCTION(MmeBoutarel, setup_function25))) + break; if (params->param2) { if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75)) diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index c0c22fa1da..5ad8a1b985 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -655,7 +655,7 @@ IMPLEMENT_FUNCTION(21, Rebecca, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Rebecca, setup_chapter1Handler)); break; case kActionDefault: @@ -848,7 +848,8 @@ IMPLEMENT_FUNCTION(24, Rebecca, function24) if (!params->param1) break; - TIME_CHECK_CALLBACK(kTime1165500, params->param3, 6, setup_function19); + if (Entity::timeCheckCallback(kTime1165500, params->param3, 6, WRAP_SETUP_FUNCTION(Rebecca, setup_function19))) + break; if (params->param4 != kTimeInvalid) { if (getState()->time <= kTime1161000) { @@ -1224,7 +1225,7 @@ IMPLEMENT_FUNCTION(34, Rebecca, function34) params->param2 = (uint)getState()->time; if (params->param2 >= getState()->time) { - TIME_CHECK_CALLBACK(kTime2052000, params->param3, 1, setup_function19); + Entity::timeCheckCallback(kTime2052000, params->param3, 1, WRAP_SETUP_FUNCTION(Rebecca, setup_function19)); break; } } @@ -1234,7 +1235,7 @@ IMPLEMENT_FUNCTION(34, Rebecca, function34) getSavePoints()->push(kEntityRebecca, kEntityServers0, kAction223712416); } - TIME_CHECK_CALLBACK(kTime2052000, params->param3, 1, setup_function19); + Entity::timeCheckCallback(kTime2052000, params->param3, 1, WRAP_SETUP_FUNCTION(Rebecca, setup_function19)); break; case kActionEndSound: @@ -1633,7 +1634,7 @@ label_next: label_callback_2: if (params->param2) - TIME_CHECK_CALLBACK(kTime2443500, params->param5, 3, setup_function19); + Entity::timeCheckCallback(kTime2443500, params->param5, 3, WRAP_SETUP_FUNCTION(Rebecca, setup_function19)); break; case kActionEndSound: diff --git a/engines/lastexpress/entities/salko.cpp b/engines/lastexpress/entities/salko.cpp index b799564b46..e8b4b4247b 100644 --- a/engines/lastexpress/entities/salko.cpp +++ b/engines/lastexpress/entities/salko.cpp @@ -156,7 +156,7 @@ IMPLEMENT_FUNCTION(9, Salko, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Salko, setup_chapter1Handler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/sophie.cpp b/engines/lastexpress/entities/sophie.cpp index 10c414763c..170090005f 100644 --- a/engines/lastexpress/entities/sophie.cpp +++ b/engines/lastexpress/entities/sophie.cpp @@ -179,7 +179,7 @@ IMPLEMENT_FUNCTION(4, Sophie, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chaptersHandler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Sophie, setup_chaptersHandler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp index b7c26bdd1c..432def6253 100644 --- a/engines/lastexpress/entities/tatiana.cpp +++ b/engines/lastexpress/entities/tatiana.cpp @@ -341,7 +341,7 @@ IMPLEMENT_FUNCTION(17, Tatiana, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Tatiana, setup_chapter1Handler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/vassili.cpp b/engines/lastexpress/entities/vassili.cpp index 5344e705f5..4695f8831f 100644 --- a/engines/lastexpress/entities/vassili.cpp +++ b/engines/lastexpress/entities/vassili.cpp @@ -83,7 +83,7 @@ IMPLEMENT_FUNCTION(4, Vassili, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Vassili, setup_chapter1Handler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp index f459b6f8e7..dfeae21338 100644 --- a/engines/lastexpress/entities/verges.cpp +++ b/engines/lastexpress/entities/verges.cpp @@ -572,7 +572,7 @@ IMPLEMENT_FUNCTION(18, Verges, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Verges, setup_chapter1Handler)); break; case kActionDefault: @@ -910,7 +910,8 @@ label_callback3: TIME_CHECK_CALLBACK_1(kTimeChapter1, params->param7, 4, setup_function9, "TRA1001"); label_callback4: - TIME_CHECK_CALLBACK(kTime1089000, params->param8, 5, setup_function12); + if (Entity::timeCheckCallback(kTime1089000, params->param8, 5, WRAP_SETUP_FUNCTION(Verges, setup_function12))) + break; params->param8 = 1; @@ -1445,7 +1446,8 @@ label_callback_4: TIME_CHECK_CALLBACK_1(kTime1998000, params->param2, 5, setup_function9, "Tra3010a"); label_callback_5: - TIME_CHECK_CALLBACK(kTime2016000, params->param3, 6, setup_function35); + if (Entity::timeCheckCallback(kTime2016000, params->param3, 6, WRAP_SETUP_FUNCTION(Verges, setup_function35))) + break; label_callback_6: TIME_CHECK_CALLBACK_1(kTime2070000, params->param4, 7, setup_function9, "Tra3002"); @@ -1457,7 +1459,7 @@ label_callback_8: TIME_CHECK_CALLBACK_1(kTime2173500, params->param6, 9, setup_function30, "Tra3012"); label_callback_9: - TIME_CHECK_CALLBACK(kTime2218500, params->param7, 10, setup_function32); + Entity::timeCheckCallback(kTime2218500, params->param7, 10, WRAP_SETUP_FUNCTION(Verges, setup_function32)); break; case kActionOpenDoor: diff --git a/engines/lastexpress/entities/vesna.cpp b/engines/lastexpress/entities/vesna.cpp index f54f0f3231..f29bce8b2b 100644 --- a/engines/lastexpress/entities/vesna.cpp +++ b/engines/lastexpress/entities/vesna.cpp @@ -255,7 +255,7 @@ IMPLEMENT_FUNCTION(12, Vesna, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Vesna, setup_chapter1Handler)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/yasmin.cpp b/engines/lastexpress/entities/yasmin.cpp index f2b4d2edd1..acacbb547b 100644 --- a/engines/lastexpress/entities/yasmin.cpp +++ b/engines/lastexpress/entities/yasmin.cpp @@ -184,7 +184,7 @@ IMPLEMENT_FUNCTION(8, Yasmin, chapter1) break; case kActionNone: - TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Yasmin, setup_chapter1Handler)); break; case kActionDefault: @@ -202,13 +202,20 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler) break; case kActionNone: - TIME_CHECK_CALLBACK(kTime1093500, params->param1, 1, setup_function6); - TIME_CHECK_CALLBACK(kTime1161000, params->param2, 3, setup_function7); + if (Entity::timeCheckCallback(kTime1093500, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_function6))) + break; + + if (Entity::timeCheckCallback(kTime1161000, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function7))) + break; + if (Entity::timeCheckPlaySoundUpdatePosition(kTime1162800, params->param3, 4, "Har1102", kPosition_4070)) break; + TIME_CHECK_CALLBACK_1(kTime1165500, params->param4, 5, setup_playSound, "Har1104"); + TIME_CHECK_CALLBACK_1(kTime1174500, params->param5, 6, setup_playSound, "Har1106"); - TIME_CHECK_CALLBACK(kTime1183500, params->param6, 7, setup_function6); + + Entity::timeCheckCallback(kTime1183500, params->param6, 7, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)); break; case kActionCallback: @@ -223,7 +230,8 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler) break; case 2: - TIME_CHECK_CALLBACK(kTime1161000, params->param2, 3, setup_function7); + if (Entity::timeCheckCallback(kTime1161000, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function7))) + break; // Fallback to case 3 case 3: @@ -240,7 +248,7 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler) // Fallback to case 6 case 6: - TIME_CHECK_CALLBACK(kTime1183500, params->param6, 7, setup_function6); + Entity::timeCheckCallback(kTime1183500, params->param6, 7, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)); break; } break; @@ -281,7 +289,8 @@ IMPLEMENT_FUNCTION(12, Yasmin, chapter2Handler) break; case kActionNone: - TIME_CHECK_CALLBACK(kTime1759500, params->param1, 1, setup_function7); + if (Entity::timeCheckCallback(kTime1759500, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_function7))) + break; if (getState()->time > kTime1800000 && !params->param2) { params->param2 = 1; @@ -334,9 +343,13 @@ IMPLEMENT_FUNCTION(14, Yasmin, chapter3Handler) break; case kActionNone: - TIME_CHECK_CALLBACK(kTime2062800, params->param1, 1, setup_function6); - TIME_CHECK_CALLBACK(kTime2106000, params->param2, 2, setup_function7); - TIME_CHECK_CALLBACK(kTime2160000, params->param3, 3, setup_function6); + if (Entity::timeCheckCallback(kTime2062800, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_function6))) + break; + + if (Entity::timeCheckCallback(kTime2106000, params->param2, 2, WRAP_SETUP_FUNCTION(Yasmin, setup_function7))) + break; + + Entity::timeCheckCallback(kTime2160000, params->param3, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)); break; case kActionCallback: @@ -345,11 +358,12 @@ IMPLEMENT_FUNCTION(14, Yasmin, chapter3Handler) break; case 1: - TIME_CHECK_CALLBACK(kTime2106000, params->param2, 2, setup_function7); + if (Entity::timeCheckCallback(kTime2106000, params->param2, 2, WRAP_SETUP_FUNCTION(Yasmin, setup_function7))) + break; // Fallback to case 2 case 2: - TIME_CHECK_CALLBACK(kTime2160000, params->param3, 3, setup_function6); + Entity::timeCheckCallback(kTime2160000, params->param3, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)); break; } break; @@ -381,8 +395,10 @@ IMPLEMENT_FUNCTION(16, Yasmin, chapter4Handler) break; case kActionNone: - TIME_CHECK_CALLBACK(kTime2457000, params->param1, 1, setup_function7); - TIME_CHECK_CALLBACK(kTime2479500, params->param2, 3, setup_function6); + if (Entity::timeCheckCallback(kTime2457000, params->param1, 1, WRAP_SETUP_FUNCTION(Yasmin, setup_function7))) + break; + + Entity::timeCheckCallback(kTime2479500, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)); break; case kActionCallback: @@ -397,7 +413,7 @@ IMPLEMENT_FUNCTION(16, Yasmin, chapter4Handler) break; case 2: - TIME_CHECK_CALLBACK(kTime2479500, params->param2, 3, setup_function6); + Entity::timeCheckCallback(kTime2479500, params->param2, 3, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)); break; } break; -- cgit v1.2.3 From 552e8d45b265f29d16a02d7a5b01803d1143ef94 Mon Sep 17 00:00:00 2001 From: Julien Date: Mon, 23 Jul 2012 14:31:33 -0400 Subject: LASTEXPRESS: Switch some warnings to debug console output --- engines/lastexpress/data/animation.cpp | 2 +- engines/lastexpress/game/action.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/lastexpress/data/animation.cpp b/engines/lastexpress/data/animation.cpp index 12968520bb..ce42acb8fe 100644 --- a/engines/lastexpress/data/animation.cpp +++ b/engines/lastexpress/data/animation.cpp @@ -248,7 +248,7 @@ void Animation::processChunkAudio(Common::SeekableReadStream *in, const Chunk &c // Read Snd header uint32 header1 = in->readUint32LE(); uint16 header2 = in->readUint16LE(); - warning("Start ADPCM: %d, %d", header1, header2); + debugC(4, kLastExpressDebugSound, "Start ADPCM: %d, %d", header1, header2); size -= 6; } diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp index 0ce75f16a4..1e5bc0ffd7 100644 --- a/engines/lastexpress/game/action.cpp +++ b/engines/lastexpress/game/action.cpp @@ -1739,14 +1739,14 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const { return kCursorBackward; case SceneHotspot::kActionKnockOnDoor: - warning("================================= DOOR %03d =================================", object); + debugC(2, kLastExpressDebugScenes, "================================= DOOR %03d =================================", object); if (object >= kObjectMax) return kCursorNormal; else return (CursorStyle)getObjects()->get(object).cursor; case SceneHotspot::kAction12: - warning("================================= OBJECT %03d =================================", object); + debugC(2, kLastExpressDebugScenes, "================================= OBJECT %03d =================================", object); if (object >= kObjectMax) return kCursorNormal; @@ -1756,7 +1756,7 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const { return kCursorNormal; case SceneHotspot::kActionPickItem: - warning("================================= ITEM %03d =================================", object); + debugC(2, kLastExpressDebugScenes, "================================= ITEM %03d =================================", object); if (object >= kObjectCompartmentA) return kCursorNormal; @@ -1767,7 +1767,7 @@ CursorStyle Action::getCursor(const SceneHotspot &hotspot) const { return kCursorNormal; case SceneHotspot::kActionDropItem: - warning("================================= ITEM %03d =================================", object); + debugC(2, kLastExpressDebugScenes, "================================= ITEM %03d =================================", object); if (object >= kObjectCompartmentA) return kCursorNormal; @@ -1884,7 +1884,7 @@ LABEL_KEY: // Handle compartment action case SceneHotspot::kActionCompartment: case SceneHotspot::kActionExitCompartment: - warning("================================= DOOR %03d =================================", object); + debugC(2, kLastExpressDebugScenes, "================================= DOOR %03d =================================", object); if (object >= kObjectMax) return kCursorNormal; -- cgit v1.2.3 From 7974b62b716343ff979447957b140f8e2b79f03c Mon Sep 17 00:00:00 2001 From: Julien Date: Mon, 23 Jul 2012 16:02:41 -0400 Subject: LASTEXPRESS: Reduce nesting in Entities::processEntity() --- engines/lastexpress/game/entities.cpp | 52 +++++++++++++++++------------------ 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/engines/lastexpress/game/entities.cpp b/engines/lastexpress/game/entities.cpp index 4cdefcd334..29cc7d889c 100644 --- a/engines/lastexpress/game/entities.cpp +++ b/engines/lastexpress/game/entities.cpp @@ -751,43 +751,41 @@ label_nosequence: if (data->frame->getInfo()->field_30 > (data->field_49B + 1) || (data->direction == kDirectionLeft && data->sequence->count() == 1)) { ++data->field_49B; - } else { - if (data->frame->getInfo()->field_30 > data->field_49B && !data->frame->getInfo()->keepPreviousFrame) { - ++data->field_49B; - } else { - if (data->frame->getInfo()->keepPreviousFrame == 1) - keepPreviousFrame = true; + } else if (data->frame->getInfo()->field_30 <= data->field_49B || data->frame->getInfo()->keepPreviousFrame) { + if (data->frame->getInfo()->keepPreviousFrame == 1) + keepPreviousFrame = true; - // Increment current frame - ++data->currentFrame; + // Increment current frame + ++data->currentFrame; - if (data->currentFrame > (int16)(data->sequence->count() - 1) || (data->field_4A9 && checkSequenceFromPosition(entityIndex))) { - - if (data->direction == kDirectionLeft) { - data->currentFrame = 0; - } else { - keepPreviousFrame = true; - drawNextSequence(entityIndex); + if (data->currentFrame > (int16)(data->sequence->count() - 1) || (data->field_4A9 && checkSequenceFromPosition(entityIndex))) { - if (getFlags()->flag_entities_0 || data->doProcessEntity) - return; + if (data->direction == kDirectionLeft) { + data->currentFrame = 0; + } else { + keepPreviousFrame = true; + drawNextSequence(entityIndex); - if (!data->sequence2) { - updateEntityPosition(entityIndex); - data->doProcessEntity = false; - return; - } + if (getFlags()->flag_entities_0 || data->doProcessEntity) + return; - copySequenceData(entityIndex); + if (!data->sequence2) { + updateEntityPosition(entityIndex); + data->doProcessEntity = false; + return; } + copySequenceData(entityIndex); } - processFrame(entityIndex, keepPreviousFrame, false); - - if (getFlags()->flag_entities_0 || data->doProcessEntity) - return; } + + processFrame(entityIndex, keepPreviousFrame, false); + + if (getFlags()->flag_entities_0 || data->doProcessEntity) + return; + } else { + ++data->field_49B; } incrementDirectionCounter(data); -- cgit v1.2.3 From 7450ae23fb3c7afcaa33a35390e4c2c03238a024 Mon Sep 17 00:00:00 2001 From: Julien Date: Tue, 24 Jul 2012 22:24:59 -0400 Subject: LASTEXPRESS: Move RESET_ENTITY_STATE macro to entity.h --- engines/lastexpress/entities/entity.h | 8 ++++++++ engines/lastexpress/entities/entity_intern.h | 7 ------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 6e55e21b74..785e355481 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -94,6 +94,14 @@ struct SavePoint; #define ENTITY_PARAM(index, id) \ ((EntityData::EntityParametersIIII*)_data->getParameters(8, index))->param##id +////////////////////////////////////////////////////////////////////////// +// Misc +////////////////////////////////////////////////////////////////////////// +#define RESET_ENTITY_STATE(entity, class, function) \ + getEntities()->resetState(entity); \ + ((class *)getEntities()->get(entity))->function(); + + ////////////////////////////////////////////////////////////////////////// class EntityData : Common::Serializable { diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 1d6c462a88..306dbf8376 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -259,13 +259,6 @@ void class::setup_##name() { \ debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); -////////////////////////////////////////////////////////////////////////// -// Misc -////////////////////////////////////////////////////////////////////////// -#define RESET_ENTITY_STATE(entity, class, function) \ - getEntities()->resetState(entity); \ - ((class *)getEntities()->get(entity))->function(); - ////////////////////////////////////////////////////////////////////////// // Time check macros ////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3 From 37770212c0be36de982e16448fb62aa370a70f6a Mon Sep 17 00:00:00 2001 From: Julien Date: Tue, 24 Jul 2012 22:39:52 -0400 Subject: LASTEXPRESS: Remove TIME_CHECK_CALLBACK_2 macro --- engines/lastexpress/entities/chapters.cpp | 72 +++++++++++++++++++++------- engines/lastexpress/entities/chapters.h | 1 + engines/lastexpress/entities/entity_intern.h | 8 ---- engines/lastexpress/entities/rebecca.cpp | 8 +++- 4 files changed, 63 insertions(+), 26 deletions(-) diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp index c5631173b4..ac9387bd78 100644 --- a/engines/lastexpress/entities/chapters.cpp +++ b/engines/lastexpress/entities/chapters.cpp @@ -403,11 +403,18 @@ IMPLEMENT_FUNCTION(8, Chapters, chapter1Handler) label_processStations: // Process stations - TIME_CHECK_CALLBACK_2(kTime1039500, params->param7, 1, setup_savegame, kSavegameTypeTime, kTimeNone); + if (getState()->time > kTime1039500 && !params->param7) { + params->param7 = 1; + setCallback(1); + setup_savegame(kSavegameTypeTime, kTimeNone); + + break; + } label_enter_epernay: // Entering Epernay station - TIME_CHECK_CALLBACK_2(kTimeEnterEpernay, params->param8, 1, setup_enterStation, "Epernay", kCityEpernay); + if (timeCheckEnterStation(kTimeEnterEpernay, params->param8, 1, "Epernay", kCityEpernay)) + break; label_exit_epernay: // Exiting Epernay station @@ -437,7 +444,8 @@ label_enter_chalons: goto label_exit_strasbourg; // Entering Chalons station - TIME_CHECK_CALLBACK_2(kTimeEnterChalons, CURRENT_PARAM(1, 3), 5, setup_enterStation, "Chalons", kCityChalons); + if (timeCheckEnterStation(kTimeEnterChalons, CURRENT_PARAM(1, 3), 5, "Chalons", kCityChalons)) + break; label_exit_chalons: // Exiting Chalons station @@ -445,7 +453,8 @@ label_exit_chalons: label_enter_barleduc: // Entering Bar-Le-Duc station - TIME_CHECK_CALLBACK_2(kTimeCityBarLeDuc, CURRENT_PARAM(1, 5), 7, setup_enterStation, "BarLeDuc", kCityBarleduc); + if (timeCheckEnterStation(kTimeCityBarLeDuc, CURRENT_PARAM(1, 5), 7, "BarLeDuc", kCityBarleduc)) + break; label_exit_barleduc: // Exiting Bar-Le-Duc station @@ -458,7 +467,8 @@ label_enter_nancy: } // Entering Nancy station - TIME_CHECK_CALLBACK_2(kTimeCityNancy, CURRENT_PARAM(1, 8), 9, setup_enterStation, "Nancy", kCityNancy); + if (timeCheckEnterStation(kTimeCityNancy, CURRENT_PARAM(1, 8), 9, "Nancy", kCityNancy)) + break; label_exit_nancy: // Exiting Nancy station @@ -466,7 +476,8 @@ label_exit_nancy: label_enter_luneville: // Entering Luneville station - TIME_CHECK_CALLBACK_2(kTimeCityLuneville, CURRENT_PARAM(2, 2), 11, setup_enterStation, "Luneville", kCityLuneville); + if (timeCheckEnterStation(kTimeCityLuneville, CURRENT_PARAM(2, 2), 11, "Luneville", kCityLuneville)) + break; label_exit_luneville: // Exiting Luneville station @@ -474,7 +485,8 @@ label_exit_luneville: label_enter_avricourt: // Entering Avricourt station - TIME_CHECK_CALLBACK_2(kTimeCityAvricourt, CURRENT_PARAM(2, 4), 13, setup_enterStation, "Avricourt", kCityAvricourt); + if (timeCheckEnterStation(kTimeCityAvricourt, CURRENT_PARAM(2, 4), 13, "Avricourt", kCityAvricourt)) + break; label_exit_avricourt: // Exiting Avricourt station @@ -482,14 +494,21 @@ label_exit_avricourt: label_enter_deutschavricourt: // Entering Deutsch-Avricourt station - TIME_CHECK_CALLBACK_2(kTimeCityDeutschAvricourt, CURRENT_PARAM(2, 6), 15, setup_enterStation, "DeutschA", kCityDeutschAvricourt); + if (timeCheckEnterStation(kTimeCityDeutschAvricourt, CURRENT_PARAM(2, 6), 15, "DeutschA", kCityDeutschAvricourt)) + break; label_exit_deutschavricourt: // Exiting Avricourt station TIME_CHECK_CALLBACK_1(kTimeExitDeutschAvricourt, CURRENT_PARAM(2, 7), 16, setup_exitStation, "DeutschA"); label_enter_strasbourg: - TIME_CHECK_CALLBACK_2(kTimeCityStrasbourg, CURRENT_PARAM(2, 8), 17, setup_savegame, kSavegameTypeTime, kTimeNone); + if (getState()->time > kTimeCityStrasbourg && !CURRENT_PARAM(2, 8)) { + CURRENT_PARAM(2, 8) = 1; + setCallback(17); + setup_savegame(kSavegameTypeTime, kTimeNone); + + break; + } label_exit_strasbourg: // Exiting Strasbourg station @@ -497,7 +516,8 @@ label_exit_strasbourg: label_enter_badenoos: // Entering Baden Oos station - TIME_CHECK_CALLBACK_2(kTimeCityBadenOos, CURRENT_PARAM(3, 2), 20, setup_enterStation, "BadenOos", kCityBadenOos); + if (timeCheckEnterStation(kTimeCityBadenOos, CURRENT_PARAM(3, 2), 20, "BadenOos", kCityBadenOos)) + break; label_exit_badenoos: // Exiting Baden Oos station @@ -922,25 +942,29 @@ IMPLEMENT_FUNCTION(15, Chapters, chapter3Handler) params->param5 = 0; } - TIME_CHECK_CALLBACK_2(kTimeEnterSalzbourg, params->param6, 1, setup_enterStation, "Salzburg", kCitySalzbourg); + if (timeCheckEnterStation(kTimeEnterSalzbourg, params->param6, 1, "Salzburg", kCitySalzbourg)) + break; label_callback_1: TIME_CHECK_CALLBACK_1(kTimeExitSalzbourg, params->param7, 2, setup_exitStation, "Salzburg"); label_callback_2: - TIME_CHECK_CALLBACK_2(kTimeEnterAttnangPuchheim, params->param8, 3, setup_enterStation, "Attnang", kCityAttnangPuchheim); + if (timeCheckEnterStation(kTimeEnterAttnangPuchheim, params->param8, 3, "Attnang", kCityAttnangPuchheim)) + break; label_callback_3: TIME_CHECK_CALLBACK_1(kTimeExitAttnangPuchheim, CURRENT_PARAM(1, 1), 4, setup_exitStation, "Attnang"); label_callback_4: - TIME_CHECK_CALLBACK_2(kTimeEnterWels, CURRENT_PARAM(1, 2), 5, setup_enterStation, "Wels", kCityWels); + if (timeCheckEnterStation(kTimeEnterWels, CURRENT_PARAM(1, 2), 5, "Wels", kCityWels)) + break; label_callback_5: TIME_CHECK_CALLBACK_1(kTimeEnterWels, CURRENT_PARAM(1, 3), 6, setup_exitStation, "Wels"); label_callback_6: - TIME_CHECK_CALLBACK_2(kTimeEnterLinz, CURRENT_PARAM(1, 4), 7, setup_enterStation, "Linz", kCityLinz); + if (timeCheckEnterStation(kTimeEnterLinz, CURRENT_PARAM(1, 4), 7, "Linz", kCityLinz)) + break; label_callback_7: TIME_CHECK_CALLBACK_1(kTimeCityLinz, CURRENT_PARAM(1, 5), 8, setup_exitStation, "Linz"); @@ -951,7 +975,7 @@ label_callback_8: getState()->timeDelta = 5; } - TIME_CHECK_CALLBACK_2(kTimeCityVienna, CURRENT_PARAM(1, 7), 9, setup_enterStation, "Vienna", kCityVienna); + timeCheckEnterStation(kTimeCityVienna, CURRENT_PARAM(1, 7), 9, "Vienna", kCityVienna); break; case kActionEndSound: @@ -1221,7 +1245,8 @@ IMPLEMENT_FUNCTION(19, Chapters, chapter4Handler) params->param7 = 0; } - TIME_CHECK_CALLBACK_2(kTimeEnterPoszony, params->param8, 1, setup_enterStation, "Pozsony", kCityPoszony); + if (timeCheckEnterStation(kTimeEnterPoszony, params->param8, 1, "Pozsony", kCityPoszony)) + break; label_exitPozsony: TIME_CHECK_CALLBACK_1(kTimeExitPoszony, CURRENT_PARAM(1, 1), 2, setup_exitStation, "Pozsony"); @@ -1237,7 +1262,8 @@ label_enterGalanta: if (params->param1) goto label_callback_4; - TIME_CHECK_CALLBACK_2(kTimeEnterGalanta, CURRENT_PARAM(1, 3), 3, setup_enterStation, "Galanta", kCityGalanta); + if (timeCheckEnterStation(kTimeEnterGalanta, CURRENT_PARAM(1, 3), 3, "Galanta", kCityGalanta)) + break; label_exitGalanta: TIME_CHECK_CALLBACK_1(kTimeExitGalanta, CURRENT_PARAM(1, 4), 4, setup_exitStation, "Galanta"); @@ -1817,4 +1843,16 @@ void Chapters::playSteam() { ENTITY_PARAM(0, 2) = 0; } +bool Chapters::timeCheckEnterStation(TimeValue timeValue, uint ¶meter, byte callback, const char *sequence, CityIndex cityIndex) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + setCallback(callback); + setup_enterStation(sequence, cityIndex); + + return true; + } + + return false; +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/chapters.h b/engines/lastexpress/entities/chapters.h index 62b8af9270..51e6444506 100644 --- a/engines/lastexpress/entities/chapters.h +++ b/engines/lastexpress/entities/chapters.h @@ -154,6 +154,7 @@ public: DECLARE_FUNCTION(chapter5Handler) private: + bool timeCheckEnterStation(TimeValue timeValue, uint ¶meter, byte callback, const char *sequence, CityIndex cityIndex); void enterExitStation(const SavePoint &savepoint, bool isEnteringStation); void enterExitHelper(bool isEnteringStation); void playSteam(); diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 306dbf8376..9818a20d64 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -270,14 +270,6 @@ void class::setup_##name() { \ break; \ } -#define TIME_CHECK_CALLBACK_2(timeValue, parameter, callback, function, param1, param2) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - setCallback(callback); \ - function(param1, param2); \ - break; \ - } - #define TIME_CHECK_CALLBACK_3(timeValue, parameter, callback, function, param1, param2, param3) \ if (getState()->time > timeValue && !parameter) { \ parameter = 1; \ diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index 5ad8a1b985..0dc201be71 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -774,7 +774,13 @@ IMPLEMENT_FUNCTION(23, Rebecca, function23) break; case kActionNone: - TIME_CHECK_CALLBACK_2(kTime1111500, params->param2, 3, setup_enterExitCompartment, "623De", kObjectCompartmentE); + if (getState()->time > kTime1111500 && !params->param2) { + params->param2 = 1; + setCallback(3); + setup_enterExitCompartment("623De", kObjectCompartmentE); + + break; + } break; case kActionDefault: -- cgit v1.2.3 From b6b98483c5117ee3cee0a52607e5f5f4acb7def7 Mon Sep 17 00:00:00 2001 From: Julien Date: Tue, 24 Jul 2012 22:47:42 -0400 Subject: LASTEXPRESS: Remove TIME_CHECK_CALLBACK_3 macro --- engines/lastexpress/entities/entity_intern.h | 8 -------- engines/lastexpress/entities/francois.cpp | 30 +++++++++++++++++++++++----- engines/lastexpress/entities/francois.h | 3 +++ engines/lastexpress/entities/rebecca.cpp | 7 ++++++- engines/lastexpress/entities/verges.cpp | 7 ++++++- 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 9818a20d64..f12f34ac74 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -270,14 +270,6 @@ void class::setup_##name() { \ break; \ } -#define TIME_CHECK_CALLBACK_3(timeValue, parameter, callback, function, param1, param2, param3) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - setCallback(callback); \ - function(param1, param2, param3); \ - break; \ - } - } // End of namespace LastExpress #endif // LASTEXPRESS_ENTITY_INTERN_H diff --git a/engines/lastexpress/entities/francois.cpp b/engines/lastexpress/entities/francois.cpp index 89fdcaf668..c39eb1197c 100644 --- a/engines/lastexpress/entities/francois.cpp +++ b/engines/lastexpress/entities/francois.cpp @@ -1007,10 +1007,11 @@ label_callback_5: } label_callback_6: - TIME_CHECK_CALLBACK_3(kTime1782000, params->param6, 7, setup_function14, kObjectCompartmentC, kPosition_6470, "c"); + if (timeCheckCallbackCompartment(kTime1782000, params->param6, 7, kObjectCompartmentC, kPosition_6470, "c")) + break; label_callback_7: - TIME_CHECK_CALLBACK_3(kTime1813500, params->param7, 8, setup_function14, kObjectCompartmentF, kPosition_4070, "f"); + timeCheckCallbackCompartment(kTime1813500, params->param7, 8, kObjectCompartmentF, kPosition_4070, "f"); break; case kActionCallback: @@ -1136,13 +1137,15 @@ label_callback_11: } label_callback_12: - TIME_CHECK_CALLBACK_3(kTime2040300, CURRENT_PARAM(1, 5), 13, setup_function14, kObjectCompartmentE, kPosition_4840, "e"); + if (timeCheckCallbackCompartment(kTime2040300, CURRENT_PARAM(1, 5), 13, kObjectCompartmentE, kPosition_4840, "e")) + break; label_callback_13: - TIME_CHECK_CALLBACK_3(kTime2040300, CURRENT_PARAM(1, 6), 14, setup_function14, kObjectCompartmentF, kPosition_4070, "f"); + if (timeCheckCallbackCompartment(kTime2040300, CURRENT_PARAM(1, 6), 14, kObjectCompartmentF, kPosition_4070, "f")) + break; label_callback_14: - TIME_CHECK_CALLBACK_3(kTime2040300, CURRENT_PARAM(1, 7), 15, setup_function14, kObjectCompartmentB, kPosition_7500, "b"); + timeCheckCallbackCompartment(kTime2040300, CURRENT_PARAM(1, 7), 15, kObjectCompartmentB, kPosition_7500, "b"); } } break; @@ -1298,4 +1301,21 @@ IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_NULL_FUNCTION(31, Francois) + +////////////////////////////////////////////////////////////////////////// +// Helper functions +////////////////////////////////////////////////////////////////////////// +bool Francois::timeCheckCallbackCompartment(TimeValue timeValue, uint ¶meter, byte callback, ObjectIndex compartment, EntityPosition position, const char* sequenceSuffix) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + setCallback(callback); + setup_function14(compartment, position, sequenceSuffix); + + return true; + } + + return false; +} + + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/francois.h b/engines/lastexpress/entities/francois.h index 19eca6fb50..09715dba67 100644 --- a/engines/lastexpress/entities/francois.h +++ b/engines/lastexpress/entities/francois.h @@ -160,6 +160,9 @@ public: DECLARE_FUNCTION(function30) DECLARE_NULL_FUNCTION() + +private: + bool timeCheckCallbackCompartment(TimeValue timeValue, uint ¶meter, byte callback, ObjectIndex compartment, EntityPosition position, const char* sequenceSuffix); }; } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index 0dc201be71..79d13a93f5 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -972,7 +972,12 @@ IMPLEMENT_FUNCTION(26, Rebecca, function26) break; case kActionNone: - TIME_CHECK_CALLBACK_3(kTime1224000, params->param2, 1, setup_updatePosition, "118H", kCarRestaurant, 52); + if (getState()->time > kTime1224000 && !params->param2) { + params->param2 = 1; + setCallback(1); + setup_updatePosition("118H", kCarRestaurant, 52); + break; + } if (params->param1) { if (!Entity::updateParameter(params->param3, getState()->timeTicks, 90)) diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp index dfeae21338..e6526870d7 100644 --- a/engines/lastexpress/entities/verges.cpp +++ b/engines/lastexpress/entities/verges.cpp @@ -1280,7 +1280,12 @@ IMPLEMENT_FUNCTION(32, Verges, function32) break; case kActionNone: - TIME_CHECK_CALLBACK_3(kTime2263500, params->param1, 5, setup_function10, kCarRedSleeping, kPosition_9460, "TRA3006"); + if (getState()->time > kTime2263500 && !params->param1) { + params->param1 = 1; + setCallback(5); + setup_function10(kCarRedSleeping, kPosition_9460, "TRA3006"); + break; + } break; case kActionDefault: -- cgit v1.2.3 From 938961e23737e5ff19aee61e1ec6dd6e19ca0529 Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 25 Jul 2012 17:55:17 -0400 Subject: LASTEXPRESS: Remove TIME_CHECK_CALLBACK_1 macro --- engines/lastexpress/entities/alouan.cpp | 3 +- engines/lastexpress/entities/august.cpp | 2 +- engines/lastexpress/entities/boutarel.cpp | 12 +++---- engines/lastexpress/entities/chapters.cpp | 54 ++++++++++++++++++++-------- engines/lastexpress/entities/chapters.h | 1 + engines/lastexpress/entities/entity.cpp | 24 +++++++++++++ engines/lastexpress/entities/entity.h | 8 +++++ engines/lastexpress/entities/entity_intern.h | 12 ------- engines/lastexpress/entities/francois.cpp | 29 +++++++++++---- engines/lastexpress/entities/francois.h | 1 + engines/lastexpress/entities/mertens.cpp | 6 ++-- engines/lastexpress/entities/rebecca.cpp | 3 +- engines/lastexpress/entities/verges.cpp | 54 ++++++++++++++++++---------- engines/lastexpress/entities/yasmin.cpp | 12 ++++--- 14 files changed, 155 insertions(+), 66 deletions(-) diff --git a/engines/lastexpress/entities/alouan.cpp b/engines/lastexpress/entities/alouan.cpp index 2f086de46b..e834e1f7cb 100644 --- a/engines/lastexpress/entities/alouan.cpp +++ b/engines/lastexpress/entities/alouan.cpp @@ -292,7 +292,8 @@ label_callback1: } label_callback2: - TIME_CHECK_CALLBACK_1(kTime2052000, params->param3, 3, setup_playSound, "Har1005"); + if (Entity::timeCheckCallback(kTime2052000, params->param3, 3, "Har1005", WRAP_SETUP_FUNCTION_S(Alouan, setup_playSound))) + break; label_callback3: if (Entity::timeCheckCallback(kTime2133000, params->param4, 4, WRAP_SETUP_FUNCTION(Alouan, setup_compartment6to8))) diff --git a/engines/lastexpress/entities/august.cpp b/engines/lastexpress/entities/august.cpp index 0412da69ac..67d810fde2 100644 --- a/engines/lastexpress/entities/august.cpp +++ b/engines/lastexpress/entities/august.cpp @@ -1906,7 +1906,7 @@ IMPLEMENT_FUNCTION(37, August, function37) break; case kActionNone: - TIME_CHECK_CALLBACK_1(kTime1791000, params->param2, 5, setup_function20, true); + Entity::timeCheckCallback(kTime1791000, params->param2, 5, true, WRAP_SETUP_FUNCTION_B(August, setup_function20)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/boutarel.cpp b/engines/lastexpress/entities/boutarel.cpp index 3c13cb121e..219ddf901b 100644 --- a/engines/lastexpress/entities/boutarel.cpp +++ b/engines/lastexpress/entities/boutarel.cpp @@ -653,7 +653,7 @@ IMPLEMENT_FUNCTION(20, Boutarel, function20) } } - TIME_CHECK_CALLBACK_1(kTime1138500, params->param4, 4, setup_function14, false); + Entity::timeCheckCallback(kTime1138500, params->param4, 4, false, WRAP_SETUP_FUNCTION_B(Boutarel, setup_function14)); break; case kActionDefault: @@ -678,7 +678,7 @@ IMPLEMENT_FUNCTION(20, Boutarel, function20) break; case 3: - TIME_CHECK_CALLBACK_1(kTime1138500, params->param4, 4, setup_function14, false); + Entity::timeCheckCallback(kTime1138500, params->param4, 4, false, WRAP_SETUP_FUNCTION_B(Boutarel, setup_function14)); break; case 4: @@ -836,7 +836,7 @@ IMPLEMENT_FUNCTION(24, Boutarel, chapter2Handler) break; case kActionNone: - TIME_CHECK_CALLBACK_1(kTime1759500, params->param2, 1, setup_function14, false); + Entity::timeCheckCallback(kTime1759500, params->param2, 1, false, WRAP_SETUP_FUNCTION_B(Boutarel, setup_function14)); break; case kActionDefault: @@ -961,7 +961,7 @@ IMPLEMENT_FUNCTION(29, Boutarel, function29) } } - TIME_CHECK_CALLBACK_1(kTime2002500, params->param4, 1, setup_function14, true); + Entity::timeCheckCallback(kTime2002500, params->param4, 1, true, WRAP_SETUP_FUNCTION_B(Boutarel, setup_function14)); break; case kActionDefault: @@ -974,7 +974,7 @@ IMPLEMENT_FUNCTION(29, Boutarel, function29) break; case 1: - TIME_CHECK_CALLBACK_1(kTime2002500, params->param4, 1, setup_function14, true); + Entity::timeCheckCallback(kTime2002500, params->param4, 1, true, WRAP_SETUP_FUNCTION_B(Boutarel, setup_function14)); break; case 2: @@ -1065,7 +1065,7 @@ IMPLEMENT_FUNCTION(33, Boutarel, function33) case kActionNone: if (params->param1) - TIME_CHECK_CALLBACK_1(kTime2389500, params->param2, 3, setup_function14, false); + Entity::timeCheckCallback(kTime2389500, params->param2, 3, false, WRAP_SETUP_FUNCTION_B(Boutarel, setup_function14)); break; case kActionDefault: diff --git a/engines/lastexpress/entities/chapters.cpp b/engines/lastexpress/entities/chapters.cpp index ac9387bd78..a2f3a3d871 100644 --- a/engines/lastexpress/entities/chapters.cpp +++ b/engines/lastexpress/entities/chapters.cpp @@ -449,7 +449,8 @@ label_enter_chalons: label_exit_chalons: // Exiting Chalons station - TIME_CHECK_CALLBACK_1(kTimeExitChalons, CURRENT_PARAM(1, 4), 6, setup_exitStation, "Chalons"); + if (timeCheckExitStation(kTimeExitChalons, CURRENT_PARAM(1, 4), 6, "Chalons")) + break; label_enter_barleduc: // Entering Bar-Le-Duc station @@ -458,7 +459,8 @@ label_enter_barleduc: label_exit_barleduc: // Exiting Bar-Le-Duc station - TIME_CHECK_CALLBACK_1(kTimeExitBarLeDuc, CURRENT_PARAM(1, 6), 8, setup_exitStation, "BarLeDuc"); + if (timeCheckExitStation(kTimeExitBarLeDuc, CURRENT_PARAM(1, 6), 8, "BarLeDuc")) + break; label_enter_nancy: if (getState()->time > kTime1260000 && !CURRENT_PARAM(1, 7)) { @@ -472,7 +474,8 @@ label_enter_nancy: label_exit_nancy: // Exiting Nancy station - TIME_CHECK_CALLBACK_1(kTimeExitNancy, CURRENT_PARAM(2, 1), 10, setup_exitStation, "Nancy"); + if (timeCheckExitStation(kTimeExitNancy, CURRENT_PARAM(2, 1), 10, "Nancy")) + break; label_enter_luneville: // Entering Luneville station @@ -481,7 +484,8 @@ label_enter_luneville: label_exit_luneville: // Exiting Luneville station - TIME_CHECK_CALLBACK_1(kTimeExitLuneville, CURRENT_PARAM(2, 3), 12, setup_exitStation, "Luneville"); + if (timeCheckExitStation(kTimeExitLuneville, CURRENT_PARAM(2, 3), 12, "Luneville")) + break; label_enter_avricourt: // Entering Avricourt station @@ -490,7 +494,8 @@ label_enter_avricourt: label_exit_avricourt: // Exiting Avricourt station - TIME_CHECK_CALLBACK_1(kTimeExitAvricourt, CURRENT_PARAM(2, 5), 14, setup_exitStation, "Avricourt"); + if (timeCheckExitStation(kTimeExitAvricourt, CURRENT_PARAM(2, 5), 14, "Avricourt")) + break; label_enter_deutschavricourt: // Entering Deutsch-Avricourt station @@ -499,7 +504,8 @@ label_enter_deutschavricourt: label_exit_deutschavricourt: // Exiting Avricourt station - TIME_CHECK_CALLBACK_1(kTimeExitDeutschAvricourt, CURRENT_PARAM(2, 7), 16, setup_exitStation, "DeutschA"); + if (timeCheckExitStation(kTimeExitDeutschAvricourt, CURRENT_PARAM(2, 7), 16, "DeutschA")) + break; label_enter_strasbourg: if (getState()->time > kTimeCityStrasbourg && !CURRENT_PARAM(2, 8)) { @@ -512,7 +518,8 @@ label_enter_strasbourg: label_exit_strasbourg: // Exiting Strasbourg station - TIME_CHECK_CALLBACK_1(kTimeExitStrasbourg, CURRENT_PARAM(3, 1), 19, setup_exitStation, "Strasbou"); + if (timeCheckExitStation(kTimeExitStrasbourg, CURRENT_PARAM(3, 1), 19, "Strasbou")) + break; label_enter_badenoos: // Entering Baden Oos station @@ -521,7 +528,8 @@ label_enter_badenoos: label_exit_badenoos: // Exiting Baden Oos station - TIME_CHECK_CALLBACK_1(kTimeExitBadenOos, CURRENT_PARAM(3, 3), 21, setup_exitStation, "BadenOos"); + if (timeCheckExitStation(kTimeExitBadenOos, CURRENT_PARAM(3, 3), 21, "BadenOos")) + break; label_chapter1_next: if (getState()->time > kTimeChapter1End3 && ! CURRENT_PARAM(3, 4)) { @@ -946,28 +954,32 @@ IMPLEMENT_FUNCTION(15, Chapters, chapter3Handler) break; label_callback_1: - TIME_CHECK_CALLBACK_1(kTimeExitSalzbourg, params->param7, 2, setup_exitStation, "Salzburg"); + if (timeCheckExitStation(kTimeExitSalzbourg, params->param7, 2, "Salzburg")) + break; label_callback_2: if (timeCheckEnterStation(kTimeEnterAttnangPuchheim, params->param8, 3, "Attnang", kCityAttnangPuchheim)) break; label_callback_3: - TIME_CHECK_CALLBACK_1(kTimeExitAttnangPuchheim, CURRENT_PARAM(1, 1), 4, setup_exitStation, "Attnang"); + if (timeCheckExitStation(kTimeExitAttnangPuchheim, CURRENT_PARAM(1, 1), 4, "Attnang")) + break; label_callback_4: if (timeCheckEnterStation(kTimeEnterWels, CURRENT_PARAM(1, 2), 5, "Wels", kCityWels)) break; label_callback_5: - TIME_CHECK_CALLBACK_1(kTimeEnterWels, CURRENT_PARAM(1, 3), 6, setup_exitStation, "Wels"); + if (timeCheckExitStation(kTimeEnterWels, CURRENT_PARAM(1, 3), 6, "Wels")) + break; label_callback_6: if (timeCheckEnterStation(kTimeEnterLinz, CURRENT_PARAM(1, 4), 7, "Linz", kCityLinz)) break; label_callback_7: - TIME_CHECK_CALLBACK_1(kTimeCityLinz, CURRENT_PARAM(1, 5), 8, setup_exitStation, "Linz"); + if (timeCheckExitStation(kTimeCityLinz, CURRENT_PARAM(1, 5), 8, "Linz")) + break; label_callback_8: if (getState()->time > kTime2187000 && !CURRENT_PARAM(1, 6)) { @@ -1249,7 +1261,8 @@ IMPLEMENT_FUNCTION(19, Chapters, chapter4Handler) break; label_exitPozsony: - TIME_CHECK_CALLBACK_1(kTimeExitPoszony, CURRENT_PARAM(1, 1), 2, setup_exitStation, "Pozsony"); + if (timeCheckExitStation(kTimeExitPoszony, CURRENT_PARAM(1, 1), 2, "Pozsony")) + break; label_enterGalanta: if (getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) { @@ -1266,7 +1279,8 @@ label_enterGalanta: break; label_exitGalanta: - TIME_CHECK_CALLBACK_1(kTimeExitGalanta, CURRENT_PARAM(1, 4), 4, setup_exitStation, "Galanta"); + if (timeCheckExitStation(kTimeExitGalanta, CURRENT_PARAM(1, 4), 4, "Galanta")) + break; label_callback_4: if (getState()->time > kTime2470500 && !CURRENT_PARAM(1, 5)) { @@ -1855,4 +1869,16 @@ bool Chapters::timeCheckEnterStation(TimeValue timeValue, uint ¶meter, byte return false; } +bool Chapters::timeCheckExitStation(TimeValue timeValue, uint ¶meter, byte callback, const char *sequence) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + setCallback(callback); + setup_exitStation(sequence); + + return true; + } + + return false; +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/chapters.h b/engines/lastexpress/entities/chapters.h index 51e6444506..a9a53523d4 100644 --- a/engines/lastexpress/entities/chapters.h +++ b/engines/lastexpress/entities/chapters.h @@ -155,6 +155,7 @@ public: private: bool timeCheckEnterStation(TimeValue timeValue, uint ¶meter, byte callback, const char *sequence, CityIndex cityIndex); + bool timeCheckExitStation(TimeValue timeValue, uint ¶meter, byte callback, const char *sequence); void enterExitStation(const SavePoint &savepoint, bool isEnteringStation); void enterExitHelper(bool isEnteringStation); void playSteam(); diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 48856a7bc4..9160b6db95 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -660,6 +660,30 @@ bool Entity::timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callba return false; } +bool Entity::timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, const char *str, Common::Functor1 *function) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + setCallback(callback); + (*function)(str); + + return true; + } + + return false; +} + +bool Entity::timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, bool check, Common::Functor1 *function) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + setCallback(callback); + (*function)(check); + + return true; + } + + return false; +} + bool Entity::timeCheckCallbackInventory(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function) { if (getState()->time > timeValue && !parameter) { parameter = 1; diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 785e355481..3141559081 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -85,6 +85,12 @@ struct SavePoint; #define WRAP_SETUP_FUNCTION(className, method) \ new Common::Functor0Mem(this, &className::method) +#define WRAP_SETUP_FUNCTION_S(className, method) \ + new Common::Functor1Mem(this, &className::method) + +#define WRAP_SETUP_FUNCTION_B(className, method) \ + new Common::Functor1Mem(this, &className::method) + ////////////////////////////////////////////////////////////////////////// // Parameters macros ////////////////////////////////////////////////////////////////////////// @@ -916,6 +922,8 @@ protected: bool timeCheck(TimeValue timeValue, uint ¶meter, Common::Functor0 *function); bool timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function); + bool timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, const char *str, Common::Functor1 *function); + bool timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, bool check, Common::Functor1 *function); bool timeCheckCallbackInventory(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function); bool timeCheckCar(TimeValue timeValue, uint ¶meter, byte callback, Common::Functor0 *function); void timeCheckSavepoint(TimeValue timeValue, uint ¶meter, EntityIndex entity1, EntityIndex entity2, ActionIndex action); diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index f12f34ac74..01e997f52e 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -258,18 +258,6 @@ void class::setup_##name() { \ EXPOSE_PARAMS(EntityData::EntityParametersIISS) \ debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); - -////////////////////////////////////////////////////////////////////////// -// Time check macros -////////////////////////////////////////////////////////////////////////// -#define TIME_CHECK_CALLBACK_1(timeValue, parameter, callback, function, param1) \ - if (getState()->time > timeValue && !parameter) { \ - parameter = 1; \ - setCallback(callback); \ - function(param1); \ - break; \ - } - } // End of namespace LastExpress #endif // LASTEXPRESS_ENTITY_INTERN_H diff --git a/engines/lastexpress/entities/francois.cpp b/engines/lastexpress/entities/francois.cpp index c39eb1197c..d2bbc9854c 100644 --- a/engines/lastexpress/entities/francois.cpp +++ b/engines/lastexpress/entities/francois.cpp @@ -866,7 +866,7 @@ IMPLEMENT_FUNCTION(18, Francois, chapter1Handler) break; case kActionNone: - TIME_CHECK_CALLBACK_1(kTimeParisEpernay, params->param1, 1, setup_function11, kTime1093500); + timeCheckCallback(kTimeParisEpernay, params->param1, 1, kTime1093500); break; case kActionCallback: @@ -978,7 +978,8 @@ IMPLEMENT_FUNCTION(23, Francois, function23) } label_callback_1: - TIME_CHECK_CALLBACK_1(kTime1764000, params->param1, 2, setup_playSound, "Fra2011"); + if (Entity::timeCheckCallback(kTime1764000, params->param1, 2, "Fra2011", WRAP_SETUP_FUNCTION_S(Francois, setup_playSound))) + break; label_callback_2: if (Entity::timeCheckCallback(kTime1800000, params->param2, 3, WRAP_SETUP_FUNCTION(Francois, setup_function13))) @@ -986,10 +987,12 @@ label_callback_2: label_callback_3: if (!getInventory()->hasItem(kItemWhistle) && getInventory()->get(kItemWhistle)->location != kObjectLocation3) { - TIME_CHECK_CALLBACK_1(kTime1768500, params->param3, 4, setup_function11, kTime1773000); + if (timeCheckCallback(kTime1768500, params->param3, 4, kTime1773000)) + break; label_callback_4: - TIME_CHECK_CALLBACK_1(kTime1827000, params->param4, 5, setup_function11, kTime1831500); + if (timeCheckCallback(kTime1827000, params->param4, 5, kTime1831500)) + break; } label_callback_5: @@ -1116,10 +1119,12 @@ label_callback_8: label_callback_9: if (!getInventory()->hasItem(kItemWhistle) && getInventory()->get(kItemWhistle)->location != kObjectLocation3) { - TIME_CHECK_CALLBACK_1(kTime2011500, CURRENT_PARAM(1, 2), 10, setup_function11, kTime2016000); + if (timeCheckCallback(kTime2011500, CURRENT_PARAM(1, 2), 10, kTime2016000)) + break; label_callback_10: - TIME_CHECK_CALLBACK_1(kTime2115000, CURRENT_PARAM(1, 3), 11, setup_function11, kTime2119500); + if (timeCheckCallback(kTime2115000, CURRENT_PARAM(1, 3), 11, kTime2119500)) + break; } label_callback_11: @@ -1317,5 +1322,17 @@ bool Francois::timeCheckCallbackCompartment(TimeValue timeValue, uint ¶meter return false; } +bool Francois::timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, TimeValue timeValue2) { + if (getState()->time > timeValue && !parameter) { + parameter = 1; + setCallback(callback); + setup_function11(timeValue2); + + return true; + } + + return false; +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/francois.h b/engines/lastexpress/entities/francois.h index 09715dba67..5a4ff4b8b2 100644 --- a/engines/lastexpress/entities/francois.h +++ b/engines/lastexpress/entities/francois.h @@ -163,6 +163,7 @@ public: private: bool timeCheckCallbackCompartment(TimeValue timeValue, uint ¶meter, byte callback, ObjectIndex compartment, EntityPosition position, const char* sequenceSuffix); + bool timeCheckCallback(TimeValue timeValue, uint ¶meter, byte callback, TimeValue timeValue2); }; } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp index b6ea86cd0e..97dd293793 100644 --- a/engines/lastexpress/entities/mertens.cpp +++ b/engines/lastexpress/entities/mertens.cpp @@ -3532,14 +3532,16 @@ label_callback_5: } label_callback_6: - TIME_CHECK_CALLBACK_1(kTime1971000, params->param1, 7, setup_function28, "CON3012"); + if (Entity::timeCheckCallback(kTime1971000, params->param1, 7, "CON3012", WRAP_SETUP_FUNCTION_S(Mertens, setup_function28))) + break; label_callback_7: if (Entity::timeCheckCallback(kTime2117700, params->param2, 8, WRAP_SETUP_FUNCTION(Mertens, setup_function32))) break; label_callback_8: - TIME_CHECK_CALLBACK_1(kTime2124000, params->param3, 9, setup_function28, "CON2010"); + if (Entity::timeCheckCallback(kTime2124000, params->param3, 9, "CON2010", WRAP_SETUP_FUNCTION_S(Mertens, setup_function28))) + break; label_callback_9: if (Entity::timeCheckCallback(kTime2146500, params->param4, 10, WRAP_SETUP_FUNCTION(Mertens, setup_function32))) diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp index 79d13a93f5..5bcb6aef85 100644 --- a/engines/lastexpress/entities/rebecca.cpp +++ b/engines/lastexpress/entities/rebecca.cpp @@ -683,7 +683,8 @@ IMPLEMENT_FUNCTION(22, Rebecca, chapter1Handler) break; case kActionNone: - TIME_CHECK_CALLBACK_1(kTime1084500, params->param3, 1, setup_playSound, "REB1015"); + if (Entity::timeCheckCallback(kTime1084500, params->param3, 1, "REB1015", WRAP_SETUP_FUNCTION_S(Rebecca, setup_playSound))) + break; if (params->param4 == kTimeInvalid) goto label_callback_4; diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp index e6526870d7..867f122d8f 100644 --- a/engines/lastexpress/entities/verges.cpp +++ b/engines/lastexpress/entities/verges.cpp @@ -907,7 +907,8 @@ label_callback3: if (params->param6) goto label_callback12; - TIME_CHECK_CALLBACK_1(kTimeChapter1, params->param7, 4, setup_function9, "TRA1001"); + if (Entity::timeCheckCallback(kTimeChapter1, params->param7, 4, "TRA1001", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback4: if (Entity::timeCheckCallback(kTime1089000, params->param8, 5, WRAP_SETUP_FUNCTION(Verges, setup_function12))) @@ -922,16 +923,20 @@ label_callback4: } label_callback8: - TIME_CHECK_CALLBACK_1(kTime1107000, CURRENT_PARAM(1, 1), 9, setup_function9, "TRA1001A"); + if (Entity::timeCheckCallback(kTime1107000, CURRENT_PARAM(1, 1), 9, "TRA1001A", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback9: - TIME_CHECK_CALLBACK_1(kTime1134000, CURRENT_PARAM(1, 2), 10, setup_function9, "TRA1002"); + if (Entity::timeCheckCallback(kTime1134000, CURRENT_PARAM(1, 2), 10, "TRA1002", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback10: - TIME_CHECK_CALLBACK_1(kTime1165500, CURRENT_PARAM(1, 3), 11, setup_function9, "TRA1003"); + if (Entity::timeCheckCallback(kTime1165500, CURRENT_PARAM(1, 3), 11, "TRA1003", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback11: - TIME_CHECK_CALLBACK_1(kTime1225800, CURRENT_PARAM(1, 4), 12, setup_function9, "TRA1004"); + if (Entity::timeCheckCallback(kTime1225800, CURRENT_PARAM(1, 4), 12, "TRA1004", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback12: if (ENTITY_PARAM(0, 5) && !params->param2) { @@ -1083,7 +1088,8 @@ IMPLEMENT_FUNCTION(28, Verges, chapter2Handler) } label_callback_1: - TIME_CHECK_CALLBACK_1(kTime1818900, params->param1, 2, setup_function9, "Tra2177"); + if (Entity::timeCheckCallback(kTime1818900, params->param1, 2, "Tra2177", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_2: if (params->param2 == kTimeInvalid || !getState()->time) @@ -1445,23 +1451,28 @@ label_callback_2: } label_callback_3: - TIME_CHECK_CALLBACK_1(kTime1971000, params->param1, 4, setup_function9, "Tra3001"); + if (Entity::timeCheckCallback(kTime1971000, params->param1, 4, "Tra3001", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_4: - TIME_CHECK_CALLBACK_1(kTime1998000, params->param2, 5, setup_function9, "Tra3010a"); + if (Entity::timeCheckCallback(kTime1998000, params->param2, 5, "Tra3010a", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_5: if (Entity::timeCheckCallback(kTime2016000, params->param3, 6, WRAP_SETUP_FUNCTION(Verges, setup_function35))) break; label_callback_6: - TIME_CHECK_CALLBACK_1(kTime2070000, params->param4, 7, setup_function9, "Tra3002"); + if (Entity::timeCheckCallback(kTime2070000, params->param4, 7, "Tra3002", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_7: - TIME_CHECK_CALLBACK_1(kTime2142000, params->param5, 8, setup_function9, "Tra3003"); + if (Entity::timeCheckCallback(kTime2142000, params->param5, 8, "Tra3003", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_8: - TIME_CHECK_CALLBACK_1(kTime2173500, params->param6, 9, setup_function30, "Tra3012"); + if (Entity::timeCheckCallback(kTime2173500, params->param6, 9, "Tra3012", WRAP_SETUP_FUNCTION_S(Verges, setup_function30))) + break; label_callback_9: Entity::timeCheckCallback(kTime2218500, params->param7, 10, WRAP_SETUP_FUNCTION(Verges, setup_function32)); @@ -1611,27 +1622,32 @@ label_callback_1: } label_callback_2: - TIME_CHECK_CALLBACK_1(kTime2349000, params->param1, 3, setup_function9, "Tra1001"); + if (Entity::timeCheckCallback(kTime2349000, params->param1, 3, "Tra1001", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_3: - TIME_CHECK_CALLBACK_1(kTime2378700, params->param2, 4, setup_function9, "Tra4001"); + if (Entity::timeCheckCallback(kTime2378700, params->param2, 4, "Tra4001", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_4: - TIME_CHECK_CALLBACK_1(kTime2403000, params->param3, 5, setup_function9, "Tra1001A"); + if (Entity::timeCheckCallback(kTime2403000, params->param3, 5, "Tra1001A", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_5: - TIME_CHECK_CALLBACK_1(kTime2414700, params->param4, 6, setup_function9, "Tra4002"); + if (Entity::timeCheckCallback(kTime2414700, params->param4, 6, "Tra4002", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_6: - TIME_CHECK_CALLBACK_1(kTime2484000, params->param5, 7, setup_function9, "Tra4003"); + if (Entity::timeCheckCallback(kTime2484000, params->param5, 7, "Tra4003", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; label_callback_7: - TIME_CHECK_CALLBACK_1(kTime2511000, params->param6, 8, setup_function9, "Tra4004"); + if (Entity::timeCheckCallback(kTime2511000, params->param6, 8, "Tra4004", WRAP_SETUP_FUNCTION_S(Verges, setup_function9))) + break; } label_callback_8: - TIME_CHECK_CALLBACK_1(kTime2538000, params->param7, 9, setup_function9, "Tra4005"); - + Entity::timeCheckCallback(kTime2538000, params->param7, 9, "Tra4005", WRAP_SETUP_FUNCTION_S(Verges, setup_function9)); break; case kActionOpenDoor: diff --git a/engines/lastexpress/entities/yasmin.cpp b/engines/lastexpress/entities/yasmin.cpp index acacbb547b..1d280f51e0 100644 --- a/engines/lastexpress/entities/yasmin.cpp +++ b/engines/lastexpress/entities/yasmin.cpp @@ -211,9 +211,11 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler) if (Entity::timeCheckPlaySoundUpdatePosition(kTime1162800, params->param3, 4, "Har1102", kPosition_4070)) break; - TIME_CHECK_CALLBACK_1(kTime1165500, params->param4, 5, setup_playSound, "Har1104"); + if (Entity::timeCheckCallback(kTime1165500, params->param4, 5, "Har1104", WRAP_SETUP_FUNCTION_S(Yasmin, setup_playSound))) + break; - TIME_CHECK_CALLBACK_1(kTime1174500, params->param5, 6, setup_playSound, "Har1106"); + if (Entity::timeCheckCallback(kTime1174500, params->param5, 6, "Har1106", WRAP_SETUP_FUNCTION_S(Yasmin, setup_playSound))) + break; Entity::timeCheckCallback(kTime1183500, params->param6, 7, WRAP_SETUP_FUNCTION(Yasmin, setup_function6)); break; @@ -240,11 +242,13 @@ IMPLEMENT_FUNCTION(9, Yasmin, chapter1Handler) // Fallback to case 4 case 4: - TIME_CHECK_CALLBACK_1(kTime1165500, params->param4, 5, setup_playSound, "Har1104"); + if (Entity::timeCheckCallback(kTime1165500, params->param4, 5, "Har1104", WRAP_SETUP_FUNCTION_S(Yasmin, setup_playSound))) + break; // Fallback to case 5 case 5: - TIME_CHECK_CALLBACK_1(kTime1174500, params->param5, 6, setup_playSound, "Har1106"); + if (Entity::timeCheckCallback(kTime1174500, params->param5, 6, "Har1106", WRAP_SETUP_FUNCTION_S(Yasmin, setup_playSound))) + break; // Fallback to case 6 case 6: -- cgit v1.2.3 From 813c2bb96587966cc49d34daef3bb5b5930427f1 Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 25 Jul 2012 21:34:13 -0400 Subject: LASTEXPRESS: Merge the remaining macros in entity_intern.h into entity.h --- engines/lastexpress/entities/abbot.h | 1 - engines/lastexpress/entities/alexei.h | 1 - engines/lastexpress/entities/alouan.h | 1 - engines/lastexpress/entities/anna.h | 1 - engines/lastexpress/entities/august.h | 1 - engines/lastexpress/entities/boutarel.h | 1 - engines/lastexpress/entities/chapters.h | 1 - engines/lastexpress/entities/cooks.h | 1 - engines/lastexpress/entities/coudert.h | 2 - engines/lastexpress/entities/entity.cpp | 2 - engines/lastexpress/entities/entity.h | 232 +++++++++++++++++++++++++++ engines/lastexpress/entities/entity39.h | 1 - engines/lastexpress/entities/entity_intern.h | 232 --------------------------- engines/lastexpress/entities/francois.h | 1 - engines/lastexpress/entities/gendarmes.h | 1 - engines/lastexpress/entities/hadija.h | 1 - engines/lastexpress/entities/ivo.h | 1 - engines/lastexpress/entities/kahina.h | 1 - engines/lastexpress/entities/kronos.h | 1 - engines/lastexpress/entities/mahmud.h | 1 - engines/lastexpress/entities/max.h | 1 - engines/lastexpress/entities/mertens.h | 1 - engines/lastexpress/entities/milos.h | 1 - engines/lastexpress/entities/mmeboutarel.h | 1 - engines/lastexpress/entities/pascale.h | 1 - engines/lastexpress/entities/rebecca.h | 1 - engines/lastexpress/entities/salko.h | 1 - engines/lastexpress/entities/servers0.h | 1 - engines/lastexpress/entities/servers1.h | 1 - engines/lastexpress/entities/sophie.h | 1 - engines/lastexpress/entities/tables.h | 1 - engines/lastexpress/entities/tatiana.h | 1 - engines/lastexpress/entities/train.h | 1 - engines/lastexpress/entities/vassili.h | 1 - engines/lastexpress/entities/verges.h | 1 - engines/lastexpress/entities/vesna.h | 1 - engines/lastexpress/entities/yasmin.h | 1 - 37 files changed, 232 insertions(+), 269 deletions(-) diff --git a/engines/lastexpress/entities/abbot.h b/engines/lastexpress/entities/abbot.h index 462f5a491e..ce52bb68ce 100644 --- a/engines/lastexpress/entities/abbot.h +++ b/engines/lastexpress/entities/abbot.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_ABBOT_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/alexei.h b/engines/lastexpress/entities/alexei.h index 262826ae42..9792385863 100644 --- a/engines/lastexpress/entities/alexei.h +++ b/engines/lastexpress/entities/alexei.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_ALEXEI_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/alouan.h b/engines/lastexpress/entities/alouan.h index c6a6beddd9..91254a449a 100644 --- a/engines/lastexpress/entities/alouan.h +++ b/engines/lastexpress/entities/alouan.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_ALOUAN_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/anna.h b/engines/lastexpress/entities/anna.h index 72c6db4bd9..205ff9d42c 100644 --- a/engines/lastexpress/entities/anna.h +++ b/engines/lastexpress/entities/anna.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_ANNA_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/august.h b/engines/lastexpress/entities/august.h index 2cbb31b968..606321955b 100644 --- a/engines/lastexpress/entities/august.h +++ b/engines/lastexpress/entities/august.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_AUGUST_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/boutarel.h b/engines/lastexpress/entities/boutarel.h index 5eb264631c..04838f6527 100644 --- a/engines/lastexpress/entities/boutarel.h +++ b/engines/lastexpress/entities/boutarel.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_BOUTAREL_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/chapters.h b/engines/lastexpress/entities/chapters.h index a9a53523d4..ddb3de3bea 100644 --- a/engines/lastexpress/entities/chapters.h +++ b/engines/lastexpress/entities/chapters.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_CHAPTERS_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/cooks.h b/engines/lastexpress/entities/cooks.h index 3ab7d35161..f01d0b2ca0 100644 --- a/engines/lastexpress/entities/cooks.h +++ b/engines/lastexpress/entities/cooks.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_COOKS_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/coudert.h b/engines/lastexpress/entities/coudert.h index 45d13ce9bb..8303c80a32 100644 --- a/engines/lastexpress/entities/coudert.h +++ b/engines/lastexpress/entities/coudert.h @@ -24,8 +24,6 @@ #define LASTEXPRESS_COUDERT_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" - namespace LastExpress { class LastExpressEngine; diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 9160b6db95..a9ceaa16a9 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -22,8 +22,6 @@ #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" - #include "lastexpress/data/sequence.h" #include "lastexpress/game/action.h" diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 3141559081..634e4000b3 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -107,6 +107,238 @@ struct SavePoint; getEntities()->resetState(entity); \ ((class *)getEntities()->get(entity))->function(); +////////////////////////////////////////////////////////////////////////// +// Setup +////////////////////////////////////////////////////////////////////////// + +#define IMPLEMENT_SETUP(class, callback_class, name, index) \ +void class::setup_##name() { \ + BEGIN_SETUP(callback_class, name, index, EntityData::EntityParametersIIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::setup_" #name "()"); \ + END_SETUP() \ +} + +#define BEGIN_SETUP(class, name, index, type) \ + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); \ + _data->setCurrentCallback(index); \ + _data->resetCurrentParameters(); + +#define END_SETUP() \ + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + + +////////////////////////////////////////////////////////////////////////// +// Implementation +////////////////////////////////////////////////////////////////////////// + +// Expose parameters and check validity +#define EXPOSE_PARAMS(type) \ + type *params = (type *)_data->getCurrentParameters(); \ + if (!params) \ + error("[EXPOSE_PARAMS] Trying to call an entity function with invalid parameters"); \ + + +// function signature without setup (we keep the index for consistency but never use it) +#define IMPLEMENT_FUNCTION_NOSETUP(index, class, name) \ + void class::name(const SavePoint &savepoint) { \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(index=" #index ")"); + +// simple setup with no parameters +#define IMPLEMENT_FUNCTION(index, class, name) \ + IMPLEMENT_SETUP(class, class, name, index) \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "() - action: %s", ACTION_NAME(savepoint.action)); + +#define IMPLEMENT_FUNCTION_END } + +// nullfunction call +#define IMPLEMENT_NULL_FUNCTION(index, class) \ + IMPLEMENT_SETUP(class, Entity, nullfunction, index) + +// setup with one uint parameter +#define IMPLEMENT_FUNCTION_I(index, class, name, paramType) \ + void class::setup_##name(paramType param1) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ + params->param1 = (unsigned int)param1; \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d) - action: %s", params->param1, ACTION_NAME(savepoint.action)); + +// setup with two uint parameters +#define IMPLEMENT_FUNCTION_II(index, class, name, paramType1, paramType2) \ + void class::setup_##name(paramType1 param1, paramType2 param2) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ + params->param1 = param1; \ + params->param2 = param2; \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d) - action: %s", params->param1, params->param2, ACTION_NAME(savepoint.action)); + +// setup with three uint parameters +#define IMPLEMENT_FUNCTION_III(index, class, name, paramType1, paramType2, paramType3) \ + void class::setup_##name(paramType1 param1, paramType2 param2, paramType3 param3) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ + params->param1 = param1; \ + params->param2 = param2; \ + params->param3 = param3; \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %d) - action: %s", params->param1, params->param2, params->param3, ACTION_NAME(savepoint.action)); + +// setup with one char *parameter +#define IMPLEMENT_FUNCTION_S(index, class, name) \ + void class::setup_##name(const char *seq1) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ + strncpy((char *)¶ms->seq1, seq1, 12); \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s) - action: %s", (char *)¶ms->seq1, ACTION_NAME(savepoint.action)); + +// setup with one char *parameter and one uint +#define IMPLEMENT_FUNCTION_SI(index, class, name, paramType2) \ + void class::setup_##name(const char *seq1, paramType2 param4) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ + strncpy((char *)¶ms->seq1, seq1, 12); \ + params->param4 = param4; \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d) - action: %s", (char *)¶ms->seq1, params->param4, ACTION_NAME(savepoint.action)); + +// setup with one char *parameter and two uints +#define IMPLEMENT_FUNCTION_SII(index, class, name, paramType2, paramType3) \ + void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ + strncpy((char *)¶ms->seq1, seq1, 12); \ + params->param4 = param4; \ + params->param5 = param5; \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d) - action: %s", (char *)¶ms->seq1, params->param4, params->param5, ACTION_NAME(savepoint.action)); + +// setup with one char *parameter and three uints +#define IMPLEMENT_FUNCTION_SIII(index, class, name, paramType2, paramType3, paramType4) \ + void class::setup_##name(const char *seq, paramType2 param4, paramType3 param5, paramType4 param6) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIII) \ + EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII*)_data->getCurrentParameters(); \ + strncpy((char *)¶ms->seq, seq, 12); \ + params->param4 = param4; \ + params->param5 = param5; \ + params->param6 = param6; \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersSIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d, %d) - action: %s", (char *)¶ms->seq, params->param4, params->param5, params->param6, ACTION_NAME(savepoint.action)); + +#define IMPLEMENT_FUNCTION_SIIS(index, class, name, paramType2, paramType3) \ + void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5, const char *seq2) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ + strncpy((char *)¶ms->seq1, seq1, 12); \ + params->param4 = param4; \ + params->param5 = param5; \ + strncpy((char *)¶ms->seq2, seq2, 12); \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d, %s) - action: %s", (char *)¶ms->seq1, params->param4, params->param5, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); + +#define IMPLEMENT_FUNCTION_SS(index, class, name) \ + void class::setup_##name(const char *seq1, const char *seq2) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersSSII) \ + EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); \ + strncpy((char *)¶ms->seq1, seq1, 12); \ + strncpy((char *)¶ms->seq2, seq2, 12); \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %s) - action: %s", (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); + +#define IMPLEMENT_FUNCTION_SSI(index, class, name, paramType3) \ + void class::setup_##name(const char *seq1, const char *seq2, paramType3 param7) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersSSII) \ + EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); \ + strncpy((char *)¶ms->seq1, seq1, 12); \ + strncpy((char *)¶ms->seq2, seq2, 12); \ + params->param7 = param7; \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %s, %d) - action: %s", (char *)¶ms->seq1, (char *)¶ms->seq2, params->param7, ACTION_NAME(savepoint.action)); + +#define IMPLEMENT_FUNCTION_IS(index, class, name, paramType) \ + void class::setup_##name(paramType param1, const char *seq) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersISII) \ + EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII*)_data->getCurrentParameters(); \ + params->param1 = (unsigned int)param1; \ + strncpy((char *)¶ms->seq, seq, 12); \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersISII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %s) - action: %s", params->param1, (char *)¶ms->seq, ACTION_NAME(savepoint.action)); + +#define IMPLEMENT_FUNCTION_ISS(index, class, name, paramType) \ + void class::setup_##name(paramType param1, const char *seq1, const char *seq2) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersISSI) \ + EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI*)_data->getCurrentParameters(); \ + params->param1 = param1; \ + strncpy((char *)¶ms->seq1, seq1, 12); \ + strncpy((char *)¶ms->seq2, seq2, 12); \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersISSI) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %s, %s) - action: %s", params->param1, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); + +#define IMPLEMENT_FUNCTION_IIS(index, class, name, paramType1, paramType2) \ + void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersIISI) \ + EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI*)_data->getCurrentParameters(); \ + params->param1 = param1; \ + params->param2 = param2; \ + strncpy((char *)¶ms->seq, seq, 12); \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersIISI) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq, ACTION_NAME(savepoint.action)); + +#define IMPLEMENT_FUNCTION_IISS(index, class, name, paramType1, paramType2) \ + void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq1, const char *seq2) { \ + BEGIN_SETUP(class, name, index, EntityData::EntityParametersIISS) \ + EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS*)_data->getCurrentParameters(); \ + params->param1 = param1; \ + params->param2 = param2; \ + strncpy((char *)¶ms->seq1, seq1, 12); \ + strncpy((char *)¶ms->seq2, seq2, 12); \ + END_SETUP() \ + } \ + void class::name(const SavePoint &savepoint) { \ + EXPOSE_PARAMS(EntityData::EntityParametersIISS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/entities/entity39.h b/engines/lastexpress/entities/entity39.h index 148bca5c33..54b65408c7 100644 --- a/engines/lastexpress/entities/entity39.h +++ b/engines/lastexpress/entities/entity39.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_ENTITY39_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/entity_intern.h b/engines/lastexpress/entities/entity_intern.h index 01e997f52e..fd803676a9 100644 --- a/engines/lastexpress/entities/entity_intern.h +++ b/engines/lastexpress/entities/entity_intern.h @@ -25,238 +25,6 @@ namespace LastExpress { -////////////////////////////////////////////////////////////////////////// -// Setup -////////////////////////////////////////////////////////////////////////// - -#define IMPLEMENT_SETUP(class, callback_class, name, index) \ -void class::setup_##name() { \ - BEGIN_SETUP(callback_class, name, index, EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::setup_" #name "()"); \ - END_SETUP() \ -} - -#define BEGIN_SETUP(class, name, index, type) \ - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); \ - _data->setCurrentCallback(index); \ - _data->resetCurrentParameters(); - -#define END_SETUP() \ - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - - -////////////////////////////////////////////////////////////////////////// -// Implementation -////////////////////////////////////////////////////////////////////////// - -// Expose parameters and check validity -#define EXPOSE_PARAMS(type) \ - type *params = (type *)_data->getCurrentParameters(); \ - if (!params) \ - error("[EXPOSE_PARAMS] Trying to call an entity function with invalid parameters"); \ - - -// function signature without setup (we keep the index for consistency but never use it) -#define IMPLEMENT_FUNCTION_NOSETUP(index, class, name) \ - void class::name(const SavePoint &savepoint) { \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(index=" #index ")"); - -// simple setup with no parameters -#define IMPLEMENT_FUNCTION(index, class, name) \ - IMPLEMENT_SETUP(class, class, name, index) \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "() - action: %s", ACTION_NAME(savepoint.action)); - -#define IMPLEMENT_FUNCTION_END } - -// nullfunction call -#define IMPLEMENT_NULL_FUNCTION(index, class) \ - IMPLEMENT_SETUP(class, Entity, nullfunction, index) - -// setup with one uint parameter -#define IMPLEMENT_FUNCTION_I(index, class, name, paramType) \ - void class::setup_##name(paramType param1) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ - params->param1 = (unsigned int)param1; \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d) - action: %s", params->param1, ACTION_NAME(savepoint.action)); - -// setup with two uint parameters -#define IMPLEMENT_FUNCTION_II(index, class, name, paramType1, paramType2) \ - void class::setup_##name(paramType1 param1, paramType2 param2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - params->param2 = param2; \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d) - action: %s", params->param1, params->param2, ACTION_NAME(savepoint.action)); - -// setup with three uint parameters -#define IMPLEMENT_FUNCTION_III(index, class, name, paramType1, paramType2, paramType3) \ - void class::setup_##name(paramType1 param1, paramType2 param2, paramType3 param3) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - params->param2 = param2; \ - params->param3 = param3; \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %d) - action: %s", params->param1, params->param2, params->param3, ACTION_NAME(savepoint.action)); - -// setup with one char *parameter -#define IMPLEMENT_FUNCTION_S(index, class, name) \ - void class::setup_##name(const char *seq1) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s) - action: %s", (char *)¶ms->seq1, ACTION_NAME(savepoint.action)); - -// setup with one char *parameter and one uint -#define IMPLEMENT_FUNCTION_SI(index, class, name, paramType2) \ - void class::setup_##name(const char *seq1, paramType2 param4) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - params->param4 = param4; \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d) - action: %s", (char *)¶ms->seq1, params->param4, ACTION_NAME(savepoint.action)); - -// setup with one char *parameter and two uints -#define IMPLEMENT_FUNCTION_SII(index, class, name, paramType2, paramType3) \ - void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - params->param4 = param4; \ - params->param5 = param5; \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d) - action: %s", (char *)¶ms->seq1, params->param4, params->param5, ACTION_NAME(savepoint.action)); - -// setup with one char *parameter and three uints -#define IMPLEMENT_FUNCTION_SIII(index, class, name, paramType2, paramType3, paramType4) \ - void class::setup_##name(const char *seq, paramType2 param4, paramType3 param5, paramType4 param6) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIII) \ - EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq, seq, 12); \ - params->param4 = param4; \ - params->param5 = param5; \ - params->param6 = param6; \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d, %d) - action: %s", (char *)¶ms->seq, params->param4, params->param5, params->param6, ACTION_NAME(savepoint.action)); - -#define IMPLEMENT_FUNCTION_SIIS(index, class, name, paramType2, paramType3) \ - void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5, const char *seq2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - params->param4 = param4; \ - params->param5 = param5; \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d, %s) - action: %s", (char *)¶ms->seq1, params->param4, params->param5, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); - -#define IMPLEMENT_FUNCTION_SS(index, class, name) \ - void class::setup_##name(const char *seq1, const char *seq2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSSII) \ - EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %s) - action: %s", (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); - -#define IMPLEMENT_FUNCTION_SSI(index, class, name, paramType3) \ - void class::setup_##name(const char *seq1, const char *seq2, paramType3 param7) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSSII) \ - EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - params->param7 = param7; \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %s, %d) - action: %s", (char *)¶ms->seq1, (char *)¶ms->seq2, params->param7, ACTION_NAME(savepoint.action)); - -#define IMPLEMENT_FUNCTION_IS(index, class, name, paramType) \ - void class::setup_##name(paramType param1, const char *seq) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersISII) \ - EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII*)_data->getCurrentParameters(); \ - params->param1 = (unsigned int)param1; \ - strncpy((char *)¶ms->seq, seq, 12); \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersISII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %s) - action: %s", params->param1, (char *)¶ms->seq, ACTION_NAME(savepoint.action)); - -#define IMPLEMENT_FUNCTION_ISS(index, class, name, paramType) \ - void class::setup_##name(paramType param1, const char *seq1, const char *seq2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersISSI) \ - EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersISSI) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %s, %s) - action: %s", params->param1, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); - -#define IMPLEMENT_FUNCTION_IIS(index, class, name, paramType1, paramType2) \ - void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIISI) \ - EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - params->param2 = param2; \ - strncpy((char *)¶ms->seq, seq, 12); \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIISI) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq, ACTION_NAME(savepoint.action)); - -#define IMPLEMENT_FUNCTION_IISS(index, class, name, paramType1, paramType2) \ - void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq1, const char *seq2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIISS) \ - EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - params->param2 = param2; \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - END_SETUP() \ - } \ - void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIISS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); } // End of namespace LastExpress diff --git a/engines/lastexpress/entities/francois.h b/engines/lastexpress/entities/francois.h index 5a4ff4b8b2..51270fa4b6 100644 --- a/engines/lastexpress/entities/francois.h +++ b/engines/lastexpress/entities/francois.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_FRANCOIS_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/gendarmes.h b/engines/lastexpress/entities/gendarmes.h index d999cfc1fd..a761643531 100644 --- a/engines/lastexpress/entities/gendarmes.h +++ b/engines/lastexpress/entities/gendarmes.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_GENDARMES_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" #include "lastexpress/sound/sound.h" diff --git a/engines/lastexpress/entities/hadija.h b/engines/lastexpress/entities/hadija.h index d2495955e0..545f21ee03 100644 --- a/engines/lastexpress/entities/hadija.h +++ b/engines/lastexpress/entities/hadija.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_HADIJA_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/ivo.h b/engines/lastexpress/entities/ivo.h index cd5cb7b6be..75814336e0 100644 --- a/engines/lastexpress/entities/ivo.h +++ b/engines/lastexpress/entities/ivo.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_IVO_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/kahina.h b/engines/lastexpress/entities/kahina.h index b25053e339..7479cf76f9 100644 --- a/engines/lastexpress/entities/kahina.h +++ b/engines/lastexpress/entities/kahina.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_KAHINA_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/kronos.h b/engines/lastexpress/entities/kronos.h index 4c61b98620..a7693fcd46 100644 --- a/engines/lastexpress/entities/kronos.h +++ b/engines/lastexpress/entities/kronos.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_KRONOS_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/mahmud.h b/engines/lastexpress/entities/mahmud.h index 5feb95cba5..685100f078 100644 --- a/engines/lastexpress/entities/mahmud.h +++ b/engines/lastexpress/entities/mahmud.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_MAHMUD_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/max.h b/engines/lastexpress/entities/max.h index 17b58475aa..acd8235e89 100644 --- a/engines/lastexpress/entities/max.h +++ b/engines/lastexpress/entities/max.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_MAX_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/mertens.h b/engines/lastexpress/entities/mertens.h index 55c2a76140..4cc58fd4ba 100644 --- a/engines/lastexpress/entities/mertens.h +++ b/engines/lastexpress/entities/mertens.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_MERTENS_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/milos.h b/engines/lastexpress/entities/milos.h index d58d717f8a..e8f95dc5ff 100644 --- a/engines/lastexpress/entities/milos.h +++ b/engines/lastexpress/entities/milos.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_MILOS_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/mmeboutarel.h b/engines/lastexpress/entities/mmeboutarel.h index 772451ba15..0f6e6349fe 100644 --- a/engines/lastexpress/entities/mmeboutarel.h +++ b/engines/lastexpress/entities/mmeboutarel.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_MMEBOUTAREL_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/pascale.h b/engines/lastexpress/entities/pascale.h index 333ebcae3e..eaf0f3ba0c 100644 --- a/engines/lastexpress/entities/pascale.h +++ b/engines/lastexpress/entities/pascale.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_PASCALE_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/rebecca.h b/engines/lastexpress/entities/rebecca.h index e91ee30d4d..885632f884 100644 --- a/engines/lastexpress/entities/rebecca.h +++ b/engines/lastexpress/entities/rebecca.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_REBECCA_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/salko.h b/engines/lastexpress/entities/salko.h index 6308211053..6ca73e39f6 100644 --- a/engines/lastexpress/entities/salko.h +++ b/engines/lastexpress/entities/salko.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_SALKO_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/servers0.h b/engines/lastexpress/entities/servers0.h index 2e9165a410..4c35637d65 100644 --- a/engines/lastexpress/entities/servers0.h +++ b/engines/lastexpress/entities/servers0.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_SERVERS0_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/servers1.h b/engines/lastexpress/entities/servers1.h index 13b30696f0..c8f667ec5c 100644 --- a/engines/lastexpress/entities/servers1.h +++ b/engines/lastexpress/entities/servers1.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_SERVERS1_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/sophie.h b/engines/lastexpress/entities/sophie.h index 47cfa8065c..188788bb9b 100644 --- a/engines/lastexpress/entities/sophie.h +++ b/engines/lastexpress/entities/sophie.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_SOPHIE_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/tables.h b/engines/lastexpress/entities/tables.h index 7fcfc0499e..c213aac978 100644 --- a/engines/lastexpress/entities/tables.h +++ b/engines/lastexpress/entities/tables.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_TABLES_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/tatiana.h b/engines/lastexpress/entities/tatiana.h index c457d49b1e..8ec69db5e9 100644 --- a/engines/lastexpress/entities/tatiana.h +++ b/engines/lastexpress/entities/tatiana.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_TATIANA_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/train.h b/engines/lastexpress/entities/train.h index ea9e1d7a07..4b8bc10c1a 100644 --- a/engines/lastexpress/entities/train.h +++ b/engines/lastexpress/entities/train.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_TRAIN_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/vassili.h b/engines/lastexpress/entities/vassili.h index 843a065174..d006770f7b 100644 --- a/engines/lastexpress/entities/vassili.h +++ b/engines/lastexpress/entities/vassili.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_VASSILI_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/verges.h b/engines/lastexpress/entities/verges.h index 17a3c8ac40..82381043d3 100644 --- a/engines/lastexpress/entities/verges.h +++ b/engines/lastexpress/entities/verges.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_VERGES_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/vesna.h b/engines/lastexpress/entities/vesna.h index a09664096d..025d45882e 100644 --- a/engines/lastexpress/entities/vesna.h +++ b/engines/lastexpress/entities/vesna.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_VESNA_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/yasmin.h b/engines/lastexpress/entities/yasmin.h index e943a8b158..b1413f5c2f 100644 --- a/engines/lastexpress/entities/yasmin.h +++ b/engines/lastexpress/entities/yasmin.h @@ -24,7 +24,6 @@ #define LASTEXPRESS_YASMIN_H #include "lastexpress/entities/entity.h" -#include "lastexpress/entities/entity_intern.h" namespace LastExpress { -- cgit v1.2.3 From 2d6f7992351c9737f71964ad64c307fa6d1543cf Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 25 Jul 2012 21:55:18 -0400 Subject: LASTEXPRESS: Cleanup unused arguments from BEGIN_SETUP macro --- engines/lastexpress/entities/entity.h | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 634e4000b3..6a32fb6de0 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -111,14 +111,14 @@ struct SavePoint; // Setup ////////////////////////////////////////////////////////////////////////// -#define IMPLEMENT_SETUP(class, callback_class, name, index) \ +#define IMPLEMENT_SETUP(class, name, index) \ void class::setup_##name() { \ - BEGIN_SETUP(callback_class, name, index, EntityData::EntityParametersIIII) \ + BEGIN_SETUP(index, EntityData::EntityParametersIIII) \ debugC(6, kLastExpressDebugLogic, "Entity: " #class "::setup_" #name "()"); \ END_SETUP() \ } -#define BEGIN_SETUP(class, name, index, type) \ +#define BEGIN_SETUP(index, type) \ _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); \ _data->setCurrentCallback(index); \ _data->resetCurrentParameters(); @@ -145,7 +145,7 @@ void class::setup_##name() { \ // simple setup with no parameters #define IMPLEMENT_FUNCTION(index, class, name) \ - IMPLEMENT_SETUP(class, class, name, index) \ + IMPLEMENT_SETUP(class, name, index) \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "() - action: %s", ACTION_NAME(savepoint.action)); @@ -154,12 +154,12 @@ void class::setup_##name() { \ // nullfunction call #define IMPLEMENT_NULL_FUNCTION(index, class) \ - IMPLEMENT_SETUP(class, Entity, nullfunction, index) + IMPLEMENT_SETUP(class, nullfunction, index) // setup with one uint parameter #define IMPLEMENT_FUNCTION_I(index, class, name, paramType) \ void class::setup_##name(paramType param1) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ + BEGIN_SETUP(index, EntityData::EntityParametersIIII) \ EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ params->param1 = (unsigned int)param1; \ END_SETUP() \ @@ -171,7 +171,7 @@ void class::setup_##name() { \ // setup with two uint parameters #define IMPLEMENT_FUNCTION_II(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ + BEGIN_SETUP(index, EntityData::EntityParametersIIII) \ EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ params->param1 = param1; \ params->param2 = param2; \ @@ -184,7 +184,7 @@ void class::setup_##name() { \ // setup with three uint parameters #define IMPLEMENT_FUNCTION_III(index, class, name, paramType1, paramType2, paramType3) \ void class::setup_##name(paramType1 param1, paramType2 param2, paramType3 param3) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIIII) \ + BEGIN_SETUP(index, EntityData::EntityParametersIIII) \ EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ params->param1 = param1; \ params->param2 = param2; \ @@ -198,7 +198,7 @@ void class::setup_##name() { \ // setup with one char *parameter #define IMPLEMENT_FUNCTION_S(index, class, name) \ void class::setup_##name(const char *seq1) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ + BEGIN_SETUP(index, EntityData::EntityParametersSIIS) \ EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ strncpy((char *)¶ms->seq1, seq1, 12); \ END_SETUP() \ @@ -210,7 +210,7 @@ void class::setup_##name() { \ // setup with one char *parameter and one uint #define IMPLEMENT_FUNCTION_SI(index, class, name, paramType2) \ void class::setup_##name(const char *seq1, paramType2 param4) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ + BEGIN_SETUP(index, EntityData::EntityParametersSIIS) \ EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ strncpy((char *)¶ms->seq1, seq1, 12); \ params->param4 = param4; \ @@ -223,7 +223,7 @@ void class::setup_##name() { \ // setup with one char *parameter and two uints #define IMPLEMENT_FUNCTION_SII(index, class, name, paramType2, paramType3) \ void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ + BEGIN_SETUP(index, EntityData::EntityParametersSIIS) \ EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ strncpy((char *)¶ms->seq1, seq1, 12); \ params->param4 = param4; \ @@ -237,7 +237,7 @@ void class::setup_##name() { \ // setup with one char *parameter and three uints #define IMPLEMENT_FUNCTION_SIII(index, class, name, paramType2, paramType3, paramType4) \ void class::setup_##name(const char *seq, paramType2 param4, paramType3 param5, paramType4 param6) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIII) \ + BEGIN_SETUP(index, EntityData::EntityParametersSIII) \ EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII*)_data->getCurrentParameters(); \ strncpy((char *)¶ms->seq, seq, 12); \ params->param4 = param4; \ @@ -251,7 +251,7 @@ void class::setup_##name() { \ #define IMPLEMENT_FUNCTION_SIIS(index, class, name, paramType2, paramType3) \ void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5, const char *seq2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSIIS) \ + BEGIN_SETUP(index, EntityData::EntityParametersSIIS) \ EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ strncpy((char *)¶ms->seq1, seq1, 12); \ params->param4 = param4; \ @@ -265,7 +265,7 @@ void class::setup_##name() { \ #define IMPLEMENT_FUNCTION_SS(index, class, name) \ void class::setup_##name(const char *seq1, const char *seq2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSSII) \ + BEGIN_SETUP(index, EntityData::EntityParametersSSII) \ EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); \ strncpy((char *)¶ms->seq1, seq1, 12); \ strncpy((char *)¶ms->seq2, seq2, 12); \ @@ -277,7 +277,7 @@ void class::setup_##name() { \ #define IMPLEMENT_FUNCTION_SSI(index, class, name, paramType3) \ void class::setup_##name(const char *seq1, const char *seq2, paramType3 param7) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersSSII) \ + BEGIN_SETUP(index, EntityData::EntityParametersSSII) \ EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); \ strncpy((char *)¶ms->seq1, seq1, 12); \ strncpy((char *)¶ms->seq2, seq2, 12); \ @@ -290,7 +290,7 @@ void class::setup_##name() { \ #define IMPLEMENT_FUNCTION_IS(index, class, name, paramType) \ void class::setup_##name(paramType param1, const char *seq) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersISII) \ + BEGIN_SETUP(index, EntityData::EntityParametersISII) \ EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII*)_data->getCurrentParameters(); \ params->param1 = (unsigned int)param1; \ strncpy((char *)¶ms->seq, seq, 12); \ @@ -302,7 +302,7 @@ void class::setup_##name() { \ #define IMPLEMENT_FUNCTION_ISS(index, class, name, paramType) \ void class::setup_##name(paramType param1, const char *seq1, const char *seq2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersISSI) \ + BEGIN_SETUP(index, EntityData::EntityParametersISSI) \ EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI*)_data->getCurrentParameters(); \ params->param1 = param1; \ strncpy((char *)¶ms->seq1, seq1, 12); \ @@ -315,7 +315,7 @@ void class::setup_##name() { \ #define IMPLEMENT_FUNCTION_IIS(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIISI) \ + BEGIN_SETUP(index, EntityData::EntityParametersIISI) \ EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI*)_data->getCurrentParameters(); \ params->param1 = param1; \ params->param2 = param2; \ @@ -328,7 +328,7 @@ void class::setup_##name() { \ #define IMPLEMENT_FUNCTION_IISS(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq1, const char *seq2) { \ - BEGIN_SETUP(class, name, index, EntityData::EntityParametersIISS) \ + BEGIN_SETUP(index, EntityData::EntityParametersIISS) \ EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS*)_data->getCurrentParameters(); \ params->param1 = param1; \ params->param2 = param2; \ -- cgit v1.2.3 From b4b4a7d127194cf29fdfcf5ee7b41b875d26b37e Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 26 Jul 2012 16:26:35 -0400 Subject: LASTEXPRESS: Replace setup macros by functions --- engines/lastexpress/entities/entity.cpp | 40 ++++ engines/lastexpress/entities/entity.h | 375 +++++++++++++++++++++----------- 2 files changed, 285 insertions(+), 130 deletions(-) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index a9ceaa16a9..8595978390 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -595,6 +595,46 @@ void Entity::callbackAction() { getSavePoints()->call(_entityIndex, _entityIndex, kActionCallback); } +////////////////////////////////////////////////////////////////////////// +// Setup functions +////////////////////////////////////////////////////////////////////////// +void Entity::setup(const char *name, uint index) { + debugC(6, kLastExpressDebugLogic, "Entity: %s()", name); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupS(const char *name, uint index, const char *seq1) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s)", name, seq1); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); + strncpy((char *)¶ms->seq1, seq1, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupSS(const char *name, uint index, const char *seq1, const char *seq2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %s)", name, seq1, seq2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); + strncpy((char *)¶ms->seq1, seq1, 12); + strncpy((char *)¶ms->seq2, seq2, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + ////////////////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 6a32fb6de0..18039e9432 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -107,26 +107,6 @@ struct SavePoint; getEntities()->resetState(entity); \ ((class *)getEntities()->get(entity))->function(); -////////////////////////////////////////////////////////////////////////// -// Setup -////////////////////////////////////////////////////////////////////////// - -#define IMPLEMENT_SETUP(class, name, index) \ -void class::setup_##name() { \ - BEGIN_SETUP(index, EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::setup_" #name "()"); \ - END_SETUP() \ -} - -#define BEGIN_SETUP(index, type) \ - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); \ - _data->setCurrentCallback(index); \ - _data->resetCurrentParameters(); - -#define END_SETUP() \ - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - - ////////////////////////////////////////////////////////////////////////// // Implementation ////////////////////////////////////////////////////////////////////////// @@ -137,7 +117,6 @@ void class::setup_##name() { \ if (!params) \ error("[EXPOSE_PARAMS] Trying to call an entity function with invalid parameters"); \ - // function signature without setup (we keep the index for consistency but never use it) #define IMPLEMENT_FUNCTION_NOSETUP(index, class, name) \ void class::name(const SavePoint &savepoint) { \ @@ -145,7 +124,9 @@ void class::setup_##name() { \ // simple setup with no parameters #define IMPLEMENT_FUNCTION(index, class, name) \ - IMPLEMENT_SETUP(class, name, index) \ + void class::setup_##name() { \ + Entity::setup(#class "::setup_" #name, index); \ + } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "() - action: %s", ACTION_NAME(savepoint.action)); @@ -154,191 +135,128 @@ void class::setup_##name() { \ // nullfunction call #define IMPLEMENT_NULL_FUNCTION(index, class) \ - IMPLEMENT_SETUP(class, nullfunction, index) + void class::setup_nullfunction() { \ + Entity::setup(#class "::setup_nullfunction", index); \ + } // setup with one uint parameter #define IMPLEMENT_FUNCTION_I(index, class, name, paramType) \ void class::setup_##name(paramType param1) { \ - BEGIN_SETUP(index, EntityData::EntityParametersIIII) \ - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ - params->param1 = (unsigned int)param1; \ - END_SETUP() \ + Entity::setupI(#class "::setup_" #name, index, param1); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d) - action: %s", params->param1, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d) - action: %s", params->param1, ACTION_NAME(savepoint.action)); // setup with two uint parameters #define IMPLEMENT_FUNCTION_II(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2) { \ - BEGIN_SETUP(index, EntityData::EntityParametersIIII) \ - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - params->param2 = param2; \ - END_SETUP() \ + Entity::setupII(#class "::setup_" #name, index, param1, param2); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d) - action: %s", params->param1, params->param2, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d) - action: %s", params->param1, params->param2, ACTION_NAME(savepoint.action)); // setup with three uint parameters #define IMPLEMENT_FUNCTION_III(index, class, name, paramType1, paramType2, paramType3) \ void class::setup_##name(paramType1 param1, paramType2 param2, paramType3 param3) { \ - BEGIN_SETUP(index, EntityData::EntityParametersIIII) \ - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - params->param2 = param2; \ - params->param3 = param3; \ - END_SETUP() \ + Entity::setupIII(#class "::setup_" #name, index, param1, param2, param3); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %d) - action: %s", params->param1, params->param2, params->param3, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %d) - action: %s", params->param1, params->param2, params->param3, ACTION_NAME(savepoint.action)); // setup with one char *parameter #define IMPLEMENT_FUNCTION_S(index, class, name) \ void class::setup_##name(const char *seq1) { \ - BEGIN_SETUP(index, EntityData::EntityParametersSIIS) \ - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - END_SETUP() \ + Entity::setupS(#class "::setup_" #name, index, seq1); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s) - action: %s", (char *)¶ms->seq1, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s) - action: %s", (char *)¶ms->seq1, ACTION_NAME(savepoint.action)); // setup with one char *parameter and one uint #define IMPLEMENT_FUNCTION_SI(index, class, name, paramType2) \ void class::setup_##name(const char *seq1, paramType2 param4) { \ - BEGIN_SETUP(index, EntityData::EntityParametersSIIS) \ - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - params->param4 = param4; \ - END_SETUP() \ + Entity::setupSI(#class "::setup_" #name, index, seq1, param4); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d) - action: %s", (char *)¶ms->seq1, params->param4, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d) - action: %s", (char *)¶ms->seq1, params->param4, ACTION_NAME(savepoint.action)); // setup with one char *parameter and two uints #define IMPLEMENT_FUNCTION_SII(index, class, name, paramType2, paramType3) \ void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5) { \ - BEGIN_SETUP(index, EntityData::EntityParametersSIIS) \ - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - params->param4 = param4; \ - params->param5 = param5; \ - END_SETUP() \ + Entity::setupSII(#class "::setup_" #name, index, seq1, param4, param5); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d) - action: %s", (char *)¶ms->seq1, params->param4, params->param5, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d) - action: %s", (char *)¶ms->seq1, params->param4, params->param5, ACTION_NAME(savepoint.action)); // setup with one char *parameter and three uints #define IMPLEMENT_FUNCTION_SIII(index, class, name, paramType2, paramType3, paramType4) \ void class::setup_##name(const char *seq, paramType2 param4, paramType3 param5, paramType4 param6) { \ - BEGIN_SETUP(index, EntityData::EntityParametersSIII) \ - EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq, seq, 12); \ - params->param4 = param4; \ - params->param5 = param5; \ - params->param6 = param6; \ - END_SETUP() \ + Entity::setupSIII(#class "::setup_" #name, index, seq, param4, param5, param6); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d, %d) - action: %s", (char *)¶ms->seq, params->param4, params->param5, params->param6, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersSIII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d, %d) - action: %s", (char *)¶ms->seq, params->param4, params->param5, params->param6, ACTION_NAME(savepoint.action)); #define IMPLEMENT_FUNCTION_SIIS(index, class, name, paramType2, paramType3) \ void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5, const char *seq2) { \ - BEGIN_SETUP(index, EntityData::EntityParametersSIIS) \ - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - params->param4 = param4; \ - params->param5 = param5; \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - END_SETUP() \ + Entity::setupSIIS(#class "::setup_" #name, index, seq1, param4, param5, seq2); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d, %s) - action: %s", (char *)¶ms->seq1, params->param4, params->param5, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %d, %d, %s) - action: %s", (char *)¶ms->seq1, params->param4, params->param5, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); #define IMPLEMENT_FUNCTION_SS(index, class, name) \ void class::setup_##name(const char *seq1, const char *seq2) { \ - BEGIN_SETUP(index, EntityData::EntityParametersSSII) \ - EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - END_SETUP() \ + Entity::setupSS(#class "::setup_" #name, index, seq1, seq2); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %s) - action: %s", (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %s) - action: %s", (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); #define IMPLEMENT_FUNCTION_SSI(index, class, name, paramType3) \ void class::setup_##name(const char *seq1, const char *seq2, paramType3 param7) { \ - BEGIN_SETUP(index, EntityData::EntityParametersSSII) \ - EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - params->param7 = param7; \ - END_SETUP() \ + Entity::setupSSI(#class "::setup_" #name, index, seq1, seq2, param7); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %s, %d) - action: %s", (char *)¶ms->seq1, (char *)¶ms->seq2, params->param7, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%s, %s, %d) - action: %s", (char *)¶ms->seq1, (char *)¶ms->seq2, params->param7, ACTION_NAME(savepoint.action)); #define IMPLEMENT_FUNCTION_IS(index, class, name, paramType) \ void class::setup_##name(paramType param1, const char *seq) { \ - BEGIN_SETUP(index, EntityData::EntityParametersISII) \ - EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII*)_data->getCurrentParameters(); \ - params->param1 = (unsigned int)param1; \ - strncpy((char *)¶ms->seq, seq, 12); \ - END_SETUP() \ + Entity::setupIS(#class "::setup_" #name, index, param1, seq); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersISII) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %s) - action: %s", params->param1, (char *)¶ms->seq, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersISII) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %s) - action: %s", params->param1, (char *)¶ms->seq, ACTION_NAME(savepoint.action)); #define IMPLEMENT_FUNCTION_ISS(index, class, name, paramType) \ void class::setup_##name(paramType param1, const char *seq1, const char *seq2) { \ - BEGIN_SETUP(index, EntityData::EntityParametersISSI) \ - EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - END_SETUP() \ + Entity::setupISS(#class "::setup_" #name, index, param1, seq1, seq2); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersISSI) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %s, %s) - action: %s", params->param1, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersISSI) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %s, %s) - action: %s", params->param1, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); #define IMPLEMENT_FUNCTION_IIS(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq) { \ - BEGIN_SETUP(index, EntityData::EntityParametersIISI) \ - EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - params->param2 = param2; \ - strncpy((char *)¶ms->seq, seq, 12); \ - END_SETUP() \ + Entity::setupIIS(#class "::setup_" #name, index, param1, param2, seq); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIISI) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersIISI) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq, ACTION_NAME(savepoint.action)); #define IMPLEMENT_FUNCTION_IISS(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq1, const char *seq2) { \ - BEGIN_SETUP(index, EntityData::EntityParametersIISS) \ - EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS*)_data->getCurrentParameters(); \ - params->param1 = param1; \ - params->param2 = param2; \ - strncpy((char *)¶ms->seq1, seq1, 12); \ - strncpy((char *)¶ms->seq2, seq2, 12); \ - END_SETUP() \ + Entity::setupIISS(#class "::setup_" #name, index, param1, param2, seq1, seq2); \ } \ void class::name(const SavePoint &savepoint) { \ - EXPOSE_PARAMS(EntityData::EntityParametersIISS) \ - debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); + EXPOSE_PARAMS(EntityData::EntityParametersIISS) \ + debugC(6, kLastExpressDebugLogic, "Entity: " #class "::" #name "(%d, %d, %s, %s) - action: %s", params->param1, params->param2, (char *)¶ms->seq1, (char *)¶ms->seq2, ACTION_NAME(savepoint.action)); ////////////////////////////////////////////////////////////////////////// @@ -1144,6 +1062,203 @@ protected: */ void callbackAction(); + ////////////////////////////////////////////////////////////////////////// + // Setup functions + ////////////////////////////////////////////////////////////////////////// + void setup(const char *name, uint index); + void setupS(const char *name, uint index, const char *seq1); + void setupSS(const char *name, uint index, const char *seq1, const char *seq2); + + template + void setupI(const char *name, uint index, T param1) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%d)", name, param1); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); + params->param1 = (unsigned int)param1; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupII(const char *name, uint index, T1 param1, T2 param2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %d)", name, param1, param2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); + params->param1 = param1; + params->param2 = param2; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupIII(const char *name, uint index, T1 param1, T2 param2, T3 param3) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %d, %d)", name, param1, param2, param3); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); + params->param1 = param1; + params->param2 = param2; + params->param3 = param3; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupSI(const char *name, uint index, const char *seq1, T param4) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %d)", name, seq1, param4); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); + strncpy((char *)¶ms->seq1, seq1, 12); + params->param4 = param4; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupSII(const char *name, uint index, const char *seq1, T1 param4, T2 param5) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %d, %d)", name, seq1, param4, param5); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); + strncpy((char *)¶ms->seq1, seq1, 12); + params->param4 = param4; + params->param5 = param5; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupSIII(const char *name, uint index, const char *seq, T1 param4, T2 param5, T3 param6) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %d, %d, %d)", name, seq, param4, param5, param6); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII*)_data->getCurrentParameters(); + strncpy((char *)¶ms->seq, seq, 12); + params->param4 = param4; + params->param5 = param5; + params->param6 = param6; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupSIIS(const char *name, uint index, const char *seq1, T1 param4, T2 param5, const char *seq2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %d, %d, %s)", name, seq1, param4, param5, seq2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); + strncpy((char *)¶ms->seq1, seq1, 12); + params->param4 = param4; + params->param5 = param5; + strncpy((char *)¶ms->seq2, seq2, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupSSI(const char *name, uint index, const char *seq1, const char *seq2, T param7) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %s, %d)", name, seq1, seq2, param7); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); + strncpy((char *)¶ms->seq1, seq1, 12); + strncpy((char *)¶ms->seq2, seq2, 12); + params->param7 = param7; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupIS(const char *name, uint index, T param1, const char *seq) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %s)", name, param1, seq); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII*)_data->getCurrentParameters(); + params->param1 = (unsigned int)param1; + strncpy((char *)¶ms->seq, seq, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupISS(const char *name, uint index, T param1, const char *seq1, const char *seq2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %s, %s)", name, param1, seq1, seq2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI*)_data->getCurrentParameters(); + params->param1 = param1; + strncpy((char *)¶ms->seq1, seq1, 12); + strncpy((char *)¶ms->seq2, seq2, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupIIS(const char *name, uint index, T1 param1, T2 param2, const char *seq) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %d, %s)", name, param1, param2, seq); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI*)_data->getCurrentParameters(); + params->param1 = param1; + params->param2 = param2; + strncpy((char *)¶ms->seq, seq, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + + template + void setupIISS(const char *name, uint index, T1 param1, T2 param2, const char *seq1, const char *seq2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %d, %s, %s)", name, param1, param2, seq1, seq2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS*)_data->getCurrentParameters(); + params->param1 = param1; + params->param2 = param2; + strncpy((char *)¶ms->seq1, seq1, 12); + strncpy((char *)¶ms->seq2, seq2, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); + } + ////////////////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3 From 3d6807b35905a951688508d3b696ee48c1453c4d Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 26 Jul 2012 17:19:58 -0400 Subject: LASTEXPRESS: Implement Logic::resetState() --- engines/lastexpress/game/logic.cpp | 7 +++++-- engines/lastexpress/game/scenes.cpp | 31 +++++++++++++++++++------------ engines/lastexpress/game/scenes.h | 1 + 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp index 5f220479d1..c8e4c22ec5 100644 --- a/engines/lastexpress/game/logic.cpp +++ b/engines/lastexpress/game/logic.cpp @@ -408,9 +408,12 @@ void Logic::eventTick(const Common::Event &) { * Resets the game state. */ void Logic::resetState() { - getState()->scene = kSceneDefault; + getScenes()->setCoordinates(Common::Rect(80, 0, 559, 479)); - warning("[Logic::resetState] Not implemented! You need to restart the engine until this is implemented."); + SAFE_DELETE(_entities); + SAFE_DELETE(_state); + _entities = new Entities(_engine); + _state = new State(_engine); } /** diff --git a/engines/lastexpress/game/scenes.cpp b/engines/lastexpress/game/scenes.cpp index 254b0fdb58..447e8714b0 100644 --- a/engines/lastexpress/game/scenes.cpp +++ b/engines/lastexpress/game/scenes.cpp @@ -739,24 +739,31 @@ void SceneManager::resetQueue() { _queue.clear(); } -void SceneManager::setCoordinates(SequenceFrame *frame) { +void SceneManager::setCoordinates(Common::Rect rect) { + _flagCoordinates = true; - if (!frame || frame->getInfo()->subType == 3) - return; + if (_coords.right > rect.right) + _coords.right = rect.right; - _flagCoordinates = true; + if (_coords.bottom > rect.bottom) + _coords.bottom = rect.bottom; - if (_coords.right > (int)frame->getInfo()->xPos1) - _coords.right = (int16)frame->getInfo()->xPos1; + if (_coords.left < rect.left) + _coords.left = rect.left; - if (_coords.bottom > (int)frame->getInfo()->yPos1) - _coords.bottom = (int16)frame->getInfo()->yPos1; + if (_coords.top < rect.top) + _coords.top = rect.top; +} + +void SceneManager::setCoordinates(SequenceFrame *frame) { - if (_coords.left < (int)frame->getInfo()->xPos2) - _coords.left = (int16)frame->getInfo()->xPos2; + if (!frame || frame->getInfo()->subType == 3) + return; - if (_coords.top < (int)frame->getInfo()->yPos2) - _coords.top = (int16)frame->getInfo()->yPos2; + setCoordinates(Common::Rect((int16)frame->getInfo()->xPos1, + (int16)frame->getInfo()->yPos1, + (int16)frame->getInfo()->xPos2, + (int16)frame->getInfo()->yPos2)); } void SceneManager::resetCoordinates() { diff --git a/engines/lastexpress/game/scenes.h b/engines/lastexpress/game/scenes.h index 172dde2683..a866c65111 100644 --- a/engines/lastexpress/game/scenes.h +++ b/engines/lastexpress/game/scenes.h @@ -79,6 +79,7 @@ public: void removeAndRedraw(SequenceFrame **frame, bool doRedraw); void resetQueue(); void setCoordinates(SequenceFrame *frame); + void setCoordinates(Common::Rect rect); // Helpers SceneIndex getSceneIndexFromPosition(CarIndex car, Position position, int param3 = -1); -- cgit v1.2.3 From 115a4d36ba673579bd683cac90828f22606f7468 Mon Sep 17 00:00:00 2001 From: Julien Date: Thu, 26 Jul 2012 17:19:58 -0400 Subject: LASTEXPRESS: Move includes to header for setup function templates --- engines/lastexpress/entities/entity.cpp | 5 +---- engines/lastexpress/entities/entity.h | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 8595978390..02822256d0 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -28,12 +28,9 @@ #include "lastexpress/game/entities.h" #include "lastexpress/game/logic.h" #include "lastexpress/game/object.h" -#include "lastexpress/game/scenes.h" -#include "lastexpress/game/state.h" #include "lastexpress/game/savegame.h" #include "lastexpress/game/savepoint.h" - -#include "lastexpress/lastexpress.h" +#include "lastexpress/game/scenes.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 18039e9432..872eae188e 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -26,7 +26,9 @@ #include "lastexpress/shared.h" #include "lastexpress/sound/sound.h" +#include "lastexpress/game/state.h" +#include "lastexpress/lastexpress.h" #include "lastexpress/helpers.h" #include "common/array.h" -- cgit v1.2.3 From 6aeda2638b9bdfbbef3b0fb89c1c776415e13c2c Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 27 Jul 2012 00:54:24 -0400 Subject: LASTEXPRESS: More include re-organization --- engines/lastexpress/debug.cpp | 1 + engines/lastexpress/entities/entity.cpp | 2 -- engines/lastexpress/entities/entity.h | 9 +++++---- engines/lastexpress/fight/fight.cpp | 3 +++ engines/lastexpress/game/inventory.cpp | 3 +++ engines/lastexpress/game/logic.cpp | 1 + engines/lastexpress/game/logic.h | 2 -- engines/lastexpress/game/object.cpp | 1 + engines/lastexpress/game/savegame.cpp | 1 + engines/lastexpress/game/savepoint.cpp | 12 ++++++------ engines/lastexpress/game/savepoint.h | 7 +++---- engines/lastexpress/lastexpress.cpp | 2 ++ engines/lastexpress/menu/menu.cpp | 1 + engines/lastexpress/sound/queue.cpp | 2 ++ 14 files changed, 29 insertions(+), 18 deletions(-) diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp index f64b172f73..13a8a77ca9 100644 --- a/engines/lastexpress/debug.cpp +++ b/engines/lastexpress/debug.cpp @@ -34,6 +34,7 @@ #include "lastexpress/game/action.h" #include "lastexpress/game/beetle.h" +#include "lastexpress/game/entities.h" #include "lastexpress/game/inventory.h" #include "lastexpress/game/logic.h" #include "lastexpress/game/object.h" diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 02822256d0..0842a7a78c 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -26,10 +26,8 @@ #include "lastexpress/game/action.h" #include "lastexpress/game/entities.h" -#include "lastexpress/game/logic.h" #include "lastexpress/game/object.h" #include "lastexpress/game/savegame.h" -#include "lastexpress/game/savepoint.h" #include "lastexpress/game/scenes.h" namespace LastExpress { diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 872eae188e..e890bba0b5 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -25,9 +25,12 @@ #include "lastexpress/shared.h" -#include "lastexpress/sound/sound.h" +#include "lastexpress/game/logic.h" +#include "lastexpress/game/savepoint.h" #include "lastexpress/game/state.h" +#include "lastexpress/sound/sound.h" + #include "lastexpress/lastexpress.h" #include "lastexpress/helpers.h" @@ -864,9 +867,6 @@ private: class Entity : Common::Serializable { public: - - typedef Common::Functor1 Callback; - Entity(LastExpressEngine *engine, EntityIndex index); virtual ~Entity(); @@ -900,6 +900,7 @@ public: protected: LastExpressEngine *_engine; + typedef Common::Functor1 Callback; EntityIndex _entityIndex; EntityData *_data; diff --git a/engines/lastexpress/fight/fight.cpp b/engines/lastexpress/fight/fight.cpp index 22d9da80be..b00c1732e7 100644 --- a/engines/lastexpress/fight/fight.cpp +++ b/engines/lastexpress/fight/fight.cpp @@ -31,6 +31,7 @@ #include "lastexpress/data/cursor.h" #include "lastexpress/data/sequence.h" +#include "lastexpress/game/entities.h" #include "lastexpress/game/inventory.h" #include "lastexpress/game/logic.h" #include "lastexpress/game/object.h" @@ -38,8 +39,10 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" +#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" +#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index 70536b7a6d..a36553c768 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -26,6 +26,7 @@ #include "lastexpress/data/scene.h" #include "lastexpress/data/snd.h" +#include "lastexpress/game/entities.h" #include "lastexpress/game/logic.h" #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" @@ -33,8 +34,10 @@ #include "lastexpress/menu/menu.h" #include "lastexpress/sound/queue.h" +#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" +#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" #include "lastexpress/resource.h" diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp index c8e4c22ec5..795f165766 100644 --- a/engines/lastexpress/game/logic.cpp +++ b/engines/lastexpress/game/logic.cpp @@ -36,6 +36,7 @@ // Game #include "lastexpress/game/action.h" #include "lastexpress/game/beetle.h" +#include "lastexpress/game/entities.h" #include "lastexpress/game/inventory.h" #include "lastexpress/game/object.h" #include "lastexpress/game/savegame.h" diff --git a/engines/lastexpress/game/logic.h b/engines/lastexpress/game/logic.h index 8b7dcef942..84b64a998b 100644 --- a/engines/lastexpress/game/logic.h +++ b/engines/lastexpress/game/logic.h @@ -25,8 +25,6 @@ #include "lastexpress/shared.h" -#include "lastexpress/game/entities.h" - #include "lastexpress/eventhandler.h" #include "common/events.h" diff --git a/engines/lastexpress/game/object.cpp b/engines/lastexpress/game/object.cpp index 91dcfcfb4a..48df91ea6d 100644 --- a/engines/lastexpress/game/object.cpp +++ b/engines/lastexpress/game/object.cpp @@ -22,6 +22,7 @@ #include "lastexpress/game/object.h" +#include "lastexpress/game/entities.h" #include "lastexpress/game/logic.h" #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp index 76cfe9525f..4c268d84c6 100644 --- a/engines/lastexpress/game/savegame.cpp +++ b/engines/lastexpress/game/savegame.cpp @@ -22,6 +22,7 @@ #include "lastexpress/game/savegame.h" +#include "lastexpress/game/entities.h" #include "lastexpress/game/inventory.h" #include "lastexpress/game/logic.h" #include "lastexpress/game/object.h" diff --git a/engines/lastexpress/game/savepoint.cpp b/engines/lastexpress/game/savepoint.cpp index 0b5ff42679..557468e222 100644 --- a/engines/lastexpress/game/savepoint.cpp +++ b/engines/lastexpress/game/savepoint.cpp @@ -94,7 +94,7 @@ void SavePoints::process() { if (!updateEntityFromData(savepoint)) { // Call requested callback - Entity::Callback *callback = getCallback(savepoint.entity1); + Callback *callback = getCallback(savepoint.entity1); if (callback && callback->isValid()) { debugC(8, kLastExpressDebugLogic, "Savepoint: entity1=%s, action=%s, entity2=%s", ENTITY_NAME(savepoint.entity1), ACTION_NAME(savepoint.action), ENTITY_NAME(savepoint.entity2)); (*callback)(savepoint); @@ -125,7 +125,7 @@ void SavePoints::addData(EntityIndex entity, ActionIndex action, uint32 param) { ////////////////////////////////////////////////////////////////////////// // Callbacks ////////////////////////////////////////////////////////////////////////// -void SavePoints::setCallback(EntityIndex index, Entity::Callback *callback) { +void SavePoints::setCallback(EntityIndex index, Callback *callback) { if (index >= 40) error("[SavePoints::setCallback] Attempting to use an invalid entity index. Valid values 0-39, was %d", index); @@ -135,7 +135,7 @@ void SavePoints::setCallback(EntityIndex index, Entity::Callback *callback) { _callbacks[index] = callback; } -Entity::Callback *SavePoints::getCallback(EntityIndex index) const { +Callback *SavePoints::getCallback(EntityIndex index) const { if (index >= 40) error("[SavePoints::getCallback] Attempting to use an invalid entity index. Valid values 0-39, was %d", index); @@ -149,7 +149,7 @@ void SavePoints::call(EntityIndex entity2, EntityIndex entity1, ActionIndex acti point.entity2 = entity2; point.param.intValue = param; - Entity::Callback *callback = getCallback(entity1); + Callback *callback = getCallback(entity1); if (callback != NULL && callback->isValid()) { debugC(8, kLastExpressDebugLogic, "Savepoint: entity1=%s, action=%s, entity2=%s, param=%d", ENTITY_NAME(entity1), ACTION_NAME(action), ENTITY_NAME(entity2), param); (*callback)(point); @@ -163,7 +163,7 @@ void SavePoints::call(EntityIndex entity2, EntityIndex entity1, ActionIndex acti point.entity2 = entity2; strcpy((char *)&point.param.charValue, param); - Entity::Callback *callback = getCallback(entity1); + Callback *callback = getCallback(entity1); if (callback != NULL && callback->isValid()) { debugC(8, kLastExpressDebugLogic, "Savepoint: entity1=%s, action=%s, entity2=%s, param=%s", ENTITY_NAME(entity1), ACTION_NAME(action), ENTITY_NAME(entity2), param); (*callback)(point); @@ -180,7 +180,7 @@ void SavePoints::callAndProcess() { bool isRunning = getFlags()->isGameRunning; while (isRunning) { - Entity::Callback *callback = getCallback(index); + Callback *callback = getCallback(index); if (callback != NULL && callback->isValid()) { (*callback)(savepoint); isRunning = getFlags()->isGameRunning; diff --git a/engines/lastexpress/game/savepoint.h b/engines/lastexpress/game/savepoint.h index a3303b4b8a..181676cc1f 100644 --- a/engines/lastexpress/game/savepoint.h +++ b/engines/lastexpress/game/savepoint.h @@ -74,10 +74,9 @@ struct SavePoint { } }; -class SavePoints : Common::Serializable { -private: - typedef Common::Functor1 Callback; +typedef Common::Functor1 Callback; +class SavePoints : Common::Serializable { public: struct SavePointData { @@ -112,7 +111,7 @@ public: void addData(EntityIndex entity, ActionIndex action, uint32 param); // Callbacks - void setCallback(EntityIndex index, Entity::Callback *callback); + void setCallback(EntityIndex index, Callback *callback); Callback *getCallback(EntityIndex entity) const; void call(EntityIndex entity2, EntityIndex entity1, ActionIndex action, uint32 param = 0) const; void call(EntityIndex entity2, EntityIndex entity1, ActionIndex action, const char *param) const; diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp index 74d1969e01..01d2634dec 100644 --- a/engines/lastexpress/lastexpress.cpp +++ b/engines/lastexpress/lastexpress.cpp @@ -32,8 +32,10 @@ #include "lastexpress/menu/menu.h" #include "lastexpress/sound/queue.h" +#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" +#include "lastexpress/helpers.h" #include "lastexpress/resource.h" #include "common/config-manager.h" diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp index 3254bed130..7095389f74 100644 --- a/engines/lastexpress/menu/menu.cpp +++ b/engines/lastexpress/menu/menu.cpp @@ -30,6 +30,7 @@ #include "lastexpress/fight/fight.h" +#include "lastexpress/game/entities.h" #include "lastexpress/game/inventory.h" #include "lastexpress/game/logic.h" #include "lastexpress/game/savegame.h" diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp index 1fbb4138e3..7b3dbcf2d9 100644 --- a/engines/lastexpress/sound/queue.cpp +++ b/engines/lastexpress/sound/queue.cpp @@ -26,7 +26,9 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/entry.h" +#include "lastexpress/sound/sound.h" +#include "lastexpress/helpers.h" #include "lastexpress/lastexpress.h" namespace LastExpress { -- cgit v1.2.3 From 7423885f699aff327129a73da3d99f2f860e354f Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 27 Jul 2012 01:14:30 -0400 Subject: LASTEXPRESS: Remove entity include in savepoint.h --- engines/lastexpress/game/savepoint.h | 3 +-- engines/lastexpress/sound/entry.cpp | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/lastexpress/game/savepoint.h b/engines/lastexpress/game/savepoint.h index 181676cc1f..005133891a 100644 --- a/engines/lastexpress/game/savepoint.h +++ b/engines/lastexpress/game/savepoint.h @@ -23,9 +23,8 @@ #ifndef LASTEXPRESS_SAVEPOINT_H #define LASTEXPRESS_SAVEPOINT_H -#include "lastexpress/entities/entity.h" - #include "lastexpress/helpers.h" +#include "lastexpress/shared.h" #include "common/array.h" #include "common/list.h" diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp index 3d2b05895f..d689447ff9 100644 --- a/engines/lastexpress/sound/entry.cpp +++ b/engines/lastexpress/sound/entry.cpp @@ -27,6 +27,7 @@ #include "lastexpress/game/state.h" #include "lastexpress/sound/queue.h" +#include "lastexpress/sound/sound.h" #include "lastexpress/graphics.h" #include "lastexpress/lastexpress.h" -- cgit v1.2.3 From a364ef8f0fca2675f791a29ef231385e29945939 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 27 Jul 2012 11:01:21 -0400 Subject: VIDEO: Remove Track::getStartTime() That should be handled internally instead --- video/video_decoder.cpp | 17 ++++------------- video/video_decoder.h | 6 ------ 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 77eab3a6e1..cea3960fee 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -210,7 +210,7 @@ uint32 AdvancedVideoDecoder::getTime() const { uint32 time = ((const AudioTrack *)*it)->getRunningTime(); if (time != 0) - return time + (*it)->getStartTime().msecs() + _audioStartOffset.msecs(); + return time + _audioStartOffset.msecs(); } } } @@ -364,15 +364,10 @@ Audio::Timestamp AdvancedVideoDecoder::getDuration() const { Audio::Timestamp maxDuration(0, 1000); for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { - Audio::Timestamp startTime = (*it)->getStartTime(); Audio::Timestamp duration = (*it)->getDuration(); - if (duration.totalNumberOfFrames() != 0) { - // HACK: Timestamp's + operator doesn't do framerate conversion :( - duration = duration + startTime.convertToFramerate(duration.framerate()); - if (duration > maxDuration) - maxDuration = duration; - } + if (duration > maxDuration) + maxDuration = duration; } return maxDuration; @@ -406,11 +401,7 @@ bool AdvancedVideoDecoder::Track::isRewindable() const { } bool AdvancedVideoDecoder::Track::rewind() { - return seek(getStartTime()); -} - -Audio::Timestamp AdvancedVideoDecoder::Track::getStartTime() const { - return Audio::Timestamp(0, 1000); + return seek(Audio::Timestamp(0, 1000)); } Audio::Timestamp AdvancedVideoDecoder::Track::getDuration() const { diff --git a/video/video_decoder.h b/video/video_decoder.h index f0427668a6..18517c9ad2 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -466,12 +466,6 @@ protected: */ bool isPaused() const { return _paused; } - /** - * Get the start time of the track (starting from the beginning of the - * movie). - */ - virtual Audio::Timestamp getStartTime() const; - /** * Get the duration of the track (starting from this track's start time). * -- cgit v1.2.3 From 90b72e31e4a9f2a23d912d31343ba25f27da7b3e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 27 Jul 2012 11:01:42 -0400 Subject: VIDEO: Cleanup AdvancedVideoDecoder --- video/video_decoder.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index cea3960fee..131c86fdb8 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -111,7 +111,7 @@ AdvancedVideoDecoder::AdvancedVideoDecoder() { } void AdvancedVideoDecoder::close() { - if (_isPlaying) + if (isPlaying()) stop(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) @@ -250,7 +250,7 @@ bool AdvancedVideoDecoder::endOfVideo() const { } bool AdvancedVideoDecoder::isRewindable() const { - if (_tracks.empty()) + if (!isVideoLoaded()) return false; for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) @@ -267,7 +267,7 @@ bool AdvancedVideoDecoder::rewind() { _needsRewind = false; // Stop all tracks so they can be rewound - if (_isPlaying) + if (isPlaying()) stopAllTracks(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) @@ -275,7 +275,7 @@ bool AdvancedVideoDecoder::rewind() { return false; // Now that we've rewound, start all tracks again - if (_isPlaying) + if (isPlaying()) startAllTracks(); _audioStartOffset = 0; @@ -285,7 +285,7 @@ bool AdvancedVideoDecoder::rewind() { } bool AdvancedVideoDecoder::isSeekable() const { - if (_tracks.empty()) + if (!isVideoLoaded()) return false; for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) @@ -302,7 +302,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { _needsRewind = false; // Stop all tracks so they can be seeked - if (_isPlaying) + if (isPlaying()) stopAllTracks(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) @@ -310,7 +310,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { return false; // Now that we've seeked, start all tracks again - if (_isPlaying) + if (isPlaying()) startAllTracks(); _audioStartOffset = time; @@ -321,7 +321,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { } void AdvancedVideoDecoder::start() { - if (_isPlaying || !isVideoLoaded()) + if (isPlaying() || !isVideoLoaded()) return; _isPlaying = true; @@ -336,7 +336,7 @@ void AdvancedVideoDecoder::start() { } void AdvancedVideoDecoder::stop() { - if (!_isPlaying) + if (!isPlaying()) return; _isPlaying = false; -- cgit v1.2.3 From 21d3fa71aff686f5b64361ae3410268fc0ab5968 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 27 Jul 2012 11:14:46 -0400 Subject: VIDEO: Add functions for getting TrackList iterators internally --- video/video_decoder.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/video/video_decoder.h b/video/video_decoder.h index 18517c9ad2..eff5a7c396 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -753,9 +753,24 @@ protected: */ const VideoTrack *findNextVideoTrack() const; + /** + * Typedef helpers for accessing tracks + */ + typedef Common::Array TrackList; + typedef TrackList::iterator TrackListIterator; + + /** + * Get the begin iterator of the tracks + */ + TrackListIterator getTrackListBegin() { return _tracks.begin(); } + + /** + * Get the end iterator of the tracks + */ + TrackListIterator getTrackListEnd() { return _tracks.end(); } + private: // Tracks owned by this AdvancedVideoDecoder - typedef Common::Array TrackList; TrackList _tracks; // Current playback status -- cgit v1.2.3 From 991710d0a158bfce4e54bd240482a4e3044271d3 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 27 Jul 2012 11:32:51 -0400 Subject: VIDEO: Adapt QuickTimeDecoder to the AdvancedVideoDecoder API --- common/quicktime.h | 1 + engines/mohawk/video.cpp | 13 +- engines/mohawk/video.h | 4 +- engines/sci/engine/kvideo.cpp | 4 +- video/qt_decoder.cpp | 650 +++++++++++++++--------------------------- video/qt_decoder.h | 183 +++--------- 6 files changed, 286 insertions(+), 569 deletions(-) diff --git a/common/quicktime.h b/common/quicktime.h index 974502d075..08ca35ad51 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -35,6 +35,7 @@ #include "common/scummsys.h" #include "common/stream.h" #include "common/rational.h" +#include "common/types.h" namespace Common { class MacResManager; diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp index 18d609c513..3b4e61646d 100644 --- a/engines/mohawk/video.cpp +++ b/engines/mohawk/video.cpp @@ -207,7 +207,7 @@ bool VideoManager::updateMovies() { // Remove any videos that are over if (_videoStreams[i].endOfVideo()) { if (_videoStreams[i].loop) { - _videoStreams[i]->seekToTime(_videoStreams[i].start); + _videoStreams[i]->seek(_videoStreams[i].start); } else { // Check the video time one last time before deleting it _vm->doVideoTimer(i, true); @@ -394,6 +394,8 @@ VideoHandle VideoManager::createVideoHandle(uint16 id, uint16 x, uint16 y, bool entry.loop = loop; entry.enabled = true; + entry->start(); + // Search for any deleted videos so we can take a formerly used slot for (uint32 i = 0; i < _videoStreams.size(); i++) if (!_videoStreams[i].video) { @@ -430,6 +432,7 @@ VideoHandle VideoManager::createVideoHandle(const Common::String &filename, uint entry->loadStream(file); entry->setVolume(volume); + entry->start(); // Search for any deleted videos so we can take a formerly used slot for (uint32 i = 0; i < _videoStreams.size(); i++) @@ -492,7 +495,7 @@ uint32 VideoManager::getTime(VideoHandle handle) { uint32 VideoManager::getDuration(VideoHandle handle) { assert(handle != NULL_VID_HANDLE); - return _videoStreams[handle]->getDuration(); + return _videoStreams[handle]->getDuration().msecs(); } bool VideoManager::endOfVideo(VideoHandle handle) { @@ -512,13 +515,13 @@ void VideoManager::setVideoBounds(VideoHandle handle, Audio::Timestamp start, Au assert(handle != NULL_VID_HANDLE); _videoStreams[handle].start = start; _videoStreams[handle].end = end; - _videoStreams[handle]->seekToTime(start); + _videoStreams[handle]->seek(start); } void VideoManager::drawVideoFrame(VideoHandle handle, Audio::Timestamp time) { assert(handle != NULL_VID_HANDLE); _videoStreams[handle].end = Audio::Timestamp(0xffffffff, 1); - _videoStreams[handle]->seekToTime(time); + _videoStreams[handle]->seek(time); updateMovies(); delete _videoStreams[handle].video; _videoStreams[handle].clear(); @@ -526,7 +529,7 @@ void VideoManager::drawVideoFrame(VideoHandle handle, Audio::Timestamp time) { void VideoManager::seekToTime(VideoHandle handle, Audio::Timestamp time) { assert(handle != NULL_VID_HANDLE); - _videoStreams[handle]->seekToTime(time); + _videoStreams[handle]->seek(time); } void VideoManager::setVideoLooping(VideoHandle handle, bool loop) { diff --git a/engines/mohawk/video.h b/engines/mohawk/video.h index 98bcadfb53..937cd0f2dd 100644 --- a/engines/mohawk/video.h +++ b/engines/mohawk/video.h @@ -45,7 +45,7 @@ struct MLSTRecord { struct VideoEntry { // Playback variables - Video::SeekableVideoDecoder *video; + Video::AdvancedVideoDecoder *video; uint16 x; uint16 y; bool loop; @@ -57,7 +57,7 @@ struct VideoEntry { int id; // Internal Mohawk files // Helper functions - Video::SeekableVideoDecoder *operator->() const { assert(video); return video; } // TODO: Remove this eventually + Video::AdvancedVideoDecoder *operator->() const { assert(video); return video; } // TODO: Remove this eventually void clear(); bool endOfVideo(); }; diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index 456f860493..da63aa3a8d 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -170,8 +170,6 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { delete videoDecoder; videoDecoder = 0; } - - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); // TODO: Remove after new API is complete } } else { // Windows AVI @@ -212,7 +210,6 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { videoDecoder = 0; } else { s->_videoState.fileName = filename; - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); } break; } @@ -222,6 +219,7 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { } if (videoDecoder) { + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); // TODO: Remove after new API is complete playVideo(videoDecoder, s->_videoState); // HACK: Switch back to 8bpp if we played a true color video. diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index aba545abc0..70dcdff9c6 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -33,14 +33,12 @@ #include "audio/audiostream.h" #include "common/debug.h" -#include "common/endian.h" #include "common/memstream.h" #include "common/system.h" #include "common/textconsole.h" #include "common/util.h" // Video codecs -#include "video/codecs/codec.h" #include "video/codecs/cinepak.h" #include "video/codecs/mjpeg.h" #include "video/codecs/qtrle.h" @@ -56,97 +54,43 @@ namespace Video { //////////////////////////////////////////// QuickTimeDecoder::QuickTimeDecoder() { - _setStartTime = false; _scaledSurface = 0; - _dirtyPalette = false; - _palette = 0; _width = _height = 0; - _needUpdate = false; } QuickTimeDecoder::~QuickTimeDecoder() { close(); } -int32 QuickTimeDecoder::getCurFrame() const { - // TODO: This is rather simplistic and doesn't take edits that - // repeat sections of the media into account. Doing that - // over-complicates things and shouldn't be necessary, but - // it would be nice to have in the future. - - int32 frame = -1; - - for (uint32 i = 0; i < _handlers.size(); i++) - if (_handlers[i]->getTrackType() == TrackHandler::kTrackTypeVideo) - frame += ((VideoTrackHandler *)_handlers[i])->getCurFrame() + 1; - - return frame; -} - -uint32 QuickTimeDecoder::getFrameCount() const { - uint32 count = 0; - - for (uint32 i = 0; i < _handlers.size(); i++) - if (_handlers[i]->getTrackType() == TrackHandler::kTrackTypeVideo) - count += ((VideoTrackHandler *)_handlers[i])->getFrameCount(); - - return count; -} - -void QuickTimeDecoder::startAudio() { - updateAudioBuffer(); - - for (uint32 i = 0; i < _audioTracks.size(); i++) { - g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audioHandles[i], _audioTracks[i], -1, getVolume(), getBalance(), DisposeAfterUse::NO); +bool QuickTimeDecoder::loadFile(const Common::String &filename) { + if (!Common::QuickTimeParser::parseFile(filename)) + return false; - // Pause the audio again if we're still paused - if (isPaused()) - g_system->getMixer()->pauseHandle(_audioHandles[i], true); - } + init(); + return true; } -void QuickTimeDecoder::stopAudio() { - for (uint32 i = 0; i < _audioHandles.size(); i++) - g_system->getMixer()->stopHandle(_audioHandles[i]); -} +bool QuickTimeDecoder::loadStream(Common::SeekableReadStream *stream) { + if (!Common::QuickTimeParser::parseStream(stream)) + return false; -void QuickTimeDecoder::pauseVideoIntern(bool pause) { - for (uint32 i = 0; i < _audioHandles.size(); i++) - g_system->getMixer()->pauseHandle(_audioHandles[i], pause); + init(); + return true; } -QuickTimeDecoder::VideoTrackHandler *QuickTimeDecoder::findNextVideoTrack() const { - VideoTrackHandler *bestTrack = 0; - uint32 bestTime = 0xffffffff; - - for (uint32 i = 0; i < _handlers.size(); i++) { - if (_handlers[i]->getTrackType() == TrackHandler::kTrackTypeVideo && !_handlers[i]->endOfTrack()) { - VideoTrackHandler *track = (VideoTrackHandler *)_handlers[i]; - uint32 time = track->getNextFrameStartTime(); +void QuickTimeDecoder::close() { + AdvancedVideoDecoder::close(); + Common::QuickTimeParser::close(); - if (time < bestTime) { - bestTime = time; - bestTrack = track; - } - } + if (_scaledSurface) { + _scaledSurface->free(); + delete _scaledSurface; + _scaledSurface = 0; } - - return bestTrack; } const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { - if (!_nextVideoTrack) - return 0; - - const Graphics::Surface *frame = _nextVideoTrack->decodeNextFrame(); - - if (!_setStartTime) { - _startTime = g_system->getMillis(); - _setStartTime = true; - } - - _nextVideoTrack = findNextVideoTrack(); - _needUpdate = false; + const Graphics::Surface *frame = AdvancedVideoDecoder::decodeNextFrame(); // Update audio buffers too // (needs to be done after we find the next track) @@ -166,138 +110,7 @@ const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { return frame; } -void QuickTimeDecoder::scaleSurface(const Graphics::Surface *src, Graphics::Surface *dst, Common::Rational scaleFactorX, Common::Rational scaleFactorY) { - assert(src && dst); - - for (int32 j = 0; j < dst->h; j++) - for (int32 k = 0; k < dst->w; k++) - memcpy(dst->getBasePtr(k, j), src->getBasePtr((k * scaleFactorX).toInt() , (j * scaleFactorY).toInt()), src->format.bytesPerPixel); -} - -bool QuickTimeDecoder::endOfVideo() const { - if (!isVideoLoaded()) - return true; - - for (uint32 i = 0; i < _handlers.size(); i++) - if (!_handlers[i]->endOfTrack()) - return false; - - return true; -} - -uint32 QuickTimeDecoder::getTime() const { - // Try to base sync off an active audio track - for (uint32 i = 0; i < _audioHandles.size(); i++) { - if (g_system->getMixer()->isSoundHandleActive(_audioHandles[i])) { - uint32 time = g_system->getMixer()->getSoundElapsedTime(_audioHandles[i]) + _audioStartOffset.msecs(); - if (Audio::Timestamp(time, 1000) < _audioTracks[i]->getLength()) - return time; - } - } - - // Just use time elapsed since the beginning - return SeekableVideoDecoder::getTime(); -} - -uint32 QuickTimeDecoder::getTimeToNextFrame() const { - if (_needUpdate) - return 0; - - if (_nextVideoTrack) { - uint32 nextFrameStartTime = _nextVideoTrack->getNextFrameStartTime(); - - if (nextFrameStartTime == 0) - return 0; - - // TODO: Add support for rate modification - - uint32 elapsedTime = getTime(); - - if (elapsedTime < nextFrameStartTime) - return nextFrameStartTime - elapsedTime; - } - - return 0; -} - -bool QuickTimeDecoder::loadFile(const Common::String &filename) { - if (!Common::QuickTimeParser::parseFile(filename)) - return false; - - init(); - return true; -} - -bool QuickTimeDecoder::loadStream(Common::SeekableReadStream *stream) { - if (!Common::QuickTimeParser::parseStream(stream)) - return false; - - init(); - return true; -} - -void QuickTimeDecoder::updateVolume() { - for (uint32 i = 0; i < _audioHandles.size(); i++) - if (g_system->getMixer()->isSoundHandleActive(_audioHandles[i])) - g_system->getMixer()->setChannelVolume(_audioHandles[i], getVolume()); -} - -void QuickTimeDecoder::updateBalance() { - for (uint32 i = 0; i < _audioHandles.size(); i++) - if (g_system->getMixer()->isSoundHandleActive(_audioHandles[i])) - g_system->getMixer()->setChannelBalance(_audioHandles[i], getBalance()); -} - -void QuickTimeDecoder::init() { - Audio::QuickTimeAudioDecoder::init(); - - _startTime = 0; - _setStartTime = false; - - // Initialize all the audio tracks - if (!_audioTracks.empty()) { - _audioHandles.resize(_audioTracks.size()); - - for (uint32 i = 0; i < _audioTracks.size(); i++) - _handlers.push_back(new AudioTrackHandler(this, _audioTracks[i])); - } - - // Initialize all the video tracks - for (uint32 i = 0; i < _tracks.size(); i++) { - if (_tracks[i]->codecType == CODEC_TYPE_VIDEO) { - for (uint32 j = 0; j < _tracks[i]->sampleDescs.size(); j++) - ((VideoSampleDesc *)_tracks[i]->sampleDescs[j])->initCodec(); - - _handlers.push_back(new VideoTrackHandler(this, _tracks[i])); - } - } - - // Prepare the first video track - _nextVideoTrack = findNextVideoTrack(); - - if (_nextVideoTrack) { - if (_scaleFactorX != 1 || _scaleFactorY != 1) { - // We have to take the scale into consideration when setting width/height - _width = (_nextVideoTrack->getWidth() / _scaleFactorX).toInt(); - _height = (_nextVideoTrack->getHeight() / _scaleFactorY).toInt(); - } else { - _width = _nextVideoTrack->getWidth().toInt(); - _height = _nextVideoTrack->getHeight().toInt(); - } - - _needUpdate = true; - } else { - _needUpdate = false; - } - - // Now start any audio - if (!_audioTracks.empty()) { - startAudio(); - _audioStartOffset = Audio::Timestamp(0); - } -} - -Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(Track *track, uint32 format) { +Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(Common::QuickTimeParser::Track *track, uint32 format) { if (track->codecType == CODEC_TYPE_VIDEO) { debug(0, "Video Codec FourCC: \'%s\'", tag2str(format)); @@ -395,61 +208,52 @@ Common::QuickTimeParser::SampleDesc *QuickTimeDecoder::readSampleDesc(Track *tra return Audio::QuickTimeAudioDecoder::readSampleDesc(track, format); } -void QuickTimeDecoder::close() { - stopAudio(); - freeAllTrackHandlers(); - - if (_scaledSurface) { - _scaledSurface->free(); - delete _scaledSurface; - _scaledSurface = 0; - } - - _width = _height = 0; - - Common::QuickTimeParser::close(); - SeekableVideoDecoder::reset(); -} - -void QuickTimeDecoder::freeAllTrackHandlers() { - for (uint32 i = 0; i < _handlers.size(); i++) - delete _handlers[i]; - - _handlers.clear(); -} +void QuickTimeDecoder::init() { + Audio::QuickTimeAudioDecoder::init(); -void QuickTimeDecoder::seekToTime(const Audio::Timestamp &time) { - stopAudio(); - _audioStartOffset = time; + // Initialize all the audio tracks + for (uint32 i = 0; i < _audioTracks.size(); i++) + addTrack(new AudioTrackHandler(this, _audioTracks[i])); - // Sets all tracks to this time - for (uint32 i = 0; i < _handlers.size(); i++) - _handlers[i]->seekToTime(time); + // Initialize all the video tracks + Common::Array &tracks = Common::QuickTimeParser::_tracks; + for (uint32 i = 0; i < tracks.size(); i++) { + if (tracks[i]->codecType == CODEC_TYPE_VIDEO) { + for (uint32 j = 0; j < tracks[i]->sampleDescs.size(); j++) + ((VideoSampleDesc *)tracks[i]->sampleDescs[j])->initCodec(); - startAudio(); + addTrack(new VideoTrackHandler(this, tracks[i])); + } + } - // Reset our start time - _startTime = g_system->getMillis() - time.msecs(); - _setStartTime = true; - resetPauseStartTime(); + // Prepare the first video track + VideoTrackHandler *nextVideoTrack = (VideoTrackHandler *)findNextVideoTrack(); - // Reset the next video track too - _nextVideoTrack = findNextVideoTrack(); - _needUpdate = _nextVideoTrack != 0; + if (nextVideoTrack) { + if (_scaleFactorX != 1 || _scaleFactorY != 1) { + // We have to take the scale into consideration when setting width/height + _width = (nextVideoTrack->getScaledWidth() / _scaleFactorX).toInt(); + _height = (nextVideoTrack->getScaledHeight() / _scaleFactorY).toInt(); + } else { + _width = nextVideoTrack->getWidth(); + _height = nextVideoTrack->getHeight(); + } + } } void QuickTimeDecoder::updateAudioBuffer() { // Updates the audio buffers for all audio tracks - for (uint32 i = 0; i < _handlers.size(); i++) - if (_handlers[i]->getTrackType() == TrackHandler::kTrackTypeAudio) - ((AudioTrackHandler *)_handlers[i])->updateBuffer(); + for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++) + if ((*it)->getTrackType() == AdvancedVideoDecoder::Track::kTrackTypeAudio) + ((AudioTrackHandler *)*it)->updateBuffer(); } -Graphics::PixelFormat QuickTimeDecoder::getPixelFormat() const { - if (_nextVideoTrack) - return _nextVideoTrack->getPixelFormat(); +void QuickTimeDecoder::scaleSurface(const Graphics::Surface *src, Graphics::Surface *dst, const Common::Rational &scaleFactorX, const Common::Rational &scaleFactorY) { + assert(src && dst); - return Graphics::PixelFormat(); + for (int32 j = 0; j < dst->h; j++) + for (int32 k = 0; k < dst->w; k++) + memcpy(dst->getBasePtr(k, j), src->getBasePtr((k * scaleFactorX).toInt() , (j * scaleFactorY).toInt()), src->format.bytesPerPixel); } QuickTimeDecoder::VideoSampleDesc::VideoSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag) : Common::QuickTimeParser::SampleDesc(parentTrack, codecTag) { @@ -504,25 +308,8 @@ void QuickTimeDecoder::VideoSampleDesc::initCodec() { } } -bool QuickTimeDecoder::endOfVideoTracks() const { - for (uint32 i = 0; i < _handlers.size(); i++) - if (_handlers[i]->getTrackType() == TrackHandler::kTrackTypeVideo && !_handlers[i]->endOfTrack()) - return false; - - return true; -} - -QuickTimeDecoder::TrackHandler::TrackHandler(QuickTimeDecoder *decoder, Track *parent) : _decoder(decoder), _parent(parent), _fd(_decoder->_fd) { - _curEdit = 0; -} - -bool QuickTimeDecoder::TrackHandler::endOfTrack() { - // A track is over when we've finished going through all edits - return _curEdit == _parent->editCount; -} - QuickTimeDecoder::AudioTrackHandler::AudioTrackHandler(QuickTimeDecoder *decoder, QuickTimeAudioTrack *audioTrack) - : TrackHandler(decoder, audioTrack->getParent()), _audioTrack(audioTrack) { + : _decoder(decoder), _audioTrack(audioTrack) { } void QuickTimeDecoder::AudioTrackHandler::updateBuffer() { @@ -532,21 +319,20 @@ void QuickTimeDecoder::AudioTrackHandler::updateBuffer() { _audioTrack->queueAudio(Audio::Timestamp(_decoder->getTimeToNextFrame() + 500, 1000)); } -bool QuickTimeDecoder::AudioTrackHandler::endOfTrack() { - return _audioTrack->endOfData(); -} - -void QuickTimeDecoder::AudioTrackHandler::seekToTime(Audio::Timestamp time) { - _audioTrack->seek(time); +Audio::SeekableAudioStream *QuickTimeDecoder::AudioTrackHandler::getSeekableAudioStream() const { + return _audioTrack; } -QuickTimeDecoder::VideoTrackHandler::VideoTrackHandler(QuickTimeDecoder *decoder, Common::QuickTimeParser::Track *parent) : TrackHandler(decoder, parent) { +QuickTimeDecoder::VideoTrackHandler::VideoTrackHandler(QuickTimeDecoder *decoder, Common::QuickTimeParser::Track *parent) : _decoder(decoder), _parent(parent) { + _curEdit = 0; enterNewEditList(false); _holdNextFrameStartTime = false; _curFrame = -1; _durationOverride = -1; _scaledSurface = 0; + _curPalette = 0; + _dirtyPalette = false; } QuickTimeDecoder::VideoTrackHandler::~VideoTrackHandler() { @@ -556,6 +342,88 @@ QuickTimeDecoder::VideoTrackHandler::~VideoTrackHandler() { } } +bool QuickTimeDecoder::VideoTrackHandler::endOfTrack() const { + // A track is over when we've finished going through all edits + return _curEdit == _parent->editCount; +} + +bool QuickTimeDecoder::VideoTrackHandler::seek(const Audio::Timestamp &requestedTime) { + // First, figure out what edit we're in + Audio::Timestamp time = requestedTime.convertToFramerate(_parent->timeScale); + + // Continue until we get to where we need to be + for (_curEdit = 0; !endOfTrack(); _curEdit++) + if ((uint32)time.totalNumberOfFrames() >= getCurEditTimeOffset() && (uint32)time.totalNumberOfFrames() < getCurEditTimeOffset() + getCurEditTrackDuration()) + break; + + // This track is done + if (endOfTrack()) + return true; + + enterNewEditList(false); + + // One extra check for the end of a track + if (endOfTrack()) + return true; + + // Now we're in the edit and need to figure out what frame we need + while (getRateAdjustedFrameTime() < (uint32)time.totalNumberOfFrames()) { + _curFrame++; + if (_durationOverride >= 0) { + _nextFrameStartTime += _durationOverride; + _durationOverride = -1; + } else { + _nextFrameStartTime += getFrameDuration(); + } + } + + // All that's left is to figure out what our starting time is going to be + // Compare the starting point for the frame to where we need to be + _holdNextFrameStartTime = getRateAdjustedFrameTime() != (uint32)time.totalNumberOfFrames(); + + // If we went past the time, go back a frame + if (_holdNextFrameStartTime) + _curFrame--; + + // Handle the keyframe here + int32 destinationFrame = _curFrame + 1; + + assert(destinationFrame < (int32)_parent->frameCount); + _curFrame = findKeyFrame(destinationFrame) - 1; + while (_curFrame < destinationFrame - 1) + bufferNextFrame(); + + return true; +} + +Audio::Timestamp QuickTimeDecoder::VideoTrackHandler::getDuration() const { + return Audio::Timestamp(0, _parent->duration, _decoder->_timeScale); +} + +uint16 QuickTimeDecoder::VideoTrackHandler::getWidth() const { + return getScaledWidth().toInt(); +} + +uint16 QuickTimeDecoder::VideoTrackHandler::getHeight() const { + return getScaledHeight().toInt(); +} + +Graphics::PixelFormat QuickTimeDecoder::VideoTrackHandler::getPixelFormat() const { + return ((VideoSampleDesc *)_parent->sampleDescs[0])->_videoCodec->getPixelFormat(); +} + +int QuickTimeDecoder::VideoTrackHandler::getFrameCount() const { + return _parent->frameCount; +} + +uint32 QuickTimeDecoder::VideoTrackHandler::getNextFrameStartTime() const { + if (endOfTrack()) + return 0; + + // Convert to milliseconds so the tracks can be compared + return getRateAdjustedFrameTime() * 1000 / _parent->timeScale; +} + const Graphics::Surface *QuickTimeDecoder::VideoTrackHandler::decodeNextFrame() { if (endOfTrack()) return 0; @@ -586,7 +454,7 @@ const Graphics::Surface *QuickTimeDecoder::VideoTrackHandler::decodeNextFrame() if (frame && (_parent->scaleFactorX != 1 || _parent->scaleFactorY != 1)) { if (!_scaledSurface) { _scaledSurface = new Graphics::Surface(); - _scaledSurface->create(getWidth().toInt(), getHeight().toInt(), getPixelFormat()); + _scaledSurface->create(getScaledWidth().toInt(), getScaledHeight().toInt(), getPixelFormat()); } _decoder->scaleSurface(frame, _scaledSurface, _parent->scaleFactorX, _parent->scaleFactorY); @@ -596,6 +464,85 @@ const Graphics::Surface *QuickTimeDecoder::VideoTrackHandler::decodeNextFrame() return frame; } +Common::Rational QuickTimeDecoder::VideoTrackHandler::getScaledWidth() const { + return Common::Rational(_parent->width) / _parent->scaleFactorX; +} + +Common::Rational QuickTimeDecoder::VideoTrackHandler::getScaledHeight() const { + return Common::Rational(_parent->height) / _parent->scaleFactorY; +} + +Common::SeekableReadStream *QuickTimeDecoder::VideoTrackHandler::getNextFramePacket(uint32 &descId) { + // First, we have to track down which chunk holds the sample and which sample in the chunk contains the frame we are looking for. + int32 totalSampleCount = 0; + int32 sampleInChunk = 0; + int32 actualChunk = -1; + uint32 sampleToChunkIndex = 0; + + for (uint32 i = 0; i < _parent->chunkCount; i++) { + if (sampleToChunkIndex < _parent->sampleToChunkCount && i >= _parent->sampleToChunk[sampleToChunkIndex].first) + sampleToChunkIndex++; + + totalSampleCount += _parent->sampleToChunk[sampleToChunkIndex - 1].count; + + if (totalSampleCount > _curFrame) { + actualChunk = i; + descId = _parent->sampleToChunk[sampleToChunkIndex - 1].id; + sampleInChunk = _parent->sampleToChunk[sampleToChunkIndex - 1].count - totalSampleCount + _curFrame; + break; + } + } + + if (actualChunk < 0) { + warning("Could not find data for frame %d", _curFrame); + return 0; + } + + // Next seek to that frame + Common::SeekableReadStream *stream = _decoder->_fd; + stream->seek(_parent->chunkOffsets[actualChunk]); + + // Then, if the chunk holds more than one frame, seek to where the frame we want is located + for (int32 i = _curFrame - sampleInChunk; i < _curFrame; i++) { + if (_parent->sampleSize != 0) + stream->skip(_parent->sampleSize); + else + stream->skip(_parent->sampleSizes[i]); + } + + // Finally, read in the raw data for the frame + //debug("Frame Data[%d]: Offset = %d, Size = %d", _curFrame, stream->pos(), _parent->sampleSizes[_curFrame]); + + if (_parent->sampleSize != 0) + return stream->readStream(_parent->sampleSize); + + return stream->readStream(_parent->sampleSizes[_curFrame]); +} + +uint32 QuickTimeDecoder::VideoTrackHandler::getFrameDuration() { + uint32 curFrameIndex = 0; + for (int32 i = 0; i < _parent->timeToSampleCount; i++) { + curFrameIndex += _parent->timeToSample[i].count; + if ((uint32)_curFrame < curFrameIndex) { + // Ok, now we have what duration this frame has. + return _parent->timeToSample[i].duration; + } + } + + // This should never occur + error("Cannot find duration for frame %d", _curFrame); + return 0; +} + +uint32 QuickTimeDecoder::VideoTrackHandler::findKeyFrame(uint32 frame) const { + for (int i = _parent->keyframeCount - 1; i >= 0; i--) + if (_parent->keyframes[i] <= frame) + return _parent->keyframes[i]; + + // If none found, we'll assume the requested frame is a key frame + return frame; +} + void QuickTimeDecoder::VideoTrackHandler::enterNewEditList(bool bufferFrames) { // Bypass all empty edit lists first while (!endOfTrack() && _parent->editList[_curEdit].mediaTime == -1) @@ -667,166 +614,25 @@ const Graphics::Surface *QuickTimeDecoder::VideoTrackHandler::bufferNextFrame() if (entry->_videoCodec->containsPalette()) { // The codec itself contains a palette if (entry->_videoCodec->hasDirtyPalette()) { - _decoder->_palette = entry->_videoCodec->getPalette(); - _decoder->_dirtyPalette = true; + _curPalette = entry->_videoCodec->getPalette(); + _dirtyPalette = true; } } else { // Check if the video description has been updated byte *palette = entry->_palette; - if (palette !=_decoder-> _palette) { - _decoder->_palette = palette; - _decoder->_dirtyPalette = true; - } - } - - return frame; -} - -uint32 QuickTimeDecoder::VideoTrackHandler::getNextFrameStartTime() { - if (endOfTrack()) - return 0; - - // Convert to milliseconds so the tracks can be compared - return getRateAdjustedFrameTime() * 1000 / _parent->timeScale; -} - -uint32 QuickTimeDecoder::VideoTrackHandler::getFrameCount() { - return _parent->frameCount; -} - -uint32 QuickTimeDecoder::VideoTrackHandler::getFrameDuration() { - uint32 curFrameIndex = 0; - for (int32 i = 0; i < _parent->timeToSampleCount; i++) { - curFrameIndex += _parent->timeToSample[i].count; - if ((uint32)_curFrame < curFrameIndex) { - // Ok, now we have what duration this frame has. - return _parent->timeToSample[i].duration; - } - } - - // This should never occur - error("Cannot find duration for frame %d", _curFrame); - return 0; -} - -Common::SeekableReadStream *QuickTimeDecoder::VideoTrackHandler::getNextFramePacket(uint32 &descId) { - // First, we have to track down which chunk holds the sample and which sample in the chunk contains the frame we are looking for. - int32 totalSampleCount = 0; - int32 sampleInChunk = 0; - int32 actualChunk = -1; - uint32 sampleToChunkIndex = 0; - - for (uint32 i = 0; i < _parent->chunkCount; i++) { - if (sampleToChunkIndex < _parent->sampleToChunkCount && i >= _parent->sampleToChunk[sampleToChunkIndex].first) - sampleToChunkIndex++; - - totalSampleCount += _parent->sampleToChunk[sampleToChunkIndex - 1].count; - - if (totalSampleCount > _curFrame) { - actualChunk = i; - descId = _parent->sampleToChunk[sampleToChunkIndex - 1].id; - sampleInChunk = _parent->sampleToChunk[sampleToChunkIndex - 1].count - totalSampleCount + _curFrame; - break; + if (palette != _curPalette) { + _curPalette = palette; + _dirtyPalette = true; } } - if (actualChunk < 0) { - warning("Could not find data for frame %d", _curFrame); - return 0; - } - - // Next seek to that frame - _fd->seek(_parent->chunkOffsets[actualChunk]); - - // Then, if the chunk holds more than one frame, seek to where the frame we want is located - for (int32 i = _curFrame - sampleInChunk; i < _curFrame; i++) { - if (_parent->sampleSize != 0) - _fd->skip(_parent->sampleSize); - else - _fd->skip(_parent->sampleSizes[i]); - } - - // Finally, read in the raw data for the frame - //debug("Frame Data[%d]: Offset = %d, Size = %d", _curFrame, _fd->pos(), _parent->sampleSizes[_curFrame]); - - if (_parent->sampleSize != 0) - return _fd->readStream(_parent->sampleSize); - - return _fd->readStream(_parent->sampleSizes[_curFrame]); -} - -uint32 QuickTimeDecoder::VideoTrackHandler::findKeyFrame(uint32 frame) const { - for (int i = _parent->keyframeCount - 1; i >= 0; i--) - if (_parent->keyframes[i] <= frame) - return _parent->keyframes[i]; - - // If none found, we'll assume the requested frame is a key frame return frame; } -void QuickTimeDecoder::VideoTrackHandler::seekToTime(Audio::Timestamp time) { - // First, figure out what edit we're in - time = time.convertToFramerate(_parent->timeScale); - - // Continue until we get to where we need to be - for (_curEdit = 0; !endOfTrack(); _curEdit++) - if ((uint32)time.totalNumberOfFrames() >= getCurEditTimeOffset() && (uint32)time.totalNumberOfFrames() < getCurEditTimeOffset() + getCurEditTrackDuration()) - break; - - // This track is done - if (endOfTrack()) - return; - - enterNewEditList(false); - - // One extra check for the end of a track - if (endOfTrack()) - return; - - // Now we're in the edit and need to figure out what frame we need - while (getRateAdjustedFrameTime() < (uint32)time.totalNumberOfFrames()) { - _curFrame++; - if (_durationOverride >= 0) { - _nextFrameStartTime += _durationOverride; - _durationOverride = -1; - } else { - _nextFrameStartTime += getFrameDuration(); - } - } - - // All that's left is to figure out what our starting time is going to be - // Compare the starting point for the frame to where we need to be - _holdNextFrameStartTime = getRateAdjustedFrameTime() != (uint32)time.totalNumberOfFrames(); - - // If we went past the time, go back a frame - if (_holdNextFrameStartTime) - _curFrame--; - - // Handle the keyframe here - int32 destinationFrame = _curFrame + 1; - - assert(destinationFrame < (int32)_parent->frameCount); - _curFrame = findKeyFrame(destinationFrame) - 1; - while (_curFrame < destinationFrame - 1) - bufferNextFrame(); -} - -Common::Rational QuickTimeDecoder::VideoTrackHandler::getWidth() const { - return Common::Rational(_parent->width) / _parent->scaleFactorX; -} - -Common::Rational QuickTimeDecoder::VideoTrackHandler::getHeight() const { - return Common::Rational(_parent->height) / _parent->scaleFactorY; -} - -Graphics::PixelFormat QuickTimeDecoder::VideoTrackHandler::getPixelFormat() const { - return ((VideoSampleDesc *)_parent->sampleDescs[0])->_videoCodec->getPixelFormat(); -} - uint32 QuickTimeDecoder::VideoTrackHandler::getRateAdjustedFrameTime() const { // Figure out what time the next frame is at taking the edit list rate into account - uint32 convertedTime = (Common::Rational(_nextFrameStartTime - getCurEditTimeOffset()) / _parent->editList[_curEdit].mediaRate).toInt(); + uint32 convertedTime = (Common::Rational(_nextFrameStartTime - getCurEditTimeOffset()) / _parent->editList[_curEdit].mediaRate).toInt(); return convertedTime + getCurEditTimeOffset(); } diff --git a/video/qt_decoder.h b/video/qt_decoder.h index ce32562d64..7a251b8580 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -31,16 +31,17 @@ #ifndef VIDEO_QT_DECODER_H #define VIDEO_QT_DECODER_H -#include "audio/mixer.h" #include "audio/decoders/quicktime_intern.h" #include "common/scummsys.h" -#include "common/rational.h" -#include "graphics/pixelformat.h" #include "video/video_decoder.h" namespace Common { - class Rational; +class Rational; +} + +namespace Graphics { +struct PixelFormat; } namespace Video { @@ -54,68 +55,33 @@ class Codec; * - mohawk * - sci */ -class QuickTimeDecoder : public SeekableVideoDecoder, public Audio::QuickTimeAudioDecoder { +class QuickTimeDecoder : public AdvancedVideoDecoder, public Audio::QuickTimeAudioDecoder { public: QuickTimeDecoder(); virtual ~QuickTimeDecoder(); - /** - * Returns the width of the video - * @return the width of the video - */ - uint16 getWidth() const { return _width; } - - /** - * Returns the height of the video - * @return the height of the video - */ - uint16 getHeight() const { return _height; } - - /** - * Returns the amount of frames in the video - * @return the amount of frames in the video - */ - uint32 getFrameCount() const; - - /** - * Load a video file - * @param filename the filename to load - */ bool loadFile(const Common::String &filename); - - /** - * Load a QuickTime video file from a SeekableReadStream - * @param stream the stream to load - */ bool loadStream(Common::SeekableReadStream *stream); - - /** - * Close a QuickTime encoded video file - */ void close(); + uint16 getWidth() const { return _width; } + uint16 getHeight() const { return _height; } + const Graphics::Surface *decodeNextFrame(); + Audio::Timestamp getDuration() const { return Audio::Timestamp(0, _duration, _timeScale); } - /** - * Returns the palette of the video - * @return the palette of the video - */ - const byte *getPalette() { _dirtyPalette = false; return _palette; } - bool hasDirtyPalette() const { return _dirtyPalette; } +protected: + Common::QuickTimeParser::SampleDesc *readSampleDesc(Common::QuickTimeParser::Track *track, uint32 format); - int32 getCurFrame() const; +private: + void init(); - bool isVideoLoaded() const { return isOpen(); } - const Graphics::Surface *decodeNextFrame(); - bool endOfVideo() const; - uint32 getTime() const; - uint32 getTimeToNextFrame() const; - Graphics::PixelFormat getPixelFormat() const; + void updateAudioBuffer(); - // SeekableVideoDecoder API - void seekToFrame(uint32 frame); - void seekToTime(const Audio::Timestamp &time); - uint32 getDuration() const { return _duration * 1000 / _timeScale; } + uint16 _width, _height; + + Graphics::Surface *_scaledSurface; + void scaleSurface(const Graphics::Surface *src, Graphics::Surface *dst, + const Common::Rational &scaleFactorX, const Common::Rational &scaleFactorY); -protected: class VideoSampleDesc : public Common::QuickTimeParser::SampleDesc { public: VideoSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag); @@ -131,110 +97,59 @@ protected: Codec *_videoCodec; }; - Common::QuickTimeParser::SampleDesc *readSampleDesc(Track *track, uint32 format); - - // VideoDecoder API - void updateVolume(); - void updateBalance(); - -private: - void init(); - - void startAudio(); - void stopAudio(); - void updateAudioBuffer(); - void readNextAudioChunk(); - Common::Array _audioHandles; - Audio::Timestamp _audioStartOffset; - - Codec *createCodec(uint32 codecTag, byte bitsPerPixel); - uint32 findKeyFrame(uint32 frame) const; - - bool _dirtyPalette; - const byte *_palette; - bool _setStartTime; - bool _needUpdate; - - uint16 _width, _height; - - Graphics::Surface *_scaledSurface; - void scaleSurface(const Graphics::Surface *src, Graphics::Surface *dst, - Common::Rational scaleFactorX, Common::Rational scaleFactorY); - - void pauseVideoIntern(bool pause); - bool endOfVideoTracks() const; - - // The TrackHandler is a class that wraps around a QuickTime Track - // and handles playback in this decoder class. - class TrackHandler { - public: - TrackHandler(QuickTimeDecoder *decoder, Track *parent); - virtual ~TrackHandler() {} - - enum TrackType { - kTrackTypeAudio, - kTrackTypeVideo - }; - - virtual TrackType getTrackType() const = 0; - - virtual void seekToTime(Audio::Timestamp time) = 0; - - virtual bool endOfTrack(); - - protected: - uint32 _curEdit; - QuickTimeDecoder *_decoder; - Common::SeekableReadStream *_fd; - Track *_parent; - }; - // The AudioTrackHandler is currently just a wrapper around some // QuickTimeDecoder functions. - class AudioTrackHandler : public TrackHandler { + class AudioTrackHandler : public SeekableAudioTrack { public: AudioTrackHandler(QuickTimeDecoder *decoder, QuickTimeAudioTrack *audioTrack); - TrackType getTrackType() const { return kTrackTypeAudio; } void updateBuffer(); - void seekToTime(Audio::Timestamp time); - bool endOfTrack(); + + protected: + Audio::SeekableAudioStream *getSeekableAudioStream() const; private: + QuickTimeDecoder *_decoder; QuickTimeAudioTrack *_audioTrack; }; // The VideoTrackHandler is the bridge between the time of playback // and the media for the given track. It calculates when to start // tracks and at what rate to play the media using the edit list. - class VideoTrackHandler : public TrackHandler { + class VideoTrackHandler : public VideoTrack { public: - VideoTrackHandler(QuickTimeDecoder *decoder, Track *parent); + VideoTrackHandler(QuickTimeDecoder *decoder, Common::QuickTimeParser::Track *parent); ~VideoTrackHandler(); - TrackType getTrackType() const { return kTrackTypeVideo; } - - const Graphics::Surface *decodeNextFrame(); - - uint32 getNextFrameStartTime(); - - uint32 getFrameCount(); - - int32 getCurFrame() { return _curFrame; } + bool endOfTrack() const; + bool isSeekable() const { return true; } + bool seek(const Audio::Timestamp &time); + Audio::Timestamp getDuration() const; + uint16 getWidth() const; + uint16 getHeight() const; Graphics::PixelFormat getPixelFormat() const; + int getCurFrame() const { return _curFrame; } + int getFrameCount() const; + uint32 getNextFrameStartTime() const; + const Graphics::Surface *decodeNextFrame(); + const byte *getPalette() const { _dirtyPalette = false; return _curPalette; } + bool hasDirtyPalette() const { return _curPalette; } - void seekToTime(Audio::Timestamp time); - - Common::Rational getWidth() const; - Common::Rational getHeight() const; + Common::Rational getScaledWidth() const; + Common::Rational getScaledHeight() const; private: + QuickTimeDecoder *_decoder; + Common::QuickTimeParser::Track *_parent; + uint32 _curEdit; int32 _curFrame; uint32 _nextFrameStartTime; Graphics::Surface *_scaledSurface; bool _holdNextFrameStartTime; int32 _durationOverride; + const byte *_curPalette; + mutable bool _dirtyPalette; Common::SeekableReadStream *getNextFramePacket(uint32 &descId); uint32 getFrameDuration(); @@ -245,12 +160,6 @@ private: uint32 getCurEditTimeOffset() const; uint32 getCurEditTrackDuration() const; }; - - Common::Array _handlers; - VideoTrackHandler *_nextVideoTrack; - VideoTrackHandler *findNextVideoTrack() const; - - void freeAllTrackHandlers(); }; } // End of namespace Video -- cgit v1.2.3 From 9cca8ac9f2f9162d4201d59c9ed8be5ae2a32a2b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 27 Jul 2012 11:47:49 -0400 Subject: VIDEO: Remove now unused Rewindable and Seekable classes --- video/video_decoder.h | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/video/video_decoder.h b/video/video_decoder.h index eff5a7c396..3f5dc2c2ff 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -809,45 +809,6 @@ private: uint32 getFrameBeginTime(uint32 frame) const; }; -/** - * A VideoDecoder that can be rewound back to the beginning. - * @note This class is now deprecated. Use AdvancedVideoDecoder instead. - */ -class RewindableVideoDecoder : public virtual VideoDecoder { -public: - /** - * Rewind to the beginning of the video. - */ - virtual void rewind() = 0; -}; - -/** - * A VideoDecoder that can seek to a frame or point in time. - * @note This class is now deprecated. Use AdvancedVideoDecoder instead. - */ -class SeekableVideoDecoder : public virtual RewindableVideoDecoder { -public: - /** - * Seek to the specified time. - */ - virtual void seekToTime(const Audio::Timestamp &time) = 0; - - /** - * Seek to the specified time (in ms). - */ - void seekToTime(uint32 msecs) { seekToTime(Audio::Timestamp(msecs, 1000)); } - - /** - * Implementation of RewindableVideoDecoder::rewind(). - */ - virtual void rewind() { seekToTime(0); } - - /** - * Get the total duration of the video (in ms). - */ - virtual uint32 getDuration() const = 0; -}; - } // End of namespace Video #endif -- cgit v1.2.3 From e91001a1642ee8ba8b834f1908247c12d194e0b2 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 27 Jul 2012 13:36:21 -0400 Subject: LASTEXPRESS: Remove templated resetCurrentParameters() function --- engines/lastexpress/entities/entity.cpp | 6 ++-- engines/lastexpress/entities/entity.h | 59 ++++++++++++++++----------------- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 0842a7a78c..aff9445326 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -598,7 +598,7 @@ void Entity::setup(const char *name, uint index) { _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersIIII); _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); } @@ -608,7 +608,7 @@ void Entity::setupS(const char *name, uint index, const char *seq1) { _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersSIIS); EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); @@ -621,7 +621,7 @@ void Entity::setupSS(const char *name, uint index, const char *seq1, const char _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersSSII); EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index e890bba0b5..e2514a6146 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -122,6 +122,13 @@ struct SavePoint; if (!params) \ error("[EXPOSE_PARAMS] Trying to call an entity function with invalid parameters"); \ +#define RESET_PARAMS(data, type) do { \ + EntityData::EntityCallParameters *callParameters = data->getCurrentCallParameters(); \ + callParameters->clear(); \ + for (int i = 0; i < 4; i++) \ + callParameters->parameters[i] = new type(); \ +} while (false) + // function signature without setup (we keep the index for consistency but never use it) #define IMPLEMENT_FUNCTION_NOSETUP(index, class, name) \ void class::name(const SavePoint &savepoint) { \ @@ -835,29 +842,21 @@ public: EntityData() {} - template - void resetCurrentParameters() { - EntityCallParameters *params = &_parameters[_data.currentCall]; - params->clear(); - - for (int i = 0; i < 4; i++) - params->parameters[i] = new T(); - } - - EntityCallData *getCallData() { return &_data; } + EntityCallData *getCallData() { return &_data; } - EntityParameters *getParameters(uint callback, byte index) const; - EntityParameters *getCurrentParameters(byte index = 0) { return getParameters(_data.currentCall, index); } + EntityParameters *getParameters(uint callback, byte index) const; + EntityParameters *getCurrentParameters(byte index = 0) { return getParameters(_data.currentCall, index); } + EntityCallParameters *getCurrentCallParameters() { return &_parameters[_data.currentCall]; } - int getCallback(uint callback) const; - int getCurrentCallback() { return getCallback(_data.currentCall); } - void setCallback(uint callback, byte index); - void setCurrentCallback(uint index) { setCallback(_data.currentCall, index); } + int getCallback(uint callback) const; + int getCurrentCallback() { return getCallback(_data.currentCall); } + void setCallback(uint callback, byte index); + void setCurrentCallback(uint index) { setCallback(_data.currentCall, index); } - void updateParameters(uint32 index) const; + void updateParameters(uint32 index) const; // Serializable - void saveLoadWithSerializer(Common::Serializer &ser); + void saveLoadWithSerializer(Common::Serializer &ser); private: @@ -1078,7 +1077,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersIIII); EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); params->param1 = (unsigned int)param1; @@ -1092,7 +1091,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersIIII); EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); params->param1 = param1; @@ -1107,7 +1106,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersIIII); EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); params->param1 = param1; @@ -1123,7 +1122,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersSIIS); EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); @@ -1138,7 +1137,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersSIIS); EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); @@ -1154,7 +1153,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersSIII); EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII*)_data->getCurrentParameters(); strncpy((char *)¶ms->seq, seq, 12); @@ -1171,7 +1170,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersSIIS); EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); @@ -1188,7 +1187,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersSSII); EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); @@ -1204,7 +1203,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersISII); EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII*)_data->getCurrentParameters(); params->param1 = (unsigned int)param1; @@ -1219,7 +1218,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersISSI); EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI*)_data->getCurrentParameters(); params->param1 = param1; @@ -1235,7 +1234,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersIISI); EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI*)_data->getCurrentParameters(); params->param1 = param1; @@ -1251,7 +1250,7 @@ protected: _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - _data->resetCurrentParameters(); + RESET_PARAMS(_data, EntityData::EntityParametersIISS); EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS*)_data->getCurrentParameters(); params->param1 = param1; -- cgit v1.2.3 From 94e2ea10cd9f5caf7a560b7f1def0f23da9046a5 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 27 Jul 2012 13:41:48 -0400 Subject: LASTEXPRESS: Add menu-related warnings and turn some warnings into errors --- engines/lastexpress/game/action.cpp | 2 +- engines/lastexpress/game/savegame.cpp | 2 +- engines/lastexpress/menu/menu.cpp | 4 ++-- engines/lastexpress/sound/entry.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp index 1e5bc0ffd7..4d1c786167 100644 --- a/engines/lastexpress/game/action.cpp +++ b/engines/lastexpress/game/action.cpp @@ -404,7 +404,7 @@ SceneIndex Action::processHotspot(const SceneHotspot &hotspot) { ////////////////////////////////////////////////////////////////////////// // Action 0 IMPLEMENT_ACTION(dummy) - warning("[Action::action_dummy] Dummy action function called (hotspot action: %d)", hotspot.action); + error("[Action::action_dummy] Dummy action function called (hotspot action: %d)", hotspot.action); return kSceneInvalid; } diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp index 4c268d84c6..a8fb5c55f7 100644 --- a/engines/lastexpress/game/savegame.cpp +++ b/engines/lastexpress/game/savegame.cpp @@ -257,7 +257,7 @@ void SaveLoad::saveGame(SavegameType type, EntityIndex entity, uint32 value) { entry.saveLoadWithSerializer(ser); if (!entry.isValid()) { - warning("[SaveLoad::saveGame] Invalid entry. This savegame might be corrupted"); + error("[SaveLoad::saveGame] Invalid entry. This savegame might be corrupted"); _savegame->seek(header.offset); } else if (getState()->time < entry.time || (type == kSavegameTypeTickInterval && getState()->time == entry.time)) { // Not ready to save a game, skipping! diff --git a/engines/lastexpress/menu/menu.cpp b/engines/lastexpress/menu/menu.cpp index 7095389f74..6a453aee99 100644 --- a/engines/lastexpress/menu/menu.cpp +++ b/engines/lastexpress/menu/menu.cpp @@ -864,7 +864,7 @@ void Menu::init(bool doSavegame, SavegameType type, uint32 value) { doSavegame = false; } else { - // TODO rename saves? + warning("[Menu::initGame] Renaming saves not implemented"); } // Create a new savegame if needed @@ -875,7 +875,7 @@ void Menu::init(bool doSavegame, SavegameType type, uint32 value) { getSaveLoad()->saveGame(kSavegameTypeEvent2, kEntityPlayer, kEventNone); if (!getGlobalTimer()) { - // TODO: remove existing savegame temp file + warning("[Menu::initGame] Removing temporary saves not implemented"); } // Init savegame & menu values diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp index d689447ff9..f2a063e45f 100644 --- a/engines/lastexpress/sound/entry.cpp +++ b/engines/lastexpress/sound/entry.cpp @@ -117,7 +117,7 @@ void SoundEntry::close() { void SoundEntry::play() { if (!_stream) { - warning("[SoundEntry::play] stream has been disposed"); + error("[SoundEntry::play] stream has been disposed"); return; } -- cgit v1.2.3 From d8acba294d7898ffff70ea679579cd8ae5eab0a7 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 27 Jul 2012 16:07:23 -0400 Subject: LASTEXPRESS: Add IgnoreSubtype option to AnimFrame --- engines/lastexpress/data/animation.cpp | 2 +- engines/lastexpress/data/sequence.cpp | 2 +- engines/lastexpress/data/sequence.h | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/engines/lastexpress/data/animation.cpp b/engines/lastexpress/data/animation.cpp index ce42acb8fe..7618259e69 100644 --- a/engines/lastexpress/data/animation.cpp +++ b/engines/lastexpress/data/animation.cpp @@ -230,7 +230,7 @@ AnimFrame *Animation::processChunkFrame(Common::SeekableReadStream *in, const Ch i.read(str, false); // Decode the frame - AnimFrame *f = new AnimFrame(str, i); + AnimFrame *f = new AnimFrame(str, i, true); // Delete the temporary chunk buffer delete str; diff --git a/engines/lastexpress/data/sequence.cpp b/engines/lastexpress/data/sequence.cpp index e1e0d9bee8..a5bcba84cd 100644 --- a/engines/lastexpress/data/sequence.cpp +++ b/engines/lastexpress/data/sequence.cpp @@ -76,7 +76,7 @@ void FrameInfo::read(Common::SeekableReadStream *in, bool isSequence) { // AnimFrame -AnimFrame::AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f) : _palette(NULL) { +AnimFrame::AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f, bool ignoreSubtype) : _palette(NULL), _ignoreSubtype(ignoreSubtype) { _palSize = 1; // TODO: use just the needed rectangle _image.create(640, 480, Graphics::PixelFormat::createFormatCLUT8()); diff --git a/engines/lastexpress/data/sequence.h b/engines/lastexpress/data/sequence.h index 9987eae48e..610a55cebf 100644 --- a/engines/lastexpress/data/sequence.h +++ b/engines/lastexpress/data/sequence.h @@ -49,8 +49,9 @@ byte {1} - Compression type byte {1} - Subtype (determines which set of decompression functions will be called) => 0, 1, 2, 3 byte {1} - Unknown + byte {1} - Keep previous frame while drawing + byte {1} - Unknown byte {1} - Unknown - uint16 {2} - Unknown byte {1} - Sound action byte {1} - Unknown uint32 {4} - positionId @@ -129,7 +130,7 @@ struct FrameInfo { class AnimFrame : public Drawable { public: - AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f); + AnimFrame(Common::SeekableReadStream *in, const FrameInfo &f, bool ignoreSubtype = false); ~AnimFrame(); Common::Rect draw(Graphics::Surface *s); @@ -146,6 +147,7 @@ private: uint16 _palSize; uint16 *_palette; Common::Rect _rect; + bool _ignoreSubtype; }; class Sequence { -- cgit v1.2.3 From 839ad1303f67b83f4383fb448463363e1e9f64fc Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 27 Jul 2012 19:58:51 -0400 Subject: LASTEXPRESS: Fix some formatting issues --- engines/lastexpress/entities/entity.h | 26 +++++++++++++------------- engines/lastexpress/game/entities.cpp | 2 +- engines/lastexpress/game/scenes.cpp | 2 +- engines/lastexpress/sound/sound.cpp | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index e2514a6146..0b1db137a6 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -275,7 +275,7 @@ struct SavePoint; class EntityData : Common::Serializable { public: - struct EntityParameters : Common::Serializable{ + struct EntityParameters : Common::Serializable { virtual ~EntityParameters() {} virtual Common::String toString() = 0; @@ -1079,7 +1079,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersIIII); - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); params->param1 = (unsigned int)param1; _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); @@ -1093,7 +1093,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersIIII); - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); params->param1 = param1; params->param2 = param2; @@ -1108,7 +1108,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersIIII); - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII*)_data->getCurrentParameters(); + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); params->param1 = param1; params->param2 = param2; params->param3 = param3; @@ -1124,7 +1124,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersSIIS); - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); params->param4 = param4; @@ -1139,7 +1139,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersSIIS); - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); params->param4 = param4; params->param5 = param5; @@ -1155,7 +1155,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersSIII); - EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII*)_data->getCurrentParameters(); + EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII *)_data->getCurrentParameters(); strncpy((char *)¶ms->seq, seq, 12); params->param4 = param4; params->param5 = param5; @@ -1172,7 +1172,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersSIIS); - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); params->param4 = param4; params->param5 = param5; @@ -1189,7 +1189,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersSSII); - EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); + EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII *)_data->getCurrentParameters(); strncpy((char *)¶ms->seq1, seq1, 12); strncpy((char *)¶ms->seq2, seq2, 12); params->param7 = param7; @@ -1205,7 +1205,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersISII); - EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII*)_data->getCurrentParameters(); + EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII *)_data->getCurrentParameters(); params->param1 = (unsigned int)param1; strncpy((char *)¶ms->seq, seq, 12); @@ -1220,7 +1220,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersISSI); - EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI*)_data->getCurrentParameters(); + EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI *)_data->getCurrentParameters(); params->param1 = param1; strncpy((char *)¶ms->seq1, seq1, 12); strncpy((char *)¶ms->seq2, seq2, 12); @@ -1236,7 +1236,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersIISI); - EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI*)_data->getCurrentParameters(); + EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI *)_data->getCurrentParameters(); params->param1 = param1; params->param2 = param2; strncpy((char *)¶ms->seq, seq, 12); @@ -1252,7 +1252,7 @@ protected: _data->setCurrentCallback(index); RESET_PARAMS(_data, EntityData::EntityParametersIISS); - EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS*)_data->getCurrentParameters(); + EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS *)_data->getCurrentParameters(); params->param1 = param1; params->param2 = param2; strncpy((char *)¶ms->seq1, seq1, 12); diff --git a/engines/lastexpress/game/entities.cpp b/engines/lastexpress/game/entities.cpp index 29cc7d889c..51db635bed 100644 --- a/engines/lastexpress/game/entities.cpp +++ b/engines/lastexpress/game/entities.cpp @@ -2278,7 +2278,7 @@ label_process_entity: if (getScenes()->checkPosition(kSceneNone, SceneManager::kCheckPositionLookingUp)) { getSavePoints()->push(kEntityPlayer, entity, kActionExcuseMeCath); - } else if (getScenes()->checkPosition(kSceneNone, SceneManager::kCheckPositionLookingDown) || getScenes()->checkCurrentPosition(false)){ + } else if (getScenes()->checkPosition(kSceneNone, SceneManager::kCheckPositionLookingDown) || getScenes()->checkCurrentPosition(false)) { getSavePoints()->push(kEntityPlayer, entity, kActionExcuseMe); if (getScenes()->checkCurrentPosition(false)) diff --git a/engines/lastexpress/game/scenes.cpp b/engines/lastexpress/game/scenes.cpp index 447e8714b0..3cda900757 100644 --- a/engines/lastexpress/game/scenes.cpp +++ b/engines/lastexpress/game/scenes.cpp @@ -489,7 +489,7 @@ bool SceneManager::checkCurrentPosition(bool doCheckOtherCars) const { if (position == 99) return true; - switch (car){ + switch (car) { default: break; diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp index 4f6a7b8f93..319f7cd4f4 100644 --- a/engines/lastexpress/sound/sound.cpp +++ b/engines/lastexpress/sound/sound.cpp @@ -674,7 +674,7 @@ const char *SoundManager::getDialogName(EntityIndex entity) const { ////////////////////////////////////////////////////////////////////////// // Letters & Messages ////////////////////////////////////////////////////////////////////////// -void SoundManager::readText(int id){ +void SoundManager::readText(int id) { if (!_queue->isBuffered(kEntityTables4)) return; -- cgit v1.2.3 From 7084f6a46498cb81d0960fe46d44ae17f2784476 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 27 Jul 2012 20:05:00 -0400 Subject: CONFIGURE: Add MSCV11 handling to ideprojects target --- ports.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ports.mk b/ports.mk index 357a7e297a..9a20331924 100644 --- a/ports.mk +++ b/ports.mk @@ -293,6 +293,8 @@ endif @cd $(srcdir)/dists/msvc9 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 9 >/dev/null && git add -f *.sln *.vcproj *.vsprops @echo Creating MSVC10 project files... @cd $(srcdir)/dists/msvc10 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 10 >/dev/null && git add -f *.sln *.vcxproj *.vcxproj.filters *.props + @echo Creating MSVC11 project files... + @cd $(srcdir)/dists/msvc11 && ../../devtools/create_project/create_project ../.. --msvc --msvc-version 11 >/dev/null && git add -f *.sln *.vcxproj *.vcxproj.filters *.props @echo @echo All is done. @echo Now run -- cgit v1.2.3 From 42c9b405f1d7a6e4e3a117579a126f290c6d895a Mon Sep 17 00:00:00 2001 From: Littleboy Date: Fri, 27 Jul 2012 23:23:17 -0400 Subject: LASTEXPRESS: Untemplatize setup functions --- engines/lastexpress/entities/entity.cpp | 190 ++++++++++++++++++++++++- engines/lastexpress/entities/entity.h | 242 +++++--------------------------- 2 files changed, 217 insertions(+), 215 deletions(-) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index aff9445326..4b1fda9c12 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -598,7 +598,49 @@ void Entity::setup(const char *name, uint index) { _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersIIII); + _data->resetCurrentParameters(); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupI(const char *name, uint index, uint param1) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%u)", name, param1); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); + params->param1 = (unsigned int)param1; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupII(const char *name, uint index, uint param1, uint param2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%u, %u)", name, param1, param2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); + params->param1 = param1; + params->param2 = param2; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupIII(const char *name, uint index, uint param1, uint param2, uint param3) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%u, %u, %u)", name, param1, param2, param3); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); + params->param1 = param1; + params->param2 = param2; + params->param3 = param3; _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); } @@ -608,10 +650,10 @@ void Entity::setupS(const char *name, uint index, const char *seq1) { _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersSIIS); + _data->resetCurrentParameters(); EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS*)_data->getCurrentParameters(); - strncpy((char *)¶ms->seq1, seq1, 12); + strncpy(params->seq1, seq1, 12); _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); } @@ -621,11 +663,147 @@ void Entity::setupSS(const char *name, uint index, const char *seq1, const char _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersSSII); + _data->resetCurrentParameters(); EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII*)_data->getCurrentParameters(); - strncpy((char *)¶ms->seq1, seq1, 12); - strncpy((char *)¶ms->seq2, seq2, 12); + strncpy(params->seq1, seq1, 12); + strncpy(params->seq2, seq2, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupSI(const char *name, uint index, const char *seq1, uint param4) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %u)", name, seq1, param4); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); + strncpy(params->seq1, seq1, 12); + params->param4 = param4; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupSII(const char *name, uint index, const char *seq1, uint param4, uint param5) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %u, %u)", name, seq1, param4, param5); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); + strncpy(params->seq1, seq1, 12); + params->param4 = param4; + params->param5 = param5; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupSIII(const char *name, uint index, const char *seq, uint param4, uint param5, uint param6) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %u, %u, %u)", name, seq, param4, param5, param6); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII *)_data->getCurrentParameters(); + strncpy(params->seq, seq, 12); + params->param4 = param4; + params->param5 = param5; + params->param6 = param6; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupSIIS(const char *name, uint index, const char *seq1, uint param4, uint param5, const char *seq2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %u, %u, %s)", name, seq1, param4, param5, seq2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); + strncpy(params->seq1, seq1, 12); + params->param4 = param4; + params->param5 = param5; + strncpy(params->seq2, seq2, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupSSI(const char *name, uint index, const char *seq1, const char *seq2, uint param7) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %s, %u)", name, seq1, seq2, param7); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII *)_data->getCurrentParameters(); + strncpy(params->seq1, seq1, 12); + strncpy(params->seq2, seq2, 12); + params->param7 = param7; + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupIS(const char *name, uint index, uint param1, const char *seq) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%u, %s)", name, param1, seq); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII *)_data->getCurrentParameters(); + params->param1 = (unsigned int)param1; + strncpy(params->seq, seq, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupISS(const char *name, uint index, uint param1, const char *seq1, const char *seq2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%u, %s, %s)", name, param1, seq1, seq2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI *)_data->getCurrentParameters(); + params->param1 = param1; + strncpy(params->seq1, seq1, 12); + strncpy(params->seq2, seq2, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupIIS(const char *name, uint index, uint param1, uint param2, const char *seq) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%u, %u, %s)", name, param1, param2, seq); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI *)_data->getCurrentParameters(); + params->param1 = param1; + params->param2 = param2; + strncpy(params->seq, seq, 12); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); +} + +void Entity::setupIISS(const char *name, uint index, uint param1, uint param2, const char *seq1, const char *seq2) { + debugC(6, kLastExpressDebugLogic, "Entity: %s(%u, %u, %s, %s)", name, param1, param2, seq1, seq2); + + _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); + _data->setCurrentCallback(index); + _data->resetCurrentParameters(); + + EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS *)_data->getCurrentParameters(); + params->param1 = param1; + params->param2 = param2; + strncpy(params->seq1, seq1, 12); + strncpy(params->seq2, seq2, 12); _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); } diff --git a/engines/lastexpress/entities/entity.h b/engines/lastexpress/entities/entity.h index 0b1db137a6..3601f34f6f 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -122,13 +122,6 @@ struct SavePoint; if (!params) \ error("[EXPOSE_PARAMS] Trying to call an entity function with invalid parameters"); \ -#define RESET_PARAMS(data, type) do { \ - EntityData::EntityCallParameters *callParameters = data->getCurrentCallParameters(); \ - callParameters->clear(); \ - for (int i = 0; i < 4; i++) \ - callParameters->parameters[i] = new type(); \ -} while (false) - // function signature without setup (we keep the index for consistency but never use it) #define IMPLEMENT_FUNCTION_NOSETUP(index, class, name) \ void class::name(const SavePoint &savepoint) { \ @@ -154,7 +147,7 @@ struct SavePoint; // setup with one uint parameter #define IMPLEMENT_FUNCTION_I(index, class, name, paramType) \ void class::setup_##name(paramType param1) { \ - Entity::setupI(#class "::setup_" #name, index, param1); \ + Entity::setupI(#class "::setup_" #name, index, param1); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ @@ -163,7 +156,7 @@ struct SavePoint; // setup with two uint parameters #define IMPLEMENT_FUNCTION_II(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2) { \ - Entity::setupII(#class "::setup_" #name, index, param1, param2); \ + Entity::setupII(#class "::setup_" #name, index, param1, param2); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ @@ -172,7 +165,7 @@ struct SavePoint; // setup with three uint parameters #define IMPLEMENT_FUNCTION_III(index, class, name, paramType1, paramType2, paramType3) \ void class::setup_##name(paramType1 param1, paramType2 param2, paramType3 param3) { \ - Entity::setupIII(#class "::setup_" #name, index, param1, param2, param3); \ + Entity::setupIII(#class "::setup_" #name, index, param1, param2, param3); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersIIII) \ @@ -190,7 +183,7 @@ struct SavePoint; // setup with one char *parameter and one uint #define IMPLEMENT_FUNCTION_SI(index, class, name, paramType2) \ void class::setup_##name(const char *seq1, paramType2 param4) { \ - Entity::setupSI(#class "::setup_" #name, index, seq1, param4); \ + Entity::setupSI(#class "::setup_" #name, index, seq1, param4); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ @@ -199,7 +192,7 @@ struct SavePoint; // setup with one char *parameter and two uints #define IMPLEMENT_FUNCTION_SII(index, class, name, paramType2, paramType3) \ void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5) { \ - Entity::setupSII(#class "::setup_" #name, index, seq1, param4, param5); \ + Entity::setupSII(#class "::setup_" #name, index, seq1, param4, param5); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ @@ -208,7 +201,7 @@ struct SavePoint; // setup with one char *parameter and three uints #define IMPLEMENT_FUNCTION_SIII(index, class, name, paramType2, paramType3, paramType4) \ void class::setup_##name(const char *seq, paramType2 param4, paramType3 param5, paramType4 param6) { \ - Entity::setupSIII(#class "::setup_" #name, index, seq, param4, param5, param6); \ + Entity::setupSIII(#class "::setup_" #name, index, seq, param4, param5, param6); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersSIII) \ @@ -216,7 +209,7 @@ struct SavePoint; #define IMPLEMENT_FUNCTION_SIIS(index, class, name, paramType2, paramType3) \ void class::setup_##name(const char *seq1, paramType2 param4, paramType3 param5, const char *seq2) { \ - Entity::setupSIIS(#class "::setup_" #name, index, seq1, param4, param5, seq2); \ + Entity::setupSIIS(#class "::setup_" #name, index, seq1, param4, param5, seq2); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersSIIS) \ @@ -232,7 +225,7 @@ struct SavePoint; #define IMPLEMENT_FUNCTION_SSI(index, class, name, paramType3) \ void class::setup_##name(const char *seq1, const char *seq2, paramType3 param7) { \ - Entity::setupSSI(#class "::setup_" #name, index, seq1, seq2, param7); \ + Entity::setupSSI(#class "::setup_" #name, index, seq1, seq2, param7); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersSSII) \ @@ -240,7 +233,7 @@ struct SavePoint; #define IMPLEMENT_FUNCTION_IS(index, class, name, paramType) \ void class::setup_##name(paramType param1, const char *seq) { \ - Entity::setupIS(#class "::setup_" #name, index, param1, seq); \ + Entity::setupIS(#class "::setup_" #name, index, param1, seq); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersISII) \ @@ -248,7 +241,7 @@ struct SavePoint; #define IMPLEMENT_FUNCTION_ISS(index, class, name, paramType) \ void class::setup_##name(paramType param1, const char *seq1, const char *seq2) { \ - Entity::setupISS(#class "::setup_" #name, index, param1, seq1, seq2); \ + Entity::setupISS(#class "::setup_" #name, index, param1, seq1, seq2); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersISSI) \ @@ -256,7 +249,7 @@ struct SavePoint; #define IMPLEMENT_FUNCTION_IIS(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq) { \ - Entity::setupIIS(#class "::setup_" #name, index, param1, param2, seq); \ + Entity::setupIIS(#class "::setup_" #name, index, param1, param2, seq); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersIISI) \ @@ -264,7 +257,7 @@ struct SavePoint; #define IMPLEMENT_FUNCTION_IISS(index, class, name, paramType1, paramType2) \ void class::setup_##name(paramType1 param1, paramType2 param2, const char *seq1, const char *seq2) { \ - Entity::setupIISS(#class "::setup_" #name, index, param1, param2, seq1, seq2); \ + Entity::setupIISS(#class "::setup_" #name, index, param1, param2, seq1, seq2); \ } \ void class::name(const SavePoint &savepoint) { \ EXPOSE_PARAMS(EntityData::EntityParametersIISS) \ @@ -842,6 +835,15 @@ public: EntityData() {} + template + void resetCurrentParameters() { + EntityCallParameters *params = &_parameters[_data.currentCall]; + params->clear(); + + for (int i = 0; i < 4; i++) + params->parameters[i] = new T(); + } + EntityCallData *getCallData() { return &_data; } EntityParameters *getParameters(uint callback, byte index) const; @@ -1068,198 +1070,20 @@ protected: // Setup functions ////////////////////////////////////////////////////////////////////////// void setup(const char *name, uint index); + void setupI(const char *name, uint index, uint param1); + void setupII(const char *name, uint index, uint param1, uint param2); + void setupIII(const char *name, uint index, uint param1, uint param2, uint param3); void setupS(const char *name, uint index, const char *seq1); void setupSS(const char *name, uint index, const char *seq1, const char *seq2); - - template - void setupI(const char *name, uint index, T param1) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%d)", name, param1); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersIIII); - - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); - params->param1 = (unsigned int)param1; - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupII(const char *name, uint index, T1 param1, T2 param2) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %d)", name, param1, param2); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersIIII); - - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); - params->param1 = param1; - params->param2 = param2; - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupIII(const char *name, uint index, T1 param1, T2 param2, T3 param3) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %d, %d)", name, param1, param2, param3); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersIIII); - - EntityData::EntityParametersIIII *params = (EntityData::EntityParametersIIII *)_data->getCurrentParameters(); - params->param1 = param1; - params->param2 = param2; - params->param3 = param3; - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupSI(const char *name, uint index, const char *seq1, T param4) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %d)", name, seq1, param4); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersSIIS); - - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); - strncpy((char *)¶ms->seq1, seq1, 12); - params->param4 = param4; - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupSII(const char *name, uint index, const char *seq1, T1 param4, T2 param5) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %d, %d)", name, seq1, param4, param5); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersSIIS); - - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); - strncpy((char *)¶ms->seq1, seq1, 12); - params->param4 = param4; - params->param5 = param5; - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupSIII(const char *name, uint index, const char *seq, T1 param4, T2 param5, T3 param6) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %d, %d, %d)", name, seq, param4, param5, param6); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersSIII); - - EntityData::EntityParametersSIII *params = (EntityData::EntityParametersSIII *)_data->getCurrentParameters(); - strncpy((char *)¶ms->seq, seq, 12); - params->param4 = param4; - params->param5 = param5; - params->param6 = param6; - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupSIIS(const char *name, uint index, const char *seq1, T1 param4, T2 param5, const char *seq2) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %d, %d, %s)", name, seq1, param4, param5, seq2); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersSIIS); - - EntityData::EntityParametersSIIS *params = (EntityData::EntityParametersSIIS *)_data->getCurrentParameters(); - strncpy((char *)¶ms->seq1, seq1, 12); - params->param4 = param4; - params->param5 = param5; - strncpy((char *)¶ms->seq2, seq2, 12); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupSSI(const char *name, uint index, const char *seq1, const char *seq2, T param7) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%s, %s, %d)", name, seq1, seq2, param7); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersSSII); - - EntityData::EntityParametersSSII *params = (EntityData::EntityParametersSSII *)_data->getCurrentParameters(); - strncpy((char *)¶ms->seq1, seq1, 12); - strncpy((char *)¶ms->seq2, seq2, 12); - params->param7 = param7; - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupIS(const char *name, uint index, T param1, const char *seq) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %s)", name, param1, seq); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersISII); - - EntityData::EntityParametersISII *params = (EntityData::EntityParametersISII *)_data->getCurrentParameters(); - params->param1 = (unsigned int)param1; - strncpy((char *)¶ms->seq, seq, 12); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupISS(const char *name, uint index, T param1, const char *seq1, const char *seq2) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %s, %s)", name, param1, seq1, seq2); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersISSI); - - EntityData::EntityParametersISSI *params = (EntityData::EntityParametersISSI *)_data->getCurrentParameters(); - params->param1 = param1; - strncpy((char *)¶ms->seq1, seq1, 12); - strncpy((char *)¶ms->seq2, seq2, 12); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupIIS(const char *name, uint index, T1 param1, T2 param2, const char *seq) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %d, %s)", name, param1, param2, seq); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersIISI); - - EntityData::EntityParametersIISI *params = (EntityData::EntityParametersIISI *)_data->getCurrentParameters(); - params->param1 = param1; - params->param2 = param2; - strncpy((char *)¶ms->seq, seq, 12); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } - - template - void setupIISS(const char *name, uint index, T1 param1, T2 param2, const char *seq1, const char *seq2) { - debugC(6, kLastExpressDebugLogic, "Entity: %s(%d, %d, %s, %s)", name, param1, param2, seq1, seq2); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->setCallback(_entityIndex, _callbacks[index]); - _data->setCurrentCallback(index); - RESET_PARAMS(_data, EntityData::EntityParametersIISS); - - EntityData::EntityParametersIISS *params = (EntityData::EntityParametersIISS *)_data->getCurrentParameters(); - params->param1 = param1; - params->param2 = param2; - strncpy((char *)¶ms->seq1, seq1, 12); - strncpy((char *)¶ms->seq2, seq2, 12); - - _engine->getGameLogic()->getGameState()->getGameSavePoints()->call(_entityIndex, _entityIndex, kActionDefault); - } + void setupSI(const char *name, uint index, const char *seq1, uint param4); + void setupSII(const char *name, uint index, const char *seq1, uint param4, uint param5); + void setupSIII(const char *name, uint index, const char *seq, uint param4, uint param5, uint param6); + void setupSIIS(const char *name, uint index, const char *seq1, uint param4, uint param5, const char *seq2); + void setupSSI(const char *name, uint index, const char *seq1, const char *seq2, uint param7); + void setupIS(const char *name, uint index, uint param1, const char *seq); + void setupISS(const char *name, uint index, uint param1, const char *seq1, const char *seq2); + void setupIIS(const char *name, uint index, uint param1, uint param2, const char *seq); + void setupIISS(const char *name, uint index, uint param1, uint param2, const char *seq1, const char *seq2); ////////////////////////////////////////////////////////////////////////// // Helper functions -- cgit v1.2.3 From 1bfd55535fc4b1e25bfeafbaf1bfcb6a3443a40e Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 28 Jul 2012 00:58:34 -0400 Subject: LASTEXPRESS: Disable sound filter reset on each decoded block The filter id should be computed from the sound entry status for each decoded block. The current code was resulting in blocks being skipped. --- engines/lastexpress/data/snd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp index 51d0815c1e..a77e4a06c6 100644 --- a/engines/lastexpress/data/snd.cpp +++ b/engines/lastexpress/data/snd.cpp @@ -378,7 +378,7 @@ public: // Get current filter _currentFilterId = _nextFilterId; - _nextFilterId = -1; + //_nextFilterId = -1; // FIXME: the filter id should be recomputed based on the sound entry status for each block // No filter: skip decoding if (_currentFilterId == -1) -- cgit v1.2.3 From 7bf0bfb12297f9e867090586baf60aba0b872896 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sat, 28 Jul 2012 17:51:43 -0400 Subject: LASTEXPRESS: Implement menu egg blinking --- engines/lastexpress/game/inventory.cpp | 75 +++++++++++++++++++--------------- engines/lastexpress/game/inventory.h | 12 ++---- engines/lastexpress/game/logic.cpp | 2 +- 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp index a36553c768..52c00ece31 100644 --- a/engines/lastexpress/game/inventory.cpp +++ b/engines/lastexpress/game/inventory.cpp @@ -28,6 +28,7 @@ #include "lastexpress/game/entities.h" #include "lastexpress/game/logic.h" +#include "lastexpress/game/savegame.h" #include "lastexpress/game/scenes.h" #include "lastexpress/game/state.h" @@ -45,7 +46,7 @@ namespace LastExpress { Inventory::Inventory(LastExpressEngine *engine) : _engine(engine), _selectedItem(kItemNone), _highlightedItemIndex(0), _itemsShown(0), - _showingHourGlass(false), _blinkingEgg(false), _blinkingTime(0), _blinkingInterval(_defaultBlinkingInterval), _blinkingBrightness(1), + _showingHourGlass(false), _blinkingDirection(1), _blinkingBrightness(0), _useMagnifier(false), _portraitHighlighted(false), _isOpened(false), _eggHightlighted(false), _itemScene(NULL) { //_inventoryRect = Common::Rect(0, 0, 32, 32); @@ -163,13 +164,11 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { getMenu()->show(true, kSavegameTypeIndex, 0); - } else if (ev.type == Common::EVENT_RBUTTONDOWN) { - if (getGlobalTimer()) { - if (getSoundQueue()->isBuffered("TIMER")) - getSoundQueue()->removeFromQueue("TIMER"); + } else if (ev.type == Common::EVENT_RBUTTONDOWN && getGlobalTimer()) { + if (getSoundQueue()->isBuffered("TIMER")) + getSoundQueue()->removeFromQueue("TIMER"); - setGlobalTimer(900); - } + setGlobalTimer(900); } } @@ -181,7 +180,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { if (_highlightedItemIndex) drawHighlight(_highlightedItemIndex, true); } else { - // The user released the mouse button, we need to update the inventory state (clear hightlight and items) + // The user released the mouse button, we need to update the inventory state (clear highlight and items) drawItem((CursorStyle)getProgress().portrait, 0, 0, 1); _engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(0, 44, 32, (int16)(40 * _itemsShown + 40))); _isOpened = false; @@ -227,12 +226,11 @@ void Inventory::handleMouseEvent(const Common::Event &ev) { if (getFlags()->mouseLeftPressed) { if (getState()->sceneUseBackup) { - if (getState()->sceneBackup2 - && getFirstExaminableItem() == _selectedItem) { - SceneIndex sceneIndex = getState()->sceneBackup2; - getState()->sceneBackup2 = kSceneNone; + if (getState()->sceneBackup2 && getFirstExaminableItem() == _selectedItem) { + SceneIndex sceneIndex = getState()->sceneBackup2; + getState()->sceneBackup2 = kSceneNone; - getScenes()->loadScene(sceneIndex); + getScenes()->loadScene(sceneIndex); } } else { getState()->sceneBackup = getState()->scene; @@ -622,37 +620,48 @@ void Inventory::drawEgg() const { } // Blinking egg: we need to blink the egg for delta time, with the blinking getting faster until it's always lit. -void Inventory::drawBlinkingEgg() { +void Inventory::drawBlinkingEgg(uint ticks) { + uint globalTimer = getGlobalTimer(); + uint timerValue = (getProgress().jacket == kJacketGreen) ? 450 : 225; - warning("[Inventory::drawBlinkingEgg] Blinking not implemented"); + if (globalTimer == timerValue || globalTimer == 900) { + _blinkingBrightness = 0; + _blinkingDirection = 1; + } - //// TODO show egg (with or without mouseover) + globalTimer = globalTimer <= ticks ? 0 : globalTimer - ticks; + setGlobalTimer(globalTimer); - //// Play timer sound - //if (getGlobalTimer() < 90) { - // if (getGlobalTimer() + ticks >= 90) - // getSound()->playSoundWithSubtitles("TIMER.SND", 50331664, kEntityPlayer); + if (getFlags()->flag_0 + || (globalTimer % 5) == 0 + || (globalTimer <= 500 && (globalTimer % ((globalTimer + 100) / 100)) == 0)) + blinkEgg(); - // if (getSoundQueue()->isBuffered("TIMER")) - // setGlobalTimer(0); - //} + if (globalTimer < 90) { + if ((globalTimer + ticks) >= 90) + getSound()->playSoundWithSubtitles("TIMER", (SoundFlag)(kFlagType13|kFlagDefault), kEntityPlayer); - //// Restore egg to standard brightness - //if (!getGlobalTimer()) { - // - //} + if (!getSoundQueue()->isBuffered("TIMER")) + setGlobalTimer(0); + } + if (globalTimer == 0) { + drawItem((CursorStyle)(getMenu()->getGameId() + 39), 608, 448, _menuEggRect.contains(getCoords()) ? 1 : -1); - //drawItem(608, 448, getMenu()->getGameId() + 39, _blinkingBrightness) + askForRedraw(); - //// TODO if delta time > _blinkingInterval, update egg & ask for redraw then adjust blinking time and remaining time - // + getSaveLoad()->saveGame(kSavegameTypeAuto, kEntityChapters, 0); + } +} - //// Reset values and stop blinking - //if (_blinkingTime == 0) - // blinkEgg(false); +void Inventory::blinkEgg() { + drawItem((CursorStyle)(getMenu()->getGameId() + 39), 608, 448, (_blinkingBrightness == 0) ? -1 : _blinkingBrightness); askForRedraw(); + + _blinkingBrightness += _blinkingDirection; + if (_blinkingBrightness == 0 || _blinkingBrightness == 3) + _blinkingDirection = -_blinkingDirection; } void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, int16 brightnessIndex) const { diff --git a/engines/lastexpress/game/inventory.h b/engines/lastexpress/game/inventory.h index 15dd29053d..b1019a43c6 100644 --- a/engines/lastexpress/game/inventory.h +++ b/engines/lastexpress/game/inventory.h @@ -106,11 +106,10 @@ public: // UI Control void show(); - void blinkEgg(bool enabled); void showHourGlass() const; void setPortrait(InventoryItem item) const; void drawEgg() const; - void drawBlinkingEgg(); + void drawBlinkingEgg(uint ticks = 1); // Handle inventory UI events. void handleMouseEvent(const Common::Event &ev); @@ -133,8 +132,6 @@ public: Common::String toString(); private: - static const uint32 _defaultBlinkingInterval = 250; ///< Default blinking interval in ms - LastExpressEngine *_engine; InventoryEntry _entries[32]; @@ -144,9 +141,7 @@ private: uint32 _itemsShown; bool _showingHourGlass; - bool _blinkingEgg; - uint32 _blinkingTime; - uint32 _blinkingInterval; + int16 _blinkingDirection; uint16 _blinkingBrightness; // Flags @@ -157,8 +152,6 @@ private: Scene *_itemScene; - // Important rects - //Common::Rect _inventoryRect; Common::Rect _menuEggRect; Common::Rect _selectedItemRect; @@ -173,6 +166,7 @@ private: bool isItemSceneParameter(InventoryItem item) const; void drawItem(CursorStyle id, uint16 x, uint16 y, int16 brighnessIndex = -1) const; + void blinkEgg(); void drawSelectedItem(); void clearSelectedItem() const; diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp index 795f165766..135b7d3480 100644 --- a/engines/lastexpress/game/logic.cpp +++ b/engines/lastexpress/game/logic.cpp @@ -313,7 +313,7 @@ void Logic::eventTick(const Common::Event &) { ////////////////////////////////////////////////////////////////////////// // Draw the blinking egg if needed if (getGlobalTimer() && !getFlags()->shouldDrawEggOrHourGlass) - getInventory()->drawBlinkingEgg(); + getInventory()->drawBlinkingEgg(ticks); ////////////////////////////////////////////////////////////////////////// // Adjust time and save game if needed -- cgit v1.2.3 From 5fcf8c268167667c88a977ad243a7582bbf412e5 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 29 Jul 2012 16:41:51 +0200 Subject: DOCS: Replace tab character with spaces in our README. --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 8d4ca4bc22..bbca0ec0cd 100644 --- a/README +++ b/README @@ -2125,7 +2125,7 @@ Lands of Lore: The Throne of Chaos adds the following non-standard keywords: Space Quest IV CD adds the following non-standard keyword: silver_cursors bool If true, an alternate set of silver mouse cursors - is used instead of the original golden ones + is used instead of the original golden ones Simon the Sorcerer 1 and 2 add the following non-standard keywords: -- cgit v1.2.3 From dd10e7191e4b373513e5a6fa73daa6312bd81f62 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 29 Jul 2012 12:30:34 -0400 Subject: VIDEO: Move Track's start()/stop() functions to AudioTrack --- video/video_decoder.cpp | 26 ++++++++++++++------------ video/video_decoder.h | 22 ++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 131c86fdb8..84ce8144a0 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -268,7 +268,7 @@ bool AdvancedVideoDecoder::rewind() { // Stop all tracks so they can be rewound if (isPlaying()) - stopAllTracks(); + stopAudio(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) if (!(*it)->rewind()) @@ -276,7 +276,7 @@ bool AdvancedVideoDecoder::rewind() { // Now that we've rewound, start all tracks again if (isPlaying()) - startAllTracks(); + startAudio(); _audioStartOffset = 0; _startTime = g_system->getMillis(); @@ -303,7 +303,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { // Stop all tracks so they can be seeked if (isPlaying()) - stopAllTracks(); + stopAudio(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) if (!(*it)->seek(time)) @@ -311,7 +311,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { // Now that we've seeked, start all tracks again if (isPlaying()) - startAllTracks(); + startAudio(); _audioStartOffset = time; _startTime = g_system->getMillis() - time.msecs(); @@ -332,7 +332,7 @@ void AdvancedVideoDecoder::start() { if (_needsRewind) rewind(); - startAllTracks(); + startAudio(); } void AdvancedVideoDecoder::stop() { @@ -346,7 +346,7 @@ void AdvancedVideoDecoder::stop() { _dirtyPalette = false; _needsUpdate = false; - stopAllTracks(); + stopAudio(); // Also reset the pause state. _pauseLevel = 0; @@ -532,8 +532,8 @@ void AdvancedVideoDecoder::addTrack(Track *track) { track->pause(true); // Start the track if we're playing - if (isPlaying()) - track->start(); + if (isPlaying() && track->getTrackType() == Track::kTrackTypeAudio) + ((AudioTrack *)track)->start(); } bool AdvancedVideoDecoder::addStreamFileTrack(const Common::String &baseName) { @@ -607,14 +607,16 @@ const AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack return bestTrack; } -void AdvancedVideoDecoder::startAllTracks() { +void AdvancedVideoDecoder::startAudio() { for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) - (*it)->start(); + if ((*it)->getTrackType() == Track::kTrackTypeAudio) + ((AudioTrack *)*it)->start(); } -void AdvancedVideoDecoder::stopAllTracks() { +void AdvancedVideoDecoder::stopAudio() { for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) - (*it)->stop(); + if ((*it)->getTrackType() == Track::kTrackTypeAudio) + ((AudioTrack *)*it)->stop(); } ////////////////////////////////////////////// diff --git a/video/video_decoder.h b/video/video_decoder.h index 3f5dc2c2ff..ad9825cb25 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -446,16 +446,6 @@ protected: */ virtual bool seek(const Audio::Timestamp &time) { return false; } - /** - * Start playback of the track. - */ - virtual void start() {} - - /** - * Stop playback of the track. - */ - virtual void stop() {} - /** * Set the pause status of the track. */ @@ -578,7 +568,15 @@ protected: TrackType getTrackType() const { return kTrackTypeAudio; } virtual bool endOfTrack() const; + + /** + * Start playing this track + */ void start(); + + /** + * Stop playing this track + */ void stop(); /** @@ -785,8 +783,8 @@ private: Graphics::PixelFormat _defaultHighColorFormat; // Internal helper functions - void stopAllTracks(); - void startAllTracks(); + void stopAudio(); + void startAudio(); }; /** -- cgit v1.2.3 From e58724a180b965e16eec816fd6bcb2bb71607307 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 29 Jul 2012 14:27:03 -0400 Subject: MOHAWK: Remove Myst ME Macintosh "support" The Mac version of Myst ME is actually not Mohawk and is instead closer to the engine used in Myst3. --- engines/mohawk/detection_tables.h | 18 ----- engines/mohawk/myst.cpp | 44 ++---------- engines/mohawk/myst_graphics.cpp | 136 ++++++++--------------------------- engines/mohawk/myst_graphics.h | 15 ---- engines/mohawk/myst_stacks/intro.cpp | 25 ++----- 5 files changed, 43 insertions(+), 195 deletions(-) diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h index 5acc1bb179..55814af1c3 100644 --- a/engines/mohawk/detection_tables.h +++ b/engines/mohawk/detection_tables.h @@ -203,24 +203,6 @@ static const MohawkGameDescription gameDescriptions[] = { 0, }, - // Myst Masterpiece Edition - // English Windows - // From clone2727 - { - { - "myst", - "Masterpiece Edition", - AD_ENTRY1("MYST.DAT", "c4cae9f143b5947262e6cb2397e1617e"), - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_UNSTABLE, - GUIO1(GUIO_NOASPECT) - }, - GType_MYST, - GF_ME, - 0, - }, - // Myst Masterpiece Edition // German Windows // From DrMcCoy (Included in "Myst: Die Trilogie") diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 0efd412bd0..9c0e642203 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -98,11 +98,6 @@ MohawkEngine_Myst::MohawkEngine_Myst(OSystem *syst, const MohawkGameDescription _view.soundListVolume = NULL; _view.scriptResCount = 0; _view.scriptResources = NULL; - - if ((getFeatures() & GF_ME) && getPlatform() == Common::kPlatformMacintosh) { - const Common::FSNode gameDataDir(ConfMan.get("path")); - SearchMan.addSubDirectoryMatching(gameDataDir, "CD Data"); - } } MohawkEngine_Myst::~MohawkEngine_Myst() { @@ -205,11 +200,6 @@ static const char *mystFiles[] = { // qtw/myst/libelev.mov: libup.mov is basically the same with sound Common::String MohawkEngine_Myst::wrapMovieFilename(const Common::String &movieName, uint16 stack) { - // The Macintosh release of Myst ME stores its videos in a different folder - // WORKAROUND: The gear rotation videos are not in the CD Data folder. See above comments. - if ((getFeatures() & GF_ME) && getPlatform() == Common::kPlatformMacintosh && !movieName.matchString("cl1wg?")) - return Common::String("CD Data/m/") + movieName + ".mov"; - Common::String prefix; switch (stack) { @@ -498,52 +488,32 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS if (!_mhk[0]->openFile(mystFiles[_curStack])) error("Could not open %s", mystFiles[_curStack]); - if (getPlatform() == Common::kPlatformMacintosh) - _gfx->loadExternalPictureFile(_curStack); - _runExitScript = false; // Clear the resource cache and the image cache _cache.clear(); _gfx->clearCache(); - // Play Flyby Entry Movie on Masterpiece Edition. The Macintosh version is currently hooked - // up to the Cinepak versions of the video (the 'c' suffix) until the SVQ1 decoder is completed. + // Play Flyby Entry Movie on Masterpiece Edition. const char *flyby = 0; if (getFeatures() & GF_ME) { switch (_curStack) { case kSeleniticStack: - if (getPlatform() == Common::kPlatformMacintosh) - flyby = "FLY_SEc"; - else - flyby = "selenitic flyby"; + flyby = "selenitic flyby"; break; case kStoneshipStack: - if (getPlatform() == Common::kPlatformMacintosh) - flyby = "FLY_STc"; - else - flyby = "stoneship flyby"; + flyby = "stoneship flyby"; break; // Myst Flyby Movie not used in Original Masterpiece Edition Engine case kMystStack: - if (_tweaksEnabled) { - if (getPlatform() == Common::kPlatformMacintosh) - flyby = "FLY_MYc"; - else - flyby = "myst flyby"; - } + if (_tweaksEnabled) + flyby = "myst flyby"; break; case kMechanicalStack: - if (getPlatform() == Common::kPlatformMacintosh) - flyby = "FLY_MEc"; - else - flyby = "mech age flyby"; + flyby = "mech age flyby"; break; case kChannelwoodStack: - if (getPlatform() == Common::kPlatformMacintosh) - flyby = "FLY_CHc"; - else - flyby = "channelwood flyby"; + flyby = "channelwood flyby"; break; default: break; diff --git a/engines/mohawk/myst_graphics.cpp b/engines/mohawk/myst_graphics.cpp index ae80dd5538..2df0f7e6ba 100644 --- a/engines/mohawk/myst_graphics.cpp +++ b/engines/mohawk/myst_graphics.cpp @@ -49,8 +49,6 @@ MystGraphics::MystGraphics(MohawkEngine_Myst* vm) : GraphicsManager(), _vm(vm) { if (_pixelFormat.bytesPerPixel == 1) error("Myst requires greater than 256 colors to run"); - _pictureFile.entries = NULL; - // Initialize our buffer _backBuffer = new Graphics::Surface(); _backBuffer->create(_vm->_system->getWidth(), _vm->_system->getHeight(), _pixelFormat); @@ -61,122 +59,50 @@ MystGraphics::MystGraphics(MohawkEngine_Myst* vm) : GraphicsManager(), _vm(vm) { MystGraphics::~MystGraphics() { delete _bmpDecoder; - delete[] _pictureFile.entries; _backBuffer->free(); delete _backBuffer; } -static const char *s_picFileNames[] = { - "CHpics", - "", - "", - "DUpics", - "INpics", - "", - "MEpics", - "MYpics", - "SEpics", - "", - "", - "STpics" -}; - -void MystGraphics::loadExternalPictureFile(uint16 stack) { - if (_vm->getPlatform() != Common::kPlatformMacintosh) - return; - - if (_pictureFile.picFile.isOpen()) - _pictureFile.picFile.close(); - delete[] _pictureFile.entries; - - if (!scumm_stricmp(s_picFileNames[stack], "")) - return; - - if (!_pictureFile.picFile.open(s_picFileNames[stack])) - error ("Could not open external picture file \'%s\'", s_picFileNames[stack]); - - _pictureFile.pictureCount = _pictureFile.picFile.readUint32BE(); - _pictureFile.entries = new PictureFile::PictureEntry[_pictureFile.pictureCount]; - - for (uint32 i = 0; i < _pictureFile.pictureCount; i++) { - _pictureFile.entries[i].offset = _pictureFile.picFile.readUint32BE(); - _pictureFile.entries[i].size = _pictureFile.picFile.readUint32BE(); - _pictureFile.entries[i].id = _pictureFile.picFile.readUint16BE(); - _pictureFile.entries[i].type = _pictureFile.picFile.readUint16BE(); - _pictureFile.entries[i].width = _pictureFile.picFile.readUint16BE(); - _pictureFile.entries[i].height = _pictureFile.picFile.readUint16BE(); +MohawkSurface *MystGraphics::decodeImage(uint16 id) { + // We need to grab the image from the current stack archive, however, we don't know + // if it's a PICT or WDIB resource. If it's Myst ME it's most likely a PICT, and if it's + // original it's definitely a WDIB. However, Myst ME throws us another curve ball in + // that PICT resources can contain WDIB's instead of PICT's. + Common::SeekableReadStream *dataStream = NULL; + + if (_vm->getFeatures() & GF_ME && _vm->hasResource(ID_PICT, id)) { + // The PICT resource exists. However, it could still contain a MystBitmap + // instead of a PICT image... + dataStream = _vm->getResource(ID_PICT, id); + } else { + // No PICT, so the WDIB must exist. Let's go grab it. + dataStream = _vm->getResource(ID_WDIB, id); } -} -MohawkSurface *MystGraphics::decodeImage(uint16 id) { - MohawkSurface *mhkSurface = 0; + bool isPict = false; - // Myst ME uses JPEG/PICT images instead of compressed Windows Bitmaps for room images, - // though there are a few weird ones that use that format. For further nonsense with images, - // the Macintosh version stores images in external "picture files." We check them before - // going to check for a PICT resource. - if (_vm->getFeatures() & GF_ME && _vm->getPlatform() == Common::kPlatformMacintosh && _pictureFile.picFile.isOpen()) { - for (uint32 i = 0; i < _pictureFile.pictureCount; i++) - if (_pictureFile.entries[i].id == id) { - if (_pictureFile.entries[i].type == 0) { - Graphics::JPEGDecoder jpeg; - Common::SeekableSubReadStream subStream(&_pictureFile.picFile, _pictureFile.entries[i].offset, _pictureFile.entries[i].offset + _pictureFile.entries[i].size); - - if (!jpeg.loadStream(subStream)) - error("Could not decode Myst ME Mac JPEG"); - - mhkSurface = new MohawkSurface(jpeg.getSurface()->convertTo(_pixelFormat)); - } else if (_pictureFile.entries[i].type == 1) { - Graphics::PICTDecoder pict; - Common::SeekableSubReadStream subStream(&_pictureFile.picFile, _pictureFile.entries[i].offset, _pictureFile.entries[i].offset + _pictureFile.entries[i].size); - - if (!pict.loadStream(subStream)) - error("Could not decode Myst ME Mac PICT"); - - mhkSurface = new MohawkSurface(pict.getSurface()->convertTo(_pixelFormat)); - } else - error ("Unknown Picture File type %d", _pictureFile.entries[i].type); - break; - } + if (_vm->getFeatures() & GF_ME) { + // Here we detect whether it's really a PICT or a WDIB. Since a MystBitmap + // would be compressed, there's no way to detect for the BM without a hack. + // So, we search for the PICT version opcode for detection. + dataStream->seek(512 + 10); // 512 byte pict header + isPict = (dataStream->readUint32BE() == 0x001102FF); + dataStream->seek(0); } - // We're not using the external Mac files, so it's time to delve into the main Mohawk - // archives. However, we still don't know if it's a PICT or WDIB resource. If it's Myst - // ME it's most likely a PICT, and if it's original it's definitely a WDIB. However, - // Myst ME throws us another curve ball in that PICT resources can contain WDIB's instead - // of PICT's. - if (!mhkSurface) { - bool isPict = false; - Common::SeekableReadStream *dataStream = NULL; - - if (_vm->getFeatures() & GF_ME && _vm->hasResource(ID_PICT, id)) { - // The PICT resource exists. However, it could still contain a MystBitmap - // instead of a PICT image... - dataStream = _vm->getResource(ID_PICT, id); - } else // No PICT, so the WDIB must exist. Let's go grab it. - dataStream = _vm->getResource(ID_WDIB, id); - - if (_vm->getFeatures() & GF_ME) { - // Here we detect whether it's really a PICT or a WDIB. Since a MystBitmap - // would be compressed, there's no way to detect for the BM without a hack. - // So, we search for the PICT version opcode for detection. - dataStream->seek(512 + 10); // 512 byte pict header - isPict = (dataStream->readUint32BE() == 0x001102FF); - dataStream->seek(0); - } + MohawkSurface *mhkSurface = 0; - if (isPict) { - Graphics::PICTDecoder pict; + if (isPict) { + Graphics::PICTDecoder pict; - if (!pict.loadStream(*dataStream)) - error("Could not decode Myst ME PICT"); + if (!pict.loadStream(*dataStream)) + error("Could not decode Myst ME PICT"); - mhkSurface = new MohawkSurface(pict.getSurface()->convertTo(_pixelFormat)); - } else { - mhkSurface = _bmpDecoder->decodeImage(dataStream); - mhkSurface->convertToTrueColor(); - } + mhkSurface = new MohawkSurface(pict.getSurface()->convertTo(_pixelFormat)); + } else { + mhkSurface = _bmpDecoder->decodeImage(dataStream); + mhkSurface->convertToTrueColor(); } assert(mhkSurface); diff --git a/engines/mohawk/myst_graphics.h b/engines/mohawk/myst_graphics.h index 20fd46c5b9..de8fe521e6 100644 --- a/engines/mohawk/myst_graphics.h +++ b/engines/mohawk/myst_graphics.h @@ -43,7 +43,6 @@ public: MystGraphics(MohawkEngine_Myst*); ~MystGraphics(); - void loadExternalPictureFile(uint16 stack); void copyImageSectionToScreen(uint16 image, Common::Rect src, Common::Rect dest); void copyImageSectionToBackBuffer(uint16 image, Common::Rect src, Common::Rect dest); void copyImageToScreen(uint16 image, Common::Rect dest); @@ -66,20 +65,6 @@ private: MohawkEngine_Myst *_vm; MystBitmap *_bmpDecoder; - struct PictureFile { - uint32 pictureCount; - struct PictureEntry { - uint32 offset; - uint32 size; - uint16 id; - uint16 type; - uint16 width; - uint16 height; - } *entries; - - Common::File picFile; - } _pictureFile; - Graphics::Surface *_backBuffer; Graphics::PixelFormat _pixelFormat; Common::Rect _viewport; diff --git a/engines/mohawk/myst_stacks/intro.cpp b/engines/mohawk/myst_stacks/intro.cpp index a5f608dbbf..545b97d956 100644 --- a/engines/mohawk/myst_stacks/intro.cpp +++ b/engines/mohawk/myst_stacks/intro.cpp @@ -100,12 +100,8 @@ void Intro::introMovies_run() { switch (_introStep) { case 0: - // Play the Mattel (or UbiSoft) logo in the Myst ME Mac version - if ((_vm->getFeatures() & GF_ME) && _vm->getPlatform() == Common::kPlatformMacintosh) { - _vm->_video->playMovie(_vm->wrapMovieFilename("mattel", kIntroStack)); - _introStep = 1; - } else - _introStep = 2; + _introStep = 1; + _vm->_video->playMovie(_vm->wrapMovieFilename("broder", kIntroStack)); break; case 1: if (!_vm->_video->isVideoPlaying()) @@ -113,10 +109,7 @@ void Intro::introMovies_run() { break; case 2: _introStep = 3; - if ((_vm->getFeatures() & GF_ME) && _vm->getPlatform() == Common::kPlatformMacintosh) - _vm->_video->playMovie(_vm->wrapMovieFilename("presto", kIntroStack)); - else - _vm->_video->playMovie(_vm->wrapMovieFilename("broder", kIntroStack)); + _vm->_video->playMovie(_vm->wrapMovieFilename("cyanlogo", kIntroStack)); break; case 3: if (!_vm->_video->isVideoPlaying()) @@ -124,21 +117,13 @@ void Intro::introMovies_run() { break; case 4: _introStep = 5; - _vm->_video->playMovie(_vm->wrapMovieFilename("cyanlogo", kIntroStack)); - break; - case 5: - if (!_vm->_video->isVideoPlaying()) - _introStep = 6; - break; - case 6: - _introStep = 7; if (!(_vm->getFeatures() & GF_DEMO)) // The demo doesn't have the intro video _vm->_video->playMovie(_vm->wrapMovieFilename("intro", kIntroStack)); break; - case 7: + case 5: if (!_vm->_video->isVideoPlaying()) - _introStep = 8; + _introStep = 6; break; default: if (_vm->getFeatures() & GF_DEMO) -- cgit v1.2.3 From 3b6398cd40838b7b2679eb597d453e3e81b1e6ef Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Sun, 29 Jul 2012 21:04:53 +0100 Subject: GPH: Clean up initialisation code and start event manager after log files are setup (if needed). --- backends/platform/gph/gph-backend.cpp | 49 +++++++++++++++++++++-------------- backends/platform/gph/gph.h | 9 ++++--- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/backends/platform/gph/gph-backend.cpp b/backends/platform/gph/gph-backend.cpp index 49a1edf411..485780b472 100644 --- a/backends/platform/gph/gph-backend.cpp +++ b/backends/platform/gph/gph-backend.cpp @@ -20,6 +20,8 @@ * */ +#if defined(GPH_DEVICE) + // Disable symbol overrides so that we can use system headers. #define FORBIDDEN_SYMBOL_ALLOW_ALL @@ -32,8 +34,6 @@ #include "backends/saves/default/default-saves.h" #include "backends/timer/default/default-timer.h" -#include "base/main.h" - #include "common/archive.h" #include "common/config-manager.h" #include "common/debug.h" @@ -64,23 +64,6 @@ void OSystem_GPH::initBackend() { assert(!_inited); - // Create the events manager - if (_eventSource == 0) - _eventSource = new GPHEventSource(); - - // Create the graphics manager - if (_graphicsManager == 0) { - _graphicsManager = new GPHGraphicsManager(_eventSource); - } - - // Create the mixer manager - if (_mixer == 0) { - _mixerManager = new DoubleBufferSDLMixerManager(); - - // Setup and start mixer - _mixerManager->init(); - } - /* Setup default save path to be workingdir/saves */ char savePath[PATH_MAX+1]; @@ -165,16 +148,42 @@ void OSystem_GPH::initBackend() { /* Make sure that aspect ratio correction is enabled on the 1st run to stop users asking me what the 'wasted space' at the bottom is ;-). */ ConfMan.registerDefault("aspect_ratio", true); + ConfMan.registerDefault("fullscreen", true); /* Make sure SDL knows that we have a joystick we want to use. */ ConfMan.setInt("joystick_num", 0); + // Create the events manager + if (_eventSource == 0) + _eventSource = new GPHEventSource(); + + // Create the graphics manager + if (_graphicsManager == 0) { + _graphicsManager = new GPHGraphicsManager(_eventSource); + } + /* Pass to POSIX method to do the heavy lifting */ OSystem_POSIX::initBackend(); _inited = true; } +void OSystem_GPH::initSDL() { + // Check if SDL has not been initialized + if (!_initedSDL) { + + uint32 sdlFlags = SDL_INIT_EVENTTHREAD; + if (ConfMan.hasKey("disable_sdl_parachute")) + sdlFlags |= SDL_INIT_NOPARACHUTE; + + // Initialize SDL (SDL Subsystems are initiliazed in the corresponding sdl managers) + if (SDL_Init(sdlFlags) == -1) + error("Could not initialize SDL: %s", SDL_GetError()); + + _initedSDL = true; + } +} + void OSystem_GPH::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { /* Setup default extra data paths for engine data files and plugins */ @@ -222,3 +231,5 @@ void OSystem_GPH::quit() { OSystem_POSIX::quit(); } + +#endif diff --git a/backends/platform/gph/gph.h b/backends/platform/gph/gph.h index 80f43f0bab..90a798154f 100644 --- a/backends/platform/gph/gph.h +++ b/backends/platform/gph/gph.h @@ -26,13 +26,11 @@ #if defined(GPH_DEVICE) #include "backends/base-backend.h" -#include "backends/platform/sdl/sdl.h" +#include "backends/platform/sdl/sdl-sys.h" #include "backends/platform/sdl/posix/posix.h" #include "backends/events/gph/gph-events.h" #include "backends/graphics/gph/gph-graphics.h" -#define __GP2XWIZ__ - #ifndef PATH_MAX #define PATH_MAX 255 #endif @@ -45,6 +43,11 @@ public: void addSysArchivesToSearchSet(Common::SearchSet &s, int priority); void initBackend(); void quit(); + +protected: + bool _inited; + bool _initedSDL; + virtual void initSDL(); }; #endif -- cgit v1.2.3 From 9c2018c5a890c5276249f2b93be274a564efd7bb Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Sun, 29 Jul 2012 21:08:46 +0100 Subject: OPENPANDORA: Start event manager after log files are setup (if needed). --- backends/platform/openpandora/op-backend.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backends/platform/openpandora/op-backend.cpp b/backends/platform/openpandora/op-backend.cpp index b2d53f9fb5..354aa24b24 100644 --- a/backends/platform/openpandora/op-backend.cpp +++ b/backends/platform/openpandora/op-backend.cpp @@ -63,15 +63,6 @@ void OSystem_OP::initBackend() { assert(!_inited); - // Create the events manager - if (_eventSource == 0) - _eventSource = new OPEventSource(); - - // Create the graphics manager - if (_graphicsManager == 0) { - _graphicsManager = new OPGraphicsManager(_eventSource); - } - /* Setup default save path to be workingdir/saves */ char savePath[PATH_MAX+1]; @@ -150,6 +141,15 @@ void OSystem_OP::initBackend() { /* Make sure SDL knows that we have a joystick we want to use. */ ConfMan.setInt("joystick_num", 0); + // Create the events manager + if (_eventSource == 0) + _eventSource = new OPEventSource(); + + // Create the graphics manager + if (_graphicsManager == 0) { + _graphicsManager = new OPGraphicsManager(_eventSource); + } + /* Pass to POSIX method to do the heavy lifting */ OSystem_POSIX::initBackend(); -- cgit v1.2.3 From 53a066d09954c78d783f72690e4d523107926939 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Sun, 29 Jul 2012 21:11:32 +0100 Subject: GPH: Use SDLPluginProvider not POSIXPluginProvider. --- backends/platform/gph/gph-main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/platform/gph/gph-main.cpp b/backends/platform/gph/gph-main.cpp index 2c43af151f..876de0f358 100644 --- a/backends/platform/gph/gph-main.cpp +++ b/backends/platform/gph/gph-main.cpp @@ -21,7 +21,7 @@ */ #include "backends/platform/gph/gph.h" -#include "backends/plugins/posix/posix-provider.h" +#include "backends/plugins/sdl/sdl-provider.h" #include "base/main.h" #if defined(GPH_DEVICE) @@ -36,7 +36,7 @@ int main(int argc, char *argv[]) { ((OSystem_GPH *)g_system)->init(); #ifdef DYNAMIC_MODULES - PluginManager::instance().addPluginProvider(new POSIXPluginProvider()); + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); #endif // Invoke the actual ScummVM main entry point: -- cgit v1.2.3 From 9a0ba7124fe6faee0d4c89ca10964df18740f105 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Sun, 29 Jul 2012 21:12:25 +0100 Subject: OPENPANDORA: Cleanup. --- backends/platform/openpandora/op-sdl.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/backends/platform/openpandora/op-sdl.h b/backends/platform/openpandora/op-sdl.h index 8cccbb5f86..1eddad5c4a 100644 --- a/backends/platform/openpandora/op-sdl.h +++ b/backends/platform/openpandora/op-sdl.h @@ -31,8 +31,6 @@ #include "backends/events/openpandora/op-events.h" #include "backends/graphics/openpandora/op-graphics.h" -//#define MIXER_DOUBLE_BUFFERING 1 - #ifndef PATH_MAX #define PATH_MAX 255 #endif -- cgit v1.2.3 From dd35e72a7eefa922eba68dd28e8a18cbb98c0b16 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 19:58:20 +0200 Subject: GOB: Return proper errors in GobEngine::run() --- engines/gob/gob.cpp | 29 +++++++++++++++-------------- engines/gob/gob.h | 6 +++--- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index 3d8a18ed38..3202b5e23d 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -274,15 +274,15 @@ void GobEngine::setTrueColor(bool trueColor) { } Common::Error GobEngine::run() { - if (!initGameParts()) { - GUIErrorMessage("GobEngine::init(): Unknown version of game engine"); - return Common::kUnknownError; - } + Common::Error err; - if (!initGraphics()) { - GUIErrorMessage("GobEngine::init(): Failed to set up graphics"); - return Common::kUnknownError; - } + err = initGameParts(); + if (err.getCode() != Common::kNoError) + return err; + + err = initGraphics(); + if (err.getCode() != Common::kNoError) + return err; // On some systems it's not safe to run CD audio games from the CD. if (isCD()) @@ -392,7 +392,7 @@ void GobEngine::pauseGame() { pauseEngineIntern(false); } -bool GobEngine::initGameParts() { +Common::Error GobEngine::initGameParts() { _resourceSizeWorkaround = false; // just detect some devices some of which will be always there if the music is not disabled @@ -605,9 +605,10 @@ bool GobEngine::initGameParts() { _scenery = new Scenery_v2(this); _saveLoad = new SaveLoad_v2(this, _targetName.c_str()); break; + default: deinitGameParts(); - return false; + return Common::kUnsupportedGameidError; } // Setup mixer @@ -615,7 +616,7 @@ bool GobEngine::initGameParts() { _inter->setupOpcodes(); - return true; + return Common::kNoError; } void GobEngine::deinitGameParts() { @@ -637,10 +638,10 @@ void GobEngine::deinitGameParts() { delete _dataIO; _dataIO = 0; } -bool GobEngine::initGraphics() { +Common::Error GobEngine::initGraphics() { if (is800x600()) { warning("GobEngine::initGraphics(): 800x600 games currently unsupported"); - return false; + return Common::kUnsupportedGameidError; } else if (is640x480()) { _width = 640; _height = 480; @@ -664,7 +665,7 @@ bool GobEngine::initGraphics() { _global->_primarySurfDesc = SurfacePtr(new Surface(_width, _height, _pixelFormat.bytesPerPixel)); - return true; + return Common::kNoError; } } // End of namespace Gob diff --git a/engines/gob/gob.h b/engines/gob/gob.h index 52f3ba8f2d..d3d2bf1576 100644 --- a/engines/gob/gob.h +++ b/engines/gob/gob.h @@ -176,10 +176,10 @@ private: virtual void pauseEngineIntern(bool pause); virtual void syncSoundSettings(); - bool initGameParts(); - void deinitGameParts(); + Common::Error initGameParts(); + Common::Error initGraphics(); - bool initGraphics(); + void deinitGameParts(); public: static const Common::Language _gobToScummVMLang[]; -- cgit v1.2.3 From 2d05974b5cfef94be9e3edad02e66169a215db4c Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 29 Jun 2012 19:09:56 +0200 Subject: GOB: const correctness in SoundBlaster::playComposition() --- engines/gob/inter_bargon.cpp | 4 ++-- engines/gob/sound/sound.cpp | 2 +- engines/gob/sound/sound.h | 2 +- engines/gob/sound/soundblaster.cpp | 2 +- engines/gob/sound/soundblaster.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/gob/inter_bargon.cpp b/engines/gob/inter_bargon.cpp index 134203fa9d..029f7c697b 100644 --- a/engines/gob/inter_bargon.cpp +++ b/engines/gob/inter_bargon.cpp @@ -119,7 +119,7 @@ void Inter_Bargon::oBargon_intro2(OpGobParams ¶ms) { MouseButtons buttons; SurfacePtr surface; SoundDesc samples[4]; - int16 comp[5] = { 0, 1, 2, 3, -1 }; + static const int16 comp[5] = { 0, 1, 2, 3, -1 }; static const char *const sndFiles[] = {"1INTROII.snd", "2INTROII.snd", "1INTRO3.snd", "2INTRO3.snd"}; surface = _vm->_video->initSurfDesc(320, 200); @@ -167,8 +167,8 @@ void Inter_Bargon::oBargon_intro3(OpGobParams ¶ms) { MouseButtons buttons; Video::Color *palBak; SoundDesc samples[2]; - int16 comp[3] = { 0, 1, -1 }; byte *palettes[4]; + static const int16 comp[3] = { 0, 1, -1 }; static const char *const sndFiles[] = {"1INTROIV.snd", "2INTROIV.snd"}; static const char *const palFiles[] = {"2ou2.clt", "2ou3.clt", "2ou4.clt", "2ou5.clt"}; diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp index 403bd632a1..69a668e5fb 100644 --- a/engines/gob/sound/sound.cpp +++ b/engines/gob/sound/sound.cpp @@ -458,7 +458,7 @@ void Sound::blasterStop(int16 fadeLength, SoundDesc *sndDesc) { _blaster->stopSound(fadeLength, sndDesc); } -void Sound::blasterPlayComposition(int16 *composition, int16 freqVal, +void Sound::blasterPlayComposition(const int16 *composition, int16 freqVal, SoundDesc *sndDescs, int8 sndCount) { if (!_blaster) return; diff --git a/engines/gob/sound/sound.h b/engines/gob/sound/sound.h index 6ad0ec5483..7beffb5dc7 100644 --- a/engines/gob/sound/sound.h +++ b/engines/gob/sound/sound.h @@ -60,7 +60,7 @@ public: int16 frequency, int16 fadeLength = 0); void blasterStop(int16 fadeLength, SoundDesc *sndDesc = 0); - void blasterPlayComposition(int16 *composition, int16 freqVal, + void blasterPlayComposition(const int16 *composition, int16 freqVal, SoundDesc *sndDescs = 0, int8 sndCount = kSoundsCount); void blasterStopComposition(); void blasterRepeatComposition(int32 repCount); diff --git a/engines/gob/sound/soundblaster.cpp b/engines/gob/sound/soundblaster.cpp index 19c2346448..f267eee32d 100644 --- a/engines/gob/sound/soundblaster.cpp +++ b/engines/gob/sound/soundblaster.cpp @@ -88,7 +88,7 @@ void SoundBlaster::nextCompositionPos() { _compositionPos = -1; } -void SoundBlaster::playComposition(int16 *composition, int16 freqVal, +void SoundBlaster::playComposition(const int16 *composition, int16 freqVal, SoundDesc *sndDescs, int8 sndCount) { _compositionSamples = sndDescs; diff --git a/engines/gob/sound/soundblaster.h b/engines/gob/sound/soundblaster.h index c740ba2269..3c4968d611 100644 --- a/engines/gob/sound/soundblaster.h +++ b/engines/gob/sound/soundblaster.h @@ -41,7 +41,7 @@ public: int16 frequency, int16 fadeLength = 0); void stopSound(int16 fadeLength, SoundDesc *sndDesc = 0); - void playComposition(int16 *composition, int16 freqVal, + void playComposition(const int16 *composition, int16 freqVal, SoundDesc *sndDescs = 0, int8 sndCount = 60); void stopComposition(); void endComposition(); -- cgit v1.2.3 From 945115f09927ff2e9e7d5197524bb929f4ba5561 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 19:45:04 +0200 Subject: GOB: Don't crash when the engine wasn't fully initialized on exit --- engines/gob/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp index 0d1953322f..de0c3f2d5c 100644 --- a/engines/gob/game.cpp +++ b/engines/gob/game.cpp @@ -64,7 +64,7 @@ void Environments::clear() { // Deleting unique variables, script and resources for (uint i = 0; i < kEnvironmentCount; i++) { - if (_environments[i].variables == _vm->_inter->_variables) + if (_vm->_inter && (_environments[i].variables == _vm->_inter->_variables)) continue; if (!has(_environments[i].variables, i + 1)) -- cgit v1.2.3 From 099a76ea20fa0f8290815f988d2202b6702d589b Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 01:30:29 +0200 Subject: GOB: Don't crash when there's no _inter object --- engines/gob/draw.cpp | 6 +++--- engines/gob/gob.cpp | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp index fe59b11f76..9253a0a242 100644 --- a/engines/gob/draw.cpp +++ b/engines/gob/draw.cpp @@ -256,7 +256,7 @@ void Draw::blitInvalidated() { if (_cursorIndex == 4) blitCursor(); - if (_vm->_inter->_terminate) + if (_vm->_inter && _vm->_inter->_terminate) return; if (_noInvalidated && !_applyPal) @@ -446,7 +446,7 @@ void Draw::printTextCentered(int16 id, int16 left, int16 top, int16 right, adjustCoords(1, &left, &top); adjustCoords(1, &right, &bottom); - uint16 centerOffset = _vm->_game->_script->getFunctionOffset(TOTFile::kFunctionCenter); + uint16 centerOffset = _vm->_game->_script ? _vm->_game->_script->getFunctionOffset(TOTFile::kFunctionCenter) : 0; if (centerOffset != 0) { _vm->_game->_script->call(centerOffset); @@ -505,7 +505,7 @@ void Draw::oPlaytoons_sub_F_1B(uint16 id, int16 left, int16 top, int16 right, in adjustCoords(1, &left, &top); adjustCoords(1, &right, &bottom); - uint16 centerOffset = _vm->_game->_script->getFunctionOffset(TOTFile::kFunctionCenter); + uint16 centerOffset = _vm->_game->_script ? _vm->_game->_script->getFunctionOffset(TOTFile::kFunctionCenter) : 0; if (centerOffset != 0) { _vm->_game->_script->call(centerOffset); diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index 3202b5e23d..ef9a7112f9 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -368,11 +368,12 @@ void GobEngine::pauseEngineIntern(bool pause) { _game->_startTimeKey += duration; _draw->_cursorTimeKey += duration; - if (_inter->_soundEndTimeKey != 0) + if (_inter && (_inter->_soundEndTimeKey != 0)) _inter->_soundEndTimeKey += duration; } - _vidPlayer->pauseAll(pause); + if (_vidPlayer) + _vidPlayer->pauseAll(pause); _mixer->pauseAll(pause); } -- cgit v1.2.3 From 1cb6cc0218382bbf5fe487fd0e84d233e56592bb Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 01:31:59 +0200 Subject: GOB: Don't crash when drawPackedSprite() can't open the sprite --- engines/gob/video.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index 3b1c6423bb..f1f014cce0 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -332,6 +332,10 @@ void Video::drawPackedSprite(byte *sprBuf, int16 width, int16 height, void Video::drawPackedSprite(const char *path, Surface &dest, int width) { int32 size; byte *data = _vm->_dataIO->getFile(path, size); + if (!data) { + warning("Video::drawPackedSprite(): Failed to open sprite \"%s\"", path); + return; + } drawPackedSprite(data, width, dest.getHeight(), 0, 0, 0, dest); delete[] data; -- cgit v1.2.3 From b5fa752b78c63bedcb53d38fb11244b7e99f9941 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 17:37:58 +0200 Subject: GOB: Keep the mouse responsive while waiting for the frame to end --- engines/gob/minigames/geisha/penetration.cpp | 2 +- engines/gob/util.cpp | 20 ++++++++++++++------ engines/gob/util.h | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/engines/gob/minigames/geisha/penetration.cpp b/engines/gob/minigames/geisha/penetration.cpp index 3be9f1f651..05695e5dbb 100644 --- a/engines/gob/minigames/geisha/penetration.cpp +++ b/engines/gob/minigames/geisha/penetration.cpp @@ -505,7 +505,7 @@ bool Penetration::play(bool hasAccessPass, bool hasMaxEnergy, bool testMode) { // Draw, fade in if necessary and wait for the end of the frame _vm->_draw->blitInvalidated(); fadeIn(); - _vm->_util->waitEndFrame(); + _vm->_util->waitEndFrame(false); // Handle the input checkInput(); diff --git a/engines/gob/util.cpp b/engines/gob/util.cpp index 64dfcf9b12..5d6ae78872 100644 --- a/engines/gob/util.cpp +++ b/engines/gob/util.cpp @@ -367,21 +367,29 @@ void Util::notifyNewAnim() { _startFrameTime = getTimeKey(); } -void Util::waitEndFrame() { +void Util::waitEndFrame(bool handleInput) { int32 time; - _vm->_video->waitRetrace(); - time = getTimeKey() - _startFrameTime; if ((time > 1000) || (time < 0)) { + _vm->_video->retrace(); _startFrameTime = getTimeKey(); return; } - int32 toWait = _frameWaitTime - time; + int32 toWait = 0; + do { + if (toWait > 0) + delay(MIN(toWait, 10)); + + if (handleInput) + processInput(); + + _vm->_video->retrace(); - if (toWait > 0) - delay(toWait); + time = getTimeKey() - _startFrameTime; + toWait = _frameWaitTime - time; + } while (toWait > 0); _startFrameTime = getTimeKey(); } diff --git a/engines/gob/util.h b/engines/gob/util.h index b26a78ab2c..30bff72325 100644 --- a/engines/gob/util.h +++ b/engines/gob/util.h @@ -124,7 +124,7 @@ public: int16 getFrameRate(); void setFrameRate(int16 rate); void notifyNewAnim(); - void waitEndFrame(); + void waitEndFrame(bool handleInput = true); void setScrollOffset(int16 x = -1, int16 y = -1); static void insertStr(const char *str1, char *str2, int16 pos); -- cgit v1.2.3 From 00fa997039525eeeacc34734e9a12e53f7b847dd Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 30 Jun 2012 01:46:24 +0200 Subject: GOB: Move drawString into Font --- engines/gob/draw.cpp | 15 ---------- engines/gob/draw.h | 2 -- engines/gob/draw_fascin.cpp | 4 +-- engines/gob/draw_playtoons.cpp | 4 +-- engines/gob/draw_v2.cpp | 4 +-- engines/gob/inter_v5.cpp | 10 +++---- engines/gob/minigames/geisha/penetration.cpp | 45 +++++++++++----------------- engines/gob/video.cpp | 17 +++++++++++ engines/gob/video.h | 3 ++ 9 files changed, 49 insertions(+), 55 deletions(-) diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp index 9253a0a242..3932987e0a 100644 --- a/engines/gob/draw.cpp +++ b/engines/gob/draw.cpp @@ -425,21 +425,6 @@ int Draw::stringLength(const char *str, uint16 fontIndex) { return len; } -void Draw::drawString(const char *str, int16 x, int16 y, int16 color1, int16 color2, - int16 transp, Surface &dest, const Font &font) { - - while (*str != '\0') { - const int16 charRight = x + font.getCharWidth(*str); - const int16 charBottom = y + font.getCharHeight(); - - if ((charRight <= dest.getWidth()) && (charBottom <= dest.getHeight())) - font.drawLetter(dest, *str, x, y, color1, color2, transp); - - x += font.getCharWidth(*str); - str++; - } -} - void Draw::printTextCentered(int16 id, int16 left, int16 top, int16 right, int16 bottom, const char *str, int16 fontIndex, int16 color) { diff --git a/engines/gob/draw.h b/engines/gob/draw.h index e7af1f9af3..b51c6466e0 100644 --- a/engines/gob/draw.h +++ b/engines/gob/draw.h @@ -194,8 +194,6 @@ public: adjustCoords(adjust, (int16 *)coord1, (int16 *)coord2); } int stringLength(const char *str, uint16 fontIndex); - void drawString(const char *str, int16 x, int16 y, int16 color1, int16 color2, - int16 transp, Surface &dest, const Font &font); void printTextCentered(int16 id, int16 left, int16 top, int16 right, int16 bottom, const char *str, int16 fontIndex, int16 color); void oPlaytoons_sub_F_1B( uint16 id, int16 left, int16 top, int16 right, int16 bottom, char *paramStr, int16 var3, int16 var4, int16 shortId); diff --git a/engines/gob/draw_fascin.cpp b/engines/gob/draw_fascin.cpp index 54cd52b660..12009d7ee5 100644 --- a/engines/gob/draw_fascin.cpp +++ b/engines/gob/draw_fascin.cpp @@ -222,8 +222,8 @@ void Draw_Fascination::spriteOperation(int16 operation) { _destSpriteX, _destSpriteY, _frontColor, _backColor, _transparency); } } else { - drawString(_textToPrint, _destSpriteX, _destSpriteY, _frontColor, - _backColor, _transparency, *_spritesArray[_destSurface], *font); + font->drawString(_textToPrint, _destSpriteX, _destSpriteY, _frontColor, + _backColor, _transparency, *_spritesArray[_destSurface]); _destSpriteX += len * font->getCharWidth(); } } else { diff --git a/engines/gob/draw_playtoons.cpp b/engines/gob/draw_playtoons.cpp index a443f81ccf..76e2ae591c 100644 --- a/engines/gob/draw_playtoons.cpp +++ b/engines/gob/draw_playtoons.cpp @@ -283,8 +283,8 @@ void Draw_Playtoons::spriteOperation(int16 operation) { _destSpriteX, _destSpriteY, _frontColor, _backColor, _transparency); } } else { - drawString(_textToPrint, _destSpriteX, _destSpriteY, _frontColor, - _backColor, _transparency, *_spritesArray[_destSurface], *font); + font->drawString(_textToPrint, _destSpriteX, _destSpriteY, _frontColor, + _backColor, _transparency, *_spritesArray[_destSurface]); _destSpriteX += len * font->getCharWidth(); } } else { diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index b637ecbd2b..ac43c7b86a 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -831,8 +831,8 @@ void Draw_v2::spriteOperation(int16 operation) { getColor(_backColor), _transparency); } } else { - drawString(_textToPrint, _destSpriteX, _destSpriteY, getColor(_frontColor), - getColor(_backColor), _transparency, *_spritesArray[_destSurface], *font); + font->drawString(_textToPrint, _destSpriteX, _destSpriteY, getColor(_frontColor), + getColor(_backColor), _transparency, *_spritesArray[_destSurface]); _destSpriteX += len * font->getCharWidth(); } } else { diff --git a/engines/gob/inter_v5.cpp b/engines/gob/inter_v5.cpp index c0e8978afd..24905b08d1 100644 --- a/engines/gob/inter_v5.cpp +++ b/engines/gob/inter_v5.cpp @@ -281,7 +281,7 @@ void Inter_v5::o5_getSystemCDSpeed(OpGobParams ¶ms) { Font *font; if ((font = _vm->_draw->loadFont("SPEED.LET"))) { - _vm->_draw->drawString("100 %", 402, 89, 112, 144, 0, *_vm->_draw->_backSurface, *font); + font->drawString("100 %", 402, 89, 112, 144, 0, *_vm->_draw->_backSurface); _vm->_draw->forceBlit(); delete font; @@ -293,7 +293,7 @@ void Inter_v5::o5_getSystemRAM(OpGobParams ¶ms) { Font *font; if ((font = _vm->_draw->loadFont("SPEED.LET"))) { - _vm->_draw->drawString("100 %", 402, 168, 112, 144, 0, *_vm->_draw->_backSurface, *font); + font->drawString("100 %", 402, 168, 112, 144, 0, *_vm->_draw->_backSurface); _vm->_draw->forceBlit(); delete font; @@ -305,7 +305,7 @@ void Inter_v5::o5_getSystemCPUSpeed(OpGobParams ¶ms) { Font *font; if ((font = _vm->_draw->loadFont("SPEED.LET"))) { - _vm->_draw->drawString("100 %", 402, 248, 112, 144, 0, *_vm->_draw->_backSurface, *font); + font->drawString("100 %", 402, 248, 112, 144, 0, *_vm->_draw->_backSurface); _vm->_draw->forceBlit(); delete font; @@ -317,7 +317,7 @@ void Inter_v5::o5_getSystemDrawSpeed(OpGobParams ¶ms) { Font *font; if ((font = _vm->_draw->loadFont("SPEED.LET"))) { - _vm->_draw->drawString("100 %", 402, 326, 112, 144, 0, *_vm->_draw->_backSurface, *font); + font->drawString("100 %", 402, 326, 112, 144, 0, *_vm->_draw->_backSurface); _vm->_draw->forceBlit(); delete font; @@ -329,7 +329,7 @@ void Inter_v5::o5_totalSystemSpecs(OpGobParams ¶ms) { Font *font; if ((font = _vm->_draw->loadFont("SPEED.LET"))) { - _vm->_draw->drawString("100 %", 402, 405, 112, 144, 0, *_vm->_draw->_backSurface, *font); + font->drawString("100 %", 402, 405, 112, 144, 0, *_vm->_draw->_backSurface); _vm->_draw->forceBlit(); delete font; diff --git a/engines/gob/minigames/geisha/penetration.cpp b/engines/gob/minigames/geisha/penetration.cpp index 05695e5dbb..c8c4f2bba7 100644 --- a/engines/gob/minigames/geisha/penetration.cpp +++ b/engines/gob/minigames/geisha/penetration.cpp @@ -778,29 +778,24 @@ void Penetration::drawFloorText() { else if (_floor == 2) floorString = strings[kString1stBasement]; + Surface &surface = *_vm->_draw->_backSurface; + if (floorString) - _vm->_draw->drawString(floorString, 10, 15, kColorFloorText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); + font->drawString(floorString, 10, 15, kColorFloorText, kColorBlack, 1, surface); if (_exits.size() > 0) { int exitCount = kString2Exits; if (_exits.size() == 1) exitCount = kString1Exit; - _vm->_draw->drawString(strings[kStringYouHave] , 10, 38, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - _vm->_draw->drawString(strings[exitCount] , 10, 53, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - _vm->_draw->drawString(strings[kStringToReach] , 10, 68, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - _vm->_draw->drawString(strings[kStringUpperLevel1], 10, 84, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - _vm->_draw->drawString(strings[kStringUpperLevel2], 10, 98, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); + font->drawString(strings[kStringYouHave] , 10, 38, kColorExitText, kColorBlack, 1, surface); + font->drawString(strings[exitCount] , 10, 53, kColorExitText, kColorBlack, 1, surface); + font->drawString(strings[kStringToReach] , 10, 68, kColorExitText, kColorBlack, 1, surface); + font->drawString(strings[kStringUpperLevel1], 10, 84, kColorExitText, kColorBlack, 1, surface); + font->drawString(strings[kStringUpperLevel2], 10, 98, kColorExitText, kColorBlack, 1, surface); } else - _vm->_draw->drawString(strings[kStringNoExit], 10, 53, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); + font->drawString(strings[kStringNoExit], 10, 53, kColorExitText, kColorBlack, 1, surface); } void Penetration::drawEndText() { @@ -814,21 +809,17 @@ void Penetration::drawEndText() { if (!font) return; + Surface &surface = *_vm->_draw->_backSurface; + const char **strings = kStrings[getLanguage()]; - _vm->_draw->drawString(strings[kStringLevel0] , 11, 21, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - _vm->_draw->drawString(strings[kStringPenetration], 11, 42, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - _vm->_draw->drawString(strings[kStringSuccessful] , 11, 58, kColorExitText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - - _vm->_draw->drawString(strings[kStringDanger] , 11, 82, kColorFloorText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - _vm->_draw->drawString(strings[kStringGynoides] , 11, 98, kColorFloorText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); - _vm->_draw->drawString(strings[kStringActivated], 11, 113, kColorFloorText, kColorBlack, 1, - *_vm->_draw->_backSurface, *font); + font->drawString(strings[kStringLevel0] , 11, 21, kColorExitText, kColorBlack, 1, surface); + font->drawString(strings[kStringPenetration], 11, 42, kColorExitText, kColorBlack, 1, surface); + font->drawString(strings[kStringSuccessful] , 11, 58, kColorExitText, kColorBlack, 1, surface); + + font->drawString(strings[kStringDanger] , 11, 82, kColorFloorText, kColorBlack, 1, surface); + font->drawString(strings[kStringGynoides] , 11, 98, kColorFloorText, kColorBlack, 1, surface); + font->drawString(strings[kStringActivated], 11, 113, kColorFloorText, kColorBlack, 1, surface); _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, kTextAreaLeft, kTextAreaTop, kTextAreaRight, kTextAreaBigBottom); _vm->_draw->blitInvalidated(); diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index f1f014cce0..8bcf14e040 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -134,6 +134,23 @@ void Font::drawLetter(Surface &surf, uint8 c, uint16 x, uint16 y, } } +void Font::drawString(const Common::String &str, int16 x, int16 y, int16 color1, int16 color2, + bool transp, Surface &dest) const { + + const char *s = str.c_str(); + + while (*s != '\0') { + const int16 charRight = x + getCharWidth(*s); + const int16 charBottom = y + getCharHeight(); + + if ((x >= 0) && (y >= 0) && (charRight <= dest.getWidth()) && (charBottom <= dest.getHeight())) + drawLetter(dest, *s, x, y, color1, color2, transp); + + x += getCharWidth(*s); + s++; + } +} + const byte *Font::getCharData(uint8 c) const { if (_endItem == 0) { warning("Font::getCharData(): _endItem == 0"); diff --git a/engines/gob/video.h b/engines/gob/video.h index ecbb579c5f..a8c1480a6b 100644 --- a/engines/gob/video.h +++ b/engines/gob/video.h @@ -46,6 +46,9 @@ public: void drawLetter(Surface &surf, uint8 c, uint16 x, uint16 y, uint32 color1, uint32 color2, bool transp) const; + void drawString(const Common::String &str, int16 x, int16 y, int16 color1, int16 color2, + bool transp, Surface &dest) const; + private: const byte *_dataPtr; const byte *_data; -- cgit v1.2.3 From bba2028fbaa1c2b3b2b89badd6bf8f36cbbe1cc1 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 19:11:28 +0200 Subject: GOB: Move the method definitions out of the GobMetaEngine class definition --- engines/gob/detection/detection.cpp | 71 ++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/engines/gob/detection/detection.cpp b/engines/gob/detection/detection.cpp index 14da54637b..8b4fab4409 100644 --- a/engines/gob/detection/detection.cpp +++ b/engines/gob/detection/detection.cpp @@ -30,43 +30,51 @@ class GobMetaEngine : public AdvancedMetaEngine { public: - GobMetaEngine() : AdvancedMetaEngine(Gob::gameDescriptions, sizeof(Gob::GOBGameDescription), gobGames) { - _singleid = "gob"; - _guioptions = GUIO1(GUIO_NOLAUNCHLOAD); - } - - virtual GameDescriptor findGame(const char *gameid) const { - return Engines::findGameID(gameid, _gameids, obsoleteGameIDsTable); - } + GobMetaEngine(); - virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { - ADFilePropertiesMap filesProps; + virtual GameDescriptor findGame(const char *gameid) const; - const ADGameDescription *game = detectGameFilebased(allFiles, fslist, Gob::fileBased, &filesProps); - if (!game) - return 0; + virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const; - reportUnknown(fslist.begin()->getParent(), filesProps); - return game; - } - - virtual const char *getName() const { - return "Gob"; - } - - virtual const char *getOriginalCopyright() const { - return "Goblins Games (C) Coktel Vision"; - } + virtual const char *getName() const; + virtual const char *getOriginalCopyright() const; virtual bool hasFeature(MetaEngineFeature f) const; - virtual Common::Error createInstance(OSystem *syst, Engine **engine) const { - Engines::upgradeTargetIfNecessary(obsoleteGameIDsTable); - return AdvancedMetaEngine::createInstance(syst, engine); - } + virtual Common::Error createInstance(OSystem *syst, Engine **engine) const; virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; }; +GobMetaEngine::GobMetaEngine() : + AdvancedMetaEngine(Gob::gameDescriptions, sizeof(Gob::GOBGameDescription), gobGames) { + + _singleid = "gob"; + _guioptions = GUIO1(GUIO_NOLAUNCHLOAD); +} + +GameDescriptor GobMetaEngine::findGame(const char *gameid) const { + return Engines::findGameID(gameid, _gameids, obsoleteGameIDsTable); +} + +const ADGameDescription *GobMetaEngine::fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { + ADFilePropertiesMap filesProps; + + const ADGameDescription *game = detectGameFilebased(allFiles, fslist, Gob::fileBased, &filesProps); + if (!game) + return 0; + + reportUnknown(fslist.begin()->getParent(), filesProps); + return game; +} + +const char *GobMetaEngine::getName() const { + return "Gob"; +} + +const char *GobMetaEngine::getOriginalCopyright() const { + return "Goblins Games (C) Coktel Vision"; +} + bool GobMetaEngine::hasFeature(MetaEngineFeature f) const { return false; } @@ -75,6 +83,12 @@ bool Gob::GobEngine::hasFeature(EngineFeature f) const { return (f == kSupportsRTL); } + +Common::Error GobMetaEngine::createInstance(OSystem *syst, Engine **engine) const { + Engines::upgradeTargetIfNecessary(obsoleteGameIDsTable); + return AdvancedMetaEngine::createInstance(syst, engine); +} + bool GobMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { const Gob::GOBGameDescription *gd = (const Gob::GOBGameDescription *)desc; if (gd) { @@ -84,6 +98,7 @@ bool GobMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameD return gd != 0; } + #if PLUGIN_ENABLED_DYNAMIC(GOB) REGISTER_PLUGIN_DYNAMIC(GOB, PLUGIN_TYPE_ENGINE, GobMetaEngine); #else -- cgit v1.2.3 From 4a380ce668c45e5eaba1cdba9406d0c7fe7f3635 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 24 Jun 2012 21:36:58 +0200 Subject: GOB: Add detection tables for Baba Yaga and Abracadabra --- engines/gob/detection/tables.h | 4 + engines/gob/detection/tables_ajworld.h | 1 - engines/gob/detection/tables_fallback.h | 25 +- engines/gob/detection/tables_onceupon.h | 518 ++++++++++++++++++++++++++++++++ engines/gob/gob.h | 3 + 5 files changed, 545 insertions(+), 6 deletions(-) create mode 100644 engines/gob/detection/tables_onceupon.h diff --git a/engines/gob/detection/tables.h b/engines/gob/detection/tables.h index 5d211ac7d8..271f75af79 100644 --- a/engines/gob/detection/tables.h +++ b/engines/gob/detection/tables.h @@ -48,7 +48,10 @@ static const PlainGameDescriptor gobGames[] = { {"gob2cd", "Gobliins 2 CD"}, {"ween", "Ween: The Prophecy"}, {"bargon", "Bargon Attack"}, + {"babayaga", "Once Upon A Time: Baba Yaga"}, + {"abracadabra", "Once Upon A Time: Abracadabra"}, {"littlered", "Once Upon A Time: Little Red Riding Hood"}, + {"onceupon", "Once Upon A Time"}, {"ajworld", "A.J.'s World of Discovery"}, {"gob3", "Goblins Quest 3"}, {"gob3cd", "Goblins Quest 3 CD"}, @@ -94,6 +97,7 @@ static const GOBGameDescription gameDescriptions[] = { #include "gob/detection/tables_ween.h" // Ween: The Prophecy #include "gob/detection/tables_bargon.h" // Bargon Attack #include "gob/detection/tables_littlered.h" // Once Upon A Time: Little Red Riding Hood + #include "gob/detection/tables_onceupon.h" // Once Upon A Time: Baba Yaga and Abracadabra #include "gob/detection/tables_lit.h" // Lost in Time #include "gob/detection/tables_fascin.h" // Fascination #include "gob/detection/tables_geisha.h" // Geisha diff --git a/engines/gob/detection/tables_ajworld.h b/engines/gob/detection/tables_ajworld.h index c78d11a6ad..d86bdb16be 100644 --- a/engines/gob/detection/tables_ajworld.h +++ b/engines/gob/detection/tables_ajworld.h @@ -1,4 +1,3 @@ - /* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names diff --git a/engines/gob/detection/tables_fallback.h b/engines/gob/detection/tables_fallback.h index 2853ee7b4f..0e0aa92ae1 100644 --- a/engines/gob/detection/tables_fallback.h +++ b/engines/gob/detection/tables_fallback.h @@ -361,6 +361,20 @@ static const GOBGameDescription fallbackDescs[] = { 0, 0, 0 }, { //24 + { + "onceupon", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformUnknown, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeOnceUponATime, + kFeaturesEGA, + 0, 0, 0 + }, + { //25 { "adi2", "", @@ -374,7 +388,7 @@ static const GOBGameDescription fallbackDescs[] = { kFeatures640x480, "adi2.stk", 0, 0 }, - { //25 + { //26 { "adi4", "", @@ -388,7 +402,7 @@ static const GOBGameDescription fallbackDescs[] = { kFeatures640x480, "adif41.stk", 0, 0 }, - { //26 + { //27 { "coktelplayer", "unknown", @@ -430,9 +444,10 @@ static const ADFileBasedFallback fileBased[] = { { &fallbackDescs[21].desc, { "disk1.stk", "disk2.stk", "disk3.stk", 0 } }, { &fallbackDescs[22].desc, { "intro.stk", "stk2.stk", "stk3.stk", 0 } }, { &fallbackDescs[23].desc, { "intro.stk", "stk2.stk", "stk3.stk", "mod.babayaga", 0 } }, - { &fallbackDescs[24].desc, { "adi2.stk", 0 } }, - { &fallbackDescs[25].desc, { "adif41.stk", "adim41.stk", 0 } }, - { &fallbackDescs[26].desc, { "coktelplayer.scn", 0 } }, + { &fallbackDescs[24].desc, { "stk1.stk", "stk2.stk", "stk3.stk", 0 } }, + { &fallbackDescs[25].desc, { "adi2.stk", 0 } }, + { &fallbackDescs[26].desc, { "adif41.stk", "adim41.stk", 0 } }, + { &fallbackDescs[27].desc, { "coktelplayer.scn", 0 } }, { 0, { 0 } } }; diff --git a/engines/gob/detection/tables_onceupon.h b/engines/gob/detection/tables_onceupon.h new file mode 100644 index 0000000000..366024d43c --- /dev/null +++ b/engines/gob/detection/tables_onceupon.h @@ -0,0 +1,518 @@ +/* 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. + * + */ + +/* Detection tables for Once Upon A Time: Baba Yaga and Abracadabra. */ + +#ifndef GOB_DETECTION_TABLES_ONCEUPON_H +#define GOB_DETECTION_TABLES_ONCEUPON_H + +// -- Once Upon A Time: Abracadabra, Amiga -- + +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "e4b21818af03930dc9cab2ad4c93cb5b", 362106}, + {"stk3.stk", 0, "76874ad92782f9b2de57beafc05ec877", 353482}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "e4b21818af03930dc9cab2ad4c93cb5b", 362106}, + {"stk3.stk", 0, "76874ad92782f9b2de57beafc05ec877", 353482}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "e4b21818af03930dc9cab2ad4c93cb5b", 362106}, + {"stk3.stk", 0, "76874ad92782f9b2de57beafc05ec877", 353482}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "e4b21818af03930dc9cab2ad4c93cb5b", 362106}, + {"stk3.stk", 0, "76874ad92782f9b2de57beafc05ec877", 353482}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "e4b21818af03930dc9cab2ad4c93cb5b", 362106}, + {"stk3.stk", 0, "76874ad92782f9b2de57beafc05ec877", 353482}, + {0, 0, 0, 0} + }, + ES_ESP, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, + +// -- Once Upon A Time: Abracadabra, Atari ST -- + +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "c6440aaf068ec3149ae89bc5c41ebf02", 362123}, + {"stk3.stk", 0, "5af3c1202ba6fcf8dad2b2125e1c1383", 353257}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "c6440aaf068ec3149ae89bc5c41ebf02", 362123}, + {"stk3.stk", 0, "5af3c1202ba6fcf8dad2b2125e1c1383", 353257}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "c6440aaf068ec3149ae89bc5c41ebf02", 362123}, + {"stk3.stk", 0, "5af3c1202ba6fcf8dad2b2125e1c1383", 353257}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "c6440aaf068ec3149ae89bc5c41ebf02", 362123}, + {"stk3.stk", 0, "5af3c1202ba6fcf8dad2b2125e1c1383", 353257}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "abracadabra", + "", + { + {"stk1.stk", 0, "a8e963eea170155548e5bc1d0f07d50d", 209806}, + {"stk2.stk", 0, "c6440aaf068ec3149ae89bc5c41ebf02", 362123}, + {"stk3.stk", 0, "5af3c1202ba6fcf8dad2b2125e1c1383", 353257}, + {0, 0, 0, 0} + }, + ES_ESP, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 +}, + +// -- Once Upon A Time: Baba Yaga, DOS EGA Floppy -- + +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "3c777f43e6fb49fde9222543447e135a", 204813}, + {"stk2.stk", 0, "6cf0b009dd185a8f589e91a1f9c33df5", 361582}, + {"stk3.stk", 0, "6473183ca4db1b5b5cea047f9af59a26", 328925}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "3c777f43e6fb49fde9222543447e135a", 204813}, + {"stk2.stk", 0, "6cf0b009dd185a8f589e91a1f9c33df5", 361582}, + {"stk3.stk", 0, "6473183ca4db1b5b5cea047f9af59a26", 328925}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "3c777f43e6fb49fde9222543447e135a", 204813}, + {"stk2.stk", 0, "6cf0b009dd185a8f589e91a1f9c33df5", 361582}, + {"stk3.stk", 0, "6473183ca4db1b5b5cea047f9af59a26", 328925}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "3c777f43e6fb49fde9222543447e135a", 204813}, + {"stk2.stk", 0, "6cf0b009dd185a8f589e91a1f9c33df5", 361582}, + {"stk3.stk", 0, "6473183ca4db1b5b5cea047f9af59a26", 328925}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "3c777f43e6fb49fde9222543447e135a", 204813}, + {"stk2.stk", 0, "6cf0b009dd185a8f589e91a1f9c33df5", 361582}, + {"stk3.stk", 0, "6473183ca4db1b5b5cea047f9af59a26", 328925}, + {0, 0, 0, 0} + }, + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 +}, + +// -- Once Upon A Time: Baba Yaga, Amiga -- + +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "bcc823d2888057031e54716ed1b3c80e", 205090}, + {"stk2.stk", 0, "f76bf7c2ff60d816d69962d1a593207c", 362122}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "bcc823d2888057031e54716ed1b3c80e", 205090}, + {"stk2.stk", 0, "f76bf7c2ff60d816d69962d1a593207c", 362122}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "bcc823d2888057031e54716ed1b3c80e", 205090}, + {"stk2.stk", 0, "f76bf7c2ff60d816d69962d1a593207c", 362122}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "bcc823d2888057031e54716ed1b3c80e", 205090}, + {"stk2.stk", 0, "f76bf7c2ff60d816d69962d1a593207c", 362122}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "bcc823d2888057031e54716ed1b3c80e", 205090}, + {"stk2.stk", 0, "f76bf7c2ff60d816d69962d1a593207c", 362122}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + ES_ESP, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, + +// -- Once Upon A Time: Baba Yaga, Atari ST -- + +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "17a4e3e7a18cc97231c92d280c7878a1", 205095}, + {"stk2.stk", 0, "bfbc380e5461f63af28e9e6b10f334b5", 362128}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "17a4e3e7a18cc97231c92d280c7878a1", 205095}, + {"stk2.stk", 0, "bfbc380e5461f63af28e9e6b10f334b5", 362128}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "17a4e3e7a18cc97231c92d280c7878a1", 205095}, + {"stk2.stk", 0, "bfbc380e5461f63af28e9e6b10f334b5", 362128}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "17a4e3e7a18cc97231c92d280c7878a1", 205095}, + {"stk2.stk", 0, "bfbc380e5461f63af28e9e6b10f334b5", 362128}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, +{ + { + "babayaga", + "", + { + {"stk1.stk", 0, "17a4e3e7a18cc97231c92d280c7878a1", 205095}, + {"stk2.stk", 0, "bfbc380e5461f63af28e9e6b10f334b5", 362128}, + {"stk3.stk", 0, "6227d1aefdf39d88dcf83e38bea2a9af", 328922}, + {0, 0, 0, 0} + }, + ES_ESP, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 +}, + +#endif // GOB_DETECTION_TABLES_ONCEUPON_H diff --git a/engines/gob/gob.h b/engines/gob/gob.h index d3d2bf1576..5d4c3d7c55 100644 --- a/engines/gob/gob.h +++ b/engines/gob/gob.h @@ -129,7 +129,10 @@ enum GameType { kGameTypeAdi4, kGameTypeAdibou2, kGameTypeAdibou1, + kGameTypeAbracadabra, + kGameTypeBabaYaga, kGameTypeLittleRed, + kGameTypeOnceUponATime, // Need more inspection to see if Baba Yaga or Abracadabra kGameTypeAJWorld }; -- cgit v1.2.3 From 55c75756ea3c38cdd7074caff7085e35a658c9e7 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Wed, 27 Jun 2012 20:48:39 +0200 Subject: GOB: Add a more complex detection for Once Upon A Time titles The hard-coded Once Upon A Time titles, Abracadabra and Baba Yaga, are impossible to distinguish by file name alone. The same is true for the each three platforms, DOS, Amiga and Atari ST. We do need to know exactly which game and platform a specific path holds, though, because they're a) completely hard-coded b) the data files have platform-specific endianness Therefore, when the filename-based fallback detector finds one of those games, we open the archives and look inside them. We detect the specific game by looking at which animal names are present; and the platform by inspecting the endianness of the title screen's DEC file, in addition to the existence of a MOD file to distinguish the Atari ST from the Amiga version. --- engines/gob/detection/detection.cpp | 95 ++++++++++++++++++++++++++- engines/gob/detection/tables_fallback.h | 110 ++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+), 2 deletions(-) diff --git a/engines/gob/detection/detection.cpp b/engines/gob/detection/detection.cpp index 8b4fab4409..8fb0052a5b 100644 --- a/engines/gob/detection/detection.cpp +++ b/engines/gob/detection/detection.cpp @@ -25,6 +25,7 @@ #include "engines/obsolete.h" #include "gob/gob.h" +#include "gob/dataio.h" #include "gob/detection/tables.h" @@ -43,6 +44,12 @@ public: virtual Common::Error createInstance(OSystem *syst, Engine **engine) const; virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; + +private: + /** + * Inspect the game archives to detect which Once Upon A Time game this is. + */ + static const Gob::GOBGameDescription *detectOnceUponATime(const Common::FSList &fslist); }; GobMetaEngine::GobMetaEngine() : @@ -59,12 +66,96 @@ GameDescriptor GobMetaEngine::findGame(const char *gameid) const { const ADGameDescription *GobMetaEngine::fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const { ADFilePropertiesMap filesProps; - const ADGameDescription *game = detectGameFilebased(allFiles, fslist, Gob::fileBased, &filesProps); + const Gob::GOBGameDescription *game; + game = (const Gob::GOBGameDescription *)detectGameFilebased(allFiles, fslist, Gob::fileBased, &filesProps); if (!game) return 0; + if (game->gameType == Gob::kGameTypeOnceUponATime) { + game = detectOnceUponATime(fslist); + if (!game) + return 0; + } + reportUnknown(fslist.begin()->getParent(), filesProps); - return game; + return (const ADGameDescription *)game; +} + +const Gob::GOBGameDescription *GobMetaEngine::detectOnceUponATime(const Common::FSList &fslist) { + // Add the game path to the search manager + SearchMan.clear(); + SearchMan.addDirectory(fslist.begin()->getParent().getPath(), fslist.begin()->getParent()); + + // Open the archives + Gob::DataIO dataIO; + if (!dataIO.openArchive("stk1.stk", true) || + !dataIO.openArchive("stk2.stk", true) || + !dataIO.openArchive("stk3.stk", true)) { + + SearchMan.clear(); + return 0; + } + + Gob::OnceUponATime gameType = Gob::kOnceUponATimeInvalid; + Gob::OnceUponATimePlatform platform = Gob::kOnceUponATimePlatformInvalid; + + // If these animal files are present, it's Abracadabra + if (dataIO.hasFile("arai.anm") && + dataIO.hasFile("crab.anm") && + dataIO.hasFile("crap.anm") && + dataIO.hasFile("drag.anm") && + dataIO.hasFile("guep.anm") && + dataIO.hasFile("loup.anm") && + dataIO.hasFile("mous.anm") && + dataIO.hasFile("rhin.anm") && + dataIO.hasFile("saut.anm") && + dataIO.hasFile("scor.anm")) + gameType = Gob::kOnceUponATimeAbracadabra; + + // If these animal files are present, it's Baba Yaga + if (dataIO.hasFile("abei.anm") && + dataIO.hasFile("arai.anm") && + dataIO.hasFile("drag.anm") && + dataIO.hasFile("fauc.anm") && + dataIO.hasFile("gren.anm") && + dataIO.hasFile("rena.anm") && + dataIO.hasFile("sang.anm") && + dataIO.hasFile("serp.anm") && + dataIO.hasFile("tort.anm") && + dataIO.hasFile("vaut.anm")) + gameType = Gob::kOnceUponATimeBabaYaga; + + // Detect the platform by endianness and existence of a MOD file + Common::SeekableReadStream *villeDEC = dataIO.getFile("ville.dec"); + if (villeDEC && (villeDEC->size() > 6)) { + byte data[6]; + + if (villeDEC->read(data, 6) == 6) { + if (!memcmp(data, "\000\000\000\001\000\007", 6)) { + // Big endian -> Amiga or Atari ST + + if (dataIO.hasFile("mod.babayaga")) + platform = Gob::kOnceUponATimePlatformAmiga; + else + platform = Gob::kOnceUponATimePlatformAtariST; + + } else if (!memcmp(data, "\000\000\001\000\007\000", 6)) + // Little endian -> DOS + platform = Gob::kOnceUponATimePlatformDOS; + } + + delete villeDEC; + } + + SearchMan.clear(); + + if ((gameType == Gob::kOnceUponATimeInvalid) || (platform == Gob::kOnceUponATimePlatformInvalid)) { + warning("GobMetaEngine::detectOnceUponATime(): Detection failed (%d, %d)", + (int) gameType, (int) platform); + return 0; + } + + return &Gob::fallbackOnceUpon[gameType][platform]; } const char *GobMetaEngine::getName() const { diff --git a/engines/gob/detection/tables_fallback.h b/engines/gob/detection/tables_fallback.h index 0e0aa92ae1..05f579c08c 100644 --- a/engines/gob/detection/tables_fallback.h +++ b/engines/gob/detection/tables_fallback.h @@ -23,6 +23,8 @@ #ifndef GOB_DETECTION_TABLES_FALLBACK_H #define GOB_DETECTION_TABLES_FALLBACK_H +// -- Tables for the filename-based fallback -- + static const GOBGameDescription fallbackDescs[] = { { //0 { @@ -451,4 +453,112 @@ static const ADFileBasedFallback fileBased[] = { { 0, { 0 } } }; +// -- Tables for detecting the specific Once Upon A Time game -- + +enum OnceUponATime { + kOnceUponATimeInvalid = -1, + kOnceUponATimeAbracadabra = 0, + kOnceUponATimeBabaYaga = 1, + kOnceUponATimeMAX +}; + +enum OnceUponATimePlatform { + kOnceUponATimePlatformInvalid = -1, + kOnceUponATimePlatformDOS = 0, + kOnceUponATimePlatformAmiga = 1, + kOnceUponATimePlatformAtariST = 2, + kOnceUponATimePlatformMAX +}; + +static const GOBGameDescription fallbackOnceUpon[kOnceUponATimeMAX][kOnceUponATimePlatformMAX] = { + { // kOnceUponATimeAbracadabra + { // kOnceUponATimePlatformDOS + { + "abracadabra", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { // kOnceUponATimePlatformAmiga + { + "abracadabra", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 + }, + { // kOnceUponATimePlatformAtariST + { + "abracadabra", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeAbracadabra, + kFeaturesEGA, + 0, 0, 0 + } + }, + { // kOnceUponATimeBabaYaga + { // kOnceUponATimePlatformDOS + { + "babayaga", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { // kOnceUponATimePlatformAmiga + { + "babayaga", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 + }, + { // kOnceUponATimePlatformAtariST + { + "babayaga", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeBabaYaga, + kFeaturesEGA, + 0, 0, 0 + } + } +}; + #endif // GOB_DETECTION_TABLES_FALLBACK_H -- cgit v1.2.3 From 4819468d9ad8218d04a2e4563ef71d7d00964515 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 00:07:29 +0200 Subject: GOB: Add PreGob stubs for the Once Upon A Time games --- engines/gob/gob.cpp | 33 ++++++++++++++++++++-- engines/gob/gob.h | 2 ++ engines/gob/init.cpp | 14 ++++++++- engines/gob/module.mk | 4 +++ engines/gob/pregob/onceupon/abracadabra.cpp | 43 ++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/abracadabra.h | 44 +++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/babayaga.cpp | 43 ++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/babayaga.h | 44 +++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.cpp | 37 ++++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 42 +++++++++++++++++++++++++++ engines/gob/pregob/pregob.cpp | 35 +++++++++++++++++++++++ engines/gob/pregob/pregob.h | 43 ++++++++++++++++++++++++++++ 12 files changed, 380 insertions(+), 4 deletions(-) create mode 100644 engines/gob/pregob/onceupon/abracadabra.cpp create mode 100644 engines/gob/pregob/onceupon/abracadabra.h create mode 100644 engines/gob/pregob/onceupon/babayaga.cpp create mode 100644 engines/gob/pregob/onceupon/babayaga.h create mode 100644 engines/gob/pregob/onceupon/onceupon.cpp create mode 100644 engines/gob/pregob/onceupon/onceupon.h create mode 100644 engines/gob/pregob/pregob.cpp create mode 100644 engines/gob/pregob/pregob.h diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index ef9a7112f9..02aea63377 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -48,6 +48,10 @@ #include "gob/videoplayer.h" #include "gob/save/saveload.h" +#include "gob/pregob/pregob.h" +#include "gob/pregob/onceupon/abracadabra.h" +#include "gob/pregob/onceupon/babayaga.h" + namespace Gob { #define MAX_TIME_DELTA 100 @@ -115,7 +119,7 @@ GobEngine::GobEngine(OSystem *syst) : Engine(syst), _rnd("gob") { _vidPlayer = 0; _init = 0; _inter = 0; _map = 0; _palAnim = 0; _scenery = 0; _draw = 0; _util = 0; _video = 0; - _saveLoad = 0; + _saveLoad = 0; _preGob = 0; _pauseStart = 0; @@ -398,7 +402,6 @@ Common::Error GobEngine::initGameParts() { // just detect some devices some of which will be always there if the music is not disabled _noMusic = MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB)) == MT_NULL ? true : false; - _saveLoad = 0; _global = new Global(this); _util = new Util(this); @@ -607,6 +610,28 @@ Common::Error GobEngine::initGameParts() { _saveLoad = new SaveLoad_v2(this, _targetName.c_str()); break; + case kGameTypeAbracadabra: + _init = new Init_v2(this); + _video = new Video_v2(this); + _mult = new Mult_v2(this); + _draw = new Draw_v2(this); + _map = new Map_v2(this); + _goblin = new Goblin_v2(this); + _scenery = new Scenery_v2(this); + _preGob = new OnceUpon::Abracadabra(this); + break; + + case kGameTypeBabaYaga: + _init = new Init_v2(this); + _video = new Video_v2(this); + _mult = new Mult_v2(this); + _draw = new Draw_v2(this); + _map = new Map_v2(this); + _goblin = new Goblin_v2(this); + _scenery = new Scenery_v2(this); + _preGob = new OnceUpon::BabaYaga(this); + break; + default: deinitGameParts(); return Common::kUnsupportedGameidError; @@ -615,12 +640,14 @@ Common::Error GobEngine::initGameParts() { // Setup mixer syncSoundSettings(); - _inter->setupOpcodes(); + if (_inter) + _inter->setupOpcodes(); return Common::kNoError; } void GobEngine::deinitGameParts() { + delete _preGob; _preGob = 0; delete _saveLoad; _saveLoad = 0; delete _mult; _mult = 0; delete _vidPlayer; _vidPlayer = 0; diff --git a/engines/gob/gob.h b/engines/gob/gob.h index 5d4c3d7c55..9b919098d6 100644 --- a/engines/gob/gob.h +++ b/engines/gob/gob.h @@ -75,6 +75,7 @@ class Scenery; class Util; class SaveLoad; class GobConsole; +class PreGob; #define WRITE_VAR_UINT32(var, val) _vm->_inter->_variables->writeVar32(var, val) #define WRITE_VAR_UINT16(var, val) _vm->_inter->_variables->writeVar16(var, val) @@ -223,6 +224,7 @@ public: Inter *_inter; SaveLoad *_saveLoad; VideoPlayer *_vidPlayer; + PreGob *_preGob; const char *getLangDesc(int16 language) const; void validateLanguage(); diff --git a/engines/gob/init.cpp b/engines/gob/init.cpp index a61261f355..814d4d1821 100644 --- a/engines/gob/init.cpp +++ b/engines/gob/init.cpp @@ -34,9 +34,13 @@ #include "gob/inter.h" #include "gob/video.h" #include "gob/videoplayer.h" + +#include "gob/sound/sound.h" + #include "gob/demos/scnplayer.h" #include "gob/demos/batplayer.h" -#include "gob/sound/sound.h" + +#include "gob/pregob/pregob.h" namespace Gob { @@ -118,6 +122,14 @@ void Init::initGame() { return; } + if (_vm->_preGob) { + _vm->_preGob->run(); + delete _palDesc; + _vm->_video->initPrimary(-1); + cleanup(); + return; + } + Common::SeekableReadStream *infFile = _vm->_dataIO->getFile("intro.inf"); if (!infFile) { diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 3395046b6c..8a792049e8 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -77,6 +77,10 @@ MODULE_OBJS := \ demos/scnplayer.o \ demos/batplayer.o \ detection/detection.o \ + pregob/pregob.o \ + pregob/onceupon/onceupon.o \ + pregob/onceupon/abracadabra.o \ + pregob/onceupon/babayaga.o \ minigames/geisha/evilfish.o \ minigames/geisha/oko.o \ minigames/geisha/meter.o \ diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp new file mode 100644 index 0000000000..14a362ce12 --- /dev/null +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -0,0 +1,43 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/textconsole.h" + +#include "gob/pregob/onceupon/abracadabra.h" + +namespace Gob { + +namespace OnceUpon { + +Abracadabra::Abracadabra(GobEngine *vm) : OnceUpon(vm) { +} + +Abracadabra::~Abracadabra() { +} + +void Abracadabra::run() { + warning("TODO: Abracadabra::run()"); +} + +} // End of namespace OnceUpon + +} // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/abracadabra.h b/engines/gob/pregob/onceupon/abracadabra.h new file mode 100644 index 0000000000..855d2bf131 --- /dev/null +++ b/engines/gob/pregob/onceupon/abracadabra.h @@ -0,0 +1,44 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GOB_PREGOB_ONCEUPON_ABRACADABRA_H +#define GOB_PREGOB_ONCEUPON_ABRACADABRA_H + +#include "gob/pregob/onceupon/onceupon.h" + +namespace Gob { + +namespace OnceUpon { + +class Abracadabra : public OnceUpon { +public: + Abracadabra(GobEngine *vm); + ~Abracadabra(); + + void run(); +}; + +} // End of namespace OnceUpon + +} // End of namespace Gob + +#endif // GOB_PREGOB_ONCEUPON_ABRACADABRA_H diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp new file mode 100644 index 0000000000..f2c7569460 --- /dev/null +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -0,0 +1,43 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/textconsole.h" + +#include "gob/pregob/onceupon/babayaga.h" + +namespace Gob { + +namespace OnceUpon { + +BabaYaga::BabaYaga(GobEngine *vm) : OnceUpon(vm) { +} + +BabaYaga::~BabaYaga() { +} + +void BabaYaga::run() { + warning("TODO: BabaYaga::run()"); +} + +} // End of namespace OnceUpon + +} // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/babayaga.h b/engines/gob/pregob/onceupon/babayaga.h new file mode 100644 index 0000000000..b3339b0ca8 --- /dev/null +++ b/engines/gob/pregob/onceupon/babayaga.h @@ -0,0 +1,44 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GOB_PREGOB_ONCEUPON_BABAYAGA_H +#define GOB_PREGOB_ONCEUPON_BABAYAGA_H + +#include "gob/pregob/onceupon/onceupon.h" + +namespace Gob { + +namespace OnceUpon { + +class BabaYaga : public OnceUpon { +public: + BabaYaga(GobEngine *vm); + ~BabaYaga(); + + void run(); +}; + +} // End of namespace OnceUpon + +} // End of namespace Gob + +#endif // GOB_PREGOB_ONCEUPON_BABAYAGA_H diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp new file mode 100644 index 0000000000..639f5b1ee8 --- /dev/null +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -0,0 +1,37 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "gob/pregob/onceupon/onceupon.h" + +namespace Gob { + +namespace OnceUpon { + +OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm) { +} + +OnceUpon::~OnceUpon() { +} + +} // End of namespace OnceUpon + +} // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h new file mode 100644 index 0000000000..f937701537 --- /dev/null +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -0,0 +1,42 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GOB_PREGOB_ONCEUPON_ONCEUPON_H +#define GOB_PREGOB_ONCEUPON_ONCEUPON_H + +#include "gob/pregob/pregob.h" + +namespace Gob { + +namespace OnceUpon { + +class OnceUpon : public PreGob { +public: + OnceUpon(GobEngine *vm); + ~OnceUpon(); +}; + +} // End of namespace OnceUpon + +} // End of namespace Gob + +#endif // GOB_PREGOB_ONCEUPON_ONCEUPON_H diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp new file mode 100644 index 0000000000..ab47adaac6 --- /dev/null +++ b/engines/gob/pregob/pregob.cpp @@ -0,0 +1,35 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "gob/gob.h" + +#include "gob/pregob/pregob.h" + +namespace Gob { + +PreGob::PreGob(GobEngine *vm) : _vm(vm) { +} + +PreGob::~PreGob() { +} + +} // End of namespace Gob diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h new file mode 100644 index 0000000000..e77e0ba17b --- /dev/null +++ b/engines/gob/pregob/pregob.h @@ -0,0 +1,43 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GOB_PREGOB_PREGOB_H +#define GOB_PREGOB_PREGOB_H + +namespace Gob { + +class GobEngine; + +class PreGob { +public: + PreGob(GobEngine *vm); + virtual ~PreGob(); + + virtual void run() = 0; + +protected: + GobEngine *_vm; +}; + +} // End of namespace Gob + +#endif // GOB_PREGOB_PREGOB_H -- cgit v1.2.3 From 8b19e10104a98a95963ad2ee97b255d6804e7fdd Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 03:38:27 +0200 Subject: GOB: Add some generic PreGob graphics functions --- engines/gob/pregob/pregob.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++- engines/gob/pregob/pregob.h | 17 ++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index ab47adaac6..aea290214c 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -21,15 +21,73 @@ */ #include "gob/gob.h" +#include "gob/global.h" +#include "gob/util.h" +#include "gob/palanim.h" +#include "gob/draw.h" +#include "gob/video.h" #include "gob/pregob/pregob.h" namespace Gob { -PreGob::PreGob(GobEngine *vm) : _vm(vm) { +PreGob::PreGob(GobEngine *vm) : _vm(vm), _fadedOut(false) { } PreGob::~PreGob() { } +void PreGob::fadeOut() { + if (_fadedOut || _vm->shouldQuit()) + return; + + // Fade to black + _vm->_palAnim->fade(0, 0, 0); + + _fadedOut = true; +} + +void PreGob::fadeIn() { + if (!_fadedOut || _vm->shouldQuit()) + return; + + // Fade to palette + _vm->_draw->blitInvalidated(); + _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, 0, 0); + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 0, 0, 319, 199); + + _fadedOut = false; +} + +void PreGob::clearScreen() { + _vm->_draw->_backSurface->clear(); + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 0, 0, 319, 199); + _vm->_draw->blitInvalidated(); + _vm->_video->retrace(); +} + +void PreGob::initScreen() { + _vm->_util->setFrameRate(15); + + _fadedOut = true; + + _vm->_draw->initScreen(); + + _vm->_draw->_backSurface->clear(); + _vm->_util->clearPalette(); + + _vm->_draw->forceBlit(); + _vm->_video->retrace(); + + _vm->_util->processInput(); +} + +void PreGob::setPalette(const byte *palette, uint16 size) { + memcpy(_vm->_draw->_vgaPalette, palette, 3 * size); + + // If we didn't fade out prior, immediately set the palette + if (!_fadedOut) + _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc); +} + } // End of namespace Gob diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index e77e0ba17b..6418d6fd8a 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -35,7 +35,24 @@ public: virtual void run() = 0; protected: + void initScreen(); ///< Initialize the game screen. + + void fadeOut(); ///< Fade to black. + void fadeIn(); ///< Fade to the current palette. + + void clearScreen(); + + /** Change the palette. + * + * @param palette The palette to change to. + * @param size Size of the palette in colors. + */ + void setPalette(const byte *palette, uint16 size); ///< Change the palette + GobEngine *_vm; + +private: + bool _fadedOut; ///< Did we fade out? }; } // End of namespace Gob -- cgit v1.2.3 From 38fe3c3cd9e656b3e3f2b35011895d6703a1a896 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 03:39:33 +0200 Subject: GOB: Add palettes for Once Upon A Time --- engines/gob/pregob/onceupon/abracadabra.cpp | 2 + engines/gob/pregob/onceupon/babayaga.cpp | 2 + engines/gob/pregob/onceupon/onceupon.cpp | 150 ++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 8 ++ 4 files changed, 162 insertions(+) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 14a362ce12..84d84e89a5 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -36,6 +36,8 @@ Abracadabra::~Abracadabra() { void Abracadabra::run() { warning("TODO: Abracadabra::run()"); + + initScreen(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index f2c7569460..21355ab9ed 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -36,6 +36,8 @@ BabaYaga::~BabaYaga() { void BabaYaga::run() { warning("TODO: BabaYaga::run()"); + + initScreen(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 639f5b1ee8..35127cbfb3 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -20,8 +20,147 @@ * */ +#include "gob/gob.h" +#include "gob/util.h" +#include "gob/dataio.h" +#include "gob/draw.h" +#include "gob/video.h" + #include "gob/pregob/onceupon/onceupon.h" +static const int kPaletteSize = 16; +static const uint kPaletteCount = 20; + +static const byte kCopyProtectionPalette[3 * kPaletteSize] = { + 0x00, 0x00, 0x00, 0x19, 0x00, 0x19, 0x00, 0x3F, 0x00, 0x00, 0x2A, 0x2A, + 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x2A, 0x15, 0x00, 0x00, 0x19, 0x12, + 0x00, 0x00, 0x00, 0x15, 0x15, 0x3F, 0x15, 0x3F, 0x15, 0x00, 0x20, 0x3F, + 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x3F, 0x3F, 0x00, 0x3F, 0x3F, 0x3F +}; + +static const byte kGamePalettes[kPaletteCount][3 * kPaletteSize] = { + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, + 0x1C, 0x28, 0x00, 0x10, 0x18, 0x00, 0x1C, 0x1C, 0x20, 0x14, 0x14, 0x14, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x14, 0x20, 0x04, + 0x3C, 0x2C, 0x00, 0x02, 0x00, 0x18, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x38, 0x20, 0x3C, 0x2C, 0x10, 0x30, 0x20, 0x08, 0x28, + 0x14, 0x00, 0x1C, 0x20, 0x20, 0x38, 0x18, 0x18, 0x2C, 0x10, 0x10, 0x24, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x3C, 0x20, 0x20, 0x24, 0x14, 0x14, 0x1C, 0x10, 0x10, + 0x14, 0x0C, 0x0C, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x10, 0x28, 0x1C, 0x10, 0x1C, 0x10, 0x10, 0x14, 0x0C, + 0x1C, 0x1C, 0x3C, 0x24, 0x24, 0x3C, 0x18, 0x18, 0x24, 0x10, 0x10, 0x18, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x3F, 0x26, 0x3F, 0x36, 0x1C, 0x36, 0x2C, 0x12, 0x2A, + 0x27, 0x0C, 0x24, 0x22, 0x07, 0x1E, 0x1D, 0x03, 0x18, 0x16, 0x00, 0x10, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3A, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x3F, 0x39, 0x26, 0x38, 0x34, 0x1C, 0x30, 0x2F, 0x13, + 0x27, 0x29, 0x0C, 0x1D, 0x22, 0x07, 0x14, 0x1B, 0x03, 0x0C, 0x14, 0x00, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3A, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x1C, 0x34, 0x38, 0x14, 0x2C, 0x30, + 0x0C, 0x20, 0x2C, 0x08, 0x18, 0x28, 0x04, 0x10, 0x20, 0x00, 0x08, 0x1C, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x3C, 0x2C, 0x24, 0x38, 0x24, 0x1C, 0x30, 0x1C, 0x14, + 0x28, 0x18, 0x0C, 0x20, 0x10, 0x04, 0x1C, 0x0C, 0x00, 0x14, 0x08, 0x00, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x3C, 0x34, 0x24, 0x38, 0x2C, 0x1C, 0x30, 0x24, 0x14, + 0x2C, 0x1C, 0x10, 0x30, 0x30, 0x3C, 0x1C, 0x1C, 0x38, 0x0C, 0x0C, 0x38, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x02, 0x03, 0x14, 0x07, 0x07, 0x1D, + 0x0E, 0x0E, 0x25, 0x17, 0x17, 0x2E, 0x21, 0x22, 0x36, 0x2F, 0x2F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3B, 0x0D, 0x3A, 0x31, 0x0A, 0x35, 0x28, 0x07, + 0x30, 0x21, 0x04, 0x2B, 0x19, 0x02, 0x26, 0x12, 0x01, 0x16, 0x0B, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x21, 0x01, 0x00, 0x2A, 0x02, 0x00, + 0x33, 0x03, 0x00, 0x3D, 0x06, 0x00, 0x2A, 0x19, 0x05, 0x15, 0x14, 0x14, + 0x22, 0x1F, 0x1E, 0x2F, 0x2C, 0x28, 0x3F, 0x3C, 0x29, 0x3F, 0x38, 0x0B, + 0x3B, 0x30, 0x0A, 0x37, 0x29, 0x08, 0x33, 0x23, 0x07, 0x2F, 0x1D, 0x06 + }, + { + 0x00, 0x00, 0x00, 0x00, 0x1C, 0x38, 0x34, 0x30, 0x28, 0x2C, 0x24, 0x1C, + 0x24, 0x18, 0x10, 0x1C, 0x10, 0x08, 0x14, 0x04, 0x04, 0x10, 0x00, 0x00, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x00, 0x1C, 0x38, 0x34, 0x30, 0x28, 0x2C, 0x24, 0x1C, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x1A, 0x30, 0x37, 0x14, 0x28, 0x31, 0x10, 0x20, 0x2C, + 0x0C, 0x19, 0x27, 0x08, 0x12, 0x21, 0x05, 0x0C, 0x1C, 0x03, 0x07, 0x16, + 0x01, 0x03, 0x11, 0x00, 0x00, 0x0C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x34, 0x30, 0x34, 0x30, 0x24, 0x30, 0x28, 0x1C, 0x28, + 0x24, 0x14, 0x24, 0x1C, 0x0C, 0x1C, 0x18, 0x08, 0x18, 0x14, 0x04, 0x14, + 0x0C, 0x04, 0x0C, 0x08, 0x00, 0x08, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x2C, 0x24, 0x0C, 0x34, 0x34, 0x28, 0x2C, 0x2C, 0x1C, + 0x24, 0x24, 0x10, 0x1C, 0x18, 0x08, 0x14, 0x14, 0x08, 0x10, 0x10, 0x04, + 0x0C, 0x0C, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x28, 0x31, 0x10, 0x20, 0x2C, + 0x0C, 0x19, 0x27, 0x08, 0x12, 0x21, 0x05, 0x0C, 0x1C, 0x03, 0x07, 0x16, + 0x01, 0x03, 0x11, 0x00, 0x3C, 0x00, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x10, 0x28, 0x1C, 0x10, 0x1C, 0x10, 0x10, 0x14, 0x0C, + 0x1C, 0x1C, 0x3C, 0x24, 0x24, 0x3C, 0x18, 0x18, 0x24, 0x10, 0x10, 0x18, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x10, 0x28, 0x1C, 0x10, 0x1C, 0x10, 0x10, 0x14, 0x0C, + 0x1C, 0x1C, 0x3C, 0x24, 0x24, 0x3C, 0x18, 0x18, 0x24, 0x10, 0x10, 0x18, + 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 + } +}; + namespace Gob { namespace OnceUpon { @@ -32,6 +171,17 @@ OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm) { OnceUpon::~OnceUpon() { } +void OnceUpon::setCopyProtectionPalette() { + setPalette(kCopyProtectionPalette, kPaletteSize); +} + +void OnceUpon::setGamePalette(uint palette) { + if (palette >= kPaletteCount) + return; + + setPalette(kGamePalettes[palette], kPaletteSize); +} + } // End of namespace OnceUpon } // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index f937701537..816d4dc051 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -23,6 +23,8 @@ #ifndef GOB_PREGOB_ONCEUPON_ONCEUPON_H #define GOB_PREGOB_ONCEUPON_ONCEUPON_H +#include "common/system.h" + #include "gob/pregob/pregob.h" namespace Gob { @@ -33,6 +35,12 @@ class OnceUpon : public PreGob { public: OnceUpon(GobEngine *vm); ~OnceUpon(); + +protected: + void setGamePalette(uint palette); + +private: + void setCopyProtectionPalette(); }; } // End of namespace OnceUpon -- cgit v1.2.3 From 27782700a5631a25129b12779abb540a906f6a96 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 17:45:02 +0200 Subject: GOB: Add some PreGob and Once Upon A Time cursor functions --- engines/gob/draw.cpp | 4 ++- engines/gob/draw_v2.cpp | 5 +++- engines/gob/pregob/onceupon/onceupon.cpp | 1 + engines/gob/pregob/onceupon/onceupon.h | 2 ++ engines/gob/pregob/pregob.cpp | 47 ++++++++++++++++++++++++++++++++ engines/gob/pregob/pregob.h | 14 ++++++++++ engines/gob/video.cpp | 2 +- 7 files changed, 72 insertions(+), 3 deletions(-) diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp index 3932987e0a..8c6919416d 100644 --- a/engines/gob/draw.cpp +++ b/engines/gob/draw.cpp @@ -271,7 +271,9 @@ void Draw::blitInvalidated() { return; } - _showCursor = (_showCursor & ~2) | ((_showCursor & 1) << 1); + if (_cursorSprites) + _showCursor = (_showCursor & ~2) | ((_showCursor & 1) << 1); + if (_applyPal) { clearPalette(); forceBlit(); diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index ac43c7b86a..f5475278c4 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -74,13 +74,16 @@ void Draw_v2::closeScreen() { } void Draw_v2::blitCursor() { - if (_cursorIndex == -1) + if (!_cursorSprites || (_cursorIndex == -1)) return; _showCursor = (_showCursor & ~2) | ((_showCursor & 1) << 1); } void Draw_v2::animateCursor(int16 cursor) { + if (!_cursorSprites) + return; + int16 cursorIndex = cursor; int16 newX = 0, newY = 0; uint16 hotspotX, hotspotY; diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 35127cbfb3..7f7dffa7ec 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -23,6 +23,7 @@ #include "gob/gob.h" #include "gob/util.h" #include "gob/dataio.h" +#include "gob/surface.h" #include "gob/draw.h" #include "gob/video.h" diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 816d4dc051..c1c4d6fa0d 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -29,6 +29,8 @@ namespace Gob { +class Surface; + namespace OnceUpon { class OnceUpon : public PreGob { diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index aea290214c..18aac50352 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -20,9 +20,12 @@ * */ +#include "graphics/cursorman.h" + #include "gob/gob.h" #include "gob/global.h" #include "gob/util.h" +#include "gob/surface.h" #include "gob/palanim.h" #include "gob/draw.h" #include "gob/video.h" @@ -90,4 +93,48 @@ void PreGob::setPalette(const byte *palette, uint16 size) { _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc); } +void PreGob::addCursor() { + CursorMan.pushCursor(0, 0, 0, 0, 0, 0); +} + +void PreGob::removeCursor() { + CursorMan.popCursor(); +} + +void PreGob::setCursor(Surface &sprite, int16 hotspotX, int16 hotspotY) { + CursorMan.replaceCursor(sprite.getData(), sprite.getWidth(), sprite.getHeight(), hotspotX, hotspotY, 0); +} + +void PreGob::setCursor(Surface &sprite, int16 left, int16 top, int16 right, int16 bottom, + int16 hotspotX, int16 hotspotY) { + + const int width = right - left + 1; + const int height = bottom - top + 1; + + if ((width <= 0) || (height <= 0)) + return; + + Surface cursor(width, height, 1); + + cursor.blit(sprite, left, top, right, bottom, 0, 0); + + setCursor(cursor, hotspotX, hotspotX); +} + +void PreGob::showCursor() { + CursorMan.showMouse(true); + + _vm->_draw->_showCursor = 4; +} + +void PreGob::hideCursor() { + CursorMan.showMouse(false); + + _vm->_draw->_showCursor = 0; +} + +bool PreGob::isCursorVisible() const { + return CursorMan.isVisible(); +} + } // End of namespace Gob diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index 6418d6fd8a..e0f7ca907d 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -26,6 +26,7 @@ namespace Gob { class GobEngine; +class Surface; class PreGob { public: @@ -49,6 +50,19 @@ protected: */ void setPalette(const byte *palette, uint16 size); ///< Change the palette + void addCursor(); + void removeCursor(); + + void setCursor(Surface &sprite, int16 hotspotX, int16 hotspotY); + void setCursor(Surface &sprite, int16 left, int16 top, int16 right, int16 bottom, + int16 hotspotX, int16 hotspotY); + + void showCursor(); + void hideCursor(); + + bool isCursorVisible() const; + + GobEngine *_vm; private: diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index 8bcf14e040..62bb210a8e 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -242,7 +242,7 @@ void Video::setSize(bool defaultTo1XScaler) { void Video::retrace(bool mouse) { if (mouse) - CursorMan.showMouse((_vm->_draw->_showCursor & 2) != 0); + CursorMan.showMouse((_vm->_draw->_showCursor & 6) != 0); if (_vm->_global->_primarySurfDesc) { int screenX = _screenDeltaX; -- cgit v1.2.3 From 83896dea3edc3bcfb1e414b61644c7ca266e1cce Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 21:25:54 +0200 Subject: GOB: Add PreGob input/event utility functions --- engines/gob/pregob/pregob.cpp | 44 +++++++++++++++++++++++++++++++++++++++++++ engines/gob/pregob/pregob.h | 9 +++++++++ 2 files changed, 53 insertions(+) diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 18aac50352..1c3fb8221c 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -137,4 +137,48 @@ bool PreGob::isCursorVisible() const { return CursorMan.isVisible(); } +void PreGob::endFrame(bool doInput) { + _vm->_draw->blitInvalidated(); + _vm->_util->waitEndFrame(); + + if (doInput) + _vm->_util->processInput(); +} + +int16 PreGob::checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons) { + _vm->_util->getMouseState(&mouseX, &mouseY, &mouseButtons); + _vm->_util->forceMouseUp(); + + return _vm->_util->checkKey(); +} + +int16 PreGob::waitInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons) { + bool finished = false; + + int16 key = 0; + while (!_vm->shouldQuit() && !finished) { + endFrame(true); + + key = checkInput(mouseX, mouseY, mouseButtons); + + finished = (mouseButtons != kMouseButtonsNone) || (key != 0); + } + + return key; +} + +int16 PreGob::waitInput() { + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + return waitInput(mouseX, mouseY, mouseButtons); +} + +bool PreGob::hasInput() { + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + return checkInput(mouseX, mouseY, mouseButtons) || (mouseButtons != kMouseButtonsNone); +} + } // End of namespace Gob diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index e0f7ca907d..4cf4a39fdb 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -23,6 +23,8 @@ #ifndef GOB_PREGOB_PREGOB_H #define GOB_PREGOB_PREGOB_H +#include "gob/util.h" + namespace Gob { class GobEngine; @@ -62,6 +64,13 @@ protected: bool isCursorVisible() const; + void endFrame(bool doInput); + + int16 checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons); + int16 waitInput (int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons); + int16 waitInput(); + bool hasInput(); + GobEngine *_vm; -- cgit v1.2.3 From 4fc3a88c5f0b053323aeaeac658dafb8e4606662 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 28 Jun 2012 22:54:05 +0200 Subject: GOB: Add support for different methods of handling Endianness The Once Upon A Time games handle endianness different in ANI, DEC and RXY files than Geisha does. We need to support both approaches. --- engines/gob/anifile.cpp | 34 +++++++++++++++++++++------------- engines/gob/cmpfile.cpp | 9 ++++++++- engines/gob/decfile.cpp | 42 +++++++++++++++++++++++++----------------- engines/gob/gob.cpp | 8 ++++++++ engines/gob/gob.h | 10 ++++++++++ engines/gob/rxyfile.cpp | 19 +++++++++++++------ engines/gob/rxyfile.h | 4 +++- 7 files changed, 88 insertions(+), 38 deletions(-) diff --git a/engines/gob/anifile.cpp b/engines/gob/anifile.cpp index 2671fe0405..e6bf30f4d7 100644 --- a/engines/gob/anifile.cpp +++ b/engines/gob/anifile.cpp @@ -37,30 +37,38 @@ ANIFile::ANIFile(GobEngine *vm, const Common::String &fileName, uint16 width, uint8 bpp) : _vm(vm), _width(width), _bpp(bpp), _hasPadding(false) { - Common::SeekableReadStream *ani = _vm->_dataIO->getFile(fileName); - if (ani) { - Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), false, DisposeAfterUse::YES); + bool bigEndian = false; + Common::String endianFileName = fileName; - load(sub, fileName); - return; - } + if ((_vm->getEndiannessMethod() == kEndiannessMethodAltFile) && + !_vm->_dataIO->hasFile(fileName)) { + // If the game has alternate big-endian files, look if one exist + + Common::String alternateFileName = fileName; + alternateFileName.setChar('_', 0); - // File doesn't exist, try to open the big-endian'd alternate file - Common::String alternateFileName = fileName; - alternateFileName.setChar('_', 0); + if (_vm->_dataIO->hasFile(alternateFileName)) { + bigEndian = true; + endianFileName = alternateFileName; + } + } else if ((_vm->getEndiannessMethod() == kEndiannessMethodBE) || + ((_vm->getEndiannessMethod() == kEndiannessMethodSystem) && + (_vm->getEndianness() == kEndiannessBE))) + // Game always little endian or it follows the system and it is big endian + bigEndian = true; - ani = _vm->_dataIO->getFile(alternateFileName); + Common::SeekableReadStream *ani = _vm->_dataIO->getFile(endianFileName); if (ani) { - Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), true, DisposeAfterUse::YES); + Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), bigEndian, DisposeAfterUse::YES); // The big endian version pads a few fields to even size - _hasPadding = true; + _hasPadding = bigEndian; load(sub, fileName); return; } - warning("ANIFile::ANIFile(): No such file \"%s\"", fileName.c_str()); + warning("ANIFile::ANIFile(): No such file \"%s\" (\"%s\")", endianFileName.c_str(), fileName.c_str()); } ANIFile::~ANIFile() { diff --git a/engines/gob/cmpfile.cpp b/engines/gob/cmpfile.cpp index 7b21c4c835..1cd1375879 100644 --- a/engines/gob/cmpfile.cpp +++ b/engines/gob/cmpfile.cpp @@ -21,6 +21,7 @@ */ #include "common/stream.h" +#include "common/substream.h" #include "common/str.h" #include "gob/gob.h" @@ -143,7 +144,13 @@ void CMPFile::loadCMP(Common::SeekableReadStream &cmp) { } void CMPFile::loadRXY(Common::SeekableReadStream &rxy) { - _coordinates = new RXYFile(rxy); + bool bigEndian = (_vm->getEndiannessMethod() == kEndiannessMethodBE) || + ((_vm->getEndiannessMethod() == kEndiannessMethodSystem) && + (_vm->getEndianness() == kEndiannessBE)); + + Common::SeekableSubReadStreamEndian sub(&rxy, 0, rxy.size(), bigEndian, DisposeAfterUse::NO); + + _coordinates = new RXYFile(sub); for (uint i = 0; i < _coordinates->size(); i++) { const RXYFile::Coordinates &c = (*_coordinates)[i]; diff --git a/engines/gob/decfile.cpp b/engines/gob/decfile.cpp index fb67c52627..85b4c09ca3 100644 --- a/engines/gob/decfile.cpp +++ b/engines/gob/decfile.cpp @@ -38,30 +38,38 @@ DECFile::DECFile(GobEngine *vm, const Common::String &fileName, uint16 width, uint16 height, uint8 bpp) : _vm(vm), _width(width), _height(height), _bpp(bpp), _hasPadding(false), _backdrop(0) { - Common::SeekableReadStream *dec = _vm->_dataIO->getFile(fileName); - if (dec) { - Common::SeekableSubReadStreamEndian sub(dec, 0, dec->size(), false, DisposeAfterUse::YES); - - load(sub, fileName); - return; - } - - // File doesn't exist, try to open the big-endian'd alternate file - Common::String alternateFileName = fileName; - alternateFileName.setChar('_', 0); - - dec = _vm->_dataIO->getFile(alternateFileName); - if (dec) { - Common::SeekableSubReadStreamEndian sub(dec, 0, dec->size(), true, DisposeAfterUse::YES); + bool bigEndian = false; + Common::String endianFileName = fileName; + + if ((_vm->getEndiannessMethod() == kEndiannessMethodAltFile) && + !_vm->_dataIO->hasFile(fileName)) { + // If the game has alternate big-endian files, look if one exist + + Common::String alternateFileName = fileName; + alternateFileName.setChar('_', 0); + + if (_vm->_dataIO->hasFile(alternateFileName)) { + bigEndian = true; + endianFileName = alternateFileName; + } + } else if ((_vm->getEndiannessMethod() == kEndiannessMethodBE) || + ((_vm->getEndiannessMethod() == kEndiannessMethodSystem) && + (_vm->getEndianness() == kEndiannessBE))) + // Game always little endian or it follows the system and it is big endian + bigEndian = true; + + Common::SeekableReadStream *ani = _vm->_dataIO->getFile(endianFileName); + if (ani) { + Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), bigEndian, DisposeAfterUse::YES); // The big endian version pads a few fields to even size - _hasPadding = true; + _hasPadding = bigEndian; load(sub, fileName); return; } - warning("DECFile::DECFile(): No such file \"%s\"", fileName.c_str()); + warning("DECFile::DECFile(): No such file \"%s\" (\"%s\")", endianFileName.c_str(), fileName.c_str()); } DECFile::~DECFile() { diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index 02aea63377..fcf98f0355 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -184,6 +184,10 @@ void GobEngine::validateVideoMode(int16 videoMode) { error("Video mode 0x%X is not supported", videoMode); } +EndiannessMethod GobEngine::getEndiannessMethod() const { + return _endiannessMethod; +} + Endianness GobEngine::getEndianness() const { if ((getPlatform() == Common::kPlatformAmiga) || (getPlatform() == Common::kPlatformMacintosh) || @@ -403,6 +407,8 @@ Common::Error GobEngine::initGameParts() { // just detect some devices some of which will be always there if the music is not disabled _noMusic = MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB)) == MT_NULL ? true : false; + _endiannessMethod = kEndiannessMethodSystem; + _global = new Global(this); _util = new Util(this); _dataIO = new DataIO(); @@ -433,6 +439,8 @@ Common::Error GobEngine::initGameParts() { _goblin = new Goblin_v1(this); _scenery = new Scenery_v1(this); _saveLoad = new SaveLoad_Geisha(this, _targetName.c_str()); + + _endiannessMethod = kEndiannessMethodAltFile; break; case kGameTypeFascination: diff --git a/engines/gob/gob.h b/engines/gob/gob.h index 9b919098d6..df73404596 100644 --- a/engines/gob/gob.h +++ b/engines/gob/gob.h @@ -149,6 +149,13 @@ enum Features { kFeaturesTrueColor = 1 << 7 }; +enum EndiannessMethod { + kEndiannessMethodLE, ///< Always little endian. + kEndiannessMethodBE, ///< Always big endian. + kEndiannessMethodSystem, ///< Follows system endianness. + kEndiannessMethodAltFile ///< Different endianness in alternate file. +}; + enum { kDebugFuncOp = 1 << 0, kDebugDrawOp = 1 << 1, @@ -172,6 +179,8 @@ private: int32 _features; Common::Platform _platform; + EndiannessMethod _endiannessMethod; + uint32 _pauseStart; // Engine APIs @@ -232,6 +241,7 @@ public: void pauseGame(); + EndiannessMethod getEndiannessMethod() const; Endianness getEndianness() const; Common::Platform getPlatform() const; GameType getGameType() const; diff --git a/engines/gob/rxyfile.cpp b/engines/gob/rxyfile.cpp index 9702dc8c7f..2ff8c121cd 100644 --- a/engines/gob/rxyfile.cpp +++ b/engines/gob/rxyfile.cpp @@ -21,12 +21,19 @@ */ #include "common/stream.h" +#include "common/substream.h" #include "gob/rxyfile.h" namespace Gob { RXYFile::RXYFile(Common::SeekableReadStream &rxy) : _width(0), _height(0) { + Common::SeekableSubReadStreamEndian sub(&rxy, 0, rxy.size(), false, DisposeAfterUse::NO); + + load(sub); +} + +RXYFile::RXYFile(Common::SeekableSubReadStreamEndian &rxy) : _width(0), _height(0) { load(rxy); } @@ -64,22 +71,22 @@ const RXYFile::Coordinates &RXYFile::operator[](uint i) const { return _coords[i]; } -void RXYFile::load(Common::SeekableReadStream &rxy) { +void RXYFile::load(Common::SeekableSubReadStreamEndian &rxy) { if (rxy.size() < 2) return; rxy.seek(0); - _realCount = rxy.readUint16LE(); + _realCount = rxy.readUint16(); uint16 count = (rxy.size() - 2) / 8; _coords.resize(count); for (CoordArray::iterator c = _coords.begin(); c != _coords.end(); ++c) { - c->left = rxy.readUint16LE(); - c->right = rxy.readUint16LE(); - c->top = rxy.readUint16LE(); - c->bottom = rxy.readUint16LE(); + c->left = rxy.readUint16(); + c->right = rxy.readUint16(); + c->top = rxy.readUint16(); + c->bottom = rxy.readUint16(); if (c->left != 0xFFFF) { _width = MAX(_width , c->right + 1); diff --git a/engines/gob/rxyfile.h b/engines/gob/rxyfile.h index bc9600b5b0..4fd46c5e40 100644 --- a/engines/gob/rxyfile.h +++ b/engines/gob/rxyfile.h @@ -28,6 +28,7 @@ namespace Common { class SeekableReadStream; + class SeekableSubReadStreamEndian; } namespace Gob { @@ -46,6 +47,7 @@ public: }; RXYFile(Common::SeekableReadStream &rxy); + RXYFile(Common::SeekableSubReadStreamEndian &rxy); RXYFile(uint16 width, uint16 height); ~RXYFile(); @@ -71,7 +73,7 @@ private: uint16 _height; - void load(Common::SeekableReadStream &rxy); + void load(Common::SeekableSubReadStreamEndian &rxy); }; } // End of namespace Gob -- cgit v1.2.3 From 734fc767d25d47b5da703dc1b4a3cfb494234155 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 29 Jun 2012 18:25:11 +0200 Subject: GOB: Open the Once Upon A Time archives --- engines/gob/pregob/onceupon/abracadabra.cpp | 4 ++-- engines/gob/pregob/onceupon/babayaga.cpp | 4 ++-- engines/gob/pregob/onceupon/onceupon.cpp | 29 ++++++++++++++++++++++++++++- engines/gob/pregob/onceupon/onceupon.h | 6 ++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 84d84e89a5..6cfdfa7822 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -35,9 +35,9 @@ Abracadabra::~Abracadabra() { } void Abracadabra::run() { - warning("TODO: Abracadabra::run()"); + init(); - initScreen(); + warning("TODO: Abracadabra::run()"); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 21355ab9ed..9f4f53c4e0 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -35,9 +35,9 @@ BabaYaga::~BabaYaga() { } void BabaYaga::run() { - warning("TODO: BabaYaga::run()"); + init(); - initScreen(); + warning("TODO: BabaYaga::run()"); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 7f7dffa7ec..e3d1a8535f 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -166,10 +166,37 @@ namespace Gob { namespace OnceUpon { -OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm) { +OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm), _openedArchives(false) { + } OnceUpon::~OnceUpon() { + deinit(); +} + +void OnceUpon::init() { + deinit(); + + bool hasSTK1 = _vm->_dataIO->openArchive("stk1.stk", true); + bool hasSTK2 = _vm->_dataIO->openArchive("stk2.stk", true); + bool hasSTK3 = _vm->_dataIO->openArchive("stk3.stk", true); + + if (!hasSTK1 || !hasSTK2 || !hasSTK3) + error("OnceUpon::OnceUpon(): Failed to open archives"); + + _openedArchives = true; + + initScreen(); +} + +void OnceUpon::deinit() { + if (_openedArchives) { + _vm->_dataIO->closeArchive(true); + _vm->_dataIO->closeArchive(true); + _vm->_dataIO->closeArchive(true); + } + + _openedArchives = false; } void OnceUpon::setCopyProtectionPalette() { diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index c1c4d6fa0d..e5f70855ad 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -39,10 +39,16 @@ public: ~OnceUpon(); protected: + void init(); + void deinit(); + void setGamePalette(uint palette); private: void setCopyProtectionPalette(); + + + bool _openedArchives; }; } // End of namespace OnceUpon -- cgit v1.2.3 From 3313302a157fc08d3965c6cb114e3a3f4d366c4b Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 29 Jun 2012 18:28:57 +0200 Subject: GOB: Load the Once Upon A Time fonts --- engines/gob/pregob/onceupon/onceupon.cpp | 22 +++++++++++++++++++++- engines/gob/pregob/onceupon/onceupon.h | 7 +++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index e3d1a8535f..6b12dd8653 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -166,7 +166,8 @@ namespace Gob { namespace OnceUpon { -OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm), _openedArchives(false) { +OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm), _jeudak(0), _lettre(0), _plettre(0), _glettre(0), + _openedArchives(false) { } @@ -186,10 +187,29 @@ void OnceUpon::init() { _openedArchives = true; + _jeudak = _vm->_draw->loadFont("jeudak.let"); + _lettre = _vm->_draw->loadFont("lettre.let"); + _plettre = _vm->_draw->loadFont("plettre.let"); + _glettre = _vm->_draw->loadFont("glettre.let"); + + if (!_jeudak || !_lettre || !_plettre || !_glettre) + error("OnceUpon::OnceUpon(): Failed to fonts (%d, %d, %d, %d)", + _jeudak != 0, _lettre != 0, _plettre != 0, _glettre != 0); + initScreen(); } void OnceUpon::deinit() { + delete _jeudak; + delete _lettre; + delete _plettre; + delete _glettre; + + _jeudak = 0; + _lettre = 0; + _plettre = 0; + _glettre = 0; + if (_openedArchives) { _vm->_dataIO->closeArchive(true); _vm->_dataIO->closeArchive(true); diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index e5f70855ad..cfc12532dd 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -30,6 +30,7 @@ namespace Gob { class Surface; +class Font; namespace OnceUpon { @@ -44,6 +45,12 @@ protected: void setGamePalette(uint palette); + + Font *_jeudak; + Font *_lettre; + Font *_plettre; + Font *_glettre; + private: void setCopyProtectionPalette(); -- cgit v1.2.3 From aae8c607596d9ce228935c01297902381c8b442c Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 29 Jun 2012 18:31:09 +0200 Subject: GOB: Verify the language in Once Upon A Time --- engines/gob/pregob/onceupon/onceupon.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 6b12dd8653..adea776297 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -21,6 +21,7 @@ */ #include "gob/gob.h" +#include "gob/global.h" #include "gob/util.h" #include "gob/dataio.h" #include "gob/surface.h" @@ -196,6 +197,15 @@ void OnceUpon::init() { error("OnceUpon::OnceUpon(): Failed to fonts (%d, %d, %d, %d)", _jeudak != 0, _lettre != 0, _plettre != 0, _glettre != 0); + if (_vm->_global->_language == kLanguageAmerican) + _vm->_global->_language = kLanguageBritish; + + if ((_vm->_global->_language >= kLanguageCount)) + error("We do not support the language \"%s\".\n" + "If you are certain that your game copy includes this language,\n" + "please contact the ScummVM team with details about this version.\n" + "Thanks", _vm->getLangDesc(_vm->_global->_language)); + initScreen(); } -- cgit v1.2.3 From 412ae53854dc2ef352a3f3e990f0d2b56d97ad7e Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 29 Jun 2012 19:34:14 +0200 Subject: GOB: Add PreGob animation utility functions --- engines/gob/pregob/pregob.cpp | 21 +++++++++++++++++++++ engines/gob/pregob/pregob.h | 6 ++++++ 2 files changed, 27 insertions(+) diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 1c3fb8221c..b9c36d7cf8 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -29,6 +29,7 @@ #include "gob/palanim.h" #include "gob/draw.h" #include "gob/video.h" +#include "gob/aniobject.h" #include "gob/pregob/pregob.h" @@ -181,4 +182,24 @@ bool PreGob::hasInput() { return checkInput(mouseX, mouseY, mouseButtons) || (mouseButtons != kMouseButtonsNone); } +void PreGob::clearAnim(ANIObject &ani) { + int16 left, top, right, bottom; + + if (ani.clear(*_vm->_draw->_backSurface, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); +} + +void PreGob::drawAnim(ANIObject &ani) { + int16 left, top, right, bottom; + + if (ani.draw(*_vm->_draw->_backSurface, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + ani.advance(); +} + +void PreGob::redrawAnim(ANIObject &ani) { + clearAnim(ani); + drawAnim(ani); +} + } // End of namespace Gob diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index 4cf4a39fdb..9efdbe8df6 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -30,6 +30,8 @@ namespace Gob { class GobEngine; class Surface; +class ANIObject; + class PreGob { public: PreGob(GobEngine *vm); @@ -71,6 +73,10 @@ protected: int16 waitInput(); bool hasInput(); + void clearAnim(ANIObject &ani); + void drawAnim(ANIObject &ani); + void redrawAnim(ANIObject &ani); + GobEngine *_vm; -- cgit v1.2.3 From ef3b4af9d8d221f52aaed900a2997b486ed2e6e4 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 29 Jun 2012 18:31:45 +0200 Subject: GOB: Implement the copy protection in Once Upon A Time --- engines/gob/pregob/onceupon/abracadabra.cpp | 24 +++ engines/gob/pregob/onceupon/babayaga.cpp | 24 +++ engines/gob/pregob/onceupon/onceupon.cpp | 247 ++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 11 ++ 4 files changed, 306 insertions(+) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 6cfdfa7822..d8dd8b3be0 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -22,8 +22,28 @@ #include "common/textconsole.h" +#include "gob/gob.h" + #include "gob/pregob/onceupon/abracadabra.h" +static const uint8 kCopyProtectionColors[7] = { + 14, 11, 13, 1, 7, 12, 2 +}; + +static const uint8 kCopyProtectionShapes[7 * 20] = { + 3, 4, 3, 0, 1, 2, 0, 2, 2, 0, 2, 4, 0, 3, 4, 1, 1, 4, 1, 3, + 0, 2, 0, 4, 2, 4, 4, 2, 3, 0, 1, 1, 1, 1, 3, 0, 4, 2, 3, 4, + 0, 0, 1, 2, 1, 1, 2, 4, 3, 1, 4, 2, 4, 4, 2, 4, 1, 2, 3, 3, + 1, 0, 2, 3, 4, 2, 3, 2, 2, 0, 0, 0, 4, 2, 3, 4, 4, 0, 4, 1, + 4, 2, 1, 1, 1, 1, 4, 3, 4, 2, 3, 0, 0, 3, 0, 2, 3, 0, 2, 4, + 4, 2, 4, 3, 0, 4, 0, 2, 3, 1, 4, 1, 3, 1, 0, 0, 2, 1, 3, 2, + 3, 1, 0, 3, 1, 3, 4, 2, 4, 4, 3, 2, 0, 2, 0, 1, 2, 0, 1, 4 +}; + +static const uint8 kCopyProtectionObfuscate[4] = { + 1, 0, 2, 3 +}; + namespace Gob { namespace OnceUpon { @@ -37,6 +57,10 @@ Abracadabra::~Abracadabra() { void Abracadabra::run() { init(); + bool correctCP = doCopyProtection(kCopyProtectionColors, kCopyProtectionShapes, kCopyProtectionObfuscate); + if (_vm->shouldQuit() || !correctCP) + return; + warning("TODO: Abracadabra::run()"); } diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 9f4f53c4e0..aad1fc6aca 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -22,8 +22,28 @@ #include "common/textconsole.h" +#include "gob/gob.h" + #include "gob/pregob/onceupon/babayaga.h" +static const uint8 kCopyProtectionColors[7] = { + 14, 11, 13, 1, 7, 12, 2 +}; + +static const uint8 kCopyProtectionShapes[7 * 20] = { + 0, 0, 1, 2, 1, 1, 2, 4, 3, 1, 4, 2, 4, 4, 2, 4, 1, 2, 3, 3, + 3, 1, 0, 3, 1, 3, 4, 2, 4, 4, 3, 2, 0, 2, 0, 1, 2, 0, 1, 4, + 1, 0, 2, 3, 4, 2, 3, 2, 2, 0, 0, 0, 4, 2, 3, 4, 4, 0, 4, 1, + 0, 2, 0, 4, 2, 4, 4, 2, 3, 0, 1, 1, 1, 1, 3, 0, 4, 2, 3, 4, + 3, 4, 3, 0, 1, 2, 0, 2, 2, 0, 2, 4, 0, 3, 4, 1, 1, 4, 1, 3, + 4, 2, 1, 1, 1, 1, 4, 3, 4, 2, 3, 0, 0, 3, 0, 2, 3, 0, 2, 4, + 4, 2, 4, 3, 0, 4, 0, 2, 3, 1, 4, 1, 3, 1, 0, 0, 2, 1, 3, 2 +}; + +static const uint8 kCopyProtectionObfuscate[4] = { + 0, 1, 2, 3 +}; + namespace Gob { namespace OnceUpon { @@ -37,6 +57,10 @@ BabaYaga::~BabaYaga() { void BabaYaga::run() { init(); + bool correctCP = doCopyProtection(kCopyProtectionColors, kCopyProtectionShapes, kCopyProtectionObfuscate); + if (_vm->shouldQuit() || !correctCP) + return; + warning("TODO: BabaYaga::run()"); } diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index adea776297..aa85e1c095 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -27,6 +27,8 @@ #include "gob/surface.h" #include "gob/draw.h" #include "gob/video.h" +#include "gob/anifile.h" +#include "gob/aniobject.h" #include "gob/pregob/onceupon/onceupon.h" @@ -163,6 +165,62 @@ static const byte kGamePalettes[kPaletteCount][3 * kPaletteSize] = { } }; +static const uint kLanguageCount = 5; + +static const uint kCopyProtectionHelpStringCount = 3; + +static const char *kCopyProtectionHelpStrings[kLanguageCount][kCopyProtectionHelpStringCount] = { + { // French + "Consulte le livret des animaux, rep\212re la", + "page correspondant \205 la couleur de l\'\202cran", + "et clique le symbole associ\202 \205 l\'animal affich\202.", + }, + { // German + "Suche im Tieralbum die Seite, die der Farbe auf", + "dem Bildschirm entspricht und klicke auf das", + "Tiersymbol.", + }, + { // English + "Consult the book of animals, find the page", + "corresponding to the colour of screen and click", + "the symbol associated with the animal displayed.", + }, + { // Spanish + "Consulta el libro de los animales, localiza la ", + "p\240gina que corresponde al color de la pantalla.", + "Cliquea el s\241mbolo asociado al animal que aparece.", + }, + { // Italian + "Guarda il libretto degli animali, trova la", + "pagina che corrisponde al colore dello schermo,", + "clicca il simbolo associato all\'animale presentato", + } +}; + +static const char *kCopyProtectionWrongStrings[kLanguageCount] = { + "Tu t\'es tromp\202, dommage...", // French + "Schade, du hast dich geirrt." , // German + "You are wrong, what a pity!" , // English + "Te equivocas, l\240stima..." , // Spanish + "Sei Sbagliato, peccato..." // Italian +}; + +static const uint kCopyProtectionShapeCount = 5; + +static const int16 kCopyProtectionShapeCoords[kCopyProtectionShapeCount][6] = { + { 0, 51, 26, 75, 60, 154}, + { 28, 51, 58, 81, 96, 151}, + { 60, 51, 94, 79, 136, 152}, + { 96, 51, 136, 71, 180, 155}, + {140, 51, 170, 77, 228, 153} +}; + +enum ClownAnimation { + kClownAnimationClownCheer = 0, + kClownAnimationClownStand = 1, + kClownAnimationClownCry = 6 +}; + namespace Gob { namespace OnceUpon { @@ -240,6 +298,195 @@ void OnceUpon::setGamePalette(uint palette) { setPalette(kGamePalettes[palette], kPaletteSize); } +enum CopyProtectionState { + kCPStateSetup, // Set up the screen + kCPStateWaitUser, // Waiting for the user to pick a shape + kCPStateWaitClown, // Waiting for the clown animation to finish + kCPStateFinish // Finishing +}; + +bool OnceUpon::doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]) { + fadeOut(); + setCopyProtectionPalette(); + + Surface sprites[2] = {Surface(320, 200, 1), Surface(320, 200, 1)}; + + _vm->_video->drawPackedSprite("grille1.cmp", sprites[0]); + _vm->_video->drawPackedSprite("grille2.cmp", sprites[1]); + + ANIFile ani (_vm, "grille.ani", 320); + ANIObject clown(ani); + + setCursor(sprites[1], 5, 110, 20, 134, 3, 0); + + CopyProtectionState state = kCPStateSetup; + + uint8 triesLeft = 2; + int8 animalShape = -1; + bool hasCorrect = false; + + while (!_vm->shouldQuit() && (state != kCPStateFinish)) { + clearAnim(clown); + + // Set up the screen + if (state == kCPStateSetup) { + animalShape = cpSetup(colors, shapes, obfuscate, sprites); + + setAnimState(clown, kClownAnimationClownStand, false, false); + state = kCPStateWaitUser; + } + + drawAnim(clown); + + // If we're waiting for the clown and he finished, evaluate if we're finished + if (!clown.isVisible() && (state == kCPStateWaitClown)) + state = (hasCorrect || (--triesLeft == 0)) ? kCPStateFinish : kCPStateSetup; + + showCursor(); + fadeIn(); + + endFrame(true); + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + checkInput(mouseX, mouseY, mouseButtons); + + if (state == kCPStateWaitUser) { + // Look if we clicked a shaped and got it right + + int8 guessedShape = -1; + if (mouseButtons == kMouseButtonsLeft) + guessedShape = cpFindShape(mouseX, mouseY); + + if (guessedShape >= 0) { + hasCorrect = guessedShape == animalShape; + animalShape = -1; + + setAnimState(clown, hasCorrect ? kClownAnimationClownCheer : kClownAnimationClownCry, true, false); + state = kCPStateWaitClown; + } + } + } + + fadeOut(); + hideCursor(); + clearScreen(); + + // Display the "You are wrong" screen + if (!hasCorrect) + cpWrong(); + + return hasCorrect; +} + +int8 OnceUpon::cpSetup(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4], + const Surface sprites[2]) { + + fadeOut(); + hideCursor(); + + // Get a random animal and animal color + int8 animalColor = _vm->_util->getRandom(7); + while ((colors[animalColor] == 1) || (colors[animalColor] == 7) || (colors[animalColor] == 11)) + animalColor = _vm->_util->getRandom(7); + + int8 animal = _vm->_util->getRandom(20); + + int8 animalShape = shapes[animalColor * 20 + animal]; + if (animal < 4) + animal = obfuscate[animal]; + + // Get the position of the animal sprite + int16 animalLeft = (animal % 4) * 80; + int16 animalTop = (animal / 4) * 50; + + uint8 sprite = 0; + if (animalTop >= 200) { + animalTop -= 200; + sprite = 1; + } + + int16 animalRight = animalLeft + 80 - 1; + int16 animalBottom = animalTop + 50 - 1; + + // Fill with the animal color + _vm->_draw->_backSurface->fill(colors[animalColor]); + + // Print the help line strings + for (uint i = 0; i < kCopyProtectionHelpStringCount; i++) { + const char * const helpString = kCopyProtectionHelpStrings[_vm->_global->_language][i]; + + const int x = 160 - (strlen(helpString) * _plettre->getCharWidth()) / 2; + const int y = i * 10 + 5; + + _plettre->drawString(helpString, x, y, 8, 0, true, *_vm->_draw->_backSurface); + } + + // White rectangle with black border + _vm->_draw->_backSurface->fillRect( 93, 43, 226, 134, 15); + _vm->_draw->_backSurface->drawRect( 92, 42, 227, 135, 0); + + // Draw the animal in the animal color + _vm->_draw->_backSurface->fillRect(120, 63, 199, 112, colors[animalColor]); + _vm->_draw->_backSurface->blit(sprites[sprite], animalLeft, animalTop, animalRight, animalBottom, 120, 63, 0); + + // Draw the shapes + for (uint i = 0; i < kCopyProtectionShapeCount; i++) { + const int16 * const coords = kCopyProtectionShapeCoords[i]; + + _vm->_draw->_backSurface->blit(sprites[1], coords[0], coords[1], coords[2], coords[3], coords[4], coords[5], 0); + } + + _vm->_draw->forceBlit(); + + return animalShape; +} + +int8 OnceUpon::cpFindShape(int16 x, int16 y) const { + // Look through all shapes and check if the coordinates are inside one of them + for (uint i = 0; i < kCopyProtectionShapeCount; i++) { + const int16 * const coords = kCopyProtectionShapeCoords[i]; + + const int16 left = coords[4]; + const int16 top = coords[5]; + const int16 right = coords[4] + (coords[2] - coords[0] + 1) - 1; + const int16 bottom = coords[5] + (coords[3] - coords[1] + 1) - 1; + + if ((x >= left) && (x <= right) && (y >= top) && (y <= bottom)) + return i; + } + + return -1; +} + +void OnceUpon::cpWrong() { + // Display the "You are wrong" string, centered + + const char * const wrongString = kCopyProtectionWrongStrings[_vm->_global->_language]; + const int wrongX = 160 - (strlen(wrongString) * _plettre->getCharWidth()) / 2; + + _vm->_draw->_backSurface->clear(); + _plettre->drawString(wrongString, wrongX, 100, 15, 0, true, *_vm->_draw->_backSurface); + + _vm->_draw->forceBlit(); + + fadeIn(); + + waitInput(); + + fadeOut(); + clearScreen(); +} + +void OnceUpon::setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const { + ani.setAnimation(state); + ani.setMode(once ? ANIObject::kModeOnce : ANIObject::kModeContinuous); + ani.setPause(pause); + ani.setVisible(true); + ani.setPosition(); +} + } // End of namespace OnceUpon } // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index cfc12532dd..abcde68b81 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -32,6 +32,8 @@ namespace Gob { class Surface; class Font; +class ANIObject; + namespace OnceUpon { class OnceUpon : public PreGob { @@ -45,6 +47,8 @@ protected: void setGamePalette(uint palette); + bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); + Font *_jeudak; Font *_lettre; @@ -54,6 +58,13 @@ protected: private: void setCopyProtectionPalette(); + void setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const; + + // Copy protection helpers + int8 cpSetup(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4], const Surface sprites[2]); + int8 cpFindShape(int16 x, int16 y) const; + void cpWrong(); + bool _openedArchives; }; -- cgit v1.2.3 From 67d7c3f11fdaf697f7f3c3779643121793ba4eb7 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 29 Jun 2012 19:24:54 +0200 Subject: GOB: Show a mock-up of the Once Upon A Time title The actual intro is described in a SEQ file. We don't support those yet. --- engines/gob/pregob/onceupon/abracadabra.cpp | 2 +- engines/gob/pregob/onceupon/babayaga.cpp | 2 +- engines/gob/pregob/onceupon/onceupon.cpp | 87 +++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 7 +++ 4 files changed, 96 insertions(+), 2 deletions(-) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index d8dd8b3be0..8ece3d1c27 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -61,7 +61,7 @@ void Abracadabra::run() { if (_vm->shouldQuit() || !correctCP) return; - warning("TODO: Abracadabra::run()"); + showTitle(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index aad1fc6aca..1eb603492b 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -61,7 +61,7 @@ void BabaYaga::run() { if (_vm->shouldQuit() || !correctCP) return; - warning("TODO: BabaYaga::run()"); + showTitle(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index aa85e1c095..a5d05ce8c3 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -30,6 +30,8 @@ #include "gob/anifile.h" #include "gob/aniobject.h" +#include "gob/sound/sound.h" + #include "gob/pregob/onceupon/onceupon.h" static const int kPaletteSize = 16; @@ -487,6 +489,91 @@ void OnceUpon::setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) ani.setPosition(); } +void OnceUpon::showTitle() { + // Show the Once Upon A Time title animation + // NOTE: This is currently only a mock-up. The real animation is in "ville.seq". + + fadeOut(); + setGamePalette(10); + + warning("OnceUpon::showTitle(): Actually play the SEQ"); + + clearScreen(); + + _vm->_video->drawPackedSprite("ville.cmp", *_vm->_draw->_backSurface); + _vm->_draw->forceBlit(); + + ANIFile ani (_vm, "pres.ani", 320); + ANIObject title(ani); + + setAnimState(title, 8, false, false); + + playTitleMusic(); + + while (!_vm->shouldQuit()) { + redrawAnim(title); + + fadeIn(); + + endFrame(true); + + if (hasInput()) + break; + } + + fadeOut(); + stopTitleMusic(); +} + +void OnceUpon::playTitleMusic() { + if (_vm->getPlatform() == Common::kPlatformPC) + playTitleMusicDOS(); + else if (_vm->getPlatform() == Common::kPlatformAmiga) + playTitleMusicAmiga(); + else if (_vm->getPlatform() == Common::kPlatformAtariST) + playTitleMusicAtariST(); +} + +void OnceUpon::playTitleMusicDOS() { + // Play an AdLib track + + _vm->_sound->adlibLoadTBR("babayaga.tbr"); + _vm->_sound->adlibLoadMDY("babayaga.mdy"); + _vm->_sound->adlibSetRepeating(-1); + _vm->_sound->adlibPlay(); +} + +void OnceUpon::playTitleMusicAmiga() { + // Play a Protracker track + + _vm->_sound->protrackerPlay("mod.babayaga"); +} + +void OnceUpon::playTitleMusicAtariST() { + // Play a Soundblaster composition + + static const int16 titleMusic[21] = { 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, -1}; + static const char * const titleFiles[ 3] = {"baba1.snd", "baba2.snd", "baba3.snd"}; + + for (uint i = 0; i < ARRAYSIZE(titleFiles); i++) + _vm->_sound->sampleLoad(_vm->_sound->sampleGetBySlot(i), SOUND_SND, titleFiles[i]); + + _vm->_sound->blasterPlayComposition(titleMusic, 0); + _vm->_sound->blasterRepeatComposition(-1); +} + +void OnceUpon::stopTitleMusic() { + _vm->_sound->adlibSetRepeating(0); + _vm->_sound->blasterRepeatComposition(0); + + _vm->_sound->adlibStop(); + _vm->_sound->blasterStopComposition(); + _vm->_sound->protrackerStop(); + + for (int i = 0; i < Sound::kSoundsCount; i++) + _vm->_sound->sampleFree(_vm->_sound->sampleGetBySlot(i)); +} + } // End of namespace OnceUpon } // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index abcde68b81..8b454e01f3 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -49,6 +49,8 @@ protected: bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); + void showTitle(); + Font *_jeudak; Font *_lettre; @@ -65,6 +67,11 @@ private: int8 cpFindShape(int16 x, int16 y) const; void cpWrong(); + void playTitleMusic(); + void playTitleMusicDOS(); + void playTitleMusicAmiga(); + void playTitleMusicAtariST(); + void stopTitleMusic(); bool _openedArchives; }; -- cgit v1.2.3 From 9af01cd58417e796b82cf6bb36e1bd30b0875f0e Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Fri, 6 Jul 2012 06:50:04 +0200 Subject: GOB: Move the background saving into its own class BackBuffer --- engines/gob/aniobject.cpp | 73 +++++++++------------------------ engines/gob/aniobject.h | 11 ++--- engines/gob/backbuffer.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++++ engines/gob/backbuffer.h | 59 ++++++++++++++++++++++++++ engines/gob/module.mk | 1 + 5 files changed, 182 insertions(+), 62 deletions(-) create mode 100644 engines/gob/backbuffer.cpp create mode 100644 engines/gob/backbuffer.h diff --git a/engines/gob/aniobject.cpp b/engines/gob/aniobject.cpp index 8d739fb3a4..8d3a6897bf 100644 --- a/engines/gob/aniobject.cpp +++ b/engines/gob/aniobject.cpp @@ -28,23 +28,20 @@ namespace Gob { ANIObject::ANIObject(const ANIFile &ani) : _ani(&ani), _cmp(0), - _visible(false), _paused(false), _mode(kModeContinuous), - _x(0), _y(0), _background(0), _drawn(false) { + _visible(false), _paused(false), _mode(kModeContinuous), _x(0), _y(0) { setAnimation(0); setPosition(); } ANIObject::ANIObject(const CMPFile &cmp) : _ani(0), _cmp(&cmp), - _visible(false), _paused(false), _mode(kModeContinuous), - _x(0), _y(0), _background(0), _drawn(false) { + _visible(false), _paused(false), _mode(kModeContinuous), _x(0), _y(0) { setAnimation(0); setPosition(); } ANIObject::~ANIObject() { - delete _background; } void ANIObject::setVisible(bool visible) { @@ -188,46 +185,36 @@ bool ANIObject::draw(Surface &dest, int16 &left, int16 &top, bool ANIObject::drawCMP(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { - if (!_background) { + if (!hasBuffer()) { uint16 width, height; _cmp->getMaxSize(width, height); - _background = new Surface(width, height, dest.getBPP()); + resizeBuffer(width, height); } - const uint16 cR = _cmp->getWidth (_animation) - 1; - const uint16 cB = _cmp->getHeight(_animation) - 1; + left = _x; + top = _y; + right = _x + _cmp->getWidth (_animation) - 1; + bottom = _y + _cmp->getHeight(_animation) - 1; - _backgroundLeft = CLIP( + _x, 0, dest.getWidth () - 1); - _backgroundTop = CLIP( + _y, 0, dest.getHeight() - 1); - _backgroundRight = CLIP(cR + _x, 0, dest.getWidth () - 1); - _backgroundBottom = CLIP(cB + _y, 0, dest.getHeight() - 1); - - _background->blit(dest, _backgroundLeft , _backgroundTop, - _backgroundRight, _backgroundBottom, 0, 0); + if (!saveScreen(dest, left, top, right, bottom)) + return false; _cmp->draw(dest, _animation, _x, _y, 0); - _drawn = true; - - left = _backgroundLeft; - top = _backgroundTop; - right = _backgroundRight; - bottom = _backgroundBottom; - return true; } bool ANIObject::drawANI(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { - if (!_background) { + if (!hasBuffer()) { uint16 width, height; _ani->getMaxSize(width, height); - _background = new Surface(width, height, dest.getBPP()); + resizeBuffer(width, height); } const ANIFile::Animation &animation = _ani->getAnimationInfo(_animation); @@ -236,45 +223,23 @@ bool ANIObject::drawANI(Surface &dest, int16 &left, int16 &top, const ANIFile::FrameArea &area = animation.frameAreas[_frame]; - _backgroundLeft = CLIP(area.left + _x, 0, dest.getWidth () - 1); - _backgroundTop = CLIP(area.top + _y, 0, dest.getHeight() - 1); - _backgroundRight = CLIP(area.right + _x, 0, dest.getWidth () - 1); - _backgroundBottom = CLIP(area.bottom + _y, 0, dest.getHeight() - 1); + left = _x + area.left; + top = _y + area.top; + right = _x + area.right; + bottom = _y + area.bottom; - _background->blit(dest, _backgroundLeft , _backgroundTop, - _backgroundRight, _backgroundBottom, 0, 0); + if (!saveScreen(dest, left, top, right, bottom)) + return false; _ani->draw(dest, _animation, _frame, _x, _y); - _drawn = true; - - left = _backgroundLeft; - top = _backgroundTop; - right = _backgroundRight; - bottom = _backgroundBottom; - return true; } bool ANIObject::clear(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { - if (!_drawn) - return false; - - const int16 bgRight = _backgroundRight - _backgroundLeft; - const int16 bgBottom = _backgroundBottom - _backgroundTop; - - dest.blit(*_background, 0, 0, bgRight, bgBottom, _backgroundLeft, _backgroundTop); - - _drawn = false; - - left = _backgroundLeft; - top = _backgroundTop; - right = _backgroundRight; - bottom = _backgroundBottom; - - return true; + return restoreScreen(dest, left, top, right, bottom); } void ANIObject::advance() { diff --git a/engines/gob/aniobject.h b/engines/gob/aniobject.h index 00f42b43ce..3c374f7b8f 100644 --- a/engines/gob/aniobject.h +++ b/engines/gob/aniobject.h @@ -25,6 +25,8 @@ #include "common/system.h" +#include "gob/backbuffer.h" + namespace Gob { class ANIFile; @@ -32,7 +34,7 @@ class CMPFile; class Surface; /** An ANI object, controlling an animation within an ANI file. */ -class ANIObject { +class ANIObject : public BackBuffer { public: enum Mode { kModeContinuous, ///< Play the animation continuously. @@ -118,13 +120,6 @@ private: int16 _x; ///< The current X position. int16 _y; ///< The current Y position. - Surface *_background; ///< The saved background. - bool _drawn; ///< Was the animation drawn? - - int16 _backgroundLeft; ///< The left position of the saved background. - int16 _backgroundTop; ///< The top of the saved background. - int16 _backgroundRight; ///< The right position of the saved background. - int16 _backgroundBottom; ///< The bottom position of the saved background. bool drawCMP(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); bool drawANI(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); diff --git a/engines/gob/backbuffer.cpp b/engines/gob/backbuffer.cpp new file mode 100644 index 0000000000..752042d46e --- /dev/null +++ b/engines/gob/backbuffer.cpp @@ -0,0 +1,100 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/util.h" + +#include "gob/backbuffer.h" +#include "gob/surface.h" + +namespace Gob { + +BackBuffer::BackBuffer() : _background(0), _saved(false) { +} + +BackBuffer::~BackBuffer() { + delete _background; +} + +bool BackBuffer::hasBuffer() const { + return _background != 0; +} + +bool BackBuffer::hasSavedBackground() const { + return _saved; +} + +void BackBuffer::trashBuffer() { + _saved = false; +} + +void BackBuffer::resizeBuffer(uint16 width, uint16 height) { + trashBuffer(); + + if (_background && (_background->getWidth() == width) && (_background->getHeight() == height)) + return; + + delete _background; + + _background = new Surface(width, height, 1); +} + +bool BackBuffer::saveScreen(const Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { + if (!_background) + return false; + + const int16 width = MIN(right - left + 1, _background->getWidth ()); + const int16 height = MIN(bottom - top + 1, _background->getHeight()); + if ((width <= 0) || (height <= 0)) + return false; + + right = left + width - 1; + bottom = top + height - 1; + + _saveLeft = left; + _saveTop = top; + _saveRight = right; + _saveBottom = bottom; + + _background->blit(dest, _saveLeft, _saveTop, _saveRight, _saveBottom, 0, 0); + + _saved = true; + + return true; +} + +bool BackBuffer::restoreScreen(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { + if (!_saved) + return false; + + left = _saveLeft; + top = _saveTop; + right = _saveRight; + bottom = _saveBottom; + + dest.blit(*_background, 0, 0, right - left, bottom - top, left, top); + + _saved = false; + + return true; +} + +} // End of namespace Gob diff --git a/engines/gob/backbuffer.h b/engines/gob/backbuffer.h new file mode 100644 index 0000000000..c978689e9f --- /dev/null +++ b/engines/gob/backbuffer.h @@ -0,0 +1,59 @@ +/* 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 GOB_BACKBUFFER_H +#define GOB_BACKBUFFER_H + +#include "common/system.h" + +namespace Gob { + +class Surface; + +class BackBuffer { +public: + BackBuffer(); + ~BackBuffer(); + +protected: + void trashBuffer(); + void resizeBuffer(uint16 width, uint16 height); + + bool saveScreen (const Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); + bool restoreScreen( Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); + + bool hasBuffer() const; + bool hasSavedBackground() const; + +private: + Surface *_background; ///< The saved background. + bool _saved; ///< Was the background saved? + + int16 _saveLeft; ///< The left position of the saved background. + int16 _saveTop; ///< The top of the saved background. + int16 _saveRight; ///< The right position of the saved background. + int16 _saveBottom; ///< The bottom position of the saved background. +}; + +} // End of namespace Gob + +#endif // GOB_BACKBUFFER_H diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 8a792049e8..2169602e1b 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -3,6 +3,7 @@ MODULE := engines/gob MODULE_OBJS := \ anifile.o \ aniobject.o \ + backbuffer.o \ cheater.o \ cheater_geisha.o \ cmpfile.o \ -- cgit v1.2.3 From 4b3aa88c8aaaec4f13435c46a7a3cf4ef00a08df Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 30 Jun 2012 00:41:55 +0200 Subject: GOB: Add a simple class for PreGob TXT files --- engines/gob/module.mk | 1 + engines/gob/pregob/pregob.cpp | 13 +++ engines/gob/pregob/pregob.h | 4 + engines/gob/pregob/txtfile.cpp | 232 +++++++++++++++++++++++++++++++++++++++++ engines/gob/pregob/txtfile.h | 91 ++++++++++++++++ 5 files changed, 341 insertions(+) create mode 100644 engines/gob/pregob/txtfile.cpp create mode 100644 engines/gob/pregob/txtfile.h diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 2169602e1b..f8b477b92b 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -79,6 +79,7 @@ MODULE_OBJS := \ demos/batplayer.o \ detection/detection.o \ pregob/pregob.o \ + pregob/txtfile.o \ pregob/onceupon/onceupon.o \ pregob/onceupon/abracadabra.o \ pregob/onceupon/babayaga.o \ diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index b9c36d7cf8..98b1a2e6b8 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -26,6 +26,7 @@ #include "gob/global.h" #include "gob/util.h" #include "gob/surface.h" +#include "gob/dataio.h" #include "gob/palanim.h" #include "gob/draw.h" #include "gob/video.h" @@ -202,4 +203,16 @@ void PreGob::redrawAnim(ANIObject &ani) { drawAnim(ani); } +TXTFile *PreGob::loadTXT(const Common::String &txtFile, TXTFile::Format format) const { + Common::SeekableReadStream *txtStream = _vm->_dataIO->getFile(txtFile); + if (!txtStream) + error("PreGob::loadTXT(): Failed to open \"%s\"", txtFile.c_str()); + + TXTFile *txt = new TXTFile(*txtStream, format); + + delete txtStream; + + return txt; +} + } // End of namespace Gob diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index 9efdbe8df6..d087bb0d0c 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -25,6 +25,8 @@ #include "gob/util.h" +#include "gob/pregob/txtfile.h" + namespace Gob { class GobEngine; @@ -77,6 +79,8 @@ protected: void drawAnim(ANIObject &ani); void redrawAnim(ANIObject &ani); + TXTFile *loadTXT(const Common::String &txtFile, TXTFile::Format format) const; + GobEngine *_vm; diff --git a/engines/gob/pregob/txtfile.cpp b/engines/gob/pregob/txtfile.cpp new file mode 100644 index 0000000000..3ff0d4b039 --- /dev/null +++ b/engines/gob/pregob/txtfile.cpp @@ -0,0 +1,232 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/stream.h" + +#include "gob/draw.h" + +#include "gob/pregob/txtfile.h" + +namespace Gob { + +TXTFile::TXTFile(Common::SeekableReadStream &txt, Format format) { + load(txt, format); +} + +TXTFile::~TXTFile() { +} + +TXTFile::LineArray &TXTFile::getLines() { + return _lines; +} + +void TXTFile::load(Common::SeekableReadStream &txt, Format format) { + if (format == kFormatStringPositionColorFont) { + int numLines = getInt(txt); + + _lines.reserve(numLines); + } + + while (!txt.eos()) { + Line line; + + line.text = getStr(txt); + line.x = (format >= kFormatStringPosition) ? getInt(txt) : 0; + line.y = (format >= kFormatStringPosition) ? getInt(txt) : 0; + line.color = (format >= kFormatStringPositionColor) ? getInt(txt) : 0; + line.font = (format >= kFormatStringPositionColorFont) ? getInt(txt) : 0; + + _lines.push_back(line); + } + + while (!_lines.empty() && _lines.back().text.empty()) + _lines.pop_back(); +} + +bool TXTFile::draw(Surface &surface, int16 &left, int16 &top, int16 &right, int16 &bottom, + const Font * const *fonts, uint fontCount, int color) { + + trashBuffer(); + + if (!getArea(left, top, right, bottom, fonts, fontCount)) + return false; + + resizeBuffer(right - left + 1, bottom - top + 1); + saveScreen(surface, left, top, right, bottom); + + for (LineArray::const_iterator l = _lines.begin(); l != _lines.end(); ++l) { + if (l->font >= fontCount) + continue; + + fonts[l->font]->drawString(l->text, l->x, l->y, (color < 0) ? l->color : color, 0, true, surface); + } + + return true; +} + +bool TXTFile::draw(uint line, Surface &surface, int16 &left, int16 &top, int16 &right, int16 &bottom, + const Font * const *fonts, uint fontCount, int color) { + + trashBuffer(); + + if (!getArea(line, left, top, right, bottom, fonts, fontCount)) + return false; + + resizeBuffer(right - left + 1, bottom - top + 1); + saveScreen(surface, left, top, right, bottom); + + const Line &l = _lines[line]; + + fonts[l.font]->drawString(l.text, l.x, l.y, (color < 0) ? l.color : color, 0, true, surface); + + return true; +} + +bool TXTFile::draw(Surface &surface, const Font * const *fonts, uint fontCount, int color) { + int16 left, top, right, bottom; + + return draw(surface, left, top, right, bottom, fonts, fontCount, color); +} + +bool TXTFile::draw(uint line, Surface &surface, const Font * const *fonts, uint fontCount, int color) { + int16 left, top, right, bottom; + + return draw(line, surface, left, top, right, bottom, fonts, fontCount, color); +} + +bool TXTFile::clear(Surface &surface, int16 &left, int16 &top, int16 &right, int16 &bottom) { + return restoreScreen(surface, left, top, right, bottom); +} + +bool TXTFile::getArea(int16 &left, int16 &top, int16 &right, int16 &bottom, + const Font * const *fonts, uint fontCount) const { + + bool hasLine = false; + + left = 0x7FFF; + top = 0x7FFF; + right = 0x0000; + bottom = 0x0000; + + for (uint i = 0; i < _lines.size(); i++) { + int16 lLeft, lTop, lRight, lBottom; + + if (getArea(i, lLeft, lTop, lRight, lBottom, fonts, fontCount)) { + left = MIN(left , lLeft ); + top = MIN(top , lTop ); + right = MAX(right , lRight ); + bottom = MAX(bottom, lBottom); + + hasLine = true; + } + } + + return hasLine; +} + +bool TXTFile::getArea(uint line, int16 &left, int16 &top, int16 &right, int16 &bottom, + const Font * const *fonts, uint fontCount) const { + + + if ((line >= _lines.size()) || (_lines[line].font >= fontCount)) + return false; + + const Line &l = _lines[line]; + + left = l.x; + top = l.y; + right = l.x + l.text.size() * fonts[l.font]->getCharWidth() - 1; + bottom = l.y + fonts[l.font]->getCharHeight() - 1; + + return true; +} + +Common::String TXTFile::getStr(Common::SeekableReadStream &txt) { + // Skip all ' ', '\n' and '\r' + while (!txt.eos()) { + char c = txt.readByte(); + if (txt.eos()) + break; + + if ((c != ' ') && (c != '\n') && (c != '\r')) { + txt.seek(-1, SEEK_CUR); + break; + } + } + + if (txt.eos()) + return ""; + + // Read string until ' ', '\n' or '\r' + Common::String string; + while (!txt.eos()) { + char c = txt.readByte(); + if ((c == ' ') || (c == '\n') || (c == '\r')) + break; + + string += c; + } + + // Replace all '#' with ' ' and throw out non-printables + Common::String cleanString; + + for (uint i = 0; i < string.size(); i++) { + if (string[i] == '#') + cleanString += ' '; + else if ((unsigned char)string[i] >= ' ') + cleanString += string[i]; + } + + return cleanString; +} + +int TXTFile::getInt(Common::SeekableReadStream &txt) { + // Skip all [^-0-9] + while (!txt.eos()) { + char c = txt.readByte(); + if (txt.eos()) + break; + + if ((c == '-') || ((c >= '0') && (c <= '9'))) { + txt.seek(-1, SEEK_CUR); + break; + } + } + + if (txt.eos()) + return 0; + + // Read until [^-0-9] + Common::String string; + while (!txt.eos()) { + char c = txt.readByte(); + if ((c != '-') && ((c < '0') || (c > '9'))) + break; + + string += c; + } + + // Convert to integer + return atoi(string.c_str()); +} + +} // End of namespace Gob diff --git a/engines/gob/pregob/txtfile.h b/engines/gob/pregob/txtfile.h new file mode 100644 index 0000000000..c623b58859 --- /dev/null +++ b/engines/gob/pregob/txtfile.h @@ -0,0 +1,91 @@ +/* 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 GOB_PREGOB_TXTFILE_H +#define GOB_PREGOB_TXTFILE_H + +#include "common/system.h" +#include "common/str.h" +#include "common/array.h" + +#include "gob/backbuffer.h" + +namespace Common { + class SeekableReadStream; +} + +namespace Gob { + +class Surface; +class Font; + +class TXTFile : public BackBuffer { +public: + enum Format { + kFormatString, + kFormatStringPosition, + kFormatStringPositionColor, + kFormatStringPositionColorFont + }; + + struct Line { + Common::String text; + int x, y; + int color; + uint font; + }; + + typedef Common::Array LineArray; + + TXTFile(Common::SeekableReadStream &txt, Format format); + ~TXTFile(); + + LineArray &getLines(); + + bool draw( Surface &surface, const Font * const *fonts, uint fontCount, int color = -1); + bool draw(uint line, Surface &surface, const Font * const *fonts, uint fontCount, int color = -1); + + bool draw( Surface &surface, int16 &left, int16 &top, int16 &right, int16 &bottom, + const Font * const *fonts, uint fontCount, int color = -1); + bool draw(uint line, Surface &surface, int16 &left, int16 &top, int16 &right, int16 &bottom, + const Font * const *fonts, uint fontCount, int color = -1); + + bool clear(Surface &surface, int16 &left, int16 &top, int16 &right, int16 &bottom); + +private: + LineArray _lines; + + void load(Common::SeekableReadStream &txt, Format format); + + Common::String getStr(Common::SeekableReadStream &txt); + int getInt(Common::SeekableReadStream &txt); + + + bool getArea( int16 &left, int16 &top, int16 &right, int16 &bottom, + const Font * const *fonts, uint fontCount) const; + bool getArea(uint line, int16 &left, int16 &top, int16 &right, int16 &bottom, + const Font * const *fonts, uint fontCount) const; +}; + +} // End of namespace Gob + +#endif // GOB_PREGOB_TXTFILE_H -- cgit v1.2.3 From 139b03c4bcafea260e79e3e83db897c71db41907 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 30 Jun 2012 01:23:21 +0200 Subject: GOB: Add a PreGob method to get a localized file name --- engines/gob/pregob/pregob.cpp | 9 +++++++++ engines/gob/pregob/pregob.h | 3 +++ 2 files changed, 12 insertions(+) diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 98b1a2e6b8..582ebc6677 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -34,6 +34,8 @@ #include "gob/pregob/pregob.h" +static char kLanguageSuffix[5] = { 't', 'g', 'a', 'e', 'i' }; + namespace Gob { PreGob::PreGob(GobEngine *vm) : _vm(vm), _fadedOut(false) { @@ -203,6 +205,13 @@ void PreGob::redrawAnim(ANIObject &ani) { drawAnim(ani); } +Common::String PreGob::getLocFile(const Common::String &file) const { + if (_vm->_global->_language >= ARRAYSIZE(kLanguageSuffix)) + return file; + + return file + kLanguageSuffix[_vm->_global->_language]; +} + TXTFile *PreGob::loadTXT(const Common::String &txtFile, TXTFile::Format format) const { Common::SeekableReadStream *txtStream = _vm->_dataIO->getFile(txtFile); if (!txtStream) diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index d087bb0d0c..902a7c437d 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -23,6 +23,8 @@ #ifndef GOB_PREGOB_PREGOB_H #define GOB_PREGOB_PREGOB_H +#include "common/str.h" + #include "gob/util.h" #include "gob/pregob/txtfile.h" @@ -79,6 +81,7 @@ protected: void drawAnim(ANIObject &ani); void redrawAnim(ANIObject &ani); + Common::String getLocFile(const Common::String &file) const; TXTFile *loadTXT(const Common::String &txtFile, TXTFile::Format format) const; -- cgit v1.2.3 From 60cebba95ca1d30f2926acd2d415d09c75e2bd42 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 30 Jun 2012 02:33:12 +0200 Subject: GOB: Show the Once Upon A Time wait/load screen --- engines/gob/pregob/onceupon/abracadabra.cpp | 4 ++++ engines/gob/pregob/onceupon/babayaga.cpp | 4 ++++ engines/gob/pregob/onceupon/onceupon.cpp | 17 +++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 1 + 4 files changed, 26 insertions(+) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 8ece3d1c27..27845cd1d5 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -61,6 +61,10 @@ void Abracadabra::run() { if (_vm->shouldQuit() || !correctCP) return; + showWait(); + if (_vm->shouldQuit()) + return; + showTitle(); } diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 1eb603492b..1dbda8227b 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -61,6 +61,10 @@ void BabaYaga::run() { if (_vm->shouldQuit() || !correctCP) return; + showWait(); + if (_vm->shouldQuit()) + return; + showTitle(); } diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index a5d05ce8c3..6f5d95b10c 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -489,6 +489,23 @@ void OnceUpon::setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) ani.setPosition(); } +void OnceUpon::showWait() { + // Show the loading floppy + + fadeOut(); + clearScreen(); + setGamePalette(10); + + Surface wait(320, 43, 1); + + _vm->_video->drawPackedSprite("wait.cmp", wait); + _vm->_draw->_backSurface->blit(wait, 0, 0, 72, 33, 122, 84); + + _vm->_draw->forceBlit(); + + fadeIn(); +} + void OnceUpon::showTitle() { // Show the Once Upon A Time title animation // NOTE: This is currently only a mock-up. The real animation is in "ville.seq". diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 8b454e01f3..99fb51431a 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -49,6 +49,7 @@ protected: bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); + void showWait(); void showTitle(); -- cgit v1.2.3 From 2f3aaf0e07a7309b2ba74c7e888b03c24534d4d0 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 30 Jun 2012 02:35:26 +0200 Subject: GOB: Show the Once Upon A Time fairytale quote --- engines/gob/pregob/onceupon/abracadabra.cpp | 4 ++++ engines/gob/pregob/onceupon/babayaga.cpp | 4 ++++ engines/gob/pregob/onceupon/onceupon.cpp | 22 ++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 1 + 4 files changed, 31 insertions(+) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 27845cd1d5..abf9fdce61 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -65,6 +65,10 @@ void Abracadabra::run() { if (_vm->shouldQuit()) return; + showQuote(); + if (_vm->shouldQuit()) + return; + showTitle(); } diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 1dbda8227b..9bca0e27d0 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -65,6 +65,10 @@ void BabaYaga::run() { if (_vm->shouldQuit()) return; + showQuote(); + if (_vm->shouldQuit()) + return; + showTitle(); } diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 6f5d95b10c..73322658de 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -506,6 +506,28 @@ void OnceUpon::showWait() { fadeIn(); } +void OnceUpon::showQuote() { + // Show the quote about fairytales + + fadeOut(); + clearScreen(); + setGamePalette(11); + + static const Font *fonts[3] = { _plettre, _glettre, _plettre }; + + TXTFile *quote = loadTXT(getLocFile("gene.tx"), TXTFile::kFormatStringPositionColorFont); + quote->draw(*_vm->_draw->_backSurface, fonts, ARRAYSIZE(fonts)); + delete quote; + + _vm->_draw->forceBlit(); + + fadeIn(); + + waitInput(); + + fadeOut(); +} + void OnceUpon::showTitle() { // Show the Once Upon A Time title animation // NOTE: This is currently only a mock-up. The real animation is in "ville.seq". diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 99fb51431a..97f7e6b77e 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -50,6 +50,7 @@ protected: bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); void showWait(); + void showQuote(); void showTitle(); -- cgit v1.2.3 From 92bd9c864ab5238aa51ad6a327cfb7249bcc934f Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 30 Jun 2012 03:04:29 +0200 Subject: GOB: Show the specific game title in Once Upon A Time --- engines/gob/pregob/onceupon/abracadabra.cpp | 14 ++++++++++++++ engines/gob/pregob/onceupon/babayaga.cpp | 14 ++++++++++++++ engines/gob/pregob/onceupon/onceupon.cpp | 27 +++++++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 1 + 4 files changed, 56 insertions(+) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index abf9fdce61..5c1bd0149b 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -57,19 +57,33 @@ Abracadabra::~Abracadabra() { void Abracadabra::run() { init(); + // Copy protection bool correctCP = doCopyProtection(kCopyProtectionColors, kCopyProtectionShapes, kCopyProtectionObfuscate); if (_vm->shouldQuit() || !correctCP) return; + // "Loading" showWait(); if (_vm->shouldQuit()) return; + // Quote about fairy tales showQuote(); if (_vm->shouldQuit()) return; + // Once Upon A Time title showTitle(); + if (_vm->shouldQuit()) + return; + + // Game title screen + showChapter(0); + if (_vm->shouldQuit()) + return; + + // "Loading" + showWait(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 9bca0e27d0..608d85e977 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -57,19 +57,33 @@ BabaYaga::~BabaYaga() { void BabaYaga::run() { init(); + // Copy protection bool correctCP = doCopyProtection(kCopyProtectionColors, kCopyProtectionShapes, kCopyProtectionObfuscate); if (_vm->shouldQuit() || !correctCP) return; + // "Loading" showWait(); if (_vm->shouldQuit()) return; + // Quote about fairy tales showQuote(); if (_vm->shouldQuit()) return; + // Once Upon A Time title showTitle(); + if (_vm->shouldQuit()) + return; + + // Game title screen + showChapter(0); + if (_vm->shouldQuit()) + return; + + // "Loading" + showWait(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 73322658de..6d185d007d 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -613,6 +613,33 @@ void OnceUpon::stopTitleMusic() { _vm->_sound->sampleFree(_vm->_sound->sampleGetBySlot(i)); } +void OnceUpon::showChapter(int chapter) { + // Display the intro text to a chapter + + fadeOut(); + clearScreen(); + setGamePalette(11); + + // Parchment background + _vm->_video->drawPackedSprite("parch.cmp", *_vm->_draw->_backSurface); + + static const Font *fonts[3] = { _plettre, _glettre, _plettre }; + + const Common::String chapterFile = getLocFile(Common::String::format("gene%d.tx", chapter)); + + TXTFile *gameTitle = loadTXT(chapterFile, TXTFile::kFormatStringPositionColorFont); + gameTitle->draw(*_vm->_draw->_backSurface, fonts, ARRAYSIZE(fonts)); + delete gameTitle; + + _vm->_draw->forceBlit(); + + fadeIn(); + + waitInput(); + + fadeOut(); +} + } // End of namespace OnceUpon } // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 97f7e6b77e..96f88cbb5f 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -52,6 +52,7 @@ protected: void showWait(); void showQuote(); void showTitle(); + void showChapter(int chapter); Font *_jeudak; -- cgit v1.2.3 From bccfdb559fccdf3eff86cea22495a50260b3ad90 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 30 Jun 2012 16:30:02 +0200 Subject: GOB: Move the intro parts into OnceUpon::showIntro() --- engines/gob/pregob/onceupon/abracadabra.cpp | 24 ++---------------------- engines/gob/pregob/onceupon/babayaga.cpp | 24 ++---------------------- engines/gob/pregob/onceupon/onceupon.cpp | 27 +++++++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 15 +++++++++++---- 4 files changed, 42 insertions(+), 48 deletions(-) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 5c1bd0149b..9db018c4aa 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -62,28 +62,8 @@ void Abracadabra::run() { if (_vm->shouldQuit() || !correctCP) return; - // "Loading" - showWait(); - if (_vm->shouldQuit()) - return; - - // Quote about fairy tales - showQuote(); - if (_vm->shouldQuit()) - return; - - // Once Upon A Time title - showTitle(); - if (_vm->shouldQuit()) - return; - - // Game title screen - showChapter(0); - if (_vm->shouldQuit()) - return; - - // "Loading" - showWait(); + // Show the intro + showIntro(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 608d85e977..8b80a38084 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -62,28 +62,8 @@ void BabaYaga::run() { if (_vm->shouldQuit() || !correctCP) return; - // "Loading" - showWait(); - if (_vm->shouldQuit()) - return; - - // Quote about fairy tales - showQuote(); - if (_vm->shouldQuit()) - return; - - // Once Upon A Time title - showTitle(); - if (_vm->shouldQuit()) - return; - - // Game title screen - showChapter(0); - if (_vm->shouldQuit()) - return; - - // "Loading" - showWait(); + // Show the intro + showIntro(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 6d185d007d..f2708b380b 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -506,6 +506,33 @@ void OnceUpon::showWait() { fadeIn(); } +void OnceUpon::showIntro() { + // Show all intro parts + + // "Loading" + showWait(); + if (_vm->shouldQuit()) + return; + + // Quote about fairy tales + showQuote(); + if (_vm->shouldQuit()) + return; + + // Once Upon A Time title + showTitle(); + if (_vm->shouldQuit()) + return; + + // Game title screen + showChapter(0); + if (_vm->shouldQuit()) + return; + + // "Loading" + showWait(); +} + void OnceUpon::showQuote() { // Show the quote about fairytales diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 96f88cbb5f..968c70ef48 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -49,12 +49,13 @@ protected: bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); - void showWait(); - void showQuote(); - void showTitle(); - void showChapter(int chapter); + void showWait(); ///< Show the wait / loading screen. + void showIntro(); ///< Show the whole intro. + void showChapter(int chapter); ///< Show a chapter intro text. + + // Fonts Font *_jeudak; Font *_lettre; Font *_plettre; @@ -70,12 +71,18 @@ private: int8 cpFindShape(int16 x, int16 y) const; void cpWrong(); + // Intro parts + void showQuote(); + void showTitle(); + + // Title music void playTitleMusic(); void playTitleMusicDOS(); void playTitleMusicAmiga(); void playTitleMusicAtariST(); void stopTitleMusic(); + bool _openedArchives; }; -- cgit v1.2.3 From 233a3f54fc3913669fd4c56a6c3a16da5aa5f5b6 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 30 Jun 2012 22:12:08 +0200 Subject: GOB: Stubbily implement the Once Upon A Time menus --- engines/gob/pregob/onceupon/abracadabra.cpp | 31 +++ engines/gob/pregob/onceupon/abracadabra.h | 6 + engines/gob/pregob/onceupon/babayaga.cpp | 31 +++ engines/gob/pregob/onceupon/babayaga.h | 6 + engines/gob/pregob/onceupon/onceupon.cpp | 403 +++++++++++++++++++++++++++- engines/gob/pregob/onceupon/onceupon.h | 71 ++++- 6 files changed, 541 insertions(+), 7 deletions(-) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 9db018c4aa..696e4d9594 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -48,7 +48,13 @@ namespace Gob { namespace OnceUpon { +const OnceUpon::MenuButton Abracadabra::kAnimalsButtons = { + true, 131, 127, 183, 164, 193, 0, 243, 35, 132, 128, 0 +}; + + Abracadabra::Abracadabra(GobEngine *vm) : OnceUpon(vm) { + setAnimalsButton(&kAnimalsButtons); } Abracadabra::~Abracadabra() { @@ -64,6 +70,31 @@ void Abracadabra::run() { // Show the intro showIntro(); + if (_vm->shouldQuit()) + return; + + mainLoop(); + + if (!_vm->shouldQuit()) + warning("Abracadabra::run(): TODO: Show \"Bye Bye\""); +} + +void Abracadabra::mainLoop() { + clearScreen(); + + MenuType mainMenu = kMenuTypeMainStart; + + while (!_vm->shouldQuit()) { + MenuAction action = doMenu(mainMenu); + if (action == kMenuActionPlay) + warning("Abracadabra::mainLoop(): TODO: Play"); + else if (action == kMenuActionRestart) + warning("Abracadabra::mainLoop(): TODO: Restart"); + else if (action == kMenuActionAnimals) + warning("Abracadabra::mainLoop(): TODO: Animals"); + else if (action == kMenuActionQuit) + break; + } } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/abracadabra.h b/engines/gob/pregob/onceupon/abracadabra.h index 855d2bf131..64deaf4389 100644 --- a/engines/gob/pregob/onceupon/abracadabra.h +++ b/engines/gob/pregob/onceupon/abracadabra.h @@ -35,6 +35,12 @@ public: ~Abracadabra(); void run(); + +private: + static const MenuButton kAnimalsButtons; + + + void mainLoop(); }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 8b80a38084..b752bb0862 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -48,7 +48,13 @@ namespace Gob { namespace OnceUpon { +const OnceUpon::MenuButton BabaYaga::kAnimalsButtons = { + true, 131, 127, 183, 164, 193, 0, 245, 37, 131, 127, 0 +}; + + BabaYaga::BabaYaga(GobEngine *vm) : OnceUpon(vm) { + setAnimalsButton(&kAnimalsButtons); } BabaYaga::~BabaYaga() { @@ -64,6 +70,31 @@ void BabaYaga::run() { // Show the intro showIntro(); + if (_vm->shouldQuit()) + return; + + mainLoop(); + + if (!_vm->shouldQuit()) + warning("BabaYaga::run(): TODO: Show \"Bye Bye\""); +} + +void BabaYaga::mainLoop() { + clearScreen(); + + MenuType mainMenu = kMenuTypeMainStart; + + while (!_vm->shouldQuit()) { + MenuAction action = doMenu(mainMenu); + if (action == kMenuActionPlay) + warning("BabaYaga::mainLoop(): TODO: Play"); + else if (action == kMenuActionRestart) + warning("BabaYaga::mainLoop(): TODO: Restart"); + else if (action == kMenuActionAnimals) + warning("BabaYaga::mainLoop(): TODO: Animals"); + else if (action == kMenuActionQuit) + break; + } } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.h b/engines/gob/pregob/onceupon/babayaga.h index b3339b0ca8..98d452418f 100644 --- a/engines/gob/pregob/onceupon/babayaga.h +++ b/engines/gob/pregob/onceupon/babayaga.h @@ -35,6 +35,12 @@ public: ~BabaYaga(); void run(); + +private: + static const MenuButton kAnimalsButtons; + + + void mainLoop(); }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index f2708b380b..67004d2912 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -227,8 +227,28 @@ namespace Gob { namespace OnceUpon { +const OnceUpon::MenuButton OnceUpon::kMainMenuDifficultyButton[3] = { + {false, 29, 18, 77, 57, 0, 0, 0, 0, 0, 0, 0}, + {false, 133, 18, 181, 57, 0, 0, 0, 0, 0, 0, 1}, + {false, 241, 18, 289, 57, 0, 0, 0, 0, 0, 0, 2}, +}; + +const OnceUpon::MenuButton OnceUpon::kSectionButtons[4] = { + {false, 27, 121, 91, 179, 0, 0, 0, 0, 0, 0, 0}, + { true, 95, 121, 159, 179, 4, 1, 56, 49, 100, 126, 2}, + { true, 163, 121, 227, 179, 64, 1, 120, 49, 168, 126, 6}, + { true, 231, 121, 295, 179, 128, 1, 184, 49, 236, 126, 10} +}; + +const OnceUpon::MenuButton OnceUpon::kIngameButtons[3] = { + {true, 108, 83, 139, 116, 0, 0, 31, 34, 108, 83, 0}, + {true, 144, 83, 175, 116, 36, 0, 67, 34, 144, 83, 1}, + {true, 180, 83, 211, 116, 72, 0, 103, 34, 180, 83, 2} +}; + + OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm), _jeudak(0), _lettre(0), _plettre(0), _glettre(0), - _openedArchives(false) { + _openedArchives(false), _animalsButton(0) { } @@ -267,6 +287,9 @@ void OnceUpon::init() { "Thanks", _vm->getLangDesc(_vm->_global->_language)); initScreen(); + + _difficulty = kDifficultyMAX; + _section = 0; } void OnceUpon::deinit() { @@ -289,6 +312,10 @@ void OnceUpon::deinit() { _openedArchives = false; } +void OnceUpon::setAnimalsButton(const MenuButton *animalsButton) { + _animalsButton = animalsButton; +} + void OnceUpon::setCopyProtectionPalette() { setPalette(kCopyProtectionPalette, kPaletteSize); } @@ -300,6 +327,14 @@ void OnceUpon::setGamePalette(uint palette) { setPalette(kGamePalettes[palette], kPaletteSize); } +void OnceUpon::setGameCursor() { + Surface cursor(320, 16, 1); + + _vm->_video->drawPackedSprite("icon.cmp", cursor); + + setCursor(cursor, 105, 0, 120, 15, 0, 0); +} + enum CopyProtectionState { kCPStateSetup, // Set up the screen kCPStateWaitUser, // Waiting for the user to pick a shape @@ -489,12 +524,12 @@ void OnceUpon::setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) ani.setPosition(); } -void OnceUpon::showWait() { +void OnceUpon::showWait(uint palette) { // Show the loading floppy fadeOut(); clearScreen(); - setGamePalette(10); + setGamePalette(palette); Surface wait(320, 43, 1); @@ -510,7 +545,7 @@ void OnceUpon::showIntro() { // Show all intro parts // "Loading" - showWait(); + showWait(10); if (_vm->shouldQuit()) return; @@ -530,7 +565,7 @@ void OnceUpon::showIntro() { return; // "Loading" - showWait(); + showWait(17); } void OnceUpon::showQuote() { @@ -667,6 +702,364 @@ void OnceUpon::showChapter(int chapter) { fadeOut(); } +OnceUpon::MenuAction OnceUpon::doMenu(MenuType type) { + bool cursorVisible = isCursorVisible(); + + // Set the cursor + addCursor(); + setGameCursor(); + + // Backup the screen + Surface screenBackup(320, 200, 1); + screenBackup.blit(*_vm->_draw->_backSurface); + + // Handle the specific menu + MenuAction action; + if (type == kMenuTypeMainStart) + action = doMenuMainStart(); + else if (type == kMenuTypeMainIngame) + action = doMenuMainIngame(); + else if (type == kMenuTypeIngame) + action = doMenuIngame(); + else + error("OnceUpon::doMenu(): No such menu %d", type); + + if (_vm->shouldQuit()) + return action; + + // The ingame menu cleans itself up in a special way + if (type == kMenuTypeIngame) + clearMenuIngame(screenBackup); + + // The main menus fade out + if ((type == kMenuTypeMainStart) || (type == kMenuTypeMainIngame)) + fadeOut(); + + // Restore the screen + _vm->_draw->_backSurface->blit(screenBackup); + _vm->_draw->forceBlit(); + + // Restore the cursor + if (!cursorVisible) + hideCursor(); + removeCursor(); + + return action; +} + +OnceUpon::MenuAction OnceUpon::doMenuMainStart() { + fadeOut(); + drawMenuMainStart(); + showCursor(); + fadeIn(); + + MenuAction action = kMenuActionNone; + while (!_vm->shouldQuit() && (action == kMenuActionNone)) { + endFrame(true); + + // Check user input + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + int16 key = checkInput(mouseX, mouseY, mouseButtons); + if (key == kKeyEscape) + // ESC -> Quit + return kMenuActionQuit; + + if (mouseButtons != kMouseButtonsLeft) + continue; + + // If we clicked on a difficulty button, show the selected difficulty and start the game + Difficulty difficulty = checkDifficultyButton(mouseX, mouseY); + if (difficulty < kDifficultyMAX) { + _difficulty = difficulty; + action = kMenuActionPlay; + + drawMenuMainStart(); + _vm->_util->longDelay(1000); + } + + if (checkAnimalsButton(mouseX, mouseY)) + action = kMenuActionAnimals; + + } + + return action; +} + +OnceUpon::MenuAction OnceUpon::doMenuMainIngame() { + fadeOut(); + drawMenuMainIngame(); + showCursor(); + fadeIn(); + + MenuAction action = kMenuActionNone; + while (!_vm->shouldQuit() && (action == kMenuActionNone)) { + endFrame(true); + + // Check user input + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + int16 key = checkInput(mouseX, mouseY, mouseButtons); + if (key == kKeyEscape) + // ESC -> Quit + return kMenuActionQuit; + + if (mouseButtons != kMouseButtonsLeft) + continue; + + // If we clicked on a difficulty button, change the current difficulty level + Difficulty difficulty = checkDifficultyButton(mouseX, mouseY); + if ((difficulty < kDifficultyMAX) && (_difficulty != difficulty)) { + _difficulty = difficulty; + + drawMenuMainIngame(); + } + + // If we clicked on a section button, restart the game from this section + int8 section = checkSectionButton(mouseX, mouseY); + if (section >= 0) { + _section = section; + action = kMenuActionRestart; + } + + } + + return action; +} + +OnceUpon::MenuAction OnceUpon::doMenuIngame() { + drawMenuIngame(); + showCursor(); + + MenuAction action = kMenuActionNone; + while (!_vm->shouldQuit() && (action == kMenuActionNone)) { + endFrame(true); + + // Check user input + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + int16 key = checkInput(mouseX, mouseY, mouseButtons); + if ((key == kKeyEscape) || (mouseButtons == kMouseButtonsRight)) + // ESC or right mouse button -> Dismiss the menu + action = kMenuActionPlay; + + if (mouseButtons != kMouseButtonsLeft) + continue; + + // Check if we've pressed one of the buttons + int8 button = checkIngameButton(mouseX, mouseY); + if (button == 0) + action = kMenuActionQuit; + else if (button == 1) + action = kMenuActionMainMenu; + else if (button == 2) + action = kMenuActionPlay; + + } + + return action; +} + +void OnceUpon::drawMenuMainStart() { + // Draw the background + _vm->_video->drawPackedSprite("menu2.cmp", *_vm->_draw->_backSurface); + + // Draw the "Listen to animal names" button + if (_animalsButton) { + Surface elements(320, 38, 1); + _vm->_video->drawPackedSprite("elemenu.cmp", elements); + _vm->_draw->_backSurface->fillRect(_animalsButton->left , _animalsButton->top, + _animalsButton->right, _animalsButton->bottom, 0); + _vm->_draw->_backSurface->blit(elements, + _animalsButton->srcLeft , _animalsButton->srcTop, + _animalsButton->srcRight, _animalsButton->srcBottom, + _animalsButton->dstX , _animalsButton->dstY); + } + + // Highlight the current difficulty + drawMenuDifficulty(); + + _vm->_draw->forceBlit(); +} + +void OnceUpon::drawMenuMainIngame() { + // Draw the background + _vm->_video->drawPackedSprite("menu.cmp", *_vm->_draw->_backSurface); + + // Highlight the current difficulty + drawMenuDifficulty(); + + // Draw the section buttons + Surface elements(320, 200, 1); + _vm->_video->drawPackedSprite("elemenu.cmp", elements); + + for (uint i = 0; i < ARRAYSIZE(kSectionButtons); i++) { + const MenuButton &button = kSectionButtons[i]; + + if (!button.needDraw) + continue; + + if (_section >= (uint)button.id) + _vm->_draw->_backSurface->blit(elements, button.srcLeft, button.srcTop, button.srcRight, button.srcBottom, + button.dstX, button.dstY); + } + + _vm->_draw->forceBlit(); +} + +void OnceUpon::drawMenuIngame() { + Surface menu(320, 34, 1); + _vm->_video->drawPackedSprite("icon.cmp", menu); + + // Draw the menu in a special way + for (uint i = 0; i < ARRAYSIZE(kIngameButtons); i++) { + const MenuButton &button = kIngameButtons[i]; + + drawLineByLine(menu, button.srcLeft, button.srcTop, button.srcRight, button.srcBottom, + button.dstX, button.dstY); + } + + _vm->_draw->forceBlit(); + _vm->_video->retrace(); +} + +void OnceUpon::drawMenuDifficulty() { + if (_difficulty == kDifficultyMAX) + return; + + TXTFile *difficulties = loadTXT(getLocFile("diffic.tx"), TXTFile::kFormatStringPositionColor); + + // Draw the difficulty name + difficulties->draw((uint) _difficulty, *_vm->_draw->_backSurface, &_plettre, 1); + + // Draw a border around the current difficulty + _vm->_draw->_backSurface->drawRect(kMainMenuDifficultyButton[_difficulty].left, + kMainMenuDifficultyButton[_difficulty].top, + kMainMenuDifficultyButton[_difficulty].right, + kMainMenuDifficultyButton[_difficulty].bottom, + difficulties->getLines()[_difficulty].color); + + delete difficulties; +} + +void OnceUpon::clearMenuIngame(const Surface &background) { + // Find the area encompassing the whole ingame menu + + int16 left = 0x7FFF; + int16 top = 0x7FFF; + int16 right = 0x0000; + int16 bottom = 0x0000; + + for (uint i = 0; i < ARRAYSIZE(kIngameButtons); i++) { + const MenuButton &button = kIngameButtons[i]; + + if (!button.needDraw) + continue; + + left = MIN(left , button.dstX); + top = MIN(top , button.dstY); + right = MAX(right , button.dstX + (button.srcRight - button.srcLeft + 1) - 1); + bottom = MAX(bottom, button.dstY + (button.srcBottom - button.srcTop + 1) - 1); + } + + if ((left > right) || (top > bottom)) + return; + + // Clear it line by line + drawLineByLine(background, left, top, right, bottom, left, top); +} + +OnceUpon::Difficulty OnceUpon::checkDifficultyButton(int16 x, int16 y) const { + for (uint i = 0; i < ARRAYSIZE(kMainMenuDifficultyButton); i++) { + const MenuButton &button = kMainMenuDifficultyButton[i]; + + if ((x >= button.left) && (x <= button.right) && (y >= button.top) && (y <= button.bottom)) + return (Difficulty) button.id; + } + + return kDifficultyMAX; +} + +bool OnceUpon::checkAnimalsButton(int16 x, int16 y) const { + if (!_animalsButton) + return false; + + return (x >= _animalsButton->left) && (x <= _animalsButton->right) && + (y >= _animalsButton->top) && (y <= _animalsButton->bottom); +} + +int8 OnceUpon::checkSectionButton(int16 x, int16 y) const { + for (uint i = 0; i < ARRAYSIZE(kSectionButtons); i++) { + const MenuButton &button = kSectionButtons[i]; + + if ((uint)button.id > _section) + continue; + + if ((x >= button.left) && (x <= button.right) && (y >= button.top) && (y <= button.bottom)) + return (int8)button.id; + } + + return -1; +} + +int8 OnceUpon::checkIngameButton(int16 x, int16 y) const { + for (uint i = 0; i < ARRAYSIZE(kIngameButtons); i++) { + const MenuButton &button = kIngameButtons[i]; + + if ((x >= button.left) && (x <= button.right) && (y >= button.top) && (y <= button.bottom)) + return (int8)button.id; + } + + return -1; +} + +void OnceUpon::drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, + int16 x, int16 y) const { + + // A special way of drawing something: + // Draw every other line "downwards", wait a bit after each line + // Then, draw the remaining lines "upwards" and again wait a bit after each line. + + if (_vm->shouldQuit()) + return; + + const int16 width = right - left + 1; + const int16 height = bottom - top + 1; + + if ((width <= 0) || (height <= 0)) + return; + + for (int16 i = 0; i < height; i += 2) { + if (_vm->shouldQuit()) + return; + + _vm->_draw->_backSurface->blit(src, left, top + i, right, top + i, x, y + i); + + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, x, y + i, x + width - 1, y + 1); + _vm->_draw->blitInvalidated(); + + _vm->_util->longDelay(1); + } + + for (int16 i = (height & 1) ? height : (height - 1); i >= 0; i -= 2) { + if (_vm->shouldQuit()) + return; + + _vm->_draw->_backSurface->blit(src, left, top + i, right, top + i, x, y + i); + + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, x, y + i, x + width - 1, y + 1); + _vm->_draw->blitInvalidated(); + + _vm->_util->longDelay(1); + } +} + } // End of namespace OnceUpon } // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 968c70ef48..640e61383d 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -42,18 +42,59 @@ public: ~OnceUpon(); protected: + enum MenuType { + kMenuTypeMainStart = 0, ///< The big main menu at game start. + kMenuTypeMainIngame, ///< The big main menu during the game. + kMenuTypeIngame ///< The small popup menu during the game. + }; + + enum MenuAction { + kMenuActionNone = 0, ///< No action. + kMenuActionAnimals , ///< Do the animal names. + kMenuActionPlay , ///< Play the game. + kMenuActionRestart , ///< Restart the section. + kMenuActionMainMenu, ///< Go to the main menu. + kMenuActionQuit ///< Quit the game. + }; + + enum Difficulty { + kDifficultyBeginner = 0, + kDifficultyIntermediate = 1, + kDifficultyAdvanced = 2, + kDifficultyMAX + }; + + struct MenuButton { + bool needDraw; + int16 left, top, right, bottom; + int16 srcLeft, srcTop, srcRight, srcBottom; + int16 dstX, dstY; + int id; + }; + + static const uint kSectionCount = 15; + + void init(); void deinit(); + void setAnimalsButton(const MenuButton *animalsButton); + void setGamePalette(uint palette); + void setGameCursor(); bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); - void showWait(); ///< Show the wait / loading screen. - void showIntro(); ///< Show the whole intro. + void showWait(uint palette = 0xFFFF); ///< Show the wait / loading screen. + void showIntro(); ///< Show the whole intro. void showChapter(int chapter); ///< Show a chapter intro text. + MenuAction doMenu(MenuType type); + + void drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, + int16 x, int16 y) const; + // Fonts Font *_jeudak; @@ -61,7 +102,14 @@ protected: Font *_plettre; Font *_glettre; + Difficulty _difficulty; + uint8 _section; + private: + static const MenuButton kMainMenuDifficultyButton[3]; + static const MenuButton kSectionButtons[4]; + static const MenuButton kIngameButtons[3]; + void setCopyProtectionPalette(); void setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const; @@ -82,8 +130,27 @@ private: void playTitleMusicAtariST(); void stopTitleMusic(); + // Menu helpers + MenuAction doMenuMainStart(); + MenuAction doMenuMainIngame(); + MenuAction doMenuIngame(); + + void drawMenuMainStart(); + void drawMenuMainIngame(); + void drawMenuIngame(); + void drawMenuDifficulty(); + + void clearMenuIngame(const Surface &background); + + Difficulty checkDifficultyButton(int16 x, int16 y) const; + bool checkAnimalsButton (int16 x, int16 y) const; + int8 checkSectionButton (int16 x, int16 y) const; + int8 checkIngameButton (int16 x, int16 y) const; + bool _openedArchives; + + const MenuButton *_animalsButton; }; } // End of namespace OnceUpon -- cgit v1.2.3 From 34cf81a4b614dee5f2657bf24d9f867165e6ced9 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 1 Jul 2012 03:45:09 +0200 Subject: GOB: Add some PreGob sound utility functions --- engines/gob/pregob/onceupon/onceupon.cpp | 10 ++++++++- engines/gob/pregob/onceupon/onceupon.h | 8 ++++++++ engines/gob/pregob/pregob.cpp | 35 ++++++++++++++++++++++++++++++++ engines/gob/pregob/pregob.h | 11 ++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 67004d2912..ad6befaea2 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -246,6 +246,10 @@ const OnceUpon::MenuButton OnceUpon::kIngameButtons[3] = { {true, 180, 83, 211, 116, 72, 0, 103, 34, 180, 83, 2} }; +const char *OnceUpon::kSound[kSoundMAX] = { + "diamant.snd" +}; + OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm), _jeudak(0), _lettre(0), _plettre(0), _glettre(0), _openedArchives(false), _animalsButton(0) { @@ -286,6 +290,8 @@ void OnceUpon::init() { "please contact the ScummVM team with details about this version.\n" "Thanks", _vm->getLangDesc(_vm->_global->_language)); + loadSounds(kSound, kSoundMAX); + initScreen(); _difficulty = kDifficultyMAX; @@ -293,6 +299,8 @@ void OnceUpon::init() { } void OnceUpon::deinit() { + freeSounds(); + delete _jeudak; delete _lettre; delete _plettre; @@ -671,7 +679,7 @@ void OnceUpon::stopTitleMusic() { _vm->_sound->blasterStopComposition(); _vm->_sound->protrackerStop(); - for (int i = 0; i < Sound::kSoundsCount; i++) + for (int i = 0; i < ::Gob::Sound::kSoundsCount; i++) _vm->_sound->sampleFree(_vm->_sound->sampleGetBySlot(i)); } diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 640e61383d..9ad563903e 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -64,6 +64,11 @@ protected: kDifficultyMAX }; + enum Sound { + kSoundClick = 0, + kSoundMAX + }; + struct MenuButton { bool needDraw; int16 left, top, right, bottom; @@ -110,6 +115,9 @@ private: static const MenuButton kSectionButtons[4]; static const MenuButton kIngameButtons[3]; + static const char *kSound[kSoundMAX]; + + void setCopyProtectionPalette(); void setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const; diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 582ebc6677..9c6cfb717a 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -32,6 +32,8 @@ #include "gob/video.h" #include "gob/aniobject.h" +#include "gob/sound/sound.h" + #include "gob/pregob/pregob.h" static char kLanguageSuffix[5] = { 't', 'g', 'a', 'e', 'i' }; @@ -141,6 +143,39 @@ bool PreGob::isCursorVisible() const { return CursorMan.isVisible(); } +void PreGob::loadSounds(const char * const *sounds, uint soundCount) { + freeSounds(); + + _sounds.resize(soundCount); + + for (uint i = 0; i < soundCount; i++) { + int32 size; + byte *data = _vm->_dataIO->getFile(sounds[i], size); + + if (!data || !_sounds[i].load(SOUND_SND, data, size)) { + delete data; + + warning("PreGob::loadSounds(): Failed to load sound \"%s\"", sounds[i]); + continue; + } + } +} + +void PreGob::freeSounds() { + _sounds.clear(); +} + +void PreGob::playSound(uint sound, int16 frequency, int16 repCount) { + if (sound >= _sounds.size()) + return; + + _vm->_sound->blasterPlay(&_sounds[sound], repCount, frequency); +} + +void PreGob::stopSound() { + _vm->_sound->blasterStop(0); +} + void PreGob::endFrame(bool doInput) { _vm->_draw->blitInvalidated(); _vm->_util->waitEndFrame(); diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index 902a7c437d..b91758876e 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -24,9 +24,12 @@ #define GOB_PREGOB_PREGOB_H #include "common/str.h" +#include "common/array.h" #include "gob/util.h" +#include "gob/sound/sounddesc.h" + #include "gob/pregob/txtfile.h" namespace Gob { @@ -70,6 +73,12 @@ protected: bool isCursorVisible() const; + void loadSounds(const char * const *sounds, uint soundCount); + void freeSounds(); + + void playSound(uint sound, int16 frequency = 0, int16 repCount = 0); + void stopSound(); + void endFrame(bool doInput); int16 checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons); @@ -89,6 +98,8 @@ protected: private: bool _fadedOut; ///< Did we fade out? + + Common::Array _sounds; }; } // End of namespace Gob -- cgit v1.2.3 From a98ba5f038c536a2b492b816433f4283e9d1ae26 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 1 Jul 2012 03:47:27 +0200 Subject: GOB: Play a click sound in the Once Upon A Time menus --- engines/gob/pregob/onceupon/onceupon.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index ad6befaea2..49516a55c7 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -778,6 +778,8 @@ OnceUpon::MenuAction OnceUpon::doMenuMainStart() { if (mouseButtons != kMouseButtonsLeft) continue; + playSound(kSoundClick); + // If we clicked on a difficulty button, show the selected difficulty and start the game Difficulty difficulty = checkDifficultyButton(mouseX, mouseY); if (difficulty < kDifficultyMAX) { @@ -819,6 +821,8 @@ OnceUpon::MenuAction OnceUpon::doMenuMainIngame() { if (mouseButtons != kMouseButtonsLeft) continue; + playSound(kSoundClick); + // If we clicked on a difficulty button, change the current difficulty level Difficulty difficulty = checkDifficultyButton(mouseX, mouseY); if ((difficulty < kDifficultyMAX) && (_difficulty != difficulty)) { -- cgit v1.2.3 From e477b7d2b996bb4a93b3d95fb5b08e01d64e3b03 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 1 Jul 2012 14:55:51 +0200 Subject: GOB: Move the Once Upon A Time palettes into their own file --- engines/gob/pregob/onceupon/onceupon.cpp | 134 +--------- engines/gob/pregob/onceupon/palettes.h | 411 +++++++++++++++++++++++++++++++ 2 files changed, 412 insertions(+), 133 deletions(-) create mode 100644 engines/gob/pregob/onceupon/palettes.h diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 49516a55c7..c30421900f 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -33,139 +33,7 @@ #include "gob/sound/sound.h" #include "gob/pregob/onceupon/onceupon.h" - -static const int kPaletteSize = 16; -static const uint kPaletteCount = 20; - -static const byte kCopyProtectionPalette[3 * kPaletteSize] = { - 0x00, 0x00, 0x00, 0x19, 0x00, 0x19, 0x00, 0x3F, 0x00, 0x00, 0x2A, 0x2A, - 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x2A, 0x15, 0x00, 0x00, 0x19, 0x12, - 0x00, 0x00, 0x00, 0x15, 0x15, 0x3F, 0x15, 0x3F, 0x15, 0x00, 0x20, 0x3F, - 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x3F, 0x3F, 0x00, 0x3F, 0x3F, 0x3F -}; - -static const byte kGamePalettes[kPaletteCount][3 * kPaletteSize] = { - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, - 0x1C, 0x28, 0x00, 0x10, 0x18, 0x00, 0x1C, 0x1C, 0x20, 0x14, 0x14, 0x14, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x14, 0x20, 0x04, - 0x3C, 0x2C, 0x00, 0x02, 0x00, 0x18, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x38, 0x20, 0x3C, 0x2C, 0x10, 0x30, 0x20, 0x08, 0x28, - 0x14, 0x00, 0x1C, 0x20, 0x20, 0x38, 0x18, 0x18, 0x2C, 0x10, 0x10, 0x24, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x3C, 0x20, 0x20, 0x24, 0x14, 0x14, 0x1C, 0x10, 0x10, - 0x14, 0x0C, 0x0C, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x10, 0x28, 0x1C, 0x10, 0x1C, 0x10, 0x10, 0x14, 0x0C, - 0x1C, 0x1C, 0x3C, 0x24, 0x24, 0x3C, 0x18, 0x18, 0x24, 0x10, 0x10, 0x18, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x3F, 0x26, 0x3F, 0x36, 0x1C, 0x36, 0x2C, 0x12, 0x2A, - 0x27, 0x0C, 0x24, 0x22, 0x07, 0x1E, 0x1D, 0x03, 0x18, 0x16, 0x00, 0x10, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3A, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x3F, 0x39, 0x26, 0x38, 0x34, 0x1C, 0x30, 0x2F, 0x13, - 0x27, 0x29, 0x0C, 0x1D, 0x22, 0x07, 0x14, 0x1B, 0x03, 0x0C, 0x14, 0x00, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3A, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x1C, 0x34, 0x38, 0x14, 0x2C, 0x30, - 0x0C, 0x20, 0x2C, 0x08, 0x18, 0x28, 0x04, 0x10, 0x20, 0x00, 0x08, 0x1C, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x3C, 0x2C, 0x24, 0x38, 0x24, 0x1C, 0x30, 0x1C, 0x14, - 0x28, 0x18, 0x0C, 0x20, 0x10, 0x04, 0x1C, 0x0C, 0x00, 0x14, 0x08, 0x00, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x3C, 0x34, 0x24, 0x38, 0x2C, 0x1C, 0x30, 0x24, 0x14, - 0x2C, 0x1C, 0x10, 0x30, 0x30, 0x3C, 0x1C, 0x1C, 0x38, 0x0C, 0x0C, 0x38, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x02, 0x03, 0x14, 0x07, 0x07, 0x1D, - 0x0E, 0x0E, 0x25, 0x17, 0x17, 0x2E, 0x21, 0x22, 0x36, 0x2F, 0x2F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3B, 0x0D, 0x3A, 0x31, 0x0A, 0x35, 0x28, 0x07, - 0x30, 0x21, 0x04, 0x2B, 0x19, 0x02, 0x26, 0x12, 0x01, 0x16, 0x0B, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x21, 0x01, 0x00, 0x2A, 0x02, 0x00, - 0x33, 0x03, 0x00, 0x3D, 0x06, 0x00, 0x2A, 0x19, 0x05, 0x15, 0x14, 0x14, - 0x22, 0x1F, 0x1E, 0x2F, 0x2C, 0x28, 0x3F, 0x3C, 0x29, 0x3F, 0x38, 0x0B, - 0x3B, 0x30, 0x0A, 0x37, 0x29, 0x08, 0x33, 0x23, 0x07, 0x2F, 0x1D, 0x06 - }, - { - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x38, 0x34, 0x30, 0x28, 0x2C, 0x24, 0x1C, - 0x24, 0x18, 0x10, 0x1C, 0x10, 0x08, 0x14, 0x04, 0x04, 0x10, 0x00, 0x00, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x00, 0x1C, 0x38, 0x34, 0x30, 0x28, 0x2C, 0x24, 0x1C, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x1A, 0x30, 0x37, 0x14, 0x28, 0x31, 0x10, 0x20, 0x2C, - 0x0C, 0x19, 0x27, 0x08, 0x12, 0x21, 0x05, 0x0C, 0x1C, 0x03, 0x07, 0x16, - 0x01, 0x03, 0x11, 0x00, 0x00, 0x0C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x34, 0x30, 0x34, 0x30, 0x24, 0x30, 0x28, 0x1C, 0x28, - 0x24, 0x14, 0x24, 0x1C, 0x0C, 0x1C, 0x18, 0x08, 0x18, 0x14, 0x04, 0x14, - 0x0C, 0x04, 0x0C, 0x08, 0x00, 0x08, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x2C, 0x24, 0x0C, 0x34, 0x34, 0x28, 0x2C, 0x2C, 0x1C, - 0x24, 0x24, 0x10, 0x1C, 0x18, 0x08, 0x14, 0x14, 0x08, 0x10, 0x10, 0x04, - 0x0C, 0x0C, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x38, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x28, 0x31, 0x10, 0x20, 0x2C, - 0x0C, 0x19, 0x27, 0x08, 0x12, 0x21, 0x05, 0x0C, 0x1C, 0x03, 0x07, 0x16, - 0x01, 0x03, 0x11, 0x00, 0x3C, 0x00, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x10, 0x28, 0x1C, 0x10, 0x1C, 0x10, 0x10, 0x14, 0x0C, - 0x1C, 0x1C, 0x3C, 0x24, 0x24, 0x3C, 0x18, 0x18, 0x24, 0x10, 0x10, 0x18, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - }, - { - 0x00, 0x00, 0x00, 0x10, 0x28, 0x1C, 0x10, 0x1C, 0x10, 0x10, 0x14, 0x0C, - 0x1C, 0x1C, 0x3C, 0x24, 0x24, 0x3C, 0x18, 0x18, 0x24, 0x10, 0x10, 0x18, - 0x14, 0x20, 0x04, 0x00, 0x00, 0x24, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, - 0x3C, 0x2C, 0x00, 0x3C, 0x18, 0x00, 0x3C, 0x04, 0x00, 0x1C, 0x00, 0x00 - } -}; +#include "gob/pregob/onceupon/palettes.h" static const uint kLanguageCount = 5; diff --git a/engines/gob/pregob/onceupon/palettes.h b/engines/gob/pregob/onceupon/palettes.h new file mode 100644 index 0000000000..952581041c --- /dev/null +++ b/engines/gob/pregob/onceupon/palettes.h @@ -0,0 +1,411 @@ +/* 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 GOB_PREGOB_ONCEUPON_PALETTES_H +#define GOB_PREGOB_ONCEUPON_PALETTES_H + +static const int kPaletteSize = 16; +static const uint kPaletteCount = 20; + +static const byte kCopyProtectionPalette[3 * kPaletteSize] = { + 0x00, 0x00, 0x00, + 0x19, 0x00, 0x19, + 0x00, 0x3F, 0x00, + 0x00, 0x2A, 0x2A, + 0x2A, 0x00, 0x00, + 0x2A, 0x00, 0x2A, + 0x2A, 0x15, 0x00, + 0x00, 0x19, 0x12, + 0x00, 0x00, 0x00, + 0x15, 0x15, 0x3F, + 0x15, 0x3F, 0x15, + 0x00, 0x20, 0x3F, + 0x3F, 0x00, 0x00, + 0x3F, 0x00, 0x20, + 0x3F, 0x3F, 0x00, + 0x3F, 0x3F, 0x3F +}; + +static const byte kGamePalettes[kPaletteCount][3 * kPaletteSize] = { + { + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, + 0x00, 0x00, 0x18, + 0x00, 0x00, 0x3C, + 0x1C, 0x28, 0x00, + 0x10, 0x18, 0x00, + 0x1C, 0x1C, 0x20, + 0x14, 0x14, 0x14, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x14, 0x20, 0x04, + 0x3C, 0x2C, 0x00, + 0x02, 0x00, 0x18, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x38, 0x20, 0x3C, + 0x2C, 0x10, 0x30, + 0x20, 0x08, 0x28, + 0x14, 0x00, 0x1C, + 0x20, 0x20, 0x38, + 0x18, 0x18, 0x2C, + 0x10, 0x10, 0x24, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x3C, 0x20, 0x20, + 0x24, 0x14, 0x14, + 0x1C, 0x10, 0x10, + 0x14, 0x0C, 0x0C, + 0x1C, 0x1C, 0x1C, + 0x18, 0x18, 0x18, + 0x10, 0x10, 0x10, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x10, 0x28, 0x1C, + 0x10, 0x1C, 0x10, + 0x10, 0x14, 0x0C, + 0x1C, 0x1C, 0x3C, + 0x24, 0x24, 0x3C, + 0x18, 0x18, 0x24, + 0x10, 0x10, 0x18, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x3F, 0x26, 0x3F, + 0x36, 0x1C, 0x36, + 0x2C, 0x12, 0x2A, + 0x27, 0x0C, 0x24, + 0x22, 0x07, 0x1E, + 0x1D, 0x03, 0x18, + 0x16, 0x00, 0x10, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3A, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x3F, 0x39, 0x26, + 0x38, 0x34, 0x1C, + 0x30, 0x2F, 0x13, + 0x27, 0x29, 0x0C, + 0x1D, 0x22, 0x07, + 0x14, 0x1B, 0x03, + 0x0C, 0x14, 0x00, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3A, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x24, 0x3C, 0x3C, + 0x1C, 0x34, 0x38, + 0x14, 0x2C, 0x30, + 0x0C, 0x20, 0x2C, + 0x08, 0x18, 0x28, + 0x04, 0x10, 0x20, + 0x00, 0x08, 0x1C, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x38, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x24, + 0x38, 0x24, 0x1C, + 0x30, 0x1C, 0x14, + 0x28, 0x18, 0x0C, + 0x20, 0x10, 0x04, + 0x1C, 0x0C, 0x00, + 0x14, 0x08, 0x00, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x38, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x3C, 0x34, 0x24, + 0x38, 0x2C, 0x1C, + 0x30, 0x24, 0x14, + 0x2C, 0x1C, 0x10, + 0x30, 0x30, 0x3C, + 0x1C, 0x1C, 0x38, + 0x0C, 0x0C, 0x38, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0C, + 0x02, 0x03, 0x14, + 0x07, 0x07, 0x1D, + 0x0E, 0x0E, 0x25, + 0x17, 0x17, 0x2E, + 0x21, 0x22, 0x36, + 0x2F, 0x2F, 0x3F, + 0x3F, 0x3F, 0x3F, + 0x3F, 0x3B, 0x0D, + 0x3A, 0x31, 0x0A, + 0x35, 0x28, 0x07, + 0x30, 0x21, 0x04, + 0x2B, 0x19, 0x02, + 0x26, 0x12, 0x01, + 0x16, 0x0B, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, + 0x21, 0x01, 0x00, + 0x2A, 0x02, 0x00, + 0x33, 0x03, 0x00, + 0x3D, 0x06, 0x00, + 0x2A, 0x19, 0x05, + 0x15, 0x14, 0x14, + 0x22, 0x1F, 0x1E, + 0x2F, 0x2C, 0x28, + 0x3F, 0x3C, 0x29, + 0x3F, 0x38, 0x0B, + 0x3B, 0x30, 0x0A, + 0x37, 0x29, 0x08, + 0x33, 0x23, 0x07, + 0x2F, 0x1D, 0x06 + }, + { + 0x00, 0x00, 0x00, + 0x00, 0x1C, 0x38, + 0x34, 0x30, 0x28, + 0x2C, 0x24, 0x1C, + 0x24, 0x18, 0x10, + 0x1C, 0x10, 0x08, + 0x14, 0x04, 0x04, + 0x10, 0x00, 0x00, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x38, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x00, 0x1C, 0x38, + 0x34, 0x30, 0x28, + 0x2C, 0x24, 0x1C, + 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x38, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x1A, 0x30, 0x37, + 0x14, 0x28, 0x31, + 0x10, 0x20, 0x2C, + 0x0C, 0x19, 0x27, + 0x08, 0x12, 0x21, + 0x05, 0x0C, 0x1C, + 0x03, 0x07, 0x16, + 0x01, 0x03, 0x11, + 0x00, 0x00, 0x0C, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x34, 0x30, 0x34, + 0x30, 0x24, 0x30, + 0x28, 0x1C, 0x28, + 0x24, 0x14, 0x24, + 0x1C, 0x0C, 0x1C, + 0x18, 0x08, 0x18, + 0x14, 0x04, 0x14, + 0x0C, 0x04, 0x0C, + 0x08, 0x00, 0x08, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x2C, 0x24, 0x0C, + 0x34, 0x34, 0x28, + 0x2C, 0x2C, 0x1C, + 0x24, 0x24, 0x10, + 0x1C, 0x18, 0x08, + 0x14, 0x14, 0x08, + 0x10, 0x10, 0x04, + 0x0C, 0x0C, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x38, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + 0x14, 0x28, 0x31, + 0x10, 0x20, 0x2C, + 0x0C, 0x19, 0x27, + 0x08, 0x12, 0x21, + 0x05, 0x0C, 0x1C, + 0x03, 0x07, 0x16, + 0x01, 0x03, 0x11, + 0x00, 0x3C, 0x00, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x10, 0x28, 0x1C, + 0x10, 0x1C, 0x10, + 0x10, 0x14, 0x0C, + 0x1C, 0x1C, 0x3C, + 0x24, 0x24, 0x3C, + 0x18, 0x18, 0x24, + 0x10, 0x10, 0x18, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + }, + { + 0x00, 0x00, 0x00, + 0x10, 0x28, 0x1C, + 0x10, 0x1C, 0x10, + 0x10, 0x14, 0x0C, + 0x1C, 0x1C, 0x3C, + 0x24, 0x24, 0x3C, + 0x18, 0x18, 0x24, + 0x10, 0x10, 0x18, + 0x14, 0x20, 0x04, + 0x00, 0x00, 0x24, + 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, + 0x3C, 0x2C, 0x00, + 0x3C, 0x18, 0x00, + 0x3C, 0x04, 0x00, + 0x1C, 0x00, 0x00 + } +}; + +#endif // GOB_PREGOB_ONCEUPON_PALETTES_H -- cgit v1.2.3 From 4663ab2373ac3230ccb95cc2accee87ddd1682b8 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 1 Jul 2012 15:55:02 +0200 Subject: GOB: Fix some broken German text in Once Upon A Time --- engines/gob/pregob/onceupon/brokenstrings.h | 51 +++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/onceupon.cpp | 18 ++++++++++ engines/gob/pregob/onceupon/onceupon.h | 3 ++ engines/gob/pregob/pregob.cpp | 5 +++ engines/gob/pregob/pregob.h | 2 ++ 5 files changed, 79 insertions(+) create mode 100644 engines/gob/pregob/onceupon/brokenstrings.h diff --git a/engines/gob/pregob/onceupon/brokenstrings.h b/engines/gob/pregob/onceupon/brokenstrings.h new file mode 100644 index 0000000000..86c0603058 --- /dev/null +++ b/engines/gob/pregob/onceupon/brokenstrings.h @@ -0,0 +1,51 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GOB_PREGOB_ONCEUPON_BROKENSTRINGS_H +#define GOB_PREGOB_ONCEUPON_BROKENSTRINGS_H + +struct BrokenString { + const char *wrong; + const char *correct; +}; + +struct BrokenStringLanguage { + const BrokenString *strings; + uint count; +}; + +static const BrokenString kBrokenStringsGerman[] = { + { "Zeichungen von Kaki," , "Zeichnungen von Kaki," }, + { "die es in seine Wachtr\204ume", "die es in seine Tagtr\204ume" }, + { " Spielerfahrung" , " Spielerfahren" }, + { " Fortgeschrittene" , " Fortgeschritten" } +}; + +static const BrokenStringLanguage kBrokenStrings[kLanguageCount] = { + { 0, 0 }, // French + { kBrokenStringsGerman, ARRAYSIZE(kBrokenStringsGerman) }, // German + { 0, 0 }, // English + { 0, 0 }, // Spanish + { 0, 0 }, // Italian +}; + +#endif // GOB_PREGOB_ONCEUPON_BROKENSTRINGS_H diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index c30421900f..c20ca2a45f 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -211,6 +211,24 @@ void OnceUpon::setGameCursor() { setCursor(cursor, 105, 0, 120, 15, 0, 0); } +void OnceUpon::fixTXTStrings(TXTFile &txt) const { + TXTFile::LineArray &lines = txt.getLines(); + for (uint i = 0; i < lines.size(); i++) + lines[i].text = fixString(lines[i].text); +} + +#include "gob/pregob/onceupon/brokenstrings.h" +Common::String OnceUpon::fixString(const Common::String &str) const { + const BrokenStringLanguage &broken = kBrokenStrings[_vm->_global->_language]; + + for (uint i = 0; i < broken.count; i++) { + if (str == broken.strings[i].wrong) + return broken.strings[i].correct; + } + + return str; +} + enum CopyProtectionState { kCPStateSetup, // Set up the screen kCPStateWaitUser, // Waiting for the user to pick a shape diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 9ad563903e..efc2710d67 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -88,6 +88,9 @@ protected: void setGamePalette(uint palette); void setGameCursor(); + Common::String fixString(const Common::String &str) const; + void fixTXTStrings(TXTFile &txt) const; + bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); void showWait(uint palette = 0xFFFF); ///< Show the wait / loading screen. diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 9c6cfb717a..f94f990f76 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -256,7 +256,12 @@ TXTFile *PreGob::loadTXT(const Common::String &txtFile, TXTFile::Format format) delete txtStream; + fixTXTStrings(*txt); + return txt; } +void PreGob::fixTXTStrings(TXTFile &txt) const { +} + } // End of namespace Gob diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index b91758876e..0a40ed6242 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -93,6 +93,8 @@ protected: Common::String getLocFile(const Common::String &file) const; TXTFile *loadTXT(const Common::String &txtFile, TXTFile::Format format) const; + virtual void fixTXTStrings(TXTFile &txt) const; + GobEngine *_vm; -- cgit v1.2.3 From 9e997fea1be0c3f7cd8af7ee0f145879d5c49882 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 2 Jul 2012 00:09:43 +0200 Subject: GOB: Add "long" PreGob language suffixes --- engines/gob/pregob/pregob.cpp | 9 ++++++--- engines/gob/pregob/pregob.h | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index f94f990f76..f39a7a112e 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -36,10 +36,13 @@ #include "gob/pregob/pregob.h" -static char kLanguageSuffix[5] = { 't', 'g', 'a', 'e', 'i' }; namespace Gob { +const char PreGob::kLanguageSuffixShort[5] = { 't', 'g', 'a', 'e', 'i'}; +const char *PreGob::kLanguageSuffixLong [5] = {"fr", "al", "an", "it", "es"}; + + PreGob::PreGob(GobEngine *vm) : _vm(vm), _fadedOut(false) { } @@ -241,10 +244,10 @@ void PreGob::redrawAnim(ANIObject &ani) { } Common::String PreGob::getLocFile(const Common::String &file) const { - if (_vm->_global->_language >= ARRAYSIZE(kLanguageSuffix)) + if (_vm->_global->_language >= ARRAYSIZE(kLanguageSuffixShort)) return file; - return file + kLanguageSuffix[_vm->_global->_language]; + return file + kLanguageSuffixShort[_vm->_global->_language]; } TXTFile *PreGob::loadTXT(const Common::String &txtFile, TXTFile::Format format) const { diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index 0a40ed6242..477aec6dc8 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -47,6 +47,10 @@ public: virtual void run() = 0; protected: + static const char kLanguageSuffixShort[5]; + static const char *kLanguageSuffixLong [5]; + + void initScreen(); ///< Initialize the game screen. void fadeOut(); ///< Fade to black. -- cgit v1.2.3 From 9d564ecd268781d8b92ca7a5895aa10aea6b4e52 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 2 Jul 2012 00:10:23 +0200 Subject: GOB: Implement the animal names bit Once Upon A Time --- engines/gob/pregob/onceupon/abracadabra.cpp | 28 ++- engines/gob/pregob/onceupon/abracadabra.h | 3 + engines/gob/pregob/onceupon/babayaga.cpp | 28 ++- engines/gob/pregob/onceupon/babayaga.h | 3 + engines/gob/pregob/onceupon/brokenstrings.h | 5 +- engines/gob/pregob/onceupon/onceupon.cpp | 265 +++++++++++++++++++++++----- engines/gob/pregob/onceupon/onceupon.h | 27 ++- engines/gob/pregob/pregob.cpp | 50 ++++-- engines/gob/pregob/pregob.h | 5 + 9 files changed, 343 insertions(+), 71 deletions(-) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 696e4d9594..781d683ef0 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -52,6 +52,32 @@ const OnceUpon::MenuButton Abracadabra::kAnimalsButtons = { true, 131, 127, 183, 164, 193, 0, 243, 35, 132, 128, 0 }; +const OnceUpon::MenuButton Abracadabra::kAnimalButtons[] = { + {false, 37, 89, 95, 127, 37, 89, 95, 127, 131, 25, 0}, + {false, 114, 65, 172, 111, 114, 65, 172, 111, 131, 25, 1}, + {false, 186, 72, 227, 96, 186, 72, 227, 96, 139, 25, 2}, + {false, 249, 87, 282, 112, 249, 87, 282, 112, 143, 25, 3}, + {false, 180, 102, 234, 138, 180, 102, 234, 138, 133, 25, 4}, + {false, 197, 145, 242, 173, 197, 145, 242, 173, 137, 25, 5}, + {false, 113, 151, 171, 176, 113, 151, 171, 176, 131, 25, 6}, + {false, 114, 122, 151, 150, 114, 122, 151, 150, 141, 25, 7}, + {false, 36, 136, 94, 176, 36, 136, 94, 176, 131, 25, 8}, + {false, 243, 123, 295, 155, 243, 123, 295, 155, 136, 25, 9} +}; + +const char *Abracadabra::kAnimalNames[] = { + "loup", + "drag", + "arai", + "crap", + "crab", + "mous", + "saut", + "guep", + "rhin", + "scor" +}; + Abracadabra::Abracadabra(GobEngine *vm) : OnceUpon(vm) { setAnimalsButton(&kAnimalsButtons); @@ -91,7 +117,7 @@ void Abracadabra::mainLoop() { else if (action == kMenuActionRestart) warning("Abracadabra::mainLoop(): TODO: Restart"); else if (action == kMenuActionAnimals) - warning("Abracadabra::mainLoop(): TODO: Animals"); + doAnimalNames(ARRAYSIZE(kAnimalButtons), kAnimalButtons, kAnimalNames); else if (action == kMenuActionQuit) break; } diff --git a/engines/gob/pregob/onceupon/abracadabra.h b/engines/gob/pregob/onceupon/abracadabra.h index 64deaf4389..5f3a1ba634 100644 --- a/engines/gob/pregob/onceupon/abracadabra.h +++ b/engines/gob/pregob/onceupon/abracadabra.h @@ -39,6 +39,9 @@ public: private: static const MenuButton kAnimalsButtons; + static const MenuButton kAnimalButtons[]; + static const char *kAnimalNames[]; + void mainLoop(); }; diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index b752bb0862..34f674107c 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -52,6 +52,32 @@ const OnceUpon::MenuButton BabaYaga::kAnimalsButtons = { true, 131, 127, 183, 164, 193, 0, 245, 37, 131, 127, 0 }; +const OnceUpon::MenuButton BabaYaga::kAnimalButtons[] = { + {false, 34, 84, 92, 127, 34, 84, 92, 127, 131, 25, 0}, + {false, 114, 65, 172, 111, 114, 65, 172, 111, 131, 25, 1}, + {false, 186, 72, 227, 96, 186, 72, 227, 96, 139, 25, 2}, + {false, 249, 87, 282, 112, 249, 87, 282, 112, 143, 25, 3}, + {false, 180, 97, 234, 138, 180, 97, 234, 138, 133, 25, 4}, + {false, 197, 145, 242, 173, 197, 145, 242, 173, 137, 25, 5}, + {false, 113, 156, 171, 176, 113, 156, 171, 176, 131, 25, 6}, + {false, 114, 127, 151, 150, 114, 127, 151, 150, 141, 25, 7}, + {false, 36, 136, 94, 176, 36, 136, 94, 176, 131, 25, 8}, + {false, 245, 123, 293, 155, 245, 123, 293, 155, 136, 25, 9} +}; + +const char *BabaYaga::kAnimalNames[] = { + "vaut", + "drag", + "arai", + "gren", + "fauc", + "abei", + "serp", + "tort", + "sang", + "rena" +}; + BabaYaga::BabaYaga(GobEngine *vm) : OnceUpon(vm) { setAnimalsButton(&kAnimalsButtons); @@ -91,7 +117,7 @@ void BabaYaga::mainLoop() { else if (action == kMenuActionRestart) warning("BabaYaga::mainLoop(): TODO: Restart"); else if (action == kMenuActionAnimals) - warning("BabaYaga::mainLoop(): TODO: Animals"); + doAnimalNames(ARRAYSIZE(kAnimalButtons), kAnimalButtons, kAnimalNames); else if (action == kMenuActionQuit) break; } diff --git a/engines/gob/pregob/onceupon/babayaga.h b/engines/gob/pregob/onceupon/babayaga.h index 98d452418f..de42f8e8fe 100644 --- a/engines/gob/pregob/onceupon/babayaga.h +++ b/engines/gob/pregob/onceupon/babayaga.h @@ -39,6 +39,9 @@ public: private: static const MenuButton kAnimalsButtons; + static const MenuButton kAnimalButtons[]; + static const char *kAnimalNames[]; + void mainLoop(); }; diff --git a/engines/gob/pregob/onceupon/brokenstrings.h b/engines/gob/pregob/onceupon/brokenstrings.h index 86c0603058..98dcb720fb 100644 --- a/engines/gob/pregob/onceupon/brokenstrings.h +++ b/engines/gob/pregob/onceupon/brokenstrings.h @@ -37,7 +37,10 @@ static const BrokenString kBrokenStringsGerman[] = { { "Zeichungen von Kaki," , "Zeichnungen von Kaki," }, { "die es in seine Wachtr\204ume", "die es in seine Tagtr\204ume" }, { " Spielerfahrung" , " Spielerfahren" }, - { " Fortgeschrittene" , " Fortgeschritten" } + { " Fortgeschrittene" , " Fortgeschritten" }, + { "die Vespe" , "die Wespe" }, + { "das Rhinoceros" , "das Rhinozeros" }, + { "die Heusschrecke" , "die Heuschrecke" } }; static const BrokenStringLanguage kBrokenStrings[kLanguageCount] = { diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index c20ca2a45f..b7bf2c3f5a 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -39,7 +39,7 @@ static const uint kLanguageCount = 5; static const uint kCopyProtectionHelpStringCount = 3; -static const char *kCopyProtectionHelpStrings[kLanguageCount][kCopyProtectionHelpStringCount] = { +static const char *kCopyProtectionHelpStrings[Gob::OnceUpon::OnceUpon::kLanguageCount][kCopyProtectionHelpStringCount] = { { // French "Consulte le livret des animaux, rep\212re la", "page correspondant \205 la couleur de l\'\202cran", @@ -67,7 +67,7 @@ static const char *kCopyProtectionHelpStrings[kLanguageCount][kCopyProtectionHel } }; -static const char *kCopyProtectionWrongStrings[kLanguageCount] = { +static const char *kCopyProtectionWrongStrings[Gob::OnceUpon::OnceUpon::kLanguageCount] = { "Tu t\'es tromp\202, dommage...", // French "Schade, du hast dich geirrt." , // German "You are wrong, what a pity!" , // English @@ -95,25 +95,38 @@ namespace Gob { namespace OnceUpon { -const OnceUpon::MenuButton OnceUpon::kMainMenuDifficultyButton[3] = { - {false, 29, 18, 77, 57, 0, 0, 0, 0, 0, 0, 0}, - {false, 133, 18, 181, 57, 0, 0, 0, 0, 0, 0, 1}, - {false, 241, 18, 289, 57, 0, 0, 0, 0, 0, 0, 2}, +const OnceUpon::MenuButton OnceUpon::kMainMenuDifficultyButton[] = { + {false, 29, 18, 77, 57, 0, 0, 0, 0, 0, 0, (int)kDifficultyBeginner}, + {false, 133, 18, 181, 57, 0, 0, 0, 0, 0, 0, (int)kDifficultyIntermediate}, + {false, 241, 18, 289, 57, 0, 0, 0, 0, 0, 0, (int)kDifficultyAdvanced}, }; -const OnceUpon::MenuButton OnceUpon::kSectionButtons[4] = { +const OnceUpon::MenuButton OnceUpon::kSectionButtons[] = { {false, 27, 121, 91, 179, 0, 0, 0, 0, 0, 0, 0}, { true, 95, 121, 159, 179, 4, 1, 56, 49, 100, 126, 2}, { true, 163, 121, 227, 179, 64, 1, 120, 49, 168, 126, 6}, { true, 231, 121, 295, 179, 128, 1, 184, 49, 236, 126, 10} }; -const OnceUpon::MenuButton OnceUpon::kIngameButtons[3] = { +const OnceUpon::MenuButton OnceUpon::kIngameButtons[] = { {true, 108, 83, 139, 116, 0, 0, 31, 34, 108, 83, 0}, {true, 144, 83, 175, 116, 36, 0, 67, 34, 144, 83, 1}, {true, 180, 83, 211, 116, 72, 0, 103, 34, 180, 83, 2} }; +const OnceUpon::MenuButton OnceUpon::kAnimalNamesBack = { + true, 19, 13, 50, 46, 36, 0, 67, 34, 19, 13, 1 +}; + +const OnceUpon::MenuButton OnceUpon::kLanguageButtons[] = { + {true, 43, 80, 93, 115, 0, 55, 50, 90, 43, 80, 0}, + {true, 132, 80, 182, 115, 53, 55, 103, 90, 132, 80, 1}, + {true, 234, 80, 284, 115, 106, 55, 156, 90, 234, 80, 2}, + {true, 43, 138, 93, 173, 159, 55, 209, 90, 43, 138, 3}, + {true, 132, 138, 182, 173, 212, 55, 262, 90, 132, 138, 4}, + {true, 234, 138, 284, 173, 265, 55, 315, 90, 234, 138, 2} +}; + const char *OnceUpon::kSound[kSoundMAX] = { "diamant.snd" }; @@ -643,6 +656,7 @@ OnceUpon::MenuAction OnceUpon::doMenu(MenuType type) { OnceUpon::MenuAction OnceUpon::doMenuMainStart() { fadeOut(); + setGamePalette(17); drawMenuMainStart(); showCursor(); fadeIn(); @@ -667,16 +681,16 @@ OnceUpon::MenuAction OnceUpon::doMenuMainStart() { playSound(kSoundClick); // If we clicked on a difficulty button, show the selected difficulty and start the game - Difficulty difficulty = checkDifficultyButton(mouseX, mouseY); - if (difficulty < kDifficultyMAX) { - _difficulty = difficulty; + int diff = checkButton(kMainMenuDifficultyButton, ARRAYSIZE(kMainMenuDifficultyButton), mouseX, mouseY); + if (diff >= 0) { + _difficulty = (Difficulty)diff; action = kMenuActionPlay; drawMenuMainStart(); _vm->_util->longDelay(1000); } - if (checkAnimalsButton(mouseX, mouseY)) + if (_animalsButton && (checkButton(_animalsButton, 1, mouseX, mouseY) != -1)) action = kMenuActionAnimals; } @@ -686,6 +700,7 @@ OnceUpon::MenuAction OnceUpon::doMenuMainStart() { OnceUpon::MenuAction OnceUpon::doMenuMainIngame() { fadeOut(); + setGamePalette(17); drawMenuMainIngame(); showCursor(); fadeIn(); @@ -710,16 +725,16 @@ OnceUpon::MenuAction OnceUpon::doMenuMainIngame() { playSound(kSoundClick); // If we clicked on a difficulty button, change the current difficulty level - Difficulty difficulty = checkDifficultyButton(mouseX, mouseY); - if ((difficulty < kDifficultyMAX) && (_difficulty != difficulty)) { - _difficulty = difficulty; + int diff = checkButton(kMainMenuDifficultyButton, ARRAYSIZE(kMainMenuDifficultyButton), mouseX, mouseY); + if ((diff >= 0) && (diff != (int)_difficulty)) { + _difficulty = (Difficulty)diff; drawMenuMainIngame(); } // If we clicked on a section button, restart the game from this section - int8 section = checkSectionButton(mouseX, mouseY); - if (section >= 0) { + int section = checkButton(kSectionButtons, ARRAYSIZE(kSectionButtons), mouseX, mouseY); + if ((section >= 0) && (section <= _section)) { _section = section; action = kMenuActionRestart; } @@ -750,8 +765,7 @@ OnceUpon::MenuAction OnceUpon::doMenuIngame() { if (mouseButtons != kMouseButtonsLeft) continue; - // Check if we've pressed one of the buttons - int8 button = checkIngameButton(mouseX, mouseY); + int button = checkButton(kIngameButtons, ARRAYSIZE(kIngameButtons), mouseX, mouseY); if (button == 0) action = kMenuActionQuit; else if (button == 1) @@ -774,10 +788,7 @@ void OnceUpon::drawMenuMainStart() { _vm->_video->drawPackedSprite("elemenu.cmp", elements); _vm->_draw->_backSurface->fillRect(_animalsButton->left , _animalsButton->top, _animalsButton->right, _animalsButton->bottom, 0); - _vm->_draw->_backSurface->blit(elements, - _animalsButton->srcLeft , _animalsButton->srcTop, - _animalsButton->srcRight, _animalsButton->srcBottom, - _animalsButton->dstX , _animalsButton->dstY); + drawButton(*_vm->_draw->_backSurface, elements, *_animalsButton); } // Highlight the current difficulty @@ -804,8 +815,7 @@ void OnceUpon::drawMenuMainIngame() { continue; if (_section >= (uint)button.id) - _vm->_draw->_backSurface->blit(elements, button.srcLeft, button.srcTop, button.srcRight, button.srcBottom, - button.dstX, button.dstY); + drawButton(*_vm->_draw->_backSurface, elements, button); } _vm->_draw->forceBlit(); @@ -873,48 +883,205 @@ void OnceUpon::clearMenuIngame(const Surface &background) { drawLineByLine(background, left, top, right, bottom, left, top); } -OnceUpon::Difficulty OnceUpon::checkDifficultyButton(int16 x, int16 y) const { - for (uint i = 0; i < ARRAYSIZE(kMainMenuDifficultyButton); i++) { - const MenuButton &button = kMainMenuDifficultyButton[i]; +int OnceUpon::checkButton(const MenuButton *buttons, uint count, int16 x, int16 y, int failValue) const { + for (uint i = 0; i < count; i++) { + const MenuButton &button = buttons[i]; if ((x >= button.left) && (x <= button.right) && (y >= button.top) && (y <= button.bottom)) - return (Difficulty) button.id; + return (int)button.id; } - return kDifficultyMAX; + return failValue; } -bool OnceUpon::checkAnimalsButton(int16 x, int16 y) const { - if (!_animalsButton) - return false; - - return (x >= _animalsButton->left) && (x <= _animalsButton->right) && - (y >= _animalsButton->top) && (y <= _animalsButton->bottom); +void OnceUpon::drawButton(Surface &dest, const Surface &src, const MenuButton &button) const { + dest.blit(src, button.srcLeft, button.srcTop, button.srcRight, button.srcBottom, button.dstX, button.dstY); } -int8 OnceUpon::checkSectionButton(int16 x, int16 y) const { - for (uint i = 0; i < ARRAYSIZE(kSectionButtons); i++) { - const MenuButton &button = kSectionButtons[i]; +void OnceUpon::drawButtons(Surface &dest, const Surface &src, const MenuButton *buttons, uint count) const { + for (uint i = 0; i < count; i++) { + const MenuButton &button = buttons[i]; - if ((uint)button.id > _section) + if (!button.needDraw) continue; - if ((x >= button.left) && (x <= button.right) && (y >= button.top) && (y <= button.bottom)) - return (int8)button.id; + drawButton(dest, src, button); } +} - return -1; +void OnceUpon::drawButtonBorder(const MenuButton &button, uint8 color) { + _vm->_draw->_backSurface->drawRect(button.left, button.top, button.right, button.bottom, color); + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, button.left, button.top, button.right, button.bottom); } -int8 OnceUpon::checkIngameButton(int16 x, int16 y) const { - for (uint i = 0; i < ARRAYSIZE(kIngameButtons); i++) { - const MenuButton &button = kIngameButtons[i]; +enum AnimalNamesState { + kANStateChoose, + kANStateNames, + kANStateFinish +}; - if ((x >= button.left) && (x <= button.right) && (y >= button.top) && (y <= button.bottom)) - return (int8)button.id; +void OnceUpon::doAnimalNames(uint count, const MenuButton *buttons, const char * const *names) { + fadeOut(); + clearScreen(); + setGamePalette(19); + + bool cursorVisible = isCursorVisible(); + + // Set the cursor + addCursor(); + setGameCursor(); + + anSetupChooser(); + + int8 _animal = -1; + + AnimalNamesState state = kANStateChoose; + while (!_vm->shouldQuit() && (state != kANStateFinish)) { + showCursor(); + fadeIn(); + + endFrame(true); + + // Check user input + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + checkInput(mouseX, mouseY, mouseButtons); + + // If we moused over an animal button, draw a border around it + int animal = checkButton(buttons, count, mouseX, mouseY); + if ((state == kANStateChoose) && (animal != _animal)) { + // Erase the old border + if (_animal >= 0) + drawButtonBorder(buttons[_animal], 15); + + _animal = animal; + + // Draw the new border + if (_animal >= 0) + drawButtonBorder(buttons[_animal], 10); + } + + if (mouseButtons != kMouseButtonsLeft) + continue; + + playSound(kSoundClick); + + // We clicked on a language button, play the animal name + int language = checkButton(kLanguageButtons, ARRAYSIZE(kLanguageButtons), mouseX, mouseY); + if ((state == kANStateNames) && (language >= 0)) + anPlayAnimalName(names[_animal], language); + + // We clicked on an animal + if ((state == kANStateChoose) && (_animal >= 0)) { + anSetupNames(buttons[_animal]); + + state = kANStateNames; + } + + // If we clicked on the back button, go back + if (checkButton(&kAnimalNamesBack, 1, mouseX, mouseY) != -1) { + if (state == kANStateNames) { + anSetupChooser(); + + state = kANStateChoose; + } else if (state == kANStateChoose) + state = kANStateFinish; + } } - return -1; + fadeOut(); + + // Restore the cursor + if (!cursorVisible) + hideCursor(); + removeCursor(); +} + +void OnceUpon::anSetupChooser() { + fadeOut(); + + _vm->_video->drawPackedSprite("dico.cmp", *_vm->_draw->_backSurface); + + // Draw the back button + Surface menu(320, 34, 1); + _vm->_video->drawPackedSprite("icon.cmp", menu); + drawButton(*_vm->_draw->_backSurface, menu, kAnimalNamesBack); + + // "Choose an animal" + TXTFile *choose = loadTXT(getLocFile("choisi.tx"), TXTFile::kFormatStringPosition); + choose->draw(*_vm->_draw->_backSurface, &_plettre, 1, 14); + delete choose; + + _vm->_draw->forceBlit(); +} + +void OnceUpon::anSetupNames(const MenuButton &animal) { + fadeOut(); + + Surface background(320, 200, 1); + + _vm->_video->drawPackedSprite("dico.cmp", background); + + // Draw the background and clear what we don't need + _vm->_draw->_backSurface->blit(background); + _vm->_draw->_backSurface->fillRect(19, 19, 302, 186, 15); + + // Draw the back button + Surface menu(320, 34, 1); + _vm->_video->drawPackedSprite("icon.cmp", menu); + drawButton(*_vm->_draw->_backSurface, menu, kAnimalNamesBack); + + // Draw the animal + drawButton(*_vm->_draw->_backSurface, background, animal); + + // Draw the language buttons + Surface elements(320, 200, 1); + _vm->_video->drawPackedSprite("elemenu.cmp", elements); + drawButtons(*_vm->_draw->_backSurface, elements, kLanguageButtons, ARRAYSIZE(kLanguageButtons)); + + // Draw the language names + _plettre->drawString("Fran\207ais", 43, 70, 10, 15, true, *_vm->_draw->_backSurface); + _plettre->drawString("Deutsch" , 136, 70, 10, 15, true, *_vm->_draw->_backSurface); + _plettre->drawString("English" , 238, 70, 10, 15, true, *_vm->_draw->_backSurface); + _plettre->drawString("Italiano" , 43, 128, 10, 15, true, *_vm->_draw->_backSurface); + _plettre->drawString("Espa\244ol" , 136, 128, 10, 15, true, *_vm->_draw->_backSurface); + _plettre->drawString("English" , 238, 128, 10, 15, true, *_vm->_draw->_backSurface); + + _vm->_draw->forceBlit(); +} + +void OnceUpon::anPlayAnimalName(const Common::String &animal, uint language) { + // Sound file to play + Common::String soundFile = animal + "_" + kLanguageSuffixLong[language] + ".snd"; + + // Get the name of the animal + TXTFile *names = loadTXT(animal + ".anm", TXTFile::kFormatString); + Common::String name = names->getLines()[language].text; + delete names; + + // It should be centered on the screen + const int nameX = 160 - (name.size() * _plettre->getCharWidth()) / 2; + + // Backup the screen surface + Surface backup(162, 23, 1); + backup.blit(*_vm->_draw->_backSurface, 78, 123, 239, 145, 0, 0); + + // Draw the name border + Surface nameBorder(162, 23, 1); + _vm->_video->drawPackedSprite("mot.cmp", nameBorder); + _vm->_draw->_backSurface->blit(nameBorder, 0, 0, 161, 22, 78, 123); + + // Print the animal name + _plettre->drawString(name, nameX, 129, 10, 0, true, *_vm->_draw->_backSurface); + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 78, 123, 239, 145); + + playSoundFile(soundFile); + + // Restore the screen + _vm->_draw->_backSurface->blit(backup, 0, 0, 161, 22, 78, 123); + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 78, 123, 239, 145); } void OnceUpon::drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index efc2710d67..ff7266e9f3 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -38,6 +38,8 @@ namespace OnceUpon { class OnceUpon : public PreGob { public: + static const uint kLanguageCount = 5; + OnceUpon(GobEngine *vm); ~OnceUpon(); @@ -74,7 +76,7 @@ protected: int16 left, top, right, bottom; int16 srcLeft, srcTop, srcRight, srcBottom; int16 dstX, dstY; - int id; + uint id; }; static const uint kSectionCount = 15; @@ -100,6 +102,8 @@ protected: MenuAction doMenu(MenuType type); + void doAnimalNames(uint count, const MenuButton *buttons, const char * const *names); + void drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y) const; @@ -114,9 +118,12 @@ protected: uint8 _section; private: - static const MenuButton kMainMenuDifficultyButton[3]; - static const MenuButton kSectionButtons[4]; - static const MenuButton kIngameButtons[3]; + static const MenuButton kMainMenuDifficultyButton[]; + static const MenuButton kSectionButtons[]; + static const MenuButton kIngameButtons[]; + + static const MenuButton kAnimalNamesBack; + static const MenuButton kLanguageButtons[]; static const char *kSound[kSoundMAX]; @@ -153,11 +160,15 @@ private: void clearMenuIngame(const Surface &background); - Difficulty checkDifficultyButton(int16 x, int16 y) const; - bool checkAnimalsButton (int16 x, int16 y) const; - int8 checkSectionButton (int16 x, int16 y) const; - int8 checkIngameButton (int16 x, int16 y) const; + int checkButton(const MenuButton *buttons, uint count, int16 x, int16 y, int failValue = -1) const; + void drawButton(Surface &dest, const Surface &src, const MenuButton &button) const; + void drawButtons(Surface &dest, const Surface &src, const MenuButton *buttons, uint count) const; + void drawButtonBorder(const MenuButton &button, uint8 color); + // Animal names helpers + void anSetupChooser(); + void anSetupNames(const MenuButton &animal); + void anPlayAnimalName(const Common::String &animal, uint language); bool _openedArchives; diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index f39a7a112e..675958035d 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -151,23 +151,28 @@ void PreGob::loadSounds(const char * const *sounds, uint soundCount) { _sounds.resize(soundCount); - for (uint i = 0; i < soundCount; i++) { - int32 size; - byte *data = _vm->_dataIO->getFile(sounds[i], size); - - if (!data || !_sounds[i].load(SOUND_SND, data, size)) { - delete data; - - warning("PreGob::loadSounds(): Failed to load sound \"%s\"", sounds[i]); - continue; - } - } + for (uint i = 0; i < soundCount; i++) + loadSound(_sounds[i], sounds[i]); } void PreGob::freeSounds() { _sounds.clear(); } +bool PreGob::loadSound(SoundDesc &sound, const Common::String &file) const { + int32 size; + byte *data = _vm->_dataIO->getFile(file, size); + + if (!data || !sound.load(SOUND_SND, data, size)) { + delete data; + + warning("PreGob::loadSound(): Failed to load sound \"%s\"", file.c_str()); + return false; + } + + return true; +} + void PreGob::playSound(uint sound, int16 frequency, int16 repCount) { if (sound >= _sounds.size()) return; @@ -179,6 +184,29 @@ void PreGob::stopSound() { _vm->_sound->blasterStop(0); } +void PreGob::playSoundFile(const Common::String &file, int16 frequency, int16 repCount, bool interruptible) { + stopSound(); + + SoundDesc sound; + if (!loadSound(sound, file)) + return; + + _vm->_sound->blasterPlay(&sound, repCount, frequency); + + _vm->_util->forceMouseUp(); + + bool finished = false; + while (!_vm->shouldQuit() && !finished && _vm->_sound->blasterPlayingSound()) { + endFrame(true); + + finished = hasInput(); + } + + _vm->_util->forceMouseUp(); + + stopSound(); +} + void PreGob::endFrame(bool doInput) { _vm->_draw->blitInvalidated(); _vm->_util->waitEndFrame(); diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index 477aec6dc8..a1a3d65a58 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -83,6 +83,8 @@ protected: void playSound(uint sound, int16 frequency = 0, int16 repCount = 0); void stopSound(); + void playSoundFile(const Common::String &file, int16 frequency = 0, int16 repCount = 0, bool interruptible = true); + void endFrame(bool doInput); int16 checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons); @@ -103,6 +105,9 @@ protected: GobEngine *_vm; private: + bool loadSound(SoundDesc &sound, const Common::String &file) const; + + bool _fadedOut; ///< Did we fade out? Common::Array _sounds; -- cgit v1.2.3 From 24644c0012fb46bd77c6c24346f85c984418fb3b Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 2 Jul 2012 04:04:41 +0200 Subject: GOB: Implement the Once Upon A Time "Bye Bye" screen --- engines/gob/pregob/onceupon/abracadabra.cpp | 2 +- engines/gob/pregob/onceupon/babayaga.cpp | 2 +- engines/gob/pregob/onceupon/onceupon.cpp | 16 ++++++++++++++++ engines/gob/pregob/onceupon/onceupon.h | 2 ++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 781d683ef0..5a5e407774 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -102,7 +102,7 @@ void Abracadabra::run() { mainLoop(); if (!_vm->shouldQuit()) - warning("Abracadabra::run(): TODO: Show \"Bye Bye\""); + showByeBye(); } void Abracadabra::mainLoop() { diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 34f674107c..9475ac4b05 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -102,7 +102,7 @@ void BabaYaga::run() { mainLoop(); if (!_vm->shouldQuit()) - warning("BabaYaga::run(): TODO: Show \"Bye Bye\""); + showByeBye(); } void BabaYaga::mainLoop() { diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index b7bf2c3f5a..6b90e9ba00 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -609,6 +609,22 @@ void OnceUpon::showChapter(int chapter) { fadeOut(); } +void OnceUpon::showByeBye() { + fadeOut(); + hideCursor(); + clearScreen(); + setGamePalette(1); + + _plettre->drawString("Bye Bye....", 140, 80, 2, 0, true, *_vm->_draw->_backSurface); + _vm->_draw->forceBlit(); + + fadeIn(); + + _vm->_util->longDelay(1000); + + fadeOut(); +} + OnceUpon::MenuAction OnceUpon::doMenu(MenuType type) { bool cursorVisible = isCursorVisible(); diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index ff7266e9f3..6f8b67a627 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -100,6 +100,8 @@ protected: void showChapter(int chapter); ///< Show a chapter intro text. + void showByeBye(); ///< Show the "bye bye" screen + MenuAction doMenu(MenuType type); void doAnimalNames(uint count, const MenuButton *buttons, const char * const *names); -- cgit v1.2.3 From 305ab6847a6c3467ab02ea3f0798e300d82c89ed Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 2 Jul 2012 04:18:12 +0200 Subject: GOB: Reorganize and clean up PreGob / Once Upon A Time --- engines/gob/pregob/onceupon/abracadabra.cpp | 28 +-- engines/gob/pregob/onceupon/abracadabra.h | 6 +- engines/gob/pregob/onceupon/babayaga.cpp | 28 +-- engines/gob/pregob/onceupon/babayaga.h | 6 +- engines/gob/pregob/onceupon/onceupon.cpp | 355 ++++++++++++++++------------ engines/gob/pregob/onceupon/onceupon.h | 221 +++++++++++------ engines/gob/pregob/pregob.h | 50 +++- 7 files changed, 424 insertions(+), 270 deletions(-) diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 5a5e407774..2e4b5f21e7 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -80,7 +80,6 @@ const char *Abracadabra::kAnimalNames[] = { Abracadabra::Abracadabra(GobEngine *vm) : OnceUpon(vm) { - setAnimalsButton(&kAnimalsButtons); } Abracadabra::~Abracadabra() { @@ -99,28 +98,13 @@ void Abracadabra::run() { if (_vm->shouldQuit()) return; - mainLoop(); - - if (!_vm->shouldQuit()) - showByeBye(); -} + // Handle the start menu + doStartMenu(&kAnimalsButtons, ARRAYSIZE(kAnimalButtons), kAnimalButtons, kAnimalNames); + if (_vm->shouldQuit()) + return; -void Abracadabra::mainLoop() { - clearScreen(); - - MenuType mainMenu = kMenuTypeMainStart; - - while (!_vm->shouldQuit()) { - MenuAction action = doMenu(mainMenu); - if (action == kMenuActionPlay) - warning("Abracadabra::mainLoop(): TODO: Play"); - else if (action == kMenuActionRestart) - warning("Abracadabra::mainLoop(): TODO: Restart"); - else if (action == kMenuActionAnimals) - doAnimalNames(ARRAYSIZE(kAnimalButtons), kAnimalButtons, kAnimalNames); - else if (action == kMenuActionQuit) - break; - } + // Play the actual game + playGame(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/abracadabra.h b/engines/gob/pregob/onceupon/abracadabra.h index 5f3a1ba634..f2075fc750 100644 --- a/engines/gob/pregob/onceupon/abracadabra.h +++ b/engines/gob/pregob/onceupon/abracadabra.h @@ -37,13 +37,13 @@ public: void run(); private: + /** Definition of the menu button that leads to the animal names screen. */ static const MenuButton kAnimalsButtons; + /** Definition of the buttons that make up the animals in the animal names screen. */ static const MenuButton kAnimalButtons[]; + /** File prefixes for the name of each animal. */ static const char *kAnimalNames[]; - - - void mainLoop(); }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 9475ac4b05..6f27f469e3 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -80,7 +80,6 @@ const char *BabaYaga::kAnimalNames[] = { BabaYaga::BabaYaga(GobEngine *vm) : OnceUpon(vm) { - setAnimalsButton(&kAnimalsButtons); } BabaYaga::~BabaYaga() { @@ -99,28 +98,13 @@ void BabaYaga::run() { if (_vm->shouldQuit()) return; - mainLoop(); - - if (!_vm->shouldQuit()) - showByeBye(); -} + // Handle the start menu + doStartMenu(&kAnimalsButtons, ARRAYSIZE(kAnimalButtons), kAnimalButtons, kAnimalNames); + if (_vm->shouldQuit()) + return; -void BabaYaga::mainLoop() { - clearScreen(); - - MenuType mainMenu = kMenuTypeMainStart; - - while (!_vm->shouldQuit()) { - MenuAction action = doMenu(mainMenu); - if (action == kMenuActionPlay) - warning("BabaYaga::mainLoop(): TODO: Play"); - else if (action == kMenuActionRestart) - warning("BabaYaga::mainLoop(): TODO: Restart"); - else if (action == kMenuActionAnimals) - doAnimalNames(ARRAYSIZE(kAnimalButtons), kAnimalButtons, kAnimalNames); - else if (action == kMenuActionQuit) - break; - } + // Play the actual game + playGame(); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.h b/engines/gob/pregob/onceupon/babayaga.h index de42f8e8fe..181b6f4d54 100644 --- a/engines/gob/pregob/onceupon/babayaga.h +++ b/engines/gob/pregob/onceupon/babayaga.h @@ -37,13 +37,13 @@ public: void run(); private: + /** Definition of the menu button that leads to the animal names screen. */ static const MenuButton kAnimalsButtons; + /** Definition of the buttons that make up the animals in the animal names screen. */ static const MenuButton kAnimalButtons[]; + /** File prefixes for the name of each animal. */ static const char *kAnimalNames[]; - - - void mainLoop(); }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 6b90e9ba00..785d78b769 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -132,8 +132,17 @@ const char *OnceUpon::kSound[kSoundMAX] = { }; -OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm), _jeudak(0), _lettre(0), _plettre(0), _glettre(0), - _openedArchives(false), _animalsButton(0) { +OnceUpon::ScreenBackup::ScreenBackup() : palette(-1), changedCursor(false), cursorVisible(false) { + screen = new Surface(320, 200, 1); +} + +OnceUpon::ScreenBackup::~ScreenBackup() { + delete screen; +} + + +OnceUpon::OnceUpon(GobEngine *vm) : PreGob(vm), _openedArchives(false), + _jeudak(0), _lettre(0), _plettre(0), _glettre(0) { } @@ -144,6 +153,8 @@ OnceUpon::~OnceUpon() { void OnceUpon::init() { deinit(); + // Open data files + bool hasSTK1 = _vm->_dataIO->openArchive("stk1.stk", true); bool hasSTK2 = _vm->_dataIO->openArchive("stk2.stk", true); bool hasSTK3 = _vm->_dataIO->openArchive("stk3.stk", true); @@ -153,6 +164,8 @@ void OnceUpon::init() { _openedArchives = true; + // Open fonts + _jeudak = _vm->_draw->loadFont("jeudak.let"); _lettre = _vm->_draw->loadFont("lettre.let"); _plettre = _vm->_draw->loadFont("plettre.let"); @@ -162,6 +175,8 @@ void OnceUpon::init() { error("OnceUpon::OnceUpon(): Failed to fonts (%d, %d, %d, %d)", _jeudak != 0, _lettre != 0, _plettre != 0, _glettre != 0); + // Verify the language + if (_vm->_global->_language == kLanguageAmerican) _vm->_global->_language = kLanguageBritish; @@ -171,17 +186,25 @@ void OnceUpon::init() { "please contact the ScummVM team with details about this version.\n" "Thanks", _vm->getLangDesc(_vm->_global->_language)); - loadSounds(kSound, kSoundMAX); + // Load all our sounds and init the screen + loadSounds(kSound, kSoundMAX); initScreen(); + // We start with an invalid palette + _palette = -1; + + // We start with no selected difficulty and at section 0 _difficulty = kDifficultyMAX; _section = 0; } void OnceUpon::deinit() { + // Free sounds freeSounds(); + // Free fonts + delete _jeudak; delete _lettre; delete _plettre; @@ -192,6 +215,8 @@ void OnceUpon::deinit() { _plettre = 0; _glettre = 0; + // Close archives + if (_openedArchives) { _vm->_dataIO->closeArchive(true); _vm->_dataIO->closeArchive(true); @@ -201,29 +226,115 @@ void OnceUpon::deinit() { _openedArchives = false; } -void OnceUpon::setAnimalsButton(const MenuButton *animalsButton) { - _animalsButton = animalsButton; -} - -void OnceUpon::setCopyProtectionPalette() { - setPalette(kCopyProtectionPalette, kPaletteSize); -} - void OnceUpon::setGamePalette(uint palette) { if (palette >= kPaletteCount) return; + _palette = palette; + setPalette(kGamePalettes[palette], kPaletteSize); } void OnceUpon::setGameCursor() { Surface cursor(320, 16, 1); + // Set the default game cursor _vm->_video->drawPackedSprite("icon.cmp", cursor); - setCursor(cursor, 105, 0, 120, 15, 0, 0); } +void OnceUpon::setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const { + ani.setAnimation(state); + ani.setMode(once ? ANIObject::kModeOnce : ANIObject::kModeContinuous); + ani.setPause(pause); + ani.setVisible(true); + ani.setPosition(); +} + +void OnceUpon::drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, + int16 x, int16 y) const { + + // A special way of drawing something: + // Draw every other line "downwards", wait a bit after each line + // Then, draw the remaining lines "upwards" and again wait a bit after each line. + + if (_vm->shouldQuit()) + return; + + const int16 width = right - left + 1; + const int16 height = bottom - top + 1; + + if ((width <= 0) || (height <= 0)) + return; + + // Draw the even lines downwards + for (int16 i = 0; i < height; i += 2) { + if (_vm->shouldQuit()) + return; + + _vm->_draw->_backSurface->blit(src, left, top + i, right, top + i, x, y + i); + + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, x, y + i, x + width - 1, y + 1); + _vm->_draw->blitInvalidated(); + + _vm->_util->longDelay(1); + } + + // Draw the odd lines upwards + for (int16 i = (height & 1) ? height : (height - 1); i >= 0; i -= 2) { + if (_vm->shouldQuit()) + return; + + _vm->_draw->_backSurface->blit(src, left, top + i, right, top + i, x, y + i); + + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, x, y + i, x + width - 1, y + 1); + _vm->_draw->blitInvalidated(); + + _vm->_util->longDelay(1); + } +} + +void OnceUpon::backupScreen(ScreenBackup &backup, bool setDefaultCursor) { + // Backup the screen and palette + backup.screen->blit(*_vm->_draw->_backSurface); + backup.palette = _palette; + + // Backup the cursor + + backup.cursorVisible = isCursorVisible(); + + backup.changedCursor = false; + if (setDefaultCursor) { + backup.changedCursor = true; + + addCursor(); + setGameCursor(); + } +} + +void OnceUpon::restoreScreen(ScreenBackup &backup) { + if (_vm->shouldQuit()) + return; + + // Restore the screen + _vm->_draw->_backSurface->blit(*backup.screen); + _vm->_draw->forceBlit(); + + // Restore the palette + if (backup.palette >= 0) + setGamePalette(backup.palette); + + // Restore the cursor + + if (!backup.cursorVisible) + hideCursor(); + + if (backup.changedCursor) + removeCursor(); + + backup.changedCursor = false; +} + void OnceUpon::fixTXTStrings(TXTFile &txt) const { TXTFile::LineArray &lines = txt.getLines(); for (uint i = 0; i < lines.size(); i++) @@ -251,18 +362,22 @@ enum CopyProtectionState { bool OnceUpon::doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]) { fadeOut(); - setCopyProtectionPalette(); + setPalette(kCopyProtectionPalette, kPaletteSize); + // Load the copy protection sprites Surface sprites[2] = {Surface(320, 200, 1), Surface(320, 200, 1)}; _vm->_video->drawPackedSprite("grille1.cmp", sprites[0]); _vm->_video->drawPackedSprite("grille2.cmp", sprites[1]); + // Load the clown animation ANIFile ani (_vm, "grille.ani", 320); ANIObject clown(ani); + // Set the copy protection cursor setCursor(sprites[1], 5, 110, 20, 134, 3, 0); + // We start with 2 tries left, not having a correct answer and the copy protection not set up yet CopyProtectionState state = kCPStateSetup; uint8 triesLeft = 2; @@ -423,31 +538,6 @@ void OnceUpon::cpWrong() { clearScreen(); } -void OnceUpon::setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const { - ani.setAnimation(state); - ani.setMode(once ? ANIObject::kModeOnce : ANIObject::kModeContinuous); - ani.setPause(pause); - ani.setVisible(true); - ani.setPosition(); -} - -void OnceUpon::showWait(uint palette) { - // Show the loading floppy - - fadeOut(); - clearScreen(); - setGamePalette(palette); - - Surface wait(320, 43, 1); - - _vm->_video->drawPackedSprite("wait.cmp", wait); - _vm->_draw->_backSurface->blit(wait, 0, 0, 72, 33, 122, 84); - - _vm->_draw->forceBlit(); - - fadeIn(); -} - void OnceUpon::showIntro() { // Show all intro parts @@ -475,6 +565,23 @@ void OnceUpon::showIntro() { showWait(17); } +void OnceUpon::showWait(uint palette) { + // Show the loading floppy + + fadeOut(); + clearScreen(); + setGamePalette(palette); + + Surface wait(320, 43, 1); + + _vm->_video->drawPackedSprite("wait.cmp", wait); + _vm->_draw->_backSurface->blit(wait, 0, 0, 72, 33, 122, 84); + + _vm->_draw->forceBlit(); + + fadeIn(); +} + void OnceUpon::showQuote() { // Show the quote about fairytales @@ -534,6 +641,8 @@ void OnceUpon::showTitle() { } void OnceUpon::playTitleMusic() { + // Look at what platform this is and play the appropriate music type + if (_vm->getPlatform() == Common::kPlatformPC) playTitleMusicDOS(); else if (_vm->getPlatform() == Common::kPlatformAmiga) @@ -571,6 +680,8 @@ void OnceUpon::playTitleMusicAtariST() { } void OnceUpon::stopTitleMusic() { + // Just stop everything + _vm->_sound->adlibSetRepeating(0); _vm->_sound->blasterRepeatComposition(0); @@ -625,55 +736,29 @@ void OnceUpon::showByeBye() { fadeOut(); } -OnceUpon::MenuAction OnceUpon::doMenu(MenuType type) { - bool cursorVisible = isCursorVisible(); - - // Set the cursor - addCursor(); - setGameCursor(); - - // Backup the screen - Surface screenBackup(320, 200, 1); - screenBackup.blit(*_vm->_draw->_backSurface); - - // Handle the specific menu - MenuAction action; - if (type == kMenuTypeMainStart) - action = doMenuMainStart(); - else if (type == kMenuTypeMainIngame) - action = doMenuMainIngame(); - else if (type == kMenuTypeIngame) - action = doMenuIngame(); - else - error("OnceUpon::doMenu(): No such menu %d", type); - - if (_vm->shouldQuit()) - return action; - - // The ingame menu cleans itself up in a special way - if (type == kMenuTypeIngame) - clearMenuIngame(screenBackup); - - // The main menus fade out - if ((type == kMenuTypeMainStart) || (type == kMenuTypeMainIngame)) - fadeOut(); - - // Restore the screen - _vm->_draw->_backSurface->blit(screenBackup); - _vm->_draw->forceBlit(); +void OnceUpon::doStartMenu(const MenuButton *animalsButton, uint animalCount, + const MenuButton *animalButtons, const char * const *animalNames) { + clearScreen(); - // Restore the cursor - if (!cursorVisible) - hideCursor(); - removeCursor(); + // Wait until we clicked on of the difficulty buttons and are ready to start playing + while (!_vm->shouldQuit()) { + MenuAction action = handleStartMenu(animalsButton); + if (action == kMenuActionPlay) + break; - return action; + // If we pressed the "listen to animal names" button, handle that screen + if (action == kMenuActionAnimals) + handleAnimalNames(animalCount, animalButtons, animalNames); + } } -OnceUpon::MenuAction OnceUpon::doMenuMainStart() { +OnceUpon::MenuAction OnceUpon::handleStartMenu(const MenuButton *animalsButton) { + ScreenBackup screenBackup; + backupScreen(screenBackup, true); + fadeOut(); setGamePalette(17); - drawMenuMainStart(); + drawStartMenu(animalsButton); showCursor(); fadeIn(); @@ -702,22 +787,28 @@ OnceUpon::MenuAction OnceUpon::doMenuMainStart() { _difficulty = (Difficulty)diff; action = kMenuActionPlay; - drawMenuMainStart(); + drawStartMenu(animalsButton); _vm->_util->longDelay(1000); } - if (_animalsButton && (checkButton(_animalsButton, 1, mouseX, mouseY) != -1)) + if (animalsButton && (checkButton(animalsButton, 1, mouseX, mouseY) != -1)) action = kMenuActionAnimals; } + fadeOut(); + restoreScreen(screenBackup); + return action; } -OnceUpon::MenuAction OnceUpon::doMenuMainIngame() { +OnceUpon::MenuAction OnceUpon::handleMainMenu() { + ScreenBackup screenBackup; + backupScreen(screenBackup, true); + fadeOut(); setGamePalette(17); - drawMenuMainIngame(); + drawMainMenu(); showCursor(); fadeIn(); @@ -745,7 +836,7 @@ OnceUpon::MenuAction OnceUpon::doMenuMainIngame() { if ((diff >= 0) && (diff != (int)_difficulty)) { _difficulty = (Difficulty)diff; - drawMenuMainIngame(); + drawMainMenu(); } // If we clicked on a section button, restart the game from this section @@ -757,11 +848,17 @@ OnceUpon::MenuAction OnceUpon::doMenuMainIngame() { } + fadeOut(); + restoreScreen(screenBackup); + return action; } -OnceUpon::MenuAction OnceUpon::doMenuIngame() { - drawMenuIngame(); +OnceUpon::MenuAction OnceUpon::handleIngameMenu() { + ScreenBackup screenBackup; + backupScreen(screenBackup, true); + + drawIngameMenu(); showCursor(); MenuAction action = kMenuActionNone; @@ -791,20 +888,23 @@ OnceUpon::MenuAction OnceUpon::doMenuIngame() { } + clearIngameMenu(*screenBackup.screen); + restoreScreen(screenBackup); + return action; } -void OnceUpon::drawMenuMainStart() { +void OnceUpon::drawStartMenu(const MenuButton *animalsButton) { // Draw the background _vm->_video->drawPackedSprite("menu2.cmp", *_vm->_draw->_backSurface); // Draw the "Listen to animal names" button - if (_animalsButton) { + if (animalsButton) { Surface elements(320, 38, 1); _vm->_video->drawPackedSprite("elemenu.cmp", elements); - _vm->_draw->_backSurface->fillRect(_animalsButton->left , _animalsButton->top, - _animalsButton->right, _animalsButton->bottom, 0); - drawButton(*_vm->_draw->_backSurface, elements, *_animalsButton); + _vm->_draw->_backSurface->fillRect(animalsButton->left , animalsButton->top, + animalsButton->right, animalsButton->bottom, 0); + drawButton(*_vm->_draw->_backSurface, elements, *animalsButton); } // Highlight the current difficulty @@ -813,7 +913,7 @@ void OnceUpon::drawMenuMainStart() { _vm->_draw->forceBlit(); } -void OnceUpon::drawMenuMainIngame() { +void OnceUpon::drawMainMenu() { // Draw the background _vm->_video->drawPackedSprite("menu.cmp", *_vm->_draw->_backSurface); @@ -837,11 +937,11 @@ void OnceUpon::drawMenuMainIngame() { _vm->_draw->forceBlit(); } -void OnceUpon::drawMenuIngame() { +void OnceUpon::drawIngameMenu() { Surface menu(320, 34, 1); _vm->_video->drawPackedSprite("icon.cmp", menu); - // Draw the menu in a special way + // Draw the menu in a special way, button by button for (uint i = 0; i < ARRAYSIZE(kIngameButtons); i++) { const MenuButton &button = kIngameButtons[i]; @@ -863,16 +963,15 @@ void OnceUpon::drawMenuDifficulty() { difficulties->draw((uint) _difficulty, *_vm->_draw->_backSurface, &_plettre, 1); // Draw a border around the current difficulty - _vm->_draw->_backSurface->drawRect(kMainMenuDifficultyButton[_difficulty].left, - kMainMenuDifficultyButton[_difficulty].top, - kMainMenuDifficultyButton[_difficulty].right, - kMainMenuDifficultyButton[_difficulty].bottom, - difficulties->getLines()[_difficulty].color); + drawButtonBorder(kMainMenuDifficultyButton[_difficulty], difficulties->getLines()[_difficulty].color); delete difficulties; } -void OnceUpon::clearMenuIngame(const Surface &background) { +void OnceUpon::clearIngameMenu(const Surface &background) { + if (_vm->shouldQuit()) + return; + // Find the area encompassing the whole ingame menu int16 left = 0x7FFF; @@ -900,6 +999,8 @@ void OnceUpon::clearMenuIngame(const Surface &background) { } int OnceUpon::checkButton(const MenuButton *buttons, uint count, int16 x, int16 y, int failValue) const { + // Look through all buttons, and return the ID of the button we're in + for (uint i = 0; i < count; i++) { const MenuButton &button = buttons[i]; @@ -907,6 +1008,7 @@ int OnceUpon::checkButton(const MenuButton *buttons, uint count, int16 x, int16 return (int)button.id; } + // We're in none of these buttons, return the fail value return failValue; } @@ -931,12 +1033,12 @@ void OnceUpon::drawButtonBorder(const MenuButton &button, uint8 color) { } enum AnimalNamesState { - kANStateChoose, - kANStateNames, - kANStateFinish + kANStateChoose, // We're in the animal chooser + kANStateNames, // We're in the language chooser + kANStateFinish // We're finished }; -void OnceUpon::doAnimalNames(uint count, const MenuButton *buttons, const char * const *names) { +void OnceUpon::handleAnimalNames(uint count, const MenuButton *buttons, const char * const *names) { fadeOut(); clearScreen(); setGamePalette(19); @@ -1100,45 +1202,8 @@ void OnceUpon::anPlayAnimalName(const Common::String &animal, uint language) { _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 78, 123, 239, 145); } -void OnceUpon::drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, - int16 x, int16 y) const { - - // A special way of drawing something: - // Draw every other line "downwards", wait a bit after each line - // Then, draw the remaining lines "upwards" and again wait a bit after each line. - - if (_vm->shouldQuit()) - return; - - const int16 width = right - left + 1; - const int16 height = bottom - top + 1; - - if ((width <= 0) || (height <= 0)) - return; - - for (int16 i = 0; i < height; i += 2) { - if (_vm->shouldQuit()) - return; - - _vm->_draw->_backSurface->blit(src, left, top + i, right, top + i, x, y + i); - - _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, x, y + i, x + width - 1, y + 1); - _vm->_draw->blitInvalidated(); - - _vm->_util->longDelay(1); - } - - for (int16 i = (height & 1) ? height : (height - 1); i >= 0; i -= 2) { - if (_vm->shouldQuit()) - return; - - _vm->_draw->_backSurface->blit(src, left, top + i, right, top + i, x, y + i); - - _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, x, y + i, x + width - 1, y + 1); - _vm->_draw->blitInvalidated(); - - _vm->_util->longDelay(1); - } +void OnceUpon::playGame() { + warning("OnceUpon::playGame(): TODO"); } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 6f8b67a627..08c8803c67 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -38,18 +38,67 @@ namespace OnceUpon { class OnceUpon : public PreGob { public: + /** Number of languages we support. */ static const uint kLanguageCount = 5; + OnceUpon(GobEngine *vm); ~OnceUpon(); + protected: - enum MenuType { - kMenuTypeMainStart = 0, ///< The big main menu at game start. - kMenuTypeMainIngame, ///< The big main menu during the game. - kMenuTypeIngame ///< The small popup menu during the game. + /** A description of a menu button. */ + struct MenuButton { + bool needDraw; ///< Does the button need drawing? + + int16 left; ///< Left coordinate of the button. + int16 top; ///< Top coordinate of the button. + int16 right; ///< Right coordinate of the button. + int16 bottom; ///< Bottom coordinate of the button. + + int16 srcLeft; ///< Left coordinate of the button's sprite. + int16 srcTop; ///< Top coordinate of the button's sprite. + int16 srcRight; ///< Right coordinate of the button's sprite. + int16 srcBottom; ///< Right coordinate of the button's sprite. + + int16 dstX; ///< Destination X coordinate of the button's sprite. + int16 dstY; ///< Destination Y coordinate of the button's sprite. + + uint id; ///< The button's ID. }; + + void init(); + void deinit(); + + /** Handle the copy protection. + * + * @param colors Colors the copy protection animals can be. + * @param shapes The shape that's the correct answer for each animal in each color. + * @param obfuscate Extra obfuscate table. correctShape = shapes[colors][obfuscate[animal]]. + * @return true if the user guessed the correct shape, false otherwise. + */ + bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); + + /** Show the intro. */ + void showIntro(); + + /** Handle the start menu. + * + * @param animalsButton Definition of the menu button that leads to the animal names screen. Can be 0. + * @param animalCount Number of animals in the animal names screen. + * @param animalButtons Definition of the buttons that make up the animals in the animal names screen. + * @param animalNames File prefixes for the name of each animal. + */ + void doStartMenu(const MenuButton *animalsButton, uint animalCount, + const MenuButton *animalButtons, const char * const *animalNames); + + /** Play the game proper. */ + void playGame(); + + +private: + /** All actions a user can request in a menu. */ enum MenuAction { kMenuActionNone = 0, ///< No action. kMenuActionAnimals , ///< Do the animal names. @@ -59,6 +108,7 @@ protected: kMenuActionQuit ///< Quit the game. }; + /** Difficulty levels. */ enum Difficulty { kDifficultyBeginner = 0, kDifficultyIntermediate = 1, @@ -66,115 +116,148 @@ protected: kDifficultyMAX }; + /** The different sounds common in the game. */ enum Sound { kSoundClick = 0, kSoundMAX }; - struct MenuButton { - bool needDraw; - int16 left, top, right, bottom; - int16 srcLeft, srcTop, srcRight, srcBottom; - int16 dstX, dstY; - uint id; - }; + /** A complete screen backup. */ + struct ScreenBackup { + Surface *screen; ///< Screen contents. + int palette; ///< Screen palette. - static const uint kSectionCount = 15; + bool changedCursor; ///< Did we change the cursor? + bool cursorVisible; ///< Was the cursor visible? + ScreenBackup(); + ~ScreenBackup(); + }; - void init(); - void deinit(); - void setAnimalsButton(const MenuButton *animalsButton); + /** The number of game sections. */ + static const uint kSectionCount = 15; - void setGamePalette(uint palette); - void setGameCursor(); + static const MenuButton kMainMenuDifficultyButton[]; ///< Difficulty buttons. + static const MenuButton kSectionButtons[]; ///< Section buttons. - Common::String fixString(const Common::String &str) const; - void fixTXTStrings(TXTFile &txt) const; + static const MenuButton kIngameButtons[]; ///< Ingame menu buttons. - bool doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4]); + static const MenuButton kAnimalNamesBack; ///< "Back" button in the animal names screens. + static const MenuButton kLanguageButtons[]; ///< Language buttons in the animal names screen. - void showWait(uint palette = 0xFFFF); ///< Show the wait / loading screen. - void showIntro(); ///< Show the whole intro. + /** All general game sounds we know about. */ + static const char *kSound[kSoundMAX]; - void showChapter(int chapter); ///< Show a chapter intro text. - void showByeBye(); ///< Show the "bye bye" screen + // -- General helpers -- - MenuAction doMenu(MenuType type); + void setGamePalette(uint palette); ///< Set a game palette. + void setGameCursor(); ///< Set the default game cursor. - void doAnimalNames(uint count, const MenuButton *buttons, const char * const *names); + /** Set the state of an ANIObject. */ + void setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const; + /** Draw this sprite in a fancy, animated line-by-line way. */ void drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y) const; + /** Backup the screen contents. */ + void backupScreen(ScreenBackup &backup, bool setDefaultCursor = false); + /** Restore the screen contents with a previously made backup. */ + void restoreScreen(ScreenBackup &backup); - // Fonts - Font *_jeudak; - Font *_lettre; - Font *_plettre; - Font *_glettre; + Common::String fixString(const Common::String &str) const; ///< Fix a string if necessary. + void fixTXTStrings(TXTFile &txt) const; ///< Fix all strings in a TXT. - Difficulty _difficulty; - uint8 _section; -private: - static const MenuButton kMainMenuDifficultyButton[]; - static const MenuButton kSectionButtons[]; - static const MenuButton kIngameButtons[]; + // -- Copy protection helpers -- - static const MenuButton kAnimalNamesBack; - static const MenuButton kLanguageButtons[]; + /** Set up the copy protection. */ + int8 cpSetup(const uint8 colors[7], const uint8 shapes[7 * 20], + const uint8 obfuscate[4], const Surface sprites[2]); + /** Find the shape under these coordinates. */ + int8 cpFindShape(int16 x, int16 y) const; + /** Display the "You are wrong" screen. */ + void cpWrong(); - static const char *kSound[kSoundMAX]; + // -- Show different game screens -- - void setCopyProtectionPalette(); + void showWait(uint palette = 0xFFFF); ///< Show the wait / loading screen. + void showQuote(); ///< Show the quote about fairytales. + void showTitle(); ///< Show the Once Upon A Time title. + void showChapter(int chapter); ///< Show a chapter intro text. + void showByeBye(); ///< Show the "bye bye" screen. - void setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const; + /** Handle the "listen to animal names" part. */ + void handleAnimalNames(uint count, const MenuButton *buttons, const char * const *names); - // Copy protection helpers - int8 cpSetup(const uint8 colors[7], const uint8 shapes[7 * 20], const uint8 obfuscate[4], const Surface sprites[2]); - int8 cpFindShape(int16 x, int16 y) const; - void cpWrong(); - // Intro parts - void showQuote(); - void showTitle(); - - // Title music - void playTitleMusic(); - void playTitleMusicDOS(); - void playTitleMusicAmiga(); - void playTitleMusicAtariST(); - void stopTitleMusic(); - - // Menu helpers - MenuAction doMenuMainStart(); - MenuAction doMenuMainIngame(); - MenuAction doMenuIngame(); - - void drawMenuMainStart(); - void drawMenuMainIngame(); - void drawMenuIngame(); + // -- Title music helpers -- + + void playTitleMusic(); ///< Play the title music. + void playTitleMusicDOS(); ///< Play the title music of the DOS version. + void playTitleMusicAmiga(); ///< Play the title music of the Amiga version. + void playTitleMusicAtariST(); ///< Play the title music of the Atari ST version. + void stopTitleMusic(); ///< Stop the title music. + + + // -- Menu helpers -- + + MenuAction handleStartMenu(const MenuButton *animalsButton); ///< Handle the start menu. + MenuAction handleMainMenu(); ///< Handle the main menu. + MenuAction handleIngameMenu(); ///< Handle the ingame menu. + + void drawStartMenu(const MenuButton *animalsButton); ///< Draw the start menu. + void drawMainMenu(); ///< Draw the main menu. + void drawIngameMenu(); ///< Draw the ingame menu. + + /** Draw the difficulty label. */ void drawMenuDifficulty(); - void clearMenuIngame(const Surface &background); + /** Clear the ingame menu in an animated way. */ + void clearIngameMenu(const Surface &background); + + // -- Menu button helpers -- + + /** Find the button under these coordinates. */ int checkButton(const MenuButton *buttons, uint count, int16 x, int16 y, int failValue = -1) const; - void drawButton(Surface &dest, const Surface &src, const MenuButton &button) const; + + /** Draw a menu button. */ + void drawButton (Surface &dest, const Surface &src, const MenuButton &button) const; + /** Draw multiple menu buttons. */ void drawButtons(Surface &dest, const Surface &src, const MenuButton *buttons, uint count) const; + + /** Draw a border around a button. */ void drawButtonBorder(const MenuButton &button, uint8 color); - // Animal names helpers + + // -- Animal names helpers -- + + /** Set up the animal chooser. */ void anSetupChooser(); + /** Set up the language chooser for one animal. */ void anSetupNames(const MenuButton &animal); + /** Play / Display the name of an animal in one language. */ void anPlayAnimalName(const Common::String &animal, uint language); + + /** Did we open the game archives? */ bool _openedArchives; - const MenuButton *_animalsButton; + // Fonts + Font *_jeudak; + Font *_lettre; + Font *_plettre; + Font *_glettre; + + /** The current palette. */ + int _palette; + + Difficulty _difficulty; ///< The current difficulty. + uint8 _section; ///< The current game section. }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index a1a3d65a58..e62a59042b 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -51,7 +51,10 @@ protected: static const char *kLanguageSuffixLong [5]; - void initScreen(); ///< Initialize the game screen. + // -- Graphics -- + + /** Initialize the game screen. */ + void initScreen(); void fadeOut(); ///< Fade to black. void fadeIn(); ///< Fade to the current palette. @@ -65,51 +68,86 @@ protected: */ void setPalette(const byte *palette, uint16 size); ///< Change the palette + /** Add a new cursor that can be manipulated to the stack. */ void addCursor(); + /** Remove the top-most cursor from the stack. */ void removeCursor(); + /** Set the current cursor. */ void setCursor(Surface &sprite, int16 hotspotX, int16 hotspotY); + /** Set the current cursor. */ void setCursor(Surface &sprite, int16 left, int16 top, int16 right, int16 bottom, int16 hotspotX, int16 hotspotY); + /** Show the cursor. */ void showCursor(); + /** Hide the cursor. */ void hideCursor(); + /** Is the cursor currently visible? */ bool isCursorVisible() const; + /** Remove an animation from the screen. */ + void clearAnim(ANIObject &ani); + /** Draw an animation to the screen, advancing it. */ + void drawAnim(ANIObject &ani); + /** Clear and draw an animation to the screen, advancing it. */ + void redrawAnim(ANIObject &ani); + + /** Wait for the frame to end, handling screen updates and optionally update input. */ + void endFrame(bool doInput); + + + // -- Sound -- + + /** Load all sounds that can be played interactively in the game. */ void loadSounds(const char * const *sounds, uint soundCount); + /** Free all loaded sound. */ void freeSounds(); + /** Play a loaded sound. */ void playSound(uint sound, int16 frequency = 0, int16 repCount = 0); + /** Stop all sound playback. */ void stopSound(); + /** Play a sound until it ends or is interrupted by a keypress. */ void playSoundFile(const Common::String &file, int16 frequency = 0, int16 repCount = 0, bool interruptible = true); - void endFrame(bool doInput); + // -- Input -- + + /** Check mouse and keyboard input. */ int16 checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons); + /** Wait for mouse or keyboard input. */ int16 waitInput (int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons); + /** Wait for mouse or keyboard input, but don't care about what was done with the mouse. */ int16 waitInput(); + /** Did we have mouse or keyboard input? */ bool hasInput(); - void clearAnim(ANIObject &ani); - void drawAnim(ANIObject &ani); - void redrawAnim(ANIObject &ani); + // -- TXT helpers -- + + /** Get the name of a localized file. */ Common::String getLocFile(const Common::String &file) const; + /** Open a TXT file. */ TXTFile *loadTXT(const Common::String &txtFile, TXTFile::Format format) const; + /** Called by loadTXT() to fix strings within the TXT file. */ virtual void fixTXTStrings(TXTFile &txt) const; GobEngine *_vm; private: + /** Load a sound file. */ bool loadSound(SoundDesc &sound, const Common::String &file) const; - bool _fadedOut; ///< Did we fade out? + /** Did we fade out? */ + bool _fadedOut; + /** All loaded sounds. */ Common::Array _sounds; }; -- cgit v1.2.3 From 60f52ab9a0beccccca4958fbcf4d369e6dd22748 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 2 Jul 2012 18:15:38 +0200 Subject: GOB: Add the frame for normal Once Upon A Time game play --- engines/gob/pregob/onceupon/brokenstrings.h | 7 +- engines/gob/pregob/onceupon/onceupon.cpp | 154 +++++++++++++++++++++++++++- engines/gob/pregob/onceupon/onceupon.h | 35 ++++++- 3 files changed, 191 insertions(+), 5 deletions(-) diff --git a/engines/gob/pregob/onceupon/brokenstrings.h b/engines/gob/pregob/onceupon/brokenstrings.h index 98dcb720fb..0a40493cc1 100644 --- a/engines/gob/pregob/onceupon/brokenstrings.h +++ b/engines/gob/pregob/onceupon/brokenstrings.h @@ -40,7 +40,12 @@ static const BrokenString kBrokenStringsGerman[] = { { " Fortgeschrittene" , " Fortgeschritten" }, { "die Vespe" , "die Wespe" }, { "das Rhinoceros" , "das Rhinozeros" }, - { "die Heusschrecke" , "die Heuschrecke" } + { "die Heusschrecke" , "die Heuschrecke" }, + { "Das, von Drachen gebrachte" , "Das vom Drachen gebrachte" }, + { "Am Waldesrand es sieht" , "Am Waldesrand sieht es" }, + { " das Kind den Palast." , "das Kind den Palast." }, + { "Am Waldessaum sieht" , "Am Waldesrand sieht" }, + { "tipp auf ESC!" , "dr\201cke ESC!" } }; static const BrokenStringLanguage kBrokenStrings[kLanguageCount] = { diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 785d78b769..fb9629566c 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -131,6 +131,24 @@ const char *OnceUpon::kSound[kSoundMAX] = { "diamant.snd" }; +const OnceUpon::SectionFunc OnceUpon::kSectionFuncs[kSectionCount] = { + &OnceUpon::sectionStork, + &OnceUpon::sectionChapter1, + &OnceUpon::section02, + &OnceUpon::sectionChapter2, + &OnceUpon::section04, + &OnceUpon::sectionChapter3, + &OnceUpon::section06, + &OnceUpon::sectionChapter4, + &OnceUpon::section08, + &OnceUpon::sectionChapter5, + &OnceUpon::section10, + &OnceUpon::sectionChapter6, + &OnceUpon::section12, + &OnceUpon::sectionChapter7, + &OnceUpon::sectionEnd +}; + OnceUpon::ScreenBackup::ScreenBackup() : palette(-1), changedCursor(false), cursorVisible(false) { screen = new Surface(320, 200, 1); @@ -194,6 +212,9 @@ void OnceUpon::init() { // We start with an invalid palette _palette = -1; + // No quit requested at start + _quit = false; + // We start with no selected difficulty and at section 0 _difficulty = kDifficultyMAX; _section = 0; @@ -930,7 +951,7 @@ void OnceUpon::drawMainMenu() { if (!button.needDraw) continue; - if (_section >= (uint)button.id) + if (_section >= (int)button.id) drawButton(*_vm->_draw->_backSurface, elements, button); } @@ -998,6 +1019,41 @@ void OnceUpon::clearIngameMenu(const Surface &background) { drawLineByLine(background, left, top, right, bottom, left, top); } +OnceUpon::MenuAction OnceUpon::doIngameMenu() { + // Show the ingame menu + MenuAction action = handleIngameMenu(); + + if ((action == kMenuActionQuit) || _vm->shouldQuit()) { + + // User pressed the quit button, or quit ScummVM + _quit = true; + return kMenuActionQuit; + + } else if (action == kMenuActionPlay) { + + // User pressed the return to game button + return kMenuActionPlay; + + } else if (kMenuActionMainMenu) { + + // User pressed the return to main menu button + return handleMainMenu(); + } + + return action; +} + +OnceUpon::MenuAction OnceUpon::doIngameMenu(int16 key, MouseButtons mouseButtons) { + if ((key != kKeyEscape) && (mouseButtons != kMouseButtonsRight)) + return kMenuActionNone; + + MenuAction action = doIngameMenu(); + if (action == kMenuActionPlay) + return kMenuActionNone; + + return action; +} + int OnceUpon::checkButton(const MenuButton *buttons, uint count, int16 x, int16 y, int failValue) const { // Look through all buttons, and return the ID of the button we're in @@ -1203,7 +1259,101 @@ void OnceUpon::anPlayAnimalName(const Common::String &animal, uint language) { } void OnceUpon::playGame() { - warning("OnceUpon::playGame(): TODO"); + while (!_vm->shouldQuit() && !_quit) { + // Play a section and advance to the next section if we finished it + if (playSection()) + _section = MIN(_section + 1, kSectionCount - 1); + } + + // If we quit through the game and not through ScummVM, show the "Bye Bye" screen + if (!_vm->shouldQuit()) + showByeBye(); +} + +bool OnceUpon::playSection() { + if ((_section < 0) || (_section >= ARRAYSIZE(kSectionFuncs))) { + _quit = true; + return false; + } + + return (this->*kSectionFuncs[_section])(); +} + +bool OnceUpon::sectionStork() { + warning("OnceUpon::sectionStork(): TODO"); + return true; +} + +bool OnceUpon::sectionChapter1() { + showChapter(1); + return true; +} + +bool OnceUpon::section02() { + warning("OnceUpon::section02(): TODO"); + return true; +} + +bool OnceUpon::sectionChapter2() { + showChapter(2); + return true; +} + +bool OnceUpon::section04() { + warning("OnceUpon::section04(): TODO"); + return true; +} + +bool OnceUpon::sectionChapter3() { + showChapter(3); + return true; +} + +bool OnceUpon::section06() { + warning("OnceUpon::section06(): TODO"); + return true; +} + +bool OnceUpon::sectionChapter4() { + showChapter(4); + return true; +} + +bool OnceUpon::section08() { + warning("OnceUpon::section08(): TODO"); + return true; +} + +bool OnceUpon::sectionChapter5() { + showChapter(5); + return true; +} + +bool OnceUpon::section10() { + warning("OnceUpon::section10(): TODO"); + return true; +} + +bool OnceUpon::sectionChapter6() { + showChapter(6); + return true; +} + +bool OnceUpon::section12() { + warning("OnceUpon::section12(): TODO"); + return true; +} + +bool OnceUpon::sectionChapter7() { + showChapter(7); + return true; +} + +bool OnceUpon::sectionEnd() { + warning("OnceUpon::sectionEnd(): TODO"); + + _quit = true; + return false; } } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 08c8803c67..0cae369758 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -136,7 +136,7 @@ private: /** The number of game sections. */ - static const uint kSectionCount = 15; + static const int kSectionCount = 15; static const MenuButton kMainMenuDifficultyButton[]; ///< Difficulty buttons. static const MenuButton kSectionButtons[]; ///< Section buttons. @@ -149,6 +149,10 @@ private: /** All general game sounds we know about. */ static const char *kSound[kSoundMAX]; + /** Function pointer type for a section handler. */ + typedef bool (OnceUpon::*SectionFunc)(); + /** Section handler function. */ + static const SectionFunc kSectionFuncs[kSectionCount]; // -- General helpers -- @@ -219,6 +223,11 @@ private: /** Clear the ingame menu in an animated way. */ void clearIngameMenu(const Surface &background); + /** Handle the whole ingame menu. */ + MenuAction doIngameMenu(); + /** Handle the whole ingame menu if ESC or right mouse button was pressed. */ + MenuAction doIngameMenu(int16 key, MouseButtons mouseButtons); + // -- Menu button helpers -- @@ -243,6 +252,26 @@ private: /** Play / Display the name of an animal in one language. */ void anPlayAnimalName(const Common::String &animal, uint language); + // -- Game sections -- + + bool playSection(); + + bool sectionStork(); + bool sectionChapter1(); + bool section02(); + bool sectionChapter2(); + bool section04(); + bool sectionChapter3(); + bool section06(); + bool sectionChapter4(); + bool section08(); + bool sectionChapter5(); + bool section10(); + bool sectionChapter6(); + bool section12(); + bool sectionChapter7(); + bool sectionEnd(); + /** Did we open the game archives? */ bool _openedArchives; @@ -256,8 +285,10 @@ private: /** The current palette. */ int _palette; + bool _quit; ///< Did the user request a normal game quit? + Difficulty _difficulty; ///< The current difficulty. - uint8 _section; ///< The current game section. + int _section; ///< The current game section. }; } // End of namespace OnceUpon -- cgit v1.2.3 From df18bc95834837f1f905bfe5613ffd43dfc908f9 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 2 Jul 2012 21:31:23 +0200 Subject: GOB: Implement parts of the Once Upon A Time end sequence We don't yet support GCT files, so texts are still missing. --- engines/gob/pregob/onceupon/onceupon.cpp | 103 +++++++++++++++++++++++++------ engines/gob/pregob/onceupon/onceupon.h | 10 ++- engines/gob/pregob/pregob.cpp | 62 ++++++++++++++++--- engines/gob/pregob/pregob.h | 37 +++++++++-- 4 files changed, 176 insertions(+), 36 deletions(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index fb9629566c..aed1b45e02 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -264,14 +264,6 @@ void OnceUpon::setGameCursor() { setCursor(cursor, 105, 0, 120, 15, 0, 0); } -void OnceUpon::setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const { - ani.setAnimation(state); - ani.setMode(once ? ANIObject::kModeOnce : ANIObject::kModeContinuous); - ani.setPause(pause); - ani.setVisible(true); - ani.setPosition(); -} - void OnceUpon::drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y) const { @@ -374,6 +366,18 @@ Common::String OnceUpon::fixString(const Common::String &str) const { return str; } +enum ClownAnimation { + kClownAnimationStand = 0, + kClownAnimationCheer = 1, + kClownAnimationCry = 2 +}; + +const PreGob::AnimProperties OnceUpon::kClownAnimations[] = { + { 1, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 0, 0, ANIObject::kModeOnce , true, false, false, 0, 0}, + { 6, 0, ANIObject::kModeOnce , true, false, false, 0, 0} +}; + enum CopyProtectionState { kCPStateSetup, // Set up the screen kCPStateWaitUser, // Waiting for the user to pick a shape @@ -392,8 +396,10 @@ bool OnceUpon::doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20 _vm->_video->drawPackedSprite("grille2.cmp", sprites[1]); // Load the clown animation - ANIFile ani (_vm, "grille.ani", 320); - ANIObject clown(ani); + ANIFile ani (_vm, "grille.ani", 320); + ANIList anims; + + loadAnims(anims, ani, 1, &kClownAnimations[kClownAnimationStand]); // Set the copy protection cursor setCursor(sprites[1], 5, 110, 20, 134, 3, 0); @@ -406,20 +412,20 @@ bool OnceUpon::doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20 bool hasCorrect = false; while (!_vm->shouldQuit() && (state != kCPStateFinish)) { - clearAnim(clown); + clearAnim(anims); // Set up the screen if (state == kCPStateSetup) { animalShape = cpSetup(colors, shapes, obfuscate, sprites); - setAnimState(clown, kClownAnimationClownStand, false, false); + setAnim(*anims[0], kClownAnimations[kClownAnimationStand]); state = kCPStateWaitUser; } - drawAnim(clown); + drawAnim(anims); // If we're waiting for the clown and he finished, evaluate if we're finished - if (!clown.isVisible() && (state == kCPStateWaitClown)) + if (!anims[0]->isVisible() && (state == kCPStateWaitClown)) state = (hasCorrect || (--triesLeft == 0)) ? kCPStateFinish : kCPStateSetup; showCursor(); @@ -443,12 +449,14 @@ bool OnceUpon::doCopyProtection(const uint8 colors[7], const uint8 shapes[7 * 20 hasCorrect = guessedShape == animalShape; animalShape = -1; - setAnimState(clown, hasCorrect ? kClownAnimationClownCheer : kClownAnimationClownCry, true, false); + setAnim(*anims[0], kClownAnimations[hasCorrect ? kClownAnimationCheer : kClownAnimationCry]); state = kCPStateWaitClown; } } } + freeAnims(anims); + fadeOut(); hideCursor(); clearScreen(); @@ -625,6 +633,10 @@ void OnceUpon::showQuote() { fadeOut(); } +const PreGob::AnimProperties OnceUpon::kTitleAnimation = { + 8, 0, ANIObject::kModeContinuous, true, false, false, 0, 0 +}; + void OnceUpon::showTitle() { // Show the Once Upon A Time title animation // NOTE: This is currently only a mock-up. The real animation is in "ville.seq". @@ -639,15 +651,15 @@ void OnceUpon::showTitle() { _vm->_video->drawPackedSprite("ville.cmp", *_vm->_draw->_backSurface); _vm->_draw->forceBlit(); - ANIFile ani (_vm, "pres.ani", 320); - ANIObject title(ani); + ANIFile ani (_vm, "pres.ani", 320); + ANIList anims; - setAnimState(title, 8, false, false); + loadAnims(anims, ani, 1, &kTitleAnimation); playTitleMusic(); while (!_vm->shouldQuit()) { - redrawAnim(title); + redrawAnim(anims); fadeIn(); @@ -657,6 +669,8 @@ void OnceUpon::showTitle() { break; } + freeAnims(anims); + fadeOut(); stopTitleMusic(); } @@ -1349,9 +1363,58 @@ bool OnceUpon::sectionChapter7() { return true; } +const PreGob::AnimProperties OnceUpon::kSectionEndAnimations[] = { + { 0, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 6, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 9, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + {11, 0, ANIObject::kModeContinuous, true, false, false, 0, 0} +}; + bool OnceUpon::sectionEnd() { - warning("OnceUpon::sectionEnd(): TODO"); + fadeOut(); + setGamePalette(9); + + _vm->_video->drawPackedSprite("cadre.cmp", *_vm->_draw->_backSurface); + + Surface endBackground(320, 200, 1); + _vm->_video->drawPackedSprite("fin.cmp", endBackground); + + _vm->_draw->_backSurface->blit(endBackground, 0, 0, 288, 137, 16, 50); + + ANIFile ani(_vm, "fin.ani", 320); + ANIList anims; + + loadAnims(anims, ani, ARRAYSIZE(kSectionEndAnimations), kSectionEndAnimations); + drawAnim(anims); + + _vm->_draw->forceBlit(); + + MenuAction action = kMenuActionNone; + while (!_vm->shouldQuit() && (action == kMenuActionNone)) { + redrawAnim(anims); + + fadeIn(); + + endFrame(true); + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + int16 key = checkInput(mouseX, mouseY, mouseButtons); + if ((key != 0) && (key != kKeyEscape)) + // Any key pressed => Quit + action = kMenuActionQuit; + + action = doIngameMenu(key, mouseButtons); + } + + freeAnims(anims); + + // Restart requested + if (action == kMenuActionRestart) + return false; + // Last scene. Even if we didn't explicitly request a quit, the game ends here _quit = true; return false; } diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 0cae369758..caaf155d06 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -149,19 +149,23 @@ private: /** All general game sounds we know about. */ static const char *kSound[kSoundMAX]; + + static const AnimProperties kClownAnimations[]; + static const AnimProperties kTitleAnimation; + static const AnimProperties kSectionEndAnimations[]; + + /** Function pointer type for a section handler. */ typedef bool (OnceUpon::*SectionFunc)(); /** Section handler function. */ static const SectionFunc kSectionFuncs[kSectionCount]; + // -- General helpers -- void setGamePalette(uint palette); ///< Set a game palette. void setGameCursor(); ///< Set the default game cursor. - /** Set the state of an ANIObject. */ - void setAnimState(ANIObject &ani, uint16 state, bool once, bool pause) const; - /** Draw this sprite in a fancy, animated line-by-line way. */ void drawLineByLine(const Surface &src, int16 left, int16 top, int16 right, int16 bottom, int16 x, int16 y) const; diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 675958035d..4ee5430de7 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -251,24 +251,70 @@ bool PreGob::hasInput() { return checkInput(mouseX, mouseY, mouseButtons) || (mouseButtons != kMouseButtonsNone); } -void PreGob::clearAnim(ANIObject &ani) { +void PreGob::clearAnim(ANIObject &anim) { int16 left, top, right, bottom; - if (ani.clear(*_vm->_draw->_backSurface, left, top, right, bottom)) + if (anim.clear(*_vm->_draw->_backSurface, left, top, right, bottom)) _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); } -void PreGob::drawAnim(ANIObject &ani) { +void PreGob::drawAnim(ANIObject &anim) { int16 left, top, right, bottom; - if (ani.draw(*_vm->_draw->_backSurface, left, top, right, bottom)) + if (anim.draw(*_vm->_draw->_backSurface, left, top, right, bottom)) _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); - ani.advance(); + anim.advance(); } -void PreGob::redrawAnim(ANIObject &ani) { - clearAnim(ani); - drawAnim(ani); +void PreGob::redrawAnim(ANIObject &anim) { + clearAnim(anim); + drawAnim(anim); +} + +void PreGob::clearAnim(const ANIList &anims) { + for (int i = (anims.size() - 1); i >= 0; i--) + clearAnim(*anims[i]); +} + +void PreGob::drawAnim(const ANIList &anims) { + for (ANIList::const_iterator a = anims.begin(); a != anims.end(); ++a) + drawAnim(**a); +} + +void PreGob::redrawAnim(const ANIList &anims) { + clearAnim(anims); + drawAnim(anims); +} + +void PreGob::loadAnims(ANIList &anims, ANIFile &ani, uint count, const AnimProperties *props) const { + freeAnims(anims); + + anims.resize(count); + for (uint i = 0; i < count; i++) { + anims[i] = new ANIObject(ani); + + setAnim(*anims[i], props[i]); + } +} + +void PreGob::freeAnims(ANIList &anims) const { + for (ANIList::iterator a = anims.begin(); a != anims.end(); ++a) + delete *a; + + anims.clear(); +} + +void PreGob::setAnim(ANIObject &anim, const AnimProperties &props) const { + anim.setAnimation(props.animation); + anim.setFrame(props.frame); + anim.setMode(props.mode); + anim.setPause(props.paused); + anim.setVisible(props.visible); + + if (props.hasPosition) + anim.setPosition(props.x, props.y); + else + anim.setPosition(); } Common::String PreGob::getLocFile(const Common::String &file) const { diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index e62a59042b..f1728036ab 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -27,6 +27,7 @@ #include "common/array.h" #include "gob/util.h" +#include "gob/aniobject.h" #include "gob/sound/sounddesc.h" @@ -37,8 +38,6 @@ namespace Gob { class GobEngine; class Surface; -class ANIObject; - class PreGob { public: PreGob(GobEngine *vm); @@ -46,7 +45,23 @@ public: virtual void run() = 0; + struct AnimProperties { + uint16 animation; + uint16 frame; + + ANIObject::Mode mode; + + bool visible; + bool paused; + + bool hasPosition; + int16 x; + int16 y; + }; + protected: + typedef Common::Array ANIList; + static const char kLanguageSuffixShort[5]; static const char *kLanguageSuffixLong [5]; @@ -88,11 +103,23 @@ protected: bool isCursorVisible() const; /** Remove an animation from the screen. */ - void clearAnim(ANIObject &ani); + void clearAnim(ANIObject &anim); /** Draw an animation to the screen, advancing it. */ - void drawAnim(ANIObject &ani); + void drawAnim(ANIObject &anim); /** Clear and draw an animation to the screen, advancing it. */ - void redrawAnim(ANIObject &ani); + void redrawAnim(ANIObject &anim); + + /** Remove animations from the screen. */ + void clearAnim(const ANIList &anims); + /** Draw animations to the screen, advancing them. */ + void drawAnim(const ANIList &anims); + /** Clear and draw animations to the screen, advancing them. */ + void redrawAnim(const ANIList &anims); + + void loadAnims(ANIList &anims, ANIFile &ani, uint count, const AnimProperties *props) const; + void freeAnims(ANIList &anims) const; + + void setAnim(ANIObject &anim, const AnimProperties &props) const; /** Wait for the frame to end, handling screen updates and optionally update input. */ void endFrame(bool doInput); -- cgit v1.2.3 From a547633911afa31964c10ed0222410aa9e66db80 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 5 Jul 2012 06:11:46 +0200 Subject: GOB: ANIObject can now predict the position/size of future frames --- engines/gob/aniobject.cpp | 32 ++++++++++++++++++++++++++------ engines/gob/aniobject.h | 8 ++++---- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/engines/gob/aniobject.cpp b/engines/gob/aniobject.cpp index 8d3a6897bf..7e3668a0ce 100644 --- a/engines/gob/aniobject.cpp +++ b/engines/gob/aniobject.cpp @@ -101,7 +101,7 @@ void ANIObject::getPosition(int16 &x, int16 &y) const { y = _y; } -void ANIObject::getFramePosition(int16 &x, int16 &y) const { +void ANIObject::getFramePosition(int16 &x, int16 &y, uint16 n) const { // CMP "animations" have no specific frame positions if (_cmp) { getPosition(x, y); @@ -115,11 +115,24 @@ void ANIObject::getFramePosition(int16 &x, int16 &y) const { if (_frame >= animation.frameCount) return; - x = _x + animation.frameAreas[_frame].left; - y = _y + animation.frameAreas[_frame].top; + // If we're paused, we don't advance any frames + if (_paused) + n = 0; + + // Number of cycles run through after n frames + uint16 cycles = (_frame + n) / animation.frameCount; + // Frame position after n frames + uint16 frame = (_frame + n) % animation.frameCount; + + // Only doing one cycle? + if (_mode == kModeOnce) + cycles = MAX(cycles, 1); + + x = _x + animation.frameAreas[frame].left + cycles * animation.deltaX; + y = _y + animation.frameAreas[frame].top + cycles * animation.deltaY; } -void ANIObject::getFrameSize(int16 &width, int16 &height) const { +void ANIObject::getFrameSize(int16 &width, int16 &height, uint16 n) const { if (_cmp) { width = _cmp->getWidth (_animation); height = _cmp->getHeight(_animation); @@ -134,8 +147,15 @@ void ANIObject::getFrameSize(int16 &width, int16 &height) const { if (_frame >= animation.frameCount) return; - width = animation.frameAreas[_frame].right - animation.frameAreas[_frame].left + 1; - height = animation.frameAreas[_frame].bottom - animation.frameAreas[_frame].top + 1; + // If we're paused, we don't advance any frames + if (_paused) + n = 0; + + // Frame position after n frames + uint16 frame = (_frame + n) % animation.frameCount; + + width = animation.frameAreas[frame].right - animation.frameAreas[frame].left + 1; + height = animation.frameAreas[frame].bottom - animation.frameAreas[frame].top + 1; } bool ANIObject::isIn(int16 x, int16 y) const { diff --git a/engines/gob/aniobject.h b/engines/gob/aniobject.h index 3c374f7b8f..d8c8edc2b8 100644 --- a/engines/gob/aniobject.h +++ b/engines/gob/aniobject.h @@ -70,10 +70,10 @@ public: /** Return the current position. */ void getPosition(int16 &x, int16 &y) const; - /** Return the current frame position. */ - void getFramePosition(int16 &x, int16 &y) const; - /** Return the current frame size. */ - void getFrameSize(int16 &width, int16 &height) const; + /** Return the frame position after another n frames. */ + void getFramePosition(int16 &x, int16 &y, uint16 n = 0) const; + /** Return the current frame size after another n frames. */ + void getFrameSize(int16 &width, int16 &height, uint16 n = 0) const; /** Are there coordinates within the animation sprite? */ bool isIn(int16 x, int16 y) const; -- cgit v1.2.3 From 0b030dd341b00007b969805ff6d488a51a1a97c7 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Thu, 5 Jul 2012 11:00:26 +0200 Subject: GOB: Implement parts of the Stork section in Once Upon A Time No GCT texts yet ("The stork is bringing a sweet baby to $PLACE where $PEOPLE live"), and the character creator is also still missing. --- engines/gob/module.mk | 1 + engines/gob/pregob/onceupon/abracadabra.cpp | 25 +++ engines/gob/pregob/onceupon/abracadabra.h | 8 + engines/gob/pregob/onceupon/babayaga.cpp | 25 +++ engines/gob/pregob/onceupon/babayaga.h | 8 + engines/gob/pregob/onceupon/brokenstrings.h | 3 +- engines/gob/pregob/onceupon/onceupon.cpp | 124 ++++++++++++++- engines/gob/pregob/onceupon/onceupon.h | 19 +++ engines/gob/pregob/onceupon/stork.cpp | 234 ++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/stork.h | 103 ++++++++++++ 10 files changed, 547 insertions(+), 3 deletions(-) create mode 100644 engines/gob/pregob/onceupon/stork.cpp create mode 100644 engines/gob/pregob/onceupon/stork.h diff --git a/engines/gob/module.mk b/engines/gob/module.mk index f8b477b92b..1b3f400684 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -83,6 +83,7 @@ MODULE_OBJS := \ pregob/onceupon/onceupon.o \ pregob/onceupon/abracadabra.o \ pregob/onceupon/babayaga.o \ + pregob/onceupon/stork.o \ minigames/geisha/evilfish.o \ minigames/geisha/oko.o \ minigames/geisha/meter.o \ diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 2e4b5f21e7..0d644d9056 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -78,6 +78,27 @@ const char *Abracadabra::kAnimalNames[] = { "scor" }; +// The houses where the stork can drop a bundle +const OnceUpon::MenuButton Abracadabra::kStorkHouses[] = { + {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0}, + {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1}, + {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2}, + {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3} +}; + +// The stork bundle drop parameters +const Stork::BundleDrop Abracadabra::kStorkBundleDrops[] = { + { 14, 65, 127, true }, + { 14, 76, 152, true }, + { 14, 204, 137, true }, + { 11, 275, 179, false } +}; + +// Parameters for the stork section. +const OnceUpon::StorkParam Abracadabra::kStorkParam = { + "present.cmp", ARRAYSIZE(kStorkHouses), kStorkHouses, kStorkBundleDrops +}; + Abracadabra::Abracadabra(GobEngine *vm) : OnceUpon(vm) { } @@ -107,6 +128,10 @@ void Abracadabra::run() { playGame(); } +const OnceUpon::StorkParam &Abracadabra::getStorkParameters() const { + return kStorkParam; +} + } // End of namespace OnceUpon } // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/abracadabra.h b/engines/gob/pregob/onceupon/abracadabra.h index f2075fc750..8048213f5f 100644 --- a/engines/gob/pregob/onceupon/abracadabra.h +++ b/engines/gob/pregob/onceupon/abracadabra.h @@ -36,6 +36,9 @@ public: void run(); +protected: + const StorkParam &getStorkParameters() const; + private: /** Definition of the menu button that leads to the animal names screen. */ static const MenuButton kAnimalsButtons; @@ -44,6 +47,11 @@ private: static const MenuButton kAnimalButtons[]; /** File prefixes for the name of each animal. */ static const char *kAnimalNames[]; + + // Parameters for the stork section. + static const MenuButton kStorkHouses[]; + static const Stork::BundleDrop kStorkBundleDrops[]; + static const struct StorkParam kStorkParam; }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 6f27f469e3..6aa60310b5 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -78,6 +78,27 @@ const char *BabaYaga::kAnimalNames[] = { "rena" }; +// The houses where the stork can drop a bundle +const OnceUpon::MenuButton BabaYaga::kStorkHouses[] = { + {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0}, + {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1}, + {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2}, + {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3} +}; + +// The stork bundle drop parameters +const Stork::BundleDrop BabaYaga::kStorkBundleDrops[] = { + { 14, 35, 129, true }, + { 14, 70, 148, true }, + { 14, 206, 136, true }, + { 11, 260, 225, false } +}; + +// Parameters for the stork section. +const OnceUpon::StorkParam BabaYaga::kStorkParam = { + "present2.cmp", ARRAYSIZE(kStorkHouses), kStorkHouses, kStorkBundleDrops +}; + BabaYaga::BabaYaga(GobEngine *vm) : OnceUpon(vm) { } @@ -107,6 +128,10 @@ void BabaYaga::run() { playGame(); } +const OnceUpon::StorkParam &BabaYaga::getStorkParameters() const { + return kStorkParam; +} + } // End of namespace OnceUpon } // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/babayaga.h b/engines/gob/pregob/onceupon/babayaga.h index 181b6f4d54..0241f78f4e 100644 --- a/engines/gob/pregob/onceupon/babayaga.h +++ b/engines/gob/pregob/onceupon/babayaga.h @@ -36,6 +36,9 @@ public: void run(); +protected: + const StorkParam &getStorkParameters() const; + private: /** Definition of the menu button that leads to the animal names screen. */ static const MenuButton kAnimalsButtons; @@ -44,6 +47,11 @@ private: static const MenuButton kAnimalButtons[]; /** File prefixes for the name of each animal. */ static const char *kAnimalNames[]; + + // Parameters for the stork section. + static const MenuButton kStorkHouses[]; + static const Stork::BundleDrop kStorkBundleDrops[]; + static const struct StorkParam kStorkParam; }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/brokenstrings.h b/engines/gob/pregob/onceupon/brokenstrings.h index 0a40493cc1..89acb1c6bd 100644 --- a/engines/gob/pregob/onceupon/brokenstrings.h +++ b/engines/gob/pregob/onceupon/brokenstrings.h @@ -45,7 +45,8 @@ static const BrokenString kBrokenStringsGerman[] = { { "Am Waldesrand es sieht" , "Am Waldesrand sieht es" }, { " das Kind den Palast." , "das Kind den Palast." }, { "Am Waldessaum sieht" , "Am Waldesrand sieht" }, - { "tipp auf ESC!" , "dr\201cke ESC!" } + { "tipp auf ESC!" , "dr\201cke ESC!" }, + { "Wohin fliegt der Drachen?" , "Wohin fliegt der Drache?" } }; static const BrokenStringLanguage kBrokenStrings[kLanguageCount] = { diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index aed1b45e02..aa08f6f1fd 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -128,7 +128,8 @@ const OnceUpon::MenuButton OnceUpon::kLanguageButtons[] = { }; const char *OnceUpon::kSound[kSoundMAX] = { - "diamant.snd" + "diamant.snd", // kSoundClick + "cigogne.snd" // kSoundStork }; const OnceUpon::SectionFunc OnceUpon::kSectionFuncs[kSectionCount] = { @@ -1293,9 +1294,128 @@ bool OnceUpon::playSection() { return (this->*kSectionFuncs[_section])(); } +const PreGob::AnimProperties OnceUpon::kSectionStorkAnimations[] = { + { 0, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 1, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 2, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 3, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 4, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 5, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 6, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 7, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + { 8, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + {17, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + {16, 0, ANIObject::kModeContinuous, true, false, false, 0, 0}, + {15, 0, ANIObject::kModeContinuous, true, false, false, 0, 0} +}; + +enum StorkState { + kStorkStateWaitUser, + kStorkStateWaitBundle, + kStorkStateFinish +}; + bool OnceUpon::sectionStork() { warning("OnceUpon::sectionStork(): TODO"); - return true; + + fadeOut(); + hideCursor(); + setGamePalette(0); + setGameCursor(); + + const StorkParam ¶m = getStorkParameters(); + + Surface backdrop(320, 200, 1); + + // Draw the frame + _vm->_video->drawPackedSprite("cadre.cmp", *_vm->_draw->_backSurface); + + // Draw the backdrop + _vm->_video->drawPackedSprite(param.backdrop, backdrop); + _vm->_draw->_backSurface->blit(backdrop, 0, 0, 288, 175, 16, 12); + + // "Where does the stork go?" + TXTFile *whereStork = loadTXT(getLocFile("ouva.tx"), TXTFile::kFormatStringPositionColor); + whereStork->draw(*_vm->_draw->_backSurface, &_plettre, 1); + + ANIFile ani(_vm, "present.ani", 320); + ANIList anims; + + Stork *stork = new Stork(_vm, ani); + + loadAnims(anims, ani, ARRAYSIZE(kSectionStorkAnimations), kSectionStorkAnimations); + anims.push_back(stork); + + drawAnim(anims); + + _vm->_draw->forceBlit(); + + int8 storkSoundWait = 0; + + StorkState state = kStorkStateWaitUser; + MenuAction action = kMenuActionNone; + while (!_vm->shouldQuit() && (state != kStorkStateFinish)) { + clearAnim(anims); + + // Play the stork sound + if (--storkSoundWait == 0) + playSound(kSoundStork); + if (storkSoundWait <= 0) + storkSoundWait = 50 - _vm->_util->getRandom(30); + + // Check if the bundle landed + if ((state == kStorkStateWaitBundle) && stork->hasBundleLanded()) + state = kStorkStateFinish; + + // Check user input + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + int16 key = checkInput(mouseX, mouseY, mouseButtons); + + action = doIngameMenu(key, mouseButtons); + if (action != kMenuActionNone) { + state = kStorkStateFinish; + break; + } + + if (mouseButtons == kMouseButtonsLeft) { + stopSound(); + playSound(kSoundClick); + + int house = checkButton(param.houses, param.houseCount, mouseX, mouseY); + if ((state == kStorkStateWaitUser) && (house >= 0)) { + + stork->dropBundle(param.drops[house]); + state = kStorkStateWaitBundle; + + // Remove the "Where does the stork go?" text + int16 left, top, right, bottom; + if (whereStork->clear(*_vm->_draw->_backSurface, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + } + } + + drawAnim(anims); + showCursor(); + fadeIn(); + + endFrame(true); + } + + freeAnims(anims); + delete whereStork; + + fadeOut(); + hideCursor(); + + // Completed the section => move one + if (action == kMenuActionNone) + return true; + + // Didn't complete the section + return false; } bool OnceUpon::sectionChapter1() { diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index caaf155d06..b9aef04dc2 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -27,6 +27,8 @@ #include "gob/pregob/pregob.h" +#include "gob/pregob/onceupon/stork.h" + namespace Gob { class Surface; @@ -67,6 +69,15 @@ protected: uint id; ///< The button's ID. }; + /** Parameters for the stork section. */ + struct StorkParam { + const char *backdrop; ///< Backdrop image file. + + uint houseCount; ///< Number of houses. + const MenuButton *houses; ///< House button definitions. + + const Stork::BundleDrop *drops; ///< The bundle drop parameters. + }; void init(); void deinit(); @@ -97,6 +108,10 @@ protected: void playGame(); + /** Return the parameters for the stork section. */ + virtual const StorkParam &getStorkParameters() const = 0; + + private: /** All actions a user can request in a menu. */ enum MenuAction { @@ -119,6 +134,7 @@ private: /** The different sounds common in the game. */ enum Sound { kSoundClick = 0, + kSoundStork , kSoundMAX }; @@ -146,12 +162,15 @@ private: static const MenuButton kAnimalNamesBack; ///< "Back" button in the animal names screens. static const MenuButton kLanguageButtons[]; ///< Language buttons in the animal names screen. + static const MenuButton kSectionStorkHouses[]; + /** All general game sounds we know about. */ static const char *kSound[kSoundMAX]; static const AnimProperties kClownAnimations[]; static const AnimProperties kTitleAnimation; + static const AnimProperties kSectionStorkAnimations[]; static const AnimProperties kSectionEndAnimations[]; diff --git a/engines/gob/pregob/onceupon/stork.cpp b/engines/gob/pregob/onceupon/stork.cpp new file mode 100644 index 0000000000..3c38037d08 --- /dev/null +++ b/engines/gob/pregob/onceupon/stork.cpp @@ -0,0 +1,234 @@ +/* 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/str.h" + +#include "gob/gob.h" +#include "gob/surface.h" +#include "gob/anifile.h" +#include "gob/video.h" + +#include "gob/pregob/onceupon/stork.h" + +enum Animation { + kAnimFlyNearWithBundle = 9, + kAnimFlyFarWithBundle = 12, + kAnimFlyNearWithoutBundle = 10, + kAnimFlyFarWithoutBundle = 13, + kAnimBundleNear = 11, + kAnimBundleFar = 14 +}; + +namespace Gob { + +namespace OnceUpon { + +Stork::Stork(GobEngine *vm, const ANIFile &ani) : ANIObject(ani), _shouldDrop(false) { + _frame = new Surface(320, 200, 1); + vm->_video->drawPackedSprite("cadre.cmp", *_frame); + + _bundle = new ANIObject(ani); + + _bundle->setVisible(false); + _bundle->setPause(true); + + setState(kStateFlyNearWithBundle, kAnimFlyNearWithBundle, -80); +} + +Stork::~Stork() { + delete _frame; + + delete _bundle; +} + +bool Stork::hasBundleLanded() const { + if (!_shouldDrop || !_bundle->isVisible() || _bundle->isPaused()) + return false; + + int16 x, y, width, height; + _bundle->getFramePosition(x, y); + _bundle->getFrameSize(width, height); + + return (y + height) >= _bundleDrop.landY; +} + +void Stork::dropBundle(const BundleDrop &drop) { + if (_shouldDrop) + return; + + _shouldDrop = true; + _bundleDrop = drop; +} + +bool Stork::draw(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { + left = 0x7FFF; + top = 0x7FFF; + right = 0x0000; + bottom = 0x0000; + + bool drawn = ANIObject::draw(dest, left, top, right, bottom); + if (drawn) { + // Left frame edge + if (left <= 15) + dest.blit(*_frame, left, top, MIN(15, right), bottom, left, top); + + // Right frame edge + if (right >= 304) + dest.blit(*_frame, MAX(304, left), top, right, bottom, MAX(304, left), top); + } + + int16 bLeft, bTop, bRight, bBottom; + if (_bundle->draw(dest, bLeft, bTop, bRight, bBottom)) { + // Bottom frame edge + if (bBottom >= 188) + dest.blit(*_frame, bLeft, MAX(188, bTop), bRight, bBottom, bLeft, MAX(188, bTop)); + + left = MIN(left , bLeft ); + top = MIN(top , bTop ); + right = MAX(right , bRight ); + bottom = MAX(bottom, bBottom); + + drawn = true; + } + + return drawn; +} + +bool Stork::clear(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { + left = 0x7FFF; + top = 0x7FFF; + right = 0x0000; + bottom = 0x0000; + + bool cleared = _bundle->clear(dest, left, top, right, bottom); + + int16 sLeft, sTop, sRight, sBottom; + if (ANIObject::clear(dest, sLeft, sTop, sRight, sBottom)) { + left = MIN(left , sLeft ); + top = MIN(top , sTop ); + right = MAX(right , sRight ); + bottom = MAX(bottom, sBottom); + + cleared = true; + } + + return cleared; +} + +void Stork::advance() { + _bundle->advance(); + + ANIObject::advance(); + + int16 curX, curY, curWidth, curHeight; + getFramePosition(curX, curY, 0); + getFrameSize(curWidth, curHeight, 0); + + const int16 curRight = curX + curWidth - 1; + + int16 nextX, nextY, nextWidth, nextHeight; + getFramePosition(nextX, nextY, 1); + getFrameSize(nextWidth, nextHeight, 1); + + const int16 nextRight = nextX + nextWidth - 1; + + switch (_state) { + case kStateFlyNearWithBundle: + if (curX >= 330) + setState(kStateFlyFarWithBundle, kAnimFlyFarWithBundle, 330); + + if ((curRight <= _bundleDrop.dropX) && + (nextRight >= _bundleDrop.dropX) && _shouldDrop && !_bundleDrop.dropWhileFar) + dropBundle(kStateFlyNearWithoutBundle, kAnimFlyNearWithoutBundle); + + break; + + case kStateFlyFarWithBundle: + if (curX <= -80) + setState(kStateFlyNearWithBundle, kAnimFlyNearWithBundle, -80); + + if ((curX >= _bundleDrop.dropX) && + (nextX <= _bundleDrop.dropX) && _shouldDrop && _bundleDrop.dropWhileFar) + dropBundle(kStateFlyFarWithoutBundle, kAnimFlyFarWithoutBundle); + + break; + + case kStateFlyNearWithoutBundle: + if (curX >= 330) + setState(kStateFlyFarWithoutBundle, kAnimFlyFarWithoutBundle, 330); + break; + + case kStateFlyFarWithoutBundle: + if (curX <= -80) + setState(kStateFlyNearWithoutBundle, kAnimFlyNearWithoutBundle, -80); + break; + + default: + break; + } +} + +void Stork::dropBundle(State state, uint16 anim) { + setState(state, anim); + + int16 x, y, width, height; + getFramePosition(x, y); + getFrameSize(width, height); + + _bundle->setAnimation(_bundleDrop.anim); + _bundle->setPause(false); + _bundle->setVisible(true); + + int16 bWidth, bHeight; + _bundle->getFrameSize(bWidth, bHeight); + + // Drop position + x = _bundleDrop.dropX; + y = y + height - bHeight; + + // If the stork is flying near (from left to right), drop the bundle at the right edge + if (!_bundleDrop.dropWhileFar) + x = x - bWidth; + + _bundle->setPosition(x, y); +} + +void Stork::setState(State state, uint16 anim) { + setAnimation(anim); + setVisible(true); + setPause(false); + + _state = state; +} + +void Stork::setState(State state, uint16 anim, int16 x) { + setState(state, anim); + setPosition(); + + int16 pX, pY; + getPosition(pX, pY); + setPosition( x, pY); +} + +} // End of namespace OnceUpon + +} // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/stork.h b/engines/gob/pregob/onceupon/stork.h new file mode 100644 index 0000000000..d26a887c97 --- /dev/null +++ b/engines/gob/pregob/onceupon/stork.h @@ -0,0 +1,103 @@ +/* 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 GOB_PREGOB_ONCEUPON_STORK_H +#define GOB_PREGOB_ONCEUPON_STORK_H + +#include "common/system.h" + +#include "gob/aniobject.h" + +namespace Common { + class String; +} + +namespace Gob { + +class GobEngine; + +class Surface; +class ANIFile; + +namespace OnceUpon { + +/** The stork in Baba Yaga / dragon in Abracadabra. */ +class Stork : public ANIObject { +public: + /** Information on how to drop the bundle. */ + struct BundleDrop { + int16 anim; ///< Animation of the bundle floating down + + int16 dropX; ///< X position the stork drops the bundle + int16 landY; ///< Y position the bundle lands + + bool dropWhileFar; ///< Does the stork drop the bundle while far instead of near? + }; + + Stork(GobEngine *vm, const ANIFile &ani); + ~Stork(); + + /** Has the bundle landed? */ + bool hasBundleLanded() const; + + /** Drop the bundle. */ + void dropBundle(const BundleDrop &drop); + + /** Draw the current frame onto the surface and return the affected rectangle. */ + bool draw(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); + /** Draw the current frame from the surface and return the affected rectangle. */ + bool clear(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); + + /** Advance the animation to the next frame. */ + void advance(); + +private: + enum State { + kStateFlyNearWithBundle = 0, + kStateFlyFarWithBundle , + kStateFlyNearWithoutBundle , + kStateFlyFarWithoutBundle + }; + + + void setState(State state, uint16 anim); + void setState(State state, uint16 anim, int16 x); + + void dropBundle(State state, uint16 anim); + + + GobEngine *_vm; + + Surface *_frame; + ANIObject *_bundle; + + State _state; + + bool _shouldDrop; + BundleDrop _bundleDrop; +}; + +} // End of namespace OnceUpon + +} // End of namespace Gob + +#endif // GOB_PREGOB_ONCEUPON_STORK_H -- cgit v1.2.3 From e17d4a5c0c66b890014efa62d207406fd5b887ef Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 7 Jul 2012 13:21:07 +0200 Subject: GOB: Implement GCT drawing --- engines/gob/module.mk | 1 + engines/gob/pregob/gctfile.cpp | 306 +++++++++++++++++++++++++++++++++++++++++ engines/gob/pregob/gctfile.h | 149 ++++++++++++++++++++ engines/gob/pregob/pregob.cpp | 13 ++ engines/gob/pregob/pregob.h | 7 + 5 files changed, 476 insertions(+) create mode 100644 engines/gob/pregob/gctfile.cpp create mode 100644 engines/gob/pregob/gctfile.h diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 1b3f400684..15351848de 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -80,6 +80,7 @@ MODULE_OBJS := \ detection/detection.o \ pregob/pregob.o \ pregob/txtfile.o \ + pregob/gctfile.o \ pregob/onceupon/onceupon.o \ pregob/onceupon/abracadabra.o \ pregob/onceupon/babayaga.o \ diff --git a/engines/gob/pregob/gctfile.cpp b/engines/gob/pregob/gctfile.cpp new file mode 100644 index 0000000000..08c32cda76 --- /dev/null +++ b/engines/gob/pregob/gctfile.cpp @@ -0,0 +1,306 @@ +/* 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/stream.h" + +#include "gob/surface.h" +#include "gob/video.h" + +#include "gob/pregob/gctfile.h" + +namespace Gob { + +GCTFile::Chunk::Chunk() : type(kChunkTypeNone) { +} + + +GCTFile::GCTFile(Common::SeekableReadStream &gct, Common::RandomSource &rnd) : _rnd(&rnd), + _areaLeft(0), _areaTop(0), _areaRight(0), _areaBottom(0), _currentItem(0xFFFF) { + + load(gct); +} + +GCTFile::~GCTFile() { +} + +void GCTFile::load(Common::SeekableReadStream &gct) { + gct.skip(4); // Required buffer size + gct.skip(2); // Unknown + + // Read the selector and line counts for each item + const uint16 itemCount = gct.readUint16LE(); + _items.resize(itemCount); + + for (Items::iterator i = _items.begin(); i != _items.end(); ++i) { + const uint16 selector = gct.readUint16LE(); + const uint16 lineCount = gct.readUint16LE(); + + i->selector = selector; + i->lines.resize(lineCount); + } + + // Read all item lines + for (Items::iterator i = _items.begin(); i != _items.end(); ++i) { + for (Lines::iterator l = i->lines.begin(); l != i->lines.end(); ++l) { + const uint16 lineSize = gct.readUint16LE(); + + readLine(gct, *l, lineSize); + } + } + + if (gct.err()) + error("GCTFile::load(): Failed reading GCT"); +} + +void GCTFile::readLine(Common::SeekableReadStream &gct, Line &line, uint16 lineSize) const { + line.chunks.push_back(Chunk()); + + while (lineSize > 0) { + byte c = gct.readByte(); + lineSize--; + + if (c == 0) { + // Command byte + + if (lineSize == 0) + break; + + byte cmd = gct.readByte(); + lineSize--; + + // Line end command + if (cmd == 0) + break; + + // Item reference command + if (cmd == 1) { + if (lineSize < 2) { + warning("GCTFile::readLine(): Item reference command is missing parameters"); + break; + } + + const uint32 itemRef = gct.readUint16LE(); + lineSize -= 2; + + line.chunks.push_back(Chunk()); + line.chunks.back().type = kChunkTypeItem; + line.chunks.back().item = itemRef; + + line.chunks.push_back(Chunk()); + continue; + } + + warning("GCTFile::readLine(): Invalid command 0x%02X", cmd); + break; + } + + // Text + line.chunks.back().type = kChunkTypeString; + line.chunks.back().text += (char)c; + } + + // Skip bytes we didn't read (because of errors) + gct.skip(lineSize); + + // Remove empty chunks from the end of the list + while (!line.chunks.empty() && (line.chunks.back().type == kChunkTypeNone)) + line.chunks.pop_back(); +} + +uint16 GCTFile::getLineCount(uint item) const { + if (item >= _items.size()) + return 0; + + return _items[item].lines.size(); +} + +void GCTFile::selectLine(uint item, uint16 line) { + if ((item >= _items.size()) && (item != kSelectorAll) && (item != kSelectorRandom)) + return; + + _items[item].selector = line; +} + +void GCTFile::setText(uint item, uint16 line, const Common::String &text) { + if ((item >= _items.size()) || (line >= _items[item].lines.size())) + return; + + _items[item].lines[line].chunks.clear(); + _items[item].lines[line].chunks.push_back(Chunk()); + + _items[item].lines[line].chunks.back().type = kChunkTypeString; + _items[item].lines[line].chunks.back().text = text; +} + +void GCTFile::setText(uint item, const Common::String &text) { + if (item >= _items.size()) + return; + + _items[item].selector = 0; + + _items[item].lines.resize(1); + + setText(item, 0, text); +} + +void GCTFile::reset() { + _currentItem = 0xFFFF; + _currentText.clear(); +} + +Common::String GCTFile::getLineText(const Line &line) const { + Common::String text; + + // Go over all chunks in this line + for (Chunks::const_iterator c = line.chunks.begin(); c != line.chunks.end(); ++c) { + // A chunk is either a direct string, or a reference to another item + + if (c->type == kChunkTypeItem) { + Common::List lines; + + getItemText(c->item, lines); + if (lines.empty()) + continue; + + if (lines.size() > 1) + warning("GCTFile::getLineText(): Referenced item has multiple lines"); + + text += lines.front(); + } else if (c->type == kChunkTypeString) + text += c->text; + } + + return text; +} + +void GCTFile::getItemText(uint item, Common::List &text) const { + text.clear(); + + if ((item >= _items.size()) || _items[item].lines.empty()) + return; + + uint16 line = _items[item].selector; + + // Draw all lines + if (line == kSelectorAll) { + for (Lines::const_iterator l = _items[item].lines.begin(); l != _items[item].lines.end(); ++l) + text.push_back(getLineText(*l)); + + return; + } + + // Draw random line + if (line == kSelectorRandom) + line = _rnd->getRandomNumber(_items[item].lines.size() - 1); + + if (line >= _items[item].lines.size()) + return; + + text.push_back(getLineText(_items[item].lines[line])); +} + +void GCTFile::setArea(int16 left, int16 top, int16 right, int16 bottom) { + trashBuffer(); + + _hasArea = false; + + const int16 width = right - left + 1; + const int16 height = bottom - top + 1; + if ((width <= 0) || (height <= 0)) + return; + + _areaLeft = left; + _areaTop = top; + _areaRight = right; + _areaBottom = bottom; + + _hasArea = true; + + resizeBuffer(width, height); +} + +bool GCTFile::clear(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { + return restoreScreen(dest, left, top, right, bottom); +} + +bool GCTFile::fill(Surface &dest, uint8 color, int16 &left, int16 &top, int16 &right, int16 &bottom) { + left = _areaLeft; + top = _areaTop; + right = _areaRight; + bottom = _areaBottom; + + if (!hasSavedBackground()) + saveScreen(dest, left, top, right, bottom); + + dest.fillRect(left, top, right, bottom, color); + + return true; +} + +bool GCTFile::finished() const { + return (_currentItem != 0xFFFF) && _currentText.empty(); +} + +bool GCTFile::draw(Surface &dest, uint16 item, const Font &font, uint8 color, + int16 &left, int16 &top, int16 &right, int16 &bottom) { + + if ((item >= _items.size()) || !_hasArea) + return false; + + left = _areaLeft; + top = _areaTop; + right = _areaRight; + bottom = _areaBottom; + + const int16 width = right - left + 1; + const int16 height = bottom - top + 1; + + const uint lineCount = height / font.getCharHeight(); + if (lineCount == 0) + return false; + + if (!hasSavedBackground()) + saveScreen(dest, left, top, right, bottom); + + if (item != _currentItem) { + _currentItem = item; + + getItemText(_currentItem, _currentText); + } + + if (_currentText.empty()) + return false; + + int16 y = top; + for (uint i = 0; (i < lineCount) && !_currentText.empty(); i++, y += font.getCharHeight()) { + const Common::String &line = _currentText.front(); + const int16 x = left + ((width - (line.size() * font.getCharWidth())) / 2); + + font.drawString(line, x, y, color, 0, true, dest); + _currentText.pop_front(); + } + + return true; +} + +} // End of namespace Gob diff --git a/engines/gob/pregob/gctfile.h b/engines/gob/pregob/gctfile.h new file mode 100644 index 0000000000..ed6351b7a8 --- /dev/null +++ b/engines/gob/pregob/gctfile.h @@ -0,0 +1,149 @@ +/* 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 GOB_PREGOB_GCTFILE_H +#define GOB_PREGOB_GCTFILE_H + +#include "common/str.h" +#include "common/array.h" +#include "common/list.h" + +#include "gob/backbuffer.h" + +namespace Common { + class RandomSource; + class SeekableReadStream; +} + +namespace Gob { + +class Surface; +class Font; + +class GCTFile : public BackBuffer { +public: + static const uint16 kSelectorAll = 0xFFFE; ///< Print all lines. + static const uint16 kSelectorRandom = 0xFFFF; ///< Print a random line. + + + GCTFile(Common::SeekableReadStream &gct, Common::RandomSource &rnd); + ~GCTFile(); + + /** Return the number of lines in an item. */ + uint16 getLineCount(uint item) const; + + /** Set the area the text will be printed in. */ + void setArea(int16 left, int16 top, int16 right, int16 bottom); + + /** Set which line of this item should be printed. */ + void selectLine(uint item, uint16 line); + + /** Change the text of an items' line. */ + void setText(uint item, uint16 line, const Common::String &text); + /** Change the item into one one line and set that line's text. */ + void setText(uint item, const Common::String &text); + + /** Reset the item drawing state. */ + void reset(); + + /** Clear the drawn text, restoring the original content. */ + bool clear(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); + + /** Fill the text area with a color. */ + bool fill(Surface &dest, uint8 color, int16 &left, int16 &top, int16 &right, int16 &bottom); + + /** Draw an item onto the surface, until all text has been drawn or the area is filled. */ + bool draw(Surface &dest, uint16 item, const Font &font, uint8 color, + int16 &left, int16 &top, int16 &right, int16 &bottom); + + /** Did we draw all text? */ + bool finished() const; + +private: + /** The type of a chunk. */ + enum ChunkType { + kChunkTypeNone = 0, ///< Do nothing. + kChunkTypeString , ///< A direct string. + kChunkTypeItem ///< A reference to an item to print instead. + }; + + /** A chunk in an item text line. */ + struct Chunk { + ChunkType type; ///< The type of the chunk. + + Common::String text; ///< Text to print. + + int item; ///< Item to print instead. + + Chunk(); + }; + + typedef Common::List Chunks; + + /** A line in an item. */ + struct Line { + Chunks chunks; ///< The chunks that make up the line. + }; + + typedef Common::Array Lines; + + /** A GCT item. */ + struct Item { + Lines lines; ///< The text lines in the item + uint16 selector; ///< Which line to print. + }; + + typedef Common::Array Items; + + + Common::RandomSource *_rnd; + + Items _items; ///< All GCT items. + + // The area on which to print + bool _hasArea; + int16 _areaLeft; + int16 _areaTop; + int16 _areaRight; + int16 _areaBottom; + + /** Index of the current item we're drawing. */ + uint16 _currentItem; + /** Text left to draw. */ + Common::List _currentText; + + + // -- Loading helpers -- + + void load(Common::SeekableReadStream &gct); + void readLine(Common::SeekableReadStream &gct, Line &line, uint16 lineSize) const; + + + // -- Draw helpers -- + + Common::String getLineText(const Line &line) const; + void getItemText(uint item, Common::List &text) const; +}; + +} // End of namespace Gob + +#endif // GOB_PREGOB_GCTFILE_H diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 4ee5430de7..033eea89f2 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -35,6 +35,7 @@ #include "gob/sound/sound.h" #include "gob/pregob/pregob.h" +#include "gob/pregob/gctfile.h" namespace Gob { @@ -341,4 +342,16 @@ TXTFile *PreGob::loadTXT(const Common::String &txtFile, TXTFile::Format format) void PreGob::fixTXTStrings(TXTFile &txt) const { } +GCTFile *PreGob::loadGCT(const Common::String &gctFile) const { + Common::SeekableReadStream *gctStream = _vm->_dataIO->getFile(gctFile); + if (!gctStream) + error("PreGob::loadGCT(): Failed to open \"%s\"", gctFile.c_str()); + + GCTFile *gct = new GCTFile(*gctStream, _vm->_rnd); + + delete gctStream; + + return gct; +} + } // End of namespace Gob diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index f1728036ab..686727b08b 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -38,6 +38,8 @@ namespace Gob { class GobEngine; class Surface; +class GCTFile; + class PreGob { public: PreGob(GobEngine *vm); @@ -164,6 +166,11 @@ protected: virtual void fixTXTStrings(TXTFile &txt) const; + // -- GCT helpers -- + + GCTFile *loadGCT(const Common::String &gctFile) const; + + GobEngine *_vm; private: -- cgit v1.2.3 From d7c81c27555ed49c70bb6d8b1e60e6a8b5065c70 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 7 Jul 2012 13:22:47 +0200 Subject: GOB: Implement GCT text drawing in the Stork section The only thing missing in the stork section now is the character creator. --- engines/gob/pregob/onceupon/onceupon.cpp | 39 +++++++++++++++++++++++--------- engines/gob/pregob/onceupon/onceupon.h | 2 +- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index aa08f6f1fd..f1b24c3353 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -32,6 +32,9 @@ #include "gob/sound/sound.h" +#include "gob/pregob/txtfile.h" +#include "gob/pregob/gctfile.h" + #include "gob/pregob/onceupon/onceupon.h" #include "gob/pregob/onceupon/palettes.h" @@ -1041,30 +1044,33 @@ OnceUpon::MenuAction OnceUpon::doIngameMenu() { if ((action == kMenuActionQuit) || _vm->shouldQuit()) { // User pressed the quit button, or quit ScummVM - _quit = true; - return kMenuActionQuit; + _quit = true; + action = kMenuActionQuit; } else if (action == kMenuActionPlay) { // User pressed the return to game button - return kMenuActionPlay; + action = kMenuActionPlay; } else if (kMenuActionMainMenu) { // User pressed the return to main menu button - return handleMainMenu(); + action = handleMainMenu(); } return action; } -OnceUpon::MenuAction OnceUpon::doIngameMenu(int16 key, MouseButtons mouseButtons) { +OnceUpon::MenuAction OnceUpon::doIngameMenu(int16 &key, MouseButtons &mouseButtons) { if ((key != kKeyEscape) && (mouseButtons != kMouseButtonsRight)) return kMenuActionNone; + key = 0; + mouseButtons = kMouseButtonsNone; + MenuAction action = doIngameMenu(); if (action == kMenuActionPlay) - return kMenuActionNone; + action = kMenuActionNone; return action; } @@ -1316,8 +1322,6 @@ enum StorkState { }; bool OnceUpon::sectionStork() { - warning("OnceUpon::sectionStork(): TODO"); - fadeOut(); hideCursor(); setGamePalette(0); @@ -1338,6 +1342,10 @@ bool OnceUpon::sectionStork() { TXTFile *whereStork = loadTXT(getLocFile("ouva.tx"), TXTFile::kFormatStringPositionColor); whereStork->draw(*_vm->_draw->_backSurface, &_plettre, 1); + // Where the stork actually goes + GCTFile *thereStork = loadGCT(getLocFile("choix.gc")); + thereStork->setArea(17, 18, 303, 41); + ANIFile ani(_vm, "present.ani", 320); ANIList anims; @@ -1355,8 +1363,6 @@ bool OnceUpon::sectionStork() { StorkState state = kStorkStateWaitUser; MenuAction action = kMenuActionNone; while (!_vm->shouldQuit() && (state != kStorkStateFinish)) { - clearAnim(anims); - // Play the stork sound if (--storkSoundWait == 0) playSound(kSoundStork); @@ -1380,6 +1386,8 @@ bool OnceUpon::sectionStork() { break; } + clearAnim(anims); + if (mouseButtons == kMouseButtonsLeft) { stopSound(); playSound(kSoundClick); @@ -1394,6 +1402,12 @@ bool OnceUpon::sectionStork() { int16 left, top, right, bottom; if (whereStork->clear(*_vm->_draw->_backSurface, left, top, right, bottom)) _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + + // Print the text where the stork actually goes + thereStork->selectLine(3, house); // The house + thereStork->selectLine(4, house); // The house's inhabitants + if (thereStork->draw(*_vm->_draw->_backSurface, 2, *_plettre, 10, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); } } @@ -1405,14 +1419,17 @@ bool OnceUpon::sectionStork() { } freeAnims(anims); + delete thereStork; delete whereStork; fadeOut(); hideCursor(); // Completed the section => move one - if (action == kMenuActionNone) + if (action == kMenuActionNone) { + warning("OnceUpon::sectionStork(): TODO: Character creator"); return true; + } // Didn't complete the section return false; diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index b9aef04dc2..7ae3a39485 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -249,7 +249,7 @@ private: /** Handle the whole ingame menu. */ MenuAction doIngameMenu(); /** Handle the whole ingame menu if ESC or right mouse button was pressed. */ - MenuAction doIngameMenu(int16 key, MouseButtons mouseButtons); + MenuAction doIngameMenu(int16 &key, MouseButtons &mouseButtons); // -- Menu button helpers -- -- cgit v1.2.3 From 90415cf083d26e593ff05acb3a511c088a533b8b Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 7 Jul 2012 13:23:54 +0200 Subject: GOB: Implement GCT text drawing in the end section The end section is now complete. --- engines/gob/pregob/onceupon/onceupon.cpp | 48 ++++++++++++++++++++++++++------ engines/gob/pregob/onceupon/onceupon.h | 3 ++ 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index f1b24c3353..8c617e2c41 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -94,6 +94,9 @@ enum ClownAnimation { kClownAnimationClownCry = 6 }; +// 12 seconds delay for one area full of GCT text +static const uint32 kGCTDelay = 12000; + namespace Gob { namespace OnceUpon { @@ -222,6 +225,9 @@ void OnceUpon::init() { // We start with no selected difficulty and at section 0 _difficulty = kDifficultyMAX; _section = 0; + + // Default name + _name = "Nemo"; } void OnceUpon::deinit() { @@ -1518,6 +1524,10 @@ bool OnceUpon::sectionEnd() { _vm->_draw->_backSurface->blit(endBackground, 0, 0, 288, 137, 16, 50); + GCTFile *endText = loadGCT(getLocFile("final.gc")); + endText->setArea(17, 18, 303, 41); + endText->setText(1, _name); + ANIFile ani(_vm, "fin.ani", 320); ANIList anims; @@ -1526,26 +1536,48 @@ bool OnceUpon::sectionEnd() { _vm->_draw->forceBlit(); + uint32 textStartTime = 0; + MenuAction action = kMenuActionNone; while (!_vm->shouldQuit() && (action == kMenuActionNone)) { - redrawAnim(anims); - - fadeIn(); - - endFrame(true); + // Check user input int16 mouseX, mouseY; MouseButtons mouseButtons; int16 key = checkInput(mouseX, mouseY, mouseButtons); - if ((key != 0) && (key != kKeyEscape)) - // Any key pressed => Quit - action = kMenuActionQuit; action = doIngameMenu(key, mouseButtons); + if (action != kMenuActionNone) + break; + + clearAnim(anims); + + // Pressed a key or mouse button => Skip to next area-full of text + if ((mouseButtons == kMouseButtonsLeft) || (key != 0)) + textStartTime = 0; + + // Draw the next area-full of text + uint32 now = _vm->_util->getTimeKey(); + if (!endText->finished() && ((textStartTime == 0) || (now >= (textStartTime + kGCTDelay)))) { + textStartTime = now; + + int16 left, top, right, bottom; + if (endText->clear(*_vm->_draw->_backSurface, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + + if (endText->draw(*_vm->_draw->_backSurface, 0, *_plettre, 10, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + } + + drawAnim(anims); + fadeIn(); + + endFrame(true); } freeAnims(anims); + delete endText; // Restart requested if (action == kMenuActionRestart) diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 7ae3a39485..386d410c95 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -24,6 +24,7 @@ #define GOB_PREGOB_ONCEUPON_ONCEUPON_H #include "common/system.h" +#include "common/str.h" #include "gob/pregob/pregob.h" @@ -312,6 +313,8 @@ private: Difficulty _difficulty; ///< The current difficulty. int _section; ///< The current game section. + + Common::String _name; ///< The name of the child. }; } // End of namespace OnceUpon -- cgit v1.2.3 From 75e7cca6921ae005cd5c4fa39b9cfa49be2a4cbb Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 7 Jul 2012 18:44:46 +0200 Subject: GOB: Add support for entering non-ASCII CP850 characters --- engines/gob/util.cpp | 29 +++++++++++++++++++++++------ engines/gob/util.h | 1 + 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/engines/gob/util.cpp b/engines/gob/util.cpp index 5d6ae78872..e1c16c3257 100644 --- a/engines/gob/util.cpp +++ b/engines/gob/util.cpp @@ -189,12 +189,27 @@ bool Util::getKeyFromBuffer(Common::KeyState &key) { return true; } +static const uint16 kLatin1ToCP850[] = { + 0xFF, 0xAD, 0xBD, 0x9C, 0xCF, 0xBE, 0xDD, 0xF5, 0xF9, 0xB8, 0xA6, 0xAE, 0xAA, 0xF0, 0xA9, 0xEE, + 0xF8, 0xF1, 0xFD, 0xFC, 0xEF, 0xE6, 0xF4, 0xFA, 0xF7, 0xFB, 0xA7, 0xAF, 0xAC, 0xAB, 0xF3, 0xA8, + 0xB7, 0xB5, 0xB6, 0xC7, 0x8E, 0x8F, 0x92, 0x80, 0xD4, 0x90, 0xD2, 0xD3, 0xDE, 0xD6, 0xD7, 0xD8, + 0xD1, 0xA5, 0xE3, 0xE0, 0xE2, 0xE5, 0x99, 0x9E, 0x9D, 0xEB, 0xE9, 0xEA, 0x9A, 0xED, 0xE8, 0xE1, + 0x85, 0xA0, 0x83, 0xC6, 0x84, 0x86, 0x91, 0x87, 0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, + 0xD0, 0xA4, 0x95, 0xA2, 0x93, 0xE4, 0x94, 0xF6, 0x9B, 0x97, 0xA3, 0x96, 0x81, 0xEC, 0xE7, 0x98 +}; + +int16 Util::toCP850(uint16 latin1) { + if ((latin1 < 0xA0) || ((latin1 - 0xA0) >= ARRAYSIZE(kLatin1ToCP850))) + return 0; + + return kLatin1ToCP850[latin1 - 0xA0]; +} + int16 Util::translateKey(const Common::KeyState &key) { static struct keyS { int16 from; int16 to; } keys[] = { - {Common::KEYCODE_INVALID, kKeyNone }, {Common::KEYCODE_BACKSPACE, kKeyBackspace}, {Common::KEYCODE_SPACE, kKeySpace }, {Common::KEYCODE_RETURN, kKeyReturn }, @@ -216,16 +231,18 @@ int16 Util::translateKey(const Common::KeyState &key) { {Common::KEYCODE_F10, kKeyF10 } }; + // Translate special keys for (int i = 0; i < ARRAYSIZE(keys); i++) if (key.keycode == keys[i].from) return keys[i].to; - if ((key.keycode >= Common::KEYCODE_SPACE) && - (key.keycode <= Common::KEYCODE_DELETE)) { - - // Used as a user input in Gobliins 2 notepad, in the save dialog, ... + // Return the ascii value, for text input + if ((key.ascii >= 32) && (key.ascii <= 127)) return key.ascii; - } + + // Translate international characters into CP850 characters + if ((key.ascii >= 160) && (key.ascii <= 255)) + return toCP850(key.ascii); return 0; } diff --git a/engines/gob/util.h b/engines/gob/util.h index 30bff72325..2e568ad169 100644 --- a/engines/gob/util.h +++ b/engines/gob/util.h @@ -166,6 +166,7 @@ protected: void addKeyToBuffer(const Common::KeyState &key); bool getKeyFromBuffer(Common::KeyState &key); int16 translateKey(const Common::KeyState &key); + int16 toCP850(uint16 latin1); void checkJoystick(); void keyDown(const Common::Event &event); -- cgit v1.2.3 From 5b02192477cbdc9e8251bd48cac764d6fa61d024 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 7 Jul 2012 18:45:15 +0200 Subject: GOB: Add Font::hasChar() --- engines/gob/video.cpp | 4 ++++ engines/gob/video.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index 62bb210a8e..64af34cf62 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -84,6 +84,10 @@ uint16 Font::getCharCount() const { return _endItem - _startItem + 1; } +bool Font::hasChar(uint8 c) const { + return (c >= _startItem) && (c <= _endItem); +} + bool Font::isMonospaced() const { return _charWidths == 0; } diff --git a/engines/gob/video.h b/engines/gob/video.h index a8c1480a6b..122c1e47d5 100644 --- a/engines/gob/video.h +++ b/engines/gob/video.h @@ -41,6 +41,8 @@ public: uint8 getCharWidth () const; uint8 getCharHeight() const; + bool hasChar(uint8 c) const; + bool isMonospaced() const; void drawLetter(Surface &surf, uint8 c, uint16 x, uint16 y, -- cgit v1.2.3 From 10b9be285149dd21bc38710c1a685800fab75e01 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 7 Jul 2012 19:14:06 +0200 Subject: GOB: Add Util::toCP850Lower() / toCP850Upper() --- engines/gob/util.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++ engines/gob/util.h | 5 ++++ 2 files changed, 71 insertions(+) diff --git a/engines/gob/util.cpp b/engines/gob/util.cpp index e1c16c3257..5ac4ef024e 100644 --- a/engines/gob/util.cpp +++ b/engines/gob/util.cpp @@ -247,6 +247,72 @@ int16 Util::translateKey(const Common::KeyState &key) { return 0; } +static const uint8 kLowerToUpper[][2] = { + {0x81, 0x9A}, + {0x82, 0x90}, + {0x83, 0xB6}, + {0x84, 0x8E}, + {0x85, 0xB7}, + {0x86, 0x8F}, + {0x87, 0x80}, + {0x88, 0xD2}, + {0x89, 0xD3}, + {0x8A, 0xD4}, + {0x8B, 0xD8}, + {0x8C, 0xD7}, + {0x8D, 0xDE}, + {0x91, 0x92}, + {0x93, 0xE2}, + {0x94, 0x99}, + {0x95, 0xE3}, + {0x96, 0xEA}, + {0x97, 0xEB}, + {0x95, 0xE3}, + {0x96, 0xEA}, + {0x97, 0xEB}, + {0x9B, 0x9D}, + {0xA0, 0xB5}, + {0xA1, 0xD6}, + {0xA2, 0xE0}, + {0xA3, 0xE9}, + {0xA4, 0xA5}, + {0xC6, 0xC7}, + {0xD0, 0xD1}, + {0xE4, 0xE5}, + {0xE7, 0xE8}, + {0xEC, 0xED} +}; + +char Util::toCP850Lower(char cp850) { + const uint8 cp = (unsigned char)cp850; + if (cp <= 32) + return cp850; + + if (cp <= 127) + return tolower(cp850); + + for (uint i = 0; i < ARRAYSIZE(kLowerToUpper); i++) + if (cp == kLowerToUpper[i][1]) + return (char)kLowerToUpper[i][0]; + + return cp850; +} + +char Util::toCP850Upper(char cp850) { + const uint8 cp = (unsigned char)cp850; + if (cp <= 32) + return cp850; + + if (cp <= 127) + return toupper(cp850); + + for (uint i = 0; i < ARRAYSIZE(kLowerToUpper); i++) + if (cp == kLowerToUpper[i][0]) + return (char)kLowerToUpper[i][1]; + + return cp850; +} + int16 Util::getKey() { Common::KeyState key; diff --git a/engines/gob/util.h b/engines/gob/util.h index 2e568ad169..a4984c6207 100644 --- a/engines/gob/util.h +++ b/engines/gob/util.h @@ -143,6 +143,11 @@ public: /** Read a constant-length string out of a stream. */ static Common::String readString(Common::SeekableReadStream &stream, int n); + /** Convert a character in CP850 encoding to the equivalent lower case character. */ + static char toCP850Lower(char cp850); + /** Convert a character in CP850 encoding to the equivalent upper case character. */ + static char toCP850Upper(char cp850); + Util(GobEngine *vm); protected: -- cgit v1.2.3 From 57b1b7ad2496be6f6c2545877576e3c818dc6ef6 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 7 Jul 2012 19:20:07 +0200 Subject: GOB: Implement the Once Upon A Time character generator Still missing the little sprite bouncing around, though. --- engines/gob/pregob/onceupon/onceupon.cpp | 355 ++++++++++++++++++++++++++++++- engines/gob/pregob/onceupon/onceupon.h | 30 ++- 2 files changed, 375 insertions(+), 10 deletions(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 8c617e2c41..1d1bfd4629 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -1095,18 +1095,18 @@ int OnceUpon::checkButton(const MenuButton *buttons, uint count, int16 x, int16 return failValue; } -void OnceUpon::drawButton(Surface &dest, const Surface &src, const MenuButton &button) const { - dest.blit(src, button.srcLeft, button.srcTop, button.srcRight, button.srcBottom, button.dstX, button.dstY); +void OnceUpon::drawButton(Surface &dest, const Surface &src, const MenuButton &button, int transp) const { + dest.blit(src, button.srcLeft, button.srcTop, button.srcRight, button.srcBottom, button.dstX, button.dstY, transp); } -void OnceUpon::drawButtons(Surface &dest, const Surface &src, const MenuButton *buttons, uint count) const { +void OnceUpon::drawButtons(Surface &dest, const Surface &src, const MenuButton *buttons, uint count, int transp) const { for (uint i = 0; i < count; i++) { const MenuButton &button = buttons[i]; if (!button.needDraw) continue; - drawButton(dest, src, button); + drawButton(dest, src, button, transp); } } @@ -1431,16 +1431,355 @@ bool OnceUpon::sectionStork() { fadeOut(); hideCursor(); - // Completed the section => move one - if (action == kMenuActionNone) { - warning("OnceUpon::sectionStork(): TODO: Character creator"); + // Didn't complete the section + if (action != kMenuActionNone) + return false; + + // Move on to the character generator + + CharGenAction charGenAction = kCharGenRestart; + while (charGenAction == kCharGenRestart) + charGenAction = characterGenerator(); + + // Did we successfully create a character? + return charGenAction == kCharGenDone; +} + +const OnceUpon::MenuButton OnceUpon::kCharGenHeadButtons[] = { + {true, 106, 146, 152, 180, 0, 0, 47, 34, 106, 146, 0}, + {true, 155, 146, 201, 180, 49, 0, 96, 34, 155, 146, 1}, + {true, 204, 146, 250, 180, 98, 0, 145, 34, 204, 146, 2}, + {true, 253, 146, 299, 180, 147, 0, 194, 34, 253, 146, 3} +}; + +const OnceUpon::MenuButton OnceUpon::kCharGenHeads[] = { + {true, 0, 0, 0, 0, 29, 4, 68, 31, 40, 51, 0}, + {true, 0, 0, 0, 0, 83, 4, 113, 31, 45, 51, 1}, + {true, 0, 0, 0, 0, 132, 4, 162, 31, 45, 51, 2}, + {true, 0, 0, 0, 0, 182, 4, 211, 31, 45, 51, 3} +}; + +const OnceUpon::MenuButton OnceUpon::kCharGenHairButtons[] = { + {true, 105, 55, 124, 70, 271, 1, 289, 15, 105, 55, 0x04}, + {true, 105, 74, 124, 89, 271, 20, 289, 34, 105, 74, 0x07} +}; + +const OnceUpon::MenuButton OnceUpon::kCharGenJacketButtons[] = { + {true, 105, 90, 124, 105, 271, 39, 289, 53, 105, 90, 0x06}, + {true, 105, 109, 124, 124, 271, 58, 289, 72, 105, 109, 0x02} +}; + +const OnceUpon::MenuButton OnceUpon::kCharGenTrousersButtons[] = { + {true, 105, 140, 124, 155, 271, 77, 289, 91, 105, 140, 0x01}, + {true, 105, 159, 124, 174, 271, 96, 289, 110, 105, 159, 0x03} +}; + +const OnceUpon::MenuButton OnceUpon::kCharGenNameEntry[] = { + {true, 0, 0, 0, 0, 0, 38, 54, 48, 140, 145, 0}, + {true, 0, 0, 0, 0, 106, 38, 159, 48, 195, 145, 0}, + {true, 0, 0, 0, 0, 0, 105, 54, 121, 140, 156, 0}, + {true, 0, 0, 0, 0, 106, 105, 159, 121, 195, 156, 0} +}; + +enum CharGenState { + kCharGenStateHead = 0, // Choose a head + kCharGenStateHair , // Choose hair color + kCharGenStateJacket , // Choose jacket color + kCharGenStateTrousers , // Choose trousers color + kCharGenStateName , // Choose name + kCharGenStateSure , // "Are you sure?" + kCharGenStateStoryName , // "We're going to tell the story of $NAME" + kCharGenStateFinish // Finished +}; + +void OnceUpon::recolor(Surface &surface, uint8 from, uint8 to) { + for (Pixel p = surface.get(); p.isValid(); ++p) + if (p.get() == from) + p.set(to); +} + +void OnceUpon::charGenSetup(uint stage) { + Surface choix(320, 200, 1), elchoix(320, 200, 1), paperDoll(65, 137, 1); + + _vm->_video->drawPackedSprite("choix.cmp" , choix); + _vm->_video->drawPackedSprite("elchoix.cmp", elchoix); + + paperDoll.blit(choix, 200, 0, 264, 136, 0, 0); + + GCTFile *text = loadGCT(getLocFile("choix.gc")); + text->setArea(17, 18, 303, 41); + text->setText(9, _name); + + // Background + _vm->_video->drawPackedSprite("cadre.cmp", *_vm->_draw->_backSurface); + _vm->_draw->_backSurface->fillRect(16, 50, 303, 187, 5); + + // Character sprite frame + _vm->_draw->_backSurface->blit(choix, 0, 38, 159, 121, 140, 54); + + // Recolor the paper doll parts + if (_colorHair != 0xFF) + recolor(elchoix , 0x0C, _colorHair); + if (_colorJacket != 0xFF) + recolor(paperDoll, 0x0A, _colorJacket); + if (_colorTrousers != 0xFF) + recolor(paperDoll, 0x09, _colorTrousers); + + _vm->_draw->_backSurface->blit(paperDoll, 32, 51); + + // Paper doll head + if (_head != 0xFF) + drawButton(*_vm->_draw->_backSurface, elchoix, kCharGenHeads[_head], 0); + + if (stage == kCharGenStateHead) { + // Head buttons + drawButtons(*_vm->_draw->_backSurface, choix, kCharGenHeadButtons, ARRAYSIZE(kCharGenHeadButtons)); + + // "Choose a head" + int16 left, top, right, bottom; + text->draw(*_vm->_draw->_backSurface, 5, *_plettre, 10, left, top, right, bottom); + + } else if (stage == kCharGenStateHair) { + // Hair color buttons + drawButtons(*_vm->_draw->_backSurface, choix, kCharGenHairButtons, ARRAYSIZE(kCharGenHairButtons)); + + // "What color is the hair?" + int16 left, top, right, bottom; + text->draw(*_vm->_draw->_backSurface, 6, *_plettre, 10, left, top, right, bottom); + + } else if (stage == kCharGenStateJacket) { + // Jacket color buttons + drawButtons(*_vm->_draw->_backSurface, choix, kCharGenJacketButtons, ARRAYSIZE(kCharGenJacketButtons)); + + // "What color is the jacket?" + int16 left, top, right, bottom; + text->draw(*_vm->_draw->_backSurface, 7, *_plettre, 10, left, top, right, bottom); + + } else if (stage == kCharGenStateTrousers) { + // Trousers color buttons + drawButtons(*_vm->_draw->_backSurface, choix, kCharGenTrousersButtons, ARRAYSIZE(kCharGenTrousersButtons)); + + // "What color are the trousers?" + int16 left, top, right, bottom; + text->draw(*_vm->_draw->_backSurface, 8, *_plettre, 10, left, top, right, bottom); + + } else if (stage == kCharGenStateName) { + // Name entry field + drawButtons(*_vm->_draw->_backSurface, choix, kCharGenNameEntry, ARRAYSIZE(kCharGenNameEntry)); + + // "Enter name" + int16 left, top, right, bottom; + text->draw(*_vm->_draw->_backSurface, 10, *_plettre, 10, left, top, right, bottom); + + charGenDrawName(); + } else if (stage == kCharGenStateSure) { + // Name entry field + drawButtons(*_vm->_draw->_backSurface, choix, kCharGenNameEntry, ARRAYSIZE(kCharGenNameEntry)); + + // "Are you sure?" + TXTFile *sure = loadTXT(getLocFile("estu.tx"), TXTFile::kFormatStringPositionColor); + sure->draw(*_vm->_draw->_backSurface, &_plettre, 1); + delete sure; + + charGenDrawName(); + } else if (stage == kCharGenStateStoryName) { + + // "We're going to tell the story of $NAME" + int16 left, top, right, bottom; + text->draw(*_vm->_draw->_backSurface, 11, *_plettre, 10, left, top, right, bottom); + } + + delete text; +} + +bool OnceUpon::enterString(Common::String &name, int16 key, uint maxLength, const Font &font) { + if (key == 0) + return true; + + if (key == kKeyBackspace) { + name.deleteLastChar(); + return true; + } + + if ((key >= ' ') && (key <= 0xFF)) { + if (name.size() >= maxLength) + return false; + + if (!font.hasChar(key)) + return false; + + name += (char) key; return true; } - // Didn't complete the section return false; } +void OnceUpon::charGenDrawName() { + _vm->_draw->_backSurface->fillRect(147, 151, 243, 166, 1); + + const int16 nameY = 151 + ((166 - 151 + 1 - _plettre->getCharHeight()) / 2); + const int16 nameX = 147 + ((243 - 147 + 1 - (15 * _plettre->getCharWidth ())) / 2); + + _plettre->drawString(_name, nameX, nameY, 10, 0, true, *_vm->_draw->_backSurface); + + const int16 cursorLeft = nameX + _name.size() * _plettre->getCharWidth(); + const int16 cursorTop = nameY; + const int16 cursorRight = cursorLeft + _plettre->getCharWidth() - 1; + const int16 cursorBottom = cursorTop + _plettre->getCharHeight() - 1; + + _vm->_draw->_backSurface->fillRect(cursorLeft, cursorTop, cursorRight, cursorBottom, 10); + + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 147, 151, 243, 166); +} + +OnceUpon::CharGenAction OnceUpon::characterGenerator() { + fadeOut(); + hideCursor(); + setGameCursor(); + + showWait(1); + + _name.clear(); + + _head = 0xFF; + _colorHair = 0xFF; + _colorJacket = 0xFF; + _colorTrousers = 0xFF; + + CharGenState state = kCharGenStateHead; + charGenSetup(state); + + fadeOut(); + _vm->_draw->forceBlit(); + + CharGenAction action = kCharGenRestart; + while (!_vm->shouldQuit() && (state != kCharGenStateFinish)) { + // Check user input + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + + int16 key = checkInput(mouseX, mouseY, mouseButtons); + + MenuAction menuAction = doIngameMenu(key, mouseButtons); + if (menuAction != kMenuActionNone) { + state = kCharGenStateFinish; + action = kCharGenAbort; + break; + } + + // clearAnim(anims); + + if (state == kCharGenStateStoryName) { + if ((mouseButtons != kMouseButtonsNone) || (key != 0)) { + state = kCharGenStateFinish; + action = kCharGenDone; + break; + } + } + + if (state == kCharGenStateSure) { + // Not sure => restart + if ((key == 'N') || (key == 'n')) { // No / Nein / Non + state = kCharGenStateFinish; + action = kCharGenRestart; + break; + } + + if ((key == 'Y') || (key == 'y') || // Yes + (key == 'J') || (key == 'j') || // Ja + (key == 'S') || (key == 's') || // Si + (key == 'O') || (key == 'o')) { // Oui + + state = kCharGenStateStoryName; + charGenSetup(state); + _vm->_draw->forceBlit(); + } + } + + if (state == kCharGenStateName) { + if (enterString(_name, key, 14, *_plettre)) { + _vm->_draw->_backSurface->fillRect(147, 151, 243, 166, 1); + + const int16 nameY = 151 + ((166 - 151 + 1 - _plettre->getCharHeight()) / 2); + const int16 nameX = 147 + ((243 - 147 + 1 - (15 * _plettre->getCharWidth ())) / 2); + + _plettre->drawString(_name, nameX, nameY, 10, 0, true, *_vm->_draw->_backSurface); + + const int16 cursorLeft = nameX + _name.size() * _plettre->getCharWidth(); + const int16 cursorTop = nameY; + const int16 cursorRight = cursorLeft + _plettre->getCharWidth() - 1; + const int16 cursorBottom = cursorTop + _plettre->getCharHeight() - 1; + + _vm->_draw->_backSurface->fillRect(cursorLeft, cursorTop, cursorRight, cursorBottom, 10); + + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 147, 151, 243, 166); + } + + if ((key == kKeyReturn) && !_name.empty()) { + _name.setChar(Util::toCP850Upper(_name[0]), 0); + + state = kCharGenStateSure; + charGenSetup(state); + _vm->_draw->forceBlit(); + } + } + + if (mouseButtons == kMouseButtonsLeft) { + int trousers = checkButton(kCharGenTrousersButtons, ARRAYSIZE(kCharGenTrousersButtons), mouseX, mouseY); + if ((state == kCharGenStateTrousers) && (trousers >= 0)) { + _colorTrousers = trousers; + + state = kCharGenStateName; + charGenSetup(state); + _vm->_draw->forceBlit(); + } + + int jacket = checkButton(kCharGenJacketButtons, ARRAYSIZE(kCharGenJacketButtons), mouseX, mouseY); + if ((state == kCharGenStateJacket) && (jacket >= 0)) { + _colorJacket = jacket; + + state = kCharGenStateTrousers; + charGenSetup(state); + _vm->_draw->forceBlit(); + } + + int hair = checkButton(kCharGenHairButtons, ARRAYSIZE(kCharGenHairButtons), mouseX, mouseY); + if ((state == kCharGenStateHair) && (hair >= 0)) { + _colorHair = hair; + + state = kCharGenStateJacket; + charGenSetup(state); + _vm->_draw->forceBlit(); + } + + int head = checkButton(kCharGenHeadButtons, ARRAYSIZE(kCharGenHeadButtons), mouseX, mouseY); + if ((state == kCharGenStateHead) && (head >= 0)) { + _head = head; + + state = kCharGenStateHair; + charGenSetup(state); + _vm->_draw->forceBlit(); + } + } + + //drawAnim(anims); + showCursor(); + fadeIn(); + + endFrame(true); + } + + fadeOut(); + hideCursor(); + + if (_vm->shouldQuit()) + return kCharGenAbort; + + return action; +} + bool OnceUpon::sectionChapter1() { showChapter(1); return true; diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 386d410c95..3b924a11e6 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -139,6 +139,13 @@ private: kSoundMAX }; + /** Action the character generation wants us to take. */ + enum CharGenAction { + kCharGenDone = 0, ///< Created a character, move on. + kCharGenAbort , ///< Aborted the character generation. + kCharGenRestart ///< Restart the character generation. + }; + /** A complete screen backup. */ struct ScreenBackup { Surface *screen; ///< Screen contents. @@ -165,6 +172,13 @@ private: static const MenuButton kSectionStorkHouses[]; + static const MenuButton kCharGenHeadButtons[]; + static const MenuButton kCharGenHeads[]; + static const MenuButton kCharGenHairButtons[]; + static const MenuButton kCharGenJacketButtons[]; + static const MenuButton kCharGenTrousersButtons[]; + static const MenuButton kCharGenNameEntry[]; + /** All general game sounds we know about. */ static const char *kSound[kSoundMAX]; @@ -259,9 +273,9 @@ private: int checkButton(const MenuButton *buttons, uint count, int16 x, int16 y, int failValue = -1) const; /** Draw a menu button. */ - void drawButton (Surface &dest, const Surface &src, const MenuButton &button) const; + void drawButton (Surface &dest, const Surface &src, const MenuButton &button, int transp = -1) const; /** Draw multiple menu buttons. */ - void drawButtons(Surface &dest, const Surface &src, const MenuButton *buttons, uint count) const; + void drawButtons(Surface &dest, const Surface &src, const MenuButton *buttons, uint count, int transp = -1) const; /** Draw a border around a button. */ void drawButtonBorder(const MenuButton &button, uint8 color); @@ -296,6 +310,13 @@ private: bool sectionChapter7(); bool sectionEnd(); + CharGenAction characterGenerator(); + void charGenSetup(uint stage); + void charGenDrawName(); + + static void recolor(Surface &surface, uint8 from, uint8 to); + static bool enterString(Common::String &name, int16 key, uint maxLength, const Font &font); + /** Did we open the game archives? */ bool _openedArchives; @@ -315,6 +336,11 @@ private: int _section; ///< The current game section. Common::String _name; ///< The name of the child. + + uint8 _head; + uint8 _colorHair; + uint8 _colorJacket; + uint8 _colorTrousers; }; } // End of namespace OnceUpon -- cgit v1.2.3 From baec4d87781d24786f0b76e83efee3bca7f9afea Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 00:19:24 +0200 Subject: GOB: Move recolor() into class Surface --- engines/gob/pregob/onceupon/onceupon.cpp | 18 +++++++----------- engines/gob/pregob/onceupon/onceupon.h | 1 - engines/gob/surface.cpp | 6 ++++++ engines/gob/surface.h | 2 ++ 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 1d1bfd4629..53fa3bcece 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -1492,12 +1492,6 @@ enum CharGenState { kCharGenStateFinish // Finished }; -void OnceUpon::recolor(Surface &surface, uint8 from, uint8 to) { - for (Pixel p = surface.get(); p.isValid(); ++p) - if (p.get() == from) - p.set(to); -} - void OnceUpon::charGenSetup(uint stage) { Surface choix(320, 200, 1), elchoix(320, 200, 1), paperDoll(65, 137, 1); @@ -1518,12 +1512,14 @@ void OnceUpon::charGenSetup(uint stage) { _vm->_draw->_backSurface->blit(choix, 0, 38, 159, 121, 140, 54); // Recolor the paper doll parts - if (_colorHair != 0xFF) - recolor(elchoix , 0x0C, _colorHair); - if (_colorJacket != 0xFF) - recolor(paperDoll, 0x0A, _colorJacket); + if (_colorHair != 0xFF) + elchoix.recolor(0x0C, _colorHair); + + if (_colorJacket != 0xFF) + paperDoll.recolor(0x0A, _colorJacket); + if (_colorTrousers != 0xFF) - recolor(paperDoll, 0x09, _colorTrousers); + paperDoll.recolor(0x09, _colorTrousers); _vm->_draw->_backSurface->blit(paperDoll, 32, 51); diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 3b924a11e6..80fcba35bd 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -314,7 +314,6 @@ private: void charGenSetup(uint stage); void charGenDrawName(); - static void recolor(Surface &surface, uint8 from, uint8 to); static bool enterString(Common::String &name, int16 key, uint maxLength, const Font &font); diff --git a/engines/gob/surface.cpp b/engines/gob/surface.cpp index 3eaf741be2..afbb7c3bae 100644 --- a/engines/gob/surface.cpp +++ b/engines/gob/surface.cpp @@ -684,6 +684,12 @@ void Surface::shadeRect(uint16 left, uint16 top, uint16 right, uint16 bottom, } +void Surface::recolor(uint8 from, uint8 to) { + for (Pixel p = get(); p.isValid(); ++p) + if (p.get() == from) + p.set(to); +} + void Surface::putPixel(uint16 x, uint16 y, uint32 color) { if ((x >= _width) || (y >= _height)) return; diff --git a/engines/gob/surface.h b/engines/gob/surface.h index 09be8d1a49..8f895a7910 100644 --- a/engines/gob/surface.h +++ b/engines/gob/surface.h @@ -156,6 +156,8 @@ public: void shadeRect(uint16 left, uint16 top, uint16 right, uint16 bottom, uint32 color, uint8 strength); + void recolor(uint8 from, uint8 to); + void putPixel(uint16 x, uint16 y, uint32 color); void drawLine(uint16 x0, uint16 y0, uint16 x1, uint16 y1, uint32 color); void drawRect(uint16 left, uint16 top, uint16 right, uint16 bottom, uint32 color); -- cgit v1.2.3 From 20a96733a5f982e427a9143ded14e2af418ac6df Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 00:19:48 +0200 Subject: GOB: Add CMPFile::recolor() and ANIFile::recolor() --- engines/gob/anifile.cpp | 5 +++++ engines/gob/anifile.h | 3 +++ engines/gob/cmpfile.cpp | 5 +++++ engines/gob/cmpfile.h | 2 ++ 4 files changed, 15 insertions(+) diff --git a/engines/gob/anifile.cpp b/engines/gob/anifile.cpp index e6bf30f4d7..085ac800cd 100644 --- a/engines/gob/anifile.cpp +++ b/engines/gob/anifile.cpp @@ -289,4 +289,9 @@ void ANIFile::drawLayer(Surface &dest, uint16 layer, uint16 part, _layers[layer]->draw(dest, part, x, y, transp); } +void ANIFile::recolor(uint8 from, uint8 to) { + for (LayerArray::iterator l = _layers.begin(); l != _layers.end(); ++l) + (*l)->recolor(from, to); +} + } // End of namespace Gob diff --git a/engines/gob/anifile.h b/engines/gob/anifile.h index b6d9c735b5..c930aafc6b 100644 --- a/engines/gob/anifile.h +++ b/engines/gob/anifile.h @@ -92,6 +92,9 @@ public: /** Draw an animation frame. */ void draw(Surface &dest, uint16 animation, uint16 frame, int16 x, int16 y) const; + /** Recolor the animation sprites. */ + void recolor(uint8 from, uint8 to); + private: typedef Common::Array LayerArray; typedef Common::Array AnimationArray; diff --git a/engines/gob/cmpfile.cpp b/engines/gob/cmpfile.cpp index 1cd1375879..d304958f76 100644 --- a/engines/gob/cmpfile.cpp +++ b/engines/gob/cmpfile.cpp @@ -250,4 +250,9 @@ uint16 CMPFile::addSprite(uint16 left, uint16 top, uint16 right, uint16 bottom) return _coordinates->add(left, top, right, bottom); } +void CMPFile::recolor(uint8 from, uint8 to) { + if (_surface) + _surface->recolor(from, to); +} + } // End of namespace Gob diff --git a/engines/gob/cmpfile.h b/engines/gob/cmpfile.h index 2b669e4d38..9c858238af 100644 --- a/engines/gob/cmpfile.h +++ b/engines/gob/cmpfile.h @@ -70,6 +70,8 @@ public: uint16 addSprite(uint16 left, uint16 top, uint16 right, uint16 bottom); + void recolor(uint8 from, uint8 to); + private: GobEngine *_vm; -- cgit v1.2.3 From 6533047514d0ab1cc7273a0c071fa24b6c2f7b71 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 00:20:36 +0200 Subject: GOB: Add the walking child in the character generator --- engines/gob/module.mk | 1 + engines/gob/pregob/onceupon/chargenchild.cpp | 104 +++++++++++++++++++++++++++ engines/gob/pregob/onceupon/chargenchild.h | 51 +++++++++++++ engines/gob/pregob/onceupon/onceupon.cpp | 22 +++++- 4 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 engines/gob/pregob/onceupon/chargenchild.cpp create mode 100644 engines/gob/pregob/onceupon/chargenchild.h diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 15351848de..4858e97c60 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -85,6 +85,7 @@ MODULE_OBJS := \ pregob/onceupon/abracadabra.o \ pregob/onceupon/babayaga.o \ pregob/onceupon/stork.o \ + pregob/onceupon/chargenchild.o \ minigames/geisha/evilfish.o \ minigames/geisha/oko.o \ minigames/geisha/meter.o \ diff --git a/engines/gob/pregob/onceupon/chargenchild.cpp b/engines/gob/pregob/onceupon/chargenchild.cpp new file mode 100644 index 0000000000..7150c69b5f --- /dev/null +++ b/engines/gob/pregob/onceupon/chargenchild.cpp @@ -0,0 +1,104 @@ +/* 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 "gob/surface.h" +#include "gob/anifile.h" + +#include "gob/pregob/onceupon/chargenchild.h" + +enum Animation { + kAnimWalkLeft = 0, + kAnimWalkRight = 1, + kAnimJumpLeft = 2, + kAnimJumpRight = 3, + kAnimTapFoot = 14 +}; + +namespace Gob { + +namespace OnceUpon { + +CharGenChild::CharGenChild(const ANIFile &ani) : ANIObject(ani) { + setPosition(265, 110); + setAnimation(kAnimWalkLeft); + setVisible(true); + setPause(false); +} + +CharGenChild::~CharGenChild() { +} + +void CharGenChild::advance() { + bool wasLastFrame = lastFrame(); + + ANIObject::advance(); + + int16 x, y, left, top, width, height; + getPosition(x, y); + getFramePosition(left, top); + getFrameSize(width, height); + + const int16 right = left + width - 1; + + switch (getAnimation()) { + case kAnimWalkLeft: + if (left <= 147) + setAnimation(kAnimWalkRight); + break; + + case kAnimWalkRight: + if (right >= 290) { + setAnimation(kAnimJumpLeft); + + setPosition(x, y - 14); + } + break; + + case kAnimJumpLeft: + if (wasLastFrame) { + setAnimation(kAnimTapFoot); + + setPosition(x, y - 10); + } + break; + + case kAnimTapFoot: + if (wasLastFrame) { + setAnimation(kAnimJumpRight); + + setPosition(x, y + 10); + } + break; + + case kAnimJumpRight: + if (wasLastFrame) { + setAnimation(kAnimWalkLeft); + + setPosition(x, y + 14); + } + break; + } +} + +} // End of namespace OnceUpon + +} // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/chargenchild.h b/engines/gob/pregob/onceupon/chargenchild.h new file mode 100644 index 0000000000..afbe3fd2fe --- /dev/null +++ b/engines/gob/pregob/onceupon/chargenchild.h @@ -0,0 +1,51 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GOB_PREGOB_ONCEUPON_CHARGENCHILD_H +#define GOB_PREGOB_ONCEUPON_CHARGENCHILD_H + +#include "common/system.h" + +#include "gob/aniobject.h" + +namespace Gob { + +class Surface; +class ANIFile; + +namespace OnceUpon { + +/** The child running around on the character generator screen. */ +class CharGenChild : public ANIObject { +public: + CharGenChild(const ANIFile &ani); + ~CharGenChild(); + + /** Advance the animation to the next frame. */ + void advance(); +}; + +} // End of namespace OnceUpon + +} // End of namespace Gob + +#endif // GOB_PREGOB_ONCEUPON_CHARGENCHILD_H diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 53fa3bcece..7eef740139 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -37,6 +37,7 @@ #include "gob/pregob/onceupon/onceupon.h" #include "gob/pregob/onceupon/palettes.h" +#include "gob/pregob/onceupon/chargenchild.h" static const uint kLanguageCount = 5; @@ -1646,6 +1647,15 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { CharGenState state = kCharGenStateHead; charGenSetup(state); + ANIFile ani(_vm, "ba.ani", 320); + ANIList anims; + + anims.push_back(new CharGenChild(ani)); + + ani.recolor(0x0F, 0x0C); + ani.recolor(0x0E, 0x0A); + ani.recolor(0x08, 0x09); + fadeOut(); _vm->_draw->forceBlit(); @@ -1665,7 +1675,7 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { break; } - // clearAnim(anims); + clearAnim(anims); if (state == kCharGenStateStoryName) { if ((mouseButtons != kMouseButtonsNone) || (key != 0)) { @@ -1727,6 +1737,8 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { if ((state == kCharGenStateTrousers) && (trousers >= 0)) { _colorTrousers = trousers; + ani.recolor(0x09, _colorTrousers); + state = kCharGenStateName; charGenSetup(state); _vm->_draw->forceBlit(); @@ -1736,6 +1748,8 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { if ((state == kCharGenStateJacket) && (jacket >= 0)) { _colorJacket = jacket; + ani.recolor(0x0A, _colorJacket); + state = kCharGenStateTrousers; charGenSetup(state); _vm->_draw->forceBlit(); @@ -1745,6 +1759,8 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { if ((state == kCharGenStateHair) && (hair >= 0)) { _colorHair = hair; + ani.recolor(0x0C, _colorHair); + state = kCharGenStateJacket; charGenSetup(state); _vm->_draw->forceBlit(); @@ -1760,7 +1776,7 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { } } - //drawAnim(anims); + drawAnim(anims); showCursor(); fadeIn(); @@ -1770,6 +1786,8 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { fadeOut(); hideCursor(); + freeAnims(anims); + if (_vm->shouldQuit()) return kCharGenAbort; -- cgit v1.2.3 From 9c32fd2360d9fa18ceac6fefc571c6610965d361 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 00:46:24 +0200 Subject: GOB: Add PreGob::beep() --- engines/gob/pregob/pregob.cpp | 4 ++++ engines/gob/pregob/pregob.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 033eea89f2..42b5a8fb9c 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -208,6 +208,10 @@ void PreGob::playSoundFile(const Common::String &file, int16 frequency, int16 re stopSound(); } +void PreGob::beep(int16 frequency, int32 length) { + _vm->_sound->speakerOn(frequency, length); +} + void PreGob::endFrame(bool doInput) { _vm->_draw->blitInvalidated(); _vm->_util->waitEndFrame(); diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index 686727b08b..da0de60dd8 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -142,6 +142,9 @@ protected: /** Play a sound until it ends or is interrupted by a keypress. */ void playSoundFile(const Common::String &file, int16 frequency = 0, int16 repCount = 0, bool interruptible = true); + /** Beep the PC speaker. */ + void beep(int16 frequency, int32 length); + // -- Input -- -- cgit v1.2.3 From 943c6af82af9e14062c1aa1940aea2f625121368 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 00:47:03 +0200 Subject: GOB: Add the sounds in the Once Upon A Time character generator --- engines/gob/pregob/onceupon/chargenchild.cpp | 13 +++++++++++++ engines/gob/pregob/onceupon/chargenchild.h | 9 +++++++++ engines/gob/pregob/onceupon/onceupon.cpp | 24 ++++++++++++++++++++---- engines/gob/pregob/onceupon/onceupon.h | 1 + 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/engines/gob/pregob/onceupon/chargenchild.cpp b/engines/gob/pregob/onceupon/chargenchild.cpp index 7150c69b5f..ba099e4937 100644 --- a/engines/gob/pregob/onceupon/chargenchild.cpp +++ b/engines/gob/pregob/onceupon/chargenchild.cpp @@ -99,6 +99,19 @@ void CharGenChild::advance() { } } +CharGenChild::Sound CharGenChild::shouldPlaySound() const { + const uint16 anim = getAnimation(); + const uint16 frame = getFrame(); + + if (((anim == kAnimWalkLeft) || (anim == kAnimWalkRight)) && ((frame == 1) || (frame == 6))) + return kSoundWalk; + + if (((anim == kAnimJumpLeft) || (anim == kAnimJumpRight)) && (frame == 0)) + return kSoundJump; + + return kSoundNone; +} + } // End of namespace OnceUpon } // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/chargenchild.h b/engines/gob/pregob/onceupon/chargenchild.h index afbe3fd2fe..3b09ef112a 100644 --- a/engines/gob/pregob/onceupon/chargenchild.h +++ b/engines/gob/pregob/onceupon/chargenchild.h @@ -37,11 +37,20 @@ namespace OnceUpon { /** The child running around on the character generator screen. */ class CharGenChild : public ANIObject { public: + enum Sound { + kSoundNone = 0, + kSoundWalk , + kSoundJump + }; + CharGenChild(const ANIFile &ani); ~CharGenChild(); /** Advance the animation to the next frame. */ void advance(); + + /** Should we play a sound right now? */ + Sound shouldPlaySound() const; }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 7eef740139..f9e093374b 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -136,7 +136,8 @@ const OnceUpon::MenuButton OnceUpon::kLanguageButtons[] = { const char *OnceUpon::kSound[kSoundMAX] = { "diamant.snd", // kSoundClick - "cigogne.snd" // kSoundStork + "cigogne.snd", // kSoundStork + "saute.snd" // kSoundJump }; const OnceUpon::SectionFunc OnceUpon::kSectionFuncs[kSectionCount] = { @@ -1648,14 +1649,16 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { charGenSetup(state); ANIFile ani(_vm, "ba.ani", 320); - ANIList anims; - - anims.push_back(new CharGenChild(ani)); ani.recolor(0x0F, 0x0C); ani.recolor(0x0E, 0x0A); ani.recolor(0x08, 0x09); + CharGenChild *child = new CharGenChild(ani); + + ANIList anims; + anims.push_back(child); + fadeOut(); _vm->_draw->forceBlit(); @@ -1733,6 +1736,9 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { } if (mouseButtons == kMouseButtonsLeft) { + stopSound(); + playSound(kSoundClick); + int trousers = checkButton(kCharGenTrousersButtons, ARRAYSIZE(kCharGenTrousersButtons), mouseX, mouseY); if ((state == kCharGenStateTrousers) && (trousers >= 0)) { _colorTrousers = trousers; @@ -1777,6 +1783,16 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { } drawAnim(anims); + + // Play the child sounds + CharGenChild::Sound childSound = child->shouldPlaySound(); + if (childSound == CharGenChild::kSoundWalk) { + beep(50, 10); + } else if (childSound == CharGenChild::kSoundJump) { + stopSound(); + playSound(kSoundJump); + } + showCursor(); fadeIn(); diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 80fcba35bd..d2e1feb604 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -136,6 +136,7 @@ private: enum Sound { kSoundClick = 0, kSoundStork , + kSoundJump , kSoundMAX }; -- cgit v1.2.3 From 4bc80cd8810b4d328103e8bac75055a841b22d82 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 01:00:48 +0200 Subject: GOB: Allow spaces in the Once Upon A Time character generator --- engines/gob/pregob/onceupon/onceupon.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index f9e093374b..abee238d34 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -1599,6 +1599,9 @@ bool OnceUpon::enterString(Common::String &name, int16 key, uint maxLength, cons return true; } + if (key == kKeySpace) + key = ' '; + if ((key >= ' ') && (key <= 0xFF)) { if (name.size() >= maxLength) return false; @@ -1727,6 +1730,7 @@ OnceUpon::CharGenAction OnceUpon::characterGenerator() { } if ((key == kKeyReturn) && !_name.empty()) { + _name.trim(); _name.setChar(Util::toCP850Upper(_name[0]), 0); state = kCharGenStateSure; -- cgit v1.2.3 From 734329dcc10e5d22da716484034c78f8bea927c5 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 15:37:24 +0200 Subject: GOB: Name the Once Upon A Time frame a bit more --- engines/gob/pregob/onceupon/onceupon.cpp | 45 +++++++++++++++++++------------- engines/gob/pregob/onceupon/onceupon.h | 14 +++++----- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index abee238d34..7f59790d1d 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -143,17 +143,17 @@ const char *OnceUpon::kSound[kSoundMAX] = { const OnceUpon::SectionFunc OnceUpon::kSectionFuncs[kSectionCount] = { &OnceUpon::sectionStork, &OnceUpon::sectionChapter1, - &OnceUpon::section02, + &OnceUpon::sectionParents, &OnceUpon::sectionChapter2, - &OnceUpon::section04, + &OnceUpon::sectionForest0, &OnceUpon::sectionChapter3, - &OnceUpon::section06, + &OnceUpon::sectionEvilCastle, &OnceUpon::sectionChapter4, - &OnceUpon::section08, + &OnceUpon::sectionForest1, &OnceUpon::sectionChapter5, - &OnceUpon::section10, + &OnceUpon::sectionBossFight, &OnceUpon::sectionChapter6, - &OnceUpon::section12, + &OnceUpon::sectionForest2, &OnceUpon::sectionChapter7, &OnceUpon::sectionEnd }; @@ -230,6 +230,13 @@ void OnceUpon::init() { // Default name _name = "Nemo"; + + // Default character properties + _house = 0; + _head = 0; + _colorHair = 0; + _colorJacket = 0; + _colorTrousers = 0; } void OnceUpon::deinit() { @@ -1403,6 +1410,8 @@ bool OnceUpon::sectionStork() { int house = checkButton(param.houses, param.houseCount, mouseX, mouseY); if ((state == kStorkStateWaitUser) && (house >= 0)) { + _house = house; + stork->dropBundle(param.drops[house]); state = kStorkStateWaitBundle; @@ -1819,8 +1828,8 @@ bool OnceUpon::sectionChapter1() { return true; } -bool OnceUpon::section02() { - warning("OnceUpon::section02(): TODO"); +bool OnceUpon::sectionParents() { + warning("OnceUpon::sectionParents(): TODO"); return true; } @@ -1829,8 +1838,8 @@ bool OnceUpon::sectionChapter2() { return true; } -bool OnceUpon::section04() { - warning("OnceUpon::section04(): TODO"); +bool OnceUpon::sectionForest0() { + warning("OnceUpon::sectionForest0(): TODO"); return true; } @@ -1839,8 +1848,8 @@ bool OnceUpon::sectionChapter3() { return true; } -bool OnceUpon::section06() { - warning("OnceUpon::section06(): TODO"); +bool OnceUpon::sectionEvilCastle() { + warning("OnceUpon::sectionEvilCastle(): TODO"); return true; } @@ -1849,8 +1858,8 @@ bool OnceUpon::sectionChapter4() { return true; } -bool OnceUpon::section08() { - warning("OnceUpon::section08(): TODO"); +bool OnceUpon::sectionForest1() { + warning("OnceUpon::sectionForest1(): TODO"); return true; } @@ -1859,8 +1868,8 @@ bool OnceUpon::sectionChapter5() { return true; } -bool OnceUpon::section10() { - warning("OnceUpon::section10(): TODO"); +bool OnceUpon::sectionBossFight() { + warning("OnceUpon::sectionBossFight(): TODO"); return true; } @@ -1869,8 +1878,8 @@ bool OnceUpon::sectionChapter6() { return true; } -bool OnceUpon::section12() { - warning("OnceUpon::section12(): TODO"); +bool OnceUpon::sectionForest2() { + warning("OnceUpon::sectionForest2(): TODO"); return true; } diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index d2e1feb604..2f25060a37 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -297,17 +297,17 @@ private: bool sectionStork(); bool sectionChapter1(); - bool section02(); + bool sectionParents(); bool sectionChapter2(); - bool section04(); + bool sectionForest0(); bool sectionChapter3(); - bool section06(); + bool sectionEvilCastle(); bool sectionChapter4(); - bool section08(); + bool sectionForest1(); bool sectionChapter5(); - bool section10(); + bool sectionBossFight(); bool sectionChapter6(); - bool section12(); + bool sectionForest2(); bool sectionChapter7(); bool sectionEnd(); @@ -337,6 +337,8 @@ private: Common::String _name; ///< The name of the child. + uint8 _house; + uint8 _head; uint8 _colorHair; uint8 _colorJacket; -- cgit v1.2.3 From f4cd726802732f7f0990eb213c2c9d16da217eec Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 20:08:24 +0200 Subject: GOB: Add a class handling simple SEQ files --- engines/gob/module.mk | 1 + engines/gob/pregob/seqfile.cpp | 384 +++++++++++++++++++++++++++++++++++++++++ engines/gob/pregob/seqfile.h | 193 +++++++++++++++++++++ 3 files changed, 578 insertions(+) create mode 100644 engines/gob/pregob/seqfile.cpp create mode 100644 engines/gob/pregob/seqfile.h diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 4858e97c60..04e55dcf16 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -81,6 +81,7 @@ MODULE_OBJS := \ pregob/pregob.o \ pregob/txtfile.o \ pregob/gctfile.o \ + pregob/seqfile.o \ pregob/onceupon/onceupon.o \ pregob/onceupon/abracadabra.o \ pregob/onceupon/babayaga.o \ diff --git a/engines/gob/pregob/seqfile.cpp b/engines/gob/pregob/seqfile.cpp new file mode 100644 index 0000000000..91973bbb85 --- /dev/null +++ b/engines/gob/pregob/seqfile.cpp @@ -0,0 +1,384 @@ +/* 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/str.h" +#include "common/stream.h" + +#include "gob/gob.h" +#include "gob/dataio.h" +#include "gob/draw.h" +#include "gob/decfile.h" +#include "gob/anifile.h" +#include "gob/aniobject.h" + +#include "gob/pregob/seqfile.h" + +namespace Gob { + +SEQFile::SEQFile(GobEngine *vm, const Common::String &fileName) : _vm(vm) { + for (uint i = 0; i < kObjectCount; i++) + _objects[i].object = 0; + + Common::SeekableReadStream *seq = _vm->_dataIO->getFile(Util::setExtension(fileName, ".SEQ")); + if (!seq) { + warning("SEQFile::SEQFile(): No such file \"%s\"", fileName.c_str()); + return; + } + + load(*seq); + + delete seq; +} + +SEQFile::~SEQFile() { + for (uint i = 0; i < kObjectCount; i++) + delete _objects[i].object; + + for (Backgrounds::iterator b = _backgrounds.begin(); b != _backgrounds.end(); ++b) + delete *b; + + for (Animations::iterator a = _animations.begin(); a != _animations.end(); ++a) + delete *a; +} + +void SEQFile::load(Common::SeekableReadStream &seq) { + const uint16 decCount = (uint16)seq.readByte() + 1; + const uint16 aniCount = (uint16)seq.readByte() + 1; + + // Load backgrounds + _backgrounds.reserve(decCount); + for (uint i = 0; i < decCount; i++) { + const Common::String dec = Util::readString(seq, 13); + + if (!_vm->_dataIO->hasFile(dec)) { + warning("SEQFile::load(): No such background \"%s\"", dec.c_str()); + return; + } + + _backgrounds.push_back(new DECFile(_vm, dec, 320, 200)); + } + + // Load animations + _animations.reserve(aniCount); + for (uint i = 0; i < aniCount; i++) { + const Common::String ani = Util::readString(seq, 13); + + if (!_vm->_dataIO->hasFile(ani)) { + warning("SEQFile::load(): No such animation \"%s\"", ani.c_str()); + return; + } + + _animations.push_back(new ANIFile(_vm, ani)); + } + + _frameRate = seq.readUint16LE(); + + // Load background change keys + + const uint16 bgKeyCount = seq.readUint16LE(); + _bgKeys.resize(bgKeyCount); + + for (uint16 i = 0; i < bgKeyCount; i++) { + const uint16 frame = seq.readUint16LE(); + const uint16 index = seq.readUint16LE(); + + _bgKeys[i].frame = frame; + _bgKeys[i].background = index < _backgrounds.size() ? _backgrounds[index] : 0; + } + + // Load animation keys for all 4 objects + + for (uint i = 0; i < kObjectCount; i++) { + const uint16 animKeyCount = seq.readUint16LE(); + _animKeys.reserve(_animKeys.size() + animKeyCount); + + for (uint16 j = 0; j < animKeyCount; j++) { + _animKeys.push_back(AnimationKey()); + + const uint16 frame = seq.readUint16LE(); + const uint16 index = seq.readUint16LE(); + + uint16 animation; + const ANIFile *ani = findANI(index, animation); + + _animKeys.back().object = i; + _animKeys.back().frame = frame; + _animKeys.back().ani = ani; + _animKeys.back().animation = animation; + _animKeys.back().x = seq.readSint16LE(); + _animKeys.back().y = seq.readSint16LE(); + _animKeys.back().order = seq.readSint16LE(); + } + } + +} + +const ANIFile *SEQFile::findANI(uint16 index, uint16 &animation) { + animation = 0xFFFF; + + // 0xFFFF = remove animation + if (index == 0xFFFF) + return 0; + + for (Animations::const_iterator a = _animations.begin(); a != _animations.end(); ++a) { + if (index < (*a)->getAnimationCount()) { + animation = index; + return *a; + } + + index -= (*a)->getAnimationCount(); + } + + return 0; +} + +void SEQFile::play(bool abortable, uint16 endFrame, uint16 frameRate) { + if (_bgKeys.empty() && _animKeys.empty()) + // Nothing to do + return; + + // Init + + _frame = 0; + _abortPlay = false; + + for (uint i = 0; i < kObjectCount; i++) { + delete _objects[i].object; + + _objects[i].object = 0; + _objects[i].order = 0; + } + + for (Loops::iterator l = _loops.begin(); l != _loops.end(); ++l) + l->currentLoop = 0; + + // Set the frame rate + + int16 frameRateBack = _vm->_util->getFrameRate(); + + if (frameRate == 0) + frameRate = _frameRate; + + _vm->_util->setFrameRate(frameRate); + + _abortable = abortable; + + while (!_vm->shouldQuit() && !_abortPlay) { + // Handle the frame contents + playFrame(); + + // Handle extra frame events + handleFrameEvent(); + + // Wait for the frame to end + _vm->_draw->blitInvalidated(); + _vm->_util->waitEndFrame(); + + // Handle input + + _vm->_util->processInput(); + + int16 key = _vm->_util->checkKey(); + + int16 mouseX, mouseY; + MouseButtons mouseButtons; + _vm->_util->getMouseState(&mouseX, &mouseY, &mouseButtons); + _vm->_util->forceMouseUp(); + + handleInput(key, mouseX, mouseY, mouseButtons); + + // Loop + + bool looped = false; + for (Loops::iterator l = _loops.begin(); l != _loops.end(); ++l) { + if ((l->endFrame == _frame) && (l->currentLoop < l->loopCount)) { + _frame = l->startFrame; + + l->currentLoop++; + looped = true; + } + } + + // If we didn't loop, advance the frame and look if we should end here + + if (!looped) { + _frame++; + if (_frame >= endFrame) + break; + } + } + + // Restore the frame rate + _vm->_util->setFrameRate(frameRateBack); +} + +void SEQFile::playFrame() { + // Remove the current animation frames + clearAnims(); + + // Handle background keys, directly updating the background + for (BackgroundKeys::const_iterator b = _bgKeys.begin(); b != _bgKeys.end(); ++b) { + if (!b->background || (b->frame != _frame)) + continue; + + b->background->draw(*_vm->_draw->_backSurface); + + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, 0, 0, 319, 199); + } + + // Handle the animation keys, updating the objects + for (AnimationKeys::const_iterator a = _animKeys.begin(); a != _animKeys.end(); ++a) { + if (a->frame != _frame) + continue; + + Object &object = _objects[a->object]; + + delete object.object; + object.object = 0; + + // No valid animation => remove + if ((a->animation == 0xFFFF) || !a->ani) + continue; + + // Change the animation + + object.object = new ANIObject(*a->ani); + + object.object->setAnimation(a->animation); + object.object->setPosition(a->x, a->y); + object.object->setVisible(true); + object.object->setPause(false); + + object.order = a->order; + } + + // Draw the animations + drawAnims(); +} + +// NOTE: This is really not at all efficient. However, since there's only a +// small number of objects, it should matter. We really do need a stable +// sort, though, so Common::sort() is out. +SEQFile::Objects SEQFile::getOrderedObjects() { + int16 minOrder = (int16)0x7FFF; + int16 maxOrder = (int16)0x8000; + + Objects objects; + + // Find the span of order values + for (uint i = 0; i < kObjectCount; i++) { + if (!_objects[i].object) + continue; + + minOrder = MIN(minOrder, _objects[i].order); + maxOrder = MAX(maxOrder, _objects[i].order); + } + + // Stably sort the objects by order value + for (int16 o = minOrder; o <= maxOrder; o++) + for (uint i = 0; i < kObjectCount; i++) + if (_objects[i].object && (_objects[i].order == o)) + objects.push_back(_objects[i]); + + return objects; +} + +void SEQFile::clearAnims() { + Objects objects = getOrderedObjects(); + + // Remove the animation frames, in reverse drawing order + for (Objects::iterator o = objects.reverse_begin(); o != objects.end(); --o) { + int16 left, top, right, bottom; + + if (o->object->clear(*_vm->_draw->_backSurface, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + } +} + +void SEQFile::drawAnims() { + Objects objects = getOrderedObjects(); + + // Draw the animation frames and advance the animation + for (Objects::iterator o = objects.begin(); o != objects.end(); ++o) { + int16 left, top, right, bottom; + + if (o->object->draw(*_vm->_draw->_backSurface, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + + o->object->advance(); + } +} + +uint16 SEQFile::getFrame() const { + return _frame; +} + +void SEQFile::seekFrame(uint16 frame) { + _frame = frame; +} + +uint SEQFile::addLoop(uint16 startFrame, uint16 endFrame, uint16 loopCount) { + _loops.resize(_loops.size() + 1); + + _loops.back().startFrame = startFrame; + _loops.back().endFrame = endFrame; + _loops.back().loopCount = loopCount; + _loops.back().currentLoop = 0; + _loops.back().empty = false; + + return _loops.size() - 1; +} + +void SEQFile::skipLoop(uint loopID) { + if (loopID >= _loops.size()) + return; + + _loops[loopID].currentLoop = 0xFFFF; +} + +void SEQFile::delLoop(uint loopID) { + if (loopID >= _loops.size()) + return; + + _loops[loopID].empty = true; + + cleanLoops(); +} + +void SEQFile::cleanLoops() { + while (!_loops.empty() && _loops.back().empty) + _loops.pop_back(); +} + +void SEQFile::abortPlay() { + _abortPlay = true; +} + +void SEQFile::handleFrameEvent() { +} + +void SEQFile::handleInput(int16 key, int16 mouseX, int16 mouseY, MouseButtons mouseButtons) { + if (_abortable && ((key != 0) || (mouseButtons != kMouseButtonsNone))) + abortPlay(); +} + +} // End of namespace Gob diff --git a/engines/gob/pregob/seqfile.h b/engines/gob/pregob/seqfile.h new file mode 100644 index 0000000000..5e12962ef9 --- /dev/null +++ b/engines/gob/pregob/seqfile.h @@ -0,0 +1,193 @@ +/* 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 GOB_PREGOB_SEQFILE_H +#define GOB_PREGOB_SEQFILE_H + +#include "common/system.h" +#include "common/array.h" +#include "common/list.h" + +#include "gob/util.h" + +namespace Common { + class String; + class SeekableReadStream; +} + +namespace Gob { + +class GobEngine; + +class DECFile; +class ANIFile; +class ANIObject; + +/** A SEQ file, describing a complex animation sequence. + * + * Used in early hardcoded gob games. + * The principle is similar to the Mult class (see mult.h), but instead + * of depending on all the externally loaded animations, backgrounds and + * objects, a SEQ file references animation and background directly by + * filename. + */ +class SEQFile { +public: + SEQFile(GobEngine *vm, const Common::String &fileName); + virtual ~SEQFile(); + + /** Play the SEQ. + * + * @param abortable If true, end playback on any user input. + * @param endFrame The frame on where to end, or 0xFFFF for infinite playback. + * @param frameRate The frame rate at which to play the SEQ, or 0 for playing at + * the speed the SEQ itself wants to. + */ + void play(bool abortable = true, uint16 endFrame = 0xFFFF, uint16 frameRate = 0); + + +protected: + GobEngine *_vm; + + + /** Returns the current frame number. */ + uint16 getFrame() const; + + /** Seek to a specific frame. */ + void seekFrame(uint16 frame); + + /** Add a frame loop. */ + uint addLoop(uint16 startFrame, uint16 endFrame, uint16 loopCount); + + /** Skip a frame loop. */ + void skipLoop(uint loopID); + + /** Delete a frame loop. */ + void delLoop(uint loopID); + + /** Ends SEQ playback. */ + void abortPlay(); + + /** Callback for special frame events. */ + virtual void handleFrameEvent(); + /** Callback for special user input handling. */ + virtual void handleInput(int16 key, int16 mouseX, int16 mouseY, MouseButtons mouseButtons); + + +private: + /** Number of animation objects that are visible at the same time. */ + static const uint kObjectCount = 4; + + /** A key for changing the background. */ + struct BackgroundKey { + uint16 frame; ///< Frame the change is to happen. + + const DECFile *background; ///< The background to use. + }; + + /** A key for playing an object animation. */ + struct AnimationKey { + uint object; ///< The object this key belongs to. + + uint16 frame; ///< Frame the change is to happen. + + const ANIFile *ani; ///< The ANI to use. + + uint16 animation; ///< The animation to use. + + int16 x; ///< X position of the animation. + int16 y; ///< Y position of the animation. + + int16 order; ///< Used to determine in which order to draw the objects. + }; + + /** A managed animation object. */ + struct Object { + ANIObject *object; ///< The actual animation object. + + int16 order; ///< The current drawing order. + }; + + /** A frame loop. */ + struct Loop { + uint16 startFrame; + uint16 endFrame; + + uint16 loopCount; + uint16 currentLoop; + + bool empty; + }; + + typedef Common::Array Backgrounds; + typedef Common::Array Animations; + + typedef Common::Array BackgroundKeys; + typedef Common::Array AnimationKeys; + + typedef Common::List Objects; + + typedef Common::Array Loops; + + + uint16 _frame; ///< The current frame. + bool _abortPlay; ///< Was the end of the playback requested? + + uint16 _frameRate; + + Backgrounds _backgrounds; ///< All backgrounds in this SEQ. + Animations _animations; ///< All animations in this SEQ. + + BackgroundKeys _bgKeys; ///< The background change keyframes. + AnimationKeys _animKeys; ///< The animation change keyframes. + + Object _objects[kObjectCount]; ///< The managed animation objects. + + Loops _loops; + + /** Whether the playback should be abortable by user input. */ + bool _abortable; + + + // -- Loading helpers -- + + void load(Common::SeekableReadStream &seq); + + const ANIFile *findANI(uint16 index, uint16 &animation); + + // -- Playback helpers -- + + void playFrame(); + + /** Get a list of objects ordered by drawing order. */ + Objects getOrderedObjects(); + + void clearAnims(); ///< Remove all animation frames. + void drawAnims(); ///< Draw the animation frames. + + /** Look if we can compact the loop array. */ + void cleanLoops(); +}; + +} // End of namespace Gob + +#endif // GOB_PREGOB_SEQFILE_H -- cgit v1.2.3 From 850472f21e73280c0bf35c76163419a7e280fea2 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 20:11:06 +0200 Subject: GOB: Implement the proper Once Upon A Time title sequence --- engines/gob/module.mk | 1 + engines/gob/pregob/onceupon/onceupon.cpp | 88 +---------------------- engines/gob/pregob/onceupon/onceupon.h | 10 +-- engines/gob/pregob/onceupon/title.cpp | 117 +++++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/title.h | 55 +++++++++++++++ 5 files changed, 177 insertions(+), 94 deletions(-) create mode 100644 engines/gob/pregob/onceupon/title.cpp create mode 100644 engines/gob/pregob/onceupon/title.h diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 04e55dcf16..489afe509e 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -85,6 +85,7 @@ MODULE_OBJS := \ pregob/onceupon/onceupon.o \ pregob/onceupon/abracadabra.o \ pregob/onceupon/babayaga.o \ + pregob/onceupon/title.o \ pregob/onceupon/stork.o \ pregob/onceupon/chargenchild.o \ minigames/geisha/evilfish.o \ diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 7f59790d1d..6ee391ea7f 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -37,6 +37,7 @@ #include "gob/pregob/onceupon/onceupon.h" #include "gob/pregob/onceupon/palettes.h" +#include "gob/pregob/onceupon/title.h" #include "gob/pregob/onceupon/chargenchild.h" static const uint kLanguageCount = 5; @@ -657,94 +658,11 @@ const PreGob::AnimProperties OnceUpon::kTitleAnimation = { }; void OnceUpon::showTitle() { - // Show the Once Upon A Time title animation - // NOTE: This is currently only a mock-up. The real animation is in "ville.seq". - fadeOut(); setGamePalette(10); - warning("OnceUpon::showTitle(): Actually play the SEQ"); - - clearScreen(); - - _vm->_video->drawPackedSprite("ville.cmp", *_vm->_draw->_backSurface); - _vm->_draw->forceBlit(); - - ANIFile ani (_vm, "pres.ani", 320); - ANIList anims; - - loadAnims(anims, ani, 1, &kTitleAnimation); - - playTitleMusic(); - - while (!_vm->shouldQuit()) { - redrawAnim(anims); - - fadeIn(); - - endFrame(true); - - if (hasInput()) - break; - } - - freeAnims(anims); - - fadeOut(); - stopTitleMusic(); -} - -void OnceUpon::playTitleMusic() { - // Look at what platform this is and play the appropriate music type - - if (_vm->getPlatform() == Common::kPlatformPC) - playTitleMusicDOS(); - else if (_vm->getPlatform() == Common::kPlatformAmiga) - playTitleMusicAmiga(); - else if (_vm->getPlatform() == Common::kPlatformAtariST) - playTitleMusicAtariST(); -} - -void OnceUpon::playTitleMusicDOS() { - // Play an AdLib track - - _vm->_sound->adlibLoadTBR("babayaga.tbr"); - _vm->_sound->adlibLoadMDY("babayaga.mdy"); - _vm->_sound->adlibSetRepeating(-1); - _vm->_sound->adlibPlay(); -} - -void OnceUpon::playTitleMusicAmiga() { - // Play a Protracker track - - _vm->_sound->protrackerPlay("mod.babayaga"); -} - -void OnceUpon::playTitleMusicAtariST() { - // Play a Soundblaster composition - - static const int16 titleMusic[21] = { 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, -1}; - static const char * const titleFiles[ 3] = {"baba1.snd", "baba2.snd", "baba3.snd"}; - - for (uint i = 0; i < ARRAYSIZE(titleFiles); i++) - _vm->_sound->sampleLoad(_vm->_sound->sampleGetBySlot(i), SOUND_SND, titleFiles[i]); - - _vm->_sound->blasterPlayComposition(titleMusic, 0); - _vm->_sound->blasterRepeatComposition(-1); -} - -void OnceUpon::stopTitleMusic() { - // Just stop everything - - _vm->_sound->adlibSetRepeating(0); - _vm->_sound->blasterRepeatComposition(0); - - _vm->_sound->adlibStop(); - _vm->_sound->blasterStopComposition(); - _vm->_sound->protrackerStop(); - - for (int i = 0; i < ::Gob::Sound::kSoundsCount; i++) - _vm->_sound->sampleFree(_vm->_sound->sampleGetBySlot(i)); + Title title(_vm); + title.play(); } void OnceUpon::showChapter(int chapter) { diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 2f25060a37..41a2f5668d 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -237,15 +237,6 @@ private: void handleAnimalNames(uint count, const MenuButton *buttons, const char * const *names); - // -- Title music helpers -- - - void playTitleMusic(); ///< Play the title music. - void playTitleMusicDOS(); ///< Play the title music of the DOS version. - void playTitleMusicAmiga(); ///< Play the title music of the Amiga version. - void playTitleMusicAtariST(); ///< Play the title music of the Atari ST version. - void stopTitleMusic(); ///< Stop the title music. - - // -- Menu helpers -- MenuAction handleStartMenu(const MenuButton *animalsButton); ///< Handle the start menu. @@ -291,6 +282,7 @@ private: /** Play / Display the name of an animal in one language. */ void anPlayAnimalName(const Common::String &animal, uint language); + // -- Game sections -- bool playSection(); diff --git a/engines/gob/pregob/onceupon/title.cpp b/engines/gob/pregob/onceupon/title.cpp new file mode 100644 index 0000000000..5163ff6822 --- /dev/null +++ b/engines/gob/pregob/onceupon/title.cpp @@ -0,0 +1,117 @@ +/* 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 "gob/gob.h" +#include "gob/global.h" +#include "gob/palanim.h" +#include "gob/draw.h" + +#include "gob/sound/sound.h" + +#include "gob/pregob/onceupon/title.h" + +namespace Gob { + +namespace OnceUpon { + +Title::Title(GobEngine *vm) : SEQFile(vm, "ville.seq") { +} + +Title::~Title() { +} + +void Title::play() { + SEQFile::play(true, 0xFFFF, 15); + + // After playback, fade out and stop the music + if (!_vm->shouldQuit()) + _vm->_palAnim->fade(0, 0, 0); + + stopMusic(); +} + +void Title::handleFrameEvent() { + // On fame 0, start the music and fade in + if (getFrame() == 0) { + playMusic(); + + _vm->_draw->forceBlit(); + _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, 0, 0); + } +} + +void Title::playMusic() { + // Look at what platform this is and play the appropriate music type + + if (_vm->getPlatform() == Common::kPlatformPC) + playMusicDOS(); + else if (_vm->getPlatform() == Common::kPlatformAmiga) + playMusicAmiga(); + else if (_vm->getPlatform() == Common::kPlatformAtariST) + playMusicAtariST(); +} + +void Title::playMusicDOS() { + // Play an AdLib track + + _vm->_sound->adlibLoadTBR("babayaga.tbr"); + _vm->_sound->adlibLoadMDY("babayaga.mdy"); + _vm->_sound->adlibSetRepeating(-1); + _vm->_sound->adlibPlay(); +} + +void Title::playMusicAmiga() { + // Play a Protracker track + + _vm->_sound->protrackerPlay("mod.babayaga"); +} + +void Title::playMusicAtariST() { + // Play a Soundblaster composition + + static const int16 titleMusic[21] = { 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, -1}; + static const char * const titleFiles[ 3] = {"baba1.snd", "baba2.snd", "baba3.snd"}; + + for (uint i = 0; i < ARRAYSIZE(titleFiles); i++) + _vm->_sound->sampleLoad(_vm->_sound->sampleGetBySlot(i), SOUND_SND, titleFiles[i]); + + _vm->_sound->blasterPlayComposition(titleMusic, 0); + _vm->_sound->blasterRepeatComposition(-1); +} + +void Title::stopMusic() { + // Just stop everything + + _vm->_sound->adlibSetRepeating(0); + _vm->_sound->blasterRepeatComposition(0); + + _vm->_sound->adlibStop(); + _vm->_sound->blasterStopComposition(); + _vm->_sound->protrackerStop(); + + for (int i = 0; i < ::Gob::Sound::kSoundsCount; i++) + _vm->_sound->sampleFree(_vm->_sound->sampleGetBySlot(i)); +} + +} // End of namespace OnceUpon + +} // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/title.h b/engines/gob/pregob/onceupon/title.h new file mode 100644 index 0000000000..5e7ef76d40 --- /dev/null +++ b/engines/gob/pregob/onceupon/title.h @@ -0,0 +1,55 @@ +/* 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 GOB_PREGOB_ONCEUPON_TITLE_H +#define GOB_PREGOB_ONCEUPON_TITLE_H + +#include "gob/pregob/seqfile.h" + +namespace Gob { + +namespace OnceUpon { + +/** The Once Upon A Time title animation sequence. */ +class Title : public SEQFile { +public: + Title(GobEngine *vm); + ~Title(); + + void play(); + +protected: + void handleFrameEvent(); + +private: + void playMusic(); ///< Play the title music. + void playMusicDOS(); ///< Play the title music of the DOS version. + void playMusicAmiga(); ///< Play the title music of the Amiga version. + void playMusicAtariST(); ///< Play the title music of the Atari ST version. + void stopMusic(); ///< Stop the title music. +}; + +} // End of namespace OnceUpon + +} // End of namespace Gob + +#endif // GOB_PREGOB_ONCEUPON_TITLE_H -- cgit v1.2.3 From 3189729c972b5da1356497e82e08a21c94c8fbec Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 22:15:40 +0200 Subject: GOB: Don't leak in sampleLoad() when loading fails --- engines/gob/sound/sound.cpp | 11 +++++++---- engines/gob/sound/sound.h | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp index 69a668e5fb..63af6aeef4 100644 --- a/engines/gob/sound/sound.cpp +++ b/engines/gob/sound/sound.cpp @@ -109,7 +109,7 @@ int Sound::sampleGetNextFreeSlot() const { return -1; } -bool Sound::sampleLoad(SoundDesc *sndDesc, SoundType type, const char *fileName, bool tryExist) { +bool Sound::sampleLoad(SoundDesc *sndDesc, SoundType type, const char *fileName) { if (!sndDesc) return false; @@ -117,12 +117,15 @@ bool Sound::sampleLoad(SoundDesc *sndDesc, SoundType type, const char *fileName, int32 size; byte *data = _vm->_dataIO->getFile(fileName, size); - if (!data) { - warning("Can't open sample file \"%s\"", fileName); + + if (!data || !sndDesc->load(type, data, size)) { + delete data; + + warning("Sound::sampleLoad(): Failed to load sound \"%s\"", fileName); return false; } - return sndDesc->load(type, data, size); + return true; } void Sound::sampleFree(SoundDesc *sndDesc, bool noteAdLib, int index) { diff --git a/engines/gob/sound/sound.h b/engines/gob/sound/sound.h index 7beffb5dc7..bbc182d172 100644 --- a/engines/gob/sound/sound.h +++ b/engines/gob/sound/sound.h @@ -51,7 +51,7 @@ public: const SoundDesc *sampleGetBySlot(int slot) const; int sampleGetNextFreeSlot() const; - bool sampleLoad(SoundDesc *sndDesc, SoundType type, const char *fileName, bool tryExist = true); + bool sampleLoad(SoundDesc *sndDesc, SoundType type, const char *fileName); void sampleFree(SoundDesc *sndDesc, bool noteAdLib = false, int index = -1); -- cgit v1.2.3 From 25bc7467b444d78c64300af9786f08842de81313 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Jul 2012 22:25:51 +0200 Subject: GOB: Use Sound::sampleLoad in PreGob --- engines/gob/pregob/pregob.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/engines/gob/pregob/pregob.cpp b/engines/gob/pregob/pregob.cpp index 42b5a8fb9c..54eb3c6795 100644 --- a/engines/gob/pregob/pregob.cpp +++ b/engines/gob/pregob/pregob.cpp @@ -161,17 +161,7 @@ void PreGob::freeSounds() { } bool PreGob::loadSound(SoundDesc &sound, const Common::String &file) const { - int32 size; - byte *data = _vm->_dataIO->getFile(file, size); - - if (!data || !sound.load(SOUND_SND, data, size)) { - delete data; - - warning("PreGob::loadSound(): Failed to load sound \"%s\"", file.c_str()); - return false; - } - - return true; + return _vm->_sound->sampleLoad(&sound, SOUND_SND, file.c_str()); } void PreGob::playSound(uint sound, int16 frequency, int16 repCount) { -- cgit v1.2.3 From dd2768a2e47dd54f055cf65b2212ee9dca395c18 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 15 Jul 2012 17:06:56 +0200 Subject: GOB: Reorder a few things --- engines/gob/pregob/onceupon/onceupon.cpp | 8 ++--- engines/gob/pregob/onceupon/onceupon.h | 60 ++++++++++++++++---------------- engines/gob/pregob/onceupon/stork.h | 12 +++---- engines/gob/pregob/pregob.h | 13 +++---- 4 files changed, 47 insertions(+), 46 deletions(-) diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 6ee391ea7f..9d32eaa356 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -135,7 +135,7 @@ const OnceUpon::MenuButton OnceUpon::kLanguageButtons[] = { {true, 234, 138, 284, 173, 265, 55, 315, 90, 234, 138, 2} }; -const char *OnceUpon::kSound[kSoundMAX] = { +const char *OnceUpon::kSound[kSoundCount] = { "diamant.snd", // kSoundClick "cigogne.snd", // kSoundStork "saute.snd" // kSoundJump @@ -216,7 +216,7 @@ void OnceUpon::init() { // Load all our sounds and init the screen - loadSounds(kSound, kSoundMAX); + loadSounds(kSound, kSoundCount); initScreen(); // We start with an invalid palette @@ -226,7 +226,7 @@ void OnceUpon::init() { _quit = false; // We start with no selected difficulty and at section 0 - _difficulty = kDifficultyMAX; + _difficulty = kDifficultyCount; _section = 0; // Default name @@ -926,7 +926,7 @@ void OnceUpon::drawIngameMenu() { } void OnceUpon::drawMenuDifficulty() { - if (_difficulty == kDifficultyMAX) + if (_difficulty == kDifficultyCount) return; TXTFile *difficulties = loadTXT(getLocFile("diffic.tx"), TXTFile::kFormatStringPositionColor); diff --git a/engines/gob/pregob/onceupon/onceupon.h b/engines/gob/pregob/onceupon/onceupon.h index 41a2f5668d..66ef877618 100644 --- a/engines/gob/pregob/onceupon/onceupon.h +++ b/engines/gob/pregob/onceupon/onceupon.h @@ -129,7 +129,7 @@ private: kDifficultyBeginner = 0, kDifficultyIntermediate = 1, kDifficultyAdvanced = 2, - kDifficultyMAX + kDifficultyCount }; /** The different sounds common in the game. */ @@ -137,7 +137,7 @@ private: kSoundClick = 0, kSoundStork , kSoundJump , - kSoundMAX + kSoundCount }; /** Action the character generation wants us to take. */ @@ -181,7 +181,7 @@ private: static const MenuButton kCharGenNameEntry[]; /** All general game sounds we know about. */ - static const char *kSound[kSoundMAX]; + static const char *kSound[kSoundCount]; static const AnimProperties kClownAnimations[]; @@ -196,6 +196,33 @@ private: static const SectionFunc kSectionFuncs[kSectionCount]; + /** Did we open the game archives? */ + bool _openedArchives; + + // Fonts + Font *_jeudak; + Font *_lettre; + Font *_plettre; + Font *_glettre; + + /** The current palette. */ + int _palette; + + bool _quit; ///< Did the user request a normal game quit? + + Difficulty _difficulty; ///< The current difficulty. + int _section; ///< The current game section. + + Common::String _name; ///< The name of the child. + + uint8 _house; + + uint8 _head; + uint8 _colorHair; + uint8 _colorJacket; + uint8 _colorTrousers; + + // -- General helpers -- void setGamePalette(uint palette); ///< Set a game palette. @@ -308,33 +335,6 @@ private: void charGenDrawName(); static bool enterString(Common::String &name, int16 key, uint maxLength, const Font &font); - - - /** Did we open the game archives? */ - bool _openedArchives; - - // Fonts - Font *_jeudak; - Font *_lettre; - Font *_plettre; - Font *_glettre; - - /** The current palette. */ - int _palette; - - bool _quit; ///< Did the user request a normal game quit? - - Difficulty _difficulty; ///< The current difficulty. - int _section; ///< The current game section. - - Common::String _name; ///< The name of the child. - - uint8 _house; - - uint8 _head; - uint8 _colorHair; - uint8 _colorJacket; - uint8 _colorTrousers; }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/onceupon/stork.h b/engines/gob/pregob/onceupon/stork.h index d26a887c97..756f5258c7 100644 --- a/engines/gob/pregob/onceupon/stork.h +++ b/engines/gob/pregob/onceupon/stork.h @@ -79,12 +79,6 @@ private: }; - void setState(State state, uint16 anim); - void setState(State state, uint16 anim, int16 x); - - void dropBundle(State state, uint16 anim); - - GobEngine *_vm; Surface *_frame; @@ -94,6 +88,12 @@ private: bool _shouldDrop; BundleDrop _bundleDrop; + + + void setState(State state, uint16 anim); + void setState(State state, uint16 anim, int16 x); + + void dropBundle(State state, uint16 anim); }; } // End of namespace OnceUpon diff --git a/engines/gob/pregob/pregob.h b/engines/gob/pregob/pregob.h index da0de60dd8..632f85b88e 100644 --- a/engines/gob/pregob/pregob.h +++ b/engines/gob/pregob/pregob.h @@ -68,6 +68,9 @@ protected: static const char *kLanguageSuffixLong [5]; + GobEngine *_vm; + + // -- Graphics -- /** Initialize the game screen. */ @@ -174,18 +177,16 @@ protected: GCTFile *loadGCT(const Common::String &gctFile) const; - GobEngine *_vm; - private: - /** Load a sound file. */ - bool loadSound(SoundDesc &sound, const Common::String &file) const; - - /** Did we fade out? */ bool _fadedOut; /** All loaded sounds. */ Common::Array _sounds; + + + /** Load a sound file. */ + bool loadSound(SoundDesc &sound, const Common::String &file) const; }; } // End of namespace Gob -- cgit v1.2.3 From b001168658f57b845bae81df0ca85240c796e74e Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 15 Jul 2012 21:12:34 +0200 Subject: GOB: Implement the parents section in Once Upon A Time The text lines are not drawn completely correct yet, because apparently, GCTFile needs to wrap long lines. --- engines/gob/module.mk | 1 + engines/gob/pregob/onceupon/abracadabra.cpp | 8 +- engines/gob/pregob/onceupon/babayaga.cpp | 8 +- engines/gob/pregob/onceupon/onceupon.cpp | 13 +- engines/gob/pregob/onceupon/parents.cpp | 217 ++++++++++++++++++++++++++++ engines/gob/pregob/onceupon/parents.h | 94 ++++++++++++ 6 files changed, 332 insertions(+), 9 deletions(-) create mode 100644 engines/gob/pregob/onceupon/parents.cpp create mode 100644 engines/gob/pregob/onceupon/parents.h diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 489afe509e..d5ee6478be 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -86,6 +86,7 @@ MODULE_OBJS := \ pregob/onceupon/abracadabra.o \ pregob/onceupon/babayaga.o \ pregob/onceupon/title.o \ + pregob/onceupon/parents.o \ pregob/onceupon/stork.o \ pregob/onceupon/chargenchild.o \ minigames/geisha/evilfish.o \ diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp index 0d644d9056..2cf6855ef8 100644 --- a/engines/gob/pregob/onceupon/abracadabra.cpp +++ b/engines/gob/pregob/onceupon/abracadabra.cpp @@ -80,10 +80,10 @@ const char *Abracadabra::kAnimalNames[] = { // The houses where the stork can drop a bundle const OnceUpon::MenuButton Abracadabra::kStorkHouses[] = { - {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0}, - {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1}, - {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2}, - {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3} + {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0}, // Castle , Lord & Lady + {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1}, // Cottage, Farmers + {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2}, // Hut , Woodcutters + {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3} // Palace , King & Queen }; // The stork bundle drop parameters diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp index 6aa60310b5..ef56b9dd0b 100644 --- a/engines/gob/pregob/onceupon/babayaga.cpp +++ b/engines/gob/pregob/onceupon/babayaga.cpp @@ -80,10 +80,10 @@ const char *BabaYaga::kAnimalNames[] = { // The houses where the stork can drop a bundle const OnceUpon::MenuButton BabaYaga::kStorkHouses[] = { - {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0}, - {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1}, - {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2}, - {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3} + {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0}, // Castle , Lord & Lady + {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1}, // Cottage, Farmers + {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2}, // Hut , Woodcutters + {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3} // Palace , King & Queen }; // The stork bundle drop parameters diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp index 9d32eaa356..e4c2df34c0 100644 --- a/engines/gob/pregob/onceupon/onceupon.cpp +++ b/engines/gob/pregob/onceupon/onceupon.cpp @@ -38,6 +38,7 @@ #include "gob/pregob/onceupon/onceupon.h" #include "gob/pregob/onceupon/palettes.h" #include "gob/pregob/onceupon/title.h" +#include "gob/pregob/onceupon/parents.h" #include "gob/pregob/onceupon/chargenchild.h" static const uint kLanguageCount = 5; @@ -1747,7 +1748,17 @@ bool OnceUpon::sectionChapter1() { } bool OnceUpon::sectionParents() { - warning("OnceUpon::sectionParents(): TODO"); + fadeOut(); + setGamePalette(14); + clearScreen(); + + const Common::String seq = ((_house == 1) || (_house == 2)) ? "parents.seq" : "parents2.seq"; + const Common::String gct = getLocFile("mefait.gc"); + + Parents parents(_vm, seq, gct, _name, _house, *_plettre, kGamePalettes[14], kGamePalettes[13], kPaletteSize); + parents.play(); + + warning("OnceUpon::sectionParents(): TODO: Item search"); return true; } diff --git a/engines/gob/pregob/onceupon/parents.cpp b/engines/gob/pregob/onceupon/parents.cpp new file mode 100644 index 0000000000..cdaee6a38d --- /dev/null +++ b/engines/gob/pregob/onceupon/parents.cpp @@ -0,0 +1,217 @@ +/* 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 "gob/gob.h" +#include "gob/global.h" +#include "gob/dataio.h" +#include "gob/palanim.h" +#include "gob/draw.h" +#include "gob/video.h" + +#include "gob/sound/sound.h" + +#include "gob/pregob/gctfile.h" + +#include "gob/pregob/onceupon/palettes.h" +#include "gob/pregob/onceupon/parents.h" + +namespace Gob { + +namespace OnceUpon { + +const char *Parents::kSound[kSoundCount] = { + "rire.snd", // kSoundCackle + "tonn.snd" // kSoundThunder +}; + +// So that every GCT line is displayed for 12 seconds +const uint16 Parents::kLoop[kLoopCount][3] = { + { 72, 77, 33}, + {105, 109, 38}, + {141, 145, 38}, + {446, 454, 23}, + {456, 464, 23}, + {466, 474, 23}, + {476, 484, 23} +}; + + +Parents::Parents(GobEngine *vm, const Common::String &seq, const Common::String &gct, + const Common::String &childName, uint8 house, const Font &font, + const byte *normalPalette, const byte *brightPalette, uint paletteSize) : + SEQFile(vm, seq), + _gct(0), _house(house), _font(&font), + _paletteSize(paletteSize), _normalPalette(normalPalette), _brightPalette(brightPalette) { + + // Load sounds + for (int i = 0; i < kSoundCount; i++) + _vm->_sound->sampleLoad(&_sounds[i], SOUND_SND, kSound[i]); + + // Load GCT + Common::SeekableReadStream *gctStream = _vm->_dataIO->getFile(gct); + if (gctStream) { + _gct = new GCTFile(*gctStream, _vm->_rnd); + + delete gctStream; + } else + error("Parents::Parents(): Failed to open \"%s\"", gct.c_str()); + + _gct->setArea(17, 18, 303, 41); + _gct->setText(1, childName); + + _gct->selectLine(2, _house); + _gct->selectLine(4, _house); + + for (uint i = 0; i < kLoopCount; i++) + _loopID[i] = addLoop(kLoop[i][0], kLoop[i][1], kLoop[i][2]); +} + +Parents::~Parents() { + delete _gct; +} + +void Parents::play() { + _currentLoop = 0; + + SEQFile::play(true, 496, 15); + + // After playback, fade out + if (!_vm->shouldQuit()) + _vm->_palAnim->fade(0, 0, 0); +} + +void Parents::handleFrameEvent() { + switch (getFrame()) { + case 0: + // On fame 0, fade in + _vm->_draw->forceBlit(); + _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, 0, 0); + break; + + case 4: + drawGCT(0); + break; + + case 55: + drawGCT(3, 0); + break; + + case 79: + drawGCT(_house + 5, 1); + break; + + case 110: + drawGCT(_house + 9, 2); + break; + + case 146: + drawGCT(17); + break; + + case 198: + drawGCT(13); + break; + + case 445: + drawGCT(14, 3); + break; + + case 455: + drawGCT(18, 4); + break; + + case 465: + drawGCT(19, 5); + break; + + case 475: + drawGCT(20, 6); + break; + + case 188: + case 228: + case 237: + case 257: + case 275: + case 426: + lightningEffect(); + break; + + case 203: + case 243: + case 252: + case 272: + case 290: + case 441: + playSound(kSoundThunder); + break; + + case 340: + playSound(kSoundCackle); + break; + } +} + +void Parents::handleInput(int16 key, int16 mouseX, int16 mouseY, MouseButtons mouseButtons) { + if ((key == kKeyEscape) || (mouseButtons == kMouseButtonsRight)) + abortPlay(); + + if (((key == kKeySpace) || (mouseButtons == kMouseButtonsLeft)) && (_currentLoop < kLoopCount)) + skipLoop(_loopID[_currentLoop]); +} + +void Parents::playSound(Sound sound) { + _vm->_sound->blasterStop(0); + _vm->_sound->blasterPlay(&_sounds[sound], 0, 0); +} + +void Parents::lightningEffect() { + for (int i = 0; (i < 5) && !_vm->shouldQuit(); i++) { + + setPalette(_brightPalette, _paletteSize); + _vm->_util->delay(5); + + setPalette(_normalPalette, _paletteSize); + _vm->_util->delay(5); + } +} + +void Parents::setPalette(const byte *palette, uint size) { + memcpy(_vm->_draw->_vgaPalette, palette, 3 * size); + + _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc); + _vm->_video->retrace(); +} + +void Parents::drawGCT(uint item, uint loop) { + int16 left, top, right, bottom; + if (_gct->clear(*_vm->_draw->_backSurface, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + if (_gct->draw(*_vm->_draw->_backSurface, item, *_font, 10, left, top, right, bottom)) + _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom); + + _currentLoop = loop; +} + +} // End of namespace OnceUpon + +} // End of namespace Gob diff --git a/engines/gob/pregob/onceupon/parents.h b/engines/gob/pregob/onceupon/parents.h new file mode 100644 index 0000000000..f5c8307b73 --- /dev/null +++ b/engines/gob/pregob/onceupon/parents.h @@ -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. + * + */ + +#ifndef GOB_PREGOB_ONCEUPON_PARENTS_H +#define GOB_PREGOB_ONCEUPON_PARENTS_H + +#include "gob/sound/sounddesc.h" + +#include "gob/pregob/seqfile.h" + +namespace Gob { + +class Font; + +class GCTFile; + +namespace OnceUpon { + +/** The home / parents animation sequence. */ +class Parents : public SEQFile { +public: + Parents(GobEngine *vm, const Common::String &seq, const Common::String &gct, + const Common::String &childName, uint8 house, const Font &font, + const byte *normalPalette, const byte *brightPalette, uint paletteSize); + ~Parents(); + + void play(); + +protected: + void handleFrameEvent(); + void handleInput(int16 key, int16 mouseX, int16 mouseY, MouseButtons mouseButtons); + +private: + static const uint kLoopCount = 7; + + static const uint16 kLoop[kLoopCount][3]; + + enum Sound { + kSoundCackle = 0, + kSoundThunder , + kSoundCount + }; + + static const char *kSound[kSoundCount]; + + + uint8 _house; + + const Font *_font; + + uint _paletteSize; + const byte *_normalPalette; + const byte *_brightPalette; + + SoundDesc _sounds[kSoundCount]; + + GCTFile *_gct; + + uint _loopID[kLoopCount]; + uint _currentLoop; + + + void lightningEffect(); + + void playSound(Sound sound); + void setPalette(const byte *palette, uint size); + + void drawGCT(uint item, uint loop = 0xFFFF); +}; + +} // End of namespace OnceUpon + +} // End of namespace Gob + +#endif // GOB_PREGOB_ONCEUPON_PARENTS_H -- cgit v1.2.3 From c8df89e6b2ad04aac03be89c1ac214dbd144c982 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 29 Jul 2012 19:44:22 -0400 Subject: LASTEXPRESS: Reorganize savegame code to prepare for compressed savegames support --- engines/lastexpress/game/savegame.cpp | 80 ++++++++++++++++++++++++++--------- engines/lastexpress/game/savegame.h | 75 ++++++++++++++++++++------------ 2 files changed, 109 insertions(+), 46 deletions(-) diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp index a8fb5c55f7..2b4f7db5a5 100644 --- a/engines/lastexpress/game/savegame.cpp +++ b/engines/lastexpress/game/savegame.cpp @@ -52,6 +52,32 @@ static const struct { {"lastexpress-gold.egg"} }; +////////////////////////////////////////////////////////////////////////// +// SavegameStream +////////////////////////////////////////////////////////////////////////// + +uint32 SavegameStream::read(void *dataPtr, uint32 dataSize) { + if ((int32)dataSize > size() - pos()) { + dataSize = size() - pos(); + _eos = true; + } + memcpy(dataPtr, getData() + pos(), dataSize); + + seek(dataSize, SEEK_CUR); + + return dataSize; +} + +uint32 SavegameStream::writeValue(const void *dataPtr, uint32 dataSize) { + // FIXME: Implement compression + return write(dataPtr, dataSize); +} + +uint32 SavegameStream::readValue(void *dataPtr, uint32 dataSize) { + // FIXME: Implement compression + return read(dataPtr, dataSize); +} + ////////////////////////////////////////////////////////////////////////// // Constructors ////////////////////////////////////////////////////////////////////////// @@ -340,16 +366,28 @@ bool SaveLoad::loadMainHeader(Common::InSaveFile *stream, SavegameMainHeader *he ////////////////////////////////////////////////////////////////////////// // Entries ////////////////////////////////////////////////////////////////////////// -void SaveLoad::writeEntry(SavegameType type, EntityIndex entity, uint32 value) { -#define WRITE_ENTRY(name, func, val) { \ - uint32 _prevPosition = (uint32)_savegame->pos(); \ - func; \ - uint32 _count = (uint32)_savegame->pos() - _prevPosition; \ - debugC(kLastExpressDebugSavegame, "Savegame: Writing " #name ": %d bytes", _count); \ - if (_count != val)\ - error("[SaveLoad::writeEntry] Number of bytes written (%d) differ from expected count (%d)", _count, val); \ +uint32 SaveLoad::writeValue(const char *name, Common::Functor1 *function, uint size) { + debugC(kLastExpressDebugSavegame, "Savegame: Writing %s: %u bytes", name, size); + + // Create buffer to hold the data + byte *buffer = (byte *)malloc(size); + if (!buffer) + error("[SaveLoad::writeValue] Cannot allocate buffer to hold data"); + + // Serialize data into our buffer + Common::MemoryWriteStream *stream = new Common::MemoryWriteStream(buffer, size); + Common::Serializer ser(NULL, stream); + (*function)(ser); + delete stream; + + return _savegame->writeValue(buffer, size); } +void SaveLoad::syncEntity(Common::Serializer &ser) { + ser.syncAsUint32LE(_entity); +} + +void SaveLoad::writeEntry(SavegameType type, EntityIndex entity, uint32 value) { if (!_savegame) error("[SaveLoad::writeEntry] Savegame stream is invalid"); @@ -368,18 +406,20 @@ void SaveLoad::writeEntry(SavegameType type, EntityIndex entity, uint32 value) { header.saveLoadWithSerializer(ser); // Write game data - WRITE_ENTRY("entity index", ser.syncAsUint32LE(entity), 4); - WRITE_ENTRY("state", getState()->saveLoadWithSerializer(ser), 4 + 4 + 4 + 4 + 1 + 4 + 4); - WRITE_ENTRY("selected item", getInventory()->saveSelectedItem(ser), 4); - WRITE_ENTRY("positions", getEntities()->savePositions(ser), 4 * 1000); - WRITE_ENTRY("compartments", getEntities()->saveCompartments(ser), 4 * 16 * 2); - WRITE_ENTRY("progress", getProgress().saveLoadWithSerializer(ser), 4 * 128); - WRITE_ENTRY("events", getState()->syncEvents(ser), 512); - WRITE_ENTRY("inventory", getInventory()->saveLoadWithSerializer(ser), 7 * 32); - WRITE_ENTRY("objects", getObjects()->saveLoadWithSerializer(ser), 5 * 128); - WRITE_ENTRY("entities", getEntities()->saveLoadWithSerializer(ser), 1262 * 40); - WRITE_ENTRY("sound", getSoundQueue()->saveLoadWithSerializer(ser), 3 * 4 + getSoundQueue()->count() * 64); - WRITE_ENTRY("savepoints", getSavePoints()->saveLoadWithSerializer(ser), 128 * 16 + 4 + getSavePoints()->count() * 16); + _entity = entity; + + writeValue("entity index", WRAP_SYNC_FUNCTION(this, SaveLoad, syncEntity), 4); + writeValue("state", WRAP_SYNC_FUNCTION(getState(), State::GameState, saveLoadWithSerializer), 4 + 4 + 4 + 4 + 1 + 4 + 4); + writeValue("selected item", WRAP_SYNC_FUNCTION(getInventory(), Inventory, saveSelectedItem), 4); + writeValue("positions", WRAP_SYNC_FUNCTION(getEntities(), Entities, savePositions), 4 * 1000); + writeValue("compartments", WRAP_SYNC_FUNCTION(getEntities(), Entities, saveCompartments), 4 * 16 * 2); + writeValue("progress", WRAP_SYNC_FUNCTION(&getProgress(), State::GameProgress, saveLoadWithSerializer), 4 * 128); + writeValue("events", WRAP_SYNC_FUNCTION(getState(), State::GameState, syncEvents), 512); + writeValue("inventory", WRAP_SYNC_FUNCTION(getInventory(), Inventory, saveLoadWithSerializer), 7 * 32); + writeValue("objects", WRAP_SYNC_FUNCTION(getObjects(), Objects, saveLoadWithSerializer), 5 * 128); + writeValue("entities", WRAP_SYNC_FUNCTION(getEntities(), Entities, saveLoadWithSerializer), 1262 * 40); + writeValue("sound", WRAP_SYNC_FUNCTION(getSoundQueue(), SoundQueue, saveLoadWithSerializer), 3 * 4 + getSoundQueue()->count() * 64); + writeValue("savepoints", WRAP_SYNC_FUNCTION(getSavePoints(), SavePoints, saveLoadWithSerializer), 128 * 16 + 4 + getSavePoints()->count() * 16); header.offset = (uint32)_savegame->pos() - (originalPosition + 32); diff --git a/engines/lastexpress/game/savegame.h b/engines/lastexpress/game/savegame.h index 6f0408487f..a04c700fb6 100644 --- a/engines/lastexpress/game/savegame.h +++ b/engines/lastexpress/game/savegame.h @@ -80,11 +80,51 @@ namespace LastExpress { // Savegame signatures -#define SAVEGAME_SIGNATURE 0x12001200 -#define SAVEGAME_ENTRY_SIGNATURE 0xE660E660 +#define SAVEGAME_SIGNATURE 0x12001200 // 301994496 +#define SAVEGAME_ENTRY_SIGNATURE 0xE660E660 // 3865110112 + +#define WRAP_SYNC_FUNCTION(instance, className, method) \ + new Common::Functor1Mem(instance, &className::method) class LastExpressEngine; +class SavegameStream : public Common::MemoryWriteStreamDynamic, public Common::SeekableReadStream { +public: + SavegameStream() : MemoryWriteStreamDynamic(DisposeAfterUse::YES), _eos(false) { + _bufferOffset = -1; + _valueCount = 0; + _previousValue = 0; + _field_15F = 0; + _offset = 0; + _status = 0; + + memset(_buffer, 0, 256); + } + + int32 pos() const { return MemoryWriteStreamDynamic::pos(); } + int32 size() const { return MemoryWriteStreamDynamic::size(); } + bool seek(int32 offset, int whence = SEEK_SET) { return MemoryWriteStreamDynamic::seek(offset, whence); } + bool eos() const { return _eos; } + uint32 read(void *dataPtr, uint32 dataSize); + + // Compressed data + uint32 writeValue(const void *dataPtr, uint32 dataSize); + uint32 readValue(void *dataPtr, uint32 dataSize); + +private: + bool _eos; + + // Compression handling + int _bufferOffset; + int _valueCount; + byte _previousValue; + byte _field_15F; + int _offset; + int _status; + + byte _buffer[256]; +}; + class SaveLoad { public: SaveLoad(LastExpressEngine *engine); @@ -116,30 +156,6 @@ public: uint32 getLastSavegameTicks() const { return _gameTicksLastSavegame; } private: - class SavegameStream : public Common::MemoryWriteStreamDynamic, public Common::SeekableReadStream { - public: - SavegameStream() : MemoryWriteStreamDynamic(DisposeAfterUse::YES), - _eos(false) {} - - int32 pos() const { return MemoryWriteStreamDynamic::pos(); } - int32 size() const { return MemoryWriteStreamDynamic::size(); } - bool seek(int32 offset, int whence = SEEK_SET) { return MemoryWriteStreamDynamic::seek(offset, whence); } - bool eos() const { return _eos; } - uint32 read(void *dataPtr, uint32 dataSize) { - if ((int32)dataSize > size() - pos()) { - dataSize = size() - pos(); - _eos = true; - } - memcpy(dataPtr, getData() + pos(), dataSize); - - seek(dataSize, SEEK_CUR); - - return dataSize; - } - private: - bool _eos; - }; - LastExpressEngine *_engine; struct SavegameMainHeader : Common::Serializable { @@ -268,6 +284,9 @@ private: void writeEntry(SavegameType type, EntityIndex entity, uint32 val); void readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, bool keepIndex); + uint32 writeValue(const char *name, Common::Functor1 *function, uint size); + uint32 readValue(const char *name, Common::Functor1 *function, uint size); + SavegameEntryHeader *getEntry(uint32 index); // Opening save files @@ -279,6 +298,10 @@ private: void initStream(); void loadStream(GameId id); void flushStream(GameId id); + + // Misc + EntityIndex _entity; + void syncEntity(Common::Serializer &ser); }; } // End of namespace LastExpress -- cgit v1.2.3 From 65565c891493ed6a54a347df8041a011512d5cb8 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 29 Jul 2012 21:05:12 -0400 Subject: LASTEXPRESS: Replace REDRAW_CURSOR macro by function --- engines/lastexpress/game/logic.cpp | 28 ++++++++++++++++------------ engines/lastexpress/game/logic.h | 1 + 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp index 135b7d3480..a8619512cb 100644 --- a/engines/lastexpress/game/logic.cpp +++ b/engines/lastexpress/game/logic.cpp @@ -86,16 +86,6 @@ Logic::~Logic() { ////////////////////////////////////////////////////////////////////////// // Event Handling ////////////////////////////////////////////////////////////////////////// -#define REDRAW_CURSOR() { \ - if (getInventory()->isMagnifierInUse()) \ - _engine->getCursor()->setStyle(kCursorMagnifier); \ - if (getInventory()->isPortraitHighlighted() \ - || getInventory()->isOpened() \ - || getInventory()->isEggHighlighted()) \ - _engine->getCursor()->setStyle(kCursorNormal); \ - return; \ -} - void Logic::eventMouse(const Common::Event &ev) { bool hotspotHandled = false; @@ -166,7 +156,9 @@ void Logic::eventMouse(const Common::Event &ev) { getInventory()->unselectItem(); } - REDRAW_CURSOR() + redrawCursor(); + + return; } // Handle match case @@ -192,7 +184,9 @@ void Logic::eventMouse(const Common::Event &ev) { getScenes()->processScene(); } - REDRAW_CURSOR() + redrawCursor(); + + return; } // Handle entity item case @@ -596,4 +590,14 @@ void Logic::updateCursor(bool) const { /* the cursor is always updated, even whe _engine->getCursor()->setStyle(style); } +void Logic::redrawCursor() const { + if (getInventory()->isMagnifierInUse()) + _engine->getCursor()->setStyle(kCursorMagnifier); + + if (getInventory()->isPortraitHighlighted() + || getInventory()->isOpened() + || getInventory()->isEggHighlighted()) + _engine->getCursor()->setStyle(kCursorNormal); +} + } // End of namespace LastExpress diff --git a/engines/lastexpress/game/logic.h b/engines/lastexpress/game/logic.h index 84b64a998b..efb8f1e1a3 100644 --- a/engines/lastexpress/game/logic.h +++ b/engines/lastexpress/game/logic.h @@ -73,6 +73,7 @@ private: void switchChapter() const; void showCredits() const; + void redrawCursor() const; // Flags & Members bool _flagActionPerformed; -- cgit v1.2.3 From 5df2bd896247a59d6166c5f69b93355b66b5f920 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 29 Jul 2012 21:06:01 -0400 Subject: LASTEXPRESS: Fix regression with Logic::resetState() --- engines/lastexpress/game/logic.cpp | 4 ++-- engines/lastexpress/game/state.cpp | 12 ++++++++++++ engines/lastexpress/game/state.h | 2 ++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/engines/lastexpress/game/logic.cpp b/engines/lastexpress/game/logic.cpp index a8619512cb..1696f100ff 100644 --- a/engines/lastexpress/game/logic.cpp +++ b/engines/lastexpress/game/logic.cpp @@ -406,9 +406,9 @@ void Logic::resetState() { getScenes()->setCoordinates(Common::Rect(80, 0, 559, 479)); SAFE_DELETE(_entities); - SAFE_DELETE(_state); _entities = new Entities(_engine); - _state = new State(_engine); + + _state->reset(); } /** diff --git a/engines/lastexpress/game/state.cpp b/engines/lastexpress/game/state.cpp index f3fd9720b1..02ede25595 100644 --- a/engines/lastexpress/game/state.cpp +++ b/engines/lastexpress/game/state.cpp @@ -49,6 +49,18 @@ State::~State() { _engine = NULL; } +void State::reset() { + SAFE_DELETE(_inventory); + SAFE_DELETE(_objects); + SAFE_DELETE(_savepoints); + SAFE_DELETE(_state); + + _inventory = new Inventory(_engine); + _objects = new Objects(_engine); + _savepoints = new SavePoints(_engine); + _state = new GameState(); +} + bool State::isNightTime() const { return (_state->progress.chapter == kChapter1 || _state->progress.chapter == kChapter4 diff --git a/engines/lastexpress/game/state.h b/engines/lastexpress/game/state.h index c937fdce9f..2c484f6976 100644 --- a/engines/lastexpress/game/state.h +++ b/engines/lastexpress/game/state.h @@ -621,6 +621,8 @@ public: State(LastExpressEngine *engine); ~State(); + void reset(); + // Accessors Inventory *getGameInventory() { return _inventory; } Objects *getGameObjects() { return _objects; } -- cgit v1.2.3 From 4728505db288b8aa55453ada19fadde76d61ddb8 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Mon, 30 Jul 2012 16:44:32 -0400 Subject: LASTEXPRESS: Switch savegame reading to use new read method - Disable savegame compression --- engines/lastexpress/game/savegame.cpp | 141 ++++++++++++++++++++-------------- engines/lastexpress/game/savegame.h | 14 +++- 2 files changed, 95 insertions(+), 60 deletions(-) diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp index 2b4f7db5a5..8eda463f81 100644 --- a/engines/lastexpress/game/savegame.cpp +++ b/engines/lastexpress/game/savegame.cpp @@ -40,6 +40,8 @@ namespace LastExpress { +#define DISABLE_COMPRESSION 1 + // Names of savegames static const struct { const char *saveFile; @@ -56,7 +58,21 @@ static const struct { // SavegameStream ////////////////////////////////////////////////////////////////////////// +uint32 SavegameStream::write(const void *dataPtr, uint32 dataSize) { +#if !DISABLE_COMPRESSION + if (_enableCompression) + return writeCompressed(dataPtr, dataSize); +#endif + + return Common::MemoryWriteStreamDynamic::write(dataPtr, dataSize); +} + uint32 SavegameStream::read(void *dataPtr, uint32 dataSize) { +#if !DISABLE_COMPRESSION + if (_enableCompression) + return readCompressed(dataPtr, dataSize); +#endif + if ((int32)dataSize > size() - pos()) { dataSize = size() - pos(); _eos = true; @@ -68,14 +84,19 @@ uint32 SavegameStream::read(void *dataPtr, uint32 dataSize) { return dataSize; } -uint32 SavegameStream::writeValue(const void *dataPtr, uint32 dataSize) { - // FIXME: Implement compression - return write(dataPtr, dataSize); +void SavegameStream::process() { + _enableCompression = !_enableCompression; + + // TODO Flush compression buffer + +} + +uint32 SavegameStream::writeCompressed(const void *dataPtr, uint32 dataSize) { + error("[SavegameStream::writeCompressed] Compression not implemented!"); } -uint32 SavegameStream::readValue(void *dataPtr, uint32 dataSize) { - // FIXME: Implement compression - return read(dataPtr, dataSize); +uint32 SavegameStream::readCompressed(void *dataPtr, uint32 dataSize) { + error("[SavegameStream::readCompressed] Compression not implemented!"); } ////////////////////////////////////////////////////////////////////////// @@ -106,6 +127,7 @@ void SaveLoad::flushStream(GameId id) { error("[SaveLoad::flushStream] Savegame stream is invalid"); save->write(_savegame->getData(), (uint32)_savegame->size()); + save->finalize(); delete save; } @@ -366,21 +388,39 @@ bool SaveLoad::loadMainHeader(Common::InSaveFile *stream, SavegameMainHeader *he ////////////////////////////////////////////////////////////////////////// // Entries ////////////////////////////////////////////////////////////////////////// -uint32 SaveLoad::writeValue(const char *name, Common::Functor1 *function, uint size) { +uint32 SaveLoad::writeValue(Common::Serializer &ser, const char *name, Common::Functor1 *function, uint size) { debugC(kLastExpressDebugSavegame, "Savegame: Writing %s: %u bytes", name, size); - // Create buffer to hold the data - byte *buffer = (byte *)malloc(size); - if (!buffer) - error("[SaveLoad::writeValue] Cannot allocate buffer to hold data"); + uint32 prevPosition = (uint32)_savegame->pos(); // Serialize data into our buffer - Common::MemoryWriteStream *stream = new Common::MemoryWriteStream(buffer, size); - Common::Serializer ser(NULL, stream); (*function)(ser); - delete stream; - return _savegame->writeValue(buffer, size); + uint32 count = (uint32)_savegame->pos() - prevPosition; + +#if DISABLE_COMPRESSION + if (count != size) + error("[SaveLoad::writeValue] %s - Number of bytes written (%d) differ from expected count (%d)", name, count, size); +#endif + + return count; +} + +uint32 SaveLoad::readValue(Common::Serializer &ser, const char *name, Common::Functor1 *function, uint size) { + debugC(kLastExpressDebugSavegame, "Savegame: Reading %s: %u bytes", name, size); + + uint32 prevPosition = (uint32)_savegame->pos(); + + (*function)(ser); + + uint32 count = (uint32)_savegame->pos() - prevPosition; + +#if DISABLE_COMPRESSION + if (size != 0 && count != size) + error("[SaveLoad::readValue] %s - Number of bytes read (%d) differ from expected count (%d)", name, count, size); +#endif + + return count; } void SaveLoad::syncEntity(Common::Serializer &ser) { @@ -408,18 +448,20 @@ void SaveLoad::writeEntry(SavegameType type, EntityIndex entity, uint32 value) { // Write game data _entity = entity; - writeValue("entity index", WRAP_SYNC_FUNCTION(this, SaveLoad, syncEntity), 4); - writeValue("state", WRAP_SYNC_FUNCTION(getState(), State::GameState, saveLoadWithSerializer), 4 + 4 + 4 + 4 + 1 + 4 + 4); - writeValue("selected item", WRAP_SYNC_FUNCTION(getInventory(), Inventory, saveSelectedItem), 4); - writeValue("positions", WRAP_SYNC_FUNCTION(getEntities(), Entities, savePositions), 4 * 1000); - writeValue("compartments", WRAP_SYNC_FUNCTION(getEntities(), Entities, saveCompartments), 4 * 16 * 2); - writeValue("progress", WRAP_SYNC_FUNCTION(&getProgress(), State::GameProgress, saveLoadWithSerializer), 4 * 128); - writeValue("events", WRAP_SYNC_FUNCTION(getState(), State::GameState, syncEvents), 512); - writeValue("inventory", WRAP_SYNC_FUNCTION(getInventory(), Inventory, saveLoadWithSerializer), 7 * 32); - writeValue("objects", WRAP_SYNC_FUNCTION(getObjects(), Objects, saveLoadWithSerializer), 5 * 128); - writeValue("entities", WRAP_SYNC_FUNCTION(getEntities(), Entities, saveLoadWithSerializer), 1262 * 40); - writeValue("sound", WRAP_SYNC_FUNCTION(getSoundQueue(), SoundQueue, saveLoadWithSerializer), 3 * 4 + getSoundQueue()->count() * 64); - writeValue("savepoints", WRAP_SYNC_FUNCTION(getSavePoints(), SavePoints, saveLoadWithSerializer), 128 * 16 + 4 + getSavePoints()->count() * 16); + _savegame->process(); + writeValue(ser, "entity index", WRAP_SYNC_FUNCTION(this, SaveLoad, syncEntity), 4); + writeValue(ser, "state", WRAP_SYNC_FUNCTION(getState(), State::GameState, saveLoadWithSerializer), 4 + 4 + 4 + 4 + 1 + 4 + 4); + writeValue(ser, "selected item", WRAP_SYNC_FUNCTION(getInventory(), Inventory, saveSelectedItem), 4); + writeValue(ser, "positions", WRAP_SYNC_FUNCTION(getEntities(), Entities, savePositions), 4 * 1000); + writeValue(ser, "compartments", WRAP_SYNC_FUNCTION(getEntities(), Entities, saveCompartments), 4 * 16 * 2); + writeValue(ser, "progress", WRAP_SYNC_FUNCTION(&getProgress(), State::GameProgress, saveLoadWithSerializer), 4 * 128); + writeValue(ser, "events", WRAP_SYNC_FUNCTION(getState(), State::GameState, syncEvents), 512); + writeValue(ser, "inventory", WRAP_SYNC_FUNCTION(getInventory(), Inventory, saveLoadWithSerializer), 7 * 32); + writeValue(ser, "objects", WRAP_SYNC_FUNCTION(getObjects(), Objects, saveLoadWithSerializer), 5 * 128); + writeValue(ser, "entities", WRAP_SYNC_FUNCTION(getEntities(), Entities, saveLoadWithSerializer), 1262 * 40); + writeValue(ser, "sound", WRAP_SYNC_FUNCTION(getSoundQueue(), SoundQueue, saveLoadWithSerializer), 3 * 4 + getSoundQueue()->count() * 64); + writeValue(ser, "savepoints", WRAP_SYNC_FUNCTION(getSavePoints(), SavePoints, saveLoadWithSerializer), 128 * 16 + 4 + getSavePoints()->count() * 16); + _savegame->process(); header.offset = (uint32)_savegame->pos() - (originalPosition + 32); @@ -445,22 +487,6 @@ void SaveLoad::writeEntry(SavegameType type, EntityIndex entity, uint32 value) { } void SaveLoad::readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, bool keepIndex) { -#define LOAD_ENTRY(name, func, val) { \ - uint32 _prevPosition = (uint32)_savegame->pos(); \ - func; \ - uint32 _count = (uint32)_savegame->pos() - _prevPosition; \ - debugC(kLastExpressDebugSavegame, "Savegame: Reading " #name ": %d bytes", _count); \ - if (_count != val) \ - error("[SaveLoad::readEntry] Number of bytes read (%d) differ from expected count (%d)", _count, val); \ -} - -#define LOAD_ENTRY_ONLY(name, func) { \ - uint32 _prevPosition = (uint32)_savegame->pos(); \ - func; \ - uint32 _count = (uint32)_savegame->pos() - _prevPosition; \ - debugC(kLastExpressDebugSavegame, "Savegame: Reading " #name ": %d bytes", _count); \ -} - if (!type || !entity || !val) error("[SaveLoad::readEntry] Invalid parameters passed"); @@ -483,20 +509,23 @@ void SaveLoad::readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, b uint32 originalPosition = (uint32)_savegame->pos(); // Load game data - LOAD_ENTRY("entity index", ser.syncAsUint32LE(*entity), 4); - LOAD_ENTRY("state", getState()->saveLoadWithSerializer(ser), 4 + 4 + 4 + 4 + 1 + 4 + 4); - LOAD_ENTRY("selected item", getInventory()->saveSelectedItem(ser), 4); - LOAD_ENTRY("positions", getEntities()->savePositions(ser), 4 * 1000); - LOAD_ENTRY("compartments", getEntities()->saveCompartments(ser), 4 * 16 * 2); - LOAD_ENTRY("progress", getProgress().saveLoadWithSerializer(ser), 4 * 128); - LOAD_ENTRY("events", getState()->syncEvents(ser), 512); - LOAD_ENTRY("inventory", getInventory()->saveLoadWithSerializer(ser), 7 * 32); - LOAD_ENTRY("objects", getObjects()->saveLoadWithSerializer(ser), 5 * 128); - LOAD_ENTRY("entities", getEntities()->saveLoadWithSerializer(ser), 1262 * 40); - LOAD_ENTRY_ONLY("sound", getSoundQueue()->saveLoadWithSerializer(ser)); - LOAD_ENTRY_ONLY("savepoints", getSavePoints()->saveLoadWithSerializer(ser)); + _savegame->process(); + readValue(ser, "entity index", WRAP_SYNC_FUNCTION(this, SaveLoad, syncEntity), 4); + readValue(ser, "state", WRAP_SYNC_FUNCTION(getState(), State::GameState, saveLoadWithSerializer), 4 + 4 + 4 + 4 + 1 + 4 + 4); + readValue(ser, "selected item", WRAP_SYNC_FUNCTION(getInventory(), Inventory, saveSelectedItem), 4); + readValue(ser, "positions", WRAP_SYNC_FUNCTION(getEntities(), Entities, savePositions), 4 * 1000); + readValue(ser, "compartments", WRAP_SYNC_FUNCTION(getEntities(), Entities, saveCompartments), 4 * 16 * 2); + readValue(ser, "progress", WRAP_SYNC_FUNCTION(&getProgress(), State::GameProgress, saveLoadWithSerializer), 4 * 128); + readValue(ser, "events", WRAP_SYNC_FUNCTION(getState(), State::GameState, syncEvents), 512); + readValue(ser, "inventory", WRAP_SYNC_FUNCTION(getInventory(), Inventory, saveLoadWithSerializer), 7 * 32); + readValue(ser, "objects", WRAP_SYNC_FUNCTION(getObjects(), Objects, saveLoadWithSerializer), 5 * 128); + readValue(ser, "entities", WRAP_SYNC_FUNCTION(getEntities(), Entities, saveLoadWithSerializer), 1262 * 40); + readValue(ser, "sound", WRAP_SYNC_FUNCTION(getSoundQueue(), SoundQueue, saveLoadWithSerializer)); + readValue(ser, "savepoints", WRAP_SYNC_FUNCTION(getSavePoints(), SavePoints, saveLoadWithSerializer)); + _savegame->process(); // Update chapter + *entity = _entity; getProgress().chapter = entry.chapter; // Skip padding @@ -606,7 +635,7 @@ Common::InSaveFile *SaveLoad::openForLoading(GameId id) { } Common::OutSaveFile *SaveLoad::openForSaving(GameId id) { - Common::OutSaveFile *save = g_system->getSavefileManager()->openForSaving(getFilename(id)); + Common::OutSaveFile *save = g_system->getSavefileManager()->openForSaving(getFilename(id), false); // TODO Enable compression again if (!save) debugC(2, kLastExpressDebugSavegame, "Cannot open savegame for writing: %s", getFilename(id).c_str()); diff --git a/engines/lastexpress/game/savegame.h b/engines/lastexpress/game/savegame.h index a04c700fb6..dc16a16728 100644 --- a/engines/lastexpress/game/savegame.h +++ b/engines/lastexpress/game/savegame.h @@ -91,6 +91,7 @@ class LastExpressEngine; class SavegameStream : public Common::MemoryWriteStreamDynamic, public Common::SeekableReadStream { public: SavegameStream() : MemoryWriteStreamDynamic(DisposeAfterUse::YES), _eos(false) { + _enableCompression = false; _bufferOffset = -1; _valueCount = 0; _previousValue = 0; @@ -106,15 +107,20 @@ public: bool seek(int32 offset, int whence = SEEK_SET) { return MemoryWriteStreamDynamic::seek(offset, whence); } bool eos() const { return _eos; } uint32 read(void *dataPtr, uint32 dataSize); + uint32 write(const void *dataPtr, uint32 dataSize); + void process(); + +private: // Compressed data - uint32 writeValue(const void *dataPtr, uint32 dataSize); - uint32 readValue(void *dataPtr, uint32 dataSize); + uint32 writeCompressed(const void *dataPtr, uint32 dataSize); + uint32 readCompressed(void *dataPtr, uint32 dataSize); private: bool _eos; // Compression handling + bool _enableCompression; int _bufferOffset; int _valueCount; byte _previousValue; @@ -284,8 +290,8 @@ private: void writeEntry(SavegameType type, EntityIndex entity, uint32 val); void readEntry(SavegameType *type, EntityIndex *entity, uint32 *val, bool keepIndex); - uint32 writeValue(const char *name, Common::Functor1 *function, uint size); - uint32 readValue(const char *name, Common::Functor1 *function, uint size); + uint32 writeValue(Common::Serializer &ser, const char *name, Common::Functor1 *function, uint size); + uint32 readValue(Common::Serializer &ser, const char *name, Common::Functor1 *function, uint size = 0); SavegameEntryHeader *getEntry(uint32 index); -- cgit v1.2.3 From acd4cf82e23493e357261eea564a5eaafb6e2647 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Tue, 31 Jul 2012 00:58:37 -0400 Subject: LASTEXPRESS: Implement savegame write compression --- engines/lastexpress/game/savegame.cpp | 174 +++++++++++++++++++++++++++++++++- engines/lastexpress/game/savegame.h | 30 ++++-- 2 files changed, 191 insertions(+), 13 deletions(-) diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp index 8eda463f81..54ba45e25e 100644 --- a/engines/lastexpress/game/savegame.cpp +++ b/engines/lastexpress/game/savegame.cpp @@ -73,6 +73,10 @@ uint32 SavegameStream::read(void *dataPtr, uint32 dataSize) { return readCompressed(dataPtr, dataSize); #endif + return readUncompressed(dataPtr, dataSize); +} + +uint32 SavegameStream::readUncompressed(void *dataPtr, uint32 dataSize) { if ((int32)dataSize > size() - pos()) { dataSize = size() - pos(); _eos = true; @@ -84,18 +88,182 @@ uint32 SavegameStream::read(void *dataPtr, uint32 dataSize) { return dataSize; } -void SavegameStream::process() { +void SavegameStream::writeBuffer(uint8 value, bool onlyValue) { + if (_bufferOffset == -1) + _bufferOffset = 0; + + if (_bufferOffset == 256) { + _bufferOffset = 0; + Common::MemoryWriteStreamDynamic::write(_buffer, 256); + } + + if (onlyValue || value < 0xFB) + _buffer[_bufferOffset] = value; + else + _buffer[_bufferOffset] = 0xFE; + + _offset++; + _bufferOffset++; + + if (!onlyValue && value >= 0xFB) + { + if (_bufferOffset == 256) { + _bufferOffset = 0; + Common::MemoryWriteStreamDynamic::write(_buffer, 256); + } + + _buffer[_bufferOffset] = value; + + _bufferOffset++; + _offset++; + } +} + +uint32 SavegameStream::process() { _enableCompression = !_enableCompression; - // TODO Flush compression buffer +#if DISABLE_COMPRESSION + return 0; +#else + switch (_status) { + default: + break; + + case kStatusReading: + _status = kStatusReady; + if (_bufferOffset != -1 && _bufferOffset != 256) { + seek(_bufferOffset - 256, SEEK_CUR); + _bufferOffset = -1; + } + break; + + case kStatusWriting: + switch (_valueCount) { + default: + break; + + case 1: + writeBuffer(_previousValue, false); + break; + + case 2: + if (_previousValue) { + writeBuffer(0xFF, true); + writeBuffer(_repeatCount, true); + writeBuffer(_previousValue, true); + break; + } + + if (_repeatCount == 3) { + writeBuffer(0xFB, true); + break; + } + + if (_repeatCount == -1) { + writeBuffer(0xFC, true); + break; + } + + writeBuffer(0xFD, true); + writeBuffer(_repeatCount, true); + break; + } + + if (_bufferOffset != -1 && _bufferOffset != 0) { + Common::MemoryWriteStreamDynamic::write(_buffer, _bufferOffset); + _bufferOffset = -1; + } + break; + } + + _status = kStatusReady; + _valueCount = 0; + uint32 offset = _offset; + _offset = 0; + return offset; +#endif } uint32 SavegameStream::writeCompressed(const void *dataPtr, uint32 dataSize) { - error("[SavegameStream::writeCompressed] Compression not implemented!"); + if (_status == kStatusReading) + error("[SavegameStream::writeCompressed] Error: Compression buffer is in read mode."); + + _status = kStatusWriting; + byte *data = (byte *)dataPtr; + + while (dataSize) { + switch (_valueCount) { + default: + error("[SavegameStream::writeCompressed] Invalid value count (%d)", _valueCount); + + case 0: + _previousValue = *data++; + _valueCount = 1; + break; + + case 1: + if (*data != _previousValue) { + writeBuffer(_previousValue, false); + _previousValue = *data; + } else { + _valueCount = 2; + _repeatCount = 2; + } + + ++data; + break; + + case 2: + if (*data != _previousValue || _repeatCount >= 255) { + if (_previousValue) { + writeBuffer(0xFF, true); + writeBuffer(_repeatCount, true); + writeBuffer(_previousValue, true); + + _previousValue = *data++; + _valueCount = 1; + break; + } + + if (_repeatCount == 3) { + writeBuffer(0xFB, true); + + _previousValue = *data++; + _valueCount = 1; + break; + } + + if (_repeatCount == -1) { + writeBuffer(0xFC, true); + + _previousValue = *data++; + _valueCount = 1; + break; + } + + writeBuffer(0xFD, true); + writeBuffer(_repeatCount, true); + + _previousValue = *data++; + _valueCount = 1; + } + + ++data; + ++_repeatCount; + break; + } + + --dataSize; + } + + return _offset; } uint32 SavegameStream::readCompressed(void *dataPtr, uint32 dataSize) { + if (_status == kStatusWriting) + error("[SavegameStream::writeCompressed] Error: Compression buffer is in write mode."); + error("[SavegameStream::readCompressed] Compression not implemented!"); } diff --git a/engines/lastexpress/game/savegame.h b/engines/lastexpress/game/savegame.h index dc16a16728..8866fd330d 100644 --- a/engines/lastexpress/game/savegame.h +++ b/engines/lastexpress/game/savegame.h @@ -95,9 +95,9 @@ public: _bufferOffset = -1; _valueCount = 0; _previousValue = 0; - _field_15F = 0; + _repeatCount = 0; _offset = 0; - _status = 0; + _status = kStatusReady; memset(_buffer, 0, 256); } @@ -109,24 +109,34 @@ public: uint32 read(void *dataPtr, uint32 dataSize); uint32 write(const void *dataPtr, uint32 dataSize); - void process(); + uint32 process(); private: + enum CompressedStreamStatus { + kStatusReady, + kStatusReading, + kStatusWriting + }; + + uint32 readUncompressed(void *dataPtr, uint32 dataSize); + // Compressed data uint32 writeCompressed(const void *dataPtr, uint32 dataSize); uint32 readCompressed(void *dataPtr, uint32 dataSize); + void writeBuffer(uint8 value, bool onlyValue); + private: bool _eos; // Compression handling - bool _enableCompression; - int _bufferOffset; - int _valueCount; - byte _previousValue; - byte _field_15F; - int _offset; - int _status; + bool _enableCompression; + int16 _bufferOffset; + byte _valueCount; + byte _previousValue; + int16 _repeatCount; + uint32 _offset; + CompressedStreamStatus _status; byte _buffer[256]; }; -- cgit v1.2.3 From 0cf1c220fa39a0157d5d19ab22e5ce1eb65596c7 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Tue, 31 Jul 2012 11:54:19 +0100 Subject: GPH: Move the legecy GP2X joystick code into the switch case to make it easier to follow. --- backends/events/gph/gph-events.cpp | 152 ++++++++++++++++++++++++------------- backends/events/gph/gph-events.h | 7 -- 2 files changed, 101 insertions(+), 58 deletions(-) diff --git a/backends/events/gph/gph-events.cpp b/backends/events/gph/gph-events.cpp index b4e106b790..91118d36c1 100644 --- a/backends/events/gph/gph-events.cpp +++ b/backends/events/gph/gph-events.cpp @@ -161,49 +161,6 @@ GPHEventSource::GPHEventSource() : _buttonStateL(false) { } -void GPHEventSource::moveStick() { - bool stickBtn[32]; - - memcpy(stickBtn, _stickBtn, sizeof(stickBtn)); - - if ((stickBtn[0]) || (stickBtn[2]) || (stickBtn[4]) || (stickBtn[6])) - stickBtn[1] = stickBtn[3] = stickBtn[5] = stickBtn[7] = 0; - - if ((stickBtn[1]) || (stickBtn[2]) || (stickBtn[3])) { - if (_km.x_down_count != 2) { - _km.x_vel = -1; - _km.x_down_count = 1; - } else - _km.x_vel = -4; - } else if ((stickBtn[5]) || (stickBtn[6]) || (stickBtn[7])) { - if (_km.x_down_count != 2) { - _km.x_vel = 1; - _km.x_down_count = 1; - } else - _km.x_vel = 4; - } else { - _km.x_vel = 0; - _km.x_down_count = 0; - } - - if ((stickBtn[0]) || (stickBtn[1]) || (stickBtn[7])) { - if (_km.y_down_count != 2) { - _km.y_vel = -1; - _km.y_down_count = 1; - } else - _km.y_vel = -4; - } else if ((stickBtn[3]) || (stickBtn[4]) || (stickBtn[5])) { - if (_km.y_down_count != 2) { - _km.y_vel = 1; - _km.y_down_count = 1; - } else - _km.y_vel = 4; - } else { - _km.y_vel = 0; - _km.y_down_count = 0; - } -} - /* Custom handleMouseButtonDown/handleMouseButtonUp to deal with 'Tap Mode' for the touchscreen */ bool GPHEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) { @@ -268,19 +225,110 @@ bool GPHEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) { bool GPHEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { - _stickBtn[ev.jbutton.button] = 1; event.kbd.flags = 0; switch (ev.jbutton.button) { case BUTTON_UP: - case BUTTON_UPLEFT: - case BUTTON_LEFT: - case BUTTON_DOWNLEFT: + if (_km.y_down_count != 2) { + _km.y_vel = -1; + _km.y_down_count = 1; + } else { + _km.y_vel = -4; + } + event.type = Common::EVENT_MOUSEMOVE; + processMouseEvent(event, _km.x, _km.y); + break; case BUTTON_DOWN: - case BUTTON_DOWNRIGHT: + if (_km.y_down_count != 2) { + _km.y_vel = 1; + _km.y_down_count = 1; + } else { + _km.y_vel = 4; + } + event.type = Common::EVENT_MOUSEMOVE; + processMouseEvent(event, _km.x, _km.y); + break; + case BUTTON_LEFT: + if (_km.x_down_count != 2) { + _km.x_vel = -1; + _km.x_down_count = 1; + } else { + _km.x_vel = -4; + } + event.type = Common::EVENT_MOUSEMOVE; + processMouseEvent(event, _km.x, _km.y); + break; case BUTTON_RIGHT: + if (_km.x_down_count != 3) { + _km.x_vel = 1; + _km.x_down_count = 1; + } else { + _km.x_vel = 4; + } + event.type = Common::EVENT_MOUSEMOVE; + processMouseEvent(event, _km.x, _km.y); + break; + case BUTTON_UPLEFT: + if (_km.x_down_count != 2) { + _km.x_vel = -1; + _km.x_down_count = 1; + } else { + _km.x_vel = -4; + } + if (_km.y_down_count != 2) { + _km.y_vel = -1; + _km.y_down_count = 1; + } else { + _km.y_vel = -4; + } + event.type = Common::EVENT_MOUSEMOVE; + processMouseEvent(event, _km.x, _km.y); + break; case BUTTON_UPRIGHT: - moveStick(); + if (_km.x_down_count != 2) { + _km.x_vel = 1; + _km.x_down_count = 1; + } else { + _km.x_vel = 4; + } + if (_km.y_down_count != 2) { + _km.y_vel = -1; + _km.y_down_count = 1; + } else { + _km.y_vel = -4; + } + event.type = Common::EVENT_MOUSEMOVE; + processMouseEvent(event, _km.x, _km.y); + break; + case BUTTON_DOWNLEFT: + if (_km.x_down_count != 2) { + _km.x_vel = -1; + _km.x_down_count = 1; + } else { + _km.x_vel = -4; + } + if (_km.y_down_count != 2) { + _km.y_vel = 1; + _km.y_down_count = 1; + } else { + _km.y_vel = 4; + } + event.type = Common::EVENT_MOUSEMOVE; + processMouseEvent(event, _km.x, _km.y); + break; + case BUTTON_DOWNRIGHT: + if (_km.x_down_count != 2) { + _km.x_vel = 1; + _km.x_down_count = 1; + } else { + _km.x_vel = 4; + } + if (_km.y_down_count != 2) { + _km.y_vel = 1; + _km.y_down_count = 1; + } else { + _km.y_vel = 4; + } event.type = Common::EVENT_MOUSEMOVE; processMouseEvent(event, _km.x, _km.y); break; @@ -391,7 +439,6 @@ bool GPHEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { bool GPHEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { - _stickBtn[ev.jbutton.button] = 0; event.kbd.flags = 0; switch (ev.jbutton.button) { @@ -403,7 +450,10 @@ bool GPHEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { case BUTTON_DOWNRIGHT: case BUTTON_RIGHT: case BUTTON_UPRIGHT: - moveStick(); + _km.y_vel = 0; + _km.y_down_count = 0; + _km.x_vel = 0; + _km.x_down_count = 0; event.type = Common::EVENT_MOUSEMOVE; processMouseEvent(event, _km.x, _km.y); break; diff --git a/backends/events/gph/gph-events.h b/backends/events/gph/gph-events.h index 7672bffed2..3b1e6f090a 100644 --- a/backends/events/gph/gph-events.h +++ b/backends/events/gph/gph-events.h @@ -34,18 +34,11 @@ public: GPHEventSource(); protected: - bool _stickBtn[32]; - /** * Button state for L button modifier */ bool _buttonStateL; - /** - * Handles the stick movement - */ - void moveStick(); - bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event); bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event); bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event); -- cgit v1.2.3 From 4b4ce9dc6b63e76d90188841db7d2ff88c10477e Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Tue, 31 Jul 2012 18:59:36 +0100 Subject: GPH: Add extra call to SDL_ShowCursor(SDL_DISABLE). * This is needed on the hacked SDL on the GP2X after any call to SDL_SetVideoMode. It does not impact other GPH devices. --- backends/graphics/gph/gph-graphics.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backends/graphics/gph/gph-graphics.cpp b/backends/graphics/gph/gph-graphics.cpp index 8521e88eaf..92553564bf 100644 --- a/backends/graphics/gph/gph-graphics.cpp +++ b/backends/graphics/gph/gph-graphics.cpp @@ -486,7 +486,13 @@ bool GPHGraphicsManager::loadGFXMode() { if (_videoMode.aspectRatioCorrection) _videoMode.overlayHeight = real2Aspect(_videoMode.overlayHeight); } - return SurfaceSdlGraphicsManager::loadGFXMode(); + SurfaceSdlGraphicsManager::loadGFXMode(); + + // The old GP2X hacked SDL needs this after any call to SDL_SetVideoMode + // and it does not hurt other devices. + SDL_ShowCursor(SDL_DISABLE); + + return true; } bool GPHGraphicsManager::hasFeature(OSystem::Feature f) { -- cgit v1.2.3 From 411e3dec8205477638ea2a9e4001573db461a25c Mon Sep 17 00:00:00 2001 From: athrxx Date: Tue, 31 Jul 2012 21:34:47 +0200 Subject: KYRA: fix "bug" #3552534 (LOL Floppy FR version unknown) --- engines/kyra/detection_tables.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h index 79ef11e7a9..3f16c35909 100644 --- a/engines/kyra/detection_tables.h +++ b/engines/kyra/detection_tables.h @@ -1329,6 +1329,22 @@ const KYRAGameDescription adGameDescs[] = { LOL_FLOPPY_CMP_FLAGS }, + { + { + "lol", + 0, + { + { "WESTWOOD.1", 0, "43857e24d1fc6731f3b13d9ed6db8c3a", -1 }, + { 0, 0, 0, 0 } + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO8(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK, GUIO_RENDERVGA, GAMEOPTION_LOL_SCROLLING, GAMEOPTION_LOL_CURSORS) + }, + LOL_FLOPPY_CMP_FLAGS + }, + { { "lol", @@ -1397,6 +1413,23 @@ const KYRAGameDescription adGameDescs[] = { LOL_FLOPPY_FLAGS }, + { + { + "lol", + "Extracted", + { + { "GENERAL.PAK", 0, "f4fd14f244bd7c7fa08d026fafe44cc5", -1 }, + { "CHAPTER7.PAK", 0, "733e33c8444c93843dac3b683c283eaa", -1 }, + { 0, 0, 0, 0 } + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO8(GUIO_NOSPEECH, GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_MIDIPCSPK, GUIO_RENDERVGA, GAMEOPTION_LOL_SCROLLING, GAMEOPTION_LOL_CURSORS) + }, + LOL_FLOPPY_FLAGS + }, + // Russian fan translation { { -- cgit v1.2.3 From 11cf6145cbfa67ea05b351e439a0260b0e300f05 Mon Sep 17 00:00:00 2001 From: athrxx Date: Wed, 1 Aug 2012 01:07:08 +0200 Subject: KYRA: update kyra.dat to match the last commit (added support for French LOL floppy) --- devtools/create_kyradat/create_kyradat.cpp | 2 +- devtools/create_kyradat/games.cpp | 1 + devtools/create_kyradat/tables.cpp | 1 + dists/engine-data/kyra.dat | Bin 469735 -> 471460 bytes engines/kyra/staticres.cpp | 2 +- 5 files changed, 4 insertions(+), 2 deletions(-) diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp index a87bde3e26..3b90ad0d85 100644 --- a/devtools/create_kyradat/create_kyradat.cpp +++ b/devtools/create_kyradat/create_kyradat.cpp @@ -47,7 +47,7 @@ #include enum { - kKyraDatVersion = 82 + kKyraDatVersion = 83 }; const ExtractFilename extractFilenames[] = { diff --git a/devtools/create_kyradat/games.cpp b/devtools/create_kyradat/games.cpp index a2759b1e53..89229eb4f2 100644 --- a/devtools/create_kyradat/games.cpp +++ b/devtools/create_kyradat/games.cpp @@ -119,6 +119,7 @@ const Game lolGames[] = { { kLoL, { EN_ANY, -1, -1 }, kPlatformPC, kNoSpecial, { "0cc764a204f7ba8cefe1a5f14c479619", 0 } }, { kLoL, { RU_RUS, -1, -1 }, kPlatformPC, kNoSpecial, { "80a9f9bf243bc6ed36d98584fc6988c4", 0 } }, { kLoL, { DE_DEU, -1, -1 }, kPlatformPC, kNoSpecial, { "6b843869772c1b779e1386be868c15dd", 0 } }, + { kLoL, { FR_FRA, -1, -1 }, kPlatformPC, kNoSpecial, { "6b843869772c1b779e1386be868c15dd", 0 } }, // PC98 (no language specifc strings) { kLoL, { JA_JPN, -1, -1 }, kPlatformPC98, kNoSpecial, { "6d5bd4a2f5ce433365734ca6b7a8d984", "1b0a457c48ae6908da301b656fe0aab4" } }, diff --git a/devtools/create_kyradat/tables.cpp b/devtools/create_kyradat/tables.cpp index 1b9f90f18f..19b69d9410 100644 --- a/devtools/create_kyradat/tables.cpp +++ b/devtools/create_kyradat/tables.cpp @@ -3349,6 +3349,7 @@ const ExtractEntrySearchData kLoLCharacterDefsProvider[] = { { RU_RUS, kPlatformPC, { 0x00000492, 0x000052BA, { { 0x52, 0x29, 0x0D, 0x49, 0xFD, 0x17, 0xD7, 0x70, 0x6D, 0xCA, 0xEB, 0xB6, 0x7E, 0xFA, 0xBE, 0x08 } } } }, // floppy { EN_ANY, kPlatformPC, { 0x00000492, 0x000046B0, { { 0x7A, 0x94, 0x8B, 0xC6, 0xF7, 0xF1, 0x2F, 0xF3, 0xBC, 0x1B, 0x0B, 0x4E, 0x00, 0xC9, 0x44, 0x58 } } } }, // floppy { DE_DEU, kPlatformPC, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy + { FR_FRA, kPlatformPC, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy { EN_ANY, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD { DE_DEU, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD { FR_FRA, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat index c89b21cbca..339b85664a 100644 Binary files a/dists/engine-data/kyra.dat and b/dists/engine-data/kyra.dat differ diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 423b827092..00dc4f9e13 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -38,7 +38,7 @@ namespace Kyra { -#define RESFILE_VERSION 82 +#define RESFILE_VERSION 83 namespace { bool checkKyraDat(Common::SeekableReadStream *file) { -- cgit v1.2.3 From eb6c60cec034a7758b8d25e29f501b10fc06c1a4 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 1 Aug 2012 00:13:39 -0400 Subject: LASTEXPRESS: Implement savegame read compression --- engines/lastexpress/game/savegame.cpp | 97 +++++++++++++++++++++++++++++++---- engines/lastexpress/game/savegame.h | 3 +- 2 files changed, 89 insertions(+), 11 deletions(-) diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp index 54ba45e25e..360e99146a 100644 --- a/engines/lastexpress/game/savegame.cpp +++ b/engines/lastexpress/game/savegame.cpp @@ -119,6 +119,18 @@ void SavegameStream::writeBuffer(uint8 value, bool onlyValue) { } } +uint8 SavegameStream::readBuffer() { + if (_bufferOffset == -1 || _bufferOffset >= 256) { + readUncompressed(_buffer, 256); + _bufferOffset = 0; + } + + byte val = _buffer[_bufferOffset]; + _bufferOffset++; + + return val; +} + uint32 SavegameStream::process() { _enableCompression = !_enableCompression; @@ -148,24 +160,24 @@ uint32 SavegameStream::process() { case 2: if (_previousValue) { - writeBuffer(0xFF, true); - writeBuffer(_repeatCount, true); - writeBuffer(_previousValue, true); + writeBuffer(0xFF); + writeBuffer(_repeatCount); + writeBuffer(_previousValue); break; } if (_repeatCount == 3) { - writeBuffer(0xFB, true); + writeBuffer(0xFB); break; } - if (_repeatCount == -1) { - writeBuffer(0xFC, true); + if (_repeatCount == 255) { + writeBuffer(0xFC); break; } - writeBuffer(0xFD, true); - writeBuffer(_repeatCount, true); + writeBuffer(0xFD); + writeBuffer(_repeatCount); break; } @@ -190,7 +202,7 @@ uint32 SavegameStream::writeCompressed(const void *dataPtr, uint32 dataSize) { error("[SavegameStream::writeCompressed] Error: Compression buffer is in read mode."); _status = kStatusWriting; - byte *data = (byte *)dataPtr; + const byte *data = (const byte *)dataPtr; while (dataSize) { switch (_valueCount) { @@ -264,7 +276,72 @@ uint32 SavegameStream::readCompressed(void *dataPtr, uint32 dataSize) { if (_status == kStatusWriting) error("[SavegameStream::writeCompressed] Error: Compression buffer is in write mode."); - error("[SavegameStream::readCompressed] Compression not implemented!"); + _status = kStatusReady; + byte *data = (byte *)dataPtr; + + while (dataSize) { + switch (_valueCount) { + default: + error("[SavegameStream::readCompressed] Invalid value count (%d)", _valueCount); + + case 0: + case 1: { + // Read control code + byte control = readBuffer(); + + switch (control) { + default: + // Data value + *data++ = control; + break; + + case 0xFB: + _repeatCount = 2; + _previousValue = 0; + *data++ = 0; + _valueCount = 2; + break; + + case 0xFC: + _repeatCount = 254; + _previousValue = 0; + *data++ = 0; + _valueCount = 2; + break; + + case 0xFD: + _repeatCount = readBuffer() - 1; + _previousValue = 0; + *data++ = 0; + _valueCount = 2; + break; + + case 0xFE: + *data++ = readBuffer(); + break; + + case 0xFF: + _repeatCount = readBuffer() - 1; + _previousValue = readBuffer(); + *data++ = _previousValue; + _valueCount = 2; + break; + } + } + break; + + case 2: + *data++ = _previousValue; + _repeatCount--; + if (!_repeatCount) + _valueCount = 1; + break; + } + + --dataSize; + } + + return _offset; } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/game/savegame.h b/engines/lastexpress/game/savegame.h index 8866fd330d..8656b2ee86 100644 --- a/engines/lastexpress/game/savegame.h +++ b/engines/lastexpress/game/savegame.h @@ -124,7 +124,8 @@ private: uint32 writeCompressed(const void *dataPtr, uint32 dataSize); uint32 readCompressed(void *dataPtr, uint32 dataSize); - void writeBuffer(uint8 value, bool onlyValue); + void writeBuffer(uint8 value, bool onlyValue = true); + uint8 readBuffer(); private: bool _eos; -- cgit v1.2.3 From 7f05e1413c8b7b3913f64ddb29622dcdf40b2c65 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 1 Aug 2012 02:58:55 -0400 Subject: LASTEXPRESS: Remove use of skip from savegame functions when loading We cannot accurately skip over compressed data as it is not know before decoding how much data will be used --- engines/lastexpress/entities/entity.cpp | 8 +++++++- engines/lastexpress/game/savepoint.cpp | 10 +++++++++- engines/lastexpress/sound/queue.cpp | 10 +++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/engines/lastexpress/entities/entity.cpp b/engines/lastexpress/entities/entity.cpp index 4b1fda9c12..2deca291f6 100644 --- a/engines/lastexpress/entities/entity.cpp +++ b/engines/lastexpress/entities/entity.cpp @@ -88,7 +88,13 @@ void EntityData::EntityCallData::saveLoadWithSerializer(Common::Serializer &s) { syncString(s, sequenceNameCopy, 13); // Skip pointers to frame & sequences - s.skip(5 * 4); + // (we are using a compressed stream, so we cannot seek on load) + if (s.isLoading()) { + byte empty[5 * 4]; + s.syncBytes(empty, 5 * 4); + } else { + s.skip(5 * 4); + } } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/lastexpress/game/savepoint.cpp b/engines/lastexpress/game/savepoint.cpp index 557468e222..6b2dfc5930 100644 --- a/engines/lastexpress/game/savepoint.cpp +++ b/engines/lastexpress/game/savepoint.cpp @@ -242,7 +242,15 @@ void SavePoints::saveLoadWithSerializer(Common::Serializer &s) { } // Skip uninitialized data if any - s.skip((_savePointsMaxSize - dataSize) * 16); + // (we are using a compressed stream, so we cannot seek on load) + uint32 unusedDataSize = (_savePointsMaxSize - dataSize) * 16; + if (s.isLoading()) { + byte *empty = (byte *)malloc(unusedDataSize); + s.syncBytes(empty, unusedDataSize); + free(empty); + } else { + s.skip(unusedDataSize); + } // Number of savepoints uint32 numSavepoints = _savepoints.size(); diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp index 7b3dbcf2d9..d72acfd8a0 100644 --- a/engines/lastexpress/sound/queue.cpp +++ b/engines/lastexpress/sound/queue.cpp @@ -372,7 +372,15 @@ void SoundQueue::saveLoadWithSerializer(Common::Serializer &s) { (*i)->saveLoadWithSerializer(s); } else { warning("[Sound::saveLoadWithSerializer] Loading not implemented"); - s.skip(numEntries * 64); + + uint32 unusedDataSize = numEntries * 64; + if (s.isLoading()) { + byte *empty = (byte *)malloc(unusedDataSize); + s.syncBytes(empty, unusedDataSize); + free(empty); + } else { + s.skip(unusedDataSize); + } } } -- cgit v1.2.3 From 4ad7d48fe9b306192963398668feb6332a664830 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 1 Aug 2012 13:55:55 -0400 Subject: LASTEXPRESS: Remove unused code and move functor definition to only file using it --- engines/lastexpress/game/action.cpp | 16 +++++++++++ engines/lastexpress/shared.h | 56 ------------------------------------- 2 files changed, 16 insertions(+), 56 deletions(-) diff --git a/engines/lastexpress/game/action.cpp b/engines/lastexpress/game/action.cpp index 4d1c786167..60a309518a 100644 --- a/engines/lastexpress/game/action.cpp +++ b/engines/lastexpress/game/action.cpp @@ -329,6 +329,22 @@ static const struct { {"8042A", 600} }; +template +class Functor1MemConst : public Common::Functor1 { +public: + typedef Res (T::*FuncType)(Arg) const; + + Functor1MemConst(T *t, const FuncType &func) : _t(t), _func(func) {} + + bool isValid() const { return _func != 0 && _t != 0; } + Res operator()(Arg v1) const { + return (_t->*_func)(v1); + } +private: + mutable T *_t; + const FuncType _func; +}; + Action::Action(LastExpressEngine *engine) : _engine(engine) { ADD_ACTION(dummy); ADD_ACTION(inventory); diff --git a/engines/lastexpress/shared.h b/engines/lastexpress/shared.h index bebd149b9b..56cf730e24 100644 --- a/engines/lastexpress/shared.h +++ b/engines/lastexpress/shared.h @@ -1733,62 +1733,6 @@ enum ActionIndex { kActionEnd }; -////////////////////////////////////////////////////////////////////////// -// Functors classes used by the engine -////////////////////////////////////////////////////////////////////////// - -// FIXME is this achievable with the existing Functor1Mem function -template -class Functor1MemConst : public Common::Functor1 { -public: - typedef Res (T::*FuncType)(Arg) const; - - Functor1MemConst(T *t, const FuncType &func) : _t(t), _func(func) {} - - bool isValid() const { return _func != 0 && _t != 0; } - Res operator()(Arg v1) const { - return (_t->*_func)(v1); - } -private: - mutable T *_t; - const FuncType _func; -}; - -// FIXME move this to existing func.h file -template -struct QuaternaryFunction { - typedef Arg1 FirstArgumentType; - typedef Arg2 SecondArgumentType; - typedef Arg3 ThirdArgumentType; - typedef Arg4 FourthArgumentType; - typedef Result ResultType; -}; - -template -struct Functor4 : public QuaternaryFunction { - virtual ~Functor4() {} - - virtual bool isValid() const = 0; - virtual Res operator()(Arg1, Arg2, Arg3, Arg4) const = 0; -}; - -template -class Functor4Mem : public Functor4 { -public: - typedef Res (T::*FuncType)(Arg1, Arg2, Arg3, Arg4); - - Functor4Mem(T *t, const FuncType &func) : _t(t), _func(func) {} - - bool isValid() const { return _func != 0 && _t != 0; } - Res operator()(Arg1 v1, Arg2 v2, Arg3 v3, Arg4 v4) const { - return (_t->*_func)(v1, v2, v3, v4); - } -private: - mutable T *_t; - const FuncType _func; -}; - - } // End of namespace LastExpress #endif // LASTEXPRESS_SHARED_H -- cgit v1.2.3 From 272c1d87e49bc77e5e1a451fa81ea3463fff7d2a Mon Sep 17 00:00:00 2001 From: Littleboy Date: Wed, 1 Aug 2012 17:56:56 -0400 Subject: LASTEXPRESS: Fix typo preventing playing NIS animations from the debugger --- engines/lastexpress/debug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp index 13a8a77ca9..f89ad8b80d 100644 --- a/engines/lastexpress/debug.cpp +++ b/engines/lastexpress/debug.cpp @@ -609,7 +609,7 @@ bool Debugger::cmdPlayNis(int argc, const char **argv) { loadArchive((ArchiveIndex)getNumber(argv[2])); // If we got a nis filename, check that the file exists - if (name.contains('.') && _engine->getResourceManager()->hasFile(name)) { + if (name.contains('.') && !_engine->getResourceManager()->hasFile(name)) { DebugPrintf("Cannot find file: %s\n", name.c_str()); return true; } -- cgit v1.2.3 From 259f262592bab9b779bad7aff6752ca69ffb26de Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 2 Aug 2012 03:46:58 +0300 Subject: SCI: Add a workaround for a script bug in QFG4 Thanks to Charles for testing --- engines/sci/engine/workarounds.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index fea3aed9ae..a4c2355e8f 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -36,6 +36,7 @@ const SciWorkaroundEntry arithmeticWorkarounds[] = { { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // op_or: when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464 { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xce0, 0, { WORKAROUND_FAKE, 0 } }, // Same as above, for the Spanish version - bug #3313962 { GID_FANMADE, 516, 983, 0, "Wander", "setTarget", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_mul: The Legend of the Lost Jewel Demo (fan made): called with object as second parameter when attacked by insects - bug #3038913 + { GID_GK1, 800,64992, 0, "Fwd", "doit", -1, 0, { WORKAROUND_FAKE, 1 } }, // op_gt: when Mosely finds Gabriel and Grace near the end of the game, compares the Grooper object with 7 { GID_ICEMAN, 199, 977, 0, "Grooper", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_add: While dancing with the girl { GID_MOTHERGOOSE256, -1, 999, 0, "Event", "new", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_and: constantly during the game (SCI1 version) { GID_MOTHERGOOSE256, -1, 4, 0, "rm004", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_or: when going north and reaching the castle (rooms 4 and 37) - bug #3038228 @@ -43,7 +44,7 @@ const SciWorkaroundEntry arithmeticWorkarounds[] = { { GID_PHANTASMAGORIA, 902, 0, 0, "", "export 7", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_shr: when starting a chapter in Phantasmagoria { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_div: when entering the inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object { GID_QFG2, 200, 200, 0, "astro", "messages", -1, 0, { WORKAROUND_FAKE, 0 } }, // op_lsi: when getting asked for your name by the astrologer bug #3039879 - { GID_GK1, 800,64992, 0, "Fwd", "doit", -1, 0, { WORKAROUND_FAKE, 1 } }, // op_gt: when Mosely finds Gabriel and Grace near the end of the game, compares the Grooper object with 7 + { GID_QFG4, 710,64941, 0, "RandCycle", "doit", -1, 0, { WORKAROUND_FAKE, 1 } }, // op_gt: when the tentacle appears in the third room of the caves SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 52a1a6e60b418f9f0bcca9b12ef631f6f8176786 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Thu, 2 Aug 2012 12:41:40 +0100 Subject: TEENAGENT: Fix for bug #3428161 "PSP: No music in TeenAgent". This could occur on other platforms too and was a race hazard between mixer thread startup and music being valid i.e. If the music doesn't already exist, when the mixer callback is done, this deletes the channel as idle. Reordered the calls to fix this. Also, removed unecessary music->start() as this is done by setMusic(n) on successful load anyway. --- engines/teenagent/teenagent.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp index f06de6f803..57c069fe59 100644 --- a/engines/teenagent/teenagent.cpp +++ b/engines/teenagent/teenagent.cpp @@ -535,9 +535,8 @@ Common::Error TeenAgentEngine::run() { syncSoundSettings(); - _mixer->playStream(Audio::Mixer::kMusicSoundType, &_musicHandle, music, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, false); setMusic(1); - music->start(); + _mixer->playStream(Audio::Mixer::kMusicSoundType, &_musicHandle, music, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, false); int load_slot = Common::ConfigManager::instance().getInt("save_slot"); if (load_slot >= 0) { -- cgit v1.2.3 From b79221729bd06a737bf140bf7cb5c0ff2a578681 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sat, 4 Aug 2012 14:41:17 +0100 Subject: AUDIO: Fix DVI ADPCM to work with Mono streams using odd sized buffers. --- audio/decoders/adpcm.cpp | 16 +++++++++++----- audio/decoders/adpcm_intern.h | 6 +++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp index 535652a0b3..5c96d5245a 100644 --- a/audio/decoders/adpcm.cpp +++ b/audio/decoders/adpcm.cpp @@ -117,13 +117,19 @@ int DVI_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) { int samples; byte data; - assert(numSamples % 2 == 0); + for (samples = 0; samples < numSamples && !_stream->eos() && (_stream->pos() < _endpos); samples++) { + if (_decodedSampleCount == 0) { + data = _stream->readByte(); + _decodedSamples[0] = decodeIMA((data >> 4) & 0x0f, 0); + _decodedSamples[1] = decodeIMA((data >> 0) & 0x0f, _channels == 2 ? 1 : 0); + _decodedSampleCount = 2; + } - for (samples = 0; samples < numSamples && !_stream->eos() && _stream->pos() < _endpos; samples += 2) { - data = _stream->readByte(); - buffer[samples] = decodeIMA((data >> 4) & 0x0f); - buffer[samples + 1] = decodeIMA(data & 0x0f, _channels == 2 ? 1 : 0); + // (1 - (count - 1)) ensures that _decodedSamples acts as a FIFO of depth 2 + buffer[samples] = _decodedSamples[1 - (_decodedSampleCount - 1)]; + _decodedSampleCount--; } + return samples; } diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h index 31747aabaf..537ae023ef 100644 --- a/audio/decoders/adpcm_intern.h +++ b/audio/decoders/adpcm_intern.h @@ -108,9 +108,13 @@ public: class DVI_ADPCMStream : public Ima_ADPCMStream { public: DVI_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign) - : Ima_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign) {} + : Ima_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign) { _decodedSampleCount = 0; } virtual int readBuffer(int16 *buffer, const int numSamples); + +private: + uint8 _decodedSampleCount; + int16 _decodedSamples[2]; }; class Apple_ADPCMStream : public Ima_ADPCMStream { -- cgit v1.2.3 From 9c47fdae293e05888d3b4ec45fd4b374d1022c0b Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sat, 4 Aug 2012 18:38:12 +0100 Subject: AUDIO: Fix Oki ADPCM to work with Mono streams using odd sized buffers. --- audio/decoders/adpcm.cpp | 16 +++++++++++----- audio/decoders/adpcm_intern.h | 4 ++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp index 5c96d5245a..e7297423f6 100644 --- a/audio/decoders/adpcm.cpp +++ b/audio/decoders/adpcm.cpp @@ -71,13 +71,19 @@ int Oki_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) { int samples; byte data; - assert(numSamples % 2 == 0); + for (samples = 0; samples < numSamples && !_stream->eos() && (_stream->pos() < _endpos); samples++) { + if (_decodedSampleCount == 0) { + data = _stream->readByte(); + _decodedSamples[0] = decodeOKI((data >> 4) & 0x0f); + _decodedSamples[1] = decodeOKI((data >> 0) & 0x0f); + _decodedSampleCount = 2; + } - for (samples = 0; samples < numSamples && !_stream->eos() && _stream->pos() < _endpos; samples += 2) { - data = _stream->readByte(); - buffer[samples] = decodeOKI((data >> 4) & 0x0f); - buffer[samples + 1] = decodeOKI(data & 0x0f); + // (1 - (count - 1)) ensures that _decodedSamples acts as a FIFO of depth 2 + buffer[samples] = _decodedSamples[1 - (_decodedSampleCount - 1)]; + _decodedSampleCount--; } + return samples; } diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h index 537ae023ef..423c4af267 100644 --- a/audio/decoders/adpcm_intern.h +++ b/audio/decoders/adpcm_intern.h @@ -89,6 +89,10 @@ public: protected: int16 decodeOKI(byte); + +private: + uint8 _decodedSampleCount; + int16 _decodedSamples[2]; }; class Ima_ADPCMStream : public ADPCMStream { -- cgit v1.2.3 From 43e2c6ee1ec8f47a61f69572043b2beca01f53f6 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sat, 4 Aug 2012 20:29:37 +0100 Subject: AUDIO: Correct ADPCM Fixes to ensure internal buffers are drained. This also adds an omitted _decodedSampleCount initialization in Oki ADPCM decoder. --- audio/decoders/adpcm.cpp | 4 ++-- audio/decoders/adpcm_intern.h | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp index e7297423f6..2fe509e1f3 100644 --- a/audio/decoders/adpcm.cpp +++ b/audio/decoders/adpcm.cpp @@ -71,7 +71,7 @@ int Oki_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) { int samples; byte data; - for (samples = 0; samples < numSamples && !_stream->eos() && (_stream->pos() < _endpos); samples++) { + for (samples = 0; samples < numSamples && !endOfData(); samples++) { if (_decodedSampleCount == 0) { data = _stream->readByte(); _decodedSamples[0] = decodeOKI((data >> 4) & 0x0f); @@ -123,7 +123,7 @@ int DVI_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) { int samples; byte data; - for (samples = 0; samples < numSamples && !_stream->eos() && (_stream->pos() < _endpos); samples++) { + for (samples = 0; samples < numSamples && !endOfData(); samples++) { if (_decodedSampleCount == 0) { data = _stream->readByte(); _decodedSamples[0] = decodeIMA((data >> 4) & 0x0f, 0); diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h index 423c4af267..3b8d8c74d0 100644 --- a/audio/decoders/adpcm_intern.h +++ b/audio/decoders/adpcm_intern.h @@ -37,7 +37,6 @@ #include "common/stream.h" #include "common/textconsole.h" - namespace Audio { class ADPCMStream : public RewindableAudioStream { @@ -64,12 +63,11 @@ public: ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign); virtual bool endOfData() const { return (_stream->eos() || _stream->pos() >= _endpos); } - virtual bool isStereo() const { return _channels == 2; } - virtual int getRate() const { return _rate; } + virtual bool isStereo() const { return _channels == 2; } + virtual int getRate() const { return _rate; } virtual bool rewind(); - /** * This table is used by some ADPCM variants (IMA and OKI) to adjust the * step for use on the next sample. @@ -83,7 +81,9 @@ public: class Oki_ADPCMStream : public ADPCMStream { public: Oki_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign) - : ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign) {} + : ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign) { _decodedSampleCount = 0; } + + virtual bool endOfData() const { return (_stream->eos() || _stream->pos() >= _endpos) && (_decodedSampleCount == 0); } virtual int readBuffer(int16 *buffer, const int numSamples); @@ -114,6 +114,8 @@ public: DVI_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign) : Ima_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign) { _decodedSampleCount = 0; } + virtual bool endOfData() const { return (_stream->eos() || _stream->pos() >= _endpos) && (_decodedSampleCount == 0); } + virtual int readBuffer(int16 *buffer, const int numSamples); private: -- cgit v1.2.3 From de752a53361e67ddc3a84e61007db2a3049e3550 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Sat, 4 Aug 2012 23:51:27 +0200 Subject: CGE: Fix bug #3547274 - missing travel buttons after save --- engines/cge/cge_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index a70e32de7e..355e163d4b 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -307,6 +307,7 @@ Common::Error CGEEngine::saveGameState(int slot, const Common::String &desc) { // Write out the user's progress saveGame(slot, desc); + _commandHandler->addCommand(kCmdLevel, -1, _oldLev, &_sceneLight); // Reload the scene sceneUp(); -- cgit v1.2.3 From ef8e15255d2415add42d4463e1672ea215f4ab80 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 5 Aug 2012 10:43:41 +0200 Subject: GOB: Add a Spanish/Italian DOS version of Geisha As supplied by einstein95 in bug report #3544449. --- engines/gob/detection/tables_geisha.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/engines/gob/detection/tables_geisha.h b/engines/gob/detection/tables_geisha.h index d05659d9e5..a32d1ebf81 100644 --- a/engines/gob/detection/tables_geisha.h +++ b/engines/gob/detection/tables_geisha.h @@ -69,6 +69,34 @@ kFeaturesEGA | kFeaturesAdLib, "disk1.stk", "intro.tot", 0 }, +{ // Supplied by einstein95 in bug report #3544449 + { + "geisha", + "", + AD_ENTRY1s("disk1.stk", "49107ac897e7c00af6c4ecd78a74a710", 212169), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeGeisha, + kFeaturesEGA | kFeaturesAdLib, + "disk1.stk", "intro.tot", 0 +}, +{ // Supplied by einstein95 in bug report #3544449 + { + "geisha", + "", + AD_ENTRY1s("disk1.stk", "49107ac897e7c00af6c4ecd78a74a710", 212169), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSUBTITLES, GUIO_NOSPEECH) + }, + kGameTypeGeisha, + kFeaturesEGA | kFeaturesAdLib, + "disk1.stk", "intro.tot", 0 +}, { { "geisha", -- cgit v1.2.3 From 745ef462fca7d69e5890659cb1f9fb208ee7c184 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 5 Aug 2012 17:10:11 +0200 Subject: KYRA: Add source of detection entires for LoL French floppy. --- engines/kyra/detection_tables.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h index 3f16c35909..e2162f20e2 100644 --- a/engines/kyra/detection_tables.h +++ b/engines/kyra/detection_tables.h @@ -1329,7 +1329,7 @@ const KYRAGameDescription adGameDescs[] = { LOL_FLOPPY_CMP_FLAGS }, - { + { // French floppy version 1.20, bug #3552534 "KYRA: LOL Floppy FR version unknown" { "lol", 0, @@ -1413,7 +1413,7 @@ const KYRAGameDescription adGameDescs[] = { LOL_FLOPPY_FLAGS }, - { + { // French floppy version 1.23, bug #3552534 "KYRA: LOL Floppy FR version unknown" { "lol", "Extracted", -- cgit v1.2.3 From 5c522575c7aff4706f3fefe0d7f89272aecd2b66 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Sun, 5 Aug 2012 22:24:32 +0200 Subject: CGE: Keep Soltys' position when saving --- engines/cge/cge_main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index 355e163d4b..3ba5f7fed9 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -305,6 +305,10 @@ Common::Error CGEEngine::saveGameState(int slot, const Common::String &desc) { _hero->park(); _oldLev = _lev; + int x = _hero->_x; + int y = _hero->_y; + int z = _hero->_z; + // Write out the user's progress saveGame(slot, desc); _commandHandler->addCommand(kCmdLevel, -1, _oldLev, &_sceneLight); @@ -312,6 +316,10 @@ Common::Error CGEEngine::saveGameState(int slot, const Common::String &desc) { // Reload the scene sceneUp(); + _hero->_x = x; + _hero->_y = y; + _hero->_z = z; + return Common::kNoError; } -- cgit v1.2.3 From 2dee92a908b84ae870bfdbfd00318549485b7984 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 6 Aug 2012 20:03:56 +1000 Subject: TINSEL: Fixed portability issue with earlier savegames --- engines/tinsel/dialogs.cpp | 14 +++++++++++++ engines/tinsel/dialogs.h | 2 ++ engines/tinsel/saveload.cpp | 50 ++++++++++++++++++++++++++++++++++++--------- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/engines/tinsel/dialogs.cpp b/engines/tinsel/dialogs.cpp index dde34841cf..56ee2ea752 100644 --- a/engines/tinsel/dialogs.cpp +++ b/engines/tinsel/dialogs.cpp @@ -1262,6 +1262,20 @@ static INV_OBJECT *GetInvObject(int id) { error("GetInvObject(%d): Trying to manipulate undefined inventory icon", id); } +/** + * Returns true if the given id represents a valid inventory object + */ +bool GetIsInvObject(int id) { + INV_OBJECT *pObject = g_invObjects; + + for (int i = 0; i < g_numObjects; i++, pObject++) { + if (pObject->id == id) + return true; + } + + return false; +} + /** * Convert item ID number to index. */ diff --git a/engines/tinsel/dialogs.h b/engines/tinsel/dialogs.h index 8c48eb8b76..ab53ba771c 100644 --- a/engines/tinsel/dialogs.h +++ b/engines/tinsel/dialogs.h @@ -152,6 +152,8 @@ void InvSetLimit(int invno, int n); void InvSetSize(int invno, int MinWidth, int MinHeight, int StartWidth, int StartHeight, int MaxWidth, int MaxHeight); +bool GetIsInvObject(int id); + int WhichInventoryOpen(); bool IsTopWindow(); diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp index 0a552c8c2b..518e27f02b 100644 --- a/engines/tinsel/saveload.cpp +++ b/engines/tinsel/saveload.cpp @@ -55,8 +55,7 @@ namespace Tinsel { * only saves/loads those which are valid for the version of the savegame * which is being loaded/saved currently. */ -#define CURRENT_VER 1 -// TODO: Not yet used +#define CURRENT_VER 2 /** * An auxillary macro, used to specify savegame versions. We use this instead @@ -97,12 +96,13 @@ struct SaveGameHeader { TimeDate dateTime; bool scnFlag; byte language; + uint16 numInterpreters; // Savegame version 2 or later only }; enum { DW1_SAVEGAME_ID = 0x44575399, // = 'DWSc' = "DiscWorld 1 ScummVM" DW2_SAVEGAME_ID = 0x44573253, // = 'DW2S' = "DiscWorld 2 ScummVM" - SAVEGAME_HEADER_SIZE = 4 + 4 + 4 + SG_DESC_LEN + 7 + 1 + 1 + SAVEGAME_HEADER_SIZE = 4 + 4 + 4 + SG_DESC_LEN + 7 + 1 + 1 + 2 }; #define SAVEGAME_ID (TinselV2 ? (uint32)DW2_SAVEGAME_ID : (uint32)DW1_SAVEGAME_ID) @@ -186,6 +186,15 @@ static bool syncSaveGameHeader(Common::Serializer &s, SaveGameHeader &hdr) { } } + // Handle the number of interpreter contexts that will be saved in the savegame + if (tmp >= 2) { + tmp -= 2; + hdr.numInterpreters = NUM_INTERPRET; + s.syncAsUint16LE(hdr.numInterpreters); + } else { + hdr.numInterpreters = (TinselV2 ? 70 : 64) - 20; + } + // Skip over any extra bytes s.skip(tmp); return true; @@ -262,7 +271,7 @@ static void syncSoundReel(Common::Serializer &s, SOUNDREELS &sr) { s.syncAsSint32LE(sr.actorCol); } -static void syncSavedData(Common::Serializer &s, SAVED_DATA &sd) { +static void syncSavedData(Common::Serializer &s, SAVED_DATA &sd, int numInterp) { s.syncAsUint32LE(sd.SavedSceneHandle); s.syncAsUint32LE(sd.SavedBgroundHandle); for (int i = 0; i < MAX_MOVERS; ++i) @@ -273,7 +282,7 @@ static void syncSavedData(Common::Serializer &s, SAVED_DATA &sd) { s.syncAsSint32LE(sd.NumSavedActors); s.syncAsSint32LE(sd.SavedLoffset); s.syncAsSint32LE(sd.SavedToffset); - for (int i = 0; i < NUM_INTERPRET; ++i) + for (int i = 0; i < numInterp; ++i) sd.SavedICInfo[i].syncWithSerializer(s); for (int i = 0; i < MAX_POLY; ++i) s.syncAsUint32LE(sd.SavedDeadPolys[i]); @@ -422,7 +431,7 @@ char *ListEntry(int i, letype which) { return NULL; } -static void DoSync(Common::Serializer &s) { +static bool DoSync(Common::Serializer &s, int numInterp) { int sg = 0; if (TinselV2) { @@ -434,7 +443,7 @@ static void DoSync(Common::Serializer &s) { if (TinselV2 && s.isLoading()) HoldItem(INV_NOICON); - syncSavedData(s, *g_srsd); + syncSavedData(s, *g_srsd, numInterp); syncGlobInfo(s); // Glitter globals syncInvInfo(s); // Inventory data @@ -443,6 +452,10 @@ static void DoSync(Common::Serializer &s) { sg = WhichItemHeld(); s.syncAsSint32LE(sg); if (s.isLoading()) { + if (sg != -1 && !GetIsInvObject(sg)) + // Not a valid inventory object, so return false + return false; + if (TinselV2) g_thingHeld = sg; else @@ -459,7 +472,7 @@ static void DoSync(Common::Serializer &s) { if (*g_SaveSceneSsCount != 0) { SAVED_DATA *sdPtr = g_SaveSceneSsData; for (int i = 0; i < *g_SaveSceneSsCount; ++i, ++sdPtr) - syncSavedData(s, *sdPtr); + syncSavedData(s, *sdPtr, numInterp); // Flag that there is a saved scene to return to. Note that in this context 'saved scene' // is a stored scene to return to from another scene, such as from the Summoning Book close-up @@ -469,6 +482,8 @@ static void DoSync(Common::Serializer &s) { if (!TinselV2) syncAllActorsAlive(s); + + return true; } /** @@ -487,8 +502,23 @@ static bool DoRestore() { delete f; // Invalid header, or savegame too new -> skip it return false; } + + // Load in the data. For older savegame versions, we potentially need to load the data twice, once + // for pre 1.5 savegames, and if that fails, a second time for 1.5 savegames + int numInterpreters = hdr.numInterpreters; + int32 currentPos = f->pos(); + for (int tryNumber = 0; tryNumber < ((hdr.ver >= 2) ? 1 : 2); ++tryNumber) { + // If it's the second loop iteration, try with the 1.5 savegame number of interpreter contexts + if (tryNumber == 1) { + f->seek(currentPos); + numInterpreters = 80; + } - DoSync(s); + // Load the savegame data + if (DoSync(s, numInterpreters)) + // Data load was successful (or likely), so break out of loop + break; + } uint32 id = f->readSint32LE(); if (id != (uint32)0xFEEDFACE) @@ -575,7 +605,7 @@ static void DoSave() { return; } - DoSync(s); + DoSync(s, hdr.numInterpreters); // Write out the special Id for Discworld savegames f->writeUint32LE(0xFEEDFACE); -- cgit v1.2.3 From aedd0d2a16bc06617c30a3ed1a2fa8f2bf88ba68 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Tue, 7 Aug 2012 10:23:31 +0100 Subject: SCI: Add missing QFG2 detection entry from bug #3554614. --- engines/sci/detection_tables.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 268914edba..ebfd66868c 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -3002,6 +3002,21 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Quest for Glory 2 - English DOS (supplied by digitoxin1 in bug report #3554614) + // 1.102 9x3.5" + {"qfg2", "", { + {"resource.map", 0, "367023314ea33e3156297402f6c1da49", 8166}, + {"resource.000", 0, "a17e374c4d33b81208c862bc0ffc1a38", 212119}, + {"resource.001", 0, "e08d7887e30b12008c40f9570447711a", 331995}, + {"resource.002", 0, "df137dc7869cab07e1149ba2333c815c", 467461}, + {"resource.003", 0, "df137dc7869cab07e1149ba2333c815c", 502560}, + {"resource.004", 0, "df137dc7869cab07e1149ba2333c815c", 488532}, + {"resource.005", 0, "df137dc7869cab07e1149ba2333c815c", 478574}, + {"resource.006", 0, "b1944bd664ddbd2859cdaa0c4a0d6281", 507489}, + {"resource.007", 0, "cd2de58e27665d5853530de93fae7cd6", 490794}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Quest for Glory 2 - English DOS Non-Interactive Demo // Executable scanning reports "1.000.046" {"qfg2", "Demo", { -- cgit v1.2.3 From 611905aa9718afd0320f518af6976d3316035622 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Tue, 7 Aug 2012 11:28:10 +0100 Subject: SCI: Add missing QFG1 detection entries from bug #3554611. --- engines/sci/detection_tables.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index ebfd66868c..11ece3decd 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2798,6 +2798,32 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy v1.102 (suppled by digitoxin1 in bug report #3554611) + // Note: Identical detection entry to English Amiga versions, so will trigger version choice dialog. + {"qfg1", "", { + {"resource.map", 0, "b162dbd4632250d4d83bed46d0783c10", 6396}, + {"resource.000", 0, "40332d3ebfc70a4b6a6a0443c2763287", 78800}, + {"resource.001", 0, "a270012fa74445d74c044d1b65a9ff8c", 459835}, + {"resource.002", 0, "e64004e020fdf1813be52b639b08be89", 635561}, + {"resource.003", 0, "f0af87c60ec869946da442833aa5afa8", 640502}, + {"resource.004", 0, "f0af87c60ec869946da442833aa5afa8", 644575}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + + // Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy v1.102 (suppled by digitoxin1 in bug report #3554611) + {"qfg1", "", { + {"resource.map", 0, "5772a2c1bfae46f26582582c9901121e", 6858}, + {"resource.000", 0, "40332d3ebfc70a4b6a6a0443c2763287", 78800}, + {"resource.001", 0, "a270012fa74445d74c044d1b65a9ff8c", 75090}, + {"resource.002", 0, "d22695c53835dfdece056d86f26c251e", 271354}, + {"resource.003", 0, "3cd085e27078f269b3ece5838812ff41", 258084}, + {"resource.004", 0, "8927c7a04a78f1e76f342db3ccc9d879", 267835}, + {"resource.005", 0, "13d16cc9b90b51e2c8643cdf52a62957", 268807}, + {"resource.006", 0, "48b2b3c964dcbeccb68e984e6d4e97db", 278473}, + {"resource.007", 0, "f0af87c60ec869946da442833aa5afa8", 269237}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy (supplied by markcoolio in bug report #2723843) // Executable scanning reports "0.000.566" {"qfg1", "", { -- cgit v1.2.3 From 78310d0f4b546081fceee2cf4ba72dd628fa7018 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Tue, 7 Aug 2012 19:07:01 +0200 Subject: TSAGE: Apply naming conventions to surfaceGetArea(). Thanks to somaen for reporting it. --- engines/tsage/blue_force/blueforce_dialogs.cpp | 4 ++-- engines/tsage/converse.cpp | 2 +- engines/tsage/dialogs.cpp | 2 +- engines/tsage/graphics.cpp | 6 +++--- engines/tsage/graphics.h | 2 +- engines/tsage/ringworld/ringworld_dialogs.cpp | 4 ++-- engines/tsage/ringworld/ringworld_logic.cpp | 2 +- engines/tsage/ringworld2/ringworld2_dialogs.cpp | 2 +- engines/tsage/user_interface.cpp | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/engines/tsage/blue_force/blueforce_dialogs.cpp b/engines/tsage/blue_force/blueforce_dialogs.cpp index a76d5839a9..23701c9e5b 100644 --- a/engines/tsage/blue_force/blueforce_dialogs.cpp +++ b/engines/tsage/blue_force/blueforce_dialogs.cpp @@ -88,7 +88,7 @@ RightClickDialog::~RightClickDialog() { void RightClickDialog::draw() { // Save the covered background area - _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + _savedArea = surfaceGetArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); // Draw the dialog image g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top); @@ -323,7 +323,7 @@ void AmmoBeltDialog::draw() { if (!_savedArea) { // Save the covered background area - _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + _savedArea = surfaceGetArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); } else { bounds.moveTo(0, 0); } diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp index 06fbffb751..ba27db9104 100644 --- a/engines/tsage/converse.cpp +++ b/engines/tsage/converse.cpp @@ -505,7 +505,7 @@ void ConversationChoiceDialog::draw() { // Make a backup copy of the area the dialog will occupy Rect tempRect = _bounds; tempRect.collapse(-10, -10); - _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), tempRect); + _savedArea = surfaceGetArea(g_globals->_gfxManagerInstance.getSurface(), tempRect); // Fill in the contents of the entire dialog _gfxManager._bounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp index 972d591c34..77ac0a25d7 100644 --- a/engines/tsage/dialogs.cpp +++ b/engines/tsage/dialogs.cpp @@ -116,7 +116,7 @@ void ModalDialog::draw() { // Make a backup copy of the area the dialog will occupy Rect tempRect = _bounds; tempRect.collapse(-10, -10); - _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), tempRect); + _savedArea = surfaceGetArea(g_globals->_gfxManagerInstance.getSurface(), tempRect); _gfxManager.activate(); diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 0781ae4544..fb0b0b0cbb 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -38,7 +38,7 @@ namespace TsAGE { * @src Source surface * @bounds Area to backup */ -GfxSurface *Surface_getArea(GfxSurface &src, const Rect &bounds) { +GfxSurface *surfaceGetArea(GfxSurface &src, const Rect &bounds) { assert(bounds.isValidRect()); GfxSurface *dest = new GfxSurface(); dest->create(bounds.width(), bounds.height()); @@ -437,7 +437,7 @@ bool GfxSurface::displayText(const Common::String &msg, const Common::Point &pt) // Make a backup copy of the area the text will occupy Rect saveRect = textRect; saveRect.collapse(-20, -8); - GfxSurface *savedArea = Surface_getArea(gfxManager.getSurface(), saveRect); + GfxSurface *savedArea = surfaceGetArea(gfxManager.getSurface(), saveRect); // Display the text gfxManager._font.writeLines(msg.c_str(), textRect, ALIGN_LEFT); @@ -1073,7 +1073,7 @@ void GfxDialog::draw() { Rect tempRect(_bounds); // Make a backup copy of the area the dialog will occupy - _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + _savedArea = surfaceGetArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); // Set the palette for use in the dialog setPalette(); diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h index 9c6f13e407..9175b1050a 100644 --- a/engines/tsage/graphics.h +++ b/engines/tsage/graphics.h @@ -339,7 +339,7 @@ public: static void setPalette(); }; -GfxSurface *Surface_getArea(GfxSurface &src, const Rect &bounds); +GfxSurface *surfaceGetArea(GfxSurface &src, const Rect &bounds); GfxSurface surfaceFromRes(const byte *imgData); GfxSurface surfaceFromRes(int resNum, int rlbNum, int subNum); diff --git a/engines/tsage/ringworld/ringworld_dialogs.cpp b/engines/tsage/ringworld/ringworld_dialogs.cpp index 0e451b8429..4728e66cd9 100644 --- a/engines/tsage/ringworld/ringworld_dialogs.cpp +++ b/engines/tsage/ringworld/ringworld_dialogs.cpp @@ -59,7 +59,7 @@ void RightClickButton::highlight() { _savedButton = NULL; } else { // Highlight button by getting the needed highlighted image resource - _savedButton = Surface_getArea(g_globals->gfxManager().getSurface(), _bounds); + _savedButton = surfaceGetArea(g_globals->gfxManager().getSurface(), _bounds); uint size; byte *imgData = g_resourceManager->getSubResource(7, 2, _buttonIndex, &size); @@ -122,7 +122,7 @@ RightClickButton *RightClickDialog::findButton(const Common::Point &pt) { void RightClickDialog::draw() { // Save the covered background area - _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + _savedArea = surfaceGetArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); // Draw the dialog image g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top); diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp index 00c219f2ee..7d571b40d7 100644 --- a/engines/tsage/ringworld/ringworld_logic.cpp +++ b/engines/tsage/ringworld/ringworld_logic.cpp @@ -295,7 +295,7 @@ void SceneArea::display() { _bounds.setWidth(_surface.getBounds().width()); _bounds.setHeight(_surface.getBounds().height()); - _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + _savedArea = surfaceGetArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); draw2(); } diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.cpp b/engines/tsage/ringworld2/ringworld2_dialogs.cpp index 30ae6be7b1..478fdcf5a5 100644 --- a/engines/tsage/ringworld2/ringworld2_dialogs.cpp +++ b/engines/tsage/ringworld2/ringworld2_dialogs.cpp @@ -85,7 +85,7 @@ RightClickDialog::~RightClickDialog() { void RightClickDialog::draw() { // Save the covered background area - _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + _savedArea = surfaceGetArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); // Draw the dialog image g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top); diff --git a/engines/tsage/user_interface.cpp b/engines/tsage/user_interface.cpp index 10cb6961dc..4bd9e49875 100644 --- a/engines/tsage/user_interface.cpp +++ b/engines/tsage/user_interface.cpp @@ -112,7 +112,7 @@ void UIQuestion::showItem(int resNum, int rlbNum, int frameNum) { imgRect.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); // Save the area behind where the image will be displayed - GfxSurface *savedArea = Surface_getArea(GLOBALS.gfxManager().getSurface(), imgRect); + GfxSurface *savedArea = surfaceGetArea(GLOBALS.gfxManager().getSurface(), imgRect); // Draw the image GLOBALS.gfxManager().copyFrom(objImage, imgRect); -- cgit v1.2.3 From 220ca52f4329ad3c1344c38e23280fde4570bd89 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 7 Aug 2012 14:24:32 -0400 Subject: VIDEO: Fix getTime() when a video is not playing --- video/video_decoder.cpp | 20 +++++++++++++------- video/video_decoder.h | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 84ce8144a0..44b05c4345 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -102,6 +102,7 @@ AdvancedVideoDecoder::AdvancedVideoDecoder() { _audioBalance = 0; _pauseLevel = 0; _needsUpdate = false; + _lastTimeChange = 0; // Find the best format for output _defaultHighColorFormat = g_system->getScreenFormat(); @@ -126,6 +127,7 @@ void AdvancedVideoDecoder::close() { _audioBalance = 0; _pauseLevel = 0; _needsUpdate = false; + _lastTimeChange = 0; } bool AdvancedVideoDecoder::isVideoLoaded() const { @@ -201,6 +203,9 @@ uint32 AdvancedVideoDecoder::getFrameCount() const { } uint32 AdvancedVideoDecoder::getTime() const { + if (!isPlaying()) + return _lastTimeChange.msecs(); + if (isPaused()) return _pauseStartTime - _startTime; @@ -210,7 +215,7 @@ uint32 AdvancedVideoDecoder::getTime() const { uint32 time = ((const AudioTrack *)*it)->getRunningTime(); if (time != 0) - return time + _audioStartOffset.msecs(); + return time + _lastTimeChange.msecs(); } } } @@ -278,7 +283,7 @@ bool AdvancedVideoDecoder::rewind() { if (isPlaying()) startAudio(); - _audioStartOffset = 0; + _lastTimeChange = 0; _startTime = g_system->getMillis(); resetPauseStartTime(); return true; @@ -313,7 +318,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { if (isPlaying()) startAudio(); - _audioStartOffset = time; + _lastTimeChange = time; _startTime = g_system->getMillis() - time.msecs(); resetPauseStartTime(); _needsUpdate = true; @@ -326,7 +331,7 @@ void AdvancedVideoDecoder::start() { _isPlaying = true; _startTime = g_system->getMillis(); - _audioStartOffset = 0; + _lastTimeChange = 0; // If someone previously called stop(), we'll rewind it. if (_needsRewind) @@ -341,7 +346,6 @@ void AdvancedVideoDecoder::stop() { _isPlaying = false; _startTime = 0; - _audioStartOffset = 0; _palette = 0; _dirtyPalette = false; _needsUpdate = false; @@ -354,10 +358,12 @@ void AdvancedVideoDecoder::stop() { // If this is a rewindable video, don't close it too. We'll just rewind() the video // the next time someone calls start(). Otherwise, since it can't be rewound, we // just close it. - if (isRewindable()) + if (isRewindable()) { + _lastTimeChange = getTime(); _needsRewind = true; - else + } else { close(); + } } Audio::Timestamp AdvancedVideoDecoder::getDuration() const { diff --git a/video/video_decoder.h b/video/video_decoder.h index ad9825cb25..26078d5750 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -773,7 +773,7 @@ private: // Current playback status bool _isPlaying, _needsRewind, _needsUpdate; - Audio::Timestamp _audioStartOffset; + Audio::Timestamp _lastTimeChange; // Palette settings from individual tracks mutable bool _dirtyPalette; -- cgit v1.2.3 From d83382a9ef92cd485438873c98f420b794190ff7 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Tue, 7 Aug 2012 19:27:22 +0100 Subject: SCI: Add extra comments to new detection entries. No functional changes. --- engines/sci/detection_tables.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 11ece3decd..10f89a94e2 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2798,7 +2798,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, - // Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy v1.102 (suppled by digitoxin1 in bug report #3554611) + // Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy v1.102 Int#0.000.629 (suppled by digitoxin1 in bug report #3554611) // Note: Identical detection entry to English Amiga versions, so will trigger version choice dialog. {"qfg1", "", { {"resource.map", 0, "b162dbd4632250d4d83bed46d0783c10", 6396}, @@ -2810,7 +2810,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, - // Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy v1.102 (suppled by digitoxin1 in bug report #3554611) + // Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy v1.102 Int#0.000.629 (suppled by digitoxin1 in bug report #3554611) {"qfg1", "", { {"resource.map", 0, "5772a2c1bfae46f26582582c9901121e", 6858}, {"resource.000", 0, "40332d3ebfc70a4b6a6a0443c2763287", 78800}, @@ -3029,7 +3029,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Quest for Glory 2 - English DOS (supplied by digitoxin1 in bug report #3554614) - // 1.102 9x3.5" + // v1.102 9x3.5" (label: Int#11.20.90) {"qfg2", "", { {"resource.map", 0, "367023314ea33e3156297402f6c1da49", 8166}, {"resource.000", 0, "a17e374c4d33b81208c862bc0ffc1a38", 212119}, -- cgit v1.2.3 From 546e2086e32c42602cede84c961bbacab75ebdb4 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Tue, 7 Aug 2012 21:01:33 +0200 Subject: SCI: Remove duplicate detection entry There is no indication in the corresponding bug report this was for an Amiga version. --- engines/sci/detection_tables.h | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 10f89a94e2..b39dad118e 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2799,7 +2799,6 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy v1.102 Int#0.000.629 (suppled by digitoxin1 in bug report #3554611) - // Note: Identical detection entry to English Amiga versions, so will trigger version choice dialog. {"qfg1", "", { {"resource.map", 0, "b162dbd4632250d4d83bed46d0783c10", 6396}, {"resource.000", 0, "40332d3ebfc70a4b6a6a0443c2763287", 78800}, @@ -2911,17 +2910,6 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, - // Quest for Glory 1 (from abevi, bug report #2612718) - {"qfg1", "", { - {"resource.map", 0, "b162dbd4632250d4d83bed46d0783c10", 6396}, - {"resource.000", 0, "40332d3ebfc70a4b6a6a0443c2763287", 78800}, - {"resource.001", 0, "a270012fa74445d74c044d1b65a9ff8c", 459835}, - {"resource.002", 0, "e64004e020fdf1813be52b639b08be89", 635561}, - {"resource.003", 0, "f0af87c60ec869946da442833aa5afa8", 640502}, - {"resource.004", 0, "f0af87c60ec869946da442833aa5afa8", 644575}, - AD_LISTEND}, - Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, - // Quest for Glory 1 - English DOS // SCI interpreter version 0.000.629 {"qfg1", "", { -- cgit v1.2.3 From 4cd34733a39fd64964c6d50a108d2c9e12634385 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Wed, 8 Aug 2012 13:37:32 +0100 Subject: OPENGL: GL_BGRA does not exist in every GLES implementation. * It definately does not exist in the GLES implementations I can test with. * Don't configure if USE_GLES is set. --- backends/graphics/opengl/opengl-graphics.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index dce902d894..c99652d2bd 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -918,11 +918,6 @@ void OpenGLGraphicsManager::getGLPixelFormat(Graphics::PixelFormat pixelFormat, intFormat = GL_RGBA; glFormat = GL_RGBA; gltype = GL_UNSIGNED_SHORT_5_5_5_1; - } else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)) { // RGB555 - bpp = 2; - intFormat = GL_RGB; - glFormat = GL_BGRA; - gltype = GL_UNSIGNED_SHORT_1_5_5_5_REV; } else if (pixelFormat == Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0)) { // RGBA4444 bpp = 2; intFormat = GL_RGBA; @@ -936,6 +931,13 @@ void OpenGLGraphicsManager::getGLPixelFormat(Graphics::PixelFormat pixelFormat, glFormat = GL_RGB; gltype = GL_UNSIGNED_BYTE; #ifndef USE_GLES + } else if (pixelFormat == Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)) { // RGB555 + // GL_BGRA does not exist in every GLES implementation so should not be configured if + // USE_GLES is set. + bpp = 2; + intFormat = GL_RGB; + glFormat = GL_BGRA; + gltype = GL_UNSIGNED_SHORT_1_5_5_5_REV; } else if (pixelFormat == Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24)) { // ARGB8888 bpp = 4; intFormat = GL_RGBA; -- cgit v1.2.3 From fbf193f7562924e450961d92156fa915e8d69a68 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Wed, 8 Aug 2012 13:49:48 +0100 Subject: CONFIGURE: Add case for selecting OpenGL ES support on the OpenPandora. --- configure | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/configure b/configure index ffcd0c1d6c..06492ff305 100755 --- a/configure +++ b/configure @@ -3501,6 +3501,21 @@ define_in_config_if_yes "$_freetype2" "USE_FREETYPE2" # Check for OpenGL (ES) # echocheck "OpenGL" + +case $_backend in + openpandora) + # Only enable OpenGL ES on the OpanPandora if --enable-opengl is passed in explicitly. + if test "$_opengl" = yes ; then + _opengl=yes + _opengles=yes + OPENGL_LIBS="-lGLES_CM -lEGL -lX11" + OPENGL_CFLAGS="$OPENGL_LIBS" + LIBS="$LIBS $OPENGL_LIBS" + INCLUDES="$INCLUDES $OPENGL_CFLAGS" + fi + ;; +esac + if test "$_opengl" = auto ; then _opengl=no if test "$_backend" = "sdl" ; then -- cgit v1.2.3 From 5521261fdebb9388026457d7c2a92ad6abc149f1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 9 Aug 2012 03:09:01 +0200 Subject: OPENGL: Fix RGBA8888 mode setup. --- backends/graphics/opengl/opengl-graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index c99652d2bd..48e2663d44 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -902,7 +902,7 @@ void OpenGLGraphicsManager::getGLPixelFormat(Graphics::PixelFormat pixelFormat, bpp = 4; intFormat = GL_RGBA; glFormat = GL_RGBA; - gltype = GL_UNSIGNED_BYTE; + gltype = GL_UNSIGNED_INT_8_8_8_8; } else if (pixelFormat == Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0)) { // RGB888 bpp = 3; intFormat = GL_RGB; -- cgit v1.2.3 From b4196e48b16c458ef6564a051495525ff5a282f0 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 30 Jul 2012 21:31:14 +0200 Subject: GRAPHICS: Add a DPI parameter to loadTTFFont. Will be used by WME. --- graphics/fonts/ttf.cpp | 10 +++++----- graphics/fonts/ttf.h | 2 +- gui/ThemeEngine.cpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/graphics/fonts/ttf.cpp b/graphics/fonts/ttf.cpp index 96241e923c..2b1dca1eae 100644 --- a/graphics/fonts/ttf.cpp +++ b/graphics/fonts/ttf.cpp @@ -101,7 +101,7 @@ public: TTFFont(); virtual ~TTFFont(); - bool load(Common::SeekableReadStream &stream, int size, bool monochrome, const uint32 *mapping); + bool load(Common::SeekableReadStream &stream, int size, uint dpi, bool monochrome, const uint32 *mapping); virtual int getFontHeight() const; @@ -157,7 +157,7 @@ TTFFont::~TTFFont() { } } -bool TTFFont::load(Common::SeekableReadStream &stream, int size, bool monochrome, const uint32 *mapping) { +bool TTFFont::load(Common::SeekableReadStream &stream, int size, uint dpi, bool monochrome, const uint32 *mapping) { if (!g_ttf.isInitialized()) return false; @@ -195,7 +195,7 @@ bool TTFFont::load(Common::SeekableReadStream &stream, int size, bool monochrome // Check whether we have kerning support _hasKerning = (FT_HAS_KERNING(_face) != 0); - if (FT_Set_Char_Size(_face, 0, size * 64, 0, 0)) { + if (FT_Set_Char_Size(_face, 0, size * 64, dpi, dpi)) { delete[] _ttfFile; _ttfFile = 0; @@ -462,10 +462,10 @@ bool TTFFont::cacheGlyph(Glyph &glyph, FT_UInt &slot, uint chr) { return true; } -Font *loadTTFFont(Common::SeekableReadStream &stream, int size, bool monochrome, const uint32 *mapping) { +Font *loadTTFFont(Common::SeekableReadStream &stream, int size, uint dpi, bool monochrome, const uint32 *mapping) { TTFFont *font = new TTFFont(); - if (!font->load(stream, size, monochrome, mapping)) { + if (!font->load(stream, size, dpi, monochrome, mapping)) { delete font; return 0; } diff --git a/graphics/fonts/ttf.h b/graphics/fonts/ttf.h index ec7dbe04ef..e1464b1f45 100644 --- a/graphics/fonts/ttf.h +++ b/graphics/fonts/ttf.h @@ -32,7 +32,7 @@ namespace Graphics { class Font; -Font *loadTTFFont(Common::SeekableReadStream &stream, int size, bool monochrome = false, const uint32 *mapping = 0); +Font *loadTTFFont(Common::SeekableReadStream &stream, int size, uint dpi = 0, bool monochrome = false, const uint32 *mapping = 0); void shutdownTTF(); diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index e37022f5f1..2fff92c263 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -1422,7 +1422,7 @@ const Graphics::Font *ThemeEngine::loadScalableFont(const Common::String &filena for (Common::ArchiveMemberList::const_iterator i = members.begin(), end = members.end(); i != end; ++i) { Common::SeekableReadStream *stream = (*i)->createReadStream(); if (stream) { - font = Graphics::loadTTFFont(*stream, pointsize, false, + font = Graphics::loadTTFFont(*stream, pointsize, 0, false, #ifdef USE_TRANSLATION TransMan.getCharsetMapping() #else -- cgit v1.2.3 From 84426c63553f94c26fa299dc2659cec16c24cd3f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 9 Aug 2012 03:25:14 +0200 Subject: AUDIO: Fix "if" formatting in QDM2 code. --- audio/decoders/qdm2.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/audio/decoders/qdm2.cpp b/audio/decoders/qdm2.cpp index 31405d3ab1..732de311aa 100644 --- a/audio/decoders/qdm2.cpp +++ b/audio/decoders/qdm2.cpp @@ -689,7 +689,7 @@ static int getVlc2(Common::BitStream *s, int16 (*table)[2], int bits, int maxDep code = table[index][0]; n = table[index][1]; - if(maxDepth > 2 && n < 0) { + if (maxDepth > 2 && n < 0) { s->skip(nbBits); index = s->getBits(-n) + code; code = table[index][0]; @@ -861,9 +861,9 @@ void initVlcSparse(VLC *vlc, int nb_bits, int nb_codes, const void *symbols, int symbols_wrap, int symbols_size) { vlc->bits = nb_bits; - if(vlc->table_size && vlc->table_size == vlc->table_allocated) { + if (vlc->table_size && vlc->table_size == vlc->table_allocated) { return; - } else if(vlc->table_size) { + } else if (vlc->table_size) { error("called on a partially initialized table"); } @@ -1353,7 +1353,7 @@ void QDM2Stream::fix_coding_method_array(int sb, int channels, sb_int8_array cod for (ch = 0; ch < channels; ch++) { for (j = 0; j < 64; ) { - if((coding_method[ch][sb][j] - 8) > 22) { + if ((coding_method[ch][sb][j] - 8) > 22) { run = 1; case_val = 8; } else { -- cgit v1.2.3 From 73598c64dc317362c5fd534485b6a083aa1531f1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 9 Aug 2012 03:25:37 +0200 Subject: CREATE_PROJECT: Fix "if" formatting. --- devtools/create_project/xcode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index 0574814e02..62dd417d8c 100644 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -917,7 +917,7 @@ std::string XCodeProvider::writeSetting(const std::string &variable, const Setti for (unsigned int i = 0, count = 0; i < setting.entries.size(); ++i) { std::string value = setting.entries.at(i).value; - if(!value.empty()) { + if (!value.empty()) { if (count++ > 0) output += "," + newline; -- cgit v1.2.3 From 8aa8cb4dd661ec39dd5f03e39f2ed19e4968ff2c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 9 Aug 2012 03:25:55 +0200 Subject: DINGUX: Fix "if" formatting. --- backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp index 205dcfdbec..f515343d3c 100644 --- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp +++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp @@ -432,7 +432,7 @@ bool DINGUXSdlGraphicsManager::loadGFXMode() { // Forcefully disable aspect ratio correction for games // which starts with a native 240px height resolution. // This fixes games with weird resolutions, like MM Nes (256x240) - if(_videoMode.screenHeight == 240) { + if (_videoMode.screenHeight == 240) { _videoMode.aspectRatioCorrection = false; } -- cgit v1.2.3 From 18ab9a1ef12aa2d929245e14d2e04aaf05437247 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 9 Aug 2012 03:26:55 +0200 Subject: TSAGE: Fix "if" formatting. --- engines/tsage/ringworld/ringworld_scenes5.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/tsage/ringworld/ringworld_scenes5.cpp b/engines/tsage/ringworld/ringworld_scenes5.cpp index 3b415bdb6a..004ccbbb6d 100644 --- a/engines/tsage/ringworld/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld/ringworld_scenes5.cpp @@ -1893,7 +1893,7 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _olloFace.setStrip(4); _olloFace.fixPriority(152); - if(g_globals->_sceneManager._previousScene == 4050) { + if (g_globals->_sceneManager._previousScene == 4050) { g_globals->_soundHandler.play(155); g_globals->_player.setPosition(Common::Point(72, 128)); g_globals->_player.enableControl(); -- cgit v1.2.3 From 571fa943106009b99a39bbe0a729f9c32afa8a9a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 9 Aug 2012 03:27:21 +0200 Subject: TESTBED: Fix "if" formatting. --- engines/testbed/graphics.cpp | 4 ++-- engines/testbed/testsuite.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/testbed/graphics.cpp b/engines/testbed/graphics.cpp index 082694b728..590e6c6d81 100644 --- a/engines/testbed/graphics.cpp +++ b/engines/testbed/graphics.cpp @@ -1028,7 +1028,7 @@ TestExitStatus GFXtests::paletteRotation() { GFXTestSuite::setCustomColor(255, 0, 0); Testsuite::clearScreen(); - if(Testsuite::handleInteractiveInput("Did you see a rotation in colors of rectangles displayed on screen?", "Yes", "No", kOptionRight)) { + if (Testsuite::handleInteractiveInput("Did you see a rotation in colors of rectangles displayed on screen?", "Yes", "No", kOptionRight)) { return kTestFailed; } @@ -1121,7 +1121,7 @@ TestExitStatus GFXtests::pixelFormats() { g_system->updateScreen(); g_system->delayMillis(500); - if(Testsuite::handleInteractiveInput("Were you able to notice the colored rectangles on the screen for this format?", "Yes", "No", kOptionLeft)) { + if (Testsuite::handleInteractiveInput("Were you able to notice the colored rectangles on the screen for this format?", "Yes", "No", kOptionLeft)) { numPassed++; } else { numFailed++; diff --git a/engines/testbed/testsuite.cpp b/engines/testbed/testsuite.cpp index 655179aa74..39eeca31bd 100644 --- a/engines/testbed/testsuite.cpp +++ b/engines/testbed/testsuite.cpp @@ -289,7 +289,7 @@ void Testsuite::execute() { continue; } - if((*i)->isInteractive && !ConfParams.isSessionInteractive()) { + if ((*i)->isInteractive && !ConfParams.isSessionInteractive()) { logPrintf("Info! Skipping Test: %s, non-interactive environment is selected\n", ((*i)->featureName).c_str()); _numTestsSkipped++; continue; -- cgit v1.2.3 From 92b5ee0a48e7393220e7f89d58e241565e9d00af Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Thu, 9 Aug 2012 23:19:46 -0700 Subject: CINE: Fix masking in Operation Stealth. --- engines/cine/gfx.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++-------- engines/cine/gfx.h | 2 ++ 2 files changed, 86 insertions(+), 15 deletions(-) diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index 918d522606..b22e57400d 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -1235,14 +1235,8 @@ void OSRenderer::renderOverlay(const Common::List::iterator &it) { break; } sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame]; - len = sprite->_realWidth * sprite->_height; - mask = new byte[len]; - generateMask(sprite->data(), mask, len, g_cine->_objectTable[it->objIdx].part); - remaskSprite(mask, it); - drawMaskedSprite(g_cine->_objectTable[it->objIdx], mask); - delete[] mask; + drawSprite(&(*it), sprite->data(), sprite->_realWidth, sprite->_height, _backBuffer, g_cine->_objectTable[it->objIdx].x, g_cine->_objectTable[it->objIdx].y, g_cine->_objectTable[it->objIdx].part, sprite->_bpp); break; - // game message case 2: if (it->objIdx >= g_cine->_messageTable.size()) { @@ -1290,14 +1284,6 @@ void OSRenderer::renderOverlay(const Common::List::iterator &it) { maskBgOverlay(_bgTable[it->x].bg, sprite->data(), sprite->_realWidth, sprite->_height, _backBuffer, obj->x, obj->y); break; - // FIXME: Implement correct drawing of type 21 overlays. - // Type 21 overlays aren't just filled rectangles, I found their drawing routine - // from Operation Stealth's drawSprite routine. So they're likely some kind of sprites - // and it's just a coincidence that the oxygen meter during the first arcade sequence - // works even somehow currently. I tried the original under DOSBox and the oxygen gauge - // is a long red bar that gets shorter as the air runs out. - case 21: - // A filled rectangle: case 22: // TODO: Check it this implementation really works correctly (Some things might be wrong, needs testing). assert(it->objIdx < NUM_MAX_OBJECT); @@ -1752,6 +1738,89 @@ void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int1 } } +void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp) +{ + byte* pMask = NULL; + + // draw the mask based on next objects in the list + Common::List::iterator it; + for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it) + { + if(&(*it) == overlayPtr) + { + break; + } + } + + while(it != g_cine->_overlayList.end()) + { + overlay* pCurrentOverlay = &(*it); + if((pCurrentOverlay->type==5) || ((pCurrentOverlay->type==21) && (pCurrentOverlay->x==overlayPtr->objIdx))) + { + AnimData* sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame]; + + if(pMask == NULL) + { + pMask = new byte[width*height]; + + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + byte spriteColor= spritePtr[width*i+j]; + pMask[width*i+j] = spriteColor; + } + } + } + + for (int i = 0; i < sprite->_realWidth; i++) { + for (int j = 0; j < sprite->_height; j++) { + int inMaskX = (g_cine->_objectTable[it->objIdx].x+i) - x; + int inMaskY = (g_cine->_objectTable[it->objIdx].y+j) - y; + + if(inMaskX >=0 && inMaskX < width) + { + if(inMaskY >=0 && inMaskY < height) + { + if(sprite->_bpp == 1) + { + if(!sprite->getColor(i, j)) + { + pMask[inMaskY*width+inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320]; + } + } + } + } + } + } + + + } + it++; + } + + // now, draw with the mask we created + if(pMask) + { + spritePtr = pMask; + } + { + for (int i = 0; i < height; i++) { + byte *destPtr = page + x + y * 320; + destPtr += i * 320; + + for (int j = 0; j < width; j++) { + byte color= *(spritePtr++); + if ((transparentColor != color) && x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200) { + *(destPtr++) = color; + } else { + destPtr++; + } + } + } + } + + delete[] pMask; +}; + void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height, byte *page, int16 x, int16 y) { int16 i, j; diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h index 737c49cc36..8b21d839e4 100644 --- a/engines/cine/gfx.h +++ b/engines/cine/gfx.h @@ -223,6 +223,7 @@ private: protected: void drawSprite(const ObjectStruct &obj); + void drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp); int drawChar(char character, int x, int y); void drawBackground(); void renderOverlay(const Common::List::iterator &it); @@ -291,6 +292,7 @@ void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int1 void gfxDrawPlainBoxRaw(int16 x1, int16 y1, int16 x2, int16 y2, byte color, byte *page); void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height, byte *page, int16 x, int16 y); void maskBgOverlay(const byte *spritePtr, const byte *maskPtr, int16 width, int16 height, byte *page, int16 x, int16 y); +void drawOsSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp); void fadeFromBlack(); void fadeToBlack(); -- cgit v1.2.3 From c6c7b16089517917da755b02683a17712ffa39a2 Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Thu, 9 Aug 2012 23:24:17 -0700 Subject: CINE: Slight cleanup. --- engines/cine/gfx.cpp | 3 +-- engines/cine/gfx.h | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index b22e57400d..742c6606b0 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -1225,7 +1225,6 @@ void OSRenderer::renderOverlay(const Common::List::iterator &it) { int len, idx, width, height; ObjectStruct *obj; AnimData *sprite; - byte *mask; byte color; switch (it->type) { @@ -1819,7 +1818,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi } delete[] pMask; -}; +} void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height, byte *page, int16 x, int16 y) { int16 i, j; diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h index 8b21d839e4..6ff5b08b77 100644 --- a/engines/cine/gfx.h +++ b/engines/cine/gfx.h @@ -292,7 +292,6 @@ void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int1 void gfxDrawPlainBoxRaw(int16 x1, int16 y1, int16 x2, int16 y2, byte color, byte *page); void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height, byte *page, int16 x, int16 y); void maskBgOverlay(const byte *spritePtr, const byte *maskPtr, int16 width, int16 height, byte *page, int16 x, int16 y); -void drawOsSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp); void fadeFromBlack(); void fadeToBlack(); -- cgit v1.2.3 From 2d1a63c9305db01049ac0642169ac995442e77f8 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sat, 11 Aug 2012 17:37:14 +0100 Subject: SCI: Add KQ5 Spanish DOS detection entry from bug #3555646. --- engines/sci/detection_tables.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index b39dad118e..d739891e8f 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1326,6 +1326,21 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // King's Quest 5 DOS Spanish Floppy 0.000.062 VGA (5 x 3.5" disks) + // Supplied by dianiu in bug report #3555646 + {"kq5", "", { + {"resource.map", 0, "c09896a2a30c9b002c5cbbc62f5a5c3a", 8169}, + {"resource.000", 0, "1f1d03aead44da46362ff40c0074a3ec", 335871}, + {"resource.001", 0, "d1803ad904127ae091edb274ee8c047f", 1180637}, + {"resource.002", 0, "d9cd5972016f650cc31fb7c2a2b0953a", 1102207}, + {"resource.003", 0, "829c8caeff793f3cfcea2cb01aaa4150", 965586}, + {"resource.004", 0, "0bd9e570ee04b025e43d3075998fae5b", 1117965}, + {"resource.005", 0, "4aaa2e9a69089b9afbaaccbbf2c4e647", 1202936}, + {"resource.006", 0, "65b520e60c4217e6a6572d9edf77193b", 1141985}, + {"resource.007", 0, "f42b0100f0a1c30806814f8648b6bc28", 1145583}, + AD_LISTEND}, + Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // King's Quest 5 - German DOS Floppy (supplied by markcoolio in bug report #2727101, also includes english language) // SCI interpreter version 1.000.060 {"kq5", "", { -- cgit v1.2.3 From 1f91cc1aa0a21c80aa6d31934078b5d2a5e18f08 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sat, 11 Aug 2012 17:55:31 +0100 Subject: SCI: Add PQ3 Spanish DOS detection entry from bug #3555647. --- engines/sci/detection_tables.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index d739891e8f..b978f40aba 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2696,6 +2696,13 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Police Quest 3 - Spanish DOS v1.000 - Supplied by dianiu in bug report #3555647 + {"pq3", "", { + {"resource.map", 0, "ffa0b4631c4e36d69631256d19ba29e7", 5421}, + {"resource.000", 0, "5ee460af3d70c06a745cc482b6c783ba", 5410263}, + AD_LISTEND}, + Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, + // Police Quest 3 EGA // Reported by musiclyinspired in bug report #3046573 {"pq3", "", { -- cgit v1.2.3 From 21c057ce7545d9fbb1cd958d22cbce5716384882 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sat, 11 Aug 2012 20:08:03 +0100 Subject: CINE: Fix lockup in Scene 5 when "operate Girl" underwater. Traced with gdb to sound.cpp:792 i.e. _fadeOutTimer infinite loop. This bug was introduced by the addition of the MT-32 output driver for Future Wars and associated mutex changes. The _fadeOutTimer increment is done by the timer callback occuring during the load method call, but this was excluded by the mutex. Fixed by moving the mutex in the load method. --- engines/cine/sound.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/cine/sound.cpp b/engines/cine/sound.cpp index b2e992e8f6..52e1cdac7e 100644 --- a/engines/cine/sound.cpp +++ b/engines/cine/sound.cpp @@ -785,7 +785,6 @@ PCSoundFxPlayer::~PCSoundFxPlayer() { bool PCSoundFxPlayer::load(const char *song) { debug(9, "PCSoundFxPlayer::load('%s')", song); - Common::StackLock lock(_mutex); /* stop (w/ fade out) the previous song */ while (_fadeOutCounter != 0 && _fadeOutCounter < 100) { @@ -793,6 +792,8 @@ bool PCSoundFxPlayer::load(const char *song) { } _fadeOutCounter = 0; + Common::StackLock lock(_mutex); + stop(); _sfxData = readBundleSoundFile(song); -- cgit v1.2.3 From 78b8fa31ca49aae2218fb0bdd20fda28b99b15a9 Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sat, 11 Aug 2012 21:12:35 +0100 Subject: CINE: Fix typo in OS palette restore code. This fixes most cases of incorrect palette on savegame loading. Thanks to yaz0r for this fix. --- engines/cine/gfx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index 742c6606b0..8d73bae747 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -839,7 +839,7 @@ void OSRenderer::restorePalette(Common::SeekableReadStream &fHandle, int version fHandle.read(buf, kHighPalNumBytes); - if (colorCount == kHighPalNumBytes) { + if (colorCount == kHighPalNumColors) { // Load the active 256 color palette from file _activePal.load(buf, sizeof(buf), kHighPalFormat, kHighPalNumColors, CINE_LITTLE_ENDIAN); } else { -- cgit v1.2.3 From ab3b052c6f16843bda7bd1ded8a210d1192a389f Mon Sep 17 00:00:00 2001 From: D G Turner Date: Sun, 12 Aug 2012 00:19:44 +0100 Subject: GUI: Fix possible un-initialised variable usage in SaveLoadChooser. This was reported by valgrind, while looking at a different issue. --- gui/saveload.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 67d871e133..ac315cb6f6 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -44,6 +44,7 @@ enum { SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel, bool saveMode) : Dialog("SaveLoadChooser"), _delSupport(0), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { _delSupport = _metaInfoSupport = _thumbnailSupport = _saveDateSupport = _playTimeSupport = false; + _fillR = _fillG = _fillB = 0; _backgroundType = ThemeEngine::kDialogBackgroundSpecial; -- cgit v1.2.3 From 813689d68cd055935eaa12f614608d1237866b83 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 12 Aug 2012 00:08:13 -0400 Subject: AUDIO: Move LimitingAudioStream to audio/ --- audio/audiostream.cpp | 38 ++++++++++++++++++++++++++++++++++++++ audio/audiostream.h | 10 ++++++++++ audio/decoders/quicktime.cpp | 39 ++------------------------------------- 3 files changed, 50 insertions(+), 37 deletions(-) diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp index 1c5c435359..6e185702f0 100644 --- a/audio/audiostream.cpp +++ b/audio/audiostream.cpp @@ -386,4 +386,42 @@ Timestamp convertTimeToStreamPos(const Timestamp &where, int rate, bool isStereo return Timestamp(result.secs(), result.numberOfFrames(), result.framerate()); } +/** + * An AudioStream wrapper that cuts off the amount of samples read after a + * given time length is reached. + */ +class LimitingAudioStream : public AudioStream { +public: + LimitingAudioStream(AudioStream *parentStream, const Audio::Timestamp &length, DisposeAfterUse::Flag disposeAfterUse) : + _parentStream(parentStream), _samplesRead(0), _disposeAfterUse(disposeAfterUse), + _totalSamples(length.convertToFramerate(getRate()).totalNumberOfFrames() * getChannels()) {} + + ~LimitingAudioStream() { + if (_disposeAfterUse == DisposeAfterUse::YES) + delete _parentStream; + } + + int readBuffer(int16 *buffer, const int numSamples) { + // Cap us off so we don't read past _totalSamples + int samplesRead = _parentStream->readBuffer(buffer, MIN(numSamples, _totalSamples - _samplesRead)); + _samplesRead += samplesRead; + return samplesRead; + } + + bool endOfData() const { return _parentStream->endOfData() || _samplesRead >= _totalSamples; } + bool isStereo() const { return _parentStream->isStereo(); } + int getRate() const { return _parentStream->getRate(); } + +private: + int getChannels() const { return isStereo() ? 2 : 1; } + + AudioStream *_parentStream; + DisposeAfterUse::Flag _disposeAfterUse; + uint32 _totalSamples, _samplesRead; +}; + +AudioStream *makeLimitingAudioStream(AudioStream *parentStream, const Timestamp &length, DisposeAfterUse::Flag disposeAfterUse) { + return new LimitingAudioStream(parentStream, length, disposeAfterUse); +} + } // End of namespace Audio diff --git a/audio/audiostream.h b/audio/audiostream.h index 801f13d9d9..d6d4a16280 100644 --- a/audio/audiostream.h +++ b/audio/audiostream.h @@ -356,6 +356,16 @@ QueuingAudioStream *makeQueuingAudioStream(int rate, bool stereo); */ Timestamp convertTimeToStreamPos(const Timestamp &where, int rate, bool isStereo); +/** + * Factory function for an AudioStream wrapper that cuts off the amount of samples read after a + * given time length is reached. + * + * @param parentStream The stream to limit + * @param length The time length to limit the stream to + * @param disposeAfterUse Whether the parent stream object should be destroyed on destruction of the returned stream + */ +AudioStream *makeLimitingAudioStream(AudioStream *parentStream, const Timestamp &length, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); + } // End of namespace Audio #endif diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index 8874a61c2e..5276cfc530 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -61,41 +61,6 @@ private: bool _isStereo; }; -/** - * An AudioStream wrapper that cuts off the amount of samples read after a - * given time length is reached. - */ -class LimitingAudioStream : public AudioStream { -public: - LimitingAudioStream(AudioStream *parentStream, const Audio::Timestamp &length, - DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) : - _parentStream(parentStream), _samplesRead(0), _disposeAfterUse(disposeAfterUse), - _totalSamples(length.convertToFramerate(getRate()).totalNumberOfFrames() * getChannels()) {} - - ~LimitingAudioStream() { - if (_disposeAfterUse == DisposeAfterUse::YES) - delete _parentStream; - } - - int readBuffer(int16 *buffer, const int numSamples) { - // Cap us off so we don't read past _totalSamples - int samplesRead = _parentStream->readBuffer(buffer, MIN(numSamples, _totalSamples - _samplesRead)); - _samplesRead += samplesRead; - return samplesRead; - } - - bool endOfData() const { return _parentStream->endOfData() || _samplesRead >= _totalSamples; } - bool isStereo() const { return _parentStream->isStereo(); } - int getRate() const { return _parentStream->getRate(); } - -private: - int getChannels() const { return isStereo() ? 2 : 1; } - - AudioStream *_parentStream; - DisposeAfterUse::Flag _disposeAfterUse; - uint32 _totalSamples, _samplesRead; -}; - /** * An AudioStream wrapper that forces audio to be played in mono. * It currently just ignores the right channel if stereo. @@ -263,7 +228,7 @@ void QuickTimeAudioDecoder::QuickTimeAudioTrack::queueAudio(const Timestamp &len _skipSamples = Timestamp(); } - queueStream(new LimitingAudioStream(new SilentAudioStream(getRate(), isStereo()), editLength), editLength); + queueStream(makeLimitingAudioStream(new SilentAudioStream(getRate(), isStereo()), editLength), editLength); _curEdit++; enterNewEdit(nextEditTime); } else { @@ -289,7 +254,7 @@ void QuickTimeAudioDecoder::QuickTimeAudioTrack::queueAudio(const Timestamp &len // we move on to the next edit if (trackPosition >= nextEditTime || _curChunk >= _parentTrack->chunkCount) { chunkLength = nextEditTime.convertToFramerate(getRate()) - getCurrentTrackTime(); - stream = new LimitingAudioStream(stream, chunkLength); + stream = makeLimitingAudioStream(stream, chunkLength); _curEdit++; enterNewEdit(nextEditTime); -- cgit v1.2.3 From a458b91e7e4a1774d8dea1fe75966d834f43ee7b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 12 Aug 2012 00:09:23 -0400 Subject: VIDEO: Add set/getStopTime functions to AdvancedVideoDecoder A video can now be stopped at a requested time --- video/video_decoder.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++++++--- video/video_decoder.h | 22 ++++++++++---- 2 files changed, 88 insertions(+), 10 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 44b05c4345..b27a0c512b 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -103,6 +103,8 @@ AdvancedVideoDecoder::AdvancedVideoDecoder() { _pauseLevel = 0; _needsUpdate = false; _lastTimeChange = 0; + _stopTime = 0; + _stopTimeSet = false; // Find the best format for output _defaultHighColorFormat = g_system->getScreenFormat(); @@ -128,6 +130,8 @@ void AdvancedVideoDecoder::close() { _pauseLevel = 0; _needsUpdate = false; _lastTimeChange = 0; + _stopTime = 0; + _stopTimeSet = false; } bool AdvancedVideoDecoder::isVideoLoaded() const { @@ -247,6 +251,13 @@ bool AdvancedVideoDecoder::endOfVideo() const { if (!isVideoLoaded()) return true; + if (_stopTimeSet) { + const VideoTrack *track = findNextVideoTrack(); + + if (track && track->getNextFrameStartTime() >= (uint)_stopTime.msecs()) + return true; + } + for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) if (!(*it)->endOfTrack()) return false; @@ -314,12 +325,15 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { if (!(*it)->seek(time)) return false; + _lastTimeChange = time; + // Now that we've seeked, start all tracks again - if (isPlaying()) + // Also reset our start time + if (isPlaying()) { startAudio(); + _startTime = g_system->getMillis() - time.msecs(); + } - _lastTimeChange = time; - _startTime = g_system->getMillis() - time.msecs(); resetPauseStartTime(); _needsUpdate = true; return true; @@ -331,7 +345,10 @@ void AdvancedVideoDecoder::start() { _isPlaying = true; _startTime = g_system->getMillis(); - _lastTimeChange = 0; + + // Adjust start time if we've seeked to something besides zero time + if (_lastTimeChange.totalNumberOfFrames() != 0) + _startTime -= _lastTimeChange.msecs(); // If someone previously called stop(), we'll rewind it. if (_needsRewind) @@ -471,6 +488,21 @@ void AdvancedVideoDecoder::AudioTrack::stop() { g_system->getMixer()->stopHandle(_handle); } +void AdvancedVideoDecoder::AudioTrack::start(const Audio::Timestamp &limit) { + stop(); + + Audio::AudioStream *stream = getAudioStream(); + assert(stream); + + stream = Audio::makeLimitingAudioStream(stream, limit, DisposeAfterUse::NO); + + g_system->getMixer()->playStream(getSoundType(), &_handle, stream, -1, getVolume(), getBalance(), DisposeAfterUse::YES); + + // Pause the audio again if we're still paused + if (isPaused()) + g_system->getMixer()->pauseHandle(_handle, true); +} + uint32 AdvancedVideoDecoder::AudioTrack::getRunningTime() const { if (g_system->getMixer()->isSoundHandleActive(_handle)) return g_system->getMixer()->getSoundElapsedTime(_handle); @@ -553,6 +585,29 @@ bool AdvancedVideoDecoder::addStreamFileTrack(const Common::String &baseName) { return result; } +void AdvancedVideoDecoder::setStopTime(const Audio::Timestamp &stopTime) { + Audio::Timestamp startTime = 0; + + if (isPlaying()) { + startTime = getTime(); + stopAudio(); + } + + _stopTime = stopTime; + _stopTimeSet = true; + + if (startTime > stopTime) + return; + + if (isPlaying()) { + // We'll assume the audio track is going to start up at the same time it just was + // and therefore not do any seeking. + // Might want to set it anyway if we're seekable. + startAudioLimit(_stopTime.msecs() - startTime.msecs()); + _lastTimeChange = startTime; + } +} + AdvancedVideoDecoder::Track *AdvancedVideoDecoder::getTrack(uint track) { if (track > _tracks.size()) return 0; @@ -614,6 +669,13 @@ const AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack } void AdvancedVideoDecoder::startAudio() { + if (_stopTimeSet) { + // HACK: Timestamp's subtraction asserts out when subtracting two times + // with different rates. + startAudioLimit(_stopTime - _lastTimeChange.convertToFramerate(_stopTime.framerate())); + return; + } + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) if ((*it)->getTrackType() == Track::kTrackTypeAudio) ((AudioTrack *)*it)->start(); @@ -625,6 +687,12 @@ void AdvancedVideoDecoder::stopAudio() { ((AudioTrack *)*it)->stop(); } +void AdvancedVideoDecoder::startAudioLimit(const Audio::Timestamp &limit) { + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeAudio) + ((AudioTrack *)*it)->start(limit); +} + ////////////////////////////////////////////// ///////////////// DEPRECATED ///////////////// ////////////////////////////////////////////// diff --git a/video/video_decoder.h b/video/video_decoder.h index 26078d5750..7e89caee40 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -379,14 +379,20 @@ public: */ void setDefaultHighColorFormat(const Graphics::PixelFormat &format) { _defaultHighColorFormat = format; } + /** + * Set the time for this video to stop at. At this time in the video, + * all audio will stop and endOfVideo() will return true. + */ + void setStopTime(const Audio::Timestamp &stopTime); + + /** + * Get the stop time of the video (if not set, zero) + */ + Audio::Timestamp getStopTime() const { return _stopTime; } + // Future API //void setRate(const Common::Rational &rate); //Common::Rational getRate() const; - //void setStartTime(const Audio::Timestamp &startTime); - //Audio::Timestamp getStartTime() const; - //void setStopTime(const Audio::Timestamp &stopTime); - //Audio::Timestamp getStopTime() const; - //void setSegment(const Audio::Timestamp &startTime, const Audio::Timestamp &stopTime); protected: // Old API @@ -579,6 +585,8 @@ protected: */ void stop(); + void start(const Audio::Timestamp &limit); + /** * Get the volume for this track */ @@ -773,7 +781,8 @@ private: // Current playback status bool _isPlaying, _needsRewind, _needsUpdate; - Audio::Timestamp _lastTimeChange; + Audio::Timestamp _lastTimeChange, _stopTime; + bool _stopTimeSet; // Palette settings from individual tracks mutable bool _dirtyPalette; @@ -785,6 +794,7 @@ private: // Internal helper functions void stopAudio(); void startAudio(); + void startAudioLimit(const Audio::Timestamp &limit); }; /** -- cgit v1.2.3 From 61af435d8a870a0630b5dea2ecf69cd58fc95946 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sun, 12 Aug 2012 15:00:58 +1000 Subject: AGOS: Improve the quick load/save code. --- engines/agos/event.cpp | 6 +----- engines/agos/saveload.cpp | 44 +++++++++++++++++++++++++++++++------------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/engines/agos/event.cpp b/engines/agos/event.cpp index ed26b96381..cc1c40c207 100644 --- a/engines/agos/event.cpp +++ b/engines/agos/event.cpp @@ -467,11 +467,7 @@ void AGOSEngine::delay(uint amount) { memset(_saveLoadName, 0, sizeof(_saveLoadName)); sprintf(_saveLoadName, "Quick %d", _saveLoadSlot); _saveLoadType = (event.kbd.hasFlags(Common::KBD_ALT)) ? 1 : 2; - - // We should only allow a load or save when it was possible in original - // This stops load/save during copy protection, conversations and cut scenes - if (!_mouseHideCount && !_showPreposition) - quickLoadOrSave(); + quickLoadOrSave(); } else if (event.kbd.hasFlags(Common::KBD_CTRL)) { if (event.kbd.keycode == Common::KEYCODE_a) { GUI::Dialog *_aboutDialog; diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp index b3ec916b47..c6bca1a6e6 100644 --- a/engines/agos/saveload.cpp +++ b/engines/agos/saveload.cpp @@ -142,23 +142,41 @@ void AGOSEngine_Feeble::quickLoadOrSave() { } #endif +// The function uses segments of code from the original game scripts +// to allow quick loading and saving, but isn't perfect. +// +// Unfortuntely this allows loading and saving in locations, +// which aren't supported, and will not restore correctly: +// Various locations in Elvira 1/2 and Waxworks where saving +// was disabled void AGOSEngine::quickLoadOrSave() { - // The function uses segments of code from the original game scripts - // to allow quick loading and saving, but isn't perfect. - // - // Unfortuntely this allows loading and saving in locations, - // which aren't supported, and will not restore correctly: - // Any overhead maps in Simon the Sorcerer 2 - // Various locations in Elvira 1/2 and Waxworks where saving - // was disabled - - // The floppy disk demo of Simon the Sorcerer 1 doesn't work. - if (getFeatures() & GF_DEMO) - return; - bool success; Common::String buf; + // Disable loading and saving when it was not possible in the original: + // In overhead maps areas in Simon the Sorcerer 2 + // In the floppy disk demo of Simon the Sorcerer 1 + // In copy protection, conversations and cut scenes + if ((getGameType() == GType_SIMON2 && _boxStarHeight == 200) || + (getGameType() == GType_SIMON1 && (getFeatures() & GF_DEMO)) || + _mouseHideCount || _showPreposition) { + buf = Common::String::format("Quick load or save game isn't supported in this location"); + GUI::MessageDialog dialog(buf, "OK"); + dialog.runModal(); + return; + } + + // Check if Simon is walking, and stop when required + if (getGameType() == GType_SIMON1 && getBitFlag(11)) { + vcStopAnimation(11, 1122); + animate(4, 11, 1122, 0, 0, 2); + waitForSync(1122); + } else if (getGameType() == GType_SIMON2 && getBitFlag(11)) { + vcStopAnimation(11, 232); + animate(4, 11, 232, 0, 0, 2); + waitForSync(1122); + } + char *filename = genSaveName(_saveLoadSlot); if (_saveLoadType == 2) { Subroutine *sub; -- cgit v1.2.3 From 0817a02a7d69313d4649af27062c7e3d89c0d2c5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 12 Aug 2012 01:20:13 -0400 Subject: MOHAWK: Use setStopTime() --- engines/mohawk/myst_stacks/dni.cpp | 2 +- engines/mohawk/video.cpp | 6 ++---- engines/mohawk/video.h | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/engines/mohawk/myst_stacks/dni.cpp b/engines/mohawk/myst_stacks/dni.cpp index cae165ccf0..d103105c2d 100644 --- a/engines/mohawk/myst_stacks/dni.cpp +++ b/engines/mohawk/myst_stacks/dni.cpp @@ -109,7 +109,7 @@ void Dni::o_handPage(uint16 op, uint16 var, uint16 argc, uint16 *argv) { _vm->setMainCursor(kDefaultMystCursor); // Play movie end (atrus leaving) - _vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, 14813, 600), Audio::Timestamp(0xFFFFFFFF)); + _vm->_video->setVideoBounds(atrus, Audio::Timestamp(0, 14813, 600), _vm->_video->getDuration(atrus)); _vm->_video->setVideoLooping(atrus, false); _atrusLeft = true; diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp index 3b4e61646d..5b811382ff 100644 --- a/engines/mohawk/video.cpp +++ b/engines/mohawk/video.cpp @@ -43,13 +43,12 @@ void VideoEntry::clear() { loop = false; enabled = false; start = Audio::Timestamp(0, 1); - end = Audio::Timestamp(0xFFFFFFFF, 1); // Largest possible, there is an endOfVideo() check anyway filename.clear(); id = -1; } bool VideoEntry::endOfVideo() { - return !video || video->endOfVideo() || video->getTime() >= (uint)end.msecs(); + return !video || video->endOfVideo(); } VideoManager::VideoManager(MohawkEngine* vm) : _vm(vm) { @@ -514,13 +513,12 @@ bool VideoManager::isVideoPlaying() { void VideoManager::setVideoBounds(VideoHandle handle, Audio::Timestamp start, Audio::Timestamp end) { assert(handle != NULL_VID_HANDLE); _videoStreams[handle].start = start; - _videoStreams[handle].end = end; + _videoStreams[handle]->setStopTime(end); _videoStreams[handle]->seek(start); } void VideoManager::drawVideoFrame(VideoHandle handle, Audio::Timestamp time) { assert(handle != NULL_VID_HANDLE); - _videoStreams[handle].end = Audio::Timestamp(0xffffffff, 1); _videoStreams[handle]->seek(time); updateMovies(); delete _videoStreams[handle].video; diff --git a/engines/mohawk/video.h b/engines/mohawk/video.h index 937cd0f2dd..4e34604bfd 100644 --- a/engines/mohawk/video.h +++ b/engines/mohawk/video.h @@ -50,7 +50,7 @@ struct VideoEntry { uint16 y; bool loop; bool enabled; - Audio::Timestamp start, end; + Audio::Timestamp start; // Identification Common::String filename; // External video files -- cgit v1.2.3 From 48c591a233b403193b897c76d2e61a0f8a4f6805 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 12 Aug 2012 08:33:45 -0400 Subject: VIDEO: Don't allow adding external stream files to unopened videos --- video/video_decoder.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index b27a0c512b..0108888613 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -575,6 +575,10 @@ void AdvancedVideoDecoder::addTrack(Track *track) { } bool AdvancedVideoDecoder::addStreamFileTrack(const Common::String &baseName) { + // Only allow adding external tracks if a video is already loaded + if (!isVideoLoaded()) + return false; + StreamFileAudioTrack *track = new StreamFileAudioTrack(); bool result = track->loadFromFile(baseName); -- cgit v1.2.3 From 5db42076b87766d29cbcdd153446992bc661aa73 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 12 Aug 2012 08:43:32 -0400 Subject: VIDEO: Convert FlicDecoder to the new AdvancedVideoDecoder API The video no longer automatically loops (unused in-tree) and must have rewind() called manually --- engines/tucker/sequences.cpp | 4 +- video/flic_decoder.cpp | 299 ++++++++++++++++++++++++------------------- video/flic_decoder.h | 101 ++++++++------- 3 files changed, 226 insertions(+), 178 deletions(-) diff --git a/engines/tucker/sequences.cpp b/engines/tucker/sequences.cpp index 775fd6f1a0..16c4f4f6f0 100644 --- a/engines/tucker/sequences.cpp +++ b/engines/tucker/sequences.cpp @@ -28,6 +28,7 @@ #include "audio/decoders/wave.h" #include "graphics/palette.h" +#include "graphics/surface.h" #include "tucker/tucker.h" #include "tucker/graphics.h" @@ -749,6 +750,7 @@ void AnimationSequencePlayer::openAnimation(int index, const char *fileName) { _seqNum = 1; return; } + _flicPlayer[index].start(); _flicPlayer[index].decodeNextFrame(); if (index == 0) { getRGBPalette(index); @@ -801,7 +803,7 @@ void AnimationSequencePlayer::playIntroSeq19_20() { if (_flicPlayer[0].getCurFrame() >= 115) { surface = _flicPlayer[1].decodeNextFrame(); if (_flicPlayer[1].endOfVideo()) - _flicPlayer[1].reset(); + _flicPlayer[1].rewind(); } bool framesLeft = decodeNextAnimationFrame(0, false); diff --git a/video/flic_decoder.cpp b/video/flic_decoder.cpp index bdcdedc142..564d73a9d7 100644 --- a/video/flic_decoder.cpp +++ b/video/flic_decoder.cpp @@ -26,13 +26,11 @@ #include "common/stream.h" #include "common/system.h" #include "common/textconsole.h" +#include "graphics/surface.h" namespace Video { FlicDecoder::FlicDecoder() { - _paletteChanged = false; - _fileStream = 0; - _surface = 0; } FlicDecoder::~FlicDecoder() { @@ -42,35 +40,59 @@ FlicDecoder::~FlicDecoder() { bool FlicDecoder::loadStream(Common::SeekableReadStream *stream) { close(); - _fileStream = stream; - - /* uint32 frameSize = */ _fileStream->readUint32LE(); - uint16 frameType = _fileStream->readUint16LE(); + /* uint32 frameSize = */ stream->readUint32LE(); + uint16 frameType = stream->readUint16LE(); // Check FLC magic number if (frameType != 0xAF12) { - warning("FlicDecoder::FlicDecoder(): attempted to load non-FLC data (type = 0x%04X)", frameType); - delete _fileStream; - _fileStream = 0; + warning("FlicDecoder::loadStream(): attempted to load non-FLC data (type = 0x%04X)", frameType); return false; } - - _frameCount = _fileStream->readUint16LE(); - uint16 width = _fileStream->readUint16LE(); - uint16 height = _fileStream->readUint16LE(); - uint16 colorDepth = _fileStream->readUint16LE(); + uint16 frameCount = stream->readUint16LE(); + uint16 width = stream->readUint16LE(); + uint16 height = stream->readUint16LE(); + uint16 colorDepth = stream->readUint16LE(); if (colorDepth != 8) { - warning("FlicDecoder::FlicDecoder(): attempted to load an FLC with a palette of color depth %d. Only 8-bit color palettes are supported", frameType); - delete _fileStream; - _fileStream = 0; + warning("FlicDecoder::loadStream(): attempted to load an FLC with a palette of color depth %d. Only 8-bit color palettes are supported", colorDepth); return false; } + addTrack(new FlicVideoTrack(stream, frameCount, width, height)); + return true; +} + +const Common::List *FlicDecoder::getDirtyRects() const { + const Track *track = getTrack(0); + + if (track) + return ((const FlicVideoTrack *)track)->getDirtyRects(); + + return 0; +} + +void FlicDecoder::clearDirtyRects() { + Track *track = getTrack(0); + + if (track) + ((FlicVideoTrack *)track)->clearDirtyRects(); +} + +void FlicDecoder::copyDirtyRectsToBuffer(uint8 *dst, uint pitch) { + Track *track = getTrack(0); + + if (track) + ((FlicVideoTrack *)track)->copyDirtyRectsToBuffer(dst, pitch); +} + +FlicDecoder::FlicVideoTrack::FlicVideoTrack(Common::SeekableReadStream *stream, uint16 frameCount, uint16 width, uint16 height) { + _fileStream = stream; + _frameCount = frameCount; + _fileStream->readUint16LE(); // flags // Note: The normal delay is a 32-bit integer (dword), whereas the overridden delay is a 16-bit integer (word) // the frame delay is the FLIC "speed", in milliseconds. - _frameRate = Common::Rational(1000, _fileStream->readUint32LE()); + _frameDelay = _startFrameDelay = _fileStream->readUint32LE(); _fileStream->seek(80); _offsetFrame1 = _fileStream->readUint32LE(); @@ -78,112 +100,53 @@ bool FlicDecoder::loadStream(Common::SeekableReadStream *stream) { _surface = new Graphics::Surface(); _surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); - _palette = (byte *)malloc(3 * 256); + _palette = new byte[3 * 256]; memset(_palette, 0, 3 * 256); - _paletteChanged = false; + _dirtyPalette = false; + + _curFrame = -1; + _nextFrameStartTime = 0; + _atRingFrame = false; // Seek to the first frame _fileStream->seek(_offsetFrame1); - return true; } -void FlicDecoder::close() { - if (!_fileStream) - return; - +FlicDecoder::FlicVideoTrack::~FlicVideoTrack() { delete _fileStream; - _fileStream = 0; + delete[] _palette; _surface->free(); delete _surface; - _surface = 0; - - free(_palette); - _dirtyRects.clear(); - - reset(); } -void FlicDecoder::decodeByteRun(uint8 *data) { - byte *ptr = (byte *)_surface->pixels; - while ((int32)(ptr - (byte *)_surface->pixels) < (getWidth() * getHeight())) { - int chunks = *data++; - while (chunks--) { - int count = (int8)*data++; - if (count > 0) { - memset(ptr, *data++, count); - } else { - count = -count; - memcpy(ptr, data, count); - data += count; - } - ptr += count; - } - } - - // Redraw - _dirtyRects.clear(); - _dirtyRects.push_back(Common::Rect(0, 0, getWidth(), getHeight())); +bool FlicDecoder::FlicVideoTrack::endOfTrack() const { + return getCurFrame() >= getFrameCount() - 1; } -#define OP_PACKETCOUNT 0 -#define OP_UNDEFINED 1 -#define OP_LASTPIXEL 2 -#define OP_LINESKIPCOUNT 3 +bool FlicDecoder::FlicVideoTrack::rewind() { + _curFrame = -1; + _nextFrameStartTime = 0; -void FlicDecoder::decodeDeltaFLC(uint8 *data) { - uint16 linesInChunk = READ_LE_UINT16(data); data += 2; - uint16 currentLine = 0; - uint16 packetCount = 0; - - while (linesInChunk--) { - uint16 opcode; - - // First process all the opcodes. - do { - opcode = READ_LE_UINT16(data); data += 2; + if (endOfTrack() && _fileStream->pos() < _fileStream->size()) + _atRingFrame = true; + else + _fileStream->seek(_offsetFrame1); - switch ((opcode >> 14) & 3) { - case OP_PACKETCOUNT: - packetCount = opcode; - break; - case OP_UNDEFINED: - break; - case OP_LASTPIXEL: - *((byte *)_surface->pixels + currentLine * getWidth() + getWidth() - 1) = (opcode & 0xFF); - _dirtyRects.push_back(Common::Rect(getWidth() - 1, currentLine, getWidth(), currentLine + 1)); - break; - case OP_LINESKIPCOUNT: - currentLine += -(int16)opcode; - break; - } - } while (((opcode >> 14) & 3) != OP_PACKETCOUNT); + _frameDelay = _startFrameDelay; + return true; +} - uint16 column = 0; +uint16 FlicDecoder::FlicVideoTrack::getWidth() const { + return _surface->w; +} - // Now interpret the RLE data - while (packetCount--) { - column += *data++; - int rleCount = (int8)*data++; - if (rleCount > 0) { - memcpy((byte *)_surface->pixels + (currentLine * getWidth()) + column, data, rleCount * 2); - data += rleCount * 2; - _dirtyRects.push_back(Common::Rect(column, currentLine, column + rleCount * 2, currentLine + 1)); - } else if (rleCount < 0) { - rleCount = -rleCount; - uint16 dataWord = READ_UINT16(data); data += 2; - for (int i = 0; i < rleCount; ++i) { - WRITE_UINT16((byte *)_surface->pixels + currentLine * getWidth() + column + i * 2, dataWord); - } - _dirtyRects.push_back(Common::Rect(column, currentLine, column + rleCount * 2, currentLine + 1)); - } else { // End of cutscene ? - return; - } - column += rleCount * 2; - } +uint16 FlicDecoder::FlicVideoTrack::getHeight() const { + return _surface->h; +} - currentLine++; - } +Graphics::PixelFormat FlicDecoder::FlicVideoTrack::getPixelFormat() const { + return _surface->format; } #define FLI_SETPAL 4 @@ -192,7 +155,7 @@ void FlicDecoder::decodeDeltaFLC(uint8 *data) { #define PSTAMP 18 #define FRAME_TYPE 0xF1FA -const Graphics::Surface *FlicDecoder::decodeNextFrame() { +const Graphics::Surface *FlicDecoder::FlicVideoTrack::decodeNextFrame() { // Read chunk uint32 frameSize = _fileStream->readUint32LE(); uint16 frameType = _fileStream->readUint16LE(); @@ -209,7 +172,7 @@ const Graphics::Surface *FlicDecoder::decodeNextFrame() { // the frame delay is the FLIC "speed", in milliseconds. uint16 newFrameDelay = _fileStream->readUint16LE(); // "speed", in milliseconds if (newFrameDelay > 0) - _frameRate = Common::Rational(1000, newFrameDelay); + _frameDelay = newFrameDelay; _fileStream->readUint16LE(); // reserved, always 0 uint16 newWidth = _fileStream->readUint16LE(); @@ -240,10 +203,11 @@ const Graphics::Surface *FlicDecoder::decodeNextFrame() { frameType = _fileStream->readUint16LE(); uint8 *data = new uint8[frameSize - 6]; _fileStream->read(data, frameSize - 6); + switch (frameType) { case FLI_SETPAL: unpackPalette(data); - _paletteChanged = true; + _dirtyPalette = true; break; case FLI_SS2: decodeDeltaFLC(data); @@ -264,26 +228,111 @@ const Graphics::Surface *FlicDecoder::decodeNextFrame() { } _curFrame++; + _nextFrameStartTime += _frameDelay; - // If we just processed the ring frame, set the next frame - if (_curFrame == (int32)_frameCount) { - _curFrame = 0; + if (_atRingFrame) { + // If we decoded the ring frame, seek to the second frame + _atRingFrame = false; _fileStream->seek(_offsetFrame2); } - if (_curFrame == 0) - _startTime = g_system->getMillis(); - return _surface; } -void FlicDecoder::reset() { - FixedRateVideoDecoder::reset(); - if (_fileStream) - _fileStream->seek(_offsetFrame1); +void FlicDecoder::FlicVideoTrack::copyDirtyRectsToBuffer(uint8 *dst, uint pitch) { + for (Common::List::const_iterator it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) { + for (int y = (*it).top; y < (*it).bottom; ++y) { + const int x = (*it).left; + memcpy(dst + y * pitch + x, (byte *)_surface->pixels + y * getWidth() + x, (*it).right - x); + } + } + + clearDirtyRects(); } -void FlicDecoder::unpackPalette(uint8 *data) { +void FlicDecoder::FlicVideoTrack::decodeByteRun(uint8 *data) { + byte *ptr = (byte *)_surface->pixels; + while ((int32)(ptr - (byte *)_surface->pixels) < (getWidth() * getHeight())) { + int chunks = *data++; + while (chunks--) { + int count = (int8)*data++; + if (count > 0) { + memset(ptr, *data++, count); + } else { + count = -count; + memcpy(ptr, data, count); + data += count; + } + ptr += count; + } + } + + // Redraw + _dirtyRects.clear(); + _dirtyRects.push_back(Common::Rect(0, 0, getWidth(), getHeight())); +} + +#define OP_PACKETCOUNT 0 +#define OP_UNDEFINED 1 +#define OP_LASTPIXEL 2 +#define OP_LINESKIPCOUNT 3 + +void FlicDecoder::FlicVideoTrack::decodeDeltaFLC(uint8 *data) { + uint16 linesInChunk = READ_LE_UINT16(data); data += 2; + uint16 currentLine = 0; + uint16 packetCount = 0; + + while (linesInChunk--) { + uint16 opcode; + + // First process all the opcodes. + do { + opcode = READ_LE_UINT16(data); data += 2; + + switch ((opcode >> 14) & 3) { + case OP_PACKETCOUNT: + packetCount = opcode; + break; + case OP_UNDEFINED: + break; + case OP_LASTPIXEL: + *((byte *)_surface->pixels + currentLine * getWidth() + getWidth() - 1) = (opcode & 0xFF); + _dirtyRects.push_back(Common::Rect(getWidth() - 1, currentLine, getWidth(), currentLine + 1)); + break; + case OP_LINESKIPCOUNT: + currentLine += -(int16)opcode; + break; + } + } while (((opcode >> 14) & 3) != OP_PACKETCOUNT); + + uint16 column = 0; + + // Now interpret the RLE data + while (packetCount--) { + column += *data++; + int rleCount = (int8)*data++; + if (rleCount > 0) { + memcpy((byte *)_surface->pixels + (currentLine * getWidth()) + column, data, rleCount * 2); + data += rleCount * 2; + _dirtyRects.push_back(Common::Rect(column, currentLine, column + rleCount * 2, currentLine + 1)); + } else if (rleCount < 0) { + rleCount = -rleCount; + uint16 dataWord = READ_UINT16(data); data += 2; + for (int i = 0; i < rleCount; ++i) { + WRITE_UINT16((byte *)_surface->pixels + currentLine * getWidth() + column + i * 2, dataWord); + } + _dirtyRects.push_back(Common::Rect(column, currentLine, column + rleCount * 2, currentLine + 1)); + } else { // End of cutscene ? + return; + } + column += rleCount * 2; + } + + currentLine++; + } +} + +void FlicDecoder::FlicVideoTrack::unpackPalette(uint8 *data) { uint16 numPackets = READ_LE_UINT16(data); data += 2; if (0 == READ_LE_UINT16(data)) { //special case @@ -308,14 +357,4 @@ void FlicDecoder::unpackPalette(uint8 *data) { } } -void FlicDecoder::copyDirtyRectsToBuffer(uint8 *dst, uint pitch) { - for (Common::List::const_iterator it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) { - for (int y = (*it).top; y < (*it).bottom; ++y) { - const int x = (*it).left; - memcpy(dst + y * pitch + x, (byte *)_surface->pixels + y * getWidth() + x, (*it).right - x); - } - } - _dirtyRects.clear(); -} - } // End of namespace Video diff --git a/video/flic_decoder.h b/video/flic_decoder.h index 9badc3da2e..9b82161ca5 100644 --- a/video/flic_decoder.h +++ b/video/flic_decoder.h @@ -25,15 +25,17 @@ #include "video/video_decoder.h" #include "common/list.h" -#include "common/rational.h" #include "common/rect.h" -#include "graphics/pixelformat.h" -#include "graphics/surface.h" namespace Common { class SeekableReadStream; } +namespace Graphics { +struct PixelFormat; +struct Surface; +} + namespace Video { /** @@ -42,58 +44,63 @@ namespace Video { * Video decoder used in engines: * - tucker */ -class FlicDecoder : public FixedRateVideoDecoder { +class FlicDecoder : public AdvancedVideoDecoder { public: FlicDecoder(); virtual ~FlicDecoder(); - /** - * Load a video file - * @param stream the stream to load - */ bool loadStream(Common::SeekableReadStream *stream); - void close(); - - /** - * Decode the next frame and return the frame's surface - * @note the return surface should *not* be freed - * @note this may return 0, in which case the last frame should be kept on screen - */ - const Graphics::Surface *decodeNextFrame(); - - bool isVideoLoaded() const { return _fileStream != 0; } - uint16 getWidth() const { return _surface->w; } - uint16 getHeight() const { return _surface->h; } - uint32 getFrameCount() const { return _frameCount; } - Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } - - const Common::List *getDirtyRects() const { return &_dirtyRects; } - void clearDirtyRects() { _dirtyRects.clear(); } - void copyDirtyRectsToBuffer(uint8 *dst, uint pitch); - - const byte *getPalette() { _paletteChanged = false; return _palette; } - bool hasDirtyPalette() const { return _paletteChanged; } - void reset(); -protected: - Common::Rational getFrameRate() const { return _frameRate; } + const Common::List *getDirtyRects() const; + void clearDirtyRects(); + void copyDirtyRectsToBuffer(uint8 *dst, uint pitch); private: - uint16 _offsetFrame1; - uint16 _offsetFrame2; - byte *_palette; - bool _paletteChanged; - - void decodeByteRun(uint8 *data); - void decodeDeltaFLC(uint8 *data); - void unpackPalette(uint8 *mem); - - Common::SeekableReadStream *_fileStream; - Graphics::Surface *_surface; - uint32 _frameCount; - Common::Rational _frameRate; - - Common::List _dirtyRects; + class FlicVideoTrack : public VideoTrack { + public: + FlicVideoTrack(Common::SeekableReadStream *stream, uint16 frameCount, uint16 width, uint16 height); + ~FlicVideoTrack(); + + bool endOfTrack() const; + bool isRewindable() const { return true; } + bool rewind(); + + uint16 getWidth() const; + uint16 getHeight() const; + Graphics::PixelFormat getPixelFormat() const; + int getCurFrame() const { return _curFrame; } + int getFrameCount() const { return _frameCount; } + uint32 getNextFrameStartTime() const { return _nextFrameStartTime; } + const Graphics::Surface *decodeNextFrame(); + const byte *getPalette() const { _dirtyPalette = false; return _palette; } + bool hasDirtyPalette() const { return _dirtyPalette; } + + const Common::List *getDirtyRects() const { return &_dirtyRects; } + void clearDirtyRects() { _dirtyRects.clear(); } + void copyDirtyRectsToBuffer(uint8 *dst, uint pitch); + + private: + Common::SeekableReadStream *_fileStream; + Graphics::Surface *_surface; + + int _curFrame; + bool _atRingFrame; + + uint16 _offsetFrame1; + uint16 _offsetFrame2; + byte *_palette; + mutable bool _dirtyPalette; + + uint32 _frameCount; + uint32 _frameDelay, _startFrameDelay; + uint32 _nextFrameStartTime; + + Common::List _dirtyRects; + + void decodeByteRun(uint8 *data); + void decodeDeltaFLC(uint8 *data); + void unpackPalette(uint8 *mem); + }; }; } // End of namespace Video -- cgit v1.2.3 From e7cd238809520c9f3ee7ee820b3a106b7f72c2e2 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 12 Aug 2012 14:56:20 +0200 Subject: GUI: Remove left-over code from theme based fill color in thumbnail display. --- gui/saveload-dialog.cpp | 9 +++------ gui/saveload-dialog.h | 2 -- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 0b36ff5d59..8e214bce90 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -188,8 +188,6 @@ enum { SaveLoadChooserSimple::SaveLoadChooserSimple(const String &title, const String &buttonLabel, bool saveMode) : SaveLoadChooserDialog("SaveLoadChooser", saveMode), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) { - _fillR = _fillG = _fillB = 0; - _backgroundType = ThemeEngine::kDialogBackgroundSpecial; new StaticTextWidget(this, "SaveLoadChooser.Title", title); @@ -327,9 +325,6 @@ void SaveLoadChooserSimple::reflowLayout() { _playtime->setVisible(_playTimeSupport); - _fillR = 0; - _fillG = 0; - _fillB = 0; updateSelection(false); } else { _container->setVisible(false); @@ -349,7 +344,9 @@ void SaveLoadChooserSimple::updateSelection(bool redraw) { bool isWriteProtected = false; bool startEditMode = _list->isEditable(); - _gfxWidget->setGfx(-1, -1, _fillR, _fillG, _fillB); + // We used to support letting the themes specify the fill color with our + // initial theme based GUI. But this support was dropped. + _gfxWidget->setGfx(-1, -1, 0, 0, 0); _date->setLabel(_("No date saved")); _time->setLabel(_("No time saved")); _playtime->setLabel(_("No playtime saved")); diff --git a/gui/saveload-dialog.h b/gui/saveload-dialog.h index 50b7d419b7..9d0350d69d 100644 --- a/gui/saveload-dialog.h +++ b/gui/saveload-dialog.h @@ -119,8 +119,6 @@ private: SaveStateList _saveList; String _resultString; - uint8 _fillR, _fillG, _fillB; - void updateSaveList(); void updateSelection(bool redraw); }; -- cgit v1.2.3 From 7831225b280d08779bc0d40e76bbbef1e183471a Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 12 Aug 2012 08:58:00 -0400 Subject: VIDEO: Move TheoraDecoder to video/ --- engines/sword25/fmv/movieplayer.h | 4 +- engines/sword25/fmv/theora_decoder.cpp | 565 --------------------------------- engines/sword25/fmv/theora_decoder.h | 144 --------- engines/sword25/module.mk | 5 - video/module.mk | 5 + video/theora_decoder.cpp | 563 ++++++++++++++++++++++++++++++++ video/theora_decoder.h | 144 +++++++++ 7 files changed, 714 insertions(+), 716 deletions(-) delete mode 100644 engines/sword25/fmv/theora_decoder.cpp delete mode 100644 engines/sword25/fmv/theora_decoder.h create mode 100644 video/theora_decoder.cpp create mode 100644 video/theora_decoder.h diff --git a/engines/sword25/fmv/movieplayer.h b/engines/sword25/fmv/movieplayer.h index 1d256e56ba..2f5614b505 100644 --- a/engines/sword25/fmv/movieplayer.h +++ b/engines/sword25/fmv/movieplayer.h @@ -39,7 +39,7 @@ #include "sword25/gfx/bitmap.h" #ifdef USE_THEORADEC -#include "sword25/fmv/theora_decoder.h" +#include "video/theora_decoder.h" #endif #define THEORA_INDIRECT_RENDERING @@ -141,7 +141,7 @@ private: #ifdef USE_THEORADEC - TheoraDecoder _decoder; + Video::TheoraDecoder _decoder; Graphics::Surface *_backSurface; int _outX, _outY; diff --git a/engines/sword25/fmv/theora_decoder.cpp b/engines/sword25/fmv/theora_decoder.cpp deleted file mode 100644 index d38f5a26cf..0000000000 --- a/engines/sword25/fmv/theora_decoder.cpp +++ /dev/null @@ -1,565 +0,0 @@ -/* 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. - * - */ - -/* - * Source is based on the player example from libvorbis package, - * available at: http://svn.xiph.org/trunk/theora/examples/player_example.c - * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. - * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ - * - */ - -#include "sword25/fmv/theora_decoder.h" - -#ifdef USE_THEORADEC -#include "common/system.h" -#include "common/textconsole.h" -#include "common/util.h" -#include "graphics/yuv_to_rgb.h" -#include "audio/decoders/raw.h" -#include "sword25/kernel/common.h" - -namespace Sword25 { - -#define AUDIOFD_FRAGSIZE 10240 - -static double rint(double v) { - return floor(v + 0.5); -} - -TheoraDecoder::TheoraDecoder(Audio::Mixer::SoundType soundType) { - _fileStream = 0; - - _theoraPacket = 0; - _vorbisPacket = 0; - _theoraDecode = 0; - _theoraSetup = 0; - _nextFrameStartTime = 0.0; - - _soundType = soundType; - _audStream = 0; - _audHandle = new Audio::SoundHandle(); - - ogg_sync_init(&_oggSync); - - _curFrame = -1; - _audiobuf = (ogg_int16_t *)malloc(AUDIOFD_FRAGSIZE * sizeof(ogg_int16_t)); - - reset(); -} - -TheoraDecoder::~TheoraDecoder() { - close(); - delete _fileStream; - delete _audHandle; - free(_audiobuf); -} - -void TheoraDecoder::queuePage(ogg_page *page) { - if (_theoraPacket) - ogg_stream_pagein(&_theoraOut, page); - - if (_vorbisPacket) - ogg_stream_pagein(&_vorbisOut, page); -} - -int TheoraDecoder::bufferData() { - char *buffer = ogg_sync_buffer(&_oggSync, 4096); - int bytes = _fileStream->read(buffer, 4096); - - ogg_sync_wrote(&_oggSync, bytes); - - return bytes; -} - -bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { - close(); - - _endOfAudio = false; - _endOfVideo = false; - _fileStream = stream; - - // start up Ogg stream synchronization layer - ogg_sync_init(&_oggSync); - - // init supporting Vorbis structures needed in header parsing - vorbis_info_init(&_vorbisInfo); - vorbis_comment_init(&_vorbisComment); - - // init supporting Theora structures needed in header parsing - th_comment_init(&_theoraComment); - th_info_init(&_theoraInfo); - - // Ogg file open; parse the headers - // Only interested in Vorbis/Theora streams - bool foundHeader = false; - while (!foundHeader) { - int ret = bufferData(); - - if (ret == 0) - break; - - while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) { - ogg_stream_state test; - - // is this a mandated initial header? If not, stop parsing - if (!ogg_page_bos(&_oggPage)) { - // don't leak the page; get it into the appropriate stream - queuePage(&_oggPage); - foundHeader = true; - break; - } - - ogg_stream_init(&test, ogg_page_serialno(&_oggPage)); - ogg_stream_pagein(&test, &_oggPage); - ogg_stream_packetout(&test, &_oggPacket); - - // identify the codec: try theora - if (!_theoraPacket && th_decode_headerin(&_theoraInfo, &_theoraComment, &_theoraSetup, &_oggPacket) >= 0) { - // it is theora - memcpy(&_theoraOut, &test, sizeof(test)); - _theoraPacket = 1; - } else if (!_vorbisPacket && vorbis_synthesis_headerin(&_vorbisInfo, &_vorbisComment, &_oggPacket) >= 0) { - // it is vorbis - memcpy(&_vorbisOut, &test, sizeof(test)); - _vorbisPacket = 1; - } else { - // whatever it is, we don't care about it - ogg_stream_clear(&test); - } - } - // fall through to non-bos page parsing - } - - // we're expecting more header packets. - while ((_theoraPacket && _theoraPacket < 3) || (_vorbisPacket && _vorbisPacket < 3)) { - int ret; - - // look for further theora headers - while (_theoraPacket && (_theoraPacket < 3) && (ret = ogg_stream_packetout(&_theoraOut, &_oggPacket))) { - if (ret < 0) - error("Error parsing Theora stream headers; corrupt stream?"); - - if (!th_decode_headerin(&_theoraInfo, &_theoraComment, &_theoraSetup, &_oggPacket)) - error("Error parsing Theora stream headers; corrupt stream?"); - - _theoraPacket++; - } - - // look for more vorbis header packets - while (_vorbisPacket && (_vorbisPacket < 3) && (ret = ogg_stream_packetout(&_vorbisOut, &_oggPacket))) { - if (ret < 0) - error("Error parsing Vorbis stream headers; corrupt stream?"); - - if (vorbis_synthesis_headerin(&_vorbisInfo, &_vorbisComment, &_oggPacket)) - error("Error parsing Vorbis stream headers; corrupt stream?"); - - _vorbisPacket++; - - if (_vorbisPacket == 3) - break; - } - - // The header pages/packets will arrive before anything else we - // care about, or the stream is not obeying spec - - if (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) { - queuePage(&_oggPage); // demux into the appropriate stream - } else { - ret = bufferData(); // someone needs more data - - if (ret == 0) - error("End of file while searching for codec headers."); - } - } - - // and now we have it all. initialize decoders - if (_theoraPacket) { - _theoraDecode = th_decode_alloc(&_theoraInfo, _theoraSetup); - debugN(1, "Ogg logical stream %lx is Theora %dx%d %.02f fps", - _theoraOut.serialno, _theoraInfo.pic_width, _theoraInfo.pic_height, - (double)_theoraInfo.fps_numerator / _theoraInfo.fps_denominator); - - switch (_theoraInfo.pixel_fmt) { - case TH_PF_420: - debug(1, " 4:2:0 video"); - break; - case TH_PF_422: - debug(1, " 4:2:2 video"); - break; - case TH_PF_444: - debug(1, " 4:4:4 video"); - break; - case TH_PF_RSVD: - default: - debug(1, " video\n (UNKNOWN Chroma sampling!)"); - break; - } - - if (_theoraInfo.pic_width != _theoraInfo.frame_width || _theoraInfo.pic_height != _theoraInfo.frame_height) - debug(1, " Frame content is %dx%d with offset (%d,%d).", - _theoraInfo.frame_width, _theoraInfo.frame_height, _theoraInfo.pic_x, _theoraInfo.pic_y); - - switch (_theoraInfo.colorspace){ - case TH_CS_UNSPECIFIED: - /* nothing to report */ - break; - case TH_CS_ITU_REC_470M: - debug(1, " encoder specified ITU Rec 470M (NTSC) color."); - break; - case TH_CS_ITU_REC_470BG: - debug(1, " encoder specified ITU Rec 470BG (PAL) color."); - break; - default: - debug(1, "warning: encoder specified unknown colorspace (%d).", _theoraInfo.colorspace); - break; - } - - debug(1, "Encoded by %s", _theoraComment.vendor); - if (_theoraComment.comments) { - debug(1, "theora comment header:"); - for (int i = 0; i < _theoraComment.comments; i++) { - if (_theoraComment.user_comments[i]) { - int len = _theoraComment.comment_lengths[i]; - char *value = (char *)malloc(len + 1); - if (value) { - memcpy(value, _theoraComment.user_comments[i], len); - value[len] = '\0'; - debug(1, "\t%s", value); - free(value); - } - } - } - } - - th_decode_ctl(_theoraDecode, TH_DECCTL_GET_PPLEVEL_MAX, &_ppLevelMax, sizeof(_ppLevelMax)); - _ppLevel = _ppLevelMax; - th_decode_ctl(_theoraDecode, TH_DECCTL_SET_PPLEVEL, &_ppLevel, sizeof(_ppLevel)); - _ppInc = 0; - } else { - // tear down the partial theora setup - th_info_clear(&_theoraInfo); - th_comment_clear(&_theoraComment); - } - - th_setup_free(_theoraSetup); - _theoraSetup = 0; - - if (_vorbisPacket) { - vorbis_synthesis_init(&_vorbisDSP, &_vorbisInfo); - vorbis_block_init(&_vorbisDSP, &_vorbisBlock); - debug(3, "Ogg logical stream %lx is Vorbis %d channel %ld Hz audio.", - _vorbisOut.serialno, _vorbisInfo.channels, _vorbisInfo.rate); - - _audStream = Audio::makeQueuingAudioStream(_vorbisInfo.rate, _vorbisInfo.channels); - - // Get enough audio data to start us off - while (_audStream->numQueuedStreams() == 0) { - // Queue more data - bufferData(); - while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) - queuePage(&_oggPage); - - queueAudio(); - } - - if (_audStream) - g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, _audHandle, _audStream, -1, getVolume(), getBalance()); - } else { - // tear down the partial vorbis setup - vorbis_info_clear(&_vorbisInfo); - vorbis_comment_clear(&_vorbisComment); - _endOfAudio = true; - } - - _surface.create(_theoraInfo.frame_width, _theoraInfo.frame_height, g_system->getScreenFormat()); - - // Set up a display surface - _displaySurface.pixels = _surface.getBasePtr(_theoraInfo.pic_x, _theoraInfo.pic_y); - _displaySurface.w = _theoraInfo.pic_width; - _displaySurface.h = _theoraInfo.pic_height; - _displaySurface.format = _surface.format; - _displaySurface.pitch = _surface.pitch; - - // Set the frame rate - _frameRate = Common::Rational(_theoraInfo.fps_numerator, _theoraInfo.fps_denominator); - - return true; -} - -void TheoraDecoder::close() { - if (_vorbisPacket) { - ogg_stream_clear(&_vorbisOut); - vorbis_block_clear(&_vorbisBlock); - vorbis_dsp_clear(&_vorbisDSP); - vorbis_comment_clear(&_vorbisComment); - vorbis_info_clear(&_vorbisInfo); - - g_system->getMixer()->stopHandle(*_audHandle); - - _audStream = 0; - _vorbisPacket = false; - } - if (_theoraPacket) { - ogg_stream_clear(&_theoraOut); - th_decode_free(_theoraDecode); - th_comment_clear(&_theoraComment); - th_info_clear(&_theoraInfo); - _theoraDecode = 0; - _theoraPacket = false; - } - - if (!_fileStream) - return; - - ogg_sync_clear(&_oggSync); - - delete _fileStream; - _fileStream = 0; - - _surface.free(); - _displaySurface.pixels = 0; - _displaySurface.free(); - - reset(); -} - -const Graphics::Surface *TheoraDecoder::decodeNextFrame() { - // First, let's get our frame - while (_theoraPacket) { - // theora is one in, one out... - if (ogg_stream_packetout(&_theoraOut, &_oggPacket) > 0) { - - if (_ppInc) { - _ppLevel += _ppInc; - th_decode_ctl(_theoraDecode, TH_DECCTL_SET_PPLEVEL, &_ppLevel, sizeof(_ppLevel)); - _ppInc = 0; - } - - if (th_decode_packetin(_theoraDecode, &_oggPacket, NULL) == 0) { - _curFrame++; - - // Convert YUV data to RGB data - th_ycbcr_buffer yuv; - th_decode_ycbcr_out(_theoraDecode, yuv); - translateYUVtoRGBA(yuv); - - if (_curFrame == 0) - _startTime = g_system->getMillis(); - - double time = th_granule_time(_theoraDecode, _oggPacket.granulepos); - - // We need to calculate when the next frame should be shown - // This is all in floating point because that's what the Ogg code gives us - // Ogg is a lossy container format, so it doesn't always list the time to the - // next frame. In such cases, we need to calculate it ourselves. - if (time == -1.0) - _nextFrameStartTime += _frameRate.getInverse().toDouble(); - else - _nextFrameStartTime = time; - - // break out - break; - } - } else { - // If we can't get any more frames, we're done. - if (_theoraOut.e_o_s || _fileStream->eos()) { - _endOfVideo = true; - break; - } - - // Queue more data - bufferData(); - while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) - queuePage(&_oggPage); - } - - // Update audio if we can - queueAudio(); - } - - // Force at least some audio to be buffered - // TODO: 5 is very arbitrary. We probably should do something like QuickTime does. - while (!_endOfAudio && _audStream->numQueuedStreams() < 5) { - bufferData(); - while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) - queuePage(&_oggPage); - - bool queuedAudio = queueAudio(); - if ((_vorbisOut.e_o_s || _fileStream->eos()) && !queuedAudio) { - _endOfAudio = true; - break; - } - } - - return &_displaySurface; -} - -bool TheoraDecoder::queueAudio() { - if (!_audStream) - return false; - - // An audio buffer should have been allocated (either in the constructor or after queuing the current buffer) - if (!_audiobuf) { - warning("[TheoraDecoder::queueAudio] Invalid audio buffer"); - return false; - } - - bool queuedAudio = false; - - for (;;) { - float **pcm; - - // if there's pending, decoded audio, grab it - int ret = vorbis_synthesis_pcmout(&_vorbisDSP, &pcm); - if (ret > 0) { - int count = _audiobufFill / 2; - int maxsamples = ((AUDIOFD_FRAGSIZE - _audiobufFill) / _vorbisInfo.channels) >> 1; - int i; - for (i = 0; i < ret && i < maxsamples; i++) - for (int j = 0; j < _vorbisInfo.channels; j++) { - int val = CLIP((int)rint(pcm[j][i] * 32767.f), -32768, 32767); - _audiobuf[count++] = val; - } - - vorbis_synthesis_read(&_vorbisDSP, i); - _audiobufFill += (i * _vorbisInfo.channels) << 1; - - if (_audiobufFill == AUDIOFD_FRAGSIZE) { - byte flags = Audio::FLAG_16BITS | Audio::FLAG_STEREO; -#ifdef SCUMM_LITTLE_ENDIAN - flags |= Audio::FLAG_LITTLE_ENDIAN; -#endif - _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::NO, flags); - - // The audio mixer is now responsible for the old audio buffer. - // We need to create a new one. - _audiobuf = (ogg_int16_t *)malloc(AUDIOFD_FRAGSIZE * sizeof(ogg_int16_t)); - if (!_audiobuf) { - warning("[TheoraDecoder::queueAudio] Cannot allocate memory for audio buffer"); - return false; - } - - _audiobufFill = 0; - queuedAudio = true; - } - } else { - // no pending audio; is there a pending packet to decode? - if (ogg_stream_packetout(&_vorbisOut, &_oggPacket) > 0) { - if (vorbis_synthesis(&_vorbisBlock, &_oggPacket) == 0) // test for success! - vorbis_synthesis_blockin(&_vorbisDSP, &_vorbisBlock); - } else // we've buffered all we have, break out for now - return queuedAudio; - } - } - - // Unreachable - return false; -} - -void TheoraDecoder::reset() { - VideoDecoder::reset(); - - // FIXME: This does a rewind() instead of a reset()! - - if (_fileStream) - _fileStream->seek(0); - - _audiobufFill = 0; - _audiobufReady = false; - - _curFrame = -1; - - _theoraPacket = 0; - _vorbisPacket = 0; -} - -bool TheoraDecoder::endOfVideo() const { - return !isVideoLoaded() || (_endOfVideo && (!_audStream || (_audStream->endOfData() && _endOfAudio))); -} - -uint32 TheoraDecoder::getTimeToNextFrame() const { - if (endOfVideo() || _curFrame < 0) - return 0; - - uint32 elapsedTime = getTime(); - uint32 nextFrameStartTime = (uint32)(_nextFrameStartTime * 1000); - - if (nextFrameStartTime <= elapsedTime) - return 0; - - return nextFrameStartTime - elapsedTime; -} - -uint32 TheoraDecoder::getTime() const { - if (_audStream) - return g_system->getMixer()->getSoundElapsedTime(*_audHandle); - - return VideoDecoder::getTime(); -} - -void TheoraDecoder::pauseVideoIntern(bool pause) { - if (_audStream) - g_system->getMixer()->pauseHandle(*_audHandle, pause); -} - -enum TheoraYUVBuffers { - kBufferY = 0, - kBufferU = 1, - kBufferV = 2 -}; - -void TheoraDecoder::translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer) { - // Width and height of all buffers have to be divisible by 2. - assert((YUVBuffer[kBufferY].width & 1) == 0); - assert((YUVBuffer[kBufferY].height & 1) == 0); - assert((YUVBuffer[kBufferU].width & 1) == 0); - assert((YUVBuffer[kBufferV].width & 1) == 0); - - // UV images have to have a quarter of the Y image resolution - assert(YUVBuffer[kBufferU].width == YUVBuffer[kBufferY].width >> 1); - assert(YUVBuffer[kBufferV].width == YUVBuffer[kBufferY].width >> 1); - assert(YUVBuffer[kBufferU].height == YUVBuffer[kBufferY].height >> 1); - assert(YUVBuffer[kBufferV].height == YUVBuffer[kBufferY].height >> 1); - - Graphics::convertYUV420ToRGB(&_surface, YUVBuffer[kBufferY].data, YUVBuffer[kBufferU].data, YUVBuffer[kBufferV].data, YUVBuffer[kBufferY].width, YUVBuffer[kBufferY].height, YUVBuffer[kBufferY].stride, YUVBuffer[kBufferU].stride); -} - -void TheoraDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(*_audHandle)) - g_system->getMixer()->setChannelVolume(*_audHandle, getVolume()); -} - -void TheoraDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(*_audHandle)) - g_system->getMixer()->setChannelBalance(*_audHandle, getBalance()); -} - -} // End of namespace Sword25 - -#endif diff --git a/engines/sword25/fmv/theora_decoder.h b/engines/sword25/fmv/theora_decoder.h deleted file mode 100644 index 739040024f..0000000000 --- a/engines/sword25/fmv/theora_decoder.h +++ /dev/null @@ -1,144 +0,0 @@ -/* 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 SWORD25_THEORADECODER_H -#define SWORD25_THEORADECODER_H - -#include "common/scummsys.h" // for USE_THEORADEC - -#ifdef USE_THEORADEC - -#include "common/rational.h" -#include "video/video_decoder.h" -#include "audio/audiostream.h" -#include "audio/mixer.h" -#include "graphics/pixelformat.h" -#include "graphics/surface.h" - -#include -#include - -namespace Common { -class SeekableReadStream; -} - -namespace Sword25 { - -/** - * - * Decoder for Theora videos. - * Video decoder used in engines: - * - sword25 - */ -class TheoraDecoder : public Video::VideoDecoder { -public: - TheoraDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kMusicSoundType); - virtual ~TheoraDecoder(); - - /** - * Load a video file - * @param stream the stream to load - */ - bool loadStream(Common::SeekableReadStream *stream); - void close(); - void reset(); - - /** - * Decode the next frame and return the frame's surface - * @note the return surface should *not* be freed - * @note this may return 0, in which case the last frame should be kept on screen - */ - const Graphics::Surface *decodeNextFrame(); - - bool isVideoLoaded() const { return _fileStream != 0; } - uint16 getWidth() const { return _displaySurface.w; } - uint16 getHeight() const { return _displaySurface.h; } - - uint32 getFrameCount() const { - // It is not possible to get frame count easily - // I.e. seeking is required - assert(0); - return 0; - } - - Graphics::PixelFormat getPixelFormat() const { return _displaySurface.format; } - uint32 getTime() const; - uint32 getTimeToNextFrame() const; - - bool endOfVideo() const; - -protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); - void pauseVideoIntern(bool pause); - -private: - void queuePage(ogg_page *page); - bool queueAudio(); - int bufferData(); - void translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer); - - Common::SeekableReadStream *_fileStream; - Graphics::Surface _surface; - Graphics::Surface _displaySurface; - Common::Rational _frameRate; - double _nextFrameStartTime; - bool _endOfVideo; - bool _endOfAudio; - - Audio::Mixer::SoundType _soundType; - Audio::SoundHandle *_audHandle; - Audio::QueuingAudioStream *_audStream; - - ogg_sync_state _oggSync; - ogg_page _oggPage; - ogg_packet _oggPacket; - ogg_stream_state _vorbisOut; - ogg_stream_state _theoraOut; - th_info _theoraInfo; - th_comment _theoraComment; - th_dec_ctx *_theoraDecode; - th_setup_info *_theoraSetup; - vorbis_info _vorbisInfo; - vorbis_dsp_state _vorbisDSP; - vorbis_block _vorbisBlock; - vorbis_comment _vorbisComment; - - int _theoraPacket; - int _vorbisPacket; - - int _ppLevelMax; - int _ppLevel; - int _ppInc; - - // single audio fragment audio buffering - int _audiobufFill; - bool _audiobufReady; - ogg_int16_t *_audiobuf; -}; - -} // End of namespace Sword25 - -#endif - -#endif diff --git a/engines/sword25/module.mk b/engines/sword25/module.mk index 302120c500..e24a221244 100644 --- a/engines/sword25/module.mk +++ b/engines/sword25/module.mk @@ -85,11 +85,6 @@ MODULE_OBJS := \ util/pluto/pluto.o \ util/pluto/plzio.o -ifdef USE_THEORADEC -MODULE_OBJS += \ - fmv/theora_decoder.o -endif - # This module can be built as a plugin ifeq ($(ENABLE_SWORD25), DYNAMIC_PLUGIN) PLUGIN := 1 diff --git a/video/module.mk b/video/module.mk index cebd403ca2..287e14ce18 100644 --- a/video/module.mk +++ b/video/module.mk @@ -26,5 +26,10 @@ MODULE_OBJS += \ bink_decoder.o endif +ifdef USE_THEORADEC +MODULE_OBJS += \ + theora_decoder.o +endif + # Include common rules include $(srcdir)/rules.mk diff --git a/video/theora_decoder.cpp b/video/theora_decoder.cpp new file mode 100644 index 0000000000..f3d9cad096 --- /dev/null +++ b/video/theora_decoder.cpp @@ -0,0 +1,563 @@ +/* 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. + * + */ + +/* + * Source is based on the player example from libvorbis package, + * available at: http://svn.xiph.org/trunk/theora/examples/player_example.c + * + * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. + * + * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ + * + */ + +#include "video/theora_decoder.h" + +#include "common/debug.h" +#include "common/stream.h" +#include "common/system.h" +#include "common/textconsole.h" +#include "common/util.h" +#include "graphics/yuv_to_rgb.h" +#include "audio/decoders/raw.h" + +namespace Video { + +#define AUDIOFD_FRAGSIZE 10240 + +static double rint(double v) { + return floor(v + 0.5); +} + +TheoraDecoder::TheoraDecoder(Audio::Mixer::SoundType soundType) { + _fileStream = 0; + + _theoraPacket = 0; + _vorbisPacket = 0; + _theoraDecode = 0; + _theoraSetup = 0; + _nextFrameStartTime = 0.0; + + _soundType = soundType; + _audStream = 0; + _audHandle = new Audio::SoundHandle(); + + ogg_sync_init(&_oggSync); + + _curFrame = -1; + _audiobuf = (ogg_int16_t *)malloc(AUDIOFD_FRAGSIZE * sizeof(ogg_int16_t)); + + reset(); +} + +TheoraDecoder::~TheoraDecoder() { + close(); + delete _fileStream; + delete _audHandle; + free(_audiobuf); +} + +void TheoraDecoder::queuePage(ogg_page *page) { + if (_theoraPacket) + ogg_stream_pagein(&_theoraOut, page); + + if (_vorbisPacket) + ogg_stream_pagein(&_vorbisOut, page); +} + +int TheoraDecoder::bufferData() { + char *buffer = ogg_sync_buffer(&_oggSync, 4096); + int bytes = _fileStream->read(buffer, 4096); + + ogg_sync_wrote(&_oggSync, bytes); + + return bytes; +} + +bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { + close(); + + _endOfAudio = false; + _endOfVideo = false; + _fileStream = stream; + + // start up Ogg stream synchronization layer + ogg_sync_init(&_oggSync); + + // init supporting Vorbis structures needed in header parsing + vorbis_info_init(&_vorbisInfo); + vorbis_comment_init(&_vorbisComment); + + // init supporting Theora structures needed in header parsing + th_comment_init(&_theoraComment); + th_info_init(&_theoraInfo); + + // Ogg file open; parse the headers + // Only interested in Vorbis/Theora streams + bool foundHeader = false; + while (!foundHeader) { + int ret = bufferData(); + + if (ret == 0) + break; + + while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) { + ogg_stream_state test; + + // is this a mandated initial header? If not, stop parsing + if (!ogg_page_bos(&_oggPage)) { + // don't leak the page; get it into the appropriate stream + queuePage(&_oggPage); + foundHeader = true; + break; + } + + ogg_stream_init(&test, ogg_page_serialno(&_oggPage)); + ogg_stream_pagein(&test, &_oggPage); + ogg_stream_packetout(&test, &_oggPacket); + + // identify the codec: try theora + if (!_theoraPacket && th_decode_headerin(&_theoraInfo, &_theoraComment, &_theoraSetup, &_oggPacket) >= 0) { + // it is theora + memcpy(&_theoraOut, &test, sizeof(test)); + _theoraPacket = 1; + } else if (!_vorbisPacket && vorbis_synthesis_headerin(&_vorbisInfo, &_vorbisComment, &_oggPacket) >= 0) { + // it is vorbis + memcpy(&_vorbisOut, &test, sizeof(test)); + _vorbisPacket = 1; + } else { + // whatever it is, we don't care about it + ogg_stream_clear(&test); + } + } + // fall through to non-bos page parsing + } + + // we're expecting more header packets. + while ((_theoraPacket && _theoraPacket < 3) || (_vorbisPacket && _vorbisPacket < 3)) { + int ret; + + // look for further theora headers + while (_theoraPacket && (_theoraPacket < 3) && (ret = ogg_stream_packetout(&_theoraOut, &_oggPacket))) { + if (ret < 0) + error("Error parsing Theora stream headers; corrupt stream?"); + + if (!th_decode_headerin(&_theoraInfo, &_theoraComment, &_theoraSetup, &_oggPacket)) + error("Error parsing Theora stream headers; corrupt stream?"); + + _theoraPacket++; + } + + // look for more vorbis header packets + while (_vorbisPacket && (_vorbisPacket < 3) && (ret = ogg_stream_packetout(&_vorbisOut, &_oggPacket))) { + if (ret < 0) + error("Error parsing Vorbis stream headers; corrupt stream?"); + + if (vorbis_synthesis_headerin(&_vorbisInfo, &_vorbisComment, &_oggPacket)) + error("Error parsing Vorbis stream headers; corrupt stream?"); + + _vorbisPacket++; + + if (_vorbisPacket == 3) + break; + } + + // The header pages/packets will arrive before anything else we + // care about, or the stream is not obeying spec + + if (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) { + queuePage(&_oggPage); // demux into the appropriate stream + } else { + ret = bufferData(); // someone needs more data + + if (ret == 0) + error("End of file while searching for codec headers."); + } + } + + // and now we have it all. initialize decoders + if (_theoraPacket) { + _theoraDecode = th_decode_alloc(&_theoraInfo, _theoraSetup); + debugN(1, "Ogg logical stream %lx is Theora %dx%d %.02f fps", + _theoraOut.serialno, _theoraInfo.pic_width, _theoraInfo.pic_height, + (double)_theoraInfo.fps_numerator / _theoraInfo.fps_denominator); + + switch (_theoraInfo.pixel_fmt) { + case TH_PF_420: + debug(1, " 4:2:0 video"); + break; + case TH_PF_422: + debug(1, " 4:2:2 video"); + break; + case TH_PF_444: + debug(1, " 4:4:4 video"); + break; + case TH_PF_RSVD: + default: + debug(1, " video\n (UNKNOWN Chroma sampling!)"); + break; + } + + if (_theoraInfo.pic_width != _theoraInfo.frame_width || _theoraInfo.pic_height != _theoraInfo.frame_height) + debug(1, " Frame content is %dx%d with offset (%d,%d).", + _theoraInfo.frame_width, _theoraInfo.frame_height, _theoraInfo.pic_x, _theoraInfo.pic_y); + + switch (_theoraInfo.colorspace){ + case TH_CS_UNSPECIFIED: + /* nothing to report */ + break; + case TH_CS_ITU_REC_470M: + debug(1, " encoder specified ITU Rec 470M (NTSC) color."); + break; + case TH_CS_ITU_REC_470BG: + debug(1, " encoder specified ITU Rec 470BG (PAL) color."); + break; + default: + debug(1, "warning: encoder specified unknown colorspace (%d).", _theoraInfo.colorspace); + break; + } + + debug(1, "Encoded by %s", _theoraComment.vendor); + if (_theoraComment.comments) { + debug(1, "theora comment header:"); + for (int i = 0; i < _theoraComment.comments; i++) { + if (_theoraComment.user_comments[i]) { + int len = _theoraComment.comment_lengths[i]; + char *value = (char *)malloc(len + 1); + if (value) { + memcpy(value, _theoraComment.user_comments[i], len); + value[len] = '\0'; + debug(1, "\t%s", value); + free(value); + } + } + } + } + + th_decode_ctl(_theoraDecode, TH_DECCTL_GET_PPLEVEL_MAX, &_ppLevelMax, sizeof(_ppLevelMax)); + _ppLevel = _ppLevelMax; + th_decode_ctl(_theoraDecode, TH_DECCTL_SET_PPLEVEL, &_ppLevel, sizeof(_ppLevel)); + _ppInc = 0; + } else { + // tear down the partial theora setup + th_info_clear(&_theoraInfo); + th_comment_clear(&_theoraComment); + } + + th_setup_free(_theoraSetup); + _theoraSetup = 0; + + if (_vorbisPacket) { + vorbis_synthesis_init(&_vorbisDSP, &_vorbisInfo); + vorbis_block_init(&_vorbisDSP, &_vorbisBlock); + debug(3, "Ogg logical stream %lx is Vorbis %d channel %ld Hz audio.", + _vorbisOut.serialno, _vorbisInfo.channels, _vorbisInfo.rate); + + _audStream = Audio::makeQueuingAudioStream(_vorbisInfo.rate, _vorbisInfo.channels); + + // Get enough audio data to start us off + while (_audStream->numQueuedStreams() == 0) { + // Queue more data + bufferData(); + while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) + queuePage(&_oggPage); + + queueAudio(); + } + + if (_audStream) + g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, _audHandle, _audStream, -1, getVolume(), getBalance()); + } else { + // tear down the partial vorbis setup + vorbis_info_clear(&_vorbisInfo); + vorbis_comment_clear(&_vorbisComment); + _endOfAudio = true; + } + + _surface.create(_theoraInfo.frame_width, _theoraInfo.frame_height, g_system->getScreenFormat()); + + // Set up a display surface + _displaySurface.pixels = _surface.getBasePtr(_theoraInfo.pic_x, _theoraInfo.pic_y); + _displaySurface.w = _theoraInfo.pic_width; + _displaySurface.h = _theoraInfo.pic_height; + _displaySurface.format = _surface.format; + _displaySurface.pitch = _surface.pitch; + + // Set the frame rate + _frameRate = Common::Rational(_theoraInfo.fps_numerator, _theoraInfo.fps_denominator); + + return true; +} + +void TheoraDecoder::close() { + if (_vorbisPacket) { + ogg_stream_clear(&_vorbisOut); + vorbis_block_clear(&_vorbisBlock); + vorbis_dsp_clear(&_vorbisDSP); + vorbis_comment_clear(&_vorbisComment); + vorbis_info_clear(&_vorbisInfo); + + g_system->getMixer()->stopHandle(*_audHandle); + + _audStream = 0; + _vorbisPacket = false; + } + if (_theoraPacket) { + ogg_stream_clear(&_theoraOut); + th_decode_free(_theoraDecode); + th_comment_clear(&_theoraComment); + th_info_clear(&_theoraInfo); + _theoraDecode = 0; + _theoraPacket = false; + } + + if (!_fileStream) + return; + + ogg_sync_clear(&_oggSync); + + delete _fileStream; + _fileStream = 0; + + _surface.free(); + _displaySurface.pixels = 0; + _displaySurface.free(); + + reset(); +} + +const Graphics::Surface *TheoraDecoder::decodeNextFrame() { + // First, let's get our frame + while (_theoraPacket) { + // theora is one in, one out... + if (ogg_stream_packetout(&_theoraOut, &_oggPacket) > 0) { + + if (_ppInc) { + _ppLevel += _ppInc; + th_decode_ctl(_theoraDecode, TH_DECCTL_SET_PPLEVEL, &_ppLevel, sizeof(_ppLevel)); + _ppInc = 0; + } + + if (th_decode_packetin(_theoraDecode, &_oggPacket, NULL) == 0) { + _curFrame++; + + // Convert YUV data to RGB data + th_ycbcr_buffer yuv; + th_decode_ycbcr_out(_theoraDecode, yuv); + translateYUVtoRGBA(yuv); + + if (_curFrame == 0) + _startTime = g_system->getMillis(); + + double time = th_granule_time(_theoraDecode, _oggPacket.granulepos); + + // We need to calculate when the next frame should be shown + // This is all in floating point because that's what the Ogg code gives us + // Ogg is a lossy container format, so it doesn't always list the time to the + // next frame. In such cases, we need to calculate it ourselves. + if (time == -1.0) + _nextFrameStartTime += _frameRate.getInverse().toDouble(); + else + _nextFrameStartTime = time; + + // break out + break; + } + } else { + // If we can't get any more frames, we're done. + if (_theoraOut.e_o_s || _fileStream->eos()) { + _endOfVideo = true; + break; + } + + // Queue more data + bufferData(); + while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) + queuePage(&_oggPage); + } + + // Update audio if we can + queueAudio(); + } + + // Force at least some audio to be buffered + // TODO: 5 is very arbitrary. We probably should do something like QuickTime does. + while (!_endOfAudio && _audStream->numQueuedStreams() < 5) { + bufferData(); + while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) + queuePage(&_oggPage); + + bool queuedAudio = queueAudio(); + if ((_vorbisOut.e_o_s || _fileStream->eos()) && !queuedAudio) { + _endOfAudio = true; + break; + } + } + + return &_displaySurface; +} + +bool TheoraDecoder::queueAudio() { + if (!_audStream) + return false; + + // An audio buffer should have been allocated (either in the constructor or after queuing the current buffer) + if (!_audiobuf) { + warning("[TheoraDecoder::queueAudio] Invalid audio buffer"); + return false; + } + + bool queuedAudio = false; + + for (;;) { + float **pcm; + + // if there's pending, decoded audio, grab it + int ret = vorbis_synthesis_pcmout(&_vorbisDSP, &pcm); + if (ret > 0) { + int count = _audiobufFill / 2; + int maxsamples = ((AUDIOFD_FRAGSIZE - _audiobufFill) / _vorbisInfo.channels) >> 1; + int i; + for (i = 0; i < ret && i < maxsamples; i++) + for (int j = 0; j < _vorbisInfo.channels; j++) { + int val = CLIP((int)rint(pcm[j][i] * 32767.f), -32768, 32767); + _audiobuf[count++] = val; + } + + vorbis_synthesis_read(&_vorbisDSP, i); + _audiobufFill += (i * _vorbisInfo.channels) << 1; + + if (_audiobufFill == AUDIOFD_FRAGSIZE) { + byte flags = Audio::FLAG_16BITS | Audio::FLAG_STEREO; +#ifdef SCUMM_LITTLE_ENDIAN + flags |= Audio::FLAG_LITTLE_ENDIAN; +#endif + _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::NO, flags); + + // The audio mixer is now responsible for the old audio buffer. + // We need to create a new one. + _audiobuf = (ogg_int16_t *)malloc(AUDIOFD_FRAGSIZE * sizeof(ogg_int16_t)); + if (!_audiobuf) { + warning("[TheoraDecoder::queueAudio] Cannot allocate memory for audio buffer"); + return false; + } + + _audiobufFill = 0; + queuedAudio = true; + } + } else { + // no pending audio; is there a pending packet to decode? + if (ogg_stream_packetout(&_vorbisOut, &_oggPacket) > 0) { + if (vorbis_synthesis(&_vorbisBlock, &_oggPacket) == 0) // test for success! + vorbis_synthesis_blockin(&_vorbisDSP, &_vorbisBlock); + } else // we've buffered all we have, break out for now + return queuedAudio; + } + } + + // Unreachable + return false; +} + +void TheoraDecoder::reset() { + VideoDecoder::reset(); + + // FIXME: This does a rewind() instead of a reset()! + + if (_fileStream) + _fileStream->seek(0); + + _audiobufFill = 0; + _audiobufReady = false; + + _curFrame = -1; + + _theoraPacket = 0; + _vorbisPacket = 0; +} + +bool TheoraDecoder::endOfVideo() const { + return !isVideoLoaded() || (_endOfVideo && (!_audStream || (_audStream->endOfData() && _endOfAudio))); +} + +uint32 TheoraDecoder::getTimeToNextFrame() const { + if (endOfVideo() || _curFrame < 0) + return 0; + + uint32 elapsedTime = getTime(); + uint32 nextFrameStartTime = (uint32)(_nextFrameStartTime * 1000); + + if (nextFrameStartTime <= elapsedTime) + return 0; + + return nextFrameStartTime - elapsedTime; +} + +uint32 TheoraDecoder::getTime() const { + if (_audStream) + return g_system->getMixer()->getSoundElapsedTime(*_audHandle); + + return VideoDecoder::getTime(); +} + +void TheoraDecoder::pauseVideoIntern(bool pause) { + if (_audStream) + g_system->getMixer()->pauseHandle(*_audHandle, pause); +} + +enum TheoraYUVBuffers { + kBufferY = 0, + kBufferU = 1, + kBufferV = 2 +}; + +void TheoraDecoder::translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer) { + // Width and height of all buffers have to be divisible by 2. + assert((YUVBuffer[kBufferY].width & 1) == 0); + assert((YUVBuffer[kBufferY].height & 1) == 0); + assert((YUVBuffer[kBufferU].width & 1) == 0); + assert((YUVBuffer[kBufferV].width & 1) == 0); + + // UV images have to have a quarter of the Y image resolution + assert(YUVBuffer[kBufferU].width == YUVBuffer[kBufferY].width >> 1); + assert(YUVBuffer[kBufferV].width == YUVBuffer[kBufferY].width >> 1); + assert(YUVBuffer[kBufferU].height == YUVBuffer[kBufferY].height >> 1); + assert(YUVBuffer[kBufferV].height == YUVBuffer[kBufferY].height >> 1); + + Graphics::convertYUV420ToRGB(&_surface, YUVBuffer[kBufferY].data, YUVBuffer[kBufferU].data, YUVBuffer[kBufferV].data, YUVBuffer[kBufferY].width, YUVBuffer[kBufferY].height, YUVBuffer[kBufferY].stride, YUVBuffer[kBufferU].stride); +} + +void TheoraDecoder::updateVolume() { + if (g_system->getMixer()->isSoundHandleActive(*_audHandle)) + g_system->getMixer()->setChannelVolume(*_audHandle, getVolume()); +} + +void TheoraDecoder::updateBalance() { + if (g_system->getMixer()->isSoundHandleActive(*_audHandle)) + g_system->getMixer()->setChannelBalance(*_audHandle, getBalance()); +} + +} // End of namespace Video diff --git a/video/theora_decoder.h b/video/theora_decoder.h new file mode 100644 index 0000000000..459fc064d3 --- /dev/null +++ b/video/theora_decoder.h @@ -0,0 +1,144 @@ +/* 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/scummsys.h" // for USE_THEORADEC + +#ifdef USE_THEORADEC + +#ifndef VIDEO_THEORA_DECODER_H +#define VIDEO_THEORA_DECODER_H + +#include "common/rational.h" +#include "video/video_decoder.h" +#include "audio/audiostream.h" +#include "audio/mixer.h" +#include "graphics/pixelformat.h" +#include "graphics/surface.h" + +#include +#include + +namespace Common { +class SeekableReadStream; +} + +namespace Video { + +/** + * + * Decoder for Theora videos. + * Video decoder used in engines: + * - sword25 + */ +class TheoraDecoder : public VideoDecoder { +public: + TheoraDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kMusicSoundType); + virtual ~TheoraDecoder(); + + /** + * Load a video file + * @param stream the stream to load + */ + bool loadStream(Common::SeekableReadStream *stream); + void close(); + void reset(); + + /** + * Decode the next frame and return the frame's surface + * @note the return surface should *not* be freed + * @note this may return 0, in which case the last frame should be kept on screen + */ + const Graphics::Surface *decodeNextFrame(); + + bool isVideoLoaded() const { return _fileStream != 0; } + uint16 getWidth() const { return _displaySurface.w; } + uint16 getHeight() const { return _displaySurface.h; } + + uint32 getFrameCount() const { + // It is not possible to get frame count easily + // I.e. seeking is required + assert(0); + return 0; + } + + Graphics::PixelFormat getPixelFormat() const { return _displaySurface.format; } + uint32 getTime() const; + uint32 getTimeToNextFrame() const; + + bool endOfVideo() const; + +protected: + // VideoDecoder API + void updateVolume(); + void updateBalance(); + void pauseVideoIntern(bool pause); + +private: + void queuePage(ogg_page *page); + bool queueAudio(); + int bufferData(); + void translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer); + + Common::SeekableReadStream *_fileStream; + Graphics::Surface _surface; + Graphics::Surface _displaySurface; + Common::Rational _frameRate; + double _nextFrameStartTime; + bool _endOfVideo; + bool _endOfAudio; + + Audio::Mixer::SoundType _soundType; + Audio::SoundHandle *_audHandle; + Audio::QueuingAudioStream *_audStream; + + ogg_sync_state _oggSync; + ogg_page _oggPage; + ogg_packet _oggPacket; + ogg_stream_state _vorbisOut; + ogg_stream_state _theoraOut; + th_info _theoraInfo; + th_comment _theoraComment; + th_dec_ctx *_theoraDecode; + th_setup_info *_theoraSetup; + vorbis_info _vorbisInfo; + vorbis_dsp_state _vorbisDSP; + vorbis_block _vorbisBlock; + vorbis_comment _vorbisComment; + + int _theoraPacket; + int _vorbisPacket; + + int _ppLevelMax; + int _ppLevel; + int _ppInc; + + // single audio fragment audio buffering + int _audiobufFill; + bool _audiobufReady; + ogg_int16_t *_audiobuf; +}; + +} // End of namespace Video + +#endif + +#endif -- cgit v1.2.3 From 7ea7a8ae7eeca2b7d6ddcc413012158d798a836e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 12 Aug 2012 14:58:16 +0200 Subject: I18N: Update POTFILES and rebuild the translations. --- gui/themes/translations.dat | Bin 342397 -> 342397 bytes po/POTFILES | 2 +- po/ca_ES.po | 182 +++++---- po/cs_CZ.po | 185 ++++++---- po/da_DA.po | 879 +++++++++++++++++++++----------------------- po/de_DE.po | 185 ++++++---- po/es_ES.po | 186 ++++++---- po/eu.po | 182 +++++---- po/fr_FR.po | 189 ++++++---- po/hu_HU.po | 185 ++++++---- po/it_IT.po | 185 ++++++---- po/nb_NO.po | 185 ++++++---- po/nn_NO.po | 182 +++++---- po/pl_PL.po | 182 +++++---- po/pt_BR.po | 182 +++++---- po/ru_RU.po | 232 +++++++----- po/scummvm.pot | 180 +++++---- po/se_SE.po | 185 ++++++---- po/uk_UA.po | 187 ++++++---- 19 files changed, 2367 insertions(+), 1508 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index 4b35fdb9a8..cabad0c0c4 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ diff --git a/po/POTFILES b/po/POTFILES index 36bd2ff4c7..72c6fb1d18 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -10,7 +10,7 @@ gui/KeysDialog.cpp gui/launcher.cpp gui/massadd.cpp gui/options.cpp -gui/saveload.cpp +gui/saveload-dialog.cpp gui/themebrowser.cpp gui/ThemeEngine.cpp gui/widget.cpp diff --git a/po/ca_ES.po b/po/ca_ES.po index 8a978bee0d..3e8ade3923 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2011-10-04 20:51+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" +"Language: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Catalan\n" #: gui/about.cpp:91 #, c-format @@ -44,10 +44,11 @@ msgstr "Amunt" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -91,16 +92,16 @@ msgstr "Assigna" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "D'acord" @@ -442,13 +443,13 @@ msgstr "Cerca a la llista de jocs" msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Carrega partida:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -931,68 +932,104 @@ msgstr "" "El tema que heu seleccionat no suporta l'idioma actual. Si voleu utilitzar " "aquest tema primer haureu de canviar a un altre idioma." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "No hi ha data desada" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "No hi ha hora desada" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "No hi ha temps de joc desat" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Suprimeix" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Realment voleu suprimir aquesta partida?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Data: " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Hora: " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Temps de joc: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Partida sense ttol" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Desa" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "No s'ha pogut desar l'estat del joc" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Nom:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Seleccioneu un Tema" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "GFX desactivats" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "GFX desactivats" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Pintat estndard (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Estndard (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Pintat amb antialias (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Amb antialias (16bpp)" @@ -1096,17 +1133,17 @@ msgstr "Cancel msgid "Unknown error" msgstr "Error desconegut" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "El joc a '%s' sembla ser desconegut." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" "Informeu de la segent informaci a l'equip de ScummVM juntament amb el" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "nom del joc que heu provat d'afegir i la seva versi/llengua/etc.:" @@ -1144,13 +1181,13 @@ msgid "~R~eturn to Launcher" msgstr "~R~etorna al Llanador" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Desa la partida:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1268,11 +1305,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Recupera la partida:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Restaura" @@ -1997,7 +2034,7 @@ msgstr "" "El suport de MIDI natiu requereix l'actualitzaci Roland de LucasArts,\n" "per no s'ha trobat %s. S'utilitzar AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2008,7 +2045,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2019,7 +2056,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2072,11 +2109,11 @@ msgid "Cutscene file '%s' not found!" msgstr "No s'ha trobat el fitxer d'escena '%s'!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "No s'ha pogut carregar l'estat del joc del fitxer." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "No s'ha pogut desar l'estat del joc al fitxer." @@ -2217,12 +2254,12 @@ msgstr "" "Roland MT32 als de General MIDI. s possible\n" "que algunes pistes no es reprodueixin correctament." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +msgid "Use an alternative game intro (CD version only)" msgstr "" #: engines/sky/compact.cpp:130 @@ -2241,6 +2278,14 @@ msgstr "" "El fitxer \"sky.cpt\" t una mida incorrecta.\n" "Torneu a baixar-lo de www.scummvm.org" +#: 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:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2316,6 +2361,17 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2568,11 +2624,11 @@ msgstr "Mode Touchpad activat." msgid "Touchpad mode disabled." msgstr "Mode Touchpad desactivat." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2580,12 +2636,12 @@ msgstr "" msgid "Left Click" msgstr "Clic esquerre" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 #, fuzzy msgid "Middle Click" msgstr "Element mig esquerre" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2989,37 +3045,37 @@ msgstr "Llan msgid "Do you really want to quit?" msgstr "Ests segur de voler sortir?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "'Mode Toc' de pantalla tctil - Clic esquerre" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "'Mode Toc' de pantalla tctil - Clic dret" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "'Mode Toc' de pantalla tctil - Flotant (sense clic)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Volum mxim" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Pujant el volum" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Volum mnim" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Baixant el volum" diff --git a/po/cs_CZ.po b/po/cs_CZ.po index a2d640651c..107be45398 100644 --- a/po/cs_CZ.po +++ b/po/cs_CZ.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-08 18:03+0100\n" "Last-Translator: Zbynk Schwarz \n" "Language-Team: \n" +"Language: Cesky\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Cesky\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" "X-Poedit-Language: Czech\n" "X-Poedit-Country: CZECH REPUBLIC\n" @@ -48,10 +48,11 @@ msgstr "J #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -94,16 +95,16 @@ msgstr "Mapovat" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -439,13 +440,13 @@ msgstr "Hledat v seznamu her" msgid "Search:" msgstr "Hledat:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Nahrt hru:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -919,68 +920,104 @@ msgstr "" "Vzhled, kter jste zvolili, nepodporuje V souasn jazyk. Pokud chcete " "tento vzhled pout, muste nejdve pepnout na jin jazyk." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Neuloena dn data" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "dn uloen as" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "dn uloen doba hran" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Smazat" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Opravdu chcete tuto uloenou hru vymazat" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Datum:" -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "as:" -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Doba hran:" -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Bezejmenn uloen stav" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Uloit" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Nelze uloit hru." + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Jmno" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Vyberte Vzhled" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "GFX zakzno" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "GFX zakzno" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Standardn Vykreslova (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standardn (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Vykreslova s vyhlazenmi hranami (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "S vyhlazenmi hranami (16bpp)" @@ -1084,16 +1121,16 @@ msgstr "Zru msgid "Unknown error" msgstr "Neznm chyba" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "Hra v '%s' se zd bt neznm." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "Prosm nahlaste nsledujc data tmu ScummVM spolu se jmnem" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "hry, kterou jste se pokusili pidat a jej verzi/jazyk/atd.:" @@ -1131,13 +1168,13 @@ msgid "~R~eturn to Launcher" msgstr "~N~vrat do Spoute" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Uloit hru:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1256,11 +1293,11 @@ msgstr "Pou msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Pout pvodn obrazovky naten/uloen msto ze ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Obnovit hru" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Obnovit" @@ -1982,7 +2019,7 @@ msgstr "" "Pirozen podpora MIDI vyaduje Aktualizaci Roland od LucasArts,\n" "ale %s chyb. Msto toho je pouit AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1993,7 +2030,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2004,7 +2041,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2057,11 +2094,11 @@ msgid "Cutscene file '%s' not found!" msgstr "Soubor videa '%s' nenalezen'" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Nelze nast stav hry ze souboru." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Nelze uloit stav hry do souboru." @@ -2193,12 +2230,13 @@ msgstr "" "ty od General MIDI. Je stle mon, e\n" "nkter stopy nebudou znt sprvn." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "vod z diskety" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "Pout verzi vodu z diskety (Pouze verze CD)" #: engines/sky/compact.cpp:130 @@ -2217,6 +2255,14 @@ msgstr "" "Soubor \"sky.cpt\" m nesprvnou velikost.\n" "Sthnte si ho, prosm, (znovu) z www.scummvm.org" +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "vod z diskety" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "Pout verzi vodu z diskety (Pouze verze CD)" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2287,6 +2333,17 @@ msgstr "Zobrazit jmenovky objekt msgid "Show labels for objects on mouse hover" msgstr "Zobrazit jmenovky objekt pi najet myi" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2537,11 +2594,11 @@ msgstr "Touchpad re msgid "Touchpad mode disabled." msgstr "Touchpad reim vypnut" -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Reim kliknut" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2549,11 +2606,11 @@ msgstr "Re msgid "Left Click" msgstr "Lev Kliknut" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Kliknut prostednm tlatkem" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2959,37 +3016,37 @@ msgstr "Spou msgid "Do you really want to quit?" msgstr "Opravdu chcete skonit?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "'Reim uknut' Dotykov Obrazovky - Lev Kliknut" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "'Reim uknut' Dotykov Obrazovky - Prav Kliknut" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "'Reim uknut' Dotykov Obrazovky - Najet (Bez Kliknut)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Maximln Hlasitost" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Zvyuji Hlasitost" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Minimln Hlasitost" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Sniuji Hlasitost" diff --git a/po/da_DA.po b/po/da_DA.po index c2d55f82cd..b30ef1bf02 100644 --- a/po/da_DA.po +++ b/po/da_DA.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-09 20:27+0100\n" "Last-Translator: Steffen Nyeland \n" "Language-Team: Steffen Nyeland \n" +"Language: Dansk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Dansk\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: Danish\n" "X-Poedit-Country: DENMARK\n" @@ -35,8 +35,7 @@ msgstr "Tilg msgid "Go up" msgstr "G op" -#: gui/browser.cpp:66 -#: gui/browser.cpp:68 +#: gui/browser.cpp:66 gui/browser.cpp:68 msgid "Go to previous directory level" msgstr "G til forrige biblioteks niveau" @@ -45,37 +44,25 @@ msgctxt "lowres" msgid "Go up" msgstr "G op" -#: gui/browser.cpp:69 -#: gui/chooser.cpp:45 -#: gui/KeysDialog.cpp:43 -#: gui/launcher.cpp:345 -#: gui/massadd.cpp:94 -#: gui/options.cpp:1228 -#: gui/saveload.cpp:64 -#: gui/saveload.cpp:173 -#: gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 -#: engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 -#: engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 +#: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" msgstr "Fortryd" -#: gui/browser.cpp:70 -#: gui/chooser.cpp:46 -#: gui/themebrowser.cpp:55 +#: gui/browser.cpp:70 gui/chooser.cpp:46 gui/themebrowser.cpp:55 msgid "Choose" msgstr "Vlg" -#: gui/gui-manager.cpp:115 -#: 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 +#: gui/gui-manager.cpp:115 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 #: backends/keymapper/remap-dialog.cpp:52 msgid "Close" msgstr "Luk" @@ -84,23 +71,19 @@ msgstr "Luk" msgid "Mouse click" msgstr "Muse klik" -#: gui/gui-manager.cpp:122 -#: base/main.cpp:300 +#: gui/gui-manager.cpp:122 base/main.cpp:300 msgid "Display keyboard" msgstr "Vis tastatur" -#: gui/gui-manager.cpp:126 -#: base/main.cpp:304 +#: gui/gui-manager.cpp:126 base/main.cpp:304 msgid "Remap keys" msgstr "Kortlg taster" -#: gui/gui-manager.cpp:129 -#: base/main.cpp:307 +#: gui/gui-manager.cpp:129 base/main.cpp:307 msgid "Toggle FullScreen" msgstr "Skift fuldskrm" -#: gui/KeysDialog.h:36 -#: gui/KeysDialog.cpp:145 +#: gui/KeysDialog.h:36 gui/KeysDialog.cpp:145 msgid "Choose an action to map" msgstr "Vlg en handling at kortlgge" @@ -108,32 +91,18 @@ msgstr "V msgid "Map" msgstr "Kortlg" -#: gui/KeysDialog.cpp:42 -#: gui/launcher.cpp:346 -#: gui/launcher.cpp:1001 -#: gui/launcher.cpp:1005 -#: gui/massadd.cpp:91 -#: gui/options.cpp:1229 -#: engines/engine.cpp:361 -#: engines/engine.cpp:372 -#: engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 -#: engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 -#: engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 -#: engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 -#: engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 -#: engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 -#: engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 -#: engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 -#: engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 +#: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -142,16 +111,12 @@ msgstr "OK" msgid "Select an action and click 'Map'" msgstr "Vlg en handling og klik 'Kortlg'" -#: gui/KeysDialog.cpp:80 -#: gui/KeysDialog.cpp:102 -#: gui/KeysDialog.cpp:141 +#: gui/KeysDialog.cpp:80 gui/KeysDialog.cpp:102 gui/KeysDialog.cpp:141 #, c-format msgid "Associated key : %s" msgstr "Tilknyttet tast : %s" -#: gui/KeysDialog.cpp:82 -#: gui/KeysDialog.cpp:104 -#: gui/KeysDialog.cpp:143 +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 #, c-format msgid "Associated key : none" msgstr "Tilknyttet tast : ingen" @@ -172,11 +137,13 @@ msgstr "Spil" msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:191 -#: gui/launcher.cpp:193 -#: gui/launcher.cpp:194 -msgid "Short game identifier used for referring to savegames and running the game from the command line" -msgstr "Kort spil identifikator til brug for gemmer, og for at kre spillet fra kommandolinien" +#: gui/launcher.cpp:191 gui/launcher.cpp:193 gui/launcher.cpp:194 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"Kort spil identifikator til brug for gemmer, og for at kre spillet fra " +"kommandolinien" #: gui/launcher.cpp:193 msgctxt "lowres" @@ -187,9 +154,7 @@ msgstr "ID:" msgid "Name:" msgstr "Navn:" -#: gui/launcher.cpp:198 -#: gui/launcher.cpp:200 -#: gui/launcher.cpp:201 +#: gui/launcher.cpp:198 gui/launcher.cpp:200 gui/launcher.cpp:201 msgid "Full title of the game" msgstr "Fuld titel p spillet" @@ -202,17 +167,16 @@ msgstr "Navn:" msgid "Language:" msgstr "Sprog:" -#: gui/launcher.cpp:204 -#: gui/launcher.cpp:205 -msgid "Language of the game. This will not turn your Spanish game version into English" -msgstr "Spillets sprog. Dette vil ikke ndre din spanske version af spillet til engelsk" +#: gui/launcher.cpp:204 gui/launcher.cpp:205 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"Spillets sprog. Dette vil ikke ndre din spanske version af spillet til " +"engelsk" -#: gui/launcher.cpp:206 -#: gui/launcher.cpp:220 -#: gui/options.cpp:80 -#: gui/options.cpp:730 -#: gui/options.cpp:743 -#: gui/options.cpp:1199 +#: gui/launcher.cpp:206 gui/launcher.cpp:220 gui/options.cpp:80 +#: gui/options.cpp:730 gui/options.cpp:743 gui/options.cpp:1199 #: audio/null.cpp:40 msgid "" msgstr "" @@ -221,9 +185,7 @@ msgstr "" msgid "Platform:" msgstr "Platform:" -#: gui/launcher.cpp:216 -#: gui/launcher.cpp:218 -#: gui/launcher.cpp:219 +#: gui/launcher.cpp:216 gui/launcher.cpp:218 gui/launcher.cpp:219 msgid "Platform the game was originally designed for" msgstr "Platform som spillet oprindeligt var designet til" @@ -236,15 +198,11 @@ msgstr "Platform:" msgid "Engine" msgstr "Motor" -#: gui/launcher.cpp:239 -#: gui/options.cpp:1062 -#: gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:239 -#: gui/options.cpp:1062 -#: gui/options.cpp:1079 +#: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "GFX" msgstr "GFX" @@ -257,8 +215,7 @@ msgctxt "lowres" msgid "Override global graphic settings" msgstr "Overstyr globale grafik indstillinger" -#: gui/launcher.cpp:251 -#: gui/options.cpp:1085 +#: gui/launcher.cpp:251 gui/options.cpp:1085 msgid "Audio" msgstr "Lyd" @@ -271,13 +228,11 @@ msgctxt "lowres" msgid "Override global audio settings" msgstr "Overstyr globale lyd indstillinger" -#: gui/launcher.cpp:265 -#: gui/options.cpp:1090 +#: gui/launcher.cpp:265 gui/options.cpp:1090 msgid "Volume" msgstr "Lydstyrke" -#: gui/launcher.cpp:267 -#: gui/options.cpp:1092 +#: gui/launcher.cpp:267 gui/options.cpp:1092 msgctxt "lowres" msgid "Volume" msgstr "Lydstyrke" @@ -291,8 +246,7 @@ msgctxt "lowres" msgid "Override global volume settings" msgstr "Overstyr globale lydstyrke indstillinger" -#: gui/launcher.cpp:280 -#: gui/options.cpp:1100 +#: gui/launcher.cpp:280 gui/options.cpp:1100 msgid "MIDI" msgstr "MIDI" @@ -305,8 +259,7 @@ msgctxt "lowres" msgid "Override global MIDI settings" msgstr "Overstyr globale MIDI indstillinger" -#: gui/launcher.cpp:294 -#: gui/options.cpp:1106 +#: gui/launcher.cpp:294 gui/options.cpp:1106 msgid "MT-32" msgstr "MT-32" @@ -319,13 +272,11 @@ msgctxt "lowres" msgid "Override global MT-32 settings" msgstr "Overstyr globale MT-32 indstillinger" -#: gui/launcher.cpp:308 -#: gui/options.cpp:1113 +#: gui/launcher.cpp:308 gui/options.cpp:1113 msgid "Paths" msgstr "Stier" -#: gui/launcher.cpp:310 -#: gui/options.cpp:1115 +#: gui/launcher.cpp:310 gui/options.cpp:1115 msgctxt "lowres" msgid "Paths" msgstr "Stier" @@ -339,80 +290,54 @@ msgctxt "lowres" msgid "Game Path:" msgstr "Spil sti:" -#: gui/launcher.cpp:324 -#: gui/options.cpp:1139 +#: gui/launcher.cpp:324 gui/options.cpp:1139 msgid "Extra Path:" msgstr "Ekstra sti:" -#: gui/launcher.cpp:324 -#: gui/launcher.cpp:326 -#: gui/launcher.cpp:327 +#: gui/launcher.cpp:324 gui/launcher.cpp:326 gui/launcher.cpp:327 msgid "Specifies path to additional data used the game" msgstr "Angiver sti til ekstra data der bruges i spillet" -#: gui/launcher.cpp:326 -#: gui/options.cpp:1141 +#: gui/launcher.cpp:326 gui/options.cpp:1141 msgctxt "lowres" msgid "Extra Path:" msgstr "Ekstra sti:" -#: gui/launcher.cpp:333 -#: gui/options.cpp:1123 +#: gui/launcher.cpp:333 gui/options.cpp:1123 msgid "Save Path:" msgstr "Gemme sti:" -#: gui/launcher.cpp:333 -#: gui/launcher.cpp:335 -#: gui/launcher.cpp:336 -#: gui/options.cpp:1123 -#: gui/options.cpp:1125 -#: gui/options.cpp:1126 +#: gui/launcher.cpp:333 gui/launcher.cpp:335 gui/launcher.cpp:336 +#: gui/options.cpp:1123 gui/options.cpp:1125 gui/options.cpp:1126 msgid "Specifies where your savegames are put" msgstr "Angiver hvor dine gemmer bliver lagt" -#: gui/launcher.cpp:335 -#: gui/options.cpp:1125 +#: gui/launcher.cpp:335 gui/options.cpp:1125 msgctxt "lowres" msgid "Save Path:" msgstr "Gemme sti:" -#: gui/launcher.cpp:354 -#: gui/launcher.cpp:453 -#: gui/launcher.cpp:511 -#: gui/launcher.cpp:565 -#: gui/options.cpp:1134 -#: gui/options.cpp:1142 -#: gui/options.cpp:1151 -#: gui/options.cpp:1258 -#: gui/options.cpp:1264 -#: gui/options.cpp:1272 -#: gui/options.cpp:1302 -#: gui/options.cpp:1308 -#: gui/options.cpp:1315 -#: gui/options.cpp:1408 -#: gui/options.cpp:1411 +#: gui/launcher.cpp:354 gui/launcher.cpp:453 gui/launcher.cpp:511 +#: gui/launcher.cpp:565 gui/options.cpp:1134 gui/options.cpp:1142 +#: gui/options.cpp:1151 gui/options.cpp:1258 gui/options.cpp:1264 +#: gui/options.cpp:1272 gui/options.cpp:1302 gui/options.cpp:1308 +#: gui/options.cpp:1315 gui/options.cpp:1408 gui/options.cpp:1411 #: gui/options.cpp:1423 msgctxt "path" msgid "None" msgstr "Ingen" -#: gui/launcher.cpp:359 -#: gui/launcher.cpp:459 -#: gui/launcher.cpp:569 -#: gui/options.cpp:1252 -#: gui/options.cpp:1296 -#: gui/options.cpp:1414 +#: gui/launcher.cpp:359 gui/launcher.cpp:459 gui/launcher.cpp:569 +#: gui/options.cpp:1252 gui/options.cpp:1296 gui/options.cpp:1414 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:504 -#: gui/options.cpp:1417 +#: gui/launcher.cpp:504 gui/options.cpp:1417 msgid "Select SoundFont" msgstr "Vlg SoundFont" -#: gui/launcher.cpp:523 -#: gui/launcher.cpp:677 +#: gui/launcher.cpp:523 gui/launcher.cpp:677 msgid "Select directory with game data" msgstr "Vlg bibliotek med spil data" @@ -428,13 +353,11 @@ msgstr "V msgid "This game ID is already taken. Please choose another one." msgstr "Dette spil ID er allerede i brug. Vlg venligst et andet." -#: gui/launcher.cpp:621 -#: engines/dialogs.cpp:110 +#: gui/launcher.cpp:621 engines/dialogs.cpp:110 msgid "~Q~uit" msgstr "~A~fslut" -#: gui/launcher.cpp:621 -#: backends/platform/sdl/macosx/appmenu_osx.mm:96 +#: gui/launcher.cpp:621 backends/platform/sdl/macosx/appmenu_osx.mm:96 msgid "Quit ScummVM" msgstr "Slut ScummVM" @@ -442,8 +365,7 @@ msgstr "Slut ScummVM" msgid "A~b~out..." msgstr "~O~m..." -#: gui/launcher.cpp:622 -#: backends/platform/sdl/macosx/appmenu_osx.mm:70 +#: gui/launcher.cpp:622 backends/platform/sdl/macosx/appmenu_osx.mm:70 msgid "About ScummVM" msgstr "Om ScummVM" @@ -471,13 +393,11 @@ msgstr "Ind~l~ msgid "Load savegame for selected game" msgstr "Indls gemmer for det valgte spil" -#: gui/launcher.cpp:633 -#: gui/launcher.cpp:1120 +#: gui/launcher.cpp:633 gui/launcher.cpp:1120 msgid "~A~dd Game..." msgstr "~T~ilfj spil..." -#: gui/launcher.cpp:633 -#: gui/launcher.cpp:640 +#: gui/launcher.cpp:633 gui/launcher.cpp:640 msgid "Hold Shift for Mass Add" msgstr "Hold Skift for at tilfje flere" @@ -485,8 +405,7 @@ msgstr "Hold Skift for at tilf msgid "~E~dit Game..." msgstr "~R~ediger spil..." -#: gui/launcher.cpp:635 -#: gui/launcher.cpp:642 +#: gui/launcher.cpp:635 gui/launcher.cpp:642 msgid "Change game options" msgstr "ndre spil indstillinger" @@ -494,13 +413,11 @@ msgstr " msgid "~R~emove Game" msgstr "~F~jern spil" -#: gui/launcher.cpp:637 -#: gui/launcher.cpp:644 +#: gui/launcher.cpp:637 gui/launcher.cpp:644 msgid "Remove game from the list. The game data files stay intact" msgstr "Fjerner spil fra listen. Spillets data filer forbliver uberrt" -#: gui/launcher.cpp:640 -#: gui/launcher.cpp:1120 +#: gui/launcher.cpp:640 gui/launcher.cpp:1120 msgctxt "lowres" msgid "~A~dd Game..." msgstr "~T~ilfj spil..." @@ -519,36 +436,31 @@ msgstr "~F~jern spil" msgid "Search in game list" msgstr "Sg i spil liste" -#: gui/launcher.cpp:656 -#: gui/launcher.cpp:1167 +#: gui/launcher.cpp:656 gui/launcher.cpp:1167 msgid "Search:" msgstr "Sg:" -#: gui/launcher.cpp:680 -#: engines/dialogs.cpp:114 -#: engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 +#: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Indls spil:" -#: gui/launcher.cpp:680 -#: engines/dialogs.cpp:114 -#: engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 -#: engines/mohawk/riven.cpp:716 -#: engines/cruise/menu.cpp:214 -#: backends/platform/wince/CEActionsPocket.cpp:267 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 +#: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" msgstr "Indls" #: gui/launcher.cpp:788 -msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." -msgstr "Vil du virkelig kre fler spils detektoren? Dette kunne potentielt tilfje et stort antal spil." +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Vil du virkelig kre fler spils detektoren? Dette kunne potentielt tilfje " +"et stort antal spil." -#: gui/launcher.cpp:789 -#: gui/launcher.cpp:937 +#: gui/launcher.cpp:789 gui/launcher.cpp:937 #: backends/events/symbiansdl/symbiansdl-events.cpp:184 #: backends/platform/wince/CEActionsPocket.cpp:326 #: backends/platform/wince/CEActionsSmartphone.cpp:287 @@ -556,8 +468,7 @@ msgstr "Vil du virkelig k msgid "Yes" msgstr "Ja" -#: gui/launcher.cpp:789 -#: gui/launcher.cpp:937 +#: gui/launcher.cpp:789 gui/launcher.cpp:937 #: backends/events/symbiansdl/symbiansdl-events.cpp:184 #: backends/platform/wince/CEActionsPocket.cpp:326 #: backends/platform/wince/CEActionsSmartphone.cpp:287 @@ -587,7 +498,8 @@ msgstr "Dette spil underst #: gui/launcher.cpp:1005 msgid "ScummVM could not find any engine capable of running the selected game!" -msgstr "ScummVM kunne ikke finde en motor, istand til at afvikle det valgte spil!" +msgstr "" +"ScummVM kunne ikke finde en motor, istand til at afvikle det valgte spil!" #: gui/launcher.cpp:1119 msgctxt "lowres" @@ -598,8 +510,7 @@ msgstr "Tilf msgid "Mass Add..." msgstr "Tilfj flere..." -#: gui/massadd.cpp:78 -#: gui/massadd.cpp:81 +#: gui/massadd.cpp:78 gui/massadd.cpp:81 msgid "... progress ..." msgstr "... fremskridt ..." @@ -662,11 +573,8 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:248 -#: gui/options.cpp:474 -#: gui/options.cpp:575 -#: gui/options.cpp:644 -#: gui/options.cpp:852 +#: gui/options.cpp:248 gui/options.cpp:474 gui/options.cpp:575 +#: gui/options.cpp:644 gui/options.cpp:852 msgctxt "soundfont" msgid "None" msgstr "Ingen" @@ -695,8 +603,7 @@ msgstr "Grafik tilstand:" msgid "Render mode:" msgstr "Rendere tilstand:" -#: gui/options.cpp:741 -#: gui/options.cpp:742 +#: gui/options.cpp:741 gui/options.cpp:742 msgid "Special dithering modes supported by some games" msgstr "Speciel farvereduceringstilstand understttet a nogle spil" @@ -722,14 +629,11 @@ msgstr "Foretruk. enhed:" msgid "Music Device:" msgstr "Musik enhed:" -#: gui/options.cpp:764 -#: gui/options.cpp:766 +#: gui/options.cpp:764 gui/options.cpp:766 msgid "Specifies preferred sound device or sound card emulator" msgstr "Angiver foretukket lyd enhed eller lydkort emulator" -#: gui/options.cpp:764 -#: gui/options.cpp:766 -#: gui/options.cpp:767 +#: gui/options.cpp:764 gui/options.cpp:766 gui/options.cpp:767 msgid "Specifies output sound device or sound card emulator" msgstr "Angiver lyd udgangsenhed eller lydkorts emulator" @@ -747,8 +651,7 @@ msgstr "Musik enhed:" msgid "AdLib emulator:" msgstr "AdLib emulator:" -#: gui/options.cpp:793 -#: gui/options.cpp:794 +#: gui/options.cpp:793 gui/options.cpp:794 msgid "AdLib is used for music in many games" msgstr "AdLib bliver brugt til musik i mange spil" @@ -756,10 +659,13 @@ msgstr "AdLib bliver brugt til musik i mange spil" msgid "Output rate:" msgstr "Udgangsfrekvens:" -#: gui/options.cpp:804 -#: gui/options.cpp:805 -msgid "Higher value specifies better sound quality but may be not supported by your soundcard" -msgstr "Hjere vrdi angiver bedre lyd kvalitet, men understttes mske ikke af dit lydkort" +#: gui/options.cpp:804 gui/options.cpp:805 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Hjere vrdi angiver bedre lyd kvalitet, men understttes mske ikke af dit " +"lydkort" #: gui/options.cpp:815 msgid "GM Device:" @@ -773,8 +679,7 @@ msgstr "Angiver standard lyd enhed for Generel MIDI-udgang" msgid "Don't use General MIDI music" msgstr "Brug ikke Generel MIDI musik" -#: gui/options.cpp:837 -#: gui/options.cpp:899 +#: gui/options.cpp:837 gui/options.cpp:899 msgid "Use first available device" msgstr "Brug frste tilgngelig enhed" @@ -782,9 +687,7 @@ msgstr "Brug f msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:849 -#: gui/options.cpp:851 -#: gui/options.cpp:852 +#: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont er understttet af nogle lydkort, Fluidsynth og Timidity" @@ -817,10 +720,13 @@ msgstr "Angiver standard lyd enhed for Roland MT-32/LAPC1/CM32I/CM64 udgang" msgid "True Roland MT-32 (disable GM emulation)" msgstr "gte Roland MT-32 (undlad GM emulering)" -#: gui/options.cpp:875 -#: gui/options.cpp:877 -msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" -msgstr "Kontroller om du vil bruge din rigtige hardware Roland-kompatible lyd enhed tilsluttet til din computer" +#: gui/options.cpp:875 gui/options.cpp:877 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Kontroller om du vil bruge din rigtige hardware Roland-kompatible lyd enhed " +"tilsluttet til din computer" #: gui/options.cpp:877 msgctxt "lowres" @@ -843,13 +749,11 @@ msgstr "Brug ikke Roland MT-32 musik" msgid "Text and Speech:" msgstr "Tekst og tale:" -#: gui/options.cpp:920 -#: gui/options.cpp:930 +#: gui/options.cpp:920 gui/options.cpp:930 msgid "Speech" msgstr "Tale" -#: gui/options.cpp:921 -#: gui/options.cpp:931 +#: gui/options.cpp:921 gui/options.cpp:931 msgid "Subtitles" msgstr "Undertekster" @@ -905,9 +809,7 @@ msgstr "Mute alle" msgid "SFX volume:" msgstr "SFX lydstyrke:" -#: gui/options.cpp:962 -#: gui/options.cpp:964 -#: gui/options.cpp:965 +#: gui/options.cpp:962 gui/options.cpp:964 gui/options.cpp:965 msgid "Special sound effects volume" msgstr "Lydstyrke for specielle lydeffekter" @@ -934,9 +836,7 @@ msgctxt "lowres" msgid "Theme Path:" msgstr "Tema sti:" -#: gui/options.cpp:1139 -#: gui/options.cpp:1141 -#: gui/options.cpp:1142 +#: gui/options.cpp:1139 gui/options.cpp:1141 gui/options.cpp:1142 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Angiver sti til ekstra data brugt af alle spil eller ScummVM" @@ -1012,83 +912,115 @@ msgid "Select directory for plugins" msgstr "Vlg bibliotek for plugins" #: gui/options.cpp:1450 -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 "Temaet du valgte understtter ikke dit aktuelle sprog. Hvis du nsker at bruge dette tema, skal du skifte til et andet sprog frst." +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 "" +"Temaet du valgte understtter ikke dit aktuelle sprog. Hvis du nsker at " +"bruge dette tema, skal du skifte til et andet sprog frst." + +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" -#: gui/saveload.cpp:59 -#: gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Ingen dato gemt" -#: gui/saveload.cpp:60 -#: gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Intet tidspunkt gemt" -#: gui/saveload.cpp:61 -#: gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Ingen spilletid gemt" -#: gui/saveload.cpp:68 -#: gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Slet" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Vil du virkelig slette denne gemmer?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Dato:" -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Tid:" -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Spilletid:" -#: gui/saveload.cpp:305 -#: gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Unavngivet gemmetilstand" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Gem" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Mislykkedes at gemme spil" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Navn:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Vlg et tema" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "Deaktiveret GFX" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "Deaktiveret GFX" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Standard renderer (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standard (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Antialias renderer (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Antialias (16bpp)" -#: gui/widget.cpp:322 -#: gui/widget.cpp:324 -#: gui/widget.cpp:330 -#: gui/widget.cpp:332 +#: gui/widget.cpp:322 gui/widget.cpp:324 gui/widget.cpp:330 gui/widget.cpp:332 msgid "Clear value" msgstr "Slet vrdi" @@ -1101,15 +1033,13 @@ msgstr "Motor underst msgid "Menu" msgstr "Menu" -#: base/main.cpp:290 -#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: base/main.cpp:290 backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:45 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Skip" msgstr "Spring over" -#: base/main.cpp:293 -#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: base/main.cpp:293 backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:42 msgid "Pause" msgstr "Pause" @@ -1190,16 +1120,17 @@ msgstr "Bruger annullerede" msgid "Unknown error" msgstr "Ukendt fejl" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "Spillet i '%s' ser ud til at vre ukendt." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" -msgstr "Venligst, rapportere flgende data til ScummVM holdet sammen med navnet" +msgstr "" +"Venligst, rapportere flgende data til ScummVM holdet sammen med navnet" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "p det spil, du forsgte at tilfje og dets version/sprog/ etc.:" @@ -1227,29 +1158,23 @@ msgstr "H~j~ msgid "~A~bout" msgstr "~O~m" -#: engines/dialogs.cpp:104 -#: engines/dialogs.cpp:180 +#: engines/dialogs.cpp:104 engines/dialogs.cpp:180 msgid "~R~eturn to Launcher" msgstr "~R~etur til spiloversigt" -#: engines/dialogs.cpp:106 -#: engines/dialogs.cpp:182 +#: engines/dialogs.cpp:106 engines/dialogs.cpp:182 msgctxt "lowres" msgid "~R~eturn to Launcher" msgstr "~R~etur til oversigt" -#: engines/dialogs.cpp:115 -#: engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Gemmer:" -#: engines/dialogs.cpp:115 -#: engines/agi/saveload.cpp:803 -#: engines/scumm/dialogs.cpp:187 -#: engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 +#: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1259,22 +1184,30 @@ msgid "Save" msgstr "Gem" #: engines/dialogs.cpp:144 -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 "Beklager, denne motor leverer i jeblikket ikke spil hjlp. Se venligst README for grundlggende oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." +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 "" +"Beklager, denne motor leverer i jeblikket ikke spil hjlp. Se venligst " +"README for grundlggende oplysninger, og for at f instruktioner om, hvordan " +"man fr yderligere hjlp." #: engines/dialogs.cpp:228 #, c-format -msgid "Gamestate save failed (%s)! Please consult the README for basic information, and for instructions on how to obtain further assistance." -msgstr "Gem af spiltilstand fejlede (%s)! Se venligst README for grundlggende oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." +msgid "" +"Gamestate save failed (%s)! Please consult the README for basic information, " +"and for instructions on how to obtain further assistance." +msgstr "" +"Gem af spiltilstand fejlede (%s)! Se venligst README for grundlggende " +"oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." -#: engines/dialogs.cpp:301 -#: engines/mohawk/dialogs.cpp:109 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 -#: engines/mohawk/dialogs.cpp:110 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 msgid "~C~ancel" msgstr "~F~ortryd" @@ -1329,36 +1262,43 @@ msgstr "" #: engines/engine.cpp:426 #, c-format -msgid "Gamestate load failed (%s)! Please consult the README for basic information, and for instructions on how to obtain further assistance." -msgstr "Indlsning af spiltilstand fejlede (%s)! Se venligst README for grundlggende oplysninger, og for at f instruktioner om, hvordan man fr yderligere hjlp." +msgid "" +"Gamestate load failed (%s)! Please consult the README for basic information, " +"and for instructions on how to obtain further assistance." +msgstr "" +"Indlsning af spiltilstand fejlede (%s)! Se venligst README for " +"grundlggende oplysninger, og for at f instruktioner om, hvordan man fr " +"yderligere hjlp." #: engines/engine.cpp:439 -msgid "WARNING: The game you are about to start is not yet fully supported by ScummVM. As such, it is likely to be unstable, and any saves you make might not work in future versions of ScummVM." -msgstr "ADVARSEL: Spillet du er ved at starte endnu ikke er fuldt understttet af ScummVM. Sledes, er det sandsynligt, at det er ustabilt, og alle gemmer du foretager fungerer muligvis ikke i fremtidige versioner af ScummVM." +msgid "" +"WARNING: The game you are about to start is not yet fully supported by " +"ScummVM. As such, it is likely to be unstable, and any saves you make might " +"not work in future versions of ScummVM." +msgstr "" +"ADVARSEL: Spillet du er ved at starte endnu ikke er fuldt understttet af " +"ScummVM. Sledes, er det sandsynligt, at det er ustabilt, og alle gemmer du " +"foretager fungerer muligvis ikke i fremtidige versioner af ScummVM." #: engines/engine.cpp:442 msgid "Start anyway" msgstr "Start alligevel" -#: engines/agi/detection.cpp:145 -#: engines/dreamweb/detection.cpp:47 +#: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" msgstr "Brug original gem/indls skrme" -#: engines/agi/detection.cpp:146 -#: engines/dreamweb/detection.cpp:48 +#: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Brug de originale gem/indls skrme, istedet for dem fra ScummVM" -#: engines/agi/saveload.cpp:816 -#: engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Gendan spil:" -#: engines/agi/saveload.cpp:816 -#: engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Gendan" @@ -1391,8 +1331,12 @@ msgid "Use IMF/Yamaha FB-01 for MIDI output" msgstr "Brug IMF/Yamaha FB-01 til MIDI-udgang" #: engines/sci/detection.cpp:401 -msgid "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI output" -msgstr "Bruge et IBM Musik Feature-kort eller et Yamaha FB-01 FM synth modul til MIDI-udgang" +msgid "" +"Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " +"output" +msgstr "" +"Bruge et IBM Musik Feature-kort eller et Yamaha FB-01 FM synth modul til " +"MIDI-udgang" #: engines/sci/detection.cpp:411 msgid "Use CD audio" @@ -1407,7 +1351,8 @@ msgid "Use Windows cursors" msgstr "Brug Windows markr" #: engines/sci/detection.cpp:423 -msgid "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" +msgid "" +"Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "Brug Windows-markrer (mindre og monokrome) i stedet for dem fra DOS" #: engines/sci/detection.cpp:433 @@ -1415,8 +1360,10 @@ msgid "Use silver cursors" msgstr "Brug slv markr" #: engines/sci/detection.cpp:434 -msgid "Use the alternate set of silver cursors, instead of the normal golden ones" -msgstr "Brug det alternative st af slv markrer, i stedet for de normale gyldne" +msgid "" +"Use the alternate set of silver cursors, instead of the normal golden ones" +msgstr "" +"Brug det alternative st af slv markrer, i stedet for de normale gyldne" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -1453,8 +1400,7 @@ msgstr "Er du sikker p msgid "Play" msgstr "Spil" -#: engines/scumm/dialogs.cpp:191 -#: engines/scumm/help.cpp:82 +#: engines/scumm/dialogs.cpp:191 engines/scumm/help.cpp:82 #: engines/scumm/help.cpp:84 #: backends/platform/symbian/src/SymbianActions.cpp:52 #: backends/platform/wince/CEActionsPocket.cpp:44 @@ -1581,16 +1527,11 @@ msgstr "Mellemrum" msgid "Pause game" msgstr "Pause spil" -#: engines/scumm/help.cpp:79 -#: engines/scumm/help.cpp:84 -#: engines/scumm/help.cpp:95 -#: 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:79 engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:95 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 msgid "Ctrl" msgstr "Ctrl" @@ -1598,12 +1539,9 @@ msgstr "Ctrl" msgid "Load game state 1-10" msgstr "Indls spil tilstand 1-10" -#: engines/scumm/help.cpp:80 -#: engines/scumm/help.cpp:84 -#: engines/scumm/help.cpp:86 -#: engines/scumm/help.cpp:100 -#: engines/scumm/help.cpp:101 -#: engines/scumm/help.cpp:102 +#: engines/scumm/help.cpp:80 engines/scumm/help.cpp:84 +#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:100 +#: engines/scumm/help.cpp:101 engines/scumm/help.cpp:102 msgid "Alt" msgstr "Alt" @@ -1611,8 +1549,7 @@ msgstr "Alt" msgid "Save game state 1-10" msgstr "Gem spil tilstand 1-10" -#: engines/scumm/help.cpp:86 -#: engines/scumm/help.cpp:89 +#: engines/scumm/help.cpp:86 engines/scumm/help.cpp:89 msgid "Enter" msgstr "Enter" @@ -1704,30 +1641,24 @@ msgstr "Spind ordspil p msgid "Main game controls:" msgstr "Vigtigste spilstyring:" -#: engines/scumm/help.cpp:121 -#: engines/scumm/help.cpp:136 +#: engines/scumm/help.cpp:121 engines/scumm/help.cpp:136 #: engines/scumm/help.cpp:161 msgid "Push" msgstr "Skub" -#: engines/scumm/help.cpp:122 -#: engines/scumm/help.cpp:137 +#: engines/scumm/help.cpp:122 engines/scumm/help.cpp:137 #: engines/scumm/help.cpp:162 msgid "Pull" msgstr "Trk" -#: engines/scumm/help.cpp:123 -#: engines/scumm/help.cpp:138 -#: engines/scumm/help.cpp:163 -#: engines/scumm/help.cpp:197 +#: engines/scumm/help.cpp:123 engines/scumm/help.cpp:138 +#: engines/scumm/help.cpp:163 engines/scumm/help.cpp:197 #: engines/scumm/help.cpp:207 msgid "Give" msgstr "Giv" -#: engines/scumm/help.cpp:124 -#: engines/scumm/help.cpp:139 -#: engines/scumm/help.cpp:164 -#: engines/scumm/help.cpp:190 +#: engines/scumm/help.cpp:124 engines/scumm/help.cpp:139 +#: engines/scumm/help.cpp:164 engines/scumm/help.cpp:190 #: engines/scumm/help.cpp:208 msgid "Open" msgstr "bn" @@ -1740,54 +1671,43 @@ msgstr "G msgid "Get" msgstr "Tag" -#: engines/scumm/help.cpp:128 -#: engines/scumm/help.cpp:152 -#: engines/scumm/help.cpp:170 -#: engines/scumm/help.cpp:198 -#: engines/scumm/help.cpp:213 -#: engines/scumm/help.cpp:224 +#: engines/scumm/help.cpp:128 engines/scumm/help.cpp:152 +#: engines/scumm/help.cpp:170 engines/scumm/help.cpp:198 +#: engines/scumm/help.cpp:213 engines/scumm/help.cpp:224 #: engines/scumm/help.cpp:250 msgid "Use" msgstr "Brug" -#: engines/scumm/help.cpp:129 -#: engines/scumm/help.cpp:141 +#: engines/scumm/help.cpp:129 engines/scumm/help.cpp:141 msgid "Read" msgstr "Ls" -#: engines/scumm/help.cpp:130 -#: engines/scumm/help.cpp:147 +#: engines/scumm/help.cpp:130 engines/scumm/help.cpp:147 msgid "New kid" msgstr "Nyt barn" -#: engines/scumm/help.cpp:131 -#: engines/scumm/help.cpp:153 +#: engines/scumm/help.cpp:131 engines/scumm/help.cpp:153 #: engines/scumm/help.cpp:171 msgid "Turn on" msgstr "Tnd" -#: engines/scumm/help.cpp:132 -#: engines/scumm/help.cpp:154 +#: engines/scumm/help.cpp:132 engines/scumm/help.cpp:154 #: engines/scumm/help.cpp:172 msgid "Turn off" msgstr "Sluk" -#: engines/scumm/help.cpp:142 -#: engines/scumm/help.cpp:167 +#: engines/scumm/help.cpp:142 engines/scumm/help.cpp:167 #: engines/scumm/help.cpp:194 msgid "Walk to" msgstr "G til" -#: engines/scumm/help.cpp:143 -#: engines/scumm/help.cpp:168 -#: engines/scumm/help.cpp:195 -#: engines/scumm/help.cpp:210 +#: engines/scumm/help.cpp:143 engines/scumm/help.cpp:168 +#: engines/scumm/help.cpp:195 engines/scumm/help.cpp:210 #: engines/scumm/help.cpp:227 msgid "Pick up" msgstr "Tag op" -#: engines/scumm/help.cpp:144 -#: engines/scumm/help.cpp:169 +#: engines/scumm/help.cpp:144 engines/scumm/help.cpp:169 msgid "What is" msgstr "Hvad er" @@ -1811,13 +1731,11 @@ msgstr "Lav" msgid "Switch" msgstr "Skift" -#: engines/scumm/help.cpp:166 -#: engines/scumm/help.cpp:228 +#: engines/scumm/help.cpp:166 engines/scumm/help.cpp:228 msgid "Look" msgstr "Se" -#: engines/scumm/help.cpp:173 -#: engines/scumm/help.cpp:223 +#: engines/scumm/help.cpp:173 engines/scumm/help.cpp:223 msgid "Talk" msgstr "Tal" @@ -1862,24 +1780,20 @@ msgstr "spil H p msgid "play C major on distaff" msgstr "spil C-dur p rok" -#: engines/scumm/help.cpp:192 -#: engines/scumm/help.cpp:214 +#: engines/scumm/help.cpp:192 engines/scumm/help.cpp:214 msgid "puSh" msgstr "Skub" -#: engines/scumm/help.cpp:193 -#: engines/scumm/help.cpp:215 +#: engines/scumm/help.cpp:193 engines/scumm/help.cpp:215 msgid "pull (Yank)" msgstr "trk (Y)" -#: engines/scumm/help.cpp:196 -#: engines/scumm/help.cpp:212 +#: engines/scumm/help.cpp:196 engines/scumm/help.cpp:212 #: engines/scumm/help.cpp:248 msgid "Talk to" msgstr "Tal til" -#: engines/scumm/help.cpp:199 -#: engines/scumm/help.cpp:211 +#: engines/scumm/help.cpp:199 engines/scumm/help.cpp:211 msgid "Look at" msgstr "Lur p" @@ -1911,10 +1825,8 @@ msgstr "Fremh msgid "Walk" msgstr "G" -#: engines/scumm/help.cpp:225 -#: engines/scumm/help.cpp:234 -#: engines/scumm/help.cpp:241 -#: engines/scumm/help.cpp:249 +#: engines/scumm/help.cpp:225 engines/scumm/help.cpp:234 +#: engines/scumm/help.cpp:241 engines/scumm/help.cpp:249 msgid "Inventory" msgstr "Oversigt" @@ -1942,8 +1854,7 @@ msgstr "Slag" msgid "Kick" msgstr "Spark" -#: engines/scumm/help.cpp:239 -#: engines/scumm/help.cpp:247 +#: engines/scumm/help.cpp:239 engines/scumm/help.cpp:247 msgid "Examine" msgstr "Undersg" @@ -1964,38 +1875,31 @@ msgstr "Gem / Indl msgid "Other game controls:" msgstr "Andre spil kontroller" -#: engines/scumm/help.cpp:257 -#: engines/scumm/help.cpp:267 +#: engines/scumm/help.cpp:257 engines/scumm/help.cpp:267 msgid "Inventory:" msgstr "Oversigt:" -#: engines/scumm/help.cpp:258 -#: engines/scumm/help.cpp:274 +#: engines/scumm/help.cpp:258 engines/scumm/help.cpp:274 msgid "Scroll list up" msgstr "Rul liste op" -#: engines/scumm/help.cpp:259 -#: engines/scumm/help.cpp:275 +#: engines/scumm/help.cpp:259 engines/scumm/help.cpp:275 msgid "Scroll list down" msgstr "Rul liste ned" -#: engines/scumm/help.cpp:260 -#: engines/scumm/help.cpp:268 +#: engines/scumm/help.cpp:260 engines/scumm/help.cpp:268 msgid "Upper left item" msgstr "verste venstre punkt" -#: engines/scumm/help.cpp:261 -#: engines/scumm/help.cpp:270 +#: engines/scumm/help.cpp:261 engines/scumm/help.cpp:270 msgid "Lower left item" msgstr "Nederste hjre punkt" -#: engines/scumm/help.cpp:262 -#: engines/scumm/help.cpp:271 +#: engines/scumm/help.cpp:262 engines/scumm/help.cpp:271 msgid "Upper right item" msgstr "verste hjre punkt" -#: engines/scumm/help.cpp:263 -#: engines/scumm/help.cpp:273 +#: engines/scumm/help.cpp:263 engines/scumm/help.cpp:273 msgid "Lower right item" msgstr "Nederste venstre punkt" @@ -2007,8 +1911,7 @@ msgstr "Midterste h msgid "Middle right item" msgstr "Midterste hjre punkt" -#: engines/scumm/help.cpp:279 -#: engines/scumm/help.cpp:284 +#: engines/scumm/help.cpp:279 engines/scumm/help.cpp:284 msgid "Switching characters:" msgstr "Skift personer:" @@ -2024,8 +1927,7 @@ msgstr "Tredie barn" msgid "Fighting controls (numpad):" msgstr "Kamp kontroller (numtast):" -#: engines/scumm/help.cpp:295 -#: engines/scumm/help.cpp:296 +#: engines/scumm/help.cpp:295 engines/scumm/help.cpp:296 #: engines/scumm/help.cpp:297 msgid "Step back" msgstr "Skridt tilbage" @@ -2119,8 +2021,7 @@ msgstr "" "Indbygget MIDI understttelse krver Roland opgradering fra LucasArts,\n" "men %s mangler. Bruger AdLib i stedet." -#: engines/scumm/scumm.cpp:2278 -#: engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2131,8 +2032,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 -#: engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2143,8 +2043,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 -#: engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2156,12 +2055,17 @@ msgstr "" "%s" #: engines/scumm/scumm.cpp:2512 -msgid "Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' directory inside the Tentacle game directory." -msgstr "Normalt ville Maniac Mansion begynde nu. Men ScummVM kan ikke gre det endnu. For at spille det, g til 'Tilfj spil' i ScummVM start-menuen og vlg 'Maniac' mappen inde i Tentacle spillets mappe." +msgid "" +"Usually, Maniac Mansion would start now. But ScummVM doesn't do that yet. To " +"play it, go to 'Add Game' in the ScummVM start menu and select the 'Maniac' " +"directory inside the Tentacle game directory." +msgstr "" +"Normalt ville Maniac Mansion begynde nu. Men ScummVM kan ikke gre det " +"endnu. For at spille det, g til 'Tilfj spil' i ScummVM start-menuen og " +"vlg 'Maniac' mappen inde i Tentacle spillets mappe." #. I18N: Option for fast scene switching -#: engines/mohawk/dialogs.cpp:92 -#: engines/mohawk/dialogs.cpp:171 +#: engines/mohawk/dialogs.cpp:92 engines/mohawk/dialogs.cpp:171 msgid "~Z~ip Mode Activated" msgstr "~Z~ip tilstand aktiveret" @@ -2191,14 +2095,12 @@ msgstr "~V~andeffekter aktiveret" msgid "Cutscene file '%s' not found!" msgstr "Filmsekvens fil '%s' ikke fundet!" -#: engines/gob/inter_playtoons.cpp:256 -#: engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Mislykkedes at indlse spil tilstand fra fil." -#: engines/gob/inter_v2.cpp:1357 -#: engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Mislykkedes at gemme spil tilstand til fil." @@ -2331,13 +2233,12 @@ msgstr "" "at nogle stykker ikke lyder korrekt." #: engines/queen/queen.cpp:59 -#: engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "Diskette intro" +msgid "Alternative intro" +msgstr "" #: engines/queen/queen.cpp:60 -#: engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "Brug diskette versionens intro (kun CD version)" #: engines/sky/compact.cpp:130 @@ -2356,38 +2257,50 @@ msgstr "" "\"sky.cpt\" filen har en forkert strrelse.\n" "Venligst (gen)hent den fra www.scummvm.org" +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Diskette intro" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "Brug diskette versionens intro (kun CD version)" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "PSX stream filmsekvens '%s' kan ikke afspilles i palette tilstand" -#: engines/sword1/animation.cpp:560 -#: engines/sword2/animation.cpp:455 +#: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" -msgstr "DXA filmsekvenser fundet, men ScummVM er bygget uden zlib understttelse" +msgstr "" +"DXA filmsekvenser fundet, men ScummVM er bygget uden zlib understttelse" -#: engines/sword1/animation.cpp:570 -#: engines/sword2/animation.cpp:465 +#: engines/sword1/animation.cpp:570 engines/sword2/animation.cpp:465 msgid "MPEG2 cutscenes are no longer supported" msgstr "MPEG2 filmsekvenser understttes ikke lngere" -#: engines/sword1/animation.cpp:576 -#: engines/sword2/animation.cpp:473 +#: engines/sword1/animation.cpp:576 engines/sword2/animation.cpp:473 #, c-format msgid "Cutscene '%s' not found" msgstr "Filmsekvens '%s' ikke fundet" #: engines/sword1/control.cpp:863 msgid "" -"ScummVM found that you have old savefiles for Broken Sword 1 that should be converted.\n" -"The old save game format is no longer supported, so you will not be able to load your games if you don't convert them.\n" +"ScummVM found that you have old savefiles for Broken Sword 1 that should be " +"converted.\n" +"The old save 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" +"Press OK to convert them now, otherwise you will be asked again the next " +"time you start the game.\n" msgstr "" -"ScummVM har konstateret, at du har gamle gemmer for Broken Sword 1, der skal konverteres.\n" -"Det gamle gemte spil format understttes ikke lngere, s vil du ikke vre i stand til at indlse dine spil, hvis du ikke konvertere dem.\n" +"ScummVM har konstateret, at du har gamle gemmer for Broken Sword 1, der skal " +"konverteres.\n" +"Det gamle gemte spil format understttes ikke lngere, s vil du ikke vre i " +"stand til at indlse dine spil, hvis du ikke konvertere dem.\n" "\n" -"Tryk p OK for at konvertere dem nu, ellers vil du blive spurgt igen, nste gang du starter spillet.\n" +"Tryk p OK for at konvertere dem nu, ellers vil du blive spurgt igen, nste " +"gang du starter spillet.\n" #: engines/sword1/control.cpp:1232 #, c-format @@ -2411,8 +2324,10 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "Dette er slutningen af Broken Sword 1 demoen" #: engines/sword2/animation.cpp:435 -msgid "PSX cutscenes found but ScummVM has been built without RGB color support" -msgstr "PSX filmsekvenser fundet, men ScummVM er bygget uden RGB farve understttelse" +msgid "" +"PSX cutscenes found but ScummVM has been built without RGB color support" +msgstr "" +"PSX filmsekvenser fundet, men ScummVM er bygget uden RGB farve understttelse" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" @@ -2422,6 +2337,17 @@ msgstr "Vis labels p msgid "Show labels for objects on mouse hover" msgstr "Vis labels for genstande musen er henover" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2441,13 +2367,17 @@ msgstr "Gemmer spil..." #: engines/parallaction/saveload.cpp:272 msgid "" -"ScummVM found that you have old savefiles 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" +"ScummVM found that you have old savefiles 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 "" -"ScummVM har konstateret, at du har gamle gemmer for Nippon Safes, der skal omdbes.\n" -"De gamle navne er ikke lngere understttet, s du vil ikke vre i stand til at indlse dine spil, hvis du ikke konvertere dem.\n" +"ScummVM har konstateret, at du har gamle gemmer for Nippon Safes, der skal " +"omdbes.\n" +"De gamle navne er ikke lngere understttet, s du vil ikke vre i stand til " +"at indlse dine spil, hvis du ikke konvertere dem.\n" "\n" "Tryk p OK for at konvertere dem nu, ellers vil du blive spurgt nste gang.\n" @@ -2457,11 +2387,13 @@ msgstr "ScummVM konverterede med succes alle dine gemmer." #: engines/parallaction/saveload.cpp:321 msgid "" -"ScummVM printed some warnings in your console window and can't guarantee all your files have been converted.\n" +"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 "" -"ScummVM udskrev nogle advarsler i dit konsol vindue, og kan ikke garantere at alle dine filer er blevet konverteret.\n" +"ScummVM udskrev nogle advarsler i dit konsol vindue, og kan ikke garantere " +"at alle dine filer er blevet konverteret.\n" "\n" "Venligst rapportr til holdet." @@ -2475,30 +2407,43 @@ msgstr "DOSBox OPL emulator" #: audio/mididrv.cpp:209 #, c-format -msgid "The selected audio device '%s' was not found (e.g. might be turned off or disconnected)." -msgstr "Den valgte lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller afbrudt)." +msgid "" +"The selected audio device '%s' was not found (e.g. might be turned off or " +"disconnected)." +msgstr "" +"Den valgte lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller " +"afbrudt)." -#: audio/mididrv.cpp:209 -#: audio/mididrv.cpp:221 -#: audio/mididrv.cpp:257 +#: 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 "Forsger at falde tilbage til den nste tilgngelig enhed..." #: audio/mididrv.cpp:221 #, c-format -msgid "The selected audio device '%s' cannot be used. See log file for more information." -msgstr "Den valgte lydenhed '%s' kan ikke bruges. Se log filen for mere information." +msgid "" +"The selected audio device '%s' cannot be used. See log file for more " +"information." +msgstr "" +"Den valgte lydenhed '%s' kan ikke bruges. Se log filen for mere information." #: audio/mididrv.cpp:257 #, c-format -msgid "The preferred audio device '%s' was not found (e.g. might be turned off or disconnected)." -msgstr "Den foretrukne lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller afbrudt)." +msgid "" +"The preferred audio device '%s' was not found (e.g. might be turned off or " +"disconnected)." +msgstr "" +"Den foretrukne lydenhed '%s' blev ikke fundet (kan f.eks vre slukket eller " +"afbrudt)." #: audio/mididrv.cpp:272 #, c-format -msgid "The preferred audio device '%s' cannot be used. See log file for more information." -msgstr "Den foretrukne lydenhed '%s' kan ikke bruges. Se log filen for mere information." +msgid "" +"The preferred audio device '%s' cannot be used. See log file for more " +"information." +msgstr "" +"Den foretrukne lydenhed '%s' kan ikke bruges. Se log filen for mere " +"information." #: audio/null.h:43 msgid "No music" @@ -2652,11 +2597,11 @@ msgstr "Pegeplade tilstand aktiveret." msgid "Touchpad mode disabled." msgstr "Pegeplade tilstand deaktiveret." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Klik tilstand" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2664,11 +2609,11 @@ msgstr "Klik tilstand" msgid "Left Click" msgstr "Venstre klik" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Miderste klik" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2851,13 +2796,11 @@ msgstr "GC Pad acceleration:" msgid "DVD" msgstr "DVD" -#: backends/platform/wii/options.cpp:89 -#: backends/platform/wii/options.cpp:101 +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 msgid "Status:" msgstr "Status:" -#: backends/platform/wii/options.cpp:90 -#: backends/platform/wii/options.cpp:102 +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 msgid "Unknown" msgstr "Ukendt" @@ -3035,7 +2978,8 @@ msgstr "Tildel h #: backends/platform/wince/wince-sdl.cpp:519 msgid "You must map a key to the 'Right Click' action to play this game" -msgstr "Du skal tildele en tast til 'Hjreklik' handlingen for at spille dette spil" +msgstr "" +"Du skal tildele en tast til 'Hjreklik' handlingen for at spille dette spil" #: backends/platform/wince/wince-sdl.cpp:528 msgid "Map hide toolbar action" @@ -3043,7 +2987,9 @@ msgstr "Tildel \"skjul v #: backends/platform/wince/wince-sdl.cpp:532 msgid "You must map a key to the 'Hide toolbar' action to play this game" -msgstr "Du skal tildele en tast til 'Skjul vrktjslinje' handlingen for at spille dette spil" +msgstr "" +"Du skal tildele en tast til 'Skjul vrktjslinje' handlingen for at spille " +"dette spil" #: backends/platform/wince/wince-sdl.cpp:541 msgid "Map Zoom Up action (optional)" @@ -3054,8 +3000,11 @@ msgid "Map Zoom Down action (optional)" msgstr "Tildel Forstr handling (valgfri)" #: backends/platform/wince/wince-sdl.cpp:552 -msgid "Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" -msgstr "Glem ikke at tildele en tast til 'Skjul vrktjslinje' handling for at se hele oversigten" +msgid "" +"Don't forget to map a key to 'Hide Toolbar' action to see the whole inventory" +msgstr "" +"Glem ikke at tildele en tast til 'Skjul vrktjslinje' handling for at se " +"hele oversigten" #: backends/events/default/default-events.cpp:191 msgid "Do you really want to return to the Launcher?" @@ -3069,37 +3018,37 @@ msgstr "Oversigt" msgid "Do you really want to quit?" msgstr "Vil du virkelig afslutte?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen 'Tap Mode' - Venstre Klik" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscreen 'Tap Mode' - Hjre Klik" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen 'Tap Mode' - Henover (Ingen Klik)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Maximal lydstyrke" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Hver lydstyrke" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Minimal lydstyrke" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Snker lydstyrke" @@ -3144,20 +3093,20 @@ msgstr "Klik deaktiveret" #~ msgid "Hercules Amber" #~ msgstr "Hercules brun" -#~ msgctxt "lowres" +#~ msgctxt "lowres" #~ msgid "Hercules Green" #~ msgstr "Hercules grn" -#~ msgctxt "lowres" +#~ msgctxt "lowres" #~ msgid "Hercules Amber" #~ msgstr "Hercules brun" #, fuzzy #~ msgid "Save game failed!" #~ msgstr "Gemmer:" -#~ msgctxt "lowres" +#~ msgctxt "lowres" #~ msgid "Add Game..." #~ msgstr "Tilfj spil..." diff --git a/po/de_DE.po b/po/de_DE.po index bb53f4e2ff..a18bfb7ca6 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-14 22:49+0100\n" "Last-Translator: Simon Sawatzki \n" "Language-Team: Simon Sawatzki (Lead), Lothar Serra Mari " "(Contributor)\n" +"Language: Deutsch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Deutsch\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:91 @@ -46,10 +46,11 @@ msgstr "Pfad hoch" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -92,16 +93,16 @@ msgstr "Zuweisen" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -441,13 +442,13 @@ msgstr "In Spieleliste suchen" msgid "Search:" msgstr "Suchen:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Spiel laden:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -935,68 +936,104 @@ msgstr "" "dieses Thema benutzen wollen, mssen Sie erst zu einer anderen Sprache " "wechseln." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Kein Datum gespeichert" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Keine Zeit gespeichert" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Keine Spielzeit gespeichert" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Lschen" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Diesen Spielstand wirklich lschen?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Datum: " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Zeit: " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Spieldauer: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Unbenannt" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Speichern" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Konnte Spielstand nicht speichern." + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Name:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Thema auswhlen" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "GFX ausgeschaltet" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "GFX ausgeschaltet" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Standard-Renderer (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standard (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Kantenglttung (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Kantenglttung (16bpp)" @@ -1100,18 +1137,18 @@ msgstr "Abbruch durch Benutzer" msgid "Unknown error" msgstr "Unbekannter Fehler" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "Das Spiel im Verzeichnis \"%s\" scheint nicht bekannt zu sein." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" "Bitte geben Sie die folgenden Daten auf Englisch an das ScummVM-Team weiter " "sowie" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "" "den Namen des Spiels, das Sie hinzufgen wollten, als auch die Version/" @@ -1151,13 +1188,13 @@ msgid "~R~eturn to Launcher" msgstr "Zur Spiele~l~iste" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Speichern:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1280,11 +1317,11 @@ msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" "Verwendet die originalen Mens zum Speichern und Laden statt der von ScummVM." -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Spiel laden:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Laden" @@ -2011,7 +2048,7 @@ msgstr "" "Roland-Upgrade von LucasArts, aber %s\n" "fehlt. Stattdessen wird AdLib verwendet." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2022,7 +2059,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2033,7 +2070,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2087,11 +2124,11 @@ msgid "Cutscene file '%s' not found!" msgstr "Zwischensequenz \"%s\" nicht gefunden!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Konnte Spielstand aus Datei nicht laden." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Konnte Spielstand nicht in Datei speichern." @@ -2225,12 +2262,13 @@ msgstr "" "mglich, dass ein paar Musikstcke nicht\n" "richtig abgespielt werden." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "Disketten-Vorspann" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "Verwendet den Vorspann der Diskettenversion (nur bei CD-Version)." #: engines/sky/compact.cpp:130 @@ -2251,6 +2289,14 @@ msgstr "" "Bitte laden Sie diese Datei (erneut) von\n" "www.scummvm.org herunter." +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Disketten-Vorspann" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "Verwendet den Vorspann der Diskettenversion (nur bei CD-Version)." + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2326,6 +2372,17 @@ msgstr "Objektnamen zeigen" msgid "Show labels for objects on mouse hover" msgstr "Zeigt Objektbeschriftungen bei Mausberhrung an." +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2577,11 +2634,11 @@ msgstr "Touchpad-Modus aktiviert." msgid "Touchpad mode disabled." msgstr "Touchpad-Modus ausgeschaltet." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Klickmodus" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2589,11 +2646,11 @@ msgstr "Klickmodus" msgid "Left Click" msgstr "Linksklick" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Mittelklick" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2999,37 +3056,37 @@ msgstr "Spieleliste" msgid "Do you really want to quit?" msgstr "Mchten Sie wirklich beenden?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Berhrungsbildschirm-Tipp-Modus - Linksklick" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Berhrungsbildschirm-Tipp-Modus - Rechtsklick" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Berhrungsbildschirm-Tipp-Modus - schweben (kein Klick)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Hchste Lautstrke" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Lautstrke hher" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Niedrigste Lautstrke" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Lautstrke niedriger" diff --git a/po/es_ES.po b/po/es_ES.po index 8e23894dcf..9f767dacfa 100644 --- a/po/es_ES.po +++ b/po/es_ES.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.4.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-08 18:19+0100\n" "Last-Translator: Toms Maidagan\n" "Language-Team: \n" +"Language: Espanol\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Espanol\n" #: gui/about.cpp:91 #, c-format @@ -44,10 +44,11 @@ msgstr "Arriba" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -90,16 +91,16 @@ msgstr "Asignar" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "Aceptar" @@ -437,13 +438,13 @@ msgstr "Buscar en la lista de juegos" msgid "Search:" msgstr "Buscar:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Cargar juego:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -924,68 +925,104 @@ msgstr "" "El tema seleccionado no es compatible con el idioma actual. Si quieres usar " "este tema debes cambiar a otro idioma primero." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "No hay fecha guardada" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "No hay hora guardada" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "No hay tiempo guardado" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Borrar" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Seguro que quieres borrar esta partida?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Fecha: " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Hora: " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Tiempo: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Partida sin nombre" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Guardar" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Fallo al guardar la partida" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Nombre:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Selecciona un tema" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "GFX desactivados" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "GFX desactivados" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Estndar (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Estndar (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Suavizado (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Suavizado (16bpp)" @@ -1089,16 +1126,16 @@ msgstr "Cancel msgid "Unknown error" msgstr "Error desconocido" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "El juego en '%s' parece ser desconocido." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "Por favor, enva al equipo de ScummVM esta informacin junto al nombre" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "del juego que has intentado aadir y su versin/idioma/etc.:" @@ -1136,13 +1173,13 @@ msgid "~R~eturn to Launcher" msgstr "~V~olver al lanzador" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Guardar partida" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1264,11 +1301,11 @@ 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" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Cargar partida:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Cargar" @@ -1992,7 +2029,7 @@ msgstr "" "El soporte MIDI nativo requiere la actualizacin Roland de LucasArts,\n" "pero %s no est disponible. Se usar AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2003,7 +2040,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2014,7 +2051,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2067,11 +2104,11 @@ msgid "Cutscene file '%s' not found!" msgstr "No se ha encontrado el vdeo '%s'" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Fallo al cargar el estado del juego desde el archivo." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Fallo al guardar el estado del juego en el archivo." @@ -2203,12 +2240,13 @@ msgstr "" "a los de General MIDI, pero es posible que algunas\n" "de las pistas no suenen correctamente." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "Intro de disquete" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "" "Usa la introduccin de la versin en disquete (solo para la versin CD)" @@ -2228,6 +2266,15 @@ msgstr "" "El archivo \"sky.cpt\" tiene un tamao incorrecto.\n" "Por favor, vuelve a bajarlo de www.scummvm.org" +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Intro de disquete" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "" +"Usa la introduccin de la versin en disquete (solo para la versin CD)" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2301,6 +2348,17 @@ msgstr "Mostrar etiquetas de objetos" msgid "Show labels for objects on mouse hover" msgstr "Muestra las etiquetas de los objetos al pasar el ratn" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2552,11 +2610,11 @@ msgstr "Modo Touchpad activado." msgid "Touchpad mode disabled." msgstr "Modo Touchpad desactivado." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Modo clic" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2564,11 +2622,11 @@ msgstr "Modo clic" msgid "Left Click" msgstr "Clic izquierdo" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Clic central" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2973,37 +3031,37 @@ msgstr "Lanzador" msgid "Do you really want to quit?" msgstr "Realmente quieres salir?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "'Modo toque' de pantalla tctil - Clic izquierdo" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "'Modo toque' de pantalla tctil - Clic derecho" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "'Modo toque' de pantalla tctil - Flotante (sin clic)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Volumen mximo" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Aumentando el volumen" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Volumen mnimo" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Bajando el volumen" diff --git a/po/eu.po b/po/eu.po index 5bc553e572..b0fd177575 100644 --- a/po/eu.po +++ b/po/eu.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2011-12-15 14:53+0100\n" "Last-Translator: Mikel Iturbe Urretxa \n" "Language-Team: Librezale \n" +"Language: Euskara\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Euskara\n" #: gui/about.cpp:91 #, c-format @@ -44,10 +44,11 @@ msgstr "Joan gora" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -90,16 +91,16 @@ msgstr "Esleitu" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "Ados" @@ -437,13 +438,13 @@ msgstr "Bilatu joko-zerrendan" msgid "Search:" msgstr "Bilatu:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Jokoa kargatu:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -925,68 +926,104 @@ msgstr "" "Aukeraturiko gaia ez da zure hizkuntzarekin bateragarria. Gai hau erabili " "nahi baduzu, aurretik beste hizkuntza batera pasa behar duzu." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Ez dago datarik gordeta" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Ez dago ordurik gordeta" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Ez dago denborarik gordeta" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Ezabatu" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Ezabatu partida gorde hau?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Data:" -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Ordua" -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Denbora:" -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Titulurik gabeko partida" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Gorde" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Ezin izan da jokoa gorde" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Izena:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Gaia aukeratu" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "GFX desgaituta" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "GFX desgaituta" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Estandarra (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Estandarra (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Lausotua (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Lausotua (16bpp)" @@ -1090,16 +1127,16 @@ msgstr "Erabiltzaileak utzia" msgid "Unknown error" msgstr "Errore ezezaguna" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "'%s'-(e)ko jokoa ezezaguna dela dirudi" -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "Mesedez, bidali hurrengo datuak ScummVM taldeari gehitzen saiatu zaren" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "jokoaren izen, bertsio/hizkuntza/e.a.-ekin batera:" @@ -1137,13 +1174,13 @@ msgid "~R~eturn to Launcher" msgstr "It~z~uli abiarazlera" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Gorde jokoa:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1261,11 +1298,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Jokoa kargatu:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Kargatu" @@ -1989,7 +2026,7 @@ msgstr "" "MIDI euskarri natiboak LucasArts-en Roland eguneraketa behar du,\n" "baina %s ez dago eskuragarri. AdLib erabiliko da." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2000,7 +2037,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2011,7 +2048,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2064,11 +2101,11 @@ msgid "Cutscene file '%s' not found!" msgstr "'%s' bideo fitxategia ez da aurkitu!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Ezin izan da fitxategitik jokoa kargatu." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Ezin izan da jokoa fitxategira gorde." @@ -2203,12 +2240,12 @@ msgstr "" "General MIDIkoetara egokitzen saiatuko gara,\n" "baina posible da pista batzuk egoki ez entzutea." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +msgid "Use an alternative game intro (CD version only)" msgstr "" #: engines/sky/compact.cpp:130 @@ -2227,6 +2264,14 @@ msgstr "" "\"sky.cpt\" fitxategiak tamaina desegokia du.\n" "Mesdez, jaitsi ezazu (berriz) www.scummvm.org-etik" +#: 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:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2300,6 +2345,17 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2551,11 +2607,11 @@ msgstr "Touchpad modua gaituta." msgid "Touchpad mode disabled." msgstr "Touchpad modua desgaituta." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Klikatzeko modua" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2563,11 +2619,11 @@ msgstr "Klikatzeko modua" msgid "Left Click" msgstr "Ezker-klika" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Erdiko klika" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2972,37 +3028,37 @@ msgstr "Abiarazlea" msgid "Do you really want to quit?" msgstr "Benetan irten?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Ukimen-pantailako 'kolpetxo modua' - Ezker klika" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Ukimen-pantailako 'kolpetxo modua' - Eskuin klika" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Ukimen-pantailako 'kolpetxo modua' - Flotatu (klikik ez)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Bolumen maximoa" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Bolumena igotzen" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Bolumen minimoa" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Bolumena jaisten" diff --git a/po/fr_FR.po b/po/fr_FR.po index 5faab55d83..cd98af1bb7 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-08 12:24+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" +"Language: Francais\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Francais\n" "Plural-Forms: nplurals=2; plural=n>1;\n" #: gui/about.cpp:91 @@ -45,10 +45,11 @@ msgstr "Remonter" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -91,16 +92,16 @@ msgstr "Affecter" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -439,13 +440,13 @@ msgstr "Recherche dans la liste de jeux" msgid "Search:" msgstr "Filtre:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Charger le jeu:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -930,68 +931,104 @@ msgstr "" "Le thme que vous avez slection ne support pas la langue franaise. Si " "vous voulez l'utiliser vous devez d'abord changer de langue." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Date inconnue" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Heure inconnue" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Dure de jeu inconnue" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Supprimer" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Voulez-vous vraiment supprimer cette sauvegarde?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Date: " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Heure: " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Dure de jeu: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Sauvegarde sans nom" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Sauver" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "chec de la sauvegarde." + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Nom:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Slectionnez un Thme" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "GFX dsactiv" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "GFX dsactiv" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Rendu Standard (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standard (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Rendu Anti-crnel (16 bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Anti-crnel (16 bpp)" @@ -1095,18 +1132,18 @@ msgstr "Annuler par l'utilisateur" msgid "Unknown error" msgstr "Erreur inconnue" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "Le jeu dans '%s' n'est pas reconnu." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" "Veuillez reporter les informations suivantes l'quipe ScummVM ainsi que le " "nom" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "du jeu que vous avez essay d'ajouter, sa version, le langage, etc..." @@ -1144,13 +1181,13 @@ msgid "~R~eturn to Launcher" msgstr "Retour au ~L~anceur" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Sauvegarde:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1271,11 +1308,11 @@ msgstr "" "Utiliser les dialogues sauvegarde/chargement d'origine plutt que ceux de " "ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Charger le jeu:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Charger" @@ -2001,7 +2038,7 @@ msgstr "" "Support MIDI natif require la mise jour Roland de LucasArt,\n" "mais %s manque. Utilise AdLib la place." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2012,7 +2049,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2023,7 +2060,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2077,11 +2114,11 @@ msgid "Cutscene file '%s' not found!" msgstr "Fichier de squence '%s' non trouv!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "chec du chargement de l'tat du jeu depuis le disque." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "chec de l'enregistrement de l'tat du jeu sur le disque." @@ -2210,15 +2247,16 @@ msgstr "" "Il semble que vous utilisiez un priphrique General MIDI,\n" "mais ce jeu ne support que le MIDI Roland MT32. Nous essayons\n" "d'associer les instruments Roland MT32 aux instruments General\n" -"MIDI. Cependant il est possible que quelques pistes ne soient\n " -"pas joues correctement." +"MIDI. Cependant il est possible que quelques pistes ne soient\n" +" pas joues correctement." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "Intro disquette" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "Utiliser l'intro de la version disquette (version CD uniquement)" #: engines/sky/compact.cpp:130 @@ -2237,6 +2275,14 @@ msgstr "" "Le fichier \"sky.cpt\" a une taille incorrecte.\n" "Vous pouvez le (re)tlcharger sur www.scummvm.org" +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Intro disquette" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "Utiliser l'intro de la version disquette (version CD uniquement)" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2312,6 +2358,17 @@ msgstr "Afficher la description des objets" msgid "Show labels for objects on mouse hover" msgstr "Afficher la description des objets lors de passage du pointeur" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2561,11 +2618,11 @@ msgstr "Mode touchpad activ msgid "Touchpad mode disabled." msgstr "Mode touchpad dsactiv" -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Mode Clic" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2573,11 +2630,11 @@ msgstr "Mode Clic" msgid "Left Click" msgstr "Clic Gauche" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Clic Milieu" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2983,37 +3040,37 @@ msgstr "Lanceur" msgid "Do you really want to quit?" msgstr "Voulez-vous vraiment quitter?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen 'Tap Mode' - Clic Gauche" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscreen 'Tap Mode' - Clic Droit" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen 'Tap Mode' - Dplacer sans cliquer" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Volume Maximum" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Augmentation Volume" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Volume Minimum" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Diminution Volume" diff --git a/po/hu_HU.po b/po/hu_HU.po index 828659dea6..a34138c1bf 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-09 05:58+0100\n" "Last-Translator: George Kormendi \n" "Language-Team: Hungarian\n" +"Language: Magyar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Magyar\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Poedit-Language: Hungarian\n" "X-Poedit-Country: HUNGARY\n" @@ -48,10 +48,11 @@ msgstr "Feljebb" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -94,16 +95,16 @@ msgstr "Kioszt #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -439,13 +440,13 @@ msgstr "Keres msgid "Search:" msgstr "Keress:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Jtk betltse:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -918,68 +919,104 @@ msgstr "" "A kivlasztott tma nem tmogatja a nyelvedet. Ha hasznlni akarod ezt a " "tmt, elszr vlts t egy msik nyelvre." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Dtum nincs mentve" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Id nincs mentve" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Jtkid nincs mentve" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Trl" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Biztos hogy trlni akarod ezt a jtkllst?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Dtum:" -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Id:" -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Jtkid:" -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Nvtelen jtklls" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Ments" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Jtk ments nem sikerlt" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Nv:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Vlassz tmt" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "GFX letiltva" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "GFX letiltva" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Standard lekpez (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standard (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "lsimtsos lekpez (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "lsimtott (16bpp)" @@ -1083,16 +1120,16 @@ msgstr "Felhaszn msgid "Unknown error" msgstr "Ismeretlen hiba" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "A '%s' jtk ismeretlennek tnik." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "Krlek jelezd a ScummVM csapatnak a kvetkez adatokat, egytt a jtk" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "cmvel s megbzhat adataival jtkverzi/nyelv(ek)/stb.:" @@ -1130,13 +1167,13 @@ msgid "~R~eturn to Launcher" msgstr "Visszatrs az indtba" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Jtk mentse:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1254,11 +1291,11 @@ msgstr "Eredeti ment/t msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Az eredeti ments/betlts kperny hasznlata a ScummVM kpek helyett" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Jtkmenet visszalltsa:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Visszallts" @@ -1980,7 +2017,7 @@ msgstr "" "Native MIDI tmogatshoz kell a Roland Upgrade a LucasArts-tl,\n" "a %s hinyzik. AdLib-ot hasznlok helyette." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1991,7 +2028,7 @@ msgstr "" "\n" "%s fjlba nem sikerlt" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2002,7 +2039,7 @@ msgstr "" "\n" "%s fjlbl nem sikerlt" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2055,11 +2092,11 @@ msgid "Cutscene file '%s' not found!" msgstr "'%s' tvezet fjl nem tallhat" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Jtklls betltse fjlbl nem sikerlt." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Jtklls mentse fjlba nem sikerlt." @@ -2191,12 +2228,13 @@ msgstr "" "General MIDIre. Tovbbra is lehetsges hogy\n" "nhny hangsv helytelenl hangzik." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "Floppy intro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "A floppy verzi intro hasznlata (csak CD verzinl)" #: engines/sky/compact.cpp:130 @@ -2215,6 +2253,14 @@ msgstr "" "A \"sky.cpt\" fjl mrete nem megfelel.\n" "Tltsd le a www.scummvm.org oldalrl" +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Floppy intro" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "A floppy verzi intro hasznlata (csak CD verzinl)" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2287,6 +2333,17 @@ msgstr "T msgid "Show labels for objects on mouse hover" msgstr "Trgycimke lthat ha az egr felette van" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2535,11 +2592,11 @@ msgstr "Touchpad m msgid "Touchpad mode disabled." msgstr "Touchpad md letiltva." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Kattints Md" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2547,11 +2604,11 @@ msgstr "Kattint msgid "Left Click" msgstr "Bal katt" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Kzps katt" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2953,37 +3010,37 @@ msgstr "Ind msgid "Do you really want to quit?" msgstr "Biztos hogy ki akarsz lpni ?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "rintkperny 'Tap Md' - Bal katt" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "rintkperny 'Tap Md' - Jobb katt" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "rintkperny 'Tap Md' - Lebeg (Nincs katt)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Maximum Hanger" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Hanger nvelse" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Minimum Hanger" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Hanger cskkentse" diff --git a/po/it_IT.po b/po/it_IT.po index 164171ce8f..7d4c11319d 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-09 09:30+0100\n" "Last-Translator: Matteo 'Maff' Angelino \n" "Language-Team: Italian\n" +"Language: Italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Italiano\n" #: gui/about.cpp:91 #, c-format @@ -44,10 +44,11 @@ msgstr "Su" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -90,16 +91,16 @@ msgstr "Mappa" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -436,13 +437,13 @@ msgstr "Cerca nella lista dei giochi" msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Carica gioco:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -924,68 +925,104 @@ msgstr "" "Il tema che hai selezionato non supporta la lingua attuale. Se vuoi " "utilizzare questo tema devi prima cambiare la lingua." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Nessuna data salvata" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Nessun orario salvato" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Nessun tempo salvato" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Elimina" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Sei sicuro di voler eliminare questo salvataggio?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Data: " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Ora: " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Tempo di gioco: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Salvataggio senza titolo" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Salva" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Impossibile salvare il gioco" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Nome:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Seleziona un tema" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "Grafica disattivata" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "Grafica disattivata" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Renderer standard (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standard (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Renderer con antialiasing (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Con antialiasing (16bpp)" @@ -1090,16 +1127,16 @@ msgstr "Utente cancellato" msgid "Unknown error" msgstr "Errore sconosciuto" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "Il gioco in '%s' sembra essere sconosciuto." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "Per favore, riporta i seguenti dati al team di ScummVM con il nome" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "del gioco che hai provato ad aggiungere e la sua versione/lingua/ecc.:" @@ -1137,13 +1174,13 @@ msgid "~R~eturn to Launcher" msgstr "~V~ai a elenco giochi" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Salva gioco:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1266,11 +1303,11 @@ msgstr "" "Usa le schermate originali di salvataggio e caricamento, al posto di quelle " "di ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Ripristina gioco:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Ripristina" @@ -1995,7 +2032,7 @@ msgstr "" "Il supporto nativo MIDI richiede il Roland Upgrade della LucasArts,\n" "ma %s non presente. Verr usato AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2006,7 +2043,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2017,7 +2054,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2071,11 +2108,11 @@ msgid "Cutscene file '%s' not found!" msgstr "File della scena di intermezzo '%s' non trovato!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Impossibile caricare il gioco dal file." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Impossibile salvare il gioco nel file." @@ -2207,12 +2244,13 @@ msgstr "" "Roland MT32 in quelli General MIDI. Alcune tracce\n" "potrebbero avere un suono non corretto." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "Intro floppy" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "Usa la versione floppy dell'intro (solo versione CD)" #: engines/sky/compact.cpp:130 @@ -2231,6 +2269,14 @@ msgstr "" "Il file \"sky.cpt\" non ha una dimensione corretta.\n" "Si prega di (ri)scaricarlo da www.scummvm.org" +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Intro floppy" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "Usa la versione floppy dell'intro (solo versione CD)" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2306,6 +2352,17 @@ msgstr "Mostra etichette oggetti" msgid "Show labels for objects on mouse hover" msgstr "Mostra etichette per gli oggetti al passaggio del mouse" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2557,11 +2614,11 @@ msgstr "Modalit msgid "Touchpad mode disabled." msgstr "Modalit touchpad disattivata." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Modalit clic" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2569,11 +2626,11 @@ msgstr "Modalit msgid "Left Click" msgstr "Clic sinistro" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Clic centrale" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2977,37 +3034,37 @@ msgstr "Elenco giochi" msgid "Do you really want to quit?" msgstr "Sei sicuro di voler uscire?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen 'Tap Mode' - Clic sinistro" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscreen 'Tap Mode' - Clic destro" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen 'Tap Mode' - Passaggio del cursore (nessun clic)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Volume massimo" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Aumento volume" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Volume minimo" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Diminuzione volume" diff --git a/po/nb_NO.po b/po/nb_NO.po index bc7b1720fa..b775d11dd2 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-04 02:19+0100\n" "Last-Translator: Einar Johan Smen \n" "Language-Team: somaen \n" +"Language: Norsk (bokmaal)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Norsk (bokmaal)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Poedit-Language: Norsk Bokml\n" "X-Poedit-Country: NORWAY\n" @@ -48,10 +48,11 @@ msgstr "G #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -94,16 +95,16 @@ msgstr "Koble" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -441,13 +442,13 @@ msgstr "S msgid "Search:" msgstr "Sk:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "pne spill:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -922,68 +923,104 @@ msgstr "" "Temaet du valgte sttter ikke det aktive sprket. Hvis du vil bruke dette " "temaet, m du bytte til et annet sprk frst." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Ingen dato lagret" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Ingen tid lagret" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Ingen spilltid lagret" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Slett" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Vil du virkelig slette dette lagrede spillet?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Dato: " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Tid: " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Spilltid: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Ikke navngitt spilltilstand" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Lagre" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Klarte ikke lagre spill." + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Navn:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Velg et tema" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "Deaktivert GFX" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "Deaktivert GFX" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Standard Tegner (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standard (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Antialiased Tegner (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Antialiased (16bpp)" @@ -1087,17 +1124,17 @@ msgstr "Brukeren avbr msgid "Unknown error" msgstr "Ukjent feil" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "Spillet i '%s' ser ut til vre ukjent." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" "Vennligst rapporter de flgende dataene til ScummVM-teamet sammen med navnet" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "p spillet du forskte legge til, og dets versjon/sprk/etc.:" @@ -1135,13 +1172,13 @@ msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Lagret spill:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1253,11 +1290,11 @@ msgstr "Bruk originale lagre/laste-skjermer" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Bruk de originale lagre/laste-skjermene, istedenfor ScummVM-variantene" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Gjennopprett spill:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Gjenopprett" @@ -1976,7 +2013,7 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1987,7 +2024,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -1998,7 +2035,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2051,11 +2088,11 @@ msgid "Cutscene file '%s' not found!" msgstr "" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Klarte ikke pne spilltilstand fra fil." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Klarte ikke lagre spilltilstand fra fil." @@ -2189,12 +2226,13 @@ msgstr "" "General MIDI-instrumentene. Allikevel, kan det\n" "skje at enkelte spor ikke vil spilles riktig." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "Diskett-intro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "Bruk diskettversjonens intro (Kun for CD-versjon)" #: engines/sky/compact.cpp:130 @@ -2211,6 +2249,14 @@ msgid "" "Please (re)download it from www.scummvm.org" msgstr "" +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Diskett-intro" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "Bruk diskettversjonens intro (Kun for CD-versjon)" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2279,6 +2325,17 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2529,11 +2586,11 @@ msgstr "Touchpad-modus aktivert." msgid "Touchpad mode disabled." msgstr "Touchpad-modus deaktivert." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Klikkmodus" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2541,11 +2598,11 @@ msgstr "Klikkmodus" msgid "Left Click" msgstr "Venstreklikk" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Midtklikk" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2951,37 +3008,37 @@ msgstr "Oppstarter" msgid "Do you really want to quit?" msgstr "Vil du virkelig avslutte?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchskjerm 'Tapmodus' - Venstreklikk" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchskjerm 'Tapmodus' - Hyreklikk" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchskjerm 'Tapmodus' - Sveve (Ingen Klikk)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Maksimalt Volum" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "ker volum" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Minimalt Volum" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Senker volum" diff --git a/po/nn_NO.po b/po/nn_NO.po index a88637b7c0..1b78932a46 100644 --- a/po/nn_NO.po +++ b/po/nn_NO.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2011-04-25 23:07+0100\n" "Last-Translator: Einar Johan T. Smen \n" "Language-Team: somaen \n" +"Language: Norsk (nynorsk)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Norsk (nynorsk)\n" "X-Poedit-Language: Norwegian Nynorsk\n" "X-Poedit-SourceCharset: iso-8859-1\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -48,10 +48,11 @@ msgstr "G #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -95,16 +96,16 @@ msgstr "Kople" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -443,13 +444,13 @@ msgstr "S msgid "Search:" msgstr "Sk:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "pne spel:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -920,68 +921,104 @@ msgstr "" "Temaet du har valt stttar ikkje det aktive sprket. Om du vil nytte dette " "temaet m du bytte til eit anna sprk frst." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Ingen dato lagra" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Inga tid lagra" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Inga speletid lagra" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Slett" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Vil du verkeleg slette det lagra spelet?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Dato: " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Tid: " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Speletid: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Ikkje navngjeven speltilstand" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Lagre" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Full speltittel:" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Namn:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Vel eit tema" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "Deaktivert GFX" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "Deaktivert GFX" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Standard Teiknar (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standard (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Antialiased Teiknar (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Antialiased (16bpp)" @@ -1086,16 +1123,16 @@ msgstr "" msgid "Unknown error" msgstr "Ukjend feil" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "" -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "" @@ -1135,13 +1172,13 @@ msgid "~R~eturn to Launcher" msgstr "~T~ilbake til oppstarter" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Lagra spel:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1242,11 +1279,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Gjenopprett spel:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Gjenopprett" @@ -1975,7 +2012,7 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1983,7 +2020,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -1991,7 +2028,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2042,11 +2079,11 @@ msgid "Cutscene file '%s' not found!" msgstr "" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "" -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "" @@ -2182,12 +2219,12 @@ msgid "" "some tracks sound incorrect." msgstr "" -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +msgid "Use an alternative game intro (CD version only)" msgstr "" #: engines/sky/compact.cpp:130 @@ -2202,6 +2239,14 @@ msgid "" "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:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2263,6 +2308,17 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2497,11 +2553,11 @@ msgstr "" msgid "Touchpad mode disabled." msgstr "" -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2509,12 +2565,12 @@ msgstr "" msgid "Left Click" msgstr "Venstreklikk" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 #, fuzzy msgid "Middle Click" msgstr "Midtre venstre gjenstand" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2928,39 +2984,39 @@ msgstr "Sl msgid "Do you really want to quit?" msgstr "Vil du avslutte?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 #, fuzzy msgid "Maximum Volume" msgstr "Volum" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 #, fuzzy msgid "Minimal Volume" msgstr "Volum" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "" diff --git a/po/pl_PL.po b/po/pl_PL.po index 5d3655f8b6..c2c5c09e19 100644 --- a/po/pl_PL.po +++ b/po/pl_PL.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2011-10-24 21:14+0100\n" "Last-Translator: Micha Zibkowski \n" "Language-Team: Grajpopolsku.pl \n" +"Language: Polski\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-2\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Polski\n" "X-Poedit-KeywordsList: _;gettext;gettext_noop\n" "X-Poedit-Basepath: .\n" "X-Poedit-Language: Polish\n" @@ -48,10 +48,11 @@ msgstr "W g #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -95,16 +96,16 @@ msgstr "Przypisz" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -441,13 +442,13 @@ msgstr "Wyszukaj gr msgid "Search:" msgstr "Szukaj" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Wczytaj gr:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -922,68 +923,104 @@ msgstr "" "Wybrany styl nie obsuguje obecnego jzyka. Jeli chcesz go uywa, zmie " "najpierw swj jzyk." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Brak daty" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Brak godziny" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Brak czasu gry" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Skasuj" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Na pewno chcesz skasowa ten zapis?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Data: " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Czas: " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Czas gry: " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Zapis bez nazwy" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Zapisz" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Nie udao si zapisa stanu gry" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Nazwa:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Wybierz styl" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "Wyczona grafika" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "Wyczona grafika" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Standardowy renderer (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standardowy (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Wygadzany renderer (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Wygadzany (16bpp)" @@ -1087,16 +1124,16 @@ msgstr "Przerwane przez u msgid "Unknown error" msgstr "Nieznany bd" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "Gra w '%s' wyglda na nieznan." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "Przeka ponisze dane zespoowi ScummVM razem z nazw" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "gry, ktr prbowae doda oraz jej wersj, jzykiem itd.:" @@ -1134,13 +1171,13 @@ msgid "~R~eturn to Launcher" msgstr "~P~owrt do launchera" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Zapis:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1257,11 +1294,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Wznw gr:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Wznw" @@ -1986,7 +2023,7 @@ msgstr "" "Natywne wsparcie MIDI wymaga aktualizacji Rolanda od LucasArts,\n" "ale brakuje %s. Przeczam na tryb AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1997,7 +2034,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2008,7 +2045,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2061,11 +2098,11 @@ msgid "Cutscene file '%s' not found!" msgstr "Nie znaleziono pliku przerywnika '%s'!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Nie udao si wczyta stanu gry z pliku." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Nie udao si zapisa stanu gry do pliku." @@ -2205,12 +2242,12 @@ msgstr "" "Prbujemy przypisa instrumenty Rolanda MT32 do instrumentw General MIDI. " "Niektre utwory mog by le odtwarzane." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +msgid "Use an alternative game intro (CD version only)" msgstr "" #: engines/sky/compact.cpp:130 @@ -2229,6 +2266,14 @@ msgstr "" "Plik \"sky.cpt\" ma nieprawidowy rozmiar.\n" "Pobierz go (ponownie) ze strony www.scummvm.org" +#: 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:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2304,6 +2349,17 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2555,11 +2611,11 @@ msgstr "Tryb touchpada w msgid "Touchpad mode disabled." msgstr "Tryb touchpada wyczony." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2567,12 +2623,12 @@ msgstr "" msgid "Left Click" msgstr "Kliknicie LPM" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 #, fuzzy msgid "Middle Click" msgstr "Przedmiot na rodku, z lewej" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2974,37 +3030,37 @@ msgstr "" msgid "Do you really want to quit?" msgstr "Na pewno chcesz wyj?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Dotknicie ekranu - kliknicie LPM" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Dotknicie ekranu - kliknicie PPM" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Dotknicie ekranu - brak kliknicia" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Maksymalna gono" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Zwikszenie gonoci" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Minimalna gono" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Zmniejszenie gonoci" diff --git a/po/pt_BR.po b/po/pt_BR.po index ac60a814e2..f41aa7d59f 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2011-10-21 21:30-0300\n" "Last-Translator: Saulo Benigno \n" "Language-Team: ScummBR (www.scummbr.com) \n" +"Language: Portugues (Brasil)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Portugues (Brasil)\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Poedit-Language: Portuguese\n" "X-Poedit-Country: BRAZIL\n" @@ -48,10 +48,11 @@ msgstr "Acima" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -95,16 +96,16 @@ msgstr "Mapear" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -442,13 +443,13 @@ msgstr "Pesquisar na lista de jogos" msgid "Search:" msgstr "Pesquisar:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Carregar jogo:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -931,68 +932,104 @@ msgstr "" "O tema que voc selecionou no suporta seu idioma atual. Se voc quiser usar " "este tema voc precisa mudar para outro idioma." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Sem data salva" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Sem hora salva" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Sem tempo de jogo salvo" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Excluir" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Voc realmente quer excluir este jogo salvo?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Data:" -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Hora:" -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Tempo de jogo:" -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "No-titulado arquivo de save" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Salvar" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Falha ao salvar o jogo" + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Nome:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Selecione um Tema" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "GFX desabilitado" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "GFX desabilitado" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Renderizador padro (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Padro (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Renderizador Anti-Serrilhamento (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Anti-Serrilhamento (16bpp)" @@ -1098,17 +1135,17 @@ msgstr "Usu msgid "Unknown error" msgstr "Erro desconhecido" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "O jogo em '% s' parece ser desconhecido." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" "Por favor, informe os seguintes dados para a equipe ScummVM junto com o nome" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "do jogo que voc tentou adicionar e sua verso/idioma/etc.:" @@ -1146,13 +1183,13 @@ msgid "~R~eturn to Launcher" msgstr "~V~oltar ao menu" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Salvar jogo:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1273,11 +1310,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "Restaurar jogo:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "Restaurar" @@ -2003,7 +2040,7 @@ msgstr "" "LucasArts,\n" "mas %s est faltando. Utilizando AdLib ao invs." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2014,7 +2051,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2025,7 +2062,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2079,14 +2116,14 @@ msgid "Cutscene file '%s' not found!" msgstr "Arquivo de vdeo '%s' no encontrado!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "" "Falha ao carregar o estado do jogo a partir do arquivo:\n" "\n" "%s" -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "" "Falha ao salvar o estado do jogo para o arquivo:\n" @@ -2230,12 +2267,12 @@ msgstr "" "o modelo General MIDI. Talvez possa acontecer\n" "que algumas faixas no sejam corretamente tocadas." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +msgid "Use an alternative game intro (CD version only)" msgstr "" #: engines/sky/compact.cpp:130 @@ -2254,6 +2291,14 @@ msgstr "" "O arquivo \"sky.cpt\" possui um tamanho incorreto.\n" "Por favor, refaa o download em www.scummvm.org" +#: 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:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2329,6 +2374,17 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2581,11 +2637,11 @@ msgstr "Modo Touchpad ligado." msgid "Touchpad mode disabled." msgstr "Modo Touchpad desligado." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2593,12 +2649,12 @@ msgstr "" msgid "Left Click" msgstr "Clique com o boto esquerdo" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 #, fuzzy msgid "Middle Click" msgstr "Item do meio na esquerda" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -3003,37 +3059,37 @@ msgstr "Menu principal" msgid "Do you really want to quit?" msgstr "Voc realmente deseja sair?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen 'Modo Toque' - Clique Esquerdo" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscreen 'Modo Toque' - Clique Direito" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen 'Modo Toque' - Acima (Sem Clicar)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Volume mximo" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Aumentando Volume" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Volume mnimo" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Diminuindo Volume" diff --git a/po/ru_RU.po b/po/ru_RU.po index 019acbddbc..3a80d9fd7b 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,16 +7,16 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-08 22:00+0200+0200\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" +"Language: Russian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-5\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Russian\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" -"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: gui/about.cpp:91 #, c-format @@ -46,10 +46,11 @@ msgstr " #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -92,16 +93,16 @@ msgstr " #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -438,13 +439,13 @@ msgstr " msgid "Search:" msgstr ":" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr " :" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -688,8 +689,7 @@ msgstr "SoundFont:" #: gui/options.cpp:849 gui/options.cpp:851 gui/options.cpp:852 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -"SoundFont , Fluidsynth " -"Timidity" +"SoundFont , Fluidsynth Timidity" #: gui/options.cpp:851 msgctxt "lowres" @@ -742,7 +742,8 @@ msgstr " #: gui/options.cpp:880 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -" General MIDI Roland MT-32" +" General MIDI Roland " +"MT-32" #: gui/options.cpp:889 msgid "Don't use Roland MT-32 music" @@ -924,68 +925,104 @@ msgstr "" ", , . " " , ." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr " " -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr " " -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr " " -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr " ?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr ": " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr ": " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr " : " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr " " +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr " " + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr ":" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr " " -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr " " -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr " " -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr " (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr " (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr " (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr " (16bpp)" @@ -1089,17 +1126,17 @@ msgstr " msgid "Unknown error" msgstr " " -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr ", '%s' ." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" ", ScummVM " -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr ", , , .." @@ -1137,13 +1174,13 @@ msgid "~R~eturn to Launcher" msgstr "~~ " #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr " :" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1168,9 +1205,9 @@ msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -" (%s)! " -", README , " -" , ." +" (%s)! , README " +" , , " +"." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 @@ -1237,9 +1274,9 @@ msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -" (%s)! " -", README , " -" , ." +" (%s)! , " +"README , , " +" ." #: engines/engine.cpp:439 msgid "" @@ -1264,14 +1301,14 @@ msgstr " #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -" " -" ScummVM" +" " +"ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr " :" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "" @@ -1297,7 +1334,8 @@ msgstr " #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr " " +msgstr "" +" " #: engines/sci/detection.cpp:400 msgid "Use IMF/Yamaha FB-01 for MIDI output" @@ -1308,8 +1346,8 @@ msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" -" IBM Music Feature " -"Yamaha FB-01 FM MIDI" +" IBM Music Feature Yamaha " +"FB-01 FM MIDI" #: engines/sci/detection.cpp:411 msgid "Use CD audio" @@ -1317,7 +1355,9 @@ msgstr " #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr " CD ( )" +msgstr "" +" CD ( " +")" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" @@ -1327,7 +1367,8 @@ msgstr " msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" -" Windows ( ) DOS" +" Windows ( ) " +" DOS" #: engines/sci/detection.cpp:433 msgid "Use silver cursors" @@ -1995,7 +2036,7 @@ msgstr "" " \"\" MIDI Roland Upgrade \n" "LucasArts, %s. AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -2006,7 +2047,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2017,7 +2058,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2070,11 +2111,11 @@ msgid "Cutscene file '%s' not found!" msgstr " '%s' !" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr " ." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr " ." @@ -2207,12 +2248,13 @@ msgstr "" " , \n" " ." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr " " +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr " ( CD )" #: engines/sky/compact.cpp:130 @@ -2231,6 +2273,14 @@ msgstr "" " sky.cpt .\n" ", www.scummvm.org" +#: 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 " ( CD )" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2292,7 +2342,8 @@ msgstr " msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" -" PSX, ScummVM RGB " +" PSX, ScummVM RGB " +"" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" @@ -2302,6 +2353,17 @@ msgstr " msgid "Show labels for objects on mouse hover" msgstr " " +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2329,8 +2391,8 @@ msgid "" "Press OK to convert them now, otherwise you will be asked next time.\n" msgstr "" "ScummVM Nippon Safes, " -" . , " -" , .\n" +" . , " +" , .\n" "\n" " , , " " .\n" @@ -2552,11 +2614,11 @@ msgstr " msgid "Touchpad mode disabled." msgstr " ." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr " " -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2564,11 +2626,11 @@ msgstr " msgid "Left Click" msgstr " " -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr " " -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2970,37 +3032,37 @@ msgstr " msgid "Do you really want to quit?" msgstr " ?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr " '' - " -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr " '' - " -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr " '' - ( )" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr " " -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr " " -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr " " -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr " " diff --git a/po/scummvm.pot b/po/scummvm.pot index 8a68e4372b..de270cef27 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -6,12 +6,13 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ScummVM 1.5.0git\n" +"Project-Id-Version: ScummVM 1.6.0git\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" @@ -44,10 +45,11 @@ msgstr "" #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -90,16 +92,16 @@ msgstr "" #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "" @@ -433,13 +435,13 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -903,68 +905,101 @@ msgid "" "to use this theme you need to switch to another language first." msgstr "" -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "" -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "" -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "" -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +msgid "New Save" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +msgid "Create a new save game" +msgstr "" + +#: gui/saveload-dialog.cpp:789 +msgid "Name: " +msgstr "" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "" @@ -1068,16 +1103,16 @@ msgstr "" msgid "Unknown error" msgstr "" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "" -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "" @@ -1115,13 +1150,13 @@ msgid "~R~eturn to Launcher" msgstr "" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1220,11 +1255,11 @@ msgstr "" msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "" @@ -1942,7 +1977,7 @@ msgid "" "but %s is missing. Using AdLib instead." msgstr "" -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1950,7 +1985,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -1958,7 +1993,7 @@ msgid "" "%s" msgstr "" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2005,11 +2040,11 @@ msgid "Cutscene file '%s' not found!" msgstr "" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "" -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "" @@ -2136,12 +2171,12 @@ msgid "" "some tracks sound incorrect." msgstr "" -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +msgid "Use an alternative game intro (CD version only)" msgstr "" #: engines/sky/compact.cpp:130 @@ -2156,6 +2191,14 @@ msgid "" "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:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2217,6 +2260,17 @@ msgstr "" msgid "Show labels for objects on mouse hover" msgstr "" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2447,11 +2501,11 @@ msgstr "" msgid "Touchpad mode disabled." msgstr "" -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2459,11 +2513,11 @@ msgstr "" msgid "Left Click" msgstr "" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2863,37 +2917,37 @@ msgstr "" msgid "Do you really want to quit?" msgstr "" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "" diff --git a/po/se_SE.po b/po/se_SE.po index 8388e55370..02f2ab44f4 100644 --- a/po/se_SE.po +++ b/po/se_SE.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.5.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-07-08 18:03+0100\n" "Last-Translator: Hampus Flink \n" "Language-Team: \n" +"Language: Svenska\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Svenska\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Poedit-Language: Swedish\n" "X-Poedit-Country: SWEDEN\n" @@ -48,10 +48,11 @@ msgstr "Upp #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -94,16 +95,16 @@ msgstr "St #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -441,13 +442,13 @@ msgstr "S msgid "Search:" msgstr "Sk:" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr "Ladda spel:" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -924,68 +925,104 @@ msgstr "" "Temat du valde stder inte ditt sprk. Om du vill anvnda det hr temat " "mste frst byta till ett annat sprk." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr "Inget datum sparat" -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr "Ingen tid sparad" -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr "Ingen speltid sparad" -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "Radera" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr "Vill du verkligen radera den hr spardatan?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr "Datum:" -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr "Tid:" -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr "Speltid:" -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr "Namnls spardata" +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "Spara" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr "Kunde inte spara spelet." + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr "Namn:" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr "Vlj ett tema" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "Inaktiverad GFX" -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr "Inaktiverad GFX" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Standard rendering (16 bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr "Standard (16 bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Antialiserad rendering (16 bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr "Antialiserad (16 bpp)" @@ -1089,17 +1126,17 @@ msgstr "Avbrutit av anv msgid "Unknown error" msgstr "Oknt fel" -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr "Spelet i '%s' verkar vara oknt." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr "" "Var god rapportera fljande data till ScummVM-teamet tillsammans med namnet" -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr "p spelet du frskte lgga till och dess version/sprk/etc.:" @@ -1137,13 +1174,13 @@ msgid "~R~eturn to Launcher" msgstr "te~r~vnd till launcher" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr "Spara spelet:" #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1260,11 +1297,11 @@ msgstr "Anv msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "Anvnder originalskrmarna fr spara/ladda istllet fr ScummVM:s" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr "terstll spel:" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "terstll" @@ -1988,7 +2025,7 @@ msgstr "" "Std fr Native MIDI krver Roland-uppdateringen frn LucasArts,\n" "men %s saknas. Anvnder AdLib istllet." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1999,7 +2036,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2010,7 +2047,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2063,11 +2100,11 @@ msgid "Cutscene file '%s' not found!" msgstr "Filmscensfilen '%s' hittades ej!" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr "Kunde inte lsa spardata frn filen" -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr "Kunde inte skriva spardata till filen." @@ -2199,12 +2236,13 @@ msgstr "" "General MIDI-instrument. Det kan trots allt hnda\n" "att ett ftal ljudspr inte spelas korrekt." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr "Diskettintro" +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr "Anvnd diskettversionens intro (endast CD-version)" #: engines/sky/compact.cpp:130 @@ -2223,6 +2261,14 @@ msgstr "" "Filen \"sky.cpt\" har inkorrekt filstorlek.\n" "Var god ladda hem den igen frn www.scummvm.org" +#: engines/sky/detection.cpp:44 +msgid "Floppy intro" +msgstr "Diskettintro" + +#: engines/sky/detection.cpp:45 +msgid "Use the floppy version's intro (CD version only)" +msgstr "Anvnd diskettversionens intro (endast CD-version)" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2293,6 +2339,17 @@ msgstr "Visa etiketter" msgid "Show labels for objects on mouse hover" msgstr "Visar etiketter fr objekten som musen pekar p" +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2544,11 +2601,11 @@ msgstr "Touchpad-l msgid "Touchpad mode disabled." msgstr "Touchpad-lge inaktiverat." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr "Klicklge" -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2556,11 +2613,11 @@ msgstr "Klickl msgid "Left Click" msgstr "Vnsterklick" -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr "Mittenklick" -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2965,37 +3022,37 @@ msgstr "Launcher" msgid "Do you really want to quit?" msgstr "Vill du verkligen avsluta?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr "Touchscreen \"Tap-lge\" - Vnsterklick" -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr "Touchscren \"Tap-lge\" - Hgerklick" -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr "Touchscreen \"Tap-lge\" - Hover (utan klick)" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr "Max. volym" -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr "Hja volymen" -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr "Min. volym" -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr "Snka volymen" diff --git a/po/uk_UA.po b/po/uk_UA.po index 38855dcb11..be7935518b 100644 --- a/po/uk_UA.po +++ b/po/uk_UA.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2012-07-08 12:25+0100\n" +"POT-Creation-Date: 2012-08-12 14:57+0200\n" "PO-Revision-Date: 2012-06-29 20:19+0200\n" "Last-Translator: lubomyr \n" "Language-Team: Ukrainian\n" @@ -46,10 +46,11 @@ msgstr " #: gui/browser.cpp:69 gui/chooser.cpp:45 gui/KeysDialog.cpp:43 #: gui/launcher.cpp:345 gui/massadd.cpp:94 gui/options.cpp:1228 -#: gui/saveload.cpp:64 gui/saveload.cpp:173 gui/themebrowser.cpp:54 -#: engines/engine.cpp:442 engines/scumm/dialogs.cpp:190 -#: engines/sword1/control.cpp:865 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:48 +#: gui/saveload-dialog.cpp:207 gui/saveload-dialog.cpp:267 +#: gui/saveload-dialog.cpp:516 gui/saveload-dialog.cpp:843 +#: gui/themebrowser.cpp:54 engines/engine.cpp:442 +#: engines/scumm/dialogs.cpp:190 engines/sword1/control.cpp:865 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:48 #: backends/events/default/default-events.cpp:191 #: backends/events/default/default-events.cpp:213 msgid "Cancel" @@ -92,16 +93,16 @@ msgstr " #: gui/KeysDialog.cpp:42 gui/launcher.cpp:346 gui/launcher.cpp:1001 #: gui/launcher.cpp:1005 gui/massadd.cpp:91 gui/options.cpp:1229 -#: engines/engine.cpp:361 engines/engine.cpp:372 engines/scumm/dialogs.cpp:192 -#: engines/scumm/scumm.cpp:1775 engines/agos/animation.cpp:561 -#: engines/groovie/script.cpp:420 engines/sky/compact.cpp:131 -#: engines/sky/compact.cpp:141 engines/sword1/animation.cpp:539 -#: engines/sword1/animation.cpp:560 engines/sword1/animation.cpp:570 -#: engines/sword1/animation.cpp:577 engines/sword1/control.cpp:865 -#: engines/sword1/logic.cpp:1633 engines/sword2/animation.cpp:435 -#: engines/sword2/animation.cpp:455 engines/sword2/animation.cpp:465 -#: engines/sword2/animation.cpp:474 engines/parallaction/saveload.cpp:274 -#: backends/platform/wii/options.cpp:47 +#: gui/saveload-dialog.cpp:844 engines/engine.cpp:361 engines/engine.cpp:372 +#: engines/scumm/dialogs.cpp:192 engines/scumm/scumm.cpp:1775 +#: engines/agos/animation.cpp:561 engines/groovie/script.cpp:420 +#: engines/sky/compact.cpp:131 engines/sky/compact.cpp:141 +#: engines/sword1/animation.cpp:539 engines/sword1/animation.cpp:560 +#: engines/sword1/animation.cpp:570 engines/sword1/animation.cpp:577 +#: engines/sword1/control.cpp:865 engines/sword1/logic.cpp:1633 +#: engines/sword2/animation.cpp:435 engines/sword2/animation.cpp:455 +#: engines/sword2/animation.cpp:465 engines/sword2/animation.cpp:474 +#: engines/parallaction/saveload.cpp:274 backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:54 msgid "OK" msgstr "OK" @@ -439,13 +440,13 @@ msgstr " msgid "Search:" msgstr ":" -#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:255 +#: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/mohawk/myst.cpp:245 #: engines/mohawk/riven.cpp:716 engines/cruise/menu.cpp:214 msgid "Load game:" msgstr " :" #: gui/launcher.cpp:680 engines/dialogs.cpp:114 engines/scumm/dialogs.cpp:188 -#: engines/mohawk/myst.cpp:255 engines/mohawk/riven.cpp:716 +#: engines/mohawk/myst.cpp:245 engines/mohawk/riven.cpp:716 #: engines/cruise/menu.cpp:214 backends/platform/wince/CEActionsPocket.cpp:267 #: backends/platform/wince/CEActionsSmartphone.cpp:231 msgid "Load" @@ -923,68 +924,104 @@ msgstr "" " . " ", ." -#: gui/saveload.cpp:59 gui/saveload.cpp:257 +#: gui/saveload-dialog.cpp:158 +msgid "List view" +msgstr "" + +#: gui/saveload-dialog.cpp:159 +msgid "Grid view" +msgstr "" + +#: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" msgstr " " -#: gui/saveload.cpp:60 gui/saveload.cpp:258 +#: gui/saveload-dialog.cpp:203 gui/saveload-dialog.cpp:351 msgid "No time saved" msgstr " " -#: gui/saveload.cpp:61 gui/saveload.cpp:259 +#: gui/saveload-dialog.cpp:204 gui/saveload-dialog.cpp:352 msgid "No playtime saved" msgstr " " -#: gui/saveload.cpp:68 gui/saveload.cpp:173 +#: gui/saveload-dialog.cpp:211 gui/saveload-dialog.cpp:267 msgid "Delete" msgstr "" -#: gui/saveload.cpp:172 +#: gui/saveload-dialog.cpp:266 msgid "Do you really want to delete this savegame?" msgstr " ?" -#: gui/saveload.cpp:282 +#: gui/saveload-dialog.cpp:375 gui/saveload-dialog.cpp:796 msgid "Date: " msgstr ": " -#: gui/saveload.cpp:286 +#: gui/saveload-dialog.cpp:379 gui/saveload-dialog.cpp:802 msgid "Time: " msgstr ": " -#: gui/saveload.cpp:292 +#: gui/saveload-dialog.cpp:385 gui/saveload-dialog.cpp:810 msgid "Playtime: " msgstr " : " -#: gui/saveload.cpp:305 gui/saveload.cpp:372 +#: gui/saveload-dialog.cpp:398 gui/saveload-dialog.cpp:465 msgid "Untitled savestate" msgstr " " +#: gui/saveload-dialog.cpp:517 +msgid "Next" +msgstr "" + +#: gui/saveload-dialog.cpp:520 +msgid "Prev" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "New Save" +msgstr "" + +#: gui/saveload-dialog.cpp:684 +#, fuzzy +msgid "Create a new save game" +msgstr " " + +#: gui/saveload-dialog.cpp:789 +#, fuzzy +msgid "Name: " +msgstr ":" + +#: gui/saveload-dialog.cpp:861 +#, c-format +msgid "Enter a description for slot %d:" +msgstr "" + #: gui/themebrowser.cpp:44 msgid "Select a Theme" msgstr " " -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr " " -#: gui/ThemeEngine.cpp:335 +#: gui/ThemeEngine.cpp:337 msgctxt "lowres" msgid "Disabled GFX" msgstr " " -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr " (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:338 msgid "Standard (16bpp)" msgstr " (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr " (16bpp)" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:340 msgid "Antialiased (16bpp)" msgstr " (16bpp)" @@ -1088,16 +1125,16 @@ msgstr " msgid "Unknown error" msgstr " " -#: engines/advancedDetector.cpp:324 +#: engines/advancedDetector.cpp:316 #, c-format msgid "The game in '%s' seems to be unknown." msgstr " '%s' ." -#: engines/advancedDetector.cpp:325 +#: engines/advancedDetector.cpp:317 msgid "Please, report the following data to the ScummVM team along with name" msgstr " , ScummVM " -#: engines/advancedDetector.cpp:327 +#: engines/advancedDetector.cpp:319 msgid "of the game you tried to add and its version/language/etc.:" msgstr " , , // :" @@ -1135,13 +1172,13 @@ msgid "~R~eturn to Launcher" msgstr "~~. " #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 -#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:735 +#: engines/cruise/menu.cpp:212 engines/sci/engine/kfile.cpp:742 msgid "Save game:" msgstr " : " #: engines/dialogs.cpp:115 engines/agi/saveload.cpp:803 #: engines/scumm/dialogs.cpp:187 engines/cruise/menu.cpp:212 -#: engines/sci/engine/kfile.cpp:735 +#: engines/sci/engine/kfile.cpp:742 #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsPocket.cpp:267 @@ -1261,11 +1298,11 @@ msgid "Use the original save/load screens, instead of the ScummVM ones" msgstr "" " / , ScummVM" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" msgstr " :" -#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:831 +#: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore" msgstr "" @@ -1987,7 +2024,7 @@ msgstr "" " \"\" MIDI Roland Upgrade \n" "LucasArts, %s . AdLib." -#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:202 +#: engines/scumm/scumm.cpp:2278 engines/agos/saveload.cpp:220 #, c-format msgid "" "Failed to save game state to file:\n" @@ -1998,7 +2035,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:167 +#: engines/scumm/scumm.cpp:2285 engines/agos/saveload.cpp:185 #, c-format msgid "" "Failed to load game state from file:\n" @@ -2009,7 +2046,7 @@ msgstr "" "\n" "%s" -#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:210 +#: engines/scumm/scumm.cpp:2297 engines/agos/saveload.cpp:228 #, c-format msgid "" "Successfully saved game state in file:\n" @@ -2062,11 +2099,11 @@ msgid "Cutscene file '%s' not found!" msgstr " '%s' !" #: engines/gob/inter_playtoons.cpp:256 engines/gob/inter_v2.cpp:1287 -#: engines/tinsel/saveload.cpp:502 +#: engines/tinsel/saveload.cpp:532 msgid "Failed to load game state from file." msgstr " ." -#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:515 +#: engines/gob/inter_v2.cpp:1357 engines/tinsel/saveload.cpp:545 msgid "Failed to save game state to file." msgstr " ." @@ -2198,12 +2235,13 @@ msgstr "" "MT32 General MIDI. \n" ", ." -#: engines/queen/queen.cpp:59 engines/sky/detection.cpp:44 -msgid "Floppy intro" -msgstr " " +#: engines/queen/queen.cpp:59 +msgid "Alternative intro" +msgstr "" -#: engines/queen/queen.cpp:60 engines/sky/detection.cpp:45 -msgid "Use the floppy version's intro (CD version only)" +#: engines/queen/queen.cpp:60 +#, fuzzy +msgid "Use an alternative game intro (CD version only)" msgstr " ( CD )" #: engines/sky/compact.cpp:130 @@ -2222,6 +2260,14 @@ msgstr "" " sky.cpt .\n" " , () www.scummvm.org" +#: 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 " ( CD )" + #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" @@ -2291,6 +2337,17 @@ msgstr " msgid "Show labels for objects on mouse hover" msgstr " ' " +#: engines/teenagent/resources.cpp:68 +msgid "" +"You're missing the 'teenagent.dat' file. Get it from the ScummVM website" +msgstr "" + +#: engines/teenagent/resources.cpp:89 +msgid "" +"The teenagent.dat file is compressed and zlib hasn't been included in this " +"executable. Please decompress it" +msgstr "" + #: engines/parallaction/saveload.cpp:133 #, c-format msgid "" @@ -2368,8 +2425,8 @@ msgid "" "The selected audio device '%s' cannot be used. See log file for more " "information." msgstr "" -" '%s' . " -" ." +" '%s' . " +" ." #: audio/mididrv.cpp:257 #, c-format @@ -2541,11 +2598,11 @@ msgstr " msgid "Touchpad mode disabled." msgstr " ." -#: backends/platform/maemo/maemo.cpp:205 +#: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" msgstr " " -#: backends/platform/maemo/maemo.cpp:211 +#: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:60 #: backends/platform/wince/CEActionsSmartphone.cpp:43 @@ -2553,11 +2610,11 @@ msgstr " msgid "Left Click" msgstr " " -#: backends/platform/maemo/maemo.cpp:214 +#: backends/platform/maemo/maemo.cpp:218 msgid "Middle Click" msgstr " " -#: backends/platform/maemo/maemo.cpp:217 +#: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/bada/form.cpp:273 @@ -2961,37 +3018,37 @@ msgstr " msgid "Do you really want to quit?" msgstr " ?" -#: backends/events/gph/gph-events.cpp:338 -#: backends/events/gph/gph-events.cpp:381 +#: backends/events/gph/gph-events.cpp:386 +#: backends/events/gph/gph-events.cpp:429 #: backends/events/openpandora/op-events.cpp:139 msgid "Touchscreen 'Tap Mode' - Left Click" msgstr " - " -#: backends/events/gph/gph-events.cpp:340 -#: backends/events/gph/gph-events.cpp:383 +#: backends/events/gph/gph-events.cpp:388 +#: backends/events/gph/gph-events.cpp:431 #: backends/events/openpandora/op-events.cpp:141 msgid "Touchscreen 'Tap Mode' - Right Click" msgstr " - " -#: backends/events/gph/gph-events.cpp:342 -#: backends/events/gph/gph-events.cpp:385 +#: backends/events/gph/gph-events.cpp:390 +#: backends/events/gph/gph-events.cpp:433 #: backends/events/openpandora/op-events.cpp:143 msgid "Touchscreen 'Tap Mode' - Hover (No Click)" msgstr " - ( )" -#: backends/events/gph/gph-events.cpp:362 +#: backends/events/gph/gph-events.cpp:410 msgid "Maximum Volume" msgstr " " -#: backends/events/gph/gph-events.cpp:364 +#: backends/events/gph/gph-events.cpp:412 msgid "Increasing Volume" msgstr " " -#: backends/events/gph/gph-events.cpp:370 +#: backends/events/gph/gph-events.cpp:418 msgid "Minimal Volume" msgstr " " -#: backends/events/gph/gph-events.cpp:372 +#: backends/events/gph/gph-events.cpp:420 msgid "Decreasing Volume" msgstr " " -- cgit v1.2.3 From c6e938fab9faecea5b6a03f32d9d18eb7c088359 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 12 Aug 2012 15:00:36 +0200 Subject: NEWS: Mention new save/load chooser. --- NEWS | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 3f5f10ce05..97667b5b13 100644 --- a/NEWS +++ b/NEWS @@ -2,7 +2,11 @@ For a more comprehensive changelog of the latest experimental code, see: https://github.com/scummvm/scummvm/commits/ 1.6.0 (????-??-??) - + General: + - Added a new save/load chooser based on a grid of thumbnails. This is only + supported for resolutions bigger than 640x400. The old chooser is still + available and used for games without thumbnail support. It is possible to + select the old one as default too. 1.5.0 (2012-07-27) New Games: -- cgit v1.2.3 From 9ba145419faa46b85baf5982f0c62ab76268b0af Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 12 Aug 2012 15:16:27 +0200 Subject: GUI: Mark parts of the grid based chooser layout code as HACK. --- gui/saveload-dialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index 8e214bce90..d1a66dc28a 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -620,6 +620,8 @@ void SaveLoadChooserGrid::open() { } void SaveLoadChooserGrid::reflowLayout() { + // HACK: The page display is not available in low resolution layout. We + // remove and readd the widget here to avoid our GUI from erroring out. removeWidget(_pageDisplay); if (g_gui.xmlEval()->getVar("Globals.ShowChooserPageDisplay") == 1) { _pageDisplay->init(); @@ -628,6 +630,8 @@ void SaveLoadChooserGrid::reflowLayout() { SaveLoadChooserDialog::reflowLayout(); destroyButtons(); + // HACK: The whole code below really works around the fact, that we have + // no easy way to dynamically layout widgets. const uint16 availableWidth = getWidth() - 20; uint16 availableHeight; -- cgit v1.2.3 From da790e112ca1a1de5730713cad1871917d52c781 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 12 Aug 2012 15:18:09 +0200 Subject: GUI: Create the builtin theme from scummclassic again. The old builtin one actually was based on a unpublished version, which failed with the current code. Oops. --- gui/themes/default.inc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gui/themes/default.inc b/gui/themes/default.inc index bfd78db3ae..7f565eb05d 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1399,7 +1399,6 @@ " " -" " " " @@ -2379,7 +2378,7 @@ " " -" " +" " " " -- cgit v1.2.3 From fee19db7eedb16d7e7d62429f6c0eb4770bc07c3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 12 Aug 2012 19:38:57 +0200 Subject: GUI: Make normal disabled color of the modern theme darker. This should fix bug #3395057 "GUI: Font-Background Color Contrast Problem in Modern Theme". At the very least it will improve the contrast. --- gui/themes/scummclassic.zip | Bin 95181 -> 95180 bytes gui/themes/scummmodern.zip | Bin 1453476 -> 1453485 bytes gui/themes/scummmodern/scummmodern_gfx.stx | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 468f4b1594..62eae0cd43 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 34a1db9c06..38352bcc2f 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/scummmodern_gfx.stx b/gui/themes/scummmodern/scummmodern_gfx.stx index 4703683bc3..4d449f50ec 100644 --- a/gui/themes/scummmodern/scummmodern_gfx.stx +++ b/gui/themes/scummmodern/scummmodern_gfx.stx @@ -155,7 +155,7 @@ /> ::iterator it; - for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it) - { - if(&(*it) == overlayPtr) - { + for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it) { + if (&(*it) == overlayPtr) { break; } } - while(it != g_cine->_overlayList.end()) - { - overlay* pCurrentOverlay = &(*it); - if((pCurrentOverlay->type==5) || ((pCurrentOverlay->type==21) && (pCurrentOverlay->x==overlayPtr->objIdx))) - { - AnimData* sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame]; + while (it != g_cine->_overlayList.end()) { + overlay *pCurrentOverlay = &(*it); + if ((pCurrentOverlay->type == 5) || ((pCurrentOverlay->type == 21) && (pCurrentOverlay->x == overlayPtr->objIdx))) { + AnimData *sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame]; - if(pMask == NULL) - { - pMask = new byte[width*height]; + if (pMask == NULL) { + pMask = new byte[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { - byte spriteColor= spritePtr[width*i+j]; - pMask[width*i+j] = spriteColor; + byte spriteColor = spritePtr[width * i + j]; + pMask[width * i + j] = spriteColor; } } } for (int i = 0; i < sprite->_realWidth; i++) { for (int j = 0; j < sprite->_height; j++) { - int inMaskX = (g_cine->_objectTable[it->objIdx].x+i) - x; - int inMaskY = (g_cine->_objectTable[it->objIdx].y+j) - y; - - if(inMaskX >=0 && inMaskX < width) - { - if(inMaskY >=0 && inMaskY < height) - { - if(sprite->_bpp == 1) - { - if(!sprite->getColor(i, j)) - { - pMask[inMaskY*width+inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320]; + int inMaskX = (g_cine->_objectTable[it->objIdx].x + i) - x; + int inMaskY = (g_cine->_objectTable[it->objIdx].y + j) - y; + + if (inMaskX >= 0 && inMaskX < width) { + if (inMaskY >= 0 && inMaskY < height) { + if (sprite->_bpp == 1) { + if (!sprite->getColor(i, j)) { + pMask[inMaskY * width + inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320]; } } } @@ -1797,8 +1787,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi } // now, draw with the mask we created - if(pMask) - { + if (pMask) { spritePtr = pMask; } { @@ -1807,7 +1796,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi destPtr += i * 320; for (int j = 0; j < width; j++) { - byte color= *(spritePtr++); + byte color = *(spritePtr++); if ((transparentColor != color) && x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200) { *(destPtr++) = color; } else { -- cgit v1.2.3 From c839fd50b5ddfcceada8cbbd3046ce219df248a0 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 12 Aug 2012 17:44:23 -0400 Subject: GRAPHICS: Clarify format of the palette in ImageDecoder --- graphics/decoders/image_decoder.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/graphics/decoders/image_decoder.h b/graphics/decoders/image_decoder.h index 7fa00749ff..830645d361 100644 --- a/graphics/decoders/image_decoder.h +++ b/graphics/decoders/image_decoder.h @@ -75,6 +75,9 @@ public: * until destroy() or loadStream() is called, or until this ImageDecoder's * destructor is called. * + * The palette's format is the same as PaletteManager's palette + * (interleaved RGB values). + * * @return the decoded palette, or 0 if no palette is present */ virtual const byte *getPalette() const { return 0; } -- cgit v1.2.3 From 8982026661c5f64f67cb8565946d25f620dfb73c Mon Sep 17 00:00:00 2001 From: Einar Johan Trøan Sømåen Date: Mon, 13 Aug 2012 00:30:02 +0200 Subject: GRAPHICS: Add support for 32bpp BMPs --- graphics/decoders/bmp.cpp | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/graphics/decoders/bmp.cpp b/graphics/decoders/bmp.cpp index 5f764e1bd3..f15d4e2519 100644 --- a/graphics/decoders/bmp.cpp +++ b/graphics/decoders/bmp.cpp @@ -82,7 +82,7 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) { /* uint16 planes = */ stream.readUint16LE(); uint16 bitsPerPixel = stream.readUint16LE(); - if (bitsPerPixel != 8 && bitsPerPixel != 24) { + if (bitsPerPixel != 8 && bitsPerPixel != 24 && bitsPerPixel != 32) { warning("%dbpp bitmaps not supported", bitsPerPixel); return false; } @@ -119,8 +119,8 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) { Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8(); - // BGRA for 24bpp - if (bitsPerPixel == 24) + // BGRA for 24bpp and 32 bpp + if (bitsPerPixel == 24 || bitsPerPixel == 32) format = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0); _surface = new Graphics::Surface(); @@ -136,7 +136,7 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) { stream.read(dst + (height - i - 1) * width, width); stream.skip(extraDataLength); } - } else { + } else if (bitsPerPixel == 24) { byte *dst = (byte *)_surface->pixels + (height - 1) * _surface->pitch; for (int32 i = 0; i < height; i++) { @@ -150,6 +150,27 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) { dst += format.bytesPerPixel; } + stream.skip(extraDataLength); + dst -= _surface->pitch * 2; + } + } else { // 32 bpp + byte *dst = (byte *)_surface->pixels + (height - 1) * _surface->pitch; + + for (int32 i = 0; i < height; i++) { + for (uint32 j = 0; j < width; j++) { + byte b = stream.readByte(); + byte g = stream.readByte(); + byte r = stream.readByte(); + // Ignore the last byte, as in v3 it is unused + // and should thus NOT be used as alpha. + // ref: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx + stream.readByte(); + uint32 color = format.RGBToColor(r, g, b); + + *((uint32 *)dst) = color; + dst += format.bytesPerPixel; + } + stream.skip(extraDataLength); dst -= _surface->pitch * 2; } -- cgit v1.2.3 From 92432a136bff7c327b5328cc10a84198f571b0d0 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 13 Aug 2012 16:23:47 -0400 Subject: VIDEO: Convert TheoraDecoder to the new AdvancedVideoDecoder API --- engines/sword25/fmv/movieplayer.cpp | 1 + video/theora_decoder.cpp | 610 ++++++++++++++++-------------------- video/theora_decoder.h | 129 ++++---- 3 files changed, 339 insertions(+), 401 deletions(-) diff --git a/engines/sword25/fmv/movieplayer.cpp b/engines/sword25/fmv/movieplayer.cpp index 9ee13b4b6d..a95532ec65 100644 --- a/engines/sword25/fmv/movieplayer.cpp +++ b/engines/sword25/fmv/movieplayer.cpp @@ -61,6 +61,7 @@ bool MoviePlayer::loadMovie(const Common::String &filename, uint z) { // Get the file and load it into the decoder Common::SeekableReadStream *in = Kernel::getInstance()->getPackage()->getStream(filename); _decoder.loadStream(in); + _decoder.start(); GraphicEngine *pGfx = Kernel::getInstance()->getGfx(); diff --git a/video/theora_decoder.cpp b/video/theora_decoder.cpp index f3d9cad096..76007eadff 100644 --- a/video/theora_decoder.cpp +++ b/video/theora_decoder.cpp @@ -36,72 +36,32 @@ #include "video/theora_decoder.h" -#include "common/debug.h" +#include "audio/audiostream.h" +#include "audio/decoders/raw.h" #include "common/stream.h" #include "common/system.h" #include "common/textconsole.h" #include "common/util.h" +#include "graphics/pixelformat.h" #include "graphics/yuv_to_rgb.h" -#include "audio/decoders/raw.h" namespace Video { -#define AUDIOFD_FRAGSIZE 10240 - -static double rint(double v) { - return floor(v + 0.5); -} - -TheoraDecoder::TheoraDecoder(Audio::Mixer::SoundType soundType) { +TheoraDecoder::TheoraDecoder(Audio::Mixer::SoundType soundType) : _soundType(soundType) { _fileStream = 0; - _theoraPacket = 0; - _vorbisPacket = 0; - _theoraDecode = 0; - _theoraSetup = 0; - _nextFrameStartTime = 0.0; - - _soundType = soundType; - _audStream = 0; - _audHandle = new Audio::SoundHandle(); - - ogg_sync_init(&_oggSync); - - _curFrame = -1; - _audiobuf = (ogg_int16_t *)malloc(AUDIOFD_FRAGSIZE * sizeof(ogg_int16_t)); - - reset(); + _videoTrack = 0; + _audioTrack = 0; + _hasVideo = _hasAudio = false; } TheoraDecoder::~TheoraDecoder() { close(); - delete _fileStream; - delete _audHandle; - free(_audiobuf); -} - -void TheoraDecoder::queuePage(ogg_page *page) { - if (_theoraPacket) - ogg_stream_pagein(&_theoraOut, page); - - if (_vorbisPacket) - ogg_stream_pagein(&_vorbisOut, page); -} - -int TheoraDecoder::bufferData() { - char *buffer = ogg_sync_buffer(&_oggSync, 4096); - int bytes = _fileStream->read(buffer, 4096); - - ogg_sync_wrote(&_oggSync, bytes); - - return bytes; } bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { close(); - _endOfAudio = false; - _endOfVideo = false; _fileStream = stream; // start up Ogg stream synchronization layer @@ -109,11 +69,17 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { // init supporting Vorbis structures needed in header parsing vorbis_info_init(&_vorbisInfo); - vorbis_comment_init(&_vorbisComment); + vorbis_comment vorbisComment; + vorbis_comment_init(&vorbisComment); // init supporting Theora structures needed in header parsing - th_comment_init(&_theoraComment); - th_info_init(&_theoraInfo); + th_info theoraInfo; + th_info_init(&theoraInfo); + th_comment theoraComment; + th_comment_init(&theoraComment); + th_setup_info *theoraSetup = 0; + + uint theoraPackets = 0, vorbisPackets = 0; // Ogg file open; parse the headers // Only interested in Vorbis/Theora streams @@ -122,7 +88,7 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { int ret = bufferData(); if (ret == 0) - break; + break; // FIXME: Shouldn't this error out? while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) { ogg_stream_state test; @@ -140,14 +106,16 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { ogg_stream_packetout(&test, &_oggPacket); // identify the codec: try theora - if (!_theoraPacket && th_decode_headerin(&_theoraInfo, &_theoraComment, &_theoraSetup, &_oggPacket) >= 0) { + if (theoraPackets == 0 && th_decode_headerin(&theoraInfo, &theoraComment, &theoraSetup, &_oggPacket) >= 0) { // it is theora memcpy(&_theoraOut, &test, sizeof(test)); - _theoraPacket = 1; - } else if (!_vorbisPacket && vorbis_synthesis_headerin(&_vorbisInfo, &_vorbisComment, &_oggPacket) >= 0) { + theoraPackets = 1; + _hasVideo = true; + } else if (vorbisPackets == 0 && vorbis_synthesis_headerin(&_vorbisInfo, &vorbisComment, &_oggPacket) >= 0) { // it is vorbis memcpy(&_vorbisOut, &test, sizeof(test)); - _vorbisPacket = 1; + vorbisPackets = 1; + _hasAudio = true; } else { // whatever it is, we don't care about it ogg_stream_clear(&test); @@ -157,31 +125,31 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { } // we're expecting more header packets. - while ((_theoraPacket && _theoraPacket < 3) || (_vorbisPacket && _vorbisPacket < 3)) { + while ((theoraPackets && theoraPackets < 3) || (vorbisPackets && vorbisPackets < 3)) { int ret; // look for further theora headers - while (_theoraPacket && (_theoraPacket < 3) && (ret = ogg_stream_packetout(&_theoraOut, &_oggPacket))) { + while (theoraPackets && (theoraPackets < 3) && (ret = ogg_stream_packetout(&_theoraOut, &_oggPacket))) { if (ret < 0) error("Error parsing Theora stream headers; corrupt stream?"); - if (!th_decode_headerin(&_theoraInfo, &_theoraComment, &_theoraSetup, &_oggPacket)) + if (!th_decode_headerin(&theoraInfo, &theoraComment, &theoraSetup, &_oggPacket)) error("Error parsing Theora stream headers; corrupt stream?"); - _theoraPacket++; + theoraPackets++; } // look for more vorbis header packets - while (_vorbisPacket && (_vorbisPacket < 3) && (ret = ogg_stream_packetout(&_vorbisOut, &_oggPacket))) { + while (vorbisPackets && (vorbisPackets < 3) && (ret = ogg_stream_packetout(&_vorbisOut, &_oggPacket))) { if (ret < 0) error("Error parsing Vorbis stream headers; corrupt stream?"); - if (vorbis_synthesis_headerin(&_vorbisInfo, &_vorbisComment, &_oggPacket)) + if (vorbis_synthesis_headerin(&_vorbisInfo, &vorbisComment, &_oggPacket)) error("Error parsing Vorbis stream headers; corrupt stream?"); - _vorbisPacket++; + vorbisPackets++; - if (_vorbisPacket == 3) + if (vorbisPackets == 3) break; } @@ -198,88 +166,21 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { } } - // and now we have it all. initialize decoders - if (_theoraPacket) { - _theoraDecode = th_decode_alloc(&_theoraInfo, _theoraSetup); - debugN(1, "Ogg logical stream %lx is Theora %dx%d %.02f fps", - _theoraOut.serialno, _theoraInfo.pic_width, _theoraInfo.pic_height, - (double)_theoraInfo.fps_numerator / _theoraInfo.fps_denominator); - - switch (_theoraInfo.pixel_fmt) { - case TH_PF_420: - debug(1, " 4:2:0 video"); - break; - case TH_PF_422: - debug(1, " 4:2:2 video"); - break; - case TH_PF_444: - debug(1, " 4:4:4 video"); - break; - case TH_PF_RSVD: - default: - debug(1, " video\n (UNKNOWN Chroma sampling!)"); - break; - } - - if (_theoraInfo.pic_width != _theoraInfo.frame_width || _theoraInfo.pic_height != _theoraInfo.frame_height) - debug(1, " Frame content is %dx%d with offset (%d,%d).", - _theoraInfo.frame_width, _theoraInfo.frame_height, _theoraInfo.pic_x, _theoraInfo.pic_y); - - switch (_theoraInfo.colorspace){ - case TH_CS_UNSPECIFIED: - /* nothing to report */ - break; - case TH_CS_ITU_REC_470M: - debug(1, " encoder specified ITU Rec 470M (NTSC) color."); - break; - case TH_CS_ITU_REC_470BG: - debug(1, " encoder specified ITU Rec 470BG (PAL) color."); - break; - default: - debug(1, "warning: encoder specified unknown colorspace (%d).", _theoraInfo.colorspace); - break; - } - - debug(1, "Encoded by %s", _theoraComment.vendor); - if (_theoraComment.comments) { - debug(1, "theora comment header:"); - for (int i = 0; i < _theoraComment.comments; i++) { - if (_theoraComment.user_comments[i]) { - int len = _theoraComment.comment_lengths[i]; - char *value = (char *)malloc(len + 1); - if (value) { - memcpy(value, _theoraComment.user_comments[i], len); - value[len] = '\0'; - debug(1, "\t%s", value); - free(value); - } - } - } - } - - th_decode_ctl(_theoraDecode, TH_DECCTL_GET_PPLEVEL_MAX, &_ppLevelMax, sizeof(_ppLevelMax)); - _ppLevel = _ppLevelMax; - th_decode_ctl(_theoraDecode, TH_DECCTL_SET_PPLEVEL, &_ppLevel, sizeof(_ppLevel)); - _ppInc = 0; - } else { - // tear down the partial theora setup - th_info_clear(&_theoraInfo); - th_comment_clear(&_theoraComment); + // And now we have it all. Initialize decoders next + if (_hasVideo) { + _videoTrack = new TheoraVideoTrack(getDefaultHighColorFormat(), theoraInfo, theoraSetup); + addTrack(_videoTrack); } - th_setup_free(_theoraSetup); - _theoraSetup = 0; - - if (_vorbisPacket) { - vorbis_synthesis_init(&_vorbisDSP, &_vorbisInfo); - vorbis_block_init(&_vorbisDSP, &_vorbisBlock); - debug(3, "Ogg logical stream %lx is Vorbis %d channel %ld Hz audio.", - _vorbisOut.serialno, _vorbisInfo.channels, _vorbisInfo.rate); + th_info_clear(&theoraInfo); + th_comment_clear(&theoraComment); + th_setup_free(theoraSetup); - _audStream = Audio::makeQueuingAudioStream(_vorbisInfo.rate, _vorbisInfo.channels); + if (_hasAudio) { + _audioTrack = new VorbisAudioTrack(_soundType, _vorbisInfo); // Get enough audio data to start us off - while (_audStream->numQueuedStreams() == 0) { + while (!_audioTrack->hasAudio()) { // Queue more data bufferData(); while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) @@ -288,276 +189,299 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { queueAudio(); } - if (_audStream) - g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, _audHandle, _audStream, -1, getVolume(), getBalance()); - } else { - // tear down the partial vorbis setup - vorbis_info_clear(&_vorbisInfo); - vorbis_comment_clear(&_vorbisComment); - _endOfAudio = true; + addTrack(_audioTrack); } - _surface.create(_theoraInfo.frame_width, _theoraInfo.frame_height, g_system->getScreenFormat()); - - // Set up a display surface - _displaySurface.pixels = _surface.getBasePtr(_theoraInfo.pic_x, _theoraInfo.pic_y); - _displaySurface.w = _theoraInfo.pic_width; - _displaySurface.h = _theoraInfo.pic_height; - _displaySurface.format = _surface.format; - _displaySurface.pitch = _surface.pitch; - - // Set the frame rate - _frameRate = Common::Rational(_theoraInfo.fps_numerator, _theoraInfo.fps_denominator); + vorbis_comment_clear(&vorbisComment); return true; } void TheoraDecoder::close() { - if (_vorbisPacket) { - ogg_stream_clear(&_vorbisOut); - vorbis_block_clear(&_vorbisBlock); - vorbis_dsp_clear(&_vorbisDSP); - vorbis_comment_clear(&_vorbisComment); - vorbis_info_clear(&_vorbisInfo); + AdvancedVideoDecoder::close(); - g_system->getMixer()->stopHandle(*_audHandle); + if (!_fileStream) + return; - _audStream = 0; - _vorbisPacket = false; - } - if (_theoraPacket) { + if (_videoTrack) { ogg_stream_clear(&_theoraOut); - th_decode_free(_theoraDecode); - th_comment_clear(&_theoraComment); - th_info_clear(&_theoraInfo); - _theoraDecode = 0; - _theoraPacket = false; + _videoTrack = 0; } - if (!_fileStream) - return; + if (_audioTrack) { + ogg_stream_clear(&_vorbisOut); + _audioTrack = 0; + } ogg_sync_clear(&_oggSync); + vorbis_info_clear(&_vorbisInfo); delete _fileStream; _fileStream = 0; - _surface.free(); - _displaySurface.pixels = 0; - _displaySurface.free(); - - reset(); + _hasVideo = _hasAudio = false; } -const Graphics::Surface *TheoraDecoder::decodeNextFrame() { +void TheoraDecoder::readNextPacket() { // First, let's get our frame - while (_theoraPacket) { - // theora is one in, one out... - if (ogg_stream_packetout(&_theoraOut, &_oggPacket) > 0) { - - if (_ppInc) { - _ppLevel += _ppInc; - th_decode_ctl(_theoraDecode, TH_DECCTL_SET_PPLEVEL, &_ppLevel, sizeof(_ppLevel)); - _ppInc = 0; + if (_hasVideo) { + while (!_videoTrack->endOfTrack()) { + // theora is one in, one out... + if (ogg_stream_packetout(&_theoraOut, &_oggPacket) > 0) { + if (_videoTrack->decodePacket(_oggPacket)) + break; + } else if (_theoraOut.e_o_s || _fileStream->eos()) { + // If we can't get any more frames, we're done. + _videoTrack->setEndOfVideo(); + } else { + // Queue more data + bufferData(); + while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) + queuePage(&_oggPage); } - if (th_decode_packetin(_theoraDecode, &_oggPacket, NULL) == 0) { - _curFrame++; + // Update audio if we can + queueAudio(); + } + } - // Convert YUV data to RGB data - th_ycbcr_buffer yuv; - th_decode_ycbcr_out(_theoraDecode, yuv); - translateYUVtoRGBA(yuv); + // Then make sure we have enough audio buffered + ensureAudioBufferSize(); +} - if (_curFrame == 0) - _startTime = g_system->getMillis(); +TheoraDecoder::TheoraVideoTrack::TheoraVideoTrack(const Graphics::PixelFormat &format, th_info &theoraInfo, th_setup_info *theoraSetup) { + _theoraDecode = th_decode_alloc(&theoraInfo, theoraSetup); - double time = th_granule_time(_theoraDecode, _oggPacket.granulepos); + if (theoraInfo.pixel_fmt != TH_PF_420) + error("Only theora YUV420 is supported"); - // We need to calculate when the next frame should be shown - // This is all in floating point because that's what the Ogg code gives us - // Ogg is a lossy container format, so it doesn't always list the time to the - // next frame. In such cases, we need to calculate it ourselves. - if (time == -1.0) - _nextFrameStartTime += _frameRate.getInverse().toDouble(); - else - _nextFrameStartTime = time; + int postProcessingMax; + th_decode_ctl(_theoraDecode, TH_DECCTL_GET_PPLEVEL_MAX, &postProcessingMax, sizeof(postProcessingMax)); + th_decode_ctl(_theoraDecode, TH_DECCTL_SET_PPLEVEL, &postProcessingMax, sizeof(postProcessingMax)); - // break out - break; - } - } else { - // If we can't get any more frames, we're done. - if (_theoraOut.e_o_s || _fileStream->eos()) { - _endOfVideo = true; - break; - } + _surface.create(theoraInfo.frame_width, theoraInfo.frame_height, format); - // Queue more data - bufferData(); - while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) - queuePage(&_oggPage); - } + // Set up a display surface + _displaySurface.pixels = _surface.getBasePtr(theoraInfo.pic_x, theoraInfo.pic_y); + _displaySurface.w = theoraInfo.pic_width; + _displaySurface.h = theoraInfo.pic_height; + _displaySurface.format = format; + _displaySurface.pitch = _surface.pitch; - // Update audio if we can - queueAudio(); - } + // Set the frame rate + _frameRate = Common::Rational(theoraInfo.fps_numerator, theoraInfo.fps_denominator); - // Force at least some audio to be buffered - // TODO: 5 is very arbitrary. We probably should do something like QuickTime does. - while (!_endOfAudio && _audStream->numQueuedStreams() < 5) { - bufferData(); - while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) - queuePage(&_oggPage); + _endOfVideo = false; + _nextFrameStartTime = 0.0; + _curFrame = -1; +} - bool queuedAudio = queueAudio(); - if ((_vorbisOut.e_o_s || _fileStream->eos()) && !queuedAudio) { - _endOfAudio = true; - break; - } - } +TheoraDecoder::TheoraVideoTrack::~TheoraVideoTrack() { + th_decode_free(_theoraDecode); - return &_displaySurface; + _surface.free(); + _displaySurface.pixels = 0; } -bool TheoraDecoder::queueAudio() { - if (!_audStream) - return false; - - // An audio buffer should have been allocated (either in the constructor or after queuing the current buffer) - if (!_audiobuf) { - warning("[TheoraDecoder::queueAudio] Invalid audio buffer"); - return false; +bool TheoraDecoder::TheoraVideoTrack::decodePacket(ogg_packet &oggPacket) { + if (th_decode_packetin(_theoraDecode, &oggPacket, 0) == 0) { + _curFrame++; + + // Convert YUV data to RGB data + th_ycbcr_buffer yuv; + th_decode_ycbcr_out(_theoraDecode, yuv); + translateYUVtoRGBA(yuv); + + double time = th_granule_time(_theoraDecode, oggPacket.granulepos); + + // We need to calculate when the next frame should be shown + // This is all in floating point because that's what the Ogg code gives us + // Ogg is a lossy container format, so it doesn't always list the time to the + // next frame. In such cases, we need to calculate it ourselves. + if (time == -1.0) + _nextFrameStartTime += _frameRate.getInverse().toDouble(); + else + _nextFrameStartTime = time; + + return true; } - bool queuedAudio = false; + return false; +} - for (;;) { - float **pcm; - - // if there's pending, decoded audio, grab it - int ret = vorbis_synthesis_pcmout(&_vorbisDSP, &pcm); - if (ret > 0) { - int count = _audiobufFill / 2; - int maxsamples = ((AUDIOFD_FRAGSIZE - _audiobufFill) / _vorbisInfo.channels) >> 1; - int i; - for (i = 0; i < ret && i < maxsamples; i++) - for (int j = 0; j < _vorbisInfo.channels; j++) { - int val = CLIP((int)rint(pcm[j][i] * 32767.f), -32768, 32767); - _audiobuf[count++] = val; - } - - vorbis_synthesis_read(&_vorbisDSP, i); - _audiobufFill += (i * _vorbisInfo.channels) << 1; - - if (_audiobufFill == AUDIOFD_FRAGSIZE) { - byte flags = Audio::FLAG_16BITS | Audio::FLAG_STEREO; -#ifdef SCUMM_LITTLE_ENDIAN - flags |= Audio::FLAG_LITTLE_ENDIAN; -#endif - _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::NO, flags); - - // The audio mixer is now responsible for the old audio buffer. - // We need to create a new one. - _audiobuf = (ogg_int16_t *)malloc(AUDIOFD_FRAGSIZE * sizeof(ogg_int16_t)); - if (!_audiobuf) { - warning("[TheoraDecoder::queueAudio] Cannot allocate memory for audio buffer"); - return false; - } - - _audiobufFill = 0; - queuedAudio = true; - } - } else { - // no pending audio; is there a pending packet to decode? - if (ogg_stream_packetout(&_vorbisOut, &_oggPacket) > 0) { - if (vorbis_synthesis(&_vorbisBlock, &_oggPacket) == 0) // test for success! - vorbis_synthesis_blockin(&_vorbisDSP, &_vorbisBlock); - } else // we've buffered all we have, break out for now - return queuedAudio; - } - } +enum TheoraYUVBuffers { + kBufferY = 0, + kBufferU = 1, + kBufferV = 2 +}; - // Unreachable - return false; +void TheoraDecoder::TheoraVideoTrack::translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer) { + // Width and height of all buffers have to be divisible by 2. + assert((YUVBuffer[kBufferY].width & 1) == 0); + assert((YUVBuffer[kBufferY].height & 1) == 0); + assert((YUVBuffer[kBufferU].width & 1) == 0); + assert((YUVBuffer[kBufferV].width & 1) == 0); + + // UV images have to have a quarter of the Y image resolution + assert(YUVBuffer[kBufferU].width == YUVBuffer[kBufferY].width >> 1); + assert(YUVBuffer[kBufferV].width == YUVBuffer[kBufferY].width >> 1); + assert(YUVBuffer[kBufferU].height == YUVBuffer[kBufferY].height >> 1); + assert(YUVBuffer[kBufferV].height == YUVBuffer[kBufferY].height >> 1); + + Graphics::convertYUV420ToRGB(&_surface, YUVBuffer[kBufferY].data, YUVBuffer[kBufferU].data, YUVBuffer[kBufferV].data, YUVBuffer[kBufferY].width, YUVBuffer[kBufferY].height, YUVBuffer[kBufferY].stride, YUVBuffer[kBufferU].stride); } -void TheoraDecoder::reset() { - VideoDecoder::reset(); +static vorbis_info *info = 0; - // FIXME: This does a rewind() instead of a reset()! +TheoraDecoder::VorbisAudioTrack::VorbisAudioTrack(Audio::Mixer::SoundType soundType, vorbis_info &vorbisInfo) : _soundType(soundType) { + vorbis_synthesis_init(&_vorbisDSP, &vorbisInfo); + vorbis_block_init(&_vorbisDSP, &_vorbisBlock); + info = &vorbisInfo; - if (_fileStream) - _fileStream->seek(0); + _audStream = Audio::makeQueuingAudioStream(vorbisInfo.rate, vorbisInfo.channels); - _audiobufFill = 0; - _audiobufReady = false; + _audioBufferFill = 0; + _audioBuffer = 0; + _endOfAudio = false; +} - _curFrame = -1; +TheoraDecoder::VorbisAudioTrack::~VorbisAudioTrack() { + vorbis_dsp_clear(&_vorbisDSP); + vorbis_block_clear(&_vorbisBlock); + delete _audStream; + free(_audioBuffer); +} - _theoraPacket = 0; - _vorbisPacket = 0; +Audio::AudioStream *TheoraDecoder::VorbisAudioTrack::getAudioStream() const { + return _audStream; } -bool TheoraDecoder::endOfVideo() const { - return !isVideoLoaded() || (_endOfVideo && (!_audStream || (_audStream->endOfData() && _endOfAudio))); +#define AUDIOFD_FRAGSIZE 10240 + +static double rint(double v) { + return floor(v + 0.5); } -uint32 TheoraDecoder::getTimeToNextFrame() const { - if (endOfVideo() || _curFrame < 0) - return 0; +bool TheoraDecoder::VorbisAudioTrack::decodeSamples() { + float **pcm; - uint32 elapsedTime = getTime(); - uint32 nextFrameStartTime = (uint32)(_nextFrameStartTime * 1000); + // if there's pending, decoded audio, grab it + int ret = vorbis_synthesis_pcmout(&_vorbisDSP, &pcm); - if (nextFrameStartTime <= elapsedTime) - return 0; + if (ret > 0) { + if (!_audioBuffer) { + _audioBuffer = (ogg_int16_t *)malloc(AUDIOFD_FRAGSIZE * sizeof(ogg_int16_t)); + assert(_audioBuffer); + } - return nextFrameStartTime - elapsedTime; + int channels = _audStream->isStereo() ? 2 : 1; + int count = _audioBufferFill / 2; + int maxsamples = ((AUDIOFD_FRAGSIZE - _audioBufferFill) / channels) >> 1; + int i; + + for (i = 0; i < ret && i < maxsamples; i++) { + for (int j = 0; j < channels; j++) { + int val = CLIP((int)rint(pcm[j][i] * 32767.f), -32768, 32767); + _audioBuffer[count++] = val; + } + } + + vorbis_synthesis_read(&_vorbisDSP, i); + _audioBufferFill += (i * channels) << 1; + + if (_audioBufferFill == AUDIOFD_FRAGSIZE) { + byte flags = Audio::FLAG_16BITS; + + if (_audStream->isStereo()) + flags |= Audio::FLAG_STEREO; + +#ifdef SCUMM_LITTLE_ENDIAN + flags |= Audio::FLAG_LITTLE_ENDIAN; +#endif + + _audStream->queueBuffer((byte *)_audioBuffer, AUDIOFD_FRAGSIZE, DisposeAfterUse::YES, flags); + + // The audio mixer is now responsible for the old audio buffer. + // We need to create a new one. + _audioBuffer = 0; + _audioBufferFill = 0; + } + + return true; + } + + return false; } -uint32 TheoraDecoder::getTime() const { - if (_audStream) - return g_system->getMixer()->getSoundElapsedTime(*_audHandle); +bool TheoraDecoder::VorbisAudioTrack::hasAudio() const { + return _audStream->numQueuedStreams() > 0; +} - return VideoDecoder::getTime(); +bool TheoraDecoder::VorbisAudioTrack::needsAudio() const { + // TODO: 5 is very arbitrary. We probably should do something like QuickTime does. + return !_endOfAudio && _audStream->numQueuedStreams() < 5; } -void TheoraDecoder::pauseVideoIntern(bool pause) { - if (_audStream) - g_system->getMixer()->pauseHandle(*_audHandle, pause); +void TheoraDecoder::VorbisAudioTrack::synthesizePacket(ogg_packet &oggPacket) { + if (vorbis_synthesis(&_vorbisBlock, &oggPacket) == 0) // test for success + vorbis_synthesis_blockin(&_vorbisDSP, &_vorbisBlock); } -enum TheoraYUVBuffers { - kBufferY = 0, - kBufferU = 1, - kBufferV = 2 -}; +void TheoraDecoder::queuePage(ogg_page *page) { + if (_hasVideo) + ogg_stream_pagein(&_theoraOut, page); -void TheoraDecoder::translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer) { - // Width and height of all buffers have to be divisible by 2. - assert((YUVBuffer[kBufferY].width & 1) == 0); - assert((YUVBuffer[kBufferY].height & 1) == 0); - assert((YUVBuffer[kBufferU].width & 1) == 0); - assert((YUVBuffer[kBufferV].width & 1) == 0); + if (_hasAudio) + ogg_stream_pagein(&_vorbisOut, page); +} - // UV images have to have a quarter of the Y image resolution - assert(YUVBuffer[kBufferU].width == YUVBuffer[kBufferY].width >> 1); - assert(YUVBuffer[kBufferV].width == YUVBuffer[kBufferY].width >> 1); - assert(YUVBuffer[kBufferU].height == YUVBuffer[kBufferY].height >> 1); - assert(YUVBuffer[kBufferV].height == YUVBuffer[kBufferY].height >> 1); +int TheoraDecoder::bufferData() { + char *buffer = ogg_sync_buffer(&_oggSync, 4096); + int bytes = _fileStream->read(buffer, 4096); - Graphics::convertYUV420ToRGB(&_surface, YUVBuffer[kBufferY].data, YUVBuffer[kBufferU].data, YUVBuffer[kBufferV].data, YUVBuffer[kBufferY].width, YUVBuffer[kBufferY].height, YUVBuffer[kBufferY].stride, YUVBuffer[kBufferU].stride); + ogg_sync_wrote(&_oggSync, bytes); + + return bytes; } -void TheoraDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(*_audHandle)) - g_system->getMixer()->setChannelVolume(*_audHandle, getVolume()); +bool TheoraDecoder::queueAudio() { + if (!_hasAudio) + return false; + + bool queuedAudio = false; + + for (;;) { + if (_audioTrack->decodeSamples()) { + // we queued some pending audio + queuedAudio = true; + } else if (ogg_stream_packetout(&_vorbisOut, &_oggPacket) > 0) { + // no pending audio; is there a pending packet to decode? + _audioTrack->synthesizePacket(_oggPacket); + } else { + // we've buffered all we have, break out for now + break; + } + } + + return queuedAudio; } -void TheoraDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(*_audHandle)) - g_system->getMixer()->setChannelBalance(*_audHandle, getBalance()); +void TheoraDecoder::ensureAudioBufferSize() { + if (!_hasAudio) + return; + + // Force at least some audio to be buffered + while (_audioTrack->needsAudio()) { + bufferData(); + while (ogg_sync_pageout(&_oggSync, &_oggPage) > 0) + queuePage(&_oggPage); + + bool queuedAudio = queueAudio(); + if ((_vorbisOut.e_o_s || _fileStream->eos()) && !queuedAudio) { + _audioTrack->setEndOfAudio(); + break; + } + } } } // End of namespace Video diff --git a/video/theora_decoder.h b/video/theora_decoder.h index 459fc064d3..2244f7550d 100644 --- a/video/theora_decoder.h +++ b/video/theora_decoder.h @@ -29,9 +29,7 @@ #include "common/rational.h" #include "video/video_decoder.h" -#include "audio/audiostream.h" #include "audio/mixer.h" -#include "graphics/pixelformat.h" #include "graphics/surface.h" #include @@ -41,6 +39,11 @@ namespace Common { class SeekableReadStream; } +namespace Audio { +class AudioStream; +class QueuingAudioStream; +} + namespace Video { /** @@ -49,7 +52,7 @@ namespace Video { * Video decoder used in engines: * - sword25 */ -class TheoraDecoder : public VideoDecoder { +class TheoraDecoder : public AdvancedVideoDecoder { public: TheoraDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kMusicSoundType); virtual ~TheoraDecoder(); @@ -60,81 +63,91 @@ public: */ bool loadStream(Common::SeekableReadStream *stream); void close(); - void reset(); - /** - * Decode the next frame and return the frame's surface - * @note the return surface should *not* be freed - * @note this may return 0, in which case the last frame should be kept on screen - */ - const Graphics::Surface *decodeNextFrame(); +protected: + void readNextPacket(); - bool isVideoLoaded() const { return _fileStream != 0; } - uint16 getWidth() const { return _displaySurface.w; } - uint16 getHeight() const { return _displaySurface.h; } +private: + class TheoraVideoTrack : public VideoTrack { + public: + TheoraVideoTrack(const Graphics::PixelFormat &format, th_info &theoraInfo, th_setup_info *theoraSetup); + ~TheoraVideoTrack(); - uint32 getFrameCount() const { - // It is not possible to get frame count easily - // I.e. seeking is required - assert(0); - return 0; - } + bool endOfTrack() const { return _endOfVideo; } + uint16 getWidth() const { return _displaySurface.w; } + uint16 getHeight() const { return _displaySurface.h; } + Graphics::PixelFormat getPixelFormat() const { return _displaySurface.format; } + int getCurFrame() const { return _curFrame; } + uint32 getNextFrameStartTime() const { return (uint32)(_nextFrameStartTime * 1000); } + const Graphics::Surface *decodeNextFrame() { return &_displaySurface; } - Graphics::PixelFormat getPixelFormat() const { return _displaySurface.format; } - uint32 getTime() const; - uint32 getTimeToNextFrame() const; + bool decodePacket(ogg_packet &oggPacket); + void setEndOfVideo() { _endOfVideo = true; } - bool endOfVideo() const; + private: + int _curFrame; + bool _endOfVideo; + Common::Rational _frameRate; + double _nextFrameStartTime; -protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); - void pauseVideoIntern(bool pause); + Graphics::Surface _surface; + Graphics::Surface _displaySurface; + + th_dec_ctx *_theoraDecode; + + void translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer); + }; + + class VorbisAudioTrack : public AudioTrack { + public: + VorbisAudioTrack(Audio::Mixer::SoundType soundType, vorbis_info &vorbisInfo); + ~VorbisAudioTrack(); + + Audio::Mixer::SoundType getSoundType() const { return _soundType; } + + bool decodeSamples(); + bool hasAudio() const; + bool needsAudio() const; + void synthesizePacket(ogg_packet &oggPacket); + void setEndOfAudio() { _endOfAudio = true; } + + protected: + Audio::AudioStream *getAudioStream() const; + + private: + // single audio fragment audio buffering + int _audioBufferFill; + ogg_int16_t *_audioBuffer; + + Audio::Mixer::SoundType _soundType; + Audio::QueuingAudioStream *_audStream; + + vorbis_block _vorbisBlock; + vorbis_dsp_state _vorbisDSP; + + bool _endOfAudio; + }; -private: void queuePage(ogg_page *page); - bool queueAudio(); int bufferData(); - void translateYUVtoRGBA(th_ycbcr_buffer &YUVBuffer); + bool queueAudio(); + void ensureAudioBufferSize(); Common::SeekableReadStream *_fileStream; - Graphics::Surface _surface; - Graphics::Surface _displaySurface; - Common::Rational _frameRate; - double _nextFrameStartTime; - bool _endOfVideo; - bool _endOfAudio; Audio::Mixer::SoundType _soundType; - Audio::SoundHandle *_audHandle; - Audio::QueuingAudioStream *_audStream; ogg_sync_state _oggSync; ogg_page _oggPage; ogg_packet _oggPacket; - ogg_stream_state _vorbisOut; - ogg_stream_state _theoraOut; - th_info _theoraInfo; - th_comment _theoraComment; - th_dec_ctx *_theoraDecode; - th_setup_info *_theoraSetup; - vorbis_info _vorbisInfo; - vorbis_dsp_state _vorbisDSP; - vorbis_block _vorbisBlock; - vorbis_comment _vorbisComment; - int _theoraPacket; - int _vorbisPacket; + ogg_stream_state _theoraOut, _vorbisOut; + bool _hasVideo, _hasAudio; - int _ppLevelMax; - int _ppLevel; - int _ppInc; + vorbis_info _vorbisInfo; - // single audio fragment audio buffering - int _audiobufFill; - bool _audiobufReady; - ogg_int16_t *_audiobuf; + TheoraVideoTrack *_videoTrack; + VorbisAudioTrack *_audioTrack; }; } // End of namespace Video -- cgit v1.2.3 From 2fd8bae31994e5581d0ef43da439d01ddd0d1ef5 Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Mon, 13 Aug 2012 20:12:07 -0700 Subject: CINE: Fix restoring of savegame in cave --- engines/cine/anim.cpp | 13 +++++-- engines/cine/anim.h | 2 +- engines/cine/bg_list.cpp | 12 +++---- engines/cine/gfx.cpp | 86 ++++++++++++++++++++++++++++------------------- engines/cine/gfx.h | 9 ++--- engines/cine/saveload.cpp | 16 ++++----- 6 files changed, 80 insertions(+), 58 deletions(-) diff --git a/engines/cine/anim.cpp b/engines/cine/anim.cpp index 410fcca1f3..d81828d9f6 100644 --- a/engines/cine/anim.cpp +++ b/engines/cine/anim.cpp @@ -682,9 +682,10 @@ void convert8BBP2(byte *dest, byte *source, int16 width, int16 height) { * Load image set * @param resourceName Image set filename * @param idx Target index in animDataTable (-1 if any empty space will do) + * @param frameIndex frame of animation to load (-1 for all frames) * @return The number of the animDataTable entry after the loaded image set (-1 if error) */ -int loadSet(const char *resourceName, int16 idx) { +int loadSet(const char *resourceName, int16 idx, int16 frameIndex =-1 ) { AnimHeader2Struct header2; uint16 numSpriteInAnim; int16 foundFileIdx = findFileInBundle(resourceName); @@ -708,6 +709,12 @@ int loadSet(const char *resourceName, int16 idx) { entry = idx < 0 ? emptyAnimSpace() : idx; assert(entry >= 0); + if(frameIndex>=0) + { + numSpriteInAnim = 1; + ptr += 0x10 * frameIndex; + } + for (int16 i = 0; i < numSpriteInAnim; i++, entry++) { Common::MemoryReadStream readS(ptr, 0x10); @@ -767,7 +774,7 @@ int loadSeq(const char *resourceName, int16 idx) { * @return The number of the animDataTable entry after the loaded resource (-1 if error) * @todo Implement loading of all resource types */ -int loadResource(const char *resourceName, int16 idx) { +int loadResource(const char *resourceName, int16 idx, int16 frameIndex) { int result = -1; // Return an error by default if (strstr(resourceName, ".SPL")) { result = loadSpl(resourceName, idx); @@ -778,7 +785,7 @@ int loadResource(const char *resourceName, int16 idx) { } else if (strstr(resourceName, ".ANM")) { result = loadAni(resourceName, idx); } else if (strstr(resourceName, ".SET")) { - result = loadSet(resourceName, idx); + result = loadSet(resourceName, idx, frameIndex); } else if (strstr(resourceName, ".SEQ")) { result = loadSeq(resourceName, idx); } else if (strstr(resourceName, ".H32")) { diff --git a/engines/cine/anim.h b/engines/cine/anim.h index 9c06c260ce..c5130aab82 100644 --- a/engines/cine/anim.h +++ b/engines/cine/anim.h @@ -98,7 +98,7 @@ public: void freeAnimDataTable(); void freeAnimDataRange(byte startIdx, byte numIdx); -int loadResource(const char *resourceName, int16 idx = -1); +int loadResource(const char *resourceName, int16 idx = -1, int16 frameIndex = -1); void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGameFormat saveGameFormat); void generateMask(const byte *sprite, byte *mask, uint16 size, byte transparency); diff --git a/engines/cine/bg_list.cpp b/engines/cine/bg_list.cpp index 693fea3294..36ecf53dea 100644 --- a/engines/cine/bg_list.cpp +++ b/engines/cine/bg_list.cpp @@ -39,9 +39,9 @@ uint32 var8; * @param objIdx Sprite description */ void addToBGList(int16 objIdx) { - renderer->incrustSprite(g_cine->_objectTable[objIdx]); - createBgIncrustListElement(objIdx, 0); + + renderer->incrustSprite(g_cine->_bgIncrustList.back()); } /** @@ -49,9 +49,9 @@ void addToBGList(int16 objIdx) { * @param objIdx Sprite description */ void addSpriteFilledToBGList(int16 objIdx) { - renderer->incrustMask(g_cine->_objectTable[objIdx]); - createBgIncrustListElement(objIdx, 1); + + renderer->incrustMask(g_cine->_bgIncrustList.back()); } /** @@ -103,9 +103,9 @@ void loadBgIncrustFromSave(Common::SeekableReadStream &fHandle) { g_cine->_bgIncrustList.push_back(tmp); if (tmp.param == 0) { - renderer->incrustSprite(g_cine->_objectTable[tmp.objIdx]); + renderer->incrustSprite(tmp); } else { - renderer->incrustMask(g_cine->_objectTable[tmp.objIdx]); + renderer->incrustMask(tmp); } } } diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index d448f134ff..c51420e62b 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -113,7 +113,7 @@ FWRenderer::FWRenderer() : _background(NULL), _backupPal(), _cmd(""), assert(_backBuffer); memset(_backBuffer, 0, _screenSize); - memset(_bgName, 0, sizeof(_bgName)); + memset(_bgName, 0, sizeof (_bgName)); } @@ -174,7 +174,8 @@ void FWRenderer::fillSprite(const ObjectStruct &obj, uint8 color) { * @param obj Object info * @param fillColor Sprite color */ -void FWRenderer::incrustMask(const ObjectStruct &obj, uint8 color) { +void FWRenderer::incrustMask(const BGIncrust &incrust, uint8 color) { + const ObjectStruct &obj = g_cine->_objectTable[incrust.objIdx]; const byte *data = g_cine->_animDataTable[obj.frame].data(); int x, y, width, height; @@ -218,7 +219,9 @@ void FWRenderer::drawSprite(const ObjectStruct &obj) { * Draw color sprite on background * @param obj Object info */ -void FWRenderer::incrustSprite(const ObjectStruct &obj) { +void FWRenderer::incrustSprite(const BGIncrust &incrust) { + const ObjectStruct &obj = g_cine->_objectTable[incrust.objIdx]; + const byte *data = g_cine->_animDataTable[obj.frame].data(); const byte *mask = g_cine->_animDataTable[obj.frame].mask(); int x, y, width, height; @@ -301,7 +304,7 @@ void FWRenderer::drawMessage(const char *str, int x, int y, int width, int color while (str[i] == ' ') i++; line = fitLine(str + i, tw, words, cw); - if (str[i + line] != '\0' && str[i + line] != 0x7C && words) { + if ( str[i + line] != '\0' && str[i + line] != 0x7C && words) { space = (tw - cw) / words; extraSpace = (tw - cw) % words; } else { @@ -1119,7 +1122,8 @@ void OSRenderer::clear() { * @param obj Object info * @param fillColor Sprite color */ -void OSRenderer::incrustMask(const ObjectStruct &obj, uint8 color) { +void OSRenderer::incrustMask(const BGIncrust &incrust, uint8 color) { + const ObjectStruct &obj = g_cine->_objectTable[incrust.objIdx]; const byte *data = g_cine->_animDataTable[obj.frame].data(); int x, y, width, height; @@ -1154,15 +1158,16 @@ void OSRenderer::drawSprite(const ObjectStruct &obj) { * Draw color sprite * @param obj Object info */ -void OSRenderer::incrustSprite(const ObjectStruct &obj) { - const byte *data = g_cine->_animDataTable[obj.frame].data(); +void OSRenderer::incrustSprite(const BGIncrust &incrust) { + const ObjectStruct &obj = g_cine->_objectTable[incrust.objIdx]; + const byte *data = g_cine->_animDataTable[incrust.frame].data(); int x, y, width, height, transColor; - x = obj.x; - y = obj.y; + x = incrust.x; + y = incrust.y; transColor = obj.part; - width = g_cine->_animDataTable[obj.frame]._realWidth; - height = g_cine->_animDataTable[obj.frame]._height; + width = g_cine->_animDataTable[incrust.frame]._realWidth; + height = g_cine->_animDataTable[incrust.frame]._height; if (_bgTable[_currentBg].bg) { drawSpriteRaw2(data, transColor, width, height, _bgTable[_currentBg].bg, x, y); @@ -1416,7 +1421,7 @@ void OSRenderer::selectBg(unsigned int idx) { if (_bgTable[idx].bg) { assert(_bgTable[idx].pal.isValid() && !(_bgTable[idx].pal.empty())); - _currentBg = idx; + _currentBg = idx; } else warning("OSRenderer::selectBg(%d) - attempt to select null background", idx); reloadPalette(); @@ -1737,43 +1742,53 @@ void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int1 } } -void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp) { - byte *pMask = NULL; +void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp) +{ + byte* pMask = NULL; // draw the mask based on next objects in the list Common::List::iterator it; - for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it) { - if (&(*it) == overlayPtr) { + for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it) + { + if(&(*it) == overlayPtr) + { break; } } - while (it != g_cine->_overlayList.end()) { - overlay *pCurrentOverlay = &(*it); - if ((pCurrentOverlay->type == 5) || ((pCurrentOverlay->type == 21) && (pCurrentOverlay->x == overlayPtr->objIdx))) { - AnimData *sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame]; + while(it != g_cine->_overlayList.end()) + { + overlay* pCurrentOverlay = &(*it); + if((pCurrentOverlay->type==5) || ((pCurrentOverlay->type==21) && (pCurrentOverlay->x==overlayPtr->objIdx))) + { + AnimData* sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame]; - if (pMask == NULL) { - pMask = new byte[width * height]; + if(pMask == NULL) + { + pMask = new byte[width*height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { - byte spriteColor = spritePtr[width * i + j]; - pMask[width * i + j] = spriteColor; + byte spriteColor= spritePtr[width*i+j]; + pMask[width*i+j] = spriteColor; } } } for (int i = 0; i < sprite->_realWidth; i++) { for (int j = 0; j < sprite->_height; j++) { - int inMaskX = (g_cine->_objectTable[it->objIdx].x + i) - x; - int inMaskY = (g_cine->_objectTable[it->objIdx].y + j) - y; - - if (inMaskX >= 0 && inMaskX < width) { - if (inMaskY >= 0 && inMaskY < height) { - if (sprite->_bpp == 1) { - if (!sprite->getColor(i, j)) { - pMask[inMaskY * width + inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320]; + int inMaskX = (g_cine->_objectTable[it->objIdx].x+i) - x; + int inMaskY = (g_cine->_objectTable[it->objIdx].y+j) - y; + + if(inMaskX >=0 && inMaskX < width) + { + if(inMaskY >=0 && inMaskY < height) + { + if(sprite->_bpp == 1) + { + if(!sprite->getColor(i, j)) + { + pMask[inMaskY*width+inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320]; } } } @@ -1787,7 +1802,8 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi } // now, draw with the mask we created - if (pMask) { + if(pMask) + { spritePtr = pMask; } { @@ -1796,7 +1812,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi destPtr += i * 320; for (int j = 0; j < width; j++) { - byte color = *(spritePtr++); + byte color= *(spritePtr++); if ((transparentColor != color) && x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200) { *(destPtr++) = color; } else { @@ -1807,7 +1823,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi } delete[] pMask; -} +}; void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height, byte *page, int16 x, int16 y) { int16 i, j; diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h index 6ff5b08b77..3434cf9fc2 100644 --- a/engines/cine/gfx.h +++ b/engines/cine/gfx.h @@ -27,6 +27,7 @@ #include "common/rect.h" #include "common/stack.h" #include "cine/object.h" +#include "cine/bg_list.h" namespace Cine { @@ -177,8 +178,8 @@ public: void drawFrame(); void setCommand(Common::String cmd); - virtual void incrustMask(const ObjectStruct &obj, uint8 color = 0); - virtual void incrustSprite(const ObjectStruct &obj); + virtual void incrustMask(const BGIncrust &incrust, uint8 color = 0); + virtual void incrustSprite(const BGIncrust &incrust); virtual void loadBg16(const byte *bg, const char *name, unsigned int idx = 0); virtual void loadCt16(const byte *ct, const char *name); @@ -239,8 +240,8 @@ public: void clear(); - void incrustMask(const ObjectStruct &obj, uint8 color = 0); - void incrustSprite(const ObjectStruct &obj); + void incrustMask(const BGIncrust &incrust, uint8 color = 0); + void incrustSprite(const BGIncrust &incrust); void loadBg16(const byte *bg, const char *name, unsigned int idx = 0); void loadCt16(const byte *ct, const char *name); diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp index 223099a587..20952eea52 100644 --- a/engines/cine/saveload.cpp +++ b/engines/cine/saveload.cpp @@ -991,7 +991,7 @@ void CineEngine::makeSave(char *saveFileName) { * at a time. */ void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGameFormat saveGameFormat) { - int16 currentAnim, foundFileIdx; + int16 foundFileIdx; char *animName, part[256], name[10]; strcpy(part, currentPartName); @@ -1001,10 +1001,10 @@ void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGam const int entrySize = ((saveGameFormat == ANIMSIZE_23) ? 23 : 30); const int fileStartPos = fHandle.pos(); - currentAnim = 0; - while (currentAnim < NUM_MAX_ANIMDATA) { + + for(int resourceIndex=0; resourceIndex_partBuffer[foundFileIdx].partName; loadRelatedPalette(animName); // Is this for Future Wars only? - const int16 prevAnim = currentAnim; - currentAnim = loadResource(animName, currentAnim); - assert(currentAnim > prevAnim); // Make sure we advance forward + loadResource(animName, resourceIndex, frameIndex); } loadPart(part); -- cgit v1.2.3 From 1d6a0ad8b20b5c223f3dbab50298be5cdf5f36f5 Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Mon, 13 Aug 2012 21:35:49 -0700 Subject: Fix swimming sequence by allowing mouse click to be held down --- engines/cine/main_loop.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/engines/cine/main_loop.cpp b/engines/cine/main_loop.cpp index 971830ce8f..7cd3cac3d6 100644 --- a/engines/cine/main_loop.cpp +++ b/engines/cine/main_loop.cpp @@ -56,6 +56,12 @@ static void processEvent(Common::Event &event) { case Common::EVENT_RBUTTONDOWN: mouseRight = 1; break; + case Common::EVENT_LBUTTONUP: + mouseLeft = 0; + break; + case Common::EVENT_RBUTTONUP: + mouseRight = 0; + break; case Common::EVENT_MOUSEMOVE: break; case Common::EVENT_KEYDOWN: @@ -214,8 +220,6 @@ void manageEvents() { g_sound->update(); mouseData.left = mouseLeft; mouseData.right = mouseRight; - mouseLeft = 0; - mouseRight = 0; } void getMouseData(uint16 param, uint16 *pButton, uint16 *pX, uint16 *pY) { @@ -311,6 +315,7 @@ void CineEngine::mainLoop(int bootScriptIdx) { // HACK: Force amount of oxygen left to maximum during Operation Stealth's first arcade sequence. // This makes it possible to pass the arcade sequence for now. // FIXME: Remove the hack and make the first arcade sequence normally playable. + /* if (g_cine->getGameType() == Cine::GType_OS) { Common::String bgName(renderer->getBgName()); // Check if the background is one of the three backgrounds @@ -320,7 +325,7 @@ void CineEngine::mainLoop(int bootScriptIdx) { // Force the amount of oxygen left to the maximum. g_cine->_objectTable[oxygenObjNum].x = maxOxygen; } - } + }*/ // HACK: In Operation Stealth after the first arcade sequence jump player's position to avoid getting stuck. // After the first arcade sequence the player comes up stairs from -- cgit v1.2.3 From ca54d69addbbb4257514b007a656138c8f60c4cd Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Mon, 13 Aug 2012 21:35:49 -0700 Subject: Cine: Fix swimming sequence by allowing mouse click to be held down --- engines/cine/main_loop.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/engines/cine/main_loop.cpp b/engines/cine/main_loop.cpp index 971830ce8f..7cd3cac3d6 100644 --- a/engines/cine/main_loop.cpp +++ b/engines/cine/main_loop.cpp @@ -56,6 +56,12 @@ static void processEvent(Common::Event &event) { case Common::EVENT_RBUTTONDOWN: mouseRight = 1; break; + case Common::EVENT_LBUTTONUP: + mouseLeft = 0; + break; + case Common::EVENT_RBUTTONUP: + mouseRight = 0; + break; case Common::EVENT_MOUSEMOVE: break; case Common::EVENT_KEYDOWN: @@ -214,8 +220,6 @@ void manageEvents() { g_sound->update(); mouseData.left = mouseLeft; mouseData.right = mouseRight; - mouseLeft = 0; - mouseRight = 0; } void getMouseData(uint16 param, uint16 *pButton, uint16 *pX, uint16 *pY) { @@ -311,6 +315,7 @@ void CineEngine::mainLoop(int bootScriptIdx) { // HACK: Force amount of oxygen left to maximum during Operation Stealth's first arcade sequence. // This makes it possible to pass the arcade sequence for now. // FIXME: Remove the hack and make the first arcade sequence normally playable. + /* if (g_cine->getGameType() == Cine::GType_OS) { Common::String bgName(renderer->getBgName()); // Check if the background is one of the three backgrounds @@ -320,7 +325,7 @@ void CineEngine::mainLoop(int bootScriptIdx) { // Force the amount of oxygen left to the maximum. g_cine->_objectTable[oxygenObjNum].x = maxOxygen; } - } + }*/ // HACK: In Operation Stealth after the first arcade sequence jump player's position to avoid getting stuck. // After the first arcade sequence the player comes up stairs from -- cgit v1.2.3 From 478be5f07a8528d19542802a7714cf4fd652f340 Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Mon, 13 Aug 2012 23:20:10 -0700 Subject: CINE: Fix regression in savegame system --- engines/cine/anim.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/cine/anim.cpp b/engines/cine/anim.cpp index d81828d9f6..60168831a1 100644 --- a/engines/cine/anim.cpp +++ b/engines/cine/anim.cpp @@ -709,13 +709,17 @@ int loadSet(const char *resourceName, int16 idx, int16 frameIndex =-1 ) { entry = idx < 0 ? emptyAnimSpace() : idx; assert(entry >= 0); + int16 startFrame = 0; + int16 endFrame = numSpriteInAnim; + if(frameIndex>=0) { - numSpriteInAnim = 1; + startFrame = frameIndex; + endFrame = frameIndex+1; ptr += 0x10 * frameIndex; } - for (int16 i = 0; i < numSpriteInAnim; i++, entry++) { + for (int16 i = startFrame; i < endFrame; i++, entry++) { Common::MemoryReadStream readS(ptr, 0x10); header2.field_0 = readS.readUint32BE(); -- cgit v1.2.3 From 54e6283cfa5018401b793ce993cf308fec1cb3ef Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Tue, 14 Aug 2012 16:46:19 +1000 Subject: CINE: Fix compile error caused by excess ; --- engines/cine/gfx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index c51420e62b..d080d4300b 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -1823,7 +1823,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi } delete[] pMask; -}; +} void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height, byte *page, int16 x, int16 y) { int16 i, j; -- cgit v1.2.3 From 92df76fbb3802bf28819c2684d188251c249cdbb Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Mon, 13 Aug 2012 23:58:32 -0700 Subject: CINE: Fix system menu sometimes not appearing in OS --- engines/cine/cine.cpp | 2 ++ engines/cine/gfx.cpp | 15 +++++++++------ engines/cine/main_loop.cpp | 6 +++--- engines/cine/script_fw.cpp | 2 +- engines/cine/various.cpp | 21 ++++++++++++--------- engines/cine/various.h | 2 +- 6 files changed, 28 insertions(+), 20 deletions(-) diff --git a/engines/cine/cine.cpp b/engines/cine/cine.cpp index 6b94c33c31..bbe2cd4896 100644 --- a/engines/cine/cine.cpp +++ b/engines/cine/cine.cpp @@ -189,6 +189,8 @@ void CineEngine::initialize() { g_cine->_messageTable.clear(); resetObjectTable(); + disableSystemMenu = 1; + var8 = 0; var2 = var3 = var4 = var5 = 0; diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index c51420e62b..adc501b67d 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -249,14 +249,17 @@ void FWRenderer::drawCommand() { unsigned int i; int x = 10, y = _cmdY; - drawPlainBox(x, y, 301, 11, 0); - drawBorder(x - 1, y - 1, 302, 12, 2); + if(disableSystemMenu == 0) + { + drawPlainBox(x, y, 301, 11, 0); + drawBorder(x - 1, y - 1, 302, 12, 2); - x += 2; - y += 2; + x += 2; + y += 2; - for (i = 0; i < _cmd.size(); i++) { - x = drawChar(_cmd[i], x, y); + for (i = 0; i < _cmd.size(); i++) { + x = drawChar(_cmd[i], x, y); + } } } diff --git a/engines/cine/main_loop.cpp b/engines/cine/main_loop.cpp index 7cd3cac3d6..f13f38a45e 100644 --- a/engines/cine/main_loop.cpp +++ b/engines/cine/main_loop.cpp @@ -121,7 +121,7 @@ static void processEvent(Common::Event &event) { } break; case Common::KEYCODE_F10: - if (!disableSystemMenu && !inMenu) { + if (!inMenu) { g_cine->makeSystemMenu(); } break; @@ -384,8 +384,8 @@ void CineEngine::mainLoop(int bootScriptIdx) { playerAction = false; _messageLen <<= 3; - if (_messageLen < 0x800) - _messageLen = 0x800; + if (_messageLen < 800) + _messageLen = 800; do { manageEvents(); diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp index 66150cc5b2..a34bf7ba2c 100644 --- a/engines/cine/script_fw.cpp +++ b/engines/cine/script_fw.cpp @@ -1861,7 +1861,7 @@ int FWScript::o1_disableSystemMenu() { byte param = getNextByte(); debugC(5, kCineDebugScript, "Line: %d: disableSystemMenu(%d)", _line, param); - disableSystemMenu = (param != 0); + disableSystemMenu = param; return 0; } diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp index 9b73ae1101..eccd71cf05 100644 --- a/engines/cine/various.cpp +++ b/engines/cine/various.cpp @@ -36,7 +36,7 @@ namespace Cine { -bool disableSystemMenu = false; +int16 disableSystemMenu = 0; bool inMenu; int16 commandVar3[4]; @@ -341,7 +341,7 @@ void CineEngine::makeSystemMenu() { int16 mouseX, mouseY, mouseButton; int16 selectedSave; - if (!disableSystemMenu) { + if (disableSystemMenu != 1) { inMenu = true; do { @@ -544,14 +544,16 @@ int16 buildObjectListCommand(int16 param) { int16 selectSubObject(int16 x, int16 y, int16 param) { int16 listSize = buildObjectListCommand(param); - int16 selectedObject; + int16 selectedObject = -1; bool osExtras = g_cine->getGameType() == Cine::GType_OS; if (!listSize) { return -2; } - selectedObject = makeMenuChoice(objectListCommand, listSize, x, y, 140, osExtras); + if (disableSystemMenu == 0) { + selectedObject = makeMenuChoice(objectListCommand, listSize, x, y, 140, osExtras); + } if (selectedObject == -1) return -1; @@ -691,9 +693,6 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X, int16 var_4; SelectionMenu *menu; - if (disableSystemMenu) - return -1; - paramY = (height * 9) + 10; if (X + width > 319) { @@ -810,14 +809,18 @@ void makeActionMenu() { getMouseData(mouseUpdateStatus, &mouseButton, &mouseX, &mouseY); if (g_cine->getGameType() == Cine::GType_OS) { - playerCommand = makeMenuChoice(defaultActionCommand, 6, mouseX, mouseY, 70, true); + if(disableSystemMenu == 0) { + playerCommand = makeMenuChoice(defaultActionCommand, 6, mouseX, mouseY, 70, true); + } if (playerCommand >= 8000) { playerCommand -= 8000; canUseOnObject = canUseOnItemTable[playerCommand]; } } else { - playerCommand = makeMenuChoice(defaultActionCommand, 6, mouseX, mouseY, 70); + if(disableSystemMenu == 0) { + playerCommand = makeMenuChoice(defaultActionCommand, 6, mouseX, mouseY, 70); + } } inMenu = false; diff --git a/engines/cine/various.h b/engines/cine/various.h index 0c1883c323..813619816d 100644 --- a/engines/cine/various.h +++ b/engines/cine/various.h @@ -41,7 +41,7 @@ void makeActionMenu(); void waitPlayerInput(); void setTextWindow(uint16 param1, uint16 param2, uint16 param3, uint16 param4); -extern bool disableSystemMenu; +extern int16 disableSystemMenu; extern bool inMenu; extern CommandeType currentSaveName[10]; -- cgit v1.2.3 From 629d55cdfad91a993eff7406fa2ca2b09d0d295d Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 14 Aug 2012 09:09:08 +0200 Subject: CINE: Apply some ScummVM formatting conventions --- engines/cine/gfx.cpp | 59 ++++++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 36 deletions(-) diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index 3fac973855..cce8154d84 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -249,8 +249,7 @@ void FWRenderer::drawCommand() { unsigned int i; int x = 10, y = _cmdY; - if(disableSystemMenu == 0) - { + if(disableSystemMenu == 0) { drawPlainBox(x, y, 301, 11, 0); drawBorder(x - 1, y - 1, 302, 12, 2); @@ -304,7 +303,8 @@ void FWRenderer::drawMessage(const char *str, int x, int y, int width, int color for (i = 0; str[i]; i++, line--) { // Fit line of text into textbox if (!line) { - while (str[i] == ' ') i++; + while (str[i] == ' ') + i++; line = fitLine(str + i, tw, words, cw); if ( str[i + line] != '\0' && str[i + line] != 0x7C && words) { @@ -1745,68 +1745,55 @@ void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int1 } } -void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp) -{ - byte* pMask = NULL; +void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp) { + byte *pMask = NULL; // draw the mask based on next objects in the list Common::List::iterator it; - for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it) - { - if(&(*it) == overlayPtr) - { + for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it) { + if(&(*it) == overlayPtr) { break; } } - while(it != g_cine->_overlayList.end()) - { - overlay* pCurrentOverlay = &(*it); - if((pCurrentOverlay->type==5) || ((pCurrentOverlay->type==21) && (pCurrentOverlay->x==overlayPtr->objIdx))) - { - AnimData* sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame]; + while(it != g_cine->_overlayList.end()) { + overlay *pCurrentOverlay = &(*it); + if ((pCurrentOverlay->type == 5) || ((pCurrentOverlay->type == 21) && (pCurrentOverlay->x == overlayPtr->objIdx))) { + AnimData *sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame]; - if(pMask == NULL) - { + if (pMask == NULL) { pMask = new byte[width*height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { - byte spriteColor= spritePtr[width*i+j]; - pMask[width*i+j] = spriteColor; + byte spriteColor= spritePtr[width * i + j]; + pMask[width * i + j] = spriteColor; } } } for (int i = 0; i < sprite->_realWidth; i++) { for (int j = 0; j < sprite->_height; j++) { - int inMaskX = (g_cine->_objectTable[it->objIdx].x+i) - x; - int inMaskY = (g_cine->_objectTable[it->objIdx].y+j) - y; - - if(inMaskX >=0 && inMaskX < width) - { - if(inMaskY >=0 && inMaskY < height) - { - if(sprite->_bpp == 1) - { - if(!sprite->getColor(i, j)) - { - pMask[inMaskY*width+inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320]; + int inMaskX = (g_cine->_objectTable[it->objIdx].x + i) - x; + int inMaskY = (g_cine->_objectTable[it->objIdx].y + j) - y; + + if (inMaskX >=0 && inMaskX < width) { + if (inMaskY >= 0 && inMaskY < height) { + if (sprite->_bpp == 1) { + if (!sprite->getColor(i, j)) { + pMask[inMaskY * width + inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320]; } } } } } } - - } it++; } // now, draw with the mask we created - if(pMask) - { + if(pMask) { spritePtr = pMask; } { -- cgit v1.2.3 From c9f3d83c9eed2134b89e59cf32f2489a99e4139f Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Tue, 14 Aug 2012 23:48:24 +0200 Subject: GUI: Fix out-of-bounds in new chooser. --- gui/saveload-dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp index d1a66dc28a..850dfcc78f 100644 --- a/gui/saveload-dialog.cpp +++ b/gui/saveload-dialog.cpp @@ -535,7 +535,7 @@ const Common::String &SaveLoadChooserGrid::getResultString() const { } void SaveLoadChooserGrid::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { - if (cmd <= _entriesPerPage) { + if (cmd <= _entriesPerPage && cmd + _curPage * _entriesPerPage <= _saveList.size()) { const SaveStateDescriptor &desc = _saveList[cmd - 1 + _curPage * _entriesPerPage]; if (_saveMode) { -- cgit v1.2.3 From b5a63d6709e87005c9b02fa02d4ae8802b7ce915 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Wed, 15 Aug 2012 00:15:29 +0200 Subject: COMMON: Remove fprintf/stderr usage from xmlparser. --- common/xmlparser.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/common/xmlparser.cpp b/common/xmlparser.cpp index ea3d44cf87..f0b7f1cc81 100644 --- a/common/xmlparser.cpp +++ b/common/xmlparser.cpp @@ -20,15 +20,11 @@ * */ -// FIXME: Avoid using fprintf -#define FORBIDDEN_SYMBOL_EXCEPTION_fprintf -#define FORBIDDEN_SYMBOL_EXCEPTION_stderr - - #include "common/xmlparser.h" #include "common/archive.h" #include "common/fs.h" #include "common/memstream.h" +#include "common/system.h" namespace Common { @@ -123,17 +119,19 @@ bool XMLParser::parserError(const String &errStr) { keyClosing = currentPosition; } - fprintf(stderr, "\n File <%s>, line %d:\n", _fileName.c_str(), lineCount); + Common::String errorMessage = Common::String::format("\n File <%s>, line %d:\n", _fileName.c_str(), lineCount); currentPosition = (keyClosing - keyOpening); _stream->seek(keyOpening, SEEK_SET); while (currentPosition--) - fprintf(stderr, "%c", _stream->readByte()); + errorMessage += (char)_stream->readByte(); + + errorMessage += "\n\nParser error: "; + errorMessage += errStr; + errorMessage += "\n\n"; - fprintf(stderr, "\n\nParser error: "); - fprintf(stderr, "%s", errStr.c_str()); - fprintf(stderr, "\n\n"); + g_system->logMessage(LogMessageType::kError, errorMessage.c_str()); return false; } -- cgit v1.2.3 From 92bcb1801a3d25af9f822d901cbd6613ecdff365 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Wed, 15 Aug 2012 09:47:19 +0200 Subject: SCUMM: Replace detector printf usage with logMessage. --- engines/scumm/detection.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index 87305921c9..5404c7f8b1 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -20,9 +20,6 @@ * */ -// FIXME: Avoid using printf -#define FORBIDDEN_SYMBOL_EXCEPTION_printf - #include "base/plugins.h" #include "common/archive.h" @@ -1066,15 +1063,19 @@ Common::Error ScummMetaEngine::createInstance(OSystem *syst, Engine **engine) co // unknown MD5, or with a medium debug level in case of a known MD5 (for // debugging purposes). if (!findInMD5Table(res.md5.c_str())) { - printf("Your game version appears to be unknown. If this is *NOT* a fan-modified\n"); - printf("version (in particular, not a fan-made translation), please, report the\n"); - printf("following data to the ScummVM team along with name of the game you tried\n"); - printf("to add and its version/language/etc.:\n"); + Common::String md5Warning; + + md5Warning = "Your game version appears to be unknown. If this is *NOT* a fan-modified\n"; + md5Warning += "version (in particular, not a fan-made translation), please, report the\n"; + md5Warning += "following data to the ScummVM team along with name of the game you tried\n"; + md5Warning += "to add and its version/language/etc.:\n"; - printf(" SCUMM gameid '%s', file '%s', MD5 '%s'\n\n", + md5Warning += Common::String::format(" SCUMM gameid '%s', file '%s', MD5 '%s'\n\n", res.game.gameid, generateFilenameForDetection(res.fp.pattern, res.fp.genMethod).c_str(), res.md5.c_str()); + + g_system->logMessage(LogMessageType::kWarning, md5Warning.c_str()); } else { debug(1, "Using MD5 '%s'", res.md5.c_str()); } -- cgit v1.2.3 From 067db748e446fb456584d53bc8e206fadbbac9de Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Wed, 15 Aug 2012 09:51:55 +0200 Subject: AGI: Replace detector printf usage with logMessage. --- engines/agi/detection.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp index 805fe7d366..5f7780bfe3 100644 --- a/engines/agi/detection.cpp +++ b/engines/agi/detection.cpp @@ -20,9 +20,6 @@ * */ -// FIXME: Avoid using printf -#define FORBIDDEN_SYMBOL_EXCEPTION_printf - #include "base/plugins.h" #include "engines/advancedDetector.h" @@ -491,10 +488,14 @@ const ADGameDescription *AgiMetaEngine::fallbackDetect(const FileMap &allFilesXX g_fallbackDesc.desc.gameid = _gameid.c_str(); g_fallbackDesc.desc.extra = _extra.c_str(); - printf("Your game version has been detected using fallback matching as a\n"); - printf("variant of %s (%s).\n", g_fallbackDesc.desc.gameid, g_fallbackDesc.desc.extra); - printf("If this is an original and unmodified version or new made Fanmade game,\n"); - printf("please report any, information previously printed by ScummVM to the team.\n"); + Common::String fallbackWarning; + + fallbackWarning = "Your game version has been detected using fallback matching as a\n"; + fallbackWarning += Common::String::format("variant of %s (%s).\n", g_fallbackDesc.desc.gameid, g_fallbackDesc.desc.extra); + fallbackWarning += "If this is an original and unmodified version or new made Fanmade game,\n"; + fallbackWarning += "please report any, information previously printed by ScummVM to the team.\n"; + + g_system->logMessage(LogMessageType::kWarning, fallbackWarning.c_str()); return (const ADGameDescription *)&g_fallbackDesc; } -- cgit v1.2.3 From 9c561c0287b9d1a48caa9d8178f083afc3cf2c89 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Wed, 15 Aug 2012 10:00:23 +0200 Subject: ANDROID: Remove unused GL_OES_draw_texture code. --- backends/platform/android/texture.cpp | 63 +++++++++++------------------------ 1 file changed, 19 insertions(+), 44 deletions(-) diff --git a/backends/platform/android/texture.cpp b/backends/platform/android/texture.cpp index 95c96e0d25..b174e93191 100644 --- a/backends/platform/android/texture.cpp +++ b/backends/platform/android/texture.cpp @@ -52,9 +52,6 @@ // Supported GL extensions static bool npot_supported = false; -#ifdef GL_OES_draw_texture -static bool draw_tex_supported = false; -#endif static inline GLfixed xdiv(int numerator, int denominator) { assert(numerator < (1 << 16)); @@ -85,11 +82,6 @@ void GLESBaseTexture::initGLExtensions() { if (token == "GL_ARB_texture_non_power_of_two") npot_supported = true; - -#ifdef GL_OES_draw_texture - if (token == "GL_OES_draw_texture") - draw_tex_supported = true; -#endif } } @@ -180,45 +172,28 @@ void GLESBaseTexture::allocBuffer(GLuint w, GLuint h) { void GLESBaseTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { GLCALL(glBindTexture(GL_TEXTURE_2D, _texture_name)); -#ifdef GL_OES_draw_texture - // Great extension, but only works under specific conditions. - // Still a work-in-progress - disabled for now. - if (false && draw_tex_supported && !hasPalette()) { - //GLCALL(glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)); - const GLint crop[4] = { 0, _surface.h, _surface.w, -_surface.h }; + const GLfixed tex_width = xdiv(_surface.w, _texture_width); + const GLfixed tex_height = xdiv(_surface.h, _texture_height); + const GLfixed texcoords[] = { + 0, 0, + tex_width, 0, + 0, tex_height, + tex_width, tex_height, + }; - GLCALL(glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop)); + GLCALL(glTexCoordPointer(2, GL_FIXED, 0, texcoords)); - // Android GLES bug? - GLCALL(glColor4ub(0xff, 0xff, 0xff, 0xff)); + const GLshort vertices[] = { + x, y, + x + w, y, + x, y + h, + x + w, y + h, + }; - GLCALL(glDrawTexiOES(x, y, 0, w, h)); - } else -#endif - { - const GLfixed tex_width = xdiv(_surface.w, _texture_width); - const GLfixed tex_height = xdiv(_surface.h, _texture_height); - const GLfixed texcoords[] = { - 0, 0, - tex_width, 0, - 0, tex_height, - tex_width, tex_height, - }; - - GLCALL(glTexCoordPointer(2, GL_FIXED, 0, texcoords)); - - const GLshort vertices[] = { - x, y, - x + w, y, - x, y + h, - x + w, y + h, - }; - - GLCALL(glVertexPointer(2, GL_SHORT, 0, vertices)); - - assert(ARRAYSIZE(vertices) == ARRAYSIZE(texcoords)); - GLCALL(glDrawArrays(GL_TRIANGLE_STRIP, 0, ARRAYSIZE(vertices) / 2)); - } + GLCALL(glVertexPointer(2, GL_SHORT, 0, vertices)); + + assert(ARRAYSIZE(vertices) == ARRAYSIZE(texcoords)); + GLCALL(glDrawArrays(GL_TRIANGLE_STRIP, 0, ARRAYSIZE(vertices) / 2)); clearDirty(); } -- cgit v1.2.3 From 8b022a4983ba179e46a47c10e31fda8ea02c16ce Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Wed, 15 Aug 2012 21:33:55 +0100 Subject: I18N: Update Polish translation from patch #3552055 --- po/pl_PL.po | 150 +++++++++++++++++++++++++++--------------------------------- 1 file changed, 68 insertions(+), 82 deletions(-) diff --git a/po/pl_PL.po b/po/pl_PL.po index c2c5c09e19..1bf44d1a66 100644 --- a/po/pl_PL.po +++ b/po/pl_PL.po @@ -1,14 +1,14 @@ # Polish translation for ScummVM. # Copyright (C) 2010-2012 ScummVM Team # This file is distributed under the same license as the ScummVM package. -# Grajpopolsku.pl , 2011. +# Grajpopolsku.pl , 2011-2012. # msgid "" msgstr "" "Project-Id-Version: ScummVM 1.3.0\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-08-12 14:57+0200\n" -"PO-Revision-Date: 2011-10-24 21:14+0100\n" +"PO-Revision-Date: 2012-07-29 15:49+0100\n" "Last-Translator: Micha Zibkowski \n" "Language-Team: Grajpopolsku.pl \n" "Language: Polski\n" @@ -82,7 +82,6 @@ msgid "Remap keys" msgstr "Dostosuj klawisze" #: gui/gui-manager.cpp:129 base/main.cpp:307 -#, fuzzy msgid "Toggle FullScreen" msgstr "Wcz/wycz peny ekran" @@ -196,9 +195,8 @@ msgid "Platform:" msgstr "Platforma:" #: gui/launcher.cpp:231 -#, fuzzy msgid "Engine" -msgstr "Zbadaj" +msgstr "Silnik" #: gui/launcher.cpp:239 gui/options.cpp:1062 gui/options.cpp:1079 msgid "Graphics" @@ -1197,19 +1195,18 @@ msgstr "" "sprawd plik README." #: engines/dialogs.cpp:228 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate save failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Przepraszamy, ten silnik obecnie nie oferuje pomocy wewntrz gry. Aby " -"uzyska podstawowe informacje oraz dowiedzie jak szuka dalszej pomocy, " -"sprawd plik README." +"Zapis stanu gry nie powid si (%s)! Aby uzyska podstawowe informacje oraz " +"dowiedzie jak szuka dalszej pomocy, sprawd plik README." #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:109 #: engines/mohawk/dialogs.cpp:174 msgid "~O~K" -msgstr "~O~K" +msgstr "" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:110 #: engines/mohawk/dialogs.cpp:175 @@ -1261,14 +1258,13 @@ msgstr "" "Dalsze informacje s dostpne w pliku README." #: engines/engine.cpp:426 -#, fuzzy, c-format +#, c-format msgid "" "Gamestate load failed (%s)! Please consult the README for basic information, " "and for instructions on how to obtain further assistance." msgstr "" -"Przepraszamy, ten silnik obecnie nie oferuje pomocy wewntrz gry. Aby " -"uzyska podstawowe informacje oraz dowiedzie jak szuka dalszej pomocy, " -"sprawd plik README." +"Odczyt stanu gry nie powid si (%s)! Aby uzyska podstawowe informacje " +"oraz dowiedzie jak szuka dalszej pomocy, sprawd plik README." #: engines/engine.cpp:439 msgid "" @@ -1287,12 +1283,12 @@ msgstr "W #: engines/agi/detection.cpp:145 engines/dreamweb/detection.cpp:47 #: engines/sci/detection.cpp:390 msgid "Use original save/load screens" -msgstr "" +msgstr "Uyj oryginalnych ekranw odczytu/zapisu" #: engines/agi/detection.cpp:146 engines/dreamweb/detection.cpp:48 #: engines/sci/detection.cpp:391 msgid "Use the original save/load screens, instead of the ScummVM ones" -msgstr "" +msgstr "Uyj oryginalnych ekranw odczytu/zapisu zamiast tych ze ScummVM" #: engines/agi/saveload.cpp:816 engines/sci/engine/kfile.cpp:838 msgid "Restore game:" @@ -1303,68 +1299,68 @@ msgid "Restore" msgstr "Wznw" #: engines/dreamweb/detection.cpp:57 -#, fuzzy msgid "Use bright palette mode" -msgstr "Przedmiot u gry, z prawej" +msgstr "Uyj trybu jasnej palety" #: engines/dreamweb/detection.cpp:58 msgid "Display graphics using the game's bright palette" -msgstr "" +msgstr "Wywietlaj grafik za pomoc jasnej palety gry" #: engines/sci/detection.cpp:370 msgid "EGA undithering" msgstr "Anty-dithering EGA" #: engines/sci/detection.cpp:371 -#, fuzzy msgid "Enable undithering in EGA games" msgstr "Wcz anty-dithering we wspieranych grach EGA" #: engines/sci/detection.cpp:380 -#, fuzzy msgid "Prefer digital sound effects" -msgstr "Gono efektw dw." +msgstr "Preferuj cyfrowe efekty dwikowe" #: engines/sci/detection.cpp:381 msgid "Prefer digital sound effects instead of synthesized ones" -msgstr "" +msgstr "Preferuj cyfrowe efekty dwikowe zamiast syntezowanych" #: engines/sci/detection.cpp:400 msgid "Use IMF/Yamaha FB-01 for MIDI output" -msgstr "" +msgstr "Uyj IMF/Yamaha FB-01 dla wyjcia MIDI" #: engines/sci/detection.cpp:401 msgid "" "Use an IBM Music Feature card or a Yamaha FB-01 FM synth module for MIDI " "output" msgstr "" +"Uyj karty IBM Music Feature lub moduu syntezy FM Yamaha FB-01 dla wyjcia " +"MIDI" #: engines/sci/detection.cpp:411 msgid "Use CD audio" -msgstr "" +msgstr "Uyj CD audio" #: engines/sci/detection.cpp:412 msgid "Use CD audio instead of in-game audio, if available" -msgstr "" +msgstr "Uyj CD audio zamiast muzyki w grze, jeli jest dostpne" #: engines/sci/detection.cpp:422 msgid "Use Windows cursors" -msgstr "" +msgstr "Uyj windowsowych kursorw" #: engines/sci/detection.cpp:423 msgid "" "Use the Windows cursors (smaller and monochrome) instead of the DOS ones" msgstr "" +"Uyj windowsowych kursorw (mniejsze i monochromatyczne) zamiast DOS-owych" #: engines/sci/detection.cpp:433 -#, fuzzy msgid "Use silver cursors" -msgstr "Zwyky kursor" +msgstr "Uyj srebrnych kursorw" #: engines/sci/detection.cpp:434 msgid "" "Use the alternate set of silver cursors, instead of the normal golden ones" msgstr "" +"Uyj alternatywnego zestawu srebrnych kursorw zamiast zwykych zotych" #: engines/scumm/dialogs.cpp:175 #, c-format @@ -1482,24 +1478,23 @@ msgstr "Mowa i napisy" #: engines/scumm/dialogs.cpp:653 msgid "Select a Proficiency Level." -msgstr "" +msgstr "Wybierz poziom umiejtnoci." #: engines/scumm/dialogs.cpp:655 msgid "Refer to your Loom(TM) manual for help." -msgstr "" +msgstr "Pomocy szukaj w instrukcji doczonej do Loom(TM)." #: engines/scumm/dialogs.cpp:658 -#, fuzzy msgid "Standard" -msgstr "Standardowy (16bpp)" +msgstr "Standardowy" #: engines/scumm/dialogs.cpp:659 msgid "Practice" -msgstr "" +msgstr "Trening" #: engines/scumm/dialogs.cpp:660 msgid "Expert" -msgstr "" +msgstr "Ekspert" #: engines/scumm/help.cpp:73 msgid "Common keyboard commands:" @@ -2118,118 +2113,109 @@ msgstr "Nie uda #. Malcolm makes a joke. #: engines/kyra/detection.cpp:62 msgid "Studio audience" -msgstr "" +msgstr "Publiczno studyjna" #: engines/kyra/detection.cpp:63 msgid "Enable studio audience" -msgstr "" +msgstr "Wcz publiczno studyjn" #. I18N: This option allows the user to skip text and cutscenes. #: engines/kyra/detection.cpp:73 msgid "Skip support" -msgstr "" +msgstr "Obsuga pomijania" #: engines/kyra/detection.cpp:74 msgid "Allow text and cutscenes to be skipped" -msgstr "" +msgstr "Pozwl pomija tekst i przerywniki" #. I18N: Helium mode makes people sound like they've inhaled Helium. #: engines/kyra/detection.cpp:84 msgid "Helium mode" -msgstr "" +msgstr "Tryb helowy" #: engines/kyra/detection.cpp:85 -#, fuzzy msgid "Enable helium mode" -msgstr "Wcz tryb Roland GS" +msgstr "Wcz tryb helowy" #. I18N: When enabled, this option makes scrolling smoother when #. changing from one screen to another. #: engines/kyra/detection.cpp:99 msgid "Smooth scrolling" -msgstr "" +msgstr "Pynne przewijanie" #: engines/kyra/detection.cpp:100 msgid "Enable smooth scrolling when walking" -msgstr "" +msgstr "Wcz pynne przewijanie przy chodzeniu" #. 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 -#, fuzzy msgid "Floating cursors" -msgstr "Zwyky kursor" +msgstr "Pywajce kursory" #: engines/kyra/detection.cpp:113 msgid "Enable floating cursors" -msgstr "" +msgstr "Wcz pywajce kursory" #. I18N: HP stands for Hit Points #: engines/kyra/detection.cpp:127 msgid "HP bar graphs" -msgstr "" +msgstr "Histogramy HP" #: engines/kyra/detection.cpp:128 msgid "Enable hit point bar graphs" -msgstr "" +msgstr "Wcz histogramy punktw ycia" #: engines/kyra/lol.cpp:478 msgid "Attack 1" -msgstr "" +msgstr "Atak 1" #: engines/kyra/lol.cpp:479 msgid "Attack 2" -msgstr "" +msgstr "Atak 2" #: engines/kyra/lol.cpp:480 msgid "Attack 3" -msgstr "" +msgstr "Atak 3" #: engines/kyra/lol.cpp:481 msgid "Move Forward" -msgstr "" +msgstr "Ruch naprzd" #: engines/kyra/lol.cpp:482 msgid "Move Back" -msgstr "" +msgstr "Ruch wstecz" #: engines/kyra/lol.cpp:483 msgid "Slide Left" -msgstr "" +msgstr "lizg w lewo" #: engines/kyra/lol.cpp:484 -#, fuzzy msgid "Slide Right" -msgstr "W prawo" +msgstr "lizg w prawo" #: engines/kyra/lol.cpp:485 -#, fuzzy msgid "Turn Left" -msgstr "Wycz" +msgstr "Obrt w lewo" #: engines/kyra/lol.cpp:486 -#, fuzzy msgid "Turn Right" -msgstr "Kursor w prawo" +msgstr "Obrt w prawo" #: engines/kyra/lol.cpp:487 -#, fuzzy msgid "Rest" -msgstr "Wznw" +msgstr "Odpoczynek" #: engines/kyra/lol.cpp:488 -#, fuzzy msgid "Options" -msgstr "~O~pcje" +msgstr "Opcje" #: engines/kyra/lol.cpp:489 -#, fuzzy msgid "Choose Spell" -msgstr "Wybierz" +msgstr "Wybierz zaklcie" #: engines/kyra/sound_midi.cpp:475 -#, fuzzy msgid "" "You appear to be using a General MIDI device,\n" "but your game only supports Roland MT32 MIDI.\n" @@ -2247,8 +2233,9 @@ msgid "Alternative intro" msgstr "" #: engines/queen/queen.cpp:60 +#, fuzzy msgid "Use an alternative game intro (CD version only)" -msgstr "" +msgstr "Uyj intra z wersji dyskietkowej (tylko dla wersji CD)" #: engines/sky/compact.cpp:130 msgid "" @@ -2268,16 +2255,18 @@ msgstr "" #: engines/sky/detection.cpp:44 msgid "Floppy intro" -msgstr "" +msgstr "Intro z wersji dyskietkowej" #: engines/sky/detection.cpp:45 msgid "Use the floppy version's intro (CD version only)" -msgstr "" +msgstr "Uyj intra z wersji dyskietkowej (tylko dla wersji CD)" #: engines/sword1/animation.cpp:539 #, c-format msgid "PSX stream cutscene '%s' cannot be played in paletted mode" msgstr "" +"Przerywnik w formacie strumieniowym PSX '%s' nie moe zosta odtworzony w " +"trybie indeksowanym" #: engines/sword1/animation.cpp:560 engines/sword2/animation.cpp:455 msgid "DXA cutscenes found but ScummVM has been built without zlib support" @@ -2334,20 +2323,19 @@ msgid "This is the end of the Broken Sword 1 Demo" msgstr "To koniec dema Broken Sword 1" #: engines/sword2/animation.cpp:435 -#, fuzzy msgid "" "PSX cutscenes found but ScummVM has been built without RGB color support" msgstr "" -"Znaleziono przerywniki w formacie DXA, ale ScummVM jest skompilowany bez " -"obsugi zlib" +"Znaleziono przerywniki PSX, ale ScummVM jest skompilowany bez obsugi trybu " +"RGB" #: engines/sword2/sword2.cpp:79 msgid "Show object labels" -msgstr "" +msgstr "Poka etykiety obiektw" #: engines/sword2/sword2.cpp:80 msgid "Show labels for objects on mouse hover" -msgstr "" +msgstr "Poka etykiety obiektw przy najechaniu myszk" #: engines/teenagent/resources.cpp:68 msgid "" @@ -2499,9 +2487,8 @@ msgid "Keymap:" msgstr "Klawisze:" #: backends/keymapper/remap-dialog.cpp:66 -#, fuzzy msgid " (Effective)" -msgstr " (Aktywny)" +msgstr " (Dziaa)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Active)" @@ -2509,7 +2496,7 @@ msgstr " (Aktywny)" #: backends/keymapper/remap-dialog.cpp:106 msgid " (Blocked)" -msgstr "" +msgstr " (Zablokowany)" #: backends/keymapper/remap-dialog.cpp:119 msgid " (Global)" @@ -2613,7 +2600,7 @@ msgstr "Tryb touchpada wy #: backends/platform/maemo/maemo.cpp:209 msgid "Click Mode" -msgstr "" +msgstr "Tryb klikania" #: backends/platform/maemo/maemo.cpp:215 #: backends/platform/symbian/src/SymbianActions.cpp:42 @@ -2624,9 +2611,8 @@ msgid "Left Click" msgstr "Kliknicie LPM" #: backends/platform/maemo/maemo.cpp:218 -#, fuzzy msgid "Middle Click" -msgstr "Przedmiot na rodku, z lewej" +msgstr "rodkowy przycisk" #: backends/platform/maemo/maemo.cpp:221 #: backends/platform/symbian/src/SymbianActions.cpp:43 -- cgit v1.2.3 From e55018ffdb8809574def41cd45f1f0b43dbf0b3c Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Wed, 15 Aug 2012 21:34:55 +0100 Subject: I18N: Update Hungarian translation from patch #3557212 --- po/hu_HU.po | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/po/hu_HU.po b/po/hu_HU.po index a34138c1bf..b263d2c539 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.3.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2012-08-12 14:57+0200\n" -"PO-Revision-Date: 2012-07-09 05:58+0100\n" +"PO-Revision-Date: 2012-08-14 07:29+0100\n" "Last-Translator: George Kormendi \n" "Language-Team: Hungarian\n" "Language: Magyar\n" @@ -921,11 +921,11 @@ msgstr "" #: gui/saveload-dialog.cpp:158 msgid "List view" -msgstr "" +msgstr "Lista nzet" #: gui/saveload-dialog.cpp:159 msgid "Grid view" -msgstr "" +msgstr "Rcs nzet" #: gui/saveload-dialog.cpp:202 gui/saveload-dialog.cpp:350 msgid "No date saved" @@ -965,31 +965,28 @@ msgstr "N #: gui/saveload-dialog.cpp:517 msgid "Next" -msgstr "" +msgstr "Kvetkez" #: gui/saveload-dialog.cpp:520 msgid "Prev" -msgstr "" +msgstr "Elz" #: gui/saveload-dialog.cpp:684 -#, fuzzy msgid "New Save" -msgstr "Ments" +msgstr "j Ments" #: gui/saveload-dialog.cpp:684 -#, fuzzy msgid "Create a new save game" -msgstr "Jtk ments nem sikerlt" +msgstr "j jtkments ksztse" #: gui/saveload-dialog.cpp:789 -#, fuzzy msgid "Name: " msgstr "Nv:" #: gui/saveload-dialog.cpp:861 #, c-format msgid "Enter a description for slot %d:" -msgstr "" +msgstr "Adj meg egy lerst a %d slothoz:" #: gui/themebrowser.cpp:44 msgid "Select a Theme" @@ -2230,12 +2227,11 @@ msgstr "" #: engines/queen/queen.cpp:59 msgid "Alternative intro" -msgstr "" +msgstr "Alternatv intro" #: engines/queen/queen.cpp:60 -#, fuzzy msgid "Use an alternative game intro (CD version only)" -msgstr "A floppy verzi intro hasznlata (csak CD verzinl)" +msgstr "Alternatv jtkintro hasznlata (csak CD verzinl)" #: engines/sky/compact.cpp:130 msgid "" @@ -2336,13 +2332,15 @@ msgstr "T #: engines/teenagent/resources.cpp:68 msgid "" "You're missing the 'teenagent.dat' file. Get it from the ScummVM website" -msgstr "" +msgstr "Hinyzik a 'teenagent.dat' fjl. Szerezd be a ScummVM website-rl" #: engines/teenagent/resources.cpp:89 msgid "" "The teenagent.dat file is compressed and zlib hasn't been included in this " "executable. Please decompress it" msgstr "" +"A teenagent.dat fjl tmrtett s a zlib nem rsze ennek a futtathat " +"llomnynak. Krlek tmrtsd ki" #: engines/parallaction/saveload.cpp:133 #, c-format -- cgit v1.2.3 From 037cdaefac98fe6c8e541c86075ae5d8696934cb Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Wed, 15 Aug 2012 21:35:28 +0100 Subject: I18N: Regenerate translations data file --- gui/themes/translations.dat | Bin 342397 -> 345659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat index cabad0c0c4..d81c1a0475 100644 Binary files a/gui/themes/translations.dat and b/gui/themes/translations.dat differ -- cgit v1.2.3 From e7ae58f2e47b32b77c9165d73e7e8a556bd710b5 Mon Sep 17 00:00:00 2001 From: David-John Willis Date: Thu, 16 Aug 2012 10:54:39 +0100 Subject: CONFIGURE: Set DISABLE_SAVELOADCHOOSER_GRID for the GPH backend. * Move some backend settings from the host selection to the backend. * Also remove stale referances to the old GP2X backend. --- configure | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/configure b/configure index 06492ff305..d4fec02c64 100755 --- a/configure +++ b/configure @@ -712,7 +712,7 @@ Usage: $0 [OPTIONS]... Configuration: -h, --help display this help and exit - --backend=BACKEND backend to build (android, bada, dc, dingux, ds, gp2x, gph, + --backend=BACKEND backend to build (android, bada, dc, dingux, ds, gph, iphone, linuxmoto, maemo, n64, null, openpandora, ps2, psp, samsungtv, sdl, webos, wii, wince) [sdl] @@ -2202,13 +2202,8 @@ if test -n "$_host"; then bfin*) ;; caanoo) - # This uses the GPH backend. - DEFINES="$DEFINES -DGPH_DEVICE" DEFINES="$DEFINES -DCAANOO" - DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" - if test "$_debug_build" = yes; then - DEFINES="$DEFINES -DGPH_DEBUG" - else + if test "$_debug_build" = no; then # Use -O3 on the Caanoo for non-debug builds. _optimization_level=-O3 fi @@ -2299,13 +2294,7 @@ if test -n "$_host"; then add_line_to_config_h "#define USE_WII_DI" ;; gp2x) - # This uses the GPH backend. - DEFINES="$DEFINES -DGPH_DEVICE" DEFINES="$DEFINES -DGP2X" - DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" - if test "$_debug_build" = yes; then - DEFINES="$DEFINES -DGPH_DEBUG" - fi CXXFLAGS="$CXXFLAGS -march=armv4t" ASFLAGS="$ASFLAGS -mfloat-abi=soft" LDFLAGS="$LDFLAGS -static" @@ -2319,13 +2308,7 @@ if test -n "$_host"; then _port_mk="backends/platform/gph/gp2x-bundle.mk" ;; gp2xwiz) - # This uses the GPH backend. - DEFINES="$DEFINES -DGPH_DEVICE" DEFINES="$DEFINES -DGP2XWIZ" - DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" - if test "$_debug_build" = yes; then - DEFINES="$DEFINES -DGPH_DEBUG" - fi CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s" CXXFLAGS="$CXXFLAGS -mtune=arm926ej-s" ASFLAGS="$ASFLAGS -mfloat-abi=soft" @@ -2611,9 +2594,14 @@ case $_backend in INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/commoninclude' INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' ;; - gp2x) - ;; gph) + # On the GPH devices we want fancy themes but do not want the load/save thumbnail grid. + DEFINES="$DEFINES -DDISABLE_SAVELOADCHOOSER_GRID" + DEFINES="$DEFINES -DGPH_DEVICE" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" + if test "$_debug_build" = yes; then + DEFINES="$DEFINES -DGPH_DEBUG" + fi ;; iphone) LIBS="$LIBS -lobjc -framework UIKit -framework CoreGraphics -framework OpenGLES" @@ -2709,7 +2697,7 @@ MODULES="$MODULES backends/platform/$_backend" # Setup SDL specifics for SDL based backends # case $_backend in - dingux | gp2x | gph | linuxmoto | maemo | openpandora | samsungtv | sdl) + dingux | gph | linuxmoto | maemo | openpandora | samsungtv | sdl) find_sdlconfig INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" -- cgit v1.2.3 From 7294a1cbcf1cf5e8c846faf8838e537bd8c638dc Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 16 Aug 2012 12:17:23 -0400 Subject: VIDEO: Remove the Coktel video code from using the VideoDecoder API After discussing with DrMcCoy, we felt this the best way to proceed. A wrapper class that implements AdvancedVideoDecoder is still around for use in SCI. --- engines/sci/console.cpp | 5 +- engines/sci/engine/kvideo.cpp | 7 +- video/coktel_decoder.cpp | 166 ++++++++++++++++++++++++++++++++++-------- video/coktel_decoder.h | 116 +++++++++++++++++++++++------ 4 files changed, 231 insertions(+), 63 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 9b5ef35e92..de852ca9c0 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -253,7 +253,7 @@ void Console::postEnter() { videoDecoder = new SEQDecoder(_videoFrameDelay); #ifdef ENABLE_SCI32 } else if (_videoFile.hasSuffix(".vmd")) { - videoDecoder = new Video::VMDDecoder(g_system->getMixer()); + videoDecoder = new Video::AdvancedVMDDecoder(); } else if (_videoFile.hasSuffix(".rbt")) { videoDecoder = new RobotDecoder(_engine->getPlatform() == Common::kPlatformMacintosh); } else if (_videoFile.hasSuffix(".duk")) { @@ -267,8 +267,7 @@ void Console::postEnter() { } if (videoDecoder && videoDecoder->loadFile(_videoFile)) { - if (!_videoFile.hasSuffix(".vmd")) // TODO: Remove after new API is complete - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); _engine->_gfxCursor->kernelHide(); diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index da63aa3a8d..3e0f35c037 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -50,6 +50,8 @@ void playVideo(Video::VideoDecoder *videoDecoder, VideoState videoState) { if (!videoDecoder) return; + ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); + byte *scaleBuffer = 0; byte bytesPerPixel = videoDecoder->getPixelFormat().bytesPerPixel; uint16 width = videoDecoder->getWidth(); @@ -219,7 +221,6 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { } if (videoDecoder) { - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); // TODO: Remove after new API is complete playVideo(videoDecoder, s->_videoState); // HACK: Switch back to 8bpp if we played a true color video. @@ -349,7 +350,7 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { break; } case 6: // Play - videoDecoder = new Video::VMDDecoder(g_system->getMixer()); + videoDecoder = new Video::AdvancedVMDDecoder(); if (s->_videoState.fileName.empty()) { // Happens in Lighthouse @@ -414,8 +415,6 @@ reg_t kPlayDuck(EngineState *s, int argc, reg_t *argv) { break; } - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); - if (reshowCursor) g_sci->_gfxCursor->kernelHide(); diff --git a/video/coktel_decoder.cpp b/video/coktel_decoder.cpp index 0c7ade1b8a..42033fb01f 100644 --- a/video/coktel_decoder.cpp +++ b/video/coktel_decoder.cpp @@ -53,7 +53,8 @@ CoktelDecoder::CoktelDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundT _mixer(mixer), _soundType(soundType), _width(0), _height(0), _x(0), _y(0), _defaultX(0), _defaultY(0), _features(0), _frameCount(0), _paletteDirty(false), _ownSurface(true), _frameRate(12), _hasSound(false), _soundEnabled(false), - _soundStage(kSoundNone), _audioStream(0) { + _soundStage(kSoundNone), _audioStream(0), _startTime(0), _pauseStartTime(0), + _isPaused(false) { assert(_mixer); @@ -261,6 +262,10 @@ bool CoktelDecoder::isPaletted() const { return true; } +int CoktelDecoder::getCurFrame() const { + return _curFrame; +} + void CoktelDecoder::close() { disableSound(); freeSurface(); @@ -273,9 +278,14 @@ void CoktelDecoder::close() { _features = 0; - _frameCount = 0; + _curFrame = -1; + _frameCount = 0; + + _startTime = 0; _hasSound = false; + + _isPaused = false; } uint16 CoktelDecoder::getWidth() const { @@ -291,6 +301,7 @@ uint32 CoktelDecoder::getFrameCount() const { } const byte *CoktelDecoder::getPalette() { + _paletteDirty = false; return _palette; } @@ -625,14 +636,45 @@ Common::Rational CoktelDecoder::getFrameRate() const { return _frameRate; } +uint32 CoktelDecoder::getTimeToNextFrame() const { + if (endOfVideo() || _curFrame < 0) + return 0; + + uint32 elapsedTime = g_system->getMillis() - _startTime; + uint32 nextFrameStartTime = (Common::Rational((_curFrame + 1) * 1000) / getFrameRate()).toInt(); + + if (nextFrameStartTime <= elapsedTime) + return 0; + + return nextFrameStartTime - elapsedTime; +} + uint32 CoktelDecoder::getStaticTimeToNextFrame() const { return (1000 / _frameRate).toInt(); } +void CoktelDecoder::pauseVideo(bool pause) { + if (_isPaused != pause) { + if (_isPaused) { + // Add the time we were paused to the initial starting time + _startTime += g_system->getMillis() - _pauseStartTime; + } else { + // Store the time we paused for use later + _pauseStartTime = g_system->getMillis(); + } + + _isPaused = pause; + } +} + inline void CoktelDecoder::unsignedToSigned(byte *buffer, int length) { while (length-- > 0) *buffer++ ^= 0x80; } +bool CoktelDecoder::endOfVideo() const { + return !isVideoLoaded() || (getCurFrame() >= (int32)getFrameCount() - 1); +} + PreIMDDecoder::PreIMDDecoder(uint16 width, uint16 height, Audio::Mixer *mixer, Audio::Mixer::SoundType soundType) : CoktelDecoder(mixer, soundType), @@ -705,8 +747,6 @@ bool PreIMDDecoder::loadStream(Common::SeekableReadStream *stream) { } void PreIMDDecoder::close() { - reset(); - CoktelDecoder::close(); delete _stream; @@ -1159,8 +1199,6 @@ bool IMDDecoder::loadFrameTables(uint32 framePosPos, uint32 frameCoordsPos) { } void IMDDecoder::close() { - reset(); - CoktelDecoder::close(); delete _stream; @@ -1225,8 +1263,6 @@ void IMDDecoder::processFrame() { _dirtyRects.clear(); - _paletteDirty = false; - uint32 cmd = 0; bool hasNextCmd = false; bool startSound = false; @@ -1273,7 +1309,7 @@ void IMDDecoder::processFrame() { // Set palette if (cmd == kCommandPalette) { _stream->skip(2); - + _paletteDirty = true; for (int i = 0; i < 768; i++) @@ -1322,7 +1358,7 @@ void IMDDecoder::processFrame() { // Start the audio stream if necessary if (startSound && _soundEnabled) { _mixer->playStream(_soundType, &_audioHandle, _audioStream, - -1, getVolume(), getBalance(), DisposeAfterUse::NO); + -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO); _soundStage = kSoundPlaying; } @@ -1504,16 +1540,6 @@ Graphics::PixelFormat IMDDecoder::getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } -void IMDDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelVolume(_audioHandle, getVolume()); -} - -void IMDDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelBalance(_audioHandle, getBalance()); -} - VMDDecoder::File::File() { offset = 0; @@ -1552,7 +1578,7 @@ VMDDecoder::VMDDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType) : _soundLastFilledFrame(0), _audioFormat(kAudioFormat8bitRaw), _hasVideo(false), _videoCodec(0), _blitMode(0), _bytesPerPixel(0), _firstFramePos(0), _videoBufferSize(0), _externalCodec(false), _codec(0), - _subtitle(-1), _isPaletted(true) { + _subtitle(-1), _isPaletted(true), _autoStartSound(true) { _videoBuffer [0] = 0; _videoBuffer [1] = 0; @@ -2014,8 +2040,6 @@ bool VMDDecoder::readFiles() { } void VMDDecoder::close() { - reset(); - CoktelDecoder::close(); delete _stream; @@ -2095,7 +2119,6 @@ void VMDDecoder::processFrame() { _dirtyRects.clear(); - _paletteDirty = false; _subtitle = -1; bool startSound = false; @@ -2215,8 +2238,9 @@ void VMDDecoder::processFrame() { if (startSound && _soundEnabled) { if (_hasSound && _audioStream) { - _mixer->playStream(_soundType, &_audioHandle, _audioStream, - -1, getVolume(), getBalance(), DisposeAfterUse::NO); + if (_autoStartSound) + _mixer->playStream(_soundType, &_audioHandle, _audioStream, + -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO); _soundStage = kSoundPlaying; } else _soundStage = kSoundNone; @@ -2742,14 +2766,92 @@ bool VMDDecoder::isPaletted() const { return _isPaletted; } -void VMDDecoder::updateVolume() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelVolume(_audioHandle, getVolume()); +void VMDDecoder::setAutoStartSound(bool autoStartSound) { + _autoStartSound = autoStartSound; +} + +AdvancedVMDDecoder::AdvancedVMDDecoder(Audio::Mixer::SoundType soundType) { + _decoder = new VMDDecoder(g_system->getMixer(), soundType); + _decoder->setAutoStartSound(false); +} + +AdvancedVMDDecoder::~AdvancedVMDDecoder() { + close(); + delete _decoder; +} + +bool AdvancedVMDDecoder::loadStream(Common::SeekableReadStream *stream) { + close(); + + if (!_decoder->loadStream(stream)) + return false; + + if (_decoder->hasVideo()) { + _videoTrack = new VMDVideoTrack(_decoder); + addTrack(_videoTrack); + } + + if (_decoder->hasSound()) { + _audioTrack = new VMDAudioTrack(_decoder); + addTrack(_audioTrack); + } + + return true; +} + +void AdvancedVMDDecoder::close() { + AdvancedVideoDecoder::close(); + _decoder->close(); +} + +AdvancedVMDDecoder::VMDVideoTrack::VMDVideoTrack(VMDDecoder *decoder) : _decoder(decoder) { +} + +uint16 AdvancedVMDDecoder::VMDVideoTrack::getWidth() const { + return _decoder->getWidth(); +} + +uint16 AdvancedVMDDecoder::VMDVideoTrack::getHeight() const { + return _decoder->getHeight(); +} + +Graphics::PixelFormat AdvancedVMDDecoder::VMDVideoTrack::getPixelFormat() const { + return _decoder->getPixelFormat(); +} + +int AdvancedVMDDecoder::VMDVideoTrack::getCurFrame() const { + return _decoder->getCurFrame(); +} + +int AdvancedVMDDecoder::VMDVideoTrack::getFrameCount() const { + return _decoder->getFrameCount(); +} + +const Graphics::Surface *AdvancedVMDDecoder::VMDVideoTrack::decodeNextFrame() { + return _decoder->decodeNextFrame(); +} + +const byte *AdvancedVMDDecoder::VMDVideoTrack::getPalette() const { + return _decoder->getPalette(); +} + +bool AdvancedVMDDecoder::VMDVideoTrack::hasDirtyPalette() const { + return _decoder->hasDirtyPalette(); +} + +Common::Rational AdvancedVMDDecoder::VMDVideoTrack::getFrameRate() const { + return _decoder->getFrameRate(); +} + +AdvancedVMDDecoder::VMDAudioTrack::VMDAudioTrack(VMDDecoder *decoder) : _decoder(decoder) { +} + +Audio::Mixer::SoundType AdvancedVMDDecoder::VMDAudioTrack::getSoundType() const { + return _decoder->_soundType; } -void VMDDecoder::updateBalance() { - if (g_system->getMixer()->isSoundHandleActive(_audioHandle)) - g_system->getMixer()->setChannelBalance(_audioHandle, getBalance()); +Audio::AudioStream *AdvancedVMDDecoder::VMDAudioTrack::getAudioStream() const { + return _decoder->_audioStream; } } // End of namespace Video diff --git a/video/coktel_decoder.h b/video/coktel_decoder.h index c88d982191..117a55658f 100644 --- a/video/coktel_decoder.h +++ b/video/coktel_decoder.h @@ -64,7 +64,7 @@ class Codec; * - gob * - sci */ -class CoktelDecoder : public FixedRateVideoDecoder { +class CoktelDecoder { public: struct State { /** Set accordingly to what was done. */ @@ -77,7 +77,7 @@ public: CoktelDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); - ~CoktelDecoder(); + virtual ~CoktelDecoder(); /** Replace the current video stream with this identical one. */ virtual bool reloadStream(Common::SeekableReadStream *stream) = 0; @@ -138,21 +138,47 @@ public: /** Is the video paletted or true color? */ virtual bool isPaletted() const; + /** + * Get the current frame + * @see VideoDecoder::getCurFrame() + */ + int getCurFrame() const; - // VideoDecoder interface + /** + * Decode the next frame + * @see VideoDecoder::decodeNextFrame() + */ + virtual const Graphics::Surface *decodeNextFrame() = 0; + /** + * Load a video from a stream + * @see VideoDecoder::loadStream() + */ + virtual bool loadStream(Common::SeekableReadStream *stream) = 0; + + /** Has a video been loaded? */ + virtual bool isVideoLoaded() const = 0; + + /** Has the end of the video been reached? */ + bool endOfVideo() const; + + /** Close the video. */ void close(); uint16 getWidth() const; uint16 getHeight() const; + virtual Graphics::PixelFormat getPixelFormat() const = 0; uint32 getFrameCount() const; const byte *getPalette(); bool hasDirtyPalette() const; + uint32 getTimeToNextFrame() const; uint32 getStaticTimeToNextFrame() const; + void pauseVideo(bool pause); + protected: enum SoundStage { kSoundNone = 0, ///< No sound. @@ -186,8 +212,11 @@ protected: uint32 _features; + int32 _curFrame; uint32 _frameCount; + uint32 _startTime; + byte _palette[768]; bool _paletteDirty; @@ -208,6 +237,8 @@ protected: bool evaluateSeekFrame(int32 &frame, int whence) const; + Common::Rational getFrameRate() const; + // Surface management bool hasSurface(); void createSurface(); @@ -228,10 +259,9 @@ protected: // Sound helper functions inline void unsignedToSigned(byte *buffer, int length); - - // FixedRateVideoDecoder interface - - Common::Rational getFrameRate() const; +private: + uint32 _pauseStartTime; + bool _isPaused; }; class PreIMDDecoder : public CoktelDecoder { @@ -244,9 +274,6 @@ public: bool seek(int32 frame, int whence = SEEK_SET, bool restart = false); - - // VideoDecoder interface - bool loadStream(Common::SeekableReadStream *stream); void close(); @@ -279,9 +306,6 @@ public: void setXY(uint16 x, uint16 y); - - // VideoDecoder interface - bool loadStream(Common::SeekableReadStream *stream); void close(); @@ -291,11 +315,6 @@ public: Graphics::PixelFormat getPixelFormat() const; -protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); - private: enum Command { kCommandNextSound = 0xFF00, @@ -367,6 +386,8 @@ private: }; class VMDDecoder : public CoktelDecoder { +friend class AdvancedVMDDecoder; + public: VMDDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); ~VMDDecoder(); @@ -390,9 +411,6 @@ public: bool hasVideo() const; bool isPaletted() const; - - // VideoDecoder interface - bool loadStream(Common::SeekableReadStream *stream); void close(); @@ -403,9 +421,7 @@ public: Graphics::PixelFormat getPixelFormat() const; protected: - // VideoDecoder API - void updateVolume(); - void updateBalance(); + void setAutoStartSound(bool autoStartSound); private: enum PartType { @@ -478,6 +494,7 @@ private: uint32 _soundDataSize; uint32 _soundLastFilledFrame; AudioFormat _audioFormat; + bool _autoStartSound; // Video properties bool _hasVideo; @@ -532,6 +549,57 @@ private: bool getPartCoords(int16 frame, PartType type, int16 &x, int16 &y, int16 &width, int16 &height); }; +/** + * A wrapper around the VMD code that implements the AdvancedVideoDecoder + * API. + */ +class AdvancedVMDDecoder : public AdvancedVideoDecoder { +public: + AdvancedVMDDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); + ~AdvancedVMDDecoder(); + + bool loadStream(Common::SeekableReadStream *stream); + void close(); + +private: + class VMDVideoTrack : public FixedRateVideoTrack { + public: + VMDVideoTrack(VMDDecoder *decoder); + + uint16 getWidth() const; + uint16 getHeight() const; + Graphics::PixelFormat getPixelFormat() const; + int getCurFrame() const; + int getFrameCount() const; + const Graphics::Surface *decodeNextFrame(); + const byte *getPalette() const; + bool hasDirtyPalette() const; + + protected: + Common::Rational getFrameRate() const; + + private: + VMDDecoder *_decoder; + }; + + class VMDAudioTrack : public AudioTrack { + public: + VMDAudioTrack(VMDDecoder *decoder); + + Audio::Mixer::SoundType getSoundType() const; + + protected: + virtual Audio::AudioStream *getAudioStream() const; + + private: + VMDDecoder *_decoder; + }; + + VMDDecoder *_decoder; + VMDVideoTrack *_videoTrack; + VMDAudioTrack *_audioTrack; +}; + } // End of namespace Video #endif // VIDEO_COKTELDECODER_H -- cgit v1.2.3 From 9e7f0e4753636ace510d626be4b0ee22ab682269 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 16 Aug 2012 12:27:05 -0400 Subject: VIDEO: Begin removing some of the deprecated functions from VideoDecoder --- video/video_decoder.cpp | 40 +++++----------------------------------- video/video_decoder.h | 37 ++----------------------------------- 2 files changed, 7 insertions(+), 70 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 0108888613..a7d3789b65 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -34,7 +34,10 @@ namespace Video { VideoDecoder::VideoDecoder() { - reset(); + _startTime = 0; + _pauseLevel = 0; + _audioVolume = Audio::Mixer::kMaxChannelVolume; + _audioBalance = 0; } bool VideoDecoder::loadFile(const Common::String &filename) { @@ -74,7 +77,7 @@ void VideoDecoder::pauseVideo(bool pause) { pauseVideoIntern(true); } else if (_pauseLevel == 0) { pauseVideoIntern(false); - addPauseTime(g_system->getMillis() - _pauseStartTime); + _startTime += (g_system->getMillis() - _pauseStartTime); } } @@ -701,41 +704,8 @@ void AdvancedVideoDecoder::startAudioLimit(const Audio::Timestamp &limit) { ///////////////// DEPRECATED ///////////////// ////////////////////////////////////////////// -void VideoDecoder::reset() { - _curFrame = -1; - _startTime = 0; - _pauseLevel = 0; - _audioVolume = Audio::Mixer::kMaxChannelVolume; - _audioBalance = 0; -} - -bool VideoDecoder::endOfVideo() const { - return !isVideoLoaded() || (getCurFrame() >= (int32)getFrameCount() - 1); -} - void VideoDecoder::setSystemPalette() { g_system->getPaletteManager()->setPalette(getPalette(), 0, 256); } -uint32 FixedRateVideoDecoder::getTimeToNextFrame() const { - if (endOfVideo() || _curFrame < 0) - return 0; - - uint32 elapsedTime = getTime(); - uint32 nextFrameStartTime = getFrameBeginTime(_curFrame + 1); - - // If the time that the next frame should be shown has past - // the frame should be shown ASAP. - if (nextFrameStartTime <= elapsedTime) - return 0; - - return nextFrameStartTime - elapsedTime; -} - -uint32 FixedRateVideoDecoder::getFrameBeginTime(uint32 frame) const { - Common::Rational beginTime = frame * 1000; - beginTime /= getFrameRate(); - return beginTime.toInt(); -} - } // End of namespace Video diff --git a/video/video_decoder.h b/video/video_decoder.h index 7e89caee40..0135425bac 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -124,7 +124,7 @@ public: * Returns the current frame number of the video. * @return the last frame decoded by the video */ - virtual int32 getCurFrame() const { return _curFrame; } + virtual int32 getCurFrame() const = 0; /** * Returns the number of frames in the video. @@ -173,7 +173,7 @@ public: * Returns if the video has finished playing or not. * @return true if the video has finished playing or if none is loaded, false otherwise */ - virtual bool endOfVideo() const; + virtual bool endOfVideo() const = 0; /** * Pause or resume the video. This should stop/resume any audio playback @@ -228,12 +228,6 @@ public: virtual void setBalance(int8 balance); protected: - /** - * Resets _curFrame and _startTime. Should be called from every close() function. - * @note This function is now deprecated. There is no replacement. - */ - void reset(); - /** * Actual implementation of pause by subclasses. See pause() * for details. @@ -241,12 +235,6 @@ protected: */ virtual void pauseVideoIntern(bool pause) {} - /** - * Add the time the video has been paused to maintain sync - * @note This function is now deprecated. There is no replacement. - */ - virtual void addPauseTime(uint32 ms) { _startTime += ms; } - /** * Reset the pause start time (which should be called when seeking) */ @@ -264,7 +252,6 @@ protected: */ virtual void updateBalance() {} - int32 _curFrame; // This variable is now deprecated. int32 _startTime; // FIXME: These are protected until the new API takes over this one @@ -797,26 +784,6 @@ private: void startAudioLimit(const Audio::Timestamp &limit); }; -/** - * A VideoDecoder wrapper that implements getTimeToNextFrame() based on getFrameRate(). - * @note This class is now deprecated. Use AdvancedVideoDecoder instead. - */ -class FixedRateVideoDecoder : public virtual VideoDecoder { -public: - uint32 getTimeToNextFrame() const; - -protected: - /** - * Return the frame rate in frames per second. - * This returns a Rational because videos can have rates that are not integers and - * there are some videos with frame rates < 1. - */ - virtual Common::Rational getFrameRate() const = 0; - -private: - uint32 getFrameBeginTime(uint32 frame) const; -}; - } // End of namespace Video #endif -- cgit v1.2.3 From fb35c7f46f986a22235638e2946ba8492e735109 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 16 Aug 2012 13:30:32 -0400 Subject: VIDEO: Remove setSystemPalette() --- engines/agos/animation.cpp | 4 ++-- engines/mohawk/video.cpp | 3 ++- engines/saga/introproc_saga2.cpp | 3 ++- engines/sci/graphics/frameout.cpp | 5 +++-- engines/sword1/animation.cpp | 2 +- engines/sword2/animation.cpp | 4 +++- engines/toon/movie.cpp | 3 ++- video/video_decoder.cpp | 8 -------- video/video_decoder.h | 7 ------- 9 files changed, 15 insertions(+), 24 deletions(-) diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp index ec8293c91f..8fc93e4153 100644 --- a/engines/agos/animation.cpp +++ b/engines/agos/animation.cpp @@ -278,7 +278,7 @@ void MoviePlayerDXA::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { } while (--h); if (hasDirtyPalette()) - setSystemPalette(); + g_system->getPaletteManager()->setPalette(getPalette(), 0, 256); } void MoviePlayerDXA::playVideo() { @@ -445,7 +445,7 @@ void MoviePlayerSMK::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { } while (--h); if (hasDirtyPalette()) - setSystemPalette(); + g_system->getPaletteManager()->setPalette(getPalette(), 0, 256); } void MoviePlayerSMK::playVideo() { diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp index 5b811382ff..13adfcb1cd 100644 --- a/engines/mohawk/video.cpp +++ b/engines/mohawk/video.cpp @@ -29,6 +29,7 @@ #include "common/textconsole.h" #include "common/system.h" +#include "graphics/palette.h" #include "graphics/surface.h" #include "video/qt_decoder.h" @@ -238,7 +239,7 @@ bool VideoManager::updateMovies() { frame = convertedFrame; } else if (pixelFormat.bytesPerPixel == 1 && _videoStreams[i]->hasDirtyPalette()) { // Set the palette when running in 8bpp mode only - _videoStreams[i]->setSystemPalette(); + _vm->_system->getPaletteManager()->setPalette(_videoStreams[i]->getPalette(), 0, 256); } // Clip the width/height to make sure we stay on the screen (Myst does this a few times) diff --git a/engines/saga/introproc_saga2.cpp b/engines/saga/introproc_saga2.cpp index 15f7f4dc15..260eca98e6 100644 --- a/engines/saga/introproc_saga2.cpp +++ b/engines/saga/introproc_saga2.cpp @@ -32,6 +32,7 @@ #include "common/keyboard.h" #include "common/system.h" #include "common/textconsole.h" +#include "graphics/palette.h" #include "graphics/surface.h" #include "video/smk_decoder.h" @@ -110,7 +111,7 @@ void Scene::playMovie(const char *filename) { _vm->_system->copyRectToScreen(frame->pixels, frame->pitch, x, y, frame->w, frame->h); if (smkDecoder->hasDirtyPalette()) - smkDecoder->setSystemPalette(); + _vm->_system->getPaletteManager()->setPalette(smkDecoder->getPalette(), 0, 256); _vm->_system->updateScreen(); } diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index fedae2eb6f..0056f6c78b 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -28,6 +28,7 @@ #include "common/system.h" #include "common/textconsole.h" #include "engines/engine.h" +#include "graphics/palette.h" #include "graphics/surface.h" #include "sci/sci.h" @@ -494,7 +495,7 @@ void GfxFrameout::showVideo() { uint16 y = videoDecoder->getPos().y; if (videoDecoder->hasDirtyPalette()) - videoDecoder->setSystemPalette(); + g_system->getPaletteManager()->setPalette(videoDecoder->getPalette(), 0, 256); while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { if (videoDecoder->needsUpdate()) { @@ -503,7 +504,7 @@ void GfxFrameout::showVideo() { g_system->copyRectToScreen(frame->pixels, frame->pitch, x, y, frame->w, frame->h); if (videoDecoder->hasDirtyPalette()) - videoDecoder->setSystemPalette(); + g_system->getPaletteManager()->setPalette(videoDecoder->getPalette(), 0, 256); g_system->updateScreen(); } diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index 70f1e5dc03..98725a302a 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -312,7 +312,7 @@ bool MoviePlayer::playVideo() { } if (_decoder->hasDirtyPalette()) { - _decoder->setSystemPalette(); + _vm->_system->getPaletteManager()->setPalette(_decoder->getPalette(), 0, 256); if (!_movieTexts.empty()) { // Look for the best color indexes to use to display the subtitles diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index e603925e73..24b52cd85a 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -38,6 +38,8 @@ #include "sword2/screen.h" #include "sword2/animation.h" +#include "graphics/palette.h" + #include "gui/message.h" #include "video/dxa_decoder.h" @@ -330,7 +332,7 @@ bool MoviePlayer::playVideo() { } if (_decoder->hasDirtyPalette()) { - _decoder->setSystemPalette(); + _vm->_system->getPaletteManager()->setPalette(_decoder->getPalette(), 0, 256); uint32 maxWeight = 0; uint32 minWeight = 0xFFFFFFFF; diff --git a/engines/toon/movie.cpp b/engines/toon/movie.cpp index d988a3ed60..8c85e20f7c 100644 --- a/engines/toon/movie.cpp +++ b/engines/toon/movie.cpp @@ -25,6 +25,7 @@ #include "common/keyboard.h" #include "common/stream.h" #include "common/system.h" +#include "graphics/palette.h" #include "graphics/surface.h" #include "toon/audio.h" @@ -126,7 +127,7 @@ bool Movie::playVideo(bool isFirstIntroVideo) { } } } - _decoder->setSystemPalette(); + _vm->_system->getPaletteManager()->setPalette(_decoder->getPalette(), 0, 256); _vm->_system->updateScreen(); } diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index a7d3789b65..1ead6af54e 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -700,12 +700,4 @@ void AdvancedVideoDecoder::startAudioLimit(const Audio::Timestamp &limit) { ((AudioTrack *)*it)->start(limit); } -////////////////////////////////////////////// -///////////////// DEPRECATED ///////////////// -////////////////////////////////////////////// - -void VideoDecoder::setSystemPalette() { - g_system->getPaletteManager()->setPalette(getPalette(), 0, 256); -} - } // End of namespace Video diff --git a/video/video_decoder.h b/video/video_decoder.h index 0135425bac..72be634f17 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -113,13 +113,6 @@ public: */ virtual bool hasDirtyPalette() const { return false; } - /** - * Set the system palette to the palette returned by getPalette. - * @see getPalette - * @note This function is now deprecated. There is no replacement. - */ - void setSystemPalette(); - /** * Returns the current frame number of the video. * @return the last frame decoded by the video -- cgit v1.2.3 From 7569ec7dc00e95e0643cde7f413a7cf46a4770f0 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 16 Aug 2012 13:34:28 -0400 Subject: VIDEO: Rename setStopTime() to setEndTime() To better differentiate with stop() --- engines/mohawk/video.cpp | 2 +- video/video_decoder.cpp | 26 +++++++++++++------------- video/video_decoder.h | 10 +++++----- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp index 13adfcb1cd..0ed4f38b53 100644 --- a/engines/mohawk/video.cpp +++ b/engines/mohawk/video.cpp @@ -514,7 +514,7 @@ bool VideoManager::isVideoPlaying() { void VideoManager::setVideoBounds(VideoHandle handle, Audio::Timestamp start, Audio::Timestamp end) { assert(handle != NULL_VID_HANDLE); _videoStreams[handle].start = start; - _videoStreams[handle]->setStopTime(end); + _videoStreams[handle]->setEndTime(end); _videoStreams[handle]->seek(start); } diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 1ead6af54e..fc4d7e1ae7 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -106,8 +106,8 @@ AdvancedVideoDecoder::AdvancedVideoDecoder() { _pauseLevel = 0; _needsUpdate = false; _lastTimeChange = 0; - _stopTime = 0; - _stopTimeSet = false; + _endTime = 0; + _endTimeSet = false; // Find the best format for output _defaultHighColorFormat = g_system->getScreenFormat(); @@ -133,8 +133,8 @@ void AdvancedVideoDecoder::close() { _pauseLevel = 0; _needsUpdate = false; _lastTimeChange = 0; - _stopTime = 0; - _stopTimeSet = false; + _endTime = 0; + _endTimeSet = false; } bool AdvancedVideoDecoder::isVideoLoaded() const { @@ -254,10 +254,10 @@ bool AdvancedVideoDecoder::endOfVideo() const { if (!isVideoLoaded()) return true; - if (_stopTimeSet) { + if (_endTimeSet) { const VideoTrack *track = findNextVideoTrack(); - if (track && track->getNextFrameStartTime() >= (uint)_stopTime.msecs()) + if (track && track->getNextFrameStartTime() >= (uint)_endTime.msecs()) return true; } @@ -592,7 +592,7 @@ bool AdvancedVideoDecoder::addStreamFileTrack(const Common::String &baseName) { return result; } -void AdvancedVideoDecoder::setStopTime(const Audio::Timestamp &stopTime) { +void AdvancedVideoDecoder::setEndTime(const Audio::Timestamp &endTime) { Audio::Timestamp startTime = 0; if (isPlaying()) { @@ -600,17 +600,17 @@ void AdvancedVideoDecoder::setStopTime(const Audio::Timestamp &stopTime) { stopAudio(); } - _stopTime = stopTime; - _stopTimeSet = true; + _endTime = endTime; + _endTimeSet = true; - if (startTime > stopTime) + if (startTime > endTime) return; if (isPlaying()) { // We'll assume the audio track is going to start up at the same time it just was // and therefore not do any seeking. // Might want to set it anyway if we're seekable. - startAudioLimit(_stopTime.msecs() - startTime.msecs()); + startAudioLimit(_endTime.msecs() - startTime.msecs()); _lastTimeChange = startTime; } } @@ -676,10 +676,10 @@ const AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack } void AdvancedVideoDecoder::startAudio() { - if (_stopTimeSet) { + if (_endTimeSet) { // HACK: Timestamp's subtraction asserts out when subtracting two times // with different rates. - startAudioLimit(_stopTime - _lastTimeChange.convertToFramerate(_stopTime.framerate())); + startAudioLimit(_endTime - _lastTimeChange.convertToFramerate(_endTime.framerate())); return; } diff --git a/video/video_decoder.h b/video/video_decoder.h index 72be634f17..d6cfcde0b4 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -360,15 +360,15 @@ public: void setDefaultHighColorFormat(const Graphics::PixelFormat &format) { _defaultHighColorFormat = format; } /** - * Set the time for this video to stop at. At this time in the video, + * Set the time for this video to end at. At this time in the video, * all audio will stop and endOfVideo() will return true. */ - void setStopTime(const Audio::Timestamp &stopTime); + void setEndTime(const Audio::Timestamp &endTime); /** * Get the stop time of the video (if not set, zero) */ - Audio::Timestamp getStopTime() const { return _stopTime; } + Audio::Timestamp getEndTime() const { return _endTime; } // Future API //void setRate(const Common::Rational &rate); @@ -761,8 +761,8 @@ private: // Current playback status bool _isPlaying, _needsRewind, _needsUpdate; - Audio::Timestamp _lastTimeChange, _stopTime; - bool _stopTimeSet; + Audio::Timestamp _lastTimeChange, _endTime; + bool _endTimeSet; // Palette settings from individual tracks mutable bool _dirtyPalette; -- cgit v1.2.3 From 18823198ad4e7dedd0ca33760eb453e9fe673551 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 16 Aug 2012 14:00:14 -0400 Subject: VIDEO: Merge AdvancedVideoDecoder into VideoDecoder --- engines/agos/animation.cpp | 2 +- engines/mohawk/video.h | 4 +- engines/sci/console.cpp | 2 - engines/sci/engine/kvideo.cpp | 2 +- engines/sci/video/robot_decoder.cpp | 2 +- engines/sci/video/robot_decoder.h | 2 +- engines/sci/video/seq_decoder.h | 2 +- engines/scumm/he/animation_he.cpp | 4 +- engines/sword1/animation.cpp | 6 +- engines/sword2/animation.cpp | 6 +- video/avi_decoder.cpp | 2 +- video/avi_decoder.h | 2 +- video/bink_decoder.cpp | 2 +- video/bink_decoder.h | 2 +- video/coktel_decoder.cpp | 2 +- video/coktel_decoder.h | 4 +- video/dxa_decoder.h | 2 +- video/flic_decoder.h | 2 +- video/psx_decoder.cpp | 2 +- video/psx_decoder.h | 2 +- video/qt_decoder.cpp | 6 +- video/qt_decoder.h | 2 +- video/smk_decoder.cpp | 4 +- video/smk_decoder.h | 2 +- video/theora_decoder.cpp | 2 +- video/theora_decoder.h | 2 +- video/video_decoder.cpp | 219 ++++++++++++++++-------------------- video/video_decoder.h | 123 +++++--------------- 28 files changed, 164 insertions(+), 250 deletions(-) diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp index 8fc93e4153..10f274b37f 100644 --- a/engines/agos/animation.cpp +++ b/engines/agos/animation.cpp @@ -342,7 +342,7 @@ bool MoviePlayerDXA::processFrame() { _vm->_system->unlockScreen(); uint32 soundTime = _mixer->getSoundElapsedTime(_bgSound); - uint32 nextFrameStartTime = ((Video::AdvancedVideoDecoder::VideoTrack *)getTrack(0))->getNextFrameStartTime(); + uint32 nextFrameStartTime = ((Video::VideoDecoder::VideoTrack *)getTrack(0))->getNextFrameStartTime(); if ((_bgSoundStream == NULL) || soundTime < nextFrameStartTime) { diff --git a/engines/mohawk/video.h b/engines/mohawk/video.h index 4e34604bfd..9dddcde09b 100644 --- a/engines/mohawk/video.h +++ b/engines/mohawk/video.h @@ -45,7 +45,7 @@ struct MLSTRecord { struct VideoEntry { // Playback variables - Video::AdvancedVideoDecoder *video; + Video::VideoDecoder *video; uint16 x; uint16 y; bool loop; @@ -57,7 +57,7 @@ struct VideoEntry { int id; // Internal Mohawk files // Helper functions - Video::AdvancedVideoDecoder *operator->() const { assert(video); return video; } // TODO: Remove this eventually + Video::VideoDecoder *operator->() const { assert(video); return video; } // TODO: Remove this eventually void clear(); bool endOfVideo(); }; diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index de852ca9c0..1889d53480 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -267,8 +267,6 @@ void Console::postEnter() { } if (videoDecoder && videoDecoder->loadFile(_videoFile)) { - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); - _engine->_gfxCursor->kernelHide(); #ifdef ENABLE_SCI32 diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index 3e0f35c037..6bf9aff2fe 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -50,7 +50,7 @@ void playVideo(Video::VideoDecoder *videoDecoder, VideoState videoState) { if (!videoDecoder) return; - ((Video::AdvancedVideoDecoder *)videoDecoder)->start(); + videoDecoder->start(); byte *scaleBuffer = 0; byte bytesPerPixel = videoDecoder->getPixelFormat().bytesPerPixel; diff --git a/engines/sci/video/robot_decoder.cpp b/engines/sci/video/robot_decoder.cpp index 6fe4c645f4..608c77136f 100644 --- a/engines/sci/video/robot_decoder.cpp +++ b/engines/sci/video/robot_decoder.cpp @@ -132,7 +132,7 @@ bool RobotDecoder::load(GuiResourceId id) { } void RobotDecoder::close() { - AdvancedVideoDecoder::close(); + VideoDecoder::close(); delete _fileStream; _fileStream = 0; diff --git a/engines/sci/video/robot_decoder.h b/engines/sci/video/robot_decoder.h index de5b669ab8..ebc3262939 100644 --- a/engines/sci/video/robot_decoder.h +++ b/engines/sci/video/robot_decoder.h @@ -37,7 +37,7 @@ class SeekableSubReadStreamEndian; namespace Sci { -class RobotDecoder : public Video::AdvancedVideoDecoder { +class RobotDecoder : public Video::VideoDecoder { public: RobotDecoder(bool isBigEndian); virtual ~RobotDecoder(); diff --git a/engines/sci/video/seq_decoder.h b/engines/sci/video/seq_decoder.h index 82254990d6..890f349feb 100644 --- a/engines/sci/video/seq_decoder.h +++ b/engines/sci/video/seq_decoder.h @@ -40,7 +40,7 @@ namespace Sci { /** * Implementation of the Sierra SEQ decoder, used in KQ6 DOS floppy/CD and GK1 DOS */ -class SEQDecoder : public Video::AdvancedVideoDecoder { +class SEQDecoder : public Video::VideoDecoder { public: SEQDecoder(uint frameDelay); virtual ~SEQDecoder(); diff --git a/engines/scumm/he/animation_he.cpp b/engines/scumm/he/animation_he.cpp index 8329511c14..be17a3b305 100644 --- a/engines/scumm/he/animation_he.cpp +++ b/engines/scumm/he/animation_he.cpp @@ -62,14 +62,14 @@ int MoviePlayer::load(const char *filename, int flags, int image) { _video->close(); // Ensure that Bink will use our PixelFormat - ((Video::AdvancedVideoDecoder *)_video)->setDefaultHighColorFormat(g_system->getScreenFormat()); + _video->setDefaultHighColorFormat(g_system->getScreenFormat()); if (!_video->loadFile(filename)) { warning("Failed to load video file %s", filename); return -1; } - ((Video::AdvancedVideoDecoder *)_video)->start(); + _video->start(); debug(1, "Playing video %s", filename); diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index 98725a302a..f7add4eed2 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -183,7 +183,7 @@ bool MoviePlayer::load(uint32 id) { // Need to load here in case it fails in which case we'd need // to go back to paletted mode if (_decoder->loadFile(filename)) { - ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete + _decoder->start(); return true; } else { initGraphics(g_system->getWidth(), g_system->getHeight(), true); @@ -197,9 +197,9 @@ bool MoviePlayer::load(uint32 id) { // For DXA, also add the external sound file if (_decoderType == kVideoDecoderDXA) - ((Video::AdvancedVideoDecoder *)_decoder)->addStreamFileTrack(sequenceList[id]); + _decoder->addStreamFileTrack(sequenceList[id]); - ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete + _decoder->start(); return true; } diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index 24b52cd85a..00260f789a 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -95,7 +95,7 @@ bool MoviePlayer::load(const char *name) { // Need to load here in case it fails in which case we'd need // to go back to paletted mode if (_decoder->loadFile(filename)) { - ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete + _decoder->start(); return true; } else { initGraphics(640, 480, true); @@ -108,9 +108,9 @@ bool MoviePlayer::load(const char *name) { // For DXA, also add the external sound file if (_decoderType == kVideoDecoderDXA) - ((Video::AdvancedVideoDecoder *)_decoder)->addStreamFileTrack(name); + _decoder->addStreamFileTrack(name); - ((Video::AdvancedVideoDecoder *)_decoder)->start(); // TODO: Remove after new API is complete + _decoder->start(); return true; } diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp index 375cc6f0f3..0850d5656a 100644 --- a/video/avi_decoder.cpp +++ b/video/avi_decoder.cpp @@ -289,7 +289,7 @@ bool AVIDecoder::loadStream(Common::SeekableReadStream *stream) { } void AVIDecoder::close() { - AdvancedVideoDecoder::close(); + VideoDecoder::close(); delete _fileStream; _fileStream = 0; diff --git a/video/avi_decoder.h b/video/avi_decoder.h index 010702cce3..a3a262db36 100644 --- a/video/avi_decoder.h +++ b/video/avi_decoder.h @@ -53,7 +53,7 @@ class Codec; * Video decoder used in engines: * - sci */ -class AVIDecoder : public AdvancedVideoDecoder { +class AVIDecoder : public VideoDecoder { public: AVIDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); virtual ~AVIDecoder(); diff --git a/video/bink_decoder.cpp b/video/bink_decoder.cpp index cac0b356c5..620316806f 100644 --- a/video/bink_decoder.cpp +++ b/video/bink_decoder.cpp @@ -147,7 +147,7 @@ bool BinkDecoder::loadStream(Common::SeekableReadStream *stream) { } void BinkDecoder::close() { - AdvancedVideoDecoder::close(); + VideoDecoder::close(); delete _bink; _bink = 0; diff --git a/video/bink_decoder.h b/video/bink_decoder.h index 836238ce99..150e91aab7 100644 --- a/video/bink_decoder.h +++ b/video/bink_decoder.h @@ -62,7 +62,7 @@ namespace Video { * Video decoder used in engines: * - scumm (he) */ -class BinkDecoder : public AdvancedVideoDecoder { +class BinkDecoder : public VideoDecoder { public: BinkDecoder(); ~BinkDecoder(); diff --git a/video/coktel_decoder.cpp b/video/coktel_decoder.cpp index 42033fb01f..6a60b0e7d7 100644 --- a/video/coktel_decoder.cpp +++ b/video/coktel_decoder.cpp @@ -2800,7 +2800,7 @@ bool AdvancedVMDDecoder::loadStream(Common::SeekableReadStream *stream) { } void AdvancedVMDDecoder::close() { - AdvancedVideoDecoder::close(); + VideoDecoder::close(); _decoder->close(); } diff --git a/video/coktel_decoder.h b/video/coktel_decoder.h index 117a55658f..2a97eadf00 100644 --- a/video/coktel_decoder.h +++ b/video/coktel_decoder.h @@ -550,10 +550,10 @@ private: }; /** - * A wrapper around the VMD code that implements the AdvancedVideoDecoder + * A wrapper around the VMD code that implements the VideoDecoder * API. */ -class AdvancedVMDDecoder : public AdvancedVideoDecoder { +class AdvancedVMDDecoder : public VideoDecoder { public: AdvancedVMDDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); ~AdvancedVMDDecoder(); diff --git a/video/dxa_decoder.h b/video/dxa_decoder.h index a0caca4b95..b3f2eca5e2 100644 --- a/video/dxa_decoder.h +++ b/video/dxa_decoder.h @@ -41,7 +41,7 @@ namespace Video { * - sword1 * - sword2 */ -class DXADecoder : public AdvancedVideoDecoder { +class DXADecoder : public VideoDecoder { public: DXADecoder(); virtual ~DXADecoder(); diff --git a/video/flic_decoder.h b/video/flic_decoder.h index 9b82161ca5..9037af05d6 100644 --- a/video/flic_decoder.h +++ b/video/flic_decoder.h @@ -44,7 +44,7 @@ namespace Video { * Video decoder used in engines: * - tucker */ -class FlicDecoder : public AdvancedVideoDecoder { +class FlicDecoder : public VideoDecoder { public: FlicDecoder(); virtual ~FlicDecoder(); diff --git a/video/psx_decoder.cpp b/video/psx_decoder.cpp index 93bf711c25..fa7f1e8cfe 100644 --- a/video/psx_decoder.cpp +++ b/video/psx_decoder.cpp @@ -174,7 +174,7 @@ bool PSXStreamDecoder::loadStream(Common::SeekableReadStream *stream) { } void PSXStreamDecoder::close() { - AdvancedVideoDecoder::close(); + VideoDecoder::close(); _audioTrack = 0; _videoTrack = 0; _frameCount = 0; diff --git a/video/psx_decoder.h b/video/psx_decoder.h index 2a9dedf77f..11f311594d 100644 --- a/video/psx_decoder.h +++ b/video/psx_decoder.h @@ -56,7 +56,7 @@ namespace Video { * - sword1 (psx) * - sword2 (psx) */ -class PSXStreamDecoder : public AdvancedVideoDecoder { +class PSXStreamDecoder : public VideoDecoder { public: // CD speed in sectors/second // Calling code should use these enum values instead of the constants diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index 70dcdff9c6..87c530dba0 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -79,7 +79,7 @@ bool QuickTimeDecoder::loadStream(Common::SeekableReadStream *stream) { } void QuickTimeDecoder::close() { - AdvancedVideoDecoder::close(); + VideoDecoder::close(); Common::QuickTimeParser::close(); if (_scaledSurface) { @@ -90,7 +90,7 @@ void QuickTimeDecoder::close() { } const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { - const Graphics::Surface *frame = AdvancedVideoDecoder::decodeNextFrame(); + const Graphics::Surface *frame = VideoDecoder::decodeNextFrame(); // Update audio buffers too // (needs to be done after we find the next track) @@ -244,7 +244,7 @@ void QuickTimeDecoder::init() { void QuickTimeDecoder::updateAudioBuffer() { // Updates the audio buffers for all audio tracks for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++) - if ((*it)->getTrackType() == AdvancedVideoDecoder::Track::kTrackTypeAudio) + if ((*it)->getTrackType() == VideoDecoder::Track::kTrackTypeAudio) ((AudioTrackHandler *)*it)->updateBuffer(); } diff --git a/video/qt_decoder.h b/video/qt_decoder.h index 7a251b8580..71d33711a6 100644 --- a/video/qt_decoder.h +++ b/video/qt_decoder.h @@ -55,7 +55,7 @@ class Codec; * - mohawk * - sci */ -class QuickTimeDecoder : public AdvancedVideoDecoder, public Audio::QuickTimeAudioDecoder { +class QuickTimeDecoder : public VideoDecoder, public Audio::QuickTimeAudioDecoder { public: QuickTimeDecoder(); virtual ~QuickTimeDecoder(); diff --git a/video/smk_decoder.cpp b/video/smk_decoder.cpp index d707ad519f..d01ec730f4 100644 --- a/video/smk_decoder.cpp +++ b/video/smk_decoder.cpp @@ -396,7 +396,7 @@ bool SmackerDecoder::loadStream(Common::SeekableReadStream *stream) { } void SmackerDecoder::close() { - AdvancedVideoDecoder::close(); + VideoDecoder::close(); delete _fileStream; _fileStream = 0; @@ -411,7 +411,7 @@ void SmackerDecoder::close() { bool SmackerDecoder::rewind() { // Call the parent method to rewind the tracks first // In particular, only videos without sound can be rewound - if (!AdvancedVideoDecoder::rewind()) + if (!VideoDecoder::rewind()) return false; // And seek back to where the first frame begins diff --git a/video/smk_decoder.h b/video/smk_decoder.h index 78a4ded0fc..6bded64a37 100644 --- a/video/smk_decoder.h +++ b/video/smk_decoder.h @@ -57,7 +57,7 @@ class BigHuffmanTree; * - sword2 * - toon */ -class SmackerDecoder : public AdvancedVideoDecoder { +class SmackerDecoder : public VideoDecoder { public: SmackerDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kSFXSoundType); virtual ~SmackerDecoder(); diff --git a/video/theora_decoder.cpp b/video/theora_decoder.cpp index 76007eadff..d7260469e6 100644 --- a/video/theora_decoder.cpp +++ b/video/theora_decoder.cpp @@ -198,7 +198,7 @@ bool TheoraDecoder::loadStream(Common::SeekableReadStream *stream) { } void TheoraDecoder::close() { - AdvancedVideoDecoder::close(); + VideoDecoder::close(); if (!_fileStream) return; diff --git a/video/theora_decoder.h b/video/theora_decoder.h index 2244f7550d..7e36d829e7 100644 --- a/video/theora_decoder.h +++ b/video/theora_decoder.h @@ -52,7 +52,7 @@ namespace Video { * Video decoder used in engines: * - sword25 */ -class TheoraDecoder : public AdvancedVideoDecoder { +class TheoraDecoder : public VideoDecoder { public: TheoraDecoder(Audio::Mixer::SoundType soundType = Audio::Mixer::kMusicSoundType); virtual ~TheoraDecoder(); diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index fc4d7e1ae7..cf11649c10 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -35,9 +35,44 @@ namespace Video { VideoDecoder::VideoDecoder() { _startTime = 0; + _needsRewind = false; + _dirtyPalette = false; + _palette = 0; + _isPlaying = false; + _audioVolume = Audio::Mixer::kMaxChannelVolume; + _audioBalance = 0; _pauseLevel = 0; + _needsUpdate = false; + _lastTimeChange = 0; + _endTime = 0; + _endTimeSet = false; + + // Find the best format for output + _defaultHighColorFormat = g_system->getScreenFormat(); + + if (_defaultHighColorFormat.bytesPerPixel == 1) + _defaultHighColorFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0); +} + +void VideoDecoder::close() { + if (isPlaying()) + stop(); + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + delete *it; + + _tracks.clear(); + _needsRewind = false; + _dirtyPalette = false; + _palette = 0; + _startTime = 0; _audioVolume = Audio::Mixer::kMaxChannelVolume; _audioBalance = 0; + _pauseLevel = 0; + _needsUpdate = false; + _lastTimeChange = 0; + _endTime = 0; + _endTimeSet = false; } bool VideoDecoder::loadFile(const Common::String &filename) { @@ -51,10 +86,6 @@ bool VideoDecoder::loadFile(const Common::String &filename) { return loadStream(file); } -uint32 VideoDecoder::getTime() const { - return g_system->getMillis() - _startTime; -} - bool VideoDecoder::needsUpdate() const { return !endOfVideo() && getTimeToNextFrame() == 0; } @@ -74,9 +105,13 @@ void VideoDecoder::pauseVideo(bool pause) { if (_pauseLevel == 1 && pause) { _pauseStartTime = g_system->getMillis(); // Store the starting time from pausing to keep it for later - pauseVideoIntern(true); + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + (*it)->pause(true); } else if (_pauseLevel == 0) { - pauseVideoIntern(false); + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + (*it)->pause(false); + _startTime += (g_system->getMillis() - _pauseStartTime); } } @@ -88,60 +123,25 @@ void VideoDecoder::resetPauseStartTime() { void VideoDecoder::setVolume(byte volume) { _audioVolume = volume; - updateVolume(); + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) + if ((*it)->getTrackType() == Track::kTrackTypeAudio) + ((AudioTrack *)*it)->setVolume(_audioVolume); } void VideoDecoder::setBalance(int8 balance) { _audioBalance = balance; - updateBalance(); -} - -AdvancedVideoDecoder::AdvancedVideoDecoder() { - _needsRewind = false; - _dirtyPalette = false; - _palette = 0; - _isPlaying = false; - _audioVolume = Audio::Mixer::kMaxChannelVolume; - _audioBalance = 0; - _pauseLevel = 0; - _needsUpdate = false; - _lastTimeChange = 0; - _endTime = 0; - _endTimeSet = false; - - // Find the best format for output - _defaultHighColorFormat = g_system->getScreenFormat(); - - if (_defaultHighColorFormat.bytesPerPixel == 1) - _defaultHighColorFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0); -} - -void AdvancedVideoDecoder::close() { - if (isPlaying()) - stop(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) - delete *it; - - _tracks.clear(); - _needsRewind = false; - _dirtyPalette = false; - _palette = 0; - _startTime = 0; - _audioVolume = Audio::Mixer::kMaxChannelVolume; - _audioBalance = 0; - _pauseLevel = 0; - _needsUpdate = false; - _lastTimeChange = 0; - _endTime = 0; - _endTimeSet = false; + if ((*it)->getTrackType() == Track::kTrackTypeAudio) + ((AudioTrack *)*it)->setBalance(_audioBalance); } -bool AdvancedVideoDecoder::isVideoLoaded() const { +bool VideoDecoder::isVideoLoaded() const { return !_tracks.empty(); } -uint16 AdvancedVideoDecoder::getWidth() const { +uint16 VideoDecoder::getWidth() const { for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) if ((*it)->getTrackType() == Track::kTrackTypeVideo) return ((VideoTrack *)*it)->getWidth(); @@ -149,7 +149,7 @@ uint16 AdvancedVideoDecoder::getWidth() const { return 0; } -uint16 AdvancedVideoDecoder::getHeight() const { +uint16 VideoDecoder::getHeight() const { for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) if ((*it)->getTrackType() == Track::kTrackTypeVideo) return ((VideoTrack *)*it)->getHeight(); @@ -157,7 +157,7 @@ uint16 AdvancedVideoDecoder::getHeight() const { return 0; } -Graphics::PixelFormat AdvancedVideoDecoder::getPixelFormat() const { +Graphics::PixelFormat VideoDecoder::getPixelFormat() const { for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) if ((*it)->getTrackType() == Track::kTrackTypeVideo) return ((VideoTrack *)*it)->getPixelFormat(); @@ -165,7 +165,7 @@ Graphics::PixelFormat AdvancedVideoDecoder::getPixelFormat() const { return Graphics::PixelFormat(); } -const Graphics::Surface *AdvancedVideoDecoder::decodeNextFrame() { +const Graphics::Surface *VideoDecoder::decodeNextFrame() { _needsUpdate = false; readNextPacket(); @@ -184,12 +184,12 @@ const Graphics::Surface *AdvancedVideoDecoder::decodeNextFrame() { return frame; } -const byte *AdvancedVideoDecoder::getPalette() { +const byte *VideoDecoder::getPalette() { _dirtyPalette = false; return _palette; } -int AdvancedVideoDecoder::getCurFrame() const { +int VideoDecoder::getCurFrame() const { int32 frame = -1; for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) @@ -199,7 +199,7 @@ int AdvancedVideoDecoder::getCurFrame() const { return frame; } -uint32 AdvancedVideoDecoder::getFrameCount() const { +uint32 VideoDecoder::getFrameCount() const { int count = 0; for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) @@ -209,7 +209,7 @@ uint32 AdvancedVideoDecoder::getFrameCount() const { return count; } -uint32 AdvancedVideoDecoder::getTime() const { +uint32 VideoDecoder::getTime() const { if (!isPlaying()) return _lastTimeChange.msecs(); @@ -230,7 +230,7 @@ uint32 AdvancedVideoDecoder::getTime() const { return g_system->getMillis() - _startTime; } -uint32 AdvancedVideoDecoder::getTimeToNextFrame() const { +uint32 VideoDecoder::getTimeToNextFrame() const { if (endOfVideo() || _needsUpdate) return 0; @@ -248,9 +248,7 @@ uint32 AdvancedVideoDecoder::getTimeToNextFrame() const { return nextFrameStartTime - elapsedTime; } -bool AdvancedVideoDecoder::endOfVideo() const { - // TODO: Bring _isPlaying into account? - +bool VideoDecoder::endOfVideo() const { if (!isVideoLoaded()) return true; @@ -268,7 +266,7 @@ bool AdvancedVideoDecoder::endOfVideo() const { return true; } -bool AdvancedVideoDecoder::isRewindable() const { +bool VideoDecoder::isRewindable() const { if (!isVideoLoaded()) return false; @@ -279,7 +277,7 @@ bool AdvancedVideoDecoder::isRewindable() const { return true; } -bool AdvancedVideoDecoder::rewind() { +bool VideoDecoder::rewind() { if (!isRewindable()) return false; @@ -303,7 +301,7 @@ bool AdvancedVideoDecoder::rewind() { return true; } -bool AdvancedVideoDecoder::isSeekable() const { +bool VideoDecoder::isSeekable() const { if (!isVideoLoaded()) return false; @@ -314,7 +312,7 @@ bool AdvancedVideoDecoder::isSeekable() const { return true; } -bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { +bool VideoDecoder::seek(const Audio::Timestamp &time) { if (!isSeekable()) return false; @@ -342,7 +340,7 @@ bool AdvancedVideoDecoder::seek(const Audio::Timestamp &time) { return true; } -void AdvancedVideoDecoder::start() { +void VideoDecoder::start() { if (isPlaying() || !isVideoLoaded()) return; @@ -360,7 +358,7 @@ void AdvancedVideoDecoder::start() { startAudio(); } -void AdvancedVideoDecoder::stop() { +void VideoDecoder::stop() { if (!isPlaying()) return; @@ -386,7 +384,7 @@ void AdvancedVideoDecoder::stop() { } } -Audio::Timestamp AdvancedVideoDecoder::getDuration() const { +Audio::Timestamp VideoDecoder::getDuration() const { Audio::Timestamp maxDuration(0, 1000); for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) { @@ -399,42 +397,23 @@ Audio::Timestamp AdvancedVideoDecoder::getDuration() const { return maxDuration; } -void AdvancedVideoDecoder::pauseVideoIntern(bool pause) { - for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) - (*it)->pause(pause); -} - -void AdvancedVideoDecoder::updateVolume() { - // For API compatibility only - for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) - if ((*it)->getTrackType() == Track::kTrackTypeAudio) - ((AudioTrack *)*it)->setVolume(_audioVolume); -} - -void AdvancedVideoDecoder::updateBalance() { - // For API compatibility only - for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) - if ((*it)->getTrackType() == Track::kTrackTypeAudio) - ((AudioTrack *)*it)->setBalance(_audioBalance); -} - -AdvancedVideoDecoder::Track::Track() { +VideoDecoder::Track::Track() { _paused = false; } -bool AdvancedVideoDecoder::Track::isRewindable() const { +bool VideoDecoder::Track::isRewindable() const { return isSeekable(); } -bool AdvancedVideoDecoder::Track::rewind() { +bool VideoDecoder::Track::rewind() { return seek(Audio::Timestamp(0, 1000)); } -Audio::Timestamp AdvancedVideoDecoder::Track::getDuration() const { +Audio::Timestamp VideoDecoder::Track::getDuration() const { return Audio::Timestamp(0, 1000); } -uint32 AdvancedVideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const { +uint32 VideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const { if (endOfTrack() || getCurFrame() < 0) return 0; @@ -443,11 +422,11 @@ uint32 AdvancedVideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const return time.toInt(); } -bool AdvancedVideoDecoder::FixedRateVideoTrack::endOfTrack() const { +bool VideoDecoder::FixedRateVideoTrack::endOfTrack() const { return getCurFrame() >= (getFrameCount() - 1); } -Audio::Timestamp AdvancedVideoDecoder::FixedRateVideoTrack::getDuration() const { +Audio::Timestamp VideoDecoder::FixedRateVideoTrack::getDuration() const { // Since Audio::Timestamp doesn't support a fractional frame rate, we're currently // just converting to milliseconds. Common::Rational time = getFrameCount() * 1000; @@ -455,26 +434,26 @@ Audio::Timestamp AdvancedVideoDecoder::FixedRateVideoTrack::getDuration() const return time.toInt(); } -bool AdvancedVideoDecoder::AudioTrack::endOfTrack() const { +bool VideoDecoder::AudioTrack::endOfTrack() const { Audio::AudioStream *stream = getAudioStream(); return !stream || !g_system->getMixer()->isSoundHandleActive(_handle) || stream->endOfData(); } -void AdvancedVideoDecoder::AudioTrack::setVolume(byte volume) { +void VideoDecoder::AudioTrack::setVolume(byte volume) { _volume = volume; if (g_system->getMixer()->isSoundHandleActive(_handle)) g_system->getMixer()->setChannelVolume(_handle, _volume); } -void AdvancedVideoDecoder::AudioTrack::setBalance(int8 balance) { +void VideoDecoder::AudioTrack::setBalance(int8 balance) { _balance = balance; if (g_system->getMixer()->isSoundHandleActive(_handle)) g_system->getMixer()->setChannelBalance(_handle, _balance); } -void AdvancedVideoDecoder::AudioTrack::start() { +void VideoDecoder::AudioTrack::start() { stop(); Audio::AudioStream *stream = getAudioStream(); @@ -487,11 +466,11 @@ void AdvancedVideoDecoder::AudioTrack::start() { g_system->getMixer()->pauseHandle(_handle, true); } -void AdvancedVideoDecoder::AudioTrack::stop() { +void VideoDecoder::AudioTrack::stop() { g_system->getMixer()->stopHandle(_handle); } -void AdvancedVideoDecoder::AudioTrack::start(const Audio::Timestamp &limit) { +void VideoDecoder::AudioTrack::start(const Audio::Timestamp &limit) { stop(); Audio::AudioStream *stream = getAudioStream(); @@ -506,60 +485,60 @@ void AdvancedVideoDecoder::AudioTrack::start(const Audio::Timestamp &limit) { g_system->getMixer()->pauseHandle(_handle, true); } -uint32 AdvancedVideoDecoder::AudioTrack::getRunningTime() const { +uint32 VideoDecoder::AudioTrack::getRunningTime() const { if (g_system->getMixer()->isSoundHandleActive(_handle)) return g_system->getMixer()->getSoundElapsedTime(_handle); return 0; } -void AdvancedVideoDecoder::AudioTrack::pauseIntern(bool shouldPause) { +void VideoDecoder::AudioTrack::pauseIntern(bool shouldPause) { if (g_system->getMixer()->isSoundHandleActive(_handle)) g_system->getMixer()->pauseHandle(_handle, shouldPause); } -Audio::AudioStream *AdvancedVideoDecoder::RewindableAudioTrack::getAudioStream() const { +Audio::AudioStream *VideoDecoder::RewindableAudioTrack::getAudioStream() const { return getRewindableAudioStream(); } -bool AdvancedVideoDecoder::RewindableAudioTrack::rewind() { +bool VideoDecoder::RewindableAudioTrack::rewind() { Audio::RewindableAudioStream *stream = getRewindableAudioStream(); assert(stream); return stream->rewind(); } -Audio::Timestamp AdvancedVideoDecoder::SeekableAudioTrack::getDuration() const { +Audio::Timestamp VideoDecoder::SeekableAudioTrack::getDuration() const { Audio::SeekableAudioStream *stream = getSeekableAudioStream(); assert(stream); return stream->getLength(); } -Audio::AudioStream *AdvancedVideoDecoder::SeekableAudioTrack::getAudioStream() const { +Audio::AudioStream *VideoDecoder::SeekableAudioTrack::getAudioStream() const { return getSeekableAudioStream(); } -bool AdvancedVideoDecoder::SeekableAudioTrack::seek(const Audio::Timestamp &time) { +bool VideoDecoder::SeekableAudioTrack::seek(const Audio::Timestamp &time) { Audio::SeekableAudioStream *stream = getSeekableAudioStream(); assert(stream); return stream->seek(time); } -AdvancedVideoDecoder::StreamFileAudioTrack::StreamFileAudioTrack() { +VideoDecoder::StreamFileAudioTrack::StreamFileAudioTrack() { _stream = 0; } -AdvancedVideoDecoder::StreamFileAudioTrack::~StreamFileAudioTrack() { +VideoDecoder::StreamFileAudioTrack::~StreamFileAudioTrack() { delete _stream; } -bool AdvancedVideoDecoder::StreamFileAudioTrack::loadFromFile(const Common::String &baseName) { +bool VideoDecoder::StreamFileAudioTrack::loadFromFile(const Common::String &baseName) { // TODO: Make sure the stream isn't being played delete _stream; _stream = Audio::SeekableAudioStream::openStreamFile(baseName); return _stream != 0; } -void AdvancedVideoDecoder::addTrack(Track *track) { +void VideoDecoder::addTrack(Track *track) { _tracks.push_back(track); // Update volume settings if it's an audio track @@ -577,7 +556,7 @@ void AdvancedVideoDecoder::addTrack(Track *track) { ((AudioTrack *)track)->start(); } -bool AdvancedVideoDecoder::addStreamFileTrack(const Common::String &baseName) { +bool VideoDecoder::addStreamFileTrack(const Common::String &baseName) { // Only allow adding external tracks if a video is already loaded if (!isVideoLoaded()) return false; @@ -592,7 +571,7 @@ bool AdvancedVideoDecoder::addStreamFileTrack(const Common::String &baseName) { return result; } -void AdvancedVideoDecoder::setEndTime(const Audio::Timestamp &endTime) { +void VideoDecoder::setEndTime(const Audio::Timestamp &endTime) { Audio::Timestamp startTime = 0; if (isPlaying()) { @@ -615,21 +594,21 @@ void AdvancedVideoDecoder::setEndTime(const Audio::Timestamp &endTime) { } } -AdvancedVideoDecoder::Track *AdvancedVideoDecoder::getTrack(uint track) { +VideoDecoder::Track *VideoDecoder::getTrack(uint track) { if (track > _tracks.size()) return 0; return _tracks[track]; } -const AdvancedVideoDecoder::Track *AdvancedVideoDecoder::getTrack(uint track) const { +const VideoDecoder::Track *VideoDecoder::getTrack(uint track) const { if (track > _tracks.size()) return 0; return _tracks[track]; } -bool AdvancedVideoDecoder::endOfVideoTracks() const { +bool VideoDecoder::endOfVideoTracks() const { for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) if ((*it)->getTrackType() == Track::kTrackTypeVideo && !(*it)->endOfTrack()) return false; @@ -637,7 +616,7 @@ bool AdvancedVideoDecoder::endOfVideoTracks() const { return true; } -AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() { +VideoDecoder::VideoTrack *VideoDecoder::findNextVideoTrack() { VideoTrack *bestTrack = 0; uint32 bestTime = 0xFFFFFFFF; @@ -656,7 +635,7 @@ AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() { return bestTrack; } -const AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack() const { +const VideoDecoder::VideoTrack *VideoDecoder::findNextVideoTrack() const { const VideoTrack *bestTrack = 0; uint32 bestTime = 0xFFFFFFFF; @@ -675,7 +654,7 @@ const AdvancedVideoDecoder::VideoTrack *AdvancedVideoDecoder::findNextVideoTrack return bestTrack; } -void AdvancedVideoDecoder::startAudio() { +void VideoDecoder::startAudio() { if (_endTimeSet) { // HACK: Timestamp's subtraction asserts out when subtracting two times // with different rates. @@ -688,13 +667,13 @@ void AdvancedVideoDecoder::startAudio() { ((AudioTrack *)*it)->start(); } -void AdvancedVideoDecoder::stopAudio() { +void VideoDecoder::stopAudio() { for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) if ((*it)->getTrackType() == Track::kTrackTypeAudio) ((AudioTrack *)*it)->stop(); } -void AdvancedVideoDecoder::startAudioLimit(const Audio::Timestamp &limit) { +void VideoDecoder::startAudioLimit(const Audio::Timestamp &limit) { for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) if ((*it)->getTrackType() == Track::kTrackTypeAudio) ((AudioTrack *)*it)->start(limit); diff --git a/video/video_decoder.h b/video/video_decoder.h index d6cfcde0b4..abb9f8df20 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -48,7 +48,6 @@ namespace Video { /** * Generic interface for video decoder classes. - * @note This class is now deprecated in favor of AdvancedVideoDecoder. */ class VideoDecoder { public: @@ -77,53 +76,51 @@ public: /** * Close the active video stream and free any associated resources. */ - virtual void close() = 0; + virtual void close(); /** * Returns if a video stream is currently loaded or not. */ - virtual bool isVideoLoaded() const = 0; - - + bool isVideoLoaded() const; /** * Returns the width of the video's frames. * @return the width of the video's frames */ - virtual uint16 getWidth() const = 0; + virtual uint16 getWidth() const; /** * Returns the height of the video's frames. * @return the height of the video's frames */ - virtual uint16 getHeight() const = 0; + virtual uint16 getHeight() const; /** * Get the pixel format of the currently loaded video. */ - virtual Graphics::PixelFormat getPixelFormat() const = 0; + virtual Graphics::PixelFormat getPixelFormat() const; /** * Get the palette for the video in RGB format (if 8bpp or less). */ - virtual const byte *getPalette() { return 0; } + const byte *getPalette(); /** * Returns if the palette is dirty or not. */ - virtual bool hasDirtyPalette() const { return false; } + bool hasDirtyPalette() const { return _dirtyPalette; } /** * Returns the current frame number of the video. * @return the last frame decoded by the video */ - virtual int32 getCurFrame() const = 0; + int32 getCurFrame() const; /** * Returns the number of frames in the video. * @return the number of frames in the video */ - virtual uint32 getFrameCount() const = 0; + uint32 getFrameCount() const; /** * Returns the time position (in ms) of the current video. @@ -139,12 +136,12 @@ public: * completely accurate (since our mixer does not have precise * timing). */ - virtual uint32 getTime() const; + uint32 getTime() const; /** * Return the time (in ms) until the next frame should be displayed. */ - virtual uint32 getTimeToNextFrame() const = 0; + uint32 getTimeToNextFrame() const; /** * Check whether a new frame should be decoded, i.e. because enough @@ -160,13 +157,13 @@ public: * hence the caller must *not* free it. * @note this may return 0, in which case the last frame should be kept on screen */ - virtual const Graphics::Surface *decodeNextFrame() = 0; + virtual const Graphics::Surface *decodeNextFrame(); /** * Returns if the video has finished playing or not. * @return true if the video has finished playing or if none is loaded, false otherwise */ - virtual bool endOfVideo() const = 0; + bool endOfVideo() const; /** * Pause or resume the video. This should stop/resume any audio playback @@ -190,7 +187,7 @@ public: * Get the current volume at which the audio in the video is being played * @return the current volume at which the audio in the video is being played */ - virtual byte getVolume() const { return _audioVolume; } + byte getVolume() const { return _audioVolume; } /** * Set the volume at which the audio in the video should be played. @@ -201,13 +198,13 @@ public: * * @param volume The volume at which to play the audio in the video */ - virtual void setVolume(byte volume); + void setVolume(byte volume); /** * Get the current balance at which the audio in the video is being played * @return the current balance at which the audio in the video is being played */ - virtual int8 getBalance() const { return _audioBalance; } + int8 getBalance() const { return _audioBalance; } /** * Set the balance at which the audio in the video should be played. @@ -218,72 +215,8 @@ public: * * @param balance The balance at which to play the audio in the video */ - virtual void setBalance(int8 balance); - -protected: - /** - * Actual implementation of pause by subclasses. See pause() - * for details. - * @note This function is now deprecated. There is no replacement. - */ - virtual void pauseVideoIntern(bool pause) {} - - /** - * Reset the pause start time (which should be called when seeking) - */ - void resetPauseStartTime(); - - /** - * Update currently playing audio tracks with the new volume setting - * @note This function is now deprecated. There is no replacement. - */ - virtual void updateVolume() {} - - /** - * Update currently playing audio tracks with the new balance setting - * @note This function is now deprecated. There is no replacement. - */ - virtual void updateBalance() {} - - int32 _startTime; - -// FIXME: These are protected until the new API takes over this one -//private: - uint32 _pauseLevel; - uint32 _pauseStartTime; - byte _audioVolume; - int8 _audioBalance; -}; - -/** - * Improved interface for video decoder classes. - */ -class AdvancedVideoDecoder : public VideoDecoder { -public: - AdvancedVideoDecoder(); - virtual ~AdvancedVideoDecoder() {} - - // Old API Non-changing - // loadFile() - // loadStream() - // needsUpdate() - - // Old API Changing - virtual void close(); - bool isVideoLoaded() const; - virtual uint16 getWidth() const; - virtual uint16 getHeight() const; - virtual Graphics::PixelFormat getPixelFormat() const; - virtual const Graphics::Surface *decodeNextFrame(); - const byte *getPalette(); - bool hasDirtyPalette() const { return _dirtyPalette; } - int getCurFrame() const; - uint32 getFrameCount() const; - uint32 getTime() const; - uint32 getTimeToNextFrame() const; - bool endOfVideo() const; + void setBalance(int8 balance); - // New API /** * Returns if a video is rewindable or not. The default implementation * polls each track for rewindability. @@ -352,7 +285,7 @@ public: /** * Set the default high color format for videos that convert from YUV. * - * By default, AdvancedVideoDecoder will attempt to use the screen format + * By default, VideoDecoder will attempt to use the screen format * if it's >8bpp and use a 32bpp format when not. * * This must be set before calling loadStream(). @@ -375,13 +308,6 @@ public: //Common::Rational getRate() const; protected: - // Old API - void pauseVideoIntern(bool pause); - void updateVolume(); - void updateBalance(); - - // New API - /** * An abstract representation of a track in a movie. */ @@ -679,6 +605,11 @@ protected: Audio::SeekableAudioStream *getSeekableAudioStream() const { return _stream; } }; + /** + * Reset the pause start time (which should be called when seeking) + */ + void resetPauseStartTime(); + /** * Decode enough data for the next frame and enough audio to last that long. * @@ -756,7 +687,7 @@ protected: TrackListIterator getTrackListEnd() { return _tracks.end(); } private: - // Tracks owned by this AdvancedVideoDecoder + // Tracks owned by this VideoDecoder TrackList _tracks; // Current playback status @@ -775,6 +706,12 @@ private: void stopAudio(); void startAudio(); void startAudioLimit(const Audio::Timestamp &limit); + + int32 _startTime; + uint32 _pauseLevel; + uint32 _pauseStartTime; + byte _audioVolume; + int8 _audioBalance; }; } // End of namespace Video -- cgit v1.2.3 From e24fd2ffe66f17e0b5e3f58871ca22586cad757e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 16 Aug 2012 22:49:22 -0400 Subject: VIDEO: Cleanup VideoDecoder a bit Functions and their comments now line up better --- video/video_decoder.cpp | 8 +- video/video_decoder.h | 311 +++++++++++++++++++++++++++++------------------- 2 files changed, 193 insertions(+), 126 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index cf11649c10..14826642d7 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -413,6 +413,10 @@ Audio::Timestamp VideoDecoder::Track::getDuration() const { return Audio::Timestamp(0, 1000); } +bool VideoDecoder::VideoTrack::endOfTrack() const { + return getCurFrame() >= (getFrameCount() - 1); +} + uint32 VideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const { if (endOfTrack() || getCurFrame() < 0) return 0; @@ -422,10 +426,6 @@ uint32 VideoDecoder::FixedRateVideoTrack::getNextFrameStartTime() const { return time.toInt(); } -bool VideoDecoder::FixedRateVideoTrack::endOfTrack() const { - return getCurFrame() >= (getFrameCount() - 1); -} - Audio::Timestamp VideoDecoder::FixedRateVideoTrack::getDuration() const { // Since Audio::Timestamp doesn't support a fractional frame rate, we're currently // just converting to milliseconds. diff --git a/video/video_decoder.h b/video/video_decoder.h index abb9f8df20..5fba85358c 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -54,10 +54,14 @@ public: VideoDecoder(); virtual ~VideoDecoder() {} + ///////////////////////////////////////// + // Opening/Closing a Video + ///////////////////////////////////////// + /** * Load a video from a file with the given name. * - * A default implementation using loadStream is provided. + * A default implementation using Common::File and loadStream is provided. * * @param filename the filename to load * @return whether loading the file succeeded @@ -68,6 +72,10 @@ public: * Load a video from a generic read stream. The ownership of the * stream object transfers to this VideoDecoder instance, which is * hence also responsible for eventually deleting it. + * + * Implementations of this function are required to call addTrack() + * for each track in the video upon success. + * * @param stream the stream to load * @return whether loading the stream succeeded */ @@ -75,6 +83,9 @@ public: /** * Close the active video stream and free any associated resources. + * + * All subclasses that need to close their own resources should still + * call the base class' close() function at the start of their function. */ virtual void close(); @@ -83,87 +94,66 @@ public: */ bool isVideoLoaded() const; - /** - * Returns the width of the video's frames. - * @return the width of the video's frames - */ - virtual uint16 getWidth() const; - - /** - * Returns the height of the video's frames. - * @return the height of the video's frames - */ - virtual uint16 getHeight() const; - /** - * Get the pixel format of the currently loaded video. - */ - virtual Graphics::PixelFormat getPixelFormat() const; + ///////////////////////////////////////// + // Playback Control + ///////////////////////////////////////// /** - * Get the palette for the video in RGB format (if 8bpp or less). + * Begin playback of the video. + * + * @note This has no effect is the video is already playing. */ - const byte *getPalette(); + void start(); /** - * Returns if the palette is dirty or not. + * Stop playback of the video. + * + * @note This will close() the video if it is not rewindable. + * @note If the video is rewindable, the video will be rewound on the + * next start() call unless rewind() or seek() is called before then. */ - bool hasDirtyPalette() const { return _dirtyPalette; } + void stop(); /** - * Returns the current frame number of the video. - * @return the last frame decoded by the video + * Returns if the video is currently playing or not. + * @todo Differentiate this function from endOfVideo() */ - int32 getCurFrame() const; + bool isPlaying() const { return _isPlaying; } /** - * Returns the number of frames in the video. - * @return the number of frames in the video + * Returns if a video is rewindable or not. The default implementation + * polls each track for rewindability. */ - uint32 getFrameCount() const; + virtual bool isRewindable() const; /** - * Returns the time position (in ms) of the current video. - * This can be based on the "wall clock" time as determined by - * OSystem::getMillis() or the current time of any audio track - * running in the video, and takes pausing the video into account. + * Rewind a video to its beginning. * - * As such, it will differ from what multiplying getCurFrame() by - * some constant would yield, e.g. for a video with non-constant - * frame rate. + * If the video is playing, it will continue to play. The default + * implementation will rewind each track. * - * Due to the nature of the timing, this value may not always be - * completely accurate (since our mixer does not have precise - * timing). - */ - uint32 getTime() const; - - /** - * Return the time (in ms) until the next frame should be displayed. - */ - uint32 getTimeToNextFrame() const; - - /** - * Check whether a new frame should be decoded, i.e. because enough - * time has elapsed since the last frame was decoded. - * @return whether a new frame should be decoded or not + * @return true on success, false otherwise */ - virtual bool needsUpdate() const; + virtual bool rewind(); /** - * Decode the next frame into a surface and return the latter. - * @return a surface containing the decoded frame, or 0 - * @note Ownership of the returned surface stays with the VideoDecoder, - * hence the caller must *not* free it. - * @note this may return 0, in which case the last frame should be kept on screen + * Returns if a video is seekable or not. The default implementation + * polls each track for seekability. */ - virtual const Graphics::Surface *decodeNextFrame(); + virtual bool isSeekable() const; /** - * Returns if the video has finished playing or not. - * @return true if the video has finished playing or if none is loaded, false otherwise + * Seek to a given time in the video. + * + * If the video is playing, it will continue to play. The default + * implementation will seek each track and must still be called + * from any other implementation. + * + * @param time The time to seek to + * @return true on success, false otherwise */ - bool endOfVideo() const; + virtual bool seek(const Audio::Timestamp &time); /** * Pause or resume the video. This should stop/resume any audio playback @@ -184,103 +174,141 @@ public: bool isPaused() const { return _pauseLevel != 0; } /** - * Get the current volume at which the audio in the video is being played - * @return the current volume at which the audio in the video is being played + * Set the time for this video to end at. At this time in the video, + * all audio will stop and endOfVideo() will return true. */ - byte getVolume() const { return _audioVolume; } + void setEndTime(const Audio::Timestamp &endTime); /** - * Set the volume at which the audio in the video should be played. - * This setting remains until reset() is called (which may be called - * from loadStream() or close()). The default volume is the maximum. - * - * @note This function calls updateVolume() by default. - * - * @param volume The volume at which to play the audio in the video + * Get the stop time of the video (if not set, zero) */ - void setVolume(byte volume); + Audio::Timestamp getEndTime() const { return _endTime; } + + + ///////////////////////////////////////// + // Playback Status + ///////////////////////////////////////// /** - * Get the current balance at which the audio in the video is being played - * @return the current balance at which the audio in the video is being played + * Returns if the video has reached the end or not. + * @return true if the video has finished playing or if none is loaded, false otherwise */ - int8 getBalance() const { return _audioBalance; } + bool endOfVideo() const; /** - * Set the balance at which the audio in the video should be played. - * This setting remains until reset() is called (which may be called - * from loadStream() or close()). The default balance is 0. - * - * @note This function calls updateBalance() by default. - * - * @param balance The balance at which to play the audio in the video + * Returns the current frame number of the video. + * @return the last frame decoded by the video */ - void setBalance(int8 balance); + int32 getCurFrame() const; /** - * Returns if a video is rewindable or not. The default implementation - * polls each track for rewindability. + * Returns the number of frames in the video. + * @return the number of frames in the video */ - virtual bool isRewindable() const; + uint32 getFrameCount() const; /** - * Rewind a video to its beginning. + * Returns the time position (in ms) of the current video. + * This can be based on the "wall clock" time as determined by + * OSystem::getMillis() or the current time of any audio track + * running in the video, and takes pausing the video into account. * - * If the video is playing, it will continue to play. The default - * implementation will rewind each track. + * As such, it will differ from what multiplying getCurFrame() by + * some constant would yield, e.g. for a video with non-constant + * frame rate. * - * @return true on success, false otherwise + * Due to the nature of the timing, this value may not always be + * completely accurate (since our mixer does not have precise + * timing). */ - virtual bool rewind(); + uint32 getTime() const; + + + ///////////////////////////////////////// + // Video Info + ///////////////////////////////////////// /** - * Returns if a video is seekable or not. The default implementation - * polls each track for seekability. + * Returns the width of the video's frames. + * + * By default, this finds the largest width between all of the loaded + * tracks. However, a subclass may override this if it does any kind + * of post-processing on it. + * + * @return the width of the video's frames */ - virtual bool isSeekable() const; + virtual uint16 getWidth() const; /** - * Seek to a given time in the video. + * Returns the height of the video's frames. * - * If the video is playing, it will continue to play. The default - * implementation will seek each track. + * By default, this finds the largest height between all of the loaded + * tracks. However, a subclass may override this if it does any kind + * of post-processing on it. * - * @param time The time to seek to - * @return true on success, false otherwise + * @return the height of the video's frames */ - virtual bool seek(const Audio::Timestamp &time); + virtual uint16 getHeight() const; /** - * Begin playback of the video. + * Get the pixel format of the currently loaded video. + */ + Graphics::PixelFormat getPixelFormat() const; + + /** + * Get the duration of the video. * - * @note This has no effect is the video is already playing. + * If the duration is unknown, this will return 0. If this is not + * overriden, it will take the length of the longest track. */ - void start(); + virtual Audio::Timestamp getDuration() const; + + + ///////////////////////////////////////// + // Frame Decoding + ///////////////////////////////////////// /** - * Stop playback of the video. + * Get the palette for the video in RGB format (if 8bpp or less). * - * @note This will close() the video if it is not rewindable. + * The palette's format is the same as PaletteManager's palette + * (interleaved RGB values). */ - void stop(); + const byte *getPalette(); /** - * Returns if the video is currently playing or not. - * @todo Differentiate this function from endOfVideo() + * Returns if the palette is dirty or not. */ - bool isPlaying() const { return _isPlaying; } + bool hasDirtyPalette() const { return _dirtyPalette; } /** - * Get the duration of the video. - * - * If the duration is unknown, this will return 0. + * Return the time (in ms) until the next frame should be displayed. */ - virtual Audio::Timestamp getDuration() const; + uint32 getTimeToNextFrame() const; /** - * Add an audio track from a stream file. + * Check whether a new frame should be decoded, i.e. because enough + * time has elapsed since the last frame was decoded. + * @return whether a new frame should be decoded or not */ - bool addStreamFileTrack(const Common::String &baseName); + bool needsUpdate() const; + + /** + * Decode the next frame into a surface and return the latter. + * + * A subclass may override this, but must still call this function. As an + * example, a subclass may do this to apply some global video scale to + * individual track's frame. + * + * Note that this will call readNextPacket() internally first before calling + * the next video track's decodeNextFrame() function. + * + * @return a surface containing the decoded frame, or 0 + * @note Ownership of the returned surface stays with the VideoDecoder, + * hence the caller must *not* free it. + * @note this may return 0, in which case the last frame should be kept on screen + */ + virtual const Graphics::Surface *decodeNextFrame(); /** * Set the default high color format for videos that convert from YUV. @@ -292,16 +320,48 @@ public: */ void setDefaultHighColorFormat(const Graphics::PixelFormat &format) { _defaultHighColorFormat = format; } + + ///////////////////////////////////////// + // Audio Control + ///////////////////////////////////////// + /** - * Set the time for this video to end at. At this time in the video, - * all audio will stop and endOfVideo() will return true. + * Get the current volume at which the audio in the video is being played + * @return the current volume at which the audio in the video is being played */ - void setEndTime(const Audio::Timestamp &endTime); + byte getVolume() const { return _audioVolume; } /** - * Get the stop time of the video (if not set, zero) + * Set the volume at which the audio in the video should be played. + * This setting remains until close() is called (which may be called + * from loadStream()). The default volume is the maximum. + * + * @param volume The volume at which to play the audio in the video */ - Audio::Timestamp getEndTime() const { return _endTime; } + void setVolume(byte volume); + + /** + * Get the current balance at which the audio in the video is being played + * @return the current balance at which the audio in the video is being played + */ + int8 getBalance() const { return _audioBalance; } + + /** + * Set the balance at which the audio in the video should be played. + * This setting remains until close() is called (which may be called + * from loadStream()). The default balance is 0. + * + * @param balance The balance at which to play the audio in the video + */ + void setBalance(int8 balance); + + /** + * Add an audio track from a stream file. + * + * This calls SeekableAudioStream::openStreamFile() internally + */ + bool addStreamFileTrack(const Common::String &baseName); + // Future API //void setRate(const Common::Rational &rate); @@ -337,11 +397,18 @@ protected: /** * Return if the track is rewindable. + * + * If a video is seekable, it does not need to implement this + * for it to also be rewindable. */ virtual bool isRewindable() const; /** * Rewind the video to the beginning. + * + * If a video is seekable, it does not need to implement this + * for it to also be rewindable. + * * @return true on success, false otherwise. */ virtual bool rewind(); @@ -394,6 +461,7 @@ protected: virtual ~VideoTrack() {} TrackType getTrackType() const { return kTrackTypeVideo; } + virtual bool endOfTrack() const; /** * Get the width of this track @@ -458,7 +526,6 @@ protected: FixedRateVideoTrack() {} virtual ~FixedRateVideoTrack() {} - virtual bool endOfTrack() const; uint32 getNextFrameStartTime() const; virtual Audio::Timestamp getDuration() const; @@ -540,7 +607,7 @@ protected: /** * An AudioTrack that implements isRewindable() and rewind() using - * the RewindableAudioStream API. + * RewindableAudioStream. */ class RewindableAudioTrack : public AudioTrack { public: @@ -562,7 +629,7 @@ protected: /** * An AudioTrack that implements isSeekable() and seek() using - * the SeekableAudioStream API. + * SeekableAudioStream. */ class SeekableAudioTrack : public AudioTrack { public: @@ -613,7 +680,7 @@ protected: /** * Decode enough data for the next frame and enough audio to last that long. * - * This function is used by the default decodeNextFrame() function. A subclass + * This function is used by the decodeNextFrame() function. A subclass * of a Track may decide to just have its decodeNextFrame() function read * and decode the frame. */ @@ -629,7 +696,7 @@ protected: /** * Whether or not getTime() will sync with a playing audio track. * - * A subclass should override this to disable this feature. + * A subclass can override this to disable this feature. */ virtual bool useAudioSync() const { return true; } -- cgit v1.2.3 From da9695ddc6a46c709753026055d6060746006c2c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 17 Aug 2012 23:31:26 -0400 Subject: AGOS: Fix regressions in the feeble demo --- engines/agos/animation.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp index 10f274b37f..cf12ee120a 100644 --- a/engines/agos/animation.cpp +++ b/engines/agos/animation.cpp @@ -268,6 +268,10 @@ void MoviePlayerDXA::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { uint w = getWidth(); const Graphics::Surface *surface = decodeNextFrame(); + + if (!surface) + return; + byte *src = (byte *)surface->pixels; dst += y * pitch + x; @@ -289,6 +293,8 @@ void MoviePlayerDXA::playVideo() { _vm->clearSurfaces(); } + start(); + while (!endOfVideo() && !_skipMovie && !_vm->shouldQuit()) handleNextFrame(); } @@ -421,8 +427,6 @@ bool MoviePlayerSMK::load() { if (!loadStream(videoStream)) error("Failed to load video stream from file %s", videoName.c_str()); - start(); - debug(0, "Playing video %s", videoName.c_str()); CursorMan.showMouse(false); @@ -435,6 +439,10 @@ void MoviePlayerSMK::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { uint w = getWidth(); const Graphics::Surface *surface = decodeNextFrame(); + + if (!surface) + return; + byte *src = (byte *)surface->pixels; dst += y * pitch + x; @@ -449,6 +457,8 @@ void MoviePlayerSMK::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { } void MoviePlayerSMK::playVideo() { + start(); + while (!endOfVideo() && !_skipMovie && !_vm->shouldQuit()) handleNextFrame(); } @@ -491,7 +501,7 @@ bool MoviePlayerSMK::processFrame() { uint32 waitTime = getTimeToNextFrame(); - if (!waitTime) { + if (!waitTime && !endOfVideoTracks()) { warning("dropped frame %i", getCurFrame()); return false; } -- cgit v1.2.3 From 7af4e403042c9d67c6f00bb151225cee6abc5e0d Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 18 Aug 2012 10:22:54 -0400 Subject: AGOS: Fix regression with sound in Smacker OmniTV videos --- engines/agos/animation.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp index cf12ee120a..9176412e0e 100644 --- a/engines/agos/animation.cpp +++ b/engines/agos/animation.cpp @@ -293,8 +293,6 @@ void MoviePlayerDXA::playVideo() { _vm->clearSurfaces(); } - start(); - while (!endOfVideo() && !_skipMovie && !_vm->shouldQuit()) handleNextFrame(); } @@ -305,6 +303,8 @@ void MoviePlayerDXA::stopVideo() { } void MoviePlayerDXA::startSound() { + start(); + if (_bgSoundStream != NULL) { _vm->_mixer->stopHandle(_bgSound); _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream, -1, getVolume(), getBalance()); @@ -457,8 +457,6 @@ void MoviePlayerSMK::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { } void MoviePlayerSMK::playVideo() { - start(); - while (!endOfVideo() && !_skipMovie && !_vm->shouldQuit()) handleNextFrame(); } @@ -468,6 +466,7 @@ void MoviePlayerSMK::stopVideo() { } void MoviePlayerSMK::startSound() { + start(); } void MoviePlayerSMK::handleNextFrame() { -- cgit v1.2.3 From 8524ebd699254a6786033f0e41b9a45c563feb11 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 20 Aug 2012 02:58:37 +0300 Subject: SCI: Fix script bug #3555404 - "SCI: KQ6 Spider Scene Game Freeze" --- engines/sci/sound/soundcmd.cpp | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index cbb5cab4fe..1570e360e8 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -367,29 +367,36 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { case 4: // SCI01+ case 5: // SCI1+ (SCI1 late sound scheme), with fade and continue - musicSlot->fadeTo = CLIP(argv[1].toUint16(), 0, MUSIC_VOLUME_MAX); - // Check if the song is already at the requested volume. If it is, don't - // perform any fading. Happens for example during the intro of Longbow. - if (musicSlot->fadeTo == musicSlot->volume) - return acc; - - // sometimes we get objects in that position, fix it up (ffs. workarounds) - if (!argv[1].getSegment()) - musicSlot->fadeStep = volume > musicSlot->fadeTo ? -argv[3].toUint16() : argv[3].toUint16(); - else - musicSlot->fadeStep = volume > musicSlot->fadeTo ? -5 : 5; - musicSlot->fadeTickerStep = argv[2].toUint16() * 16667 / _music->soundGetTempo(); - musicSlot->fadeTicker = 0; - if (argc == 5) { // TODO: We currently treat this argument as a boolean, but may // have to handle different non-zero values differently. (e.g., - // some KQ6 scripts pass 3 here) - musicSlot->stopAfterFading = (argv[4].toUint16() != 0); + // some KQ6 scripts pass 3 here). + // There is a script bug in KQ6, room 460 (the room with the flying + // books). An object is passed here, which should not be treated as + // a true flag. Fixes bugs #3555404 and #3291115. + musicSlot->stopAfterFading = (argv[4].isNumber() && argv[4].toUint16() != 0); } else { musicSlot->stopAfterFading = false; } + musicSlot->fadeTo = CLIP(argv[1].toUint16(), 0, MUSIC_VOLUME_MAX); + // Check if the song is already at the requested volume. If it is, don't + // perform any fading. Happens for example during the intro of Longbow. + if (musicSlot->fadeTo != musicSlot->volume) { + // sometimes we get objects in that position, fix it up (ffs. workarounds) + if (!argv[1].getSegment()) + musicSlot->fadeStep = volume > musicSlot->fadeTo ? -argv[3].toUint16() : argv[3].toUint16(); + else + musicSlot->fadeStep = volume > musicSlot->fadeTo ? -5 : 5; + musicSlot->fadeTickerStep = argv[2].toUint16() * 16667 / _music->soundGetTempo(); + } else { + // Stop the music, if requested. Fixes bug #3555404. + if (musicSlot->stopAfterFading) + processStopSound(obj, false); + } + + musicSlot->fadeTicker = 0; + // WORKAROUND/HACK: In the labyrinth in KQ6, when falling in the pit and // lighting the lantern, the game scripts perform a fade in of the game // music, but set it to stop after fading. Remove that flag here. This is -- cgit v1.2.3 From b19ccb9d1edcdf238727f0c3b0a731b2f00e9d3d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 20 Aug 2012 03:22:56 +0300 Subject: SCI: Set the correct audio type for SCI1.1 sound effects, fixing bug #3554709 Now, sound effects in SCI1.1 games will no longer be incorrectly using the speech sound volume. This avoids them being silenced in floppy games that are flagged as not having speech. Fixes bug #3554709 - "SCI: Digital SFX don't play when Override Global Audio set" --- engines/sci/sound/audio.cpp | 3 ++- engines/sci/sound/soundcmd.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 123dd21894..528bb51393 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -67,7 +67,8 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) { if (audioStream) { _wPlayFlag = false; - _mixer->playStream(Audio::Mixer::kSpeechSoundType, &_audioHandle, audioStream); + Audio::Mixer::SoundType soundType = (module == 65535) ? Audio::Mixer::kSFXSoundType : Audio::Mixer::kSpeechSoundType; + _mixer->playStream(soundType, &_audioHandle, audioStream); return sampleLen; } else { // Don't throw a warning in this case. getAudioStream() already has. Some games diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 1570e360e8..5d32f40f18 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -96,7 +96,7 @@ void SoundCommandParser::initSoundResource(MusicEntry *newSound) { if (_useDigitalSFX || !newSound->soundRes) { int sampleLen; newSound->pStreamAud = _audio->getAudioStream(newSound->resourceId, 65535, &sampleLen); - newSound->soundType = Audio::Mixer::kSpeechSoundType; + newSound->soundType = Audio::Mixer::kSFXSoundType; } } -- cgit v1.2.3 From 23db3cd9f225d40ff1900dd806630800ecf54aeb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 20 Aug 2012 03:28:02 +0300 Subject: SAGA: Remove incorrect free() in loadShortenFromStream() This removes a warning and fixes bug #3558052 - "SAGA: use-after-free warning" --- engines/saga/shorten.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/saga/shorten.cpp b/engines/saga/shorten.cpp index 5efc8d1f67..69c27b6a6b 100644 --- a/engines/saga/shorten.cpp +++ b/engines/saga/shorten.cpp @@ -519,9 +519,6 @@ byte *loadShortenFromStream(Common::ReadStream &stream, int &size, int &rate, by if (maxLPC > 0) free(lpc); - if (size > 0) - free(unpackedBuffer); - delete gReader; return unpackedBuffer; } -- cgit v1.2.3 From eccb55570e3ed27276573b23093ffedcf3e794cc Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 19 Aug 2012 20:40:03 -0400 Subject: BUILD: Fix statically compiling with libfluidsynth on Mac OS X --- configure | 2 +- ports.mk | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/configure b/configure index d4fec02c64..211d9e6e8d 100755 --- a/configure +++ b/configure @@ -3363,7 +3363,7 @@ if test "$_fluidsynth" = yes ; then esac INCLUDES="$INCLUDES $FLUIDSYNTH_CFLAGS" fi -define_in_config_h_if_yes "$_fluidsynth" 'USE_FLUIDSYNTH' +define_in_config_if_yes "$_fluidsynth" 'USE_FLUIDSYNTH' echo "$_fluidsynth" # diff --git a/ports.mk b/ports.mk index 9a20331924..ed6781a1a9 100644 --- a/ports.mk +++ b/ports.mk @@ -96,6 +96,12 @@ ifdef USE_FLAC OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libFLAC.a endif +ifdef USE_FLUIDSYNTH +OSX_STATIC_LIBS += \ + -framework CoreAudio \ + $(STATICLIBPATH)/lib/libfluidsynth.a +endif + ifdef USE_MAD OSX_STATIC_LIBS += $(STATICLIBPATH)/lib/libmad.a endif -- cgit v1.2.3 From bd6751cb4a2cb5f34697392a82e8d5ab35a6a006 Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Fri, 17 Aug 2012 21:38:20 -0700 Subject: CINE: Fix drawing of sprite with mask. Protects against cases where a non-existing script is referenced. --- engines/cine/gfx.cpp | 6 ++++++ engines/cine/script_fw.cpp | 17 +++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index cce8154d84..7a988227f6 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -1796,6 +1796,12 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi if(pMask) { spritePtr = pMask; } + + // ignore transparent color in 1bpp + if (bpp == 1) { + transparentColor = 1; + } + { for (int i = 0; i < height; i++) { byte *destPtr = page + x + y * 320; diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp index a34bf7ba2c..9cbe3c3fab 100644 --- a/engines/cine/script_fw.cpp +++ b/engines/cine/script_fw.cpp @@ -533,7 +533,6 @@ void RawScript::setData(const FWScriptInfo &info, const byte *data) { * @return Precalculated script labels */ const ScriptVars &RawScript::labels() const { - assert(_data); return _labels; } @@ -687,7 +686,7 @@ const char *FWScript::getNextString() { * @param pos Restored script position */ void FWScript::load(const ScriptVars &labels, const ScriptVars &local, uint16 compare, uint16 pos) { - assert(pos < _script._size); + assert(pos <= _script._size); _labels = labels; _localVars = local; _compare = compare; @@ -705,13 +704,15 @@ void FWScript::load(const ScriptVars &labels, const ScriptVars &local, uint16 co int FWScript::execute() { int ret = 0; - while (!ret) { - _line = _pos; - byte opcode = getNextByte(); - OpFunc handler = _info->opcodeHandler(opcode); + if(_script._size) { + while (!ret) { + _line = _pos; + byte opcode = getNextByte(); + OpFunc handler = _info->opcodeHandler(opcode); - if (handler) { - ret = (this->*handler)(); + if (handler) { + ret = (this->*handler)(); + } } } -- cgit v1.2.3 From b1af75f2c38e1997577599308f75ee0d1299b13e Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Mon, 20 Aug 2012 21:10:40 +0200 Subject: SWORD25: Improve sound persistence. Keep track of volume/panning state, and don't restart sounds which already finished playing. --- engines/sword25/sfx/soundengine.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/engines/sword25/sfx/soundengine.cpp b/engines/sword25/sfx/soundengine.cpp index 78b2db19eb..69fae3dc4e 100644 --- a/engines/sword25/sfx/soundengine.cpp +++ b/engines/sword25/sfx/soundengine.cpp @@ -239,16 +239,20 @@ void SoundEngine::setSoundVolume(uint handle, float volume) { debugC(1, kDebugSound, "SoundEngine::setSoundVolume(%d, %f)", handle, volume); SndHandle* sndHandle = findHandle(handle); - if (sndHandle != NULL) + if (sndHandle != NULL) { + sndHandle->volume = volume; _mixer->setChannelVolume(sndHandle->handle, (byte)(volume * 255)); + } } void SoundEngine::setSoundPanning(uint handle, float pan) { debugC(1, kDebugSound, "SoundEngine::setSoundPanning(%d, %f)", handle, pan); SndHandle* sndHandle = findHandle(handle); - if (sndHandle != NULL) + if (sndHandle != NULL) { + sndHandle->pan = pan; _mixer->setChannelBalance(sndHandle->handle, (int8)(pan * 127)); + } } void SoundEngine::pauseSound(uint handle) { @@ -324,13 +328,16 @@ bool SoundEngine::canLoadResource(const Common::String &fileName) { return fname.hasSuffix(".ogg"); } - - bool SoundEngine::persist(OutputPersistenceBlock &writer) { +bool SoundEngine::persist(OutputPersistenceBlock &writer) { writer.write(_maxHandleId); for (uint i = 0; i < SOUND_HANDLES; i++) { writer.write(_handles[i].id); + // Don't restart sounds which already finished playing. + if (_handles[i].type != kFreeHandle && !_mixer->isSoundHandleActive(_handles[i].handle)) + _handles[i].type = kFreeHandle; + writer.writeString(_handles[i].fileName); writer.write((int)_handles[i].sndType); writer.write(_handles[i].volume); @@ -374,7 +381,8 @@ bool SoundEngine::unpersist(InputPersistenceBlock &reader) { reader.read(layer); if (reader.isGood()) { - playSoundEx(fileName, (SOUND_TYPES)sndType, volume, pan, loop, loopStart, loopEnd, layer, i); + if (sndType != kFreeHandle) + playSoundEx(fileName, (SOUND_TYPES)sndType, volume, pan, loop, loopStart, loopEnd, layer, i); } else return false; } -- cgit v1.2.3 From af05b1b80edfc8674845d6e42c9872fea9eeb381 Mon Sep 17 00:00:00 2001 From: Einar Johan Trøan Sømåen Date: Sun, 12 Aug 2012 23:50:25 +0200 Subject: GRAPHICS: Reimplement the PNG-decoder using libpng --- configure | 2 +- graphics/decoders/png.cpp | 578 +++++++++++++--------------------------------- graphics/decoders/png.h | 78 +------ 3 files changed, 160 insertions(+), 498 deletions(-) diff --git a/configure b/configure index 06492ff305..f98c1c9ff2 100755 --- a/configure +++ b/configure @@ -97,7 +97,7 @@ _sndio=auto _timidity=auto _zlib=auto _sparkle=auto -_png=no +_png=auto _theoradec=auto _faad=auto _fluidsynth=auto diff --git a/graphics/decoders/png.cpp b/graphics/decoders/png.cpp index 492c69779f..f0471899a6 100644 --- a/graphics/decoders/png.cpp +++ b/graphics/decoders/png.cpp @@ -19,87 +19,23 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ +#define FORBIDDEN_SYMBOL_ALLOW_ALL +#include "common/scummsys.h" + +#ifdef USE_PNG +#include +#endif #include "graphics/decoders/png.h" #include "graphics/pixelformat.h" #include "graphics/surface.h" -#include "common/endian.h" -#include "common/memstream.h" #include "common/stream.h" -#include "common/types.h" -#include "common/util.h" -#include "common/zlib.h" - -// PNG decoder, based on the W3C specs: -// http://www.w3.org/TR/PNG/ -// Parts of the code have been adapted from LodePNG, by Lode Vandevenne: -// http://members.gamedev.net/lode/projects/LodePNG/ - -/* -LodePNG version 20101211 - -Copyright (c) 2005-2010 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ namespace Graphics { -enum PNGChunks { - // == Critical chunks ===================================================== - kChunkIHDR = MKTAG('I','H','D','R'), // Image header - kChunkIDAT = MKTAG('I','D','A','T'), // Image data - kChunkPLTE = MKTAG('P','L','T','E'), // Palette - kChunkIEND = MKTAG('I','E','N','D'), // Image trailer - // == Ancillary chunks ==================================================== - kChunktRNS = MKTAG('t','R','N','S') // Transparency - // All of the other ancillary chunks are ignored. They're added here for - // reference only. - // cHRM - Primary chromacities and white point - // gAMA - Image gamma - // iCCP - Embedded ICC profile - // sBIT - Significant bits - // sRGB - Standard RGB color space - // tEXT - Textual data - // sTXt - Compressed textual data - // iTXt - International textual data - // bKGD - Background color - // hIST - Image histogram - // pHYs - Physical pixel dimensions - // sPLT - Suggested palette - // tIME - Image last-modification time -}; - -// Refer to http://www.w3.org/TR/PNG/#9Filters -enum PNGFilters { - kFilterNone = 0, - kFilterSub = 1, - kFilterUp = 2, - kFilterAverage = 3, - kFilterPaeth = 4 -}; - -PNGDecoder::PNGDecoder() : _compressedBuffer(0), _compressedBufferSize(0), - _transparentColorSpecified(false), _outputSurface(0), _paletteEntries(0) { +PNGDecoder::PNGDecoder() : _outputSurface(0), _palette(0), _paletteColorCount(0) { } PNGDecoder::~PNGDecoder() { @@ -112,16 +48,43 @@ void PNGDecoder::destroy() { delete _outputSurface; _outputSurface = 0; } + delete[] _palette; + _palette = NULL; +} + +#ifdef USE_PNG +// libpng-error-handling: +void pngError(png_structp pngptr, png_const_charp errorMsg) { + error("%s", errorMsg); +} - _paletteEntries = 0; +void pngWarning(png_structp pngptr, png_const_charp warningMsg) { + warning("%s", warningMsg); } +// libpng-I/O-helper: +void pngReadFromStream(png_structp pngPtr, png_bytep data, png_size_t length) { + void *readIOptr = png_get_io_ptr(pngPtr); + Common::SeekableReadStream *stream = (Common::SeekableReadStream *)readIOptr; + stream->read(data, length); +} +#endif + +/* + * This code is based on Broken Sword 2.5 engine + * + * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer + * + * Licensed under GNU GPL v2 + * + */ + bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { +#ifdef USE_PNG destroy(); - uint32 chunkLength = 0, chunkType = 0; _stream = &stream; - + // First, check the PNG signature if (_stream->readUint32BE() != MKTAG(0x89, 'P', 'N', 'G')) { delete _stream; @@ -132,374 +95,143 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { return false; } - // Start reading chunks till we reach an IEND chunk - while (chunkType != kChunkIEND) { - // The chunk length does not include the type or CRC bytes - chunkLength = _stream->readUint32BE(); - chunkType = _stream->readUint32BE(); - - switch (chunkType) { - case kChunkIHDR: - readHeaderChunk(); - break; - case kChunkIDAT: - if (_compressedBufferSize == 0) { - _compressedBufferSize += chunkLength; - _compressedBuffer = (byte *)malloc(_compressedBufferSize); - _stream->read(_compressedBuffer, chunkLength); - } else { - // Expand the buffer - uint32 prevSize = _compressedBufferSize; - _compressedBufferSize += chunkLength; - byte *tmp = new byte[prevSize]; - memcpy(tmp, _compressedBuffer, prevSize); - free(_compressedBuffer); - _compressedBuffer = (byte *)malloc(_compressedBufferSize); - memcpy(_compressedBuffer, tmp, prevSize); - delete[] tmp; - _stream->read(_compressedBuffer + prevSize, chunkLength); - } - break; - case kChunkPLTE: // only available in indexed PNGs - if (_header.colorType != kIndexed) - error("A palette chunk has been found in a non-indexed PNG file"); - if (chunkLength % 3 != 0) - error("Palette chunk not divisible by 3"); - - _paletteEntries = chunkLength / 3; - _stream->read(_palette, _paletteEntries * 3); - memset(_paletteTransparency, 0xff, sizeof(_paletteTransparency)); - break; - case kChunkIEND: - // End of stream - break; - case kChunktRNS: - readTransparencyChunk(chunkLength); - break; - default: - // Skip the chunk content - _stream->skip(chunkLength); - break; - } - - if (chunkType != kChunkIEND) - _stream->skip(4); // skip the chunk CRC checksum + // The following is based on the guide provided in: + //http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3 + //http://www.libpng.org/pub/png/libpng-1.4.0-manual.pdf + // along with the png-loading code used in the sword25-engine. + png_structp pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!pngPtr) { + delete _stream; + return false; } - - // We no longer need the file stream, thus close it here - _stream = 0; - - // Unpack the compressed buffer - Common::MemoryReadStream *compData = new Common::MemoryReadStream(_compressedBuffer, _compressedBufferSize, DisposeAfterUse::YES); - _imageData = Common::wrapCompressedReadStream(compData); - - // Construct the final image - constructImage(); - - // Close the uncompressed stream, which will also delete the memory stream, - // and thus the original compressed buffer - delete _imageData; - - return true; -} - -/** - * Paeth predictor, used by PNG filter type 4 - * The parameters are of signed 16-bit integers, but should come - * from unsigned chars. The integers are only needed to make - * the paeth calculation correct. - * - * Taken from lodePNG, with a slight patch: - * http://www.atalasoft.com/cs/blogs/stevehawley/archive/2010/02/23/libpng-you-re-doing-it-wrong.aspx - */ -byte PNGDecoder::paethPredictor(int16 a, int16 b, int16 c) { - int16 pa = ABS(b - c); - int16 pb = ABS(a - c); - int16 pc = ABS(a + b - c - c); - - if (pa <= MIN(pb, pc)) - return (byte)a; - else if (pb <= pc) - return (byte)b; - else - return (byte)c; -} - -/** - * Unfilters a filtered PNG scan line. - * PNG filters are defined in: http://www.w3.org/TR/PNG/#9Filters - * Note that filters are always applied to bytes - * - * Taken from lodePNG - */ -void PNGDecoder::unfilterScanLine(byte *dest, const byte *scanLine, const byte *prevLine, uint16 byteWidth, byte filterType, uint16 length) { - uint16 i; - - switch (filterType) { - case kFilterNone: // no change - for (i = 0; i < length; i++) - dest[i] = scanLine[i]; - break; - case kFilterSub: // add the bytes to the left - for (i = 0; i < byteWidth; i++) - dest[i] = scanLine[i]; - for (i = byteWidth; i < length; i++) - dest[i] = scanLine[i] + dest[i - byteWidth]; - break; - case kFilterUp: // add the bytes of the above scanline - if (prevLine) { - for (i = 0; i < length; i++) - dest[i] = scanLine[i] + prevLine[i]; - } else { - for (i = 0; i < length; i++) - dest[i] = scanLine[i]; - } - break; - case kFilterAverage: // average value of the left and top left - if (prevLine) { - for (i = 0; i < byteWidth; i++) - dest[i] = scanLine[i] + prevLine[i] / 2; - for (i = byteWidth; i < length; i++) - dest[i] = scanLine[i] + ((dest[i - byteWidth] + prevLine[i]) / 2); - } else { - for (i = 0; i < byteWidth; i++) - dest[i] = scanLine[i]; - for (i = byteWidth; i < length; i++) - dest[i] = scanLine[i] + dest[i - byteWidth] / 2; - } - break; - case kFilterPaeth: // Paeth filter: http://www.w3.org/TR/PNG/#9Filter-type-4-Paeth - if (prevLine) { - for(i = 0; i < byteWidth; i++) - dest[i] = (scanLine[i] + prevLine[i]); // paethPredictor(0, prevLine[i], 0) is always prevLine[i] - for(i = byteWidth; i < length; i++) - dest[i] = (scanLine[i] + paethPredictor(dest[i - byteWidth], prevLine[i], prevLine[i - byteWidth])); - } else { - for(i = 0; i < byteWidth; i++) - dest[i] = scanLine[i]; - for(i = byteWidth; i < length; i++) - dest[i] = (scanLine[i] + dest[i - byteWidth]); // paethPredictor(dest[i - byteWidth], 0, 0) is always dest[i - byteWidth] - } - break; - default: - error("Unknown line filter"); + png_infop infoPtr = png_create_info_struct(pngPtr); + if (!infoPtr) { + png_destroy_read_struct(&pngPtr, NULL, NULL); + delete _stream; + return false; } - -} - -int PNGDecoder::getBytesPerPixel() const { - return (getNumColorChannels() * _header.bitDepth + 7) / 8; -} - -void PNGDecoder::constructImage() { - assert (_header.bitDepth != 0); - - int bytesPerPixel = getBytesPerPixel(); - int pitch = bytesPerPixel * _header.width; - byte *unfilteredSurface = new byte[pitch * _header.height]; - byte *dest = unfilteredSurface; - uint16 scanLineWidth = (_header.width * getNumColorChannels() * _header.bitDepth + 7) / 8; - byte *scanLine = new byte[scanLineWidth]; - byte *prevLine = 0; - - switch(_header.interlaceType) { - case kNonInterlaced: - for (uint16 y = 0; y < _header.height; y++) { - byte filterType = _imageData->readByte(); - _imageData->read(scanLine, scanLineWidth); - unfilterScanLine(dest, scanLine, prevLine, bytesPerPixel, filterType, scanLineWidth); - prevLine = dest; - dest += pitch; - } - break; - case kInterlaced: - // Theoretically, this shouldn't be needed, as interlacing is only - // useful for web images. Interlaced PNG images require more complex - // handling, so unless having support for such images is needed, there - // is no reason to add support for them. - error("TODO: Support for interlaced PNG images"); - break; + png_infop endInfo = png_create_info_struct(pngPtr); + if (!endInfo) { + png_destroy_read_struct(&pngPtr, &infoPtr, NULL); + delete _stream; + return false; } - delete[] scanLine; + png_set_error_fn(pngPtr, NULL, pngError, pngWarning); + // TODO: The manual says errors should be handled via setjmp - constructOutput(unfilteredSurface); - delete[] unfilteredSurface; -} + png_set_read_fn(pngPtr, _stream, pngReadFromStream); + png_set_crc_action(pngPtr, PNG_CRC_DEFAULT, PNG_CRC_WARN_USE); + // We already verified the PNG-header + png_set_sig_bytes(pngPtr, 8); -Graphics::PixelFormat PNGDecoder::findPixelFormat() const { - // Try to find the best pixel format based on what we have here - // Which is basically 8bpp for paletted non-transparent - // and 32bpp for everything else + // Read PNG header + png_read_info(pngPtr, infoPtr); - switch (_header.colorType) { - case kIndexed: - if (!_transparentColorSpecified) - return Graphics::PixelFormat::createFormatCLUT8(); - // fall through - case kGrayScale: - case kTrueColor: - case kGrayScaleWithAlpha: - case kTrueColorWithAlpha: - // We'll go with standard RGBA 32-bit - return Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0); - } - - error("Unknown PNG color type"); - return Graphics::PixelFormat(); -} + // No handling for unknown chunks yet. + int bitDepth, colorType, width, height, interlaceType; + png_uint_32 w, h; + png_get_IHDR(pngPtr, infoPtr, &w, &h, &bitDepth, &colorType, &interlaceType, NULL, NULL); + width = w; + height = h; -void PNGDecoder::constructOutput(const byte *surface) { + // Allocate memory for the final image data. + // To keep memory framentation low this happens before allocating memory for temporary image data. _outputSurface = new Graphics::Surface(); - _outputSurface->create(_header.width, _header.height, findPixelFormat()); - const byte *src = surface; - byte a = 0xFF; - int bytesPerPixel = getBytesPerPixel(); - - if (_header.colorType != kIndexed) { - if (_header.colorType == kTrueColor || - _header.colorType == kTrueColorWithAlpha) { - if (bytesPerPixel != 3 && bytesPerPixel != 4) - error("Unsupported truecolor PNG format"); - } else if (_header.colorType == kGrayScale || - _header.colorType == kGrayScaleWithAlpha) { - if (bytesPerPixel != 1 && bytesPerPixel != 2) - error("Unsupported grayscale PNG format"); + // Images of all color formats except PNG_COLOR_TYPE_PALETTE + // will be transformed into ARGB images + if (colorType == PNG_COLOR_TYPE_PALETTE && !png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) { + int numPalette = 0; + png_colorp palette = NULL; + uint32 success = png_get_PLTE(pngPtr, infoPtr, &palette, &numPalette); + if (success != PNG_INFO_PLTE) { + png_destroy_read_struct(&pngPtr, &infoPtr, NULL); + return false; } - - for (uint16 i = 0; i < _outputSurface->h; i++) { - for (uint16 j = 0; j < _outputSurface->w; j++) { - uint32 result = 0; - - switch (bytesPerPixel) { - case 1: // Grayscale - if (_transparentColorSpecified) - a = (src[0] == _transparentColor[0]) ? 0 : 0xFF; - result = _outputSurface->format.ARGBToColor(a, src[0], src[0], src[0]); - break; - case 2: // Grayscale + alpha - result = _outputSurface->format.ARGBToColor(src[1], src[0], src[0], src[0]); - break; - case 3: // RGB - if (_transparentColorSpecified) { - bool isTransparentColor = (src[0] == _transparentColor[0] && - src[1] == _transparentColor[1] && - src[2] == _transparentColor[2]); - a = isTransparentColor ? 0 : 0xFF; - } - - result = _outputSurface->format.ARGBToColor(a, src[0], src[1], src[2]); - break; - case 4: // RGBA - result = _outputSurface->format.ARGBToColor(src[3], src[0], src[1], src[2]); - break; - } - - *((uint32 *)_outputSurface->getBasePtr(j, i)) = result; - src += bytesPerPixel; - } + _paletteColorCount = numPalette; + _palette = new byte[_paletteColorCount * 3]; + for (int i = 0; i < _paletteColorCount; i++) { + _palette[(i * 3)] = palette[i].red; + _palette[(i * 3) + 1] = palette[i].green; + _palette[(i * 3) + 2] = palette[i].blue; + } + _outputSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); + png_set_packing(pngPtr); } else { - uint32 mask = (0xff >> (8 - _header.bitDepth)) << (8 - _header.bitDepth); - - // Convert the indexed surface to the target pixel format - for (uint16 i = 0; i < _outputSurface->h; i++) { - int data = 0; - int bitCount = 8; - const byte *src1 = src; - - for (uint16 j = 0; j < _outputSurface->w; j++) { - if (bitCount == 8) { - data = *src; - src++; - } - - byte index = (data & mask) >> (8 - _header.bitDepth); - data = (data << _header.bitDepth) & 0xff; - bitCount -= _header.bitDepth; - - if (bitCount == 0) - bitCount = 8; - - if (_transparentColorSpecified) { - byte r = _palette[index * 3 + 0]; - byte g = _palette[index * 3 + 1]; - byte b = _palette[index * 3 + 2]; - a = _paletteTransparency[index]; - *((uint32 *)_outputSurface->getBasePtr(j, i)) = _outputSurface->format.ARGBToColor(a, r, g, b); - } else { - *((byte *)_outputSurface->getBasePtr(j, i)) = index; - } - } - - src = src1 + _outputSurface->w; + _outputSurface->create(width, height, Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0)); + if (!_outputSurface->pixels) { + error("Could not allocate memory for output image."); } - } -} + if (bitDepth == 16) + png_set_strip_16(pngPtr); + if (bitDepth < 8) + png_set_expand(pngPtr); + if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) + png_set_expand(pngPtr); + if (colorType == PNG_COLOR_TYPE_GRAY || + colorType == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(pngPtr); + + // PNGs are Big-Endian: +#ifdef SCUMM_LITTLE_ENDIAN + png_set_bgr(pngPtr); + png_set_swap_alpha(pngPtr); + if (colorType != PNG_COLOR_TYPE_RGB_ALPHA) + png_set_filler(pngPtr, 0xff, PNG_FILLER_BEFORE); +#else + if (colorType != PNG_COLOR_TYPE_RGB_ALPHA) + png_set_filler(pngPtr, 0xff, PNG_FILLER_AFTER); +#endif -void PNGDecoder::readHeaderChunk() { - _header.width = _stream->readUint32BE(); - _header.height = _stream->readUint32BE(); - _header.bitDepth = _stream->readByte(); - if (_header.bitDepth > 8) - error("Only PNGs with a bit depth of 1-8 bits are supported (i.e. PNG24)"); - _header.colorType = (PNGColorType)_stream->readByte(); - _header.compressionMethod = _stream->readByte(); - // Compression methods: http://www.w3.org/TR/PNG/#10Compression - // Only compression method 0 (deflate) is documented and supported - if (_header.compressionMethod != 0) - error("Unknown PNG compression method: %d", _header.compressionMethod); - _header.filterMethod = _stream->readByte(); - // Filter methods: http://www.w3.org/TR/PNG/#9Filters - // Only filter method 0 is documented and supported - if (_header.filterMethod != 0) - error("Unknown PNG filter method: %d", _header.filterMethod); - _header.interlaceType = (PNGInterlaceType)_stream->readByte(); -} - -byte PNGDecoder::getNumColorChannels() const { - switch (_header.colorType) { - case kGrayScale: - return 1; // Gray - case kTrueColor: - return 3; // RGB - case kIndexed: - return 1; // Indexed - case kGrayScaleWithAlpha: - return 2; // Gray + Alpha - case kTrueColorWithAlpha: - return 4; // RGBA - default: - error("Unknown color type"); } -} + + // After the transformations have been registered, the image data is read again. + png_read_update_info(pngPtr, infoPtr); + png_get_IHDR(pngPtr, infoPtr, &w, &h, &bitDepth, &colorType, NULL, NULL, NULL); + width = w; + height = h; + + if (interlaceType == PNG_INTERLACE_NONE) { + // PNGs without interlacing can simply be read row by row. + for (int i = 0; i < height; i++) { + png_read_row(pngPtr, (png_bytep)_outputSurface->getBasePtr(0, i), NULL); + } + } else { + // PNGs with interlacing require us to allocate an auxillary + // buffer with pointers to all row starts. + + // Allocate row pointer buffer + png_bytep *rowPtr = new png_bytep[height]; + if (!rowPtr) { + error("Could not allocate memory for row pointers."); + } + + // Initialize row pointers + for (int i = 0; i < height; i++) + rowPtr[i] = (png_bytep)_outputSurface->getBasePtr(0, i); + + // Read image data + png_read_image(pngPtr, rowPtr); + + // Free row pointer buffer + delete[] rowPtr; + } + + // Read additional data at the end. + png_read_end(pngPtr, NULL); -void PNGDecoder::readTransparencyChunk(uint32 chunkLength) { - _transparentColorSpecified = true; + // Destroy libpng structures + png_destroy_read_struct(&pngPtr, &infoPtr, NULL); - switch(_header.colorType) { - case kGrayScale: - _transparentColor[0] = _stream->readUint16BE(); - _transparentColor[1] = _transparentColor[0]; - _transparentColor[2] = _transparentColor[0]; - break; - case kTrueColor: - _transparentColor[0] = _stream->readUint16BE(); - _transparentColor[1] = _stream->readUint16BE(); - _transparentColor[2] = _stream->readUint16BE(); - break; - case kIndexed: - _stream->read(_paletteTransparency, chunkLength); + // We no longer need the file stream, thus close it here + _stream = 0; - // A transparency chunk may have less entries - // than the palette entries. The remaining ones - // are unmodified (set to 255). Check here: - // http://www.w3.org/TR/PNG/#11tRNS - break; - default: - error("Transparency chunk found in a PNG that has a separate transparency channel"); - } + return true; +#else + return false; +#endif } } // End of Graphics namespace diff --git a/graphics/decoders/png.h b/graphics/decoders/png.h index ca204f6dd3..e52ddabd7d 100644 --- a/graphics/decoders/png.h +++ b/graphics/decoders/png.h @@ -24,33 +24,12 @@ * PNG decoder used in engines: * - sword25 * Dependencies: - * - zlib + * - libpng */ #ifndef GRAPHICS_PNG_H #define GRAPHICS_PNG_H -// PNG decoder, based on the W3C specs: -// http://www.w3.org/TR/PNG/ -// Parts of the code have been adapted from LodePNG, by Lode Vandevenne: -// http://members.gamedev.net/lode/projects/LodePNG/ - -// All the numbers are BE: http://www.w3.org/TR/PNG/#7Integers-and-byte-order - -// Note: At the moment, this decoder only supports non-interlaced images, and -// does not support truecolor/grayscale images with 16bit depth. -// -// Theoretically, interlaced images shouldn't be needed for games, as -// interlacing is only useful for images in websites. -// -// PNG images with 16bit depth (i.e. 48bit images) are quite rare, and can -// theoretically contain more than 16.7 millions of colors (the so-called "deep -// color" representation). In essence, each of the R, G, B and A components in -// them is specified with 2 bytes, instead of 1. However, the PNG specification -// always refers to color components with 1 byte each, so this part of the spec -// is a bit unclear. For now, these won't be supported, until a suitable sample -// is found. - #include "common/scummsys.h" #include "common/textconsole.h" #include "graphics/decoders/image_decoder.h" @@ -73,62 +52,13 @@ public: void destroy(); const Graphics::Surface *getSurface() const { return _outputSurface; } const byte *getPalette() const { return _palette; } - uint16 getPaletteColorCount() const { return _paletteEntries; } - + uint16 getPaletteColorCount() const { return _paletteColorCount; } private: - enum PNGColorType { - kGrayScale = 0, // bit depths: 1, 2, 4, 8, 16 - kTrueColor = 2, // bit depths: 8, 16 - kIndexed = 3, // bit depths: 1, 2, 4, 8 - kGrayScaleWithAlpha = 4, // bit depths: 8, 16 - kTrueColorWithAlpha = 6 // bit depths: 8, 16 - }; - - enum PNGInterlaceType { - kNonInterlaced = 0, - kInterlaced = 1 - }; - - struct PNGHeader { - uint32 width; - uint32 height; - byte bitDepth; - PNGColorType colorType; - byte compressionMethod; - byte filterMethod; - PNGInterlaceType interlaceType; - }; - - void readHeaderChunk(); - byte getNumColorChannels() const; - - void readPaletteChunk(); - void readTransparencyChunk(uint32 chunkLength); - - void constructImage(); - void unfilterScanLine(byte *dest, const byte *scanLine, const byte *prevLine, uint16 byteWidth, byte filterType, uint16 length); - byte paethPredictor(int16 a, int16 b, int16 c); - - // The original file stream Common::SeekableReadStream *_stream; - // The unzipped image data stream - Common::SeekableReadStream *_imageData; - - PNGHeader _header; - - byte _palette[256 * 3]; // RGB - byte _paletteTransparency[256]; - uint16 _paletteEntries; - uint16 _transparentColor[3]; - bool _transparentColorSpecified; - - byte *_compressedBuffer; - uint32 _compressedBufferSize; + byte *_palette; + uint16 _paletteColorCount; Graphics::Surface *_outputSurface; - Graphics::PixelFormat findPixelFormat() const; - int getBytesPerPixel() const; - void constructOutput(const byte *surface); }; } // End of namespace Graphics -- cgit v1.2.3 From f34924bc3940ff1f9972ed4920feb7e5708f3099 Mon Sep 17 00:00:00 2001 From: upthorn Date: Mon, 9 Jul 2012 04:25:08 -0700 Subject: SWORD25: Fix loading savegames on 64-bit archs. --- engines/sword25/util/pluto/pluto.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sword25/util/pluto/pluto.cpp b/engines/sword25/util/pluto/pluto.cpp index d645e5ed2a..b7f5e30340 100644 --- a/engines/sword25/util/pluto/pluto.cpp +++ b/engines/sword25/util/pluto/pluto.cpp @@ -895,10 +895,10 @@ static void unpersistnumber(UnpersistInfo *upi) static void unpersiststring(UnpersistInfo *upi) { /* perms reftbl sptbl ref */ - int length; + size_t length; char* string; lua_checkstack(upi->L, 1); - verify(LIF(Z,read)(&upi->zio, &length, sizeof(int)) == 0); + verify(LIF(Z,read)(&upi->zio, &length, sizeof(size_t)) == 0); string = pdep_newvector(upi->L, length, char); verify(LIF(Z,read)(&upi->zio, string, length) == 0); lua_pushlstring(upi->L, string, length); -- cgit v1.2.3 From 6c155b6b36f77a932a54e9b01c08f938c73e24eb Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 20 Aug 2012 17:06:58 -0400 Subject: VIDEO: Implement rewinding Smacker audio tracks --- video/smk_decoder.cpp | 7 ++++++- video/smk_decoder.h | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/video/smk_decoder.cpp b/video/smk_decoder.cpp index d01ec730f4..bea65142a1 100644 --- a/video/smk_decoder.cpp +++ b/video/smk_decoder.cpp @@ -410,7 +410,6 @@ void SmackerDecoder::close() { bool SmackerDecoder::rewind() { // Call the parent method to rewind the tracks first - // In particular, only videos without sound can be rewound if (!VideoDecoder::rewind()) return false; @@ -755,6 +754,12 @@ SmackerDecoder::SmackerAudioTrack::~SmackerAudioTrack() { delete _audioStream; } +bool SmackerDecoder::SmackerAudioTrack::rewind() { + delete _audioStream; + _audioStream = Audio::makeQueuingAudioStream(_audioInfo.sampleRate, _audioInfo.isStereo); + return true; +} + Audio::AudioStream *SmackerDecoder::SmackerAudioTrack::getAudioStream() const { return _audioStream; } diff --git a/video/smk_decoder.h b/video/smk_decoder.h index 6bded64a37..7227238373 100644 --- a/video/smk_decoder.h +++ b/video/smk_decoder.h @@ -156,6 +156,9 @@ private: SmackerAudioTrack(const AudioInfo &audioInfo, Audio::Mixer::SoundType soundType); ~SmackerAudioTrack(); + bool isRewindable() const { return true; } + bool rewind(); + Audio::Mixer::SoundType getSoundType() const { return _soundType; } void queueCompressedBuffer(byte *buffer, uint32 bufferSize, uint32 unpackedSize); -- cgit v1.2.3 From eff6ea09fbf1b64bc37011e5c94cf8798f658150 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 21 Aug 2012 02:13:19 +0200 Subject: Revert "CONFIGURE: Don't disable the sword25 engine when libpng is not found" This reverts commit 7543c3ba5fcc914a4031fc8328aacd3d28c7055d. We depend on libpng for PNG decoding again, thus disable sword25 when libpng is not available. --- configure | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/configure b/configure index 5ab145c5f4..4b54832294 100755 --- a/configure +++ b/configure @@ -3201,6 +3201,11 @@ fi define_in_config_if_yes "$_png" 'USE_PNG' echo "$_png" +if test `get_engine_build sword25` = yes && test ! "$_png" = yes ; then + echo "...disabling Broken Sword 2.5 engine. PNG is required" + engine_disable sword25 +fi + # # Check for Theora Decoder # -- cgit v1.2.3 From 5df8c99768205ad6e2380dbc7cbc838e4ab5cc85 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 21 Aug 2012 02:17:45 +0200 Subject: GPRAHICS: Slight cleanup in png.cpp. This adds an explanation why we use FORBIDDEN_SYMBOL_ALLOW_ALL and removes some trailing whitespaces. --- graphics/decoders/png.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/graphics/decoders/png.cpp b/graphics/decoders/png.cpp index f0471899a6..bfaab6dc35 100644 --- a/graphics/decoders/png.cpp +++ b/graphics/decoders/png.cpp @@ -19,6 +19,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ + +// Since we need to work with libpng here, we need to allow all symbols +// to avoid compilation issues. #define FORBIDDEN_SYMBOL_ALLOW_ALL #include "common/scummsys.h" @@ -84,7 +87,7 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { destroy(); _stream = &stream; - + // First, check the PNG signature if (_stream->readUint32BE() != MKTAG(0x89, 'P', 'N', 'G')) { delete _stream; @@ -155,7 +158,7 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { _palette[(i * 3)] = palette[i].red; _palette[(i * 3) + 1] = palette[i].green; _palette[(i * 3) + 2] = palette[i].blue; - + } _outputSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); png_set_packing(pngPtr); @@ -173,7 +176,7 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(pngPtr); - + // PNGs are Big-Endian: #ifdef SCUMM_LITTLE_ENDIAN png_set_bgr(pngPtr); @@ -186,7 +189,7 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { #endif } - + // After the transformations have been registered, the image data is read again. png_read_update_info(pngPtr, infoPtr); png_get_IHDR(pngPtr, infoPtr, &w, &h, &bitDepth, &colorType, NULL, NULL, NULL); @@ -201,24 +204,24 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { } else { // PNGs with interlacing require us to allocate an auxillary // buffer with pointers to all row starts. - + // Allocate row pointer buffer png_bytep *rowPtr = new png_bytep[height]; if (!rowPtr) { error("Could not allocate memory for row pointers."); } - + // Initialize row pointers for (int i = 0; i < height; i++) rowPtr[i] = (png_bytep)_outputSurface->getBasePtr(0, i); - + // Read image data png_read_image(pngPtr, rowPtr); - + // Free row pointer buffer delete[] rowPtr; } - + // Read additional data at the end. png_read_end(pngPtr, NULL); -- cgit v1.2.3 From 9568b78babdbdf350fd6c47b261c3f21902c31fc Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 21 Aug 2012 03:28:34 +0300 Subject: SCI: Use a simpler atan implementation for kGetAngle in SCI1 and newer games SCI1 games (QFG2 and newer) use a simpler and more accurate atan implementation for kGetAngle. This properly fixes bug #3540976. --- engines/sci/engine/kmath.cpp | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index a643fbe37a..4b8fadbb84 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -84,27 +84,10 @@ reg_t kSqrt(EngineState *s, int argc, reg_t *argv) { * accurate. */ uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) { - // TODO: This has been implemented based on behavior observed with a test - // program created with SCI Studio. However, the return values have subtle - // differences from the original, which uses custom implementation of atan(). - // The differences in the return values are the cause of bug #3540976 - // and perhaps bug #3037267 as well. - // The results of this function match the expected results of SCI0, but not - // SCI1 (hence the bug in Longbow). We need to find the point in history - // when this function was changed. - - // HACK: Return the expected value for Longbow, scene 150 (bug #3540976). - // This is a temporary solution, till the function returns the expected - // results. - if (g_sci->getGameId() == GID_LONGBOW && g_sci->getEngineState()->currentRoomNumber() == 150) { - if (x1 == 207 && y1 == 88 && x2 == 107 && y2 == 184) - return 226; - } - -#if 0 - // A simpler atan2-based implementation - return (int16)(360 - atan2((double)(x1 - x2), (double)(y1 - y2)) * 57.2958) % 360; -#endif + // SCI1 games (QFG2 and newer) use a simple atan implementation. SCI0 games + // use a somewhat less accurate calculation (below). + if (getSciVersion() >= SCI_VERSION_1_EGA_ONLY) + return (int16)(360 - atan2((double)(x1 - x2), (double)(y1 - y2)) * 57.2958) % 360; int16 xRel = x2 - x1; int16 yRel = y1 - y2; // y-axis is mirrored. -- cgit v1.2.3 From 1a61056b06dc4ea5fe534f6ff13eb4e281bb9c03 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 21 Aug 2012 03:29:55 +0300 Subject: SCI: Extend a workaround for the dream sequence in QFG4 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index a4c2355e8f..9fa0368784 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -399,7 +399,7 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error - { GID_QFG4, 770, 110, 0, "dreamer", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during the dream sequence, a 3rd parameter is passed by accident + { GID_QFG4, -1, 110, 0, "dreamer", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during the dream sequence, a 3rd parameter is passed by accident SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 7d436622a8e10437488f6dfa930e3ff15e254a55 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 21 Aug 2012 03:31:00 +0300 Subject: SCI: More work on kRemapColors This implements some more color remap-based palette effects, found in QFG4 --- engines/sci/engine/kgraphics32.cpp | 21 ++++++++++++--------- engines/sci/graphics/palette.cpp | 21 +++++++++++++++++++++ engines/sci/graphics/palette.h | 1 + 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 685b3c0bd3..8b3afeef99 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -771,20 +771,23 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { } break; case 3: { // remap to gray - // Example call: QFG4 room 490 (Baba Yaga's hut) - params are color 253, 75% and 0 + // Example call: QFG4 room 490 (Baba Yaga's hut) - params are color 253, 75% and 0. + // In this room, it's used for the cloud before Baba Yaga appears. int16 color = argv[1].toSint16(); int16 percent = argv[2].toSint16(); // 0 - 100 - uint16 unk3 = (argc >= 4) ? argv[3].toUint16() : 0; - warning("kRemapColors: RemapToGray color %d by %d percent (unk3 = %d)", color, percent, unk3); - // TODO + if (argc >= 4) + warning("RemapToGray called with 4 parameters, unknown parameter is %d", argv[3].toUint16()); + g_sci->_gfxPalette->setRemappingPercentGray(color, percent); } break; case 4: { // remap to percent gray - //int16 unk1 = argv[1].toSint16(); - //uint16 unk2 = argv[2].toUint16(); - //uint16 unk3 = argv[3].toUint16(); - //uint16 unk4 = (argc >= 5) ? argv[4].toUint16() : 0; - kStub(s, argc, argv); + // Example call: QFG4 rooms 530/535 (swamp) - params are 253, 100%, 200 + int16 color = argv[1].toSint16(); + int16 percent = argv[2].toSint16(); // 0 - 100 + // argv[3] is unknown (a number, e.g. 200) - start color, perhaps? + if (argc >= 5) + warning("RemapToGrayPercent called with 5 parameters, unknown parameter is %d", argv[4].toUint16()); + g_sci->_gfxPalette->setRemappingPercentGray(color, percent); } break; case 5: { // don't map to range diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 68104b0ac8..53d69cdcca 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -375,6 +375,27 @@ void GfxPalette::setRemappingPercent(byte color, byte percent) { _remappingType[color] = kRemappingByPercent; } +void GfxPalette::setRemappingPercentGray(byte color, byte percent) { + _remapOn = true; + + // We need to defer the setup of the remapping table every time the screen + // palette is changed, so that kernelFindColor() can find the correct + // colors. Set it once here, in case the palette stays the same and update + // it on each palette change by copySysPaletteToScreen(). + _remappingPercentToSet = percent; + + // Note: This is not what the original does, but the results are the same visually + for (int i = 0; i < 256; i++) { + byte rComponent = _sysPalette.colors[i].r * _remappingPercentToSet * 0.30 / 100; + byte gComponent = _sysPalette.colors[i].g * _remappingPercentToSet * 0.59 / 100; + byte bComponent = _sysPalette.colors[i].b * _remappingPercentToSet * 0.11 / 100; + byte luminosity = rComponent + gComponent + bComponent; + _remappingByPercent[i] = kernelFindColor(luminosity, luminosity, luminosity); + } + + _remappingType[color] = kRemappingByPercent; +} + void GfxPalette::setRemappingRange(byte color, byte from, byte to, byte base) { _remapOn = true; diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 9898315897..e974781d49 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -61,6 +61,7 @@ public: void resetRemapping(); void setRemappingPercent(byte color, byte percent); + void setRemappingPercentGray(byte color, byte percent); void setRemappingRange(byte color, byte from, byte to, byte base); bool isRemapped(byte color) const { return _remapOn && (_remappingType[color] != kRemappingNone); -- cgit v1.2.3 From a391599403faf864f1583ababdba577fb6393afd Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 21 Aug 2012 11:55:21 +0300 Subject: SCI: Update a comment --- engines/sci/graphics/frameout.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 0098728e5d..6628247127 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -728,7 +728,9 @@ void GfxFrameout::kernelFrameout() { g_sci->_gfxCompare->setNSRect(itemEntry->object, nsRect); } - // FIXME: When does this happen, and why? + // Don't attempt to draw sprites that are outside the visible + // screen area. An example is the random people walking in + // Jackson Square in GK1. if (itemEntry->celRect.bottom < 0 || itemEntry->celRect.top >= _screen->getDisplayHeight() || itemEntry->celRect.right < 0 || itemEntry->celRect.left >= _screen->getDisplayWidth()) continue; -- cgit v1.2.3 From 1d58ebe133c274643a89f2f4f0d24a2a8ab343c3 Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Tue, 21 Aug 2012 16:21:10 +0200 Subject: PS3: Force use of freetype from ps3toolchain --- configure | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 4b54832294..5c6deace41 100755 --- a/configure +++ b/configure @@ -2079,8 +2079,9 @@ case $_host_os in DEFINES="$DEFINES -D__PLAYSTATION2__" ;; ps3) - # Force use of SDL from the ps3 toolchain + # Force use of SDL and freetype from the ps3 toolchain _sdlpath="$PS3DEV/portlibs/ppu:$PS3DEV/portlibs/ppu/bin" + _freetypepath="$PS3DEV/portlibs/ppu:$PS3DEV/portlibs/ppu/bin" DEFINES="$DEFINES -DPLAYSTATION3" CXXFLAGS="$CXXFLAGS -mcpu=cell -mminimal-toc -I$PSL1GHT/ppu/include -I$PS3DEV/portlibs/ppu/include" -- cgit v1.2.3 From 829c836e0b86edc07aed4ed1846ac19ba76c6788 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 23 Aug 2012 22:44:02 -0400 Subject: VIDEO: Update the isPlaying() comment --- video/video_decoder.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/video/video_decoder.h b/video/video_decoder.h index 5fba85358c..5abe1d917c 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -117,7 +117,11 @@ public: /** * Returns if the video is currently playing or not. - * @todo Differentiate this function from endOfVideo() + * + * This is not equivalent to the inverse of endOfVideo(). A video keeps + * its playing status even after reaching the end of the video. This will + * return true after calling start() and will continue to return true + * until stop() (or close()) is called. */ bool isPlaying() const { return _isPlaying; } -- cgit v1.2.3 From dcdb40f79e4e02101ddd7c017762ec61298f1833 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 23 Aug 2012 23:11:09 -0400 Subject: VIDEO: Adjust start time after calling rewind() in start() This wasn't an actual bug, but it makes more sense this way --- video/video_decoder.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index 14826642d7..559880acee 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -347,14 +347,14 @@ void VideoDecoder::start() { _isPlaying = true; _startTime = g_system->getMillis(); - // Adjust start time if we've seeked to something besides zero time - if (_lastTimeChange.totalNumberOfFrames() != 0) - _startTime -= _lastTimeChange.msecs(); - // If someone previously called stop(), we'll rewind it. if (_needsRewind) rewind(); + // Adjust start time if we've seeked to something besides zero time + if (_lastTimeChange.totalNumberOfFrames() != 0) + _startTime -= _lastTimeChange.msecs(); + startAudio(); } -- cgit v1.2.3 From c7222ed5a4428c51cdf325fc0eb172f46a991d86 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 25 Aug 2012 12:30:28 -0400 Subject: VIDEO: Remove obsolete FIXME in the FLIC code --- video/flic_decoder.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/video/flic_decoder.cpp b/video/flic_decoder.cpp index 564d73a9d7..1a0627615b 100644 --- a/video/flic_decoder.cpp +++ b/video/flic_decoder.cpp @@ -164,9 +164,6 @@ const Graphics::Surface *FlicDecoder::FlicVideoTrack::decodeNextFrame() { switch (frameType) { case FRAME_TYPE: { - // FIXME: FLIC should be switched over to a variable frame rate VideoDecoder to handle - // this properly. - chunkCount = _fileStream->readUint16LE(); // Note: The overridden delay is a 16-bit integer (word), whereas the normal delay is a 32-bit integer (dword) // the frame delay is the FLIC "speed", in milliseconds. -- cgit v1.2.3 From 6f9d84665fd090ae55386b1373a69e080b34e089 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 26 Aug 2012 12:38:35 -0400 Subject: COMMON: Add MKTAG16 for 16-bit multi-character constants --- common/endian.h | 6 ++++++ common/winexe_pe.cpp | 2 +- video/avi_decoder.cpp | 6 +++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/common/endian.h b/common/endian.h index 394437ec67..759513efef 100644 --- a/common/endian.h +++ b/common/endian.h @@ -146,6 +146,12 @@ */ #define MKTAG(a0,a1,a2,a3) ((uint32)((a3) | ((a2) << 8) | ((a1) << 16) | ((a0) << 24))) +/** + * A wrapper macro used around two character constants, like 'wb', to + * ensure portability. Typical usage: MKTAG16('w','b'). + */ +#define MKTAG16(a0,a1) ((uint16)((a1) | ((a0) << 8))) + // Functions for reading/writing native integers. // They also transparently handle the need for alignment. diff --git a/common/winexe_pe.cpp b/common/winexe_pe.cpp index 6c0f9c9962..b3c45ffe73 100644 --- a/common/winexe_pe.cpp +++ b/common/winexe_pe.cpp @@ -64,7 +64,7 @@ bool PEResources::loadFromEXE(SeekableReadStream *stream) { if (!stream) return false; - if (stream->readUint16BE() != 'MZ') + if (stream->readUint16BE() != MKTAG16('M', 'Z')) return false; stream->skip(58); diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp index 0850d5656a..09b95d38ad 100644 --- a/video/avi_decoder.cpp +++ b/video/avi_decoder.cpp @@ -334,14 +334,14 @@ void AVIDecoder::readNextPacket() { _fileStream->skip(chunkSize & 1); if (track->getTrackType() == Track::kTrackTypeAudio) { - if (getStreamType(nextTag) != 'wb') + if (getStreamType(nextTag) != MKTAG16('w', 'b')) error("Invalid audio track tag '%s'", tag2str(nextTag)); ((AVIAudioTrack *)track)->queueSound(chunk); } else { AVIVideoTrack *videoTrack = (AVIVideoTrack *)track; - if (getStreamType(nextTag) == 'pc') { + if (getStreamType(nextTag) == MKTAG16('p', 'c')) { // Palette Change byte firstEntry = chunk->readByte(); uint16 numEntries = chunk->readByte(); @@ -362,7 +362,7 @@ void AVIDecoder::readNextPacket() { delete chunk; videoTrack->markPaletteDirty(); - } else if (getStreamType(nextTag) == 'db') { + } else if (getStreamType(nextTag) == MKTAG16('d', 'b')) { // TODO: Check if this really is uncompressed. Many videos // falsely put compressed data in here. error("Uncompressed AVI frame found"); -- cgit v1.2.3 From 18e7573dafbffdd509943c8f90f91933b17b0435 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 26 Aug 2012 15:13:57 -0400 Subject: NEWS: Mention VideoDecoder rewrite --- NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 3f5f10ce05..26f3640336 100644 --- a/NEWS +++ b/NEWS @@ -2,7 +2,8 @@ For a more comprehensive changelog of the latest experimental code, see: https://github.com/scummvm/scummvm/commits/ 1.6.0 (????-??-??) - + General: + - Rewrote VideoDecoder subsystem. 1.5.0 (2012-07-27) New Games: -- cgit v1.2.3