Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Per-engine and per-game GUI options (version 3) #181

Closed
wants to merge 10 commits into from

3 participants

@bluegr
Collaborator

This is a squashed version of pull request 169:
#169

This pull request adds per-engine and per-game GUI options to the GUI "Add game" and "Edit game" dialogs.

Here's some highlights:

  • Engines can provide their own custom options, which can vary depending on the target name, GUI options and platform
  • All options are added in a new tab, "Engine", which only appears if there are any custom options to show
  • All options are checkboxes

The global custom options dialog is not done in this pull request, as this requires a scroll list where the
widgets can be included. Once this functionality is added, it'll be a matter of querying all of the compiled
plugins for global game options (i.e. without supplying game IDs).

The missing functionality above means that up to 7 options can be added per engine/game, but this
shouldn't be a big issue (no game has more than 7 custom options right now) - 7 because that's how many fit
on screen with the classic theme at 320x200.

Per-engine and per-game options have been added for the following engines:

  • DREAMWEB
  • KYRA
  • QUEEN
  • SKY
  • SWORD2
  • SCI

TODO:

  • Global game options
  • A more dynamic widget layout
  • Currently, only checkboxes can be used. Perhaps it could be feasible to add other widget types too, but engines needing such functionality are few (e.g. kyra has a walkspeed setting, sword2 a gfx_details setting and t7g a t7g_speed setting). Checkboxes cover the majority of the custom engine options.
@lordhoto
Collaborator

A few random thoughts, which prevent this from being merged:

EDIT: "findGame" doesn't do a detection oops, it rather just loads the plugin, sorry about that.

1) MetaEngine::getExtraGuiOptions takes too many parameters, only the target name (which should be the target name in the config file just BTW., all other MetaEngine code does that) should be passed here. Everything else can be fetched from ConfMan later on if it's really required.

@bluegr
Collaborator

Note: I did a force push, so some of LordHoto's comments in the original commit are no longer shown here. The original commit is e0bb5b342a1a4f6030ba7dc795006f8acb37f4ac

bluegr added some commits
@bluegr bluegr GUI: Add per-engine and per-game options 97342cf
@bluegr bluegr DREAMWEB: Add some custom engine options
- Add an engine option to toggle the game's save/load screens between
the original and the enhanced ScummVM ones
- Add an engine option to toggle the game palette between normal and
bright (this can be toggled via a command line parameter in the original)
5345bca
@bluegr bluegr KYRA: Add several custom game options for Kyra 3, LoL and EOB 1 and 2 19f0a07
@bluegr bluegr QUEEN: Add a custom game option to toggle the intro in the CD version f676adc
@bluegr bluegr SKY: Add a custom game option to toggle the intro in the CD version b407ca3
@bluegr bluegr SWORD2: Add a custom game option to toggle object labels ab64fed
@bluegr bluegr SCI: Add several custom game/engine options
- Add an option to toggle between digital and synthesized sound effects
- Add an option to toggle the save/load screens of most SCI games
between the original and the enhanced ScummVM ones
- Add an option to use IMF/Yahama FB-01 for MIDI output
- Add an option to toggle between CD tracks and game resource files in
Jones in the Fast Lane
- Add an option to toggle the mouse cursors in the Windows version of
King's Quest VI
e10d291
@bluegr bluegr TRANSLATION: Add all the new files containing translatable strings 1e50ed4
@bluegr
Collaborator

I did another force push with a commit squash and rebase so that the branch can be cleanly merged with master.

@lordhoto's comments above have all been addressed. I'm waiting for more feedback on this. I am aware that @sev- wants to move the game options inside GUIO flags instead of a separate MetaEngine method. This would mean that each game option would have its own unique ID, and each game configuration would contain a set of extra GUIO flags, which would be indices to that list. However, I haven't obtained any further feedback or information on this, and unfortunately I don't have the time to work on such a big change.

@lordhoto
Collaborator

I am not sure, but I'm rather against letting all the game options have a global unique ID. This feels like it has several disadvantages to me. Most serve is that it's really hard to keep this list synced with all the engine development, especially for engines off our main development line. Next if we really only use it to indices to some global table, it will make third-party engine plugins (frankly we still don't have that :-P) impossible to use any such flags, since there's no way they can edit the table.

So personally I'm still for this method which returns a container full of engine/game specific options. As far as I got the argument, the current idea is to somehow add the list of applying options into the advanced detector entries and then pick them based on that. Even with the current querying method we can easily implement that. We keep a table unique to each engine and just save indices into that table along with the detection entries. On detection we just save this list of applying options in a config file variable, similar to what our GUIO flags do, and then in the method we read the variable, create a list of indices out of that and then return the applying option descriptons. Should be pretty straightforward to implement. So I currently fail to see why we need to use either GUIO flags or unique IDs for the engine/game specific options at all.

@sev-
Owner

First, I never told that GUIO will require to be system-wide. My idea was that on GUIO level we define something like chckbox1-checkbox7, and then have same values mapped to local meaningful names.

Nevertheless after thinking on it a bit more, I realised that using GUIO will not bring benefits in terms of caching the values, since in this case we would have to store checkbox description and tooltip.

Hence current approach is acceptable.

I'll do another quick review of the code and merge it today if no issues.

@sev- sev- commented on the diff
engines/dreamweb/dreamweb.h
@@ -341,7 +341,7 @@ class DreamWebEngine : public Engine {
uint8 _speechCount;
uint16 _charShift;
uint8 _kerning;
- uint8 _brightness;
@sev- Owner
sev- added a note

In fact this should be split into a separate commit. First is the rename and refactoring, then adding the option.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
engines/kyra/detection.cpp
((5 lines not shown))
+ static const ExtraGuiOption optionsList[] = {
+ // Kyrandia 3 options
+ {
+ _s("Studio audience"),
+ _s("Enable studio audience"),
+ "studio_audience",
+ true
+ },
+ {
+ _s("Skip support"),
+ _s("Allow text and cutscenes to be skipped"),
+ "skip_support",
+ true
+ },
+ {
+ _s("Helium mode"),
@sev- Owner
sev- added a note

Please add I18N comments here for translators.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
engines/kyra/detection.cpp
@@ -245,6 +247,88 @@ SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int s
return desc;
}
+const ExtraGuiOptions KyraMetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ static const ExtraGuiOption optionsList[] = {
+ // Kyrandia 3 options
+ {
+ _s("Studio audience"),
@sev- Owner
sev- added a note

Add I18N comment for translators explaining the option

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
engines/kyra/detection.cpp
@@ -245,6 +247,88 @@ SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int s
return desc;
}
+const ExtraGuiOptions KyraMetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ static const ExtraGuiOption optionsList[] = {
+ // Kyrandia 3 options
+ {
+ _s("Studio audience"),
+ _s("Enable studio audience"),
+ "studio_audience",
+ true
+ },
+ {
+ _s("Skip support"),
@sev- Owner
sev- added a note

I18N comment

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@sev- sev- commented on the diff
engines/sci/detection.cpp
((27 lines not shown))
+ _s("Use CD audio instead of in-game audio, if available"),
+ "use_cdaudio",
+ true
+ },
+ {
+ // KQ6 Windows - windows cursors
+ _s("Use Windows cursors"),
+ _s("Use the Windows cursors (smaller and monochrome) instead of the DOS ones"),
+ "windows_cursors",
+ false
+ },
+ { 0, 0, 0, 0 }
+ };
+
+ Common::String gameId = ConfMan.getDomain(target)->getVal("gameid");
+ // We can't get a game ID in SCI, as _singleId will always overwrite game
@sev- Owner
sev- added a note

This is utterly wrong. You should not pass 'target' at all as it is not needed.

By this point the engine redetected the game, since it was initialised, and thus you should have access to ADGameDescription instance which defines all required things, including _gameDescription->gameid.

Please change as described other engines too.

@lordhoto Collaborator

By this point the engine redetected the game, since it was initialised, and thus you should have access to ADGameDescription instance which defines all required things, including _gameDescription->gameid.

That is not the case, currently there is no detection phase guaranteed before this function is called and in fact there isn't one before clicking on "Edit game..." for example. So this really can just work with a user target supplied. Furthermore it's correct that for singleId engines, this won't work well right now, since checking the target name is just plain madness, since that could be anything. But then again this is really rather a problem with the singleId stuff and not with this interface to access target specific options.

@sev- Owner
sev- added a note

May be I am reading my code wrong, but the game detection happens in MetaEngine::createInstance() method which is called on the engine loading. So the detection will actually take place.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@lordhoto
Collaborator
@sev-
Owner

We had a brief chat with LordHoto on the approach, and he suggested a brilliant idea.

We introduce 7 (at the moment) GUIOs, which are GUIO_OPTION1..7. Then every engine will have its local ids for them, i.e. #define GUIO_EGAUNDITHERING GUIO_OPTION3

Then GetExtraGuiOptions() would accept 'const char *guio' as an argument, and provide list of matching options.

This will let us avoid putting the options into global space, will provide nice benefits of GUIOs, i.e. the game level and the engine level, will make possible to specify truly per-game options, will be cached and not depended on gameids, engineids or whatever.

GetExtraGuiOptions will not have any game-specific logic, but just map between the options and their descriptive strings, and could be implemented as part of AdvancedMetaEngine

@sev-

These have to be prepended with I18N prefix.

@sev-
Owner

Anyway I'd prefer to got with LordHoto's patch

@bluegr
Collaborator

LotdHoto's patch is based on this pull request, so I'm going to merge the two pull requests here

@sev-
Owner

Sounds good. However his patch requires changes in ExtraGuiOptions structures and adjusting getExtraGuiOptions() method accordingly.

@sev-
Owner

Any progress on this? In the meantime the pull request got rot and needs to be rebased.

See my comment on LordHoto's request. If there will be no progress, I'll try to merge these requests by myself.

@bluegr
Collaborator

Continued in pull request #209

@lordhoto lordhoto closed this
@lordhoto
Collaborator

Closing this one, since there's a successor pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 27, 2012
  1. @bluegr
  2. @bluegr

    DREAMWEB: Add some custom engine options

    bluegr authored
    - Add an engine option to toggle the game's save/load screens between
    the original and the enhanced ScummVM ones
    - Add an engine option to toggle the game palette between normal and
    bright (this can be toggled via a command line parameter in the original)
  3. @bluegr
  4. @bluegr
  5. @bluegr
  6. @bluegr
  7. @bluegr

    SCI: Add several custom game/engine options

    bluegr authored
    - Add an option to toggle between digital and synthesized sound effects
    - Add an option to toggle the save/load screens of most SCI games
    between the original and the enhanced ScummVM ones
    - Add an option to use IMF/Yahama FB-01 for MIDI output
    - Add an option to toggle between CD tracks and game resource files in
    Jones in the Fast Lane
    - Add an option to toggle the mouse cursors in the Windows version of
    King's Quest VI
  8. @bluegr
Commits on Feb 28, 2012
  1. @bluegr
Commits on Mar 3, 2012
  1. @bluegr
This page is out of date. Refresh to see the latest.
Showing with 576 additions and 41 deletions.
  1. +7 −1 base/main.cpp
  2. +1 −1  dists/bada/Res/scummmobile/THEMERC
  3. +26 −0 dists/bada/Res/scummmobile/scummmobile_layout.stx
  4. +28 −0 engines/dreamweb/detection.cpp
  5. +1 −2  engines/dreamweb/dreamweb.cpp
  6. +1 −2  engines/dreamweb/dreamweb.h
  7. +1 −5 engines/dreamweb/stubs.cpp
  8. +1 −1  engines/dreamweb/vgagrafx.cpp
  9. +93 −0 engines/kyra/detection.cpp
  10. +24 −0 engines/metaengine.h
  11. +34 −0 engines/queen/queen.cpp
  12. +77 −0 engines/sci/detection.cpp
  13. +3 −0  engines/sci/engine/features.cpp
  14. +0 −5 engines/sci/sci.cpp
  15. +1 −8 engines/sci/sound/soundcmd.cpp
  16. +34 −0 engines/sky/detection.cpp
  17. +22 −0 engines/sword2/sword2.cpp
  18. +1 −1  gui/ThemeEngine.h
  19. +58 −13 gui/launcher.cpp
  20. +16 −0 gui/options.cpp
  21. +10 −0 gui/options.h
  22. +25 −0 gui/themes/default.inc
  23. BIN  gui/themes/scummclassic.zip
  24. +1 −1  gui/themes/scummclassic/THEMERC
  25. +26 −0 gui/themes/scummclassic/classic_layout.stx
  26. +26 −0 gui/themes/scummclassic/classic_layout_lowres.stx
  27. BIN  gui/themes/scummmodern.zip
  28. +1 −1  gui/themes/scummmodern/THEMERC
  29. +26 −0 gui/themes/scummmodern/scummmodern_layout.stx
  30. +26 −0 gui/themes/scummmodern/scummmodern_layout_lowres.stx
  31. +6 −0 po/POTFILES
View
8 base/main.cpp
@@ -195,7 +195,7 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const
}
// On creation the engine should have set up all debug levels so we can use
- // the command line arugments here
+ // the command line arguments here
Common::StringTokenizer tokenizer(edebuglevels, " ,");
while (!tokenizer.empty()) {
Common::String token = tokenizer.nextToken();
@@ -206,6 +206,12 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const
// Initialize any game-specific keymaps
engine->initKeymap();
+ // Set default values to the custom engine options
+ const ExtraGuiOptions engineOptions = (*plugin)->getExtraGuiOptions(ConfMan.getActiveDomainName());
+ for (uint i = 0; i < engineOptions.size(); i++) {
+ ConfMan.registerDefault(engineOptions[i].configOption, engineOptions[i].defaultState);
+ }
+
// Inform backend that the engine is about to be run
system.engineInit();
View
2  dists/bada/Res/scummmobile/THEMERC
@@ -1 +1 @@
-[SCUMMVM_STX0.8.3:ScummVM Mobile Theme:No Author]
+[SCUMMVM_STX0.8.9:ScummVM Mobile Theme:No Author]
View
26 dists/bada/Res/scummmobile/scummmobile_layout.stx
@@ -621,6 +621,32 @@
</layout>
</dialog>
+ <dialog name = 'GameOptions_Engine' overlays = 'Dialog.GameOptions.TabWidget' shading = 'dim'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16'>
+ <widget name = 'customOption1Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption2Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption3Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption4Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption5Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption6Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption7Checkbox'
+ type = 'Checkbox'
+ />
+ </layout>
+ </dialog>
+
<dialog name = 'GlobalMenu' overlays = 'screen_center'>
<layout type = 'vertical' padding = '16, 16, 16, 16' center = 'true'>
<widget name = 'Logo'
View
28 engines/dreamweb/detection.cpp
@@ -24,6 +24,7 @@
#include "common/algorithm.h"
#include "common/system.h"
+#include "common/translation.h"
#include "engines/advancedDetector.h"
@@ -62,6 +63,7 @@ class DreamWebMetaEngine : public AdvancedMetaEngine {
virtual int getMaximumSaveSlot() const;
virtual void removeSaveState(const char *target, int slot) const;
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+ const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;
};
bool DreamWebMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -193,6 +195,32 @@ SaveStateDescriptor DreamWebMetaEngine::querySaveMetaInfos(const char *target, i
return SaveStateDescriptor();
}
+const ExtraGuiOptions DreamWebMetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ static const ExtraGuiOption optionsList[] = {
+ {
+ _s("Use original save/load screens"),
+ _s("Use the original save/load screens, instead of the ScummVM ones"),
+ "dreamweb_originalsaveload",
+ false
+ },
+ {
+ _s("Use bright palette mode"),
+ _s("Display graphics using the game's bright palette"),
+ "bright_palette",
+ true
+ },
+ { 0, 0, 0, 0 }
+ };
+
+ ExtraGuiOptions returnList;
+ uint i = 0;
+ while (optionsList[i].configOption) {
+ returnList.push_back(optionsList[i++]);
+ }
+
+ return returnList;
+}
+
#if PLUGIN_ENABLED_DYNAMIC(DREAMWEB)
REGISTER_PLUGIN_DYNAMIC(DREAMWEB, PLUGIN_TYPE_ENGINE, DreamWebMetaEngine);
#else
View
3  engines/dreamweb/dreamweb.cpp
@@ -89,7 +89,7 @@ DreamWebEngine::DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gam
_speechCount = 0;
_charShift = 0;
_kerning = 0;
- _brightness = 0;
+ _brightPalette = true;
_roomLoaded = 0;
_didZoom = 0;
_lineSpacing = 10;
@@ -365,7 +365,6 @@ Common::Error DreamWebEngine::run() {
syncSoundSettings();
_console = new DreamWebConsole(this);
- ConfMan.registerDefault("dreamweb_originalsaveload", "false");
_hasSpeech = Common::File::exists("speech/r01c0000.raw") && !ConfMan.getBool("speech_mute");
_timer->installTimerProc(vSyncInterrupt, 1000000 / 70, this, "dreamwebVSync");
View
3  engines/dreamweb/dreamweb.h
@@ -341,7 +341,7 @@ class DreamWebEngine : public Engine {
uint8 _speechCount;
uint16 _charShift;
uint8 _kerning;
- uint8 _brightness;
@sev- Owner
sev- added a note

In fact this should be split into a separate commit. First is the rename and refactoring, then adding the option.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ bool _brightPalette;
uint8 _roomLoaded;
uint8 _didZoom;
uint16 _lineSpacing;
@@ -952,7 +952,6 @@ class DreamWebEngine : public Engine {
void screenUpdate();
void startup1();
void readOneBlock();
- void seeCommandTail();
bool checkIfPerson(uint8 x, uint8 y);
bool checkIfFree(uint8 x, uint8 y);
bool checkIfEx(uint8 x, uint8 y);
View
6 engines/dreamweb/stubs.cpp
@@ -565,7 +565,7 @@ void DreamWebEngine::dreamweb() {
break;
}
- seeCommandTail();
+ _brightPalette = ConfMan.getBool("bright_palette");
allocateBuffers();
// setMouse
@@ -877,10 +877,6 @@ void DreamWebEngine::hangOnCurs(uint16 frameCount) {
}
}
-void DreamWebEngine::seeCommandTail() {
- _brightness = 1;
-}
-
void DreamWebEngine::readMouse() {
_oldButton = _mouseButton;
uint16 state = readMouseState();
View
2  engines/dreamweb/vgagrafx.cpp
@@ -417,7 +417,7 @@ void DreamWebEngine::loadPalFromIFF() {
uint8 *dst = _mainPal;
for (size_t i = 0; i < 256*3; ++i) {
uint8 c = src[i] / 4;
- if (_brightness == 1) {
+ if (_brightPalette) {
if (c) {
c = c + c / 2 + c / 4;
if (c > 63)
View
93 engines/kyra/detection.cpp
@@ -30,6 +30,7 @@
#include "common/config-manager.h"
#include "common/system.h"
#include "common/savefile.h"
+#include "common/translation.h"
#include "engines/advancedDetector.h"
@@ -80,6 +81,7 @@ class KyraMetaEngine : public AdvancedMetaEngine {
virtual int getMaximumSaveSlot() const;
void removeSaveState(const char *target, int slot) const;
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+ const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;
};
bool KyraMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -245,6 +247,97 @@ SaveStateDescriptor KyraMetaEngine::querySaveMetaInfos(const char *target, int s
return desc;
}
+const ExtraGuiOptions KyraMetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ static const ExtraGuiOption optionsList[] = {
+ // Kyrandia 3 options
+ // Studio audience adds an applause and cheering sounds whenever
+ // Malcolm makes a joke.
+ {
+ _s("Studio audience"),
+ _s("Enable studio audience"),
+ "studio_audience",
+ true
+ },
+ // When enabled, this option allows the user to skip text and cutscenes.
+ {
+ _s("Skip support"),
+ _s("Allow text and cutscenes to be skipped"),
+ "skip_support",
+ true
+ },
+ // Helium mode makes Malcolm sound like he's inhaled Helium.
+ {
+ _s("Helium mode"),
+ _s("Enable helium mode"),
+ "helium_mode",
+ false
+ },
+#ifdef ENABLE_LOL
+ // LoL options
+ // When enabled, this option makes scrolling smoother when changing
+ // from one screen to another.
+ {
+ _s("Smooth scrolling"),
+ _s("Enable smooth scrolling when walking"),
+ "smooth_scrolling",
+ true
+ },
+ // 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.
+ {
+ _s("Floating cursors"),
+ _s("Enable floating cursors"),
+ "floating_cursors",
+ false
+ },
+#endif
+#ifdef ENABLE_EOB
+ // EOB options
+ {
+ _s("HP bar graphs"),
+ _s("Enable hit point bar graphs"),
+ "hpbargraphs",
+ true
+ },
+#endif
+ { 0, 0, 0, 0 }
+ };
+
+ Common::String gameId = ConfMan.getDomain(target)->getVal("gameid");
+ ExtraGuiOptions returnList;
+ uint i = 0;
+ while (optionsList[i].configOption) {
+ Common::String curOption = optionsList[i].configOption;
+ // Only add game specific options to the games that apply
+ if (curOption == "studio_audience" || curOption == "skip_support" || curOption == "helium_mode") {
+ if (!gameId.equalsIgnoreCase("kyra3")) {
+ i++;
+ continue;
+ }
+ }
+#ifdef ENABLE_LOL
+ if (curOption == "smooth_scrolling" || curOption == "floating_cursors") {
+ if (!gameId.equalsIgnoreCase("lol")) {
+ i++;
+ continue;
+ }
+ }
+#endif
+#ifdef ENABLE_EOB
+ if (curOption == "hpbargraphs") {
+ if (!!gameId.equalsIgnoreCase("eob")) {
+ i++;
+ continue;
+ }
+ }
+#endif
+ returnList.push_back(optionsList[i++]);
+ }
+
+ return returnList;
+}
+
#if PLUGIN_ENABLED_DYNAMIC(KYRA)
REGISTER_PLUGIN_DYNAMIC(KYRA, PLUGIN_TYPE_ENGINE, KyraMetaEngine);
#else
View
24 engines/metaengine.h
@@ -24,6 +24,7 @@
#include "common/scummsys.h"
#include "common/error.h"
+#include "common/array.h"
#include "engines/game.h"
#include "engines/savestate.h"
@@ -39,6 +40,19 @@ class String;
}
/**
+ * Per-game extra GUI options structure.
+ * Currently, this can only be used for options with checkboxes.
+ */
+struct ExtraGuiOption {
+ const char *label; // option label, e.g. "Fullscreen mode"
+ const char *tooltip; // option tooltip (when the mouse hovers above it)
+ const char *configOption; // confMan key, e.g. "fullscreen"
+ bool defaultState; // the detault state of the checkbox (checked or not)
+};
+
+typedef Common::Array<ExtraGuiOption> ExtraGuiOptions;
+
+/**
* A meta engine is essentially a factory for Engine instances with the
* added ability of listing and detecting supported games.
* Every engine "plugin" provides a hook to get an instance of a MetaEngine
@@ -98,6 +112,16 @@ class MetaEngine : public PluginObject {
}
/**
+ * Return a list of extra GUI options.
+ * Currently, this only supports options with checkboxes.
+ *
+ * The default implementation returns an empty list.
+ */
+ virtual const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const {
+ return ExtraGuiOptions();
+ }
+
+ /**
* Return the maximum save slot that the engine supports.
*
* @note MetaEngines must indicate that this function has been implemented
View
34 engines/queen/queen.cpp
@@ -30,6 +30,7 @@
#include "common/system.h"
#include "common/events.h"
#include "common/textconsole.h"
+#include "common/translation.h"
#include "engines/util.h"
@@ -65,6 +66,7 @@ class QueenMetaEngine : public MetaEngine {
virtual GameList detectGames(const Common::FSList &fslist) const;
virtual SaveStateList listSaves(const char *target) const;
virtual void removeSaveState(const char *target, int slot) const;
+ const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;
virtual Common::Error createInstance(OSystem *syst, Engine **engine) const;
};
@@ -181,6 +183,38 @@ Common::Error QueenMetaEngine::createInstance(OSystem *syst, Engine **engine) co
return Common::kNoError;
}
+const ExtraGuiOptions QueenMetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ static const ExtraGuiOption optionsList[] = {
+ {
+ _s("Show alternative intro"),
+ _s("Show the intro of the floppy version in the CD version"),
+ "alt_intro",
+ false
+ },
+ { 0, 0, 0, 0 }
+ };
+
+ Common::String guiOptions;
+ if (ConfMan.hasKey("guioptions", target)) {
+ guiOptions = ConfMan.get("guioptions", target);
+ guiOptions = parseGameGUIOptions(guiOptions);
+ }
+
+ ExtraGuiOptions returnList;
+ uint i = 0;
+ while (optionsList[i].configOption) {
+ Common::String curOption = optionsList[i].configOption;
+ // Only add game specific options to the games that apply
+ if (curOption == "alt_intro" && guiOptions.contains(GUIO_NOSPEECH)) {
+ i++;
+ continue;
+ }
+ returnList.push_back(optionsList[i++]);
+ }
+
+ return returnList;
+}
+
#if PLUGIN_ENABLED_DYNAMIC(QUEEN)
REGISTER_PLUGIN_DYNAMIC(QUEEN, PLUGIN_TYPE_ENGINE, QueenMetaEngine);
#else
View
77 engines/sci/detection.cpp
@@ -22,10 +22,12 @@
#include "engines/advancedDetector.h"
#include "base/plugins.h"
+#include "common/config-manager.h"
#include "common/file.h"
#include "common/ptr.h"
#include "common/savefile.h"
#include "common/system.h"
+#include "common/translation.h"
#include "graphics/thumbnail.h"
#include "graphics/surface.h"
@@ -403,6 +405,7 @@ class SciMetaEngine : public AdvancedMetaEngine {
virtual int getMaximumSaveSlot() const;
virtual void removeSaveState(const char *target, int slot) const;
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+ const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;
};
Common::Language charToScummVMLanguage(const char c) {
@@ -710,6 +713,80 @@ SaveStateDescriptor SciMetaEngine::querySaveMetaInfos(const char *target, int sl
int SciMetaEngine::getMaximumSaveSlot() const { return 99; }
+const ExtraGuiOptions SciMetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ static const ExtraGuiOption optionsList[] = {
+ {
+ _s("Prefer digital sound effects"),
+ _s("Prefer digital sound effects instead of synthesized ones"),
+ "prefer_digitalsfx",
+ true
+ },
+ {
+ _s("Use original save/load screens"),
+ _s("Use the original save/load screens, instead of the ScummVM ones"),
+ "sci_originalsaveload",
+ false
+ },
+ {
+ _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"),
+ "native_fb01",
+ false
+ },
+ {
+ // Jones in the Fast Lane - CD audio tracks or resource.snd
+ _s("Use CD audio"),
+ _s("Use CD audio instead of in-game audio, if available"),
+ "use_cdaudio",
+ true
+ },
+ {
+ // KQ6 Windows - windows cursors
+ _s("Use Windows cursors"),
+ _s("Use the Windows cursors (smaller and monochrome) instead of the DOS ones"),
+ "windows_cursors",
+ false
+ },
+ { 0, 0, 0, 0 }
+ };
+
+ Common::String gameId = ConfMan.getDomain(target)->getVal("gameid");
+ // We can't get a game ID in SCI, as _singleId will always overwrite game
@sev- Owner
sev- added a note

This is utterly wrong. You should not pass 'target' at all as it is not needed.

By this point the engine redetected the game, since it was initialised, and thus you should have access to ADGameDescription instance which defines all required things, including _gameDescription->gameid.

Please change as described other engines too.

@lordhoto Collaborator

By this point the engine redetected the game, since it was initialised, and thus you should have access to ADGameDescription instance which defines all required things, including _gameDescription->gameid.

That is not the case, currently there is no detection phase guaranteed before this function is called and in fact there isn't one before clicking on "Edit game..." for example. So this really can just work with a user target supplied. Furthermore it's correct that for singleId engines, this won't work well right now, since checking the target name is just plain madness, since that could be anything. But then again this is really rather a problem with the singleId stuff and not with this interface to access target specific options.

@sev- Owner
sev- added a note

May be I am reading my code wrong, but the game detection happens in MetaEngine::createInstance() method which is called on the engine loading. So the detection will actually take place.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ // IDs with "sci". Therefore, we fiddle with the target ID instead.
+ // HACK: In this case, we just set the game ID to "kq6" or "jones" depending
+ // on the target. Everything else is left as "sci" (the default setting from
+ // _singleId).
+ if (target.hasPrefix("jones"))
+ gameId = "jones";
+ if (target.hasPrefix("kq6"))
+ gameId = "kq6";
+
+ const Common::Platform platform = Common::parsePlatform(ConfMan.get("platform", target));
+ Common::String guiOptions;
+ if (ConfMan.hasKey("guioptions", target)) {
+ guiOptions = ConfMan.get("guioptions", target);
+ guiOptions = parseGameGUIOptions(guiOptions);
+ }
+
+ ExtraGuiOptions returnList;
+ uint i = 0;
+ while (optionsList[i].configOption) {
+ Common::String curOption = optionsList[i].configOption;
+ // Only add game specific options to the games that apply
+ if (curOption == "use_cdaudio" && (!gameId.equalsIgnoreCase("jones") || guiOptions.contains(GUIO_NOSPEECH))) {
+ i++;
+ continue;
+ }
+ if (curOption == "windows_cursors" && (!gameId.equalsIgnoreCase("kq6") || platform != Common::kPlatformWindows)) {
+ i++;
+ continue;
+ }
+ returnList.push_back(optionsList[i++]);
+ }
+
+ return returnList;
+}
+
void SciMetaEngine::removeSaveState(const char *target, int slot) const {
Common::String fileName = Common::String::format("%s.%03d", target, slot);
g_system->getSavefileManager()->removeSavefile(fileName);
View
3  engines/sci/engine/features.cpp
@@ -26,6 +26,7 @@
#include "sci/engine/selector.h"
#include "sci/engine/vm.h"
+#include "common/config-manager.h"
#include "common/file.h"
namespace Sci {
@@ -42,6 +43,8 @@ GameFeatures::GameFeatures(SegManager *segMan, Kernel *kernel) : _segMan(segMan)
_sci2StringFunctionType = kSci2StringFunctionUninitialized;
#endif
_usesCdTrack = Common::File::exists("cdaudio.map");
+ if (ConfMan.hasKey("use_cdaudio") && !ConfMan.getBool("use_cdaudio"))
+ _usesCdTrack = false;
}
reg_t GameFeatures::getDetectionAddr(const Common::String &objName, Selector slc, int methodNum) {
View
5 engines/sci/sci.cpp
@@ -190,11 +190,6 @@ SciEngine::~SciEngine() {
extern void showScummVMDialog(const Common::String &message);
Common::Error SciEngine::run() {
- // Assign default values to the config manager, in case settings are missing
- ConfMan.registerDefault("sci_originalsaveload", "false");
- ConfMan.registerDefault("native_fb01", "false");
- ConfMan.registerDefault("windows_cursors", "false"); // Windows cursors for KQ6 Windows
-
_resMan = new ResourceManager();
assert(_resMan);
_resMan->addAppropriateSources();
View
9 engines/sci/sound/soundcmd.cpp
@@ -32,15 +32,12 @@
namespace Sci {
-//#define ENABLE_SFX_TYPE_SELECTION
-
SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, AudioPlayer *audio, SciVersion soundVersion) :
_resMan(resMan), _segMan(segMan), _kernel(kernel), _audio(audio), _soundVersion(soundVersion) {
-#ifdef ENABLE_SFX_TYPE_SELECTION
// Check if the user wants synthesized or digital sound effects in SCI1.1
// or later games
- _useDigitalSFX = ConfMan.getBool("multi_midi");
+ _useDigitalSFX = ConfMan.getBool("prefer_digitalsfx");
// In SCI2 and later games, this check should always be true - there was
// always only one version of each sound effect or digital music track
@@ -48,10 +45,6 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM
// resource number, but it's totally unrelated to the menu music).
if (getSciVersion() >= SCI_VERSION_2)
_useDigitalSFX = true;
-#else
- // Always prefer digital sound effects
- _useDigitalSFX = true;
-#endif
_music = new SciMusic(_soundVersion, _useDigitalSFX);
_music->init();
View
34 engines/sky/detection.cpp
@@ -32,6 +32,7 @@
#include "common/fs.h"
#include "common/savefile.h"
#include "common/textconsole.h"
+#include "common/translation.h"
#include "engines/metaengine.h"
@@ -76,6 +77,7 @@ class SkyMetaEngine : public MetaEngine {
virtual SaveStateList listSaves(const char *target) const;
virtual int getMaximumSaveSlot() const;
virtual void removeSaveState(const char *target, int slot) const;
+ const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;
};
const char *SkyMetaEngine::getName() const {
@@ -268,6 +270,38 @@ void SkyMetaEngine::removeSaveState(const char *target, int slot) const {
warning("Unable to store Savegame names to file SKY-VM.SAV. (%s)", saveFileMan->popErrorDesc().c_str());
}
+const ExtraGuiOptions SkyMetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ static const ExtraGuiOption optionsList[] = {
+ {
+ _s("Show alternative intro"),
+ _s("Show the intro of the floppy version in the CD version"),
+ "alt_intro",
+ false
+ },
+ { 0, 0, 0, 0 }
+ };
+
+ Common::String guiOptions;
+ if (ConfMan.hasKey("guioptions", target)) {
+ guiOptions = ConfMan.get("guioptions", target);
+ guiOptions = parseGameGUIOptions(guiOptions);
+ }
+
+ ExtraGuiOptions returnList;
+ uint i = 0;
+ while (optionsList[i].configOption) {
+ Common::String curOption = optionsList[i].configOption;
+ // Only add game specific options to the games that apply
+ if (curOption == "alt_intro" && guiOptions.contains(GUIO_NOSPEECH)) {
+ i++;
+ continue;
+ }
+ returnList.push_back(optionsList[i++]);
+ }
+
+ return returnList;
+}
+
#if PLUGIN_ENABLED_DYNAMIC(SKY)
REGISTER_PLUGIN_DYNAMIC(SKY, PLUGIN_TYPE_ENGINE, SkyMetaEngine);
#else
View
22 engines/sword2/sword2.cpp
@@ -32,6 +32,7 @@
#include "common/savefile.h"
#include "common/system.h"
#include "common/textconsole.h"
+#include "common/translation.h"
#include "engines/metaengine.h"
#include "engines/util.h"
@@ -90,6 +91,7 @@ class Sword2MetaEngine : public MetaEngine {
virtual SaveStateList listSaves(const char *target) const;
virtual int getMaximumSaveSlot() const;
virtual void removeSaveState(const char *target, int slot) const;
+ const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const;
virtual Common::Error createInstance(OSystem *syst, Engine **engine) const;
};
@@ -241,6 +243,26 @@ Common::Error Sword2MetaEngine::createInstance(OSystem *syst, Engine **engine) c
return Common::kNoGameDataFoundError;
}
+const ExtraGuiOptions Sword2MetaEngine::getExtraGuiOptions(const Common::String &target) const {
+ static const ExtraGuiOption optionsList[] = {
+ {
+ _s("Show object labels"),
+ _s("Show labels for objects on mouse hover"),
+ "object_labels",
+ false
+ },
+ { 0, 0, 0, 0 }
+ };
+
+ ExtraGuiOptions returnList;
+ uint i = 0;
+ while (optionsList[i].configOption) {
+ returnList.push_back(optionsList[i++]);
+ }
+
+ return returnList;
+}
+
#if PLUGIN_ENABLED_DYNAMIC(SWORD2)
REGISTER_PLUGIN_DYNAMIC(SWORD2, PLUGIN_TYPE_ENGINE, Sword2MetaEngine);
#else
View
2  gui/ThemeEngine.h
@@ -35,7 +35,7 @@
#include "graphics/pixelformat.h"
-#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.8"
+#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.9"
class OSystem;
View
71 gui/launcher.cpp
@@ -119,7 +119,7 @@ class EditGameDialog : public OptionsDialog {
typedef Common::String String;
typedef Common::Array<Common::String> StringArray;
public:
- EditGameDialog(const String &domain, const String &desc);
+ EditGameDialog(const String &domain, const String &desc, const ExtraGuiOptions &engineOptions);
void open();
void close();
@@ -145,11 +145,17 @@ class EditGameDialog : public OptionsDialog {
CheckboxWidget *_globalMIDIOverride;
CheckboxWidget *_globalMT32Override;
CheckboxWidget *_globalVolumeOverride;
+
+ ExtraGuiOptions _engineOptions;
};
-EditGameDialog::EditGameDialog(const String &domain, const String &desc)
+EditGameDialog::EditGameDialog(const String &domain, const String &desc, const ExtraGuiOptions &engineOptions)
: OptionsDialog(domain, "GameOptions") {
+ for (uint i = 0; i < engineOptions.size(); i++) {
+ _engineOptions.push_back(engineOptions[i]);
+ }
+
// GAME: Path to game data (r/o), extra data (r/o), and save data (r/w)
String gamePath(ConfMan.get("path", _domain));
String extraPath(ConfMan.get("extrapath", _domain));
@@ -208,7 +214,16 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
}
//
- // 2) The graphics tab
+ // 2) The engine tab (shown only if there are custom engine options)
+ //
+ if (_engineOptions.size() > 0) {
+ tab->addTab(_("Engine"));
+
+ addEngineControls(tab, "GameOptions_Engine.", _engineOptions);
+ }
+
+ //
+ // 3) The graphics tab
//
_graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX"));
@@ -220,7 +235,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
addGraphicControls(tab, "GameOptions_Graphics.");
//
- // 3) The audio tab
+ // 4) The audio tab
//
tab->addTab(_("Audio"));
@@ -233,7 +248,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
addSubtitleControls(tab, "GameOptions_Audio.");
//
- // 4) The volume tab
+ // 5) The volume tab
//
if (g_system->getOverlayWidth() > 320)
tab->addTab(_("Volume"));
@@ -248,7 +263,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
addVolumeControls(tab, "GameOptions_Volume.");
//
- // 5) The MIDI tab
+ // 6) The MIDI tab
//
if (!_guioptions.contains(GUIO_NOMIDI)) {
tab->addTab(_("MIDI"));
@@ -262,7 +277,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
}
//
- // 6) The MT-32 tab
+ // 7) The MT-32 tab
//
if (!_guioptions.contains(GUIO_NOMIDI)) {
tab->addTab(_("MT-32"));
@@ -276,7 +291,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
}
//
- // 7) The Paths tab
+ // 8) The Paths tab
//
if (g_system->getOverlayWidth() > 320)
tab->addTab(_("Paths"));
@@ -311,7 +326,6 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
_savePathClearButton = addClearButton(tab, "GameOptions_Paths.SavePathClearButton", kCmdSavePathClear);
-
// Activate the first tab
tab->setActiveTab(0);
_tabWidget = tab;
@@ -386,6 +400,19 @@ void EditGameDialog::open() {
_langPopUp->setEnabled(false);
}
+ // Set the state of engine-specific checkboxes
+ for (uint i = 0; i < _engineOptions.size(); i++) {
+ // The default values for engine-specific checkboxes are not set when
+ // ScummVM starts, as this would require us to load and poll all of the
+ // engine plugins on startup. Thus, we set the state of each custom
+ // option checkbox to what is specified by the engine plugin, and
+ // update it only if a value has been set in the configuration of the
+ // currently selected game.
+ bool isChecked = _engineOptions[i].defaultState;
+ if (ConfMan.hasKey(_engineOptions[i].configOption, _domain))
+ isChecked = ConfMan.getBool(_engineOptions[i].configOption, _domain);
+ _engineCheckboxes[i]->setState(isChecked);
+ }
const Common::PlatformDescription *p = Common::g_platforms;
const Common::Platform platform = Common::parsePlatform(ConfMan.get("platform", _domain));
@@ -429,6 +456,11 @@ void EditGameDialog::close() {
ConfMan.removeKey("platform", _domain);
else
ConfMan.set("platform", Common::getPlatformCode(platform), _domain);
+
+ // Set the state of engine-specific checkboxes
+ for (uint i = 0; i < _engineOptions.size(); i++) {
+ ConfMan.setBool(_engineOptions[i].configOption, _engineCheckboxes[i]->getState(), _domain);
+ }
}
OptionsDialog::close();
}
@@ -832,7 +864,12 @@ void LauncherDialog::addGame() {
Common::String domain = addGameToConf(result);
// Display edit dialog for the new entry
- EditGameDialog editDialog(domain, result.description());
+ const EnginePlugin *plugin = 0;
+ GameDescriptor gameInfo = EngineMan.findGame(result.gameid(), &plugin);
+ // At this point, the plugin should always be set, as the game
+ // that will be added has been detected successfully.
+ assert(plugin);
+ EditGameDialog editDialog(domain, result.description(), (*plugin)->getExtraGuiOptions(domain));
if (editDialog.runModal() > 0) {
// User pressed OK, so make changes permanent
@@ -917,10 +954,18 @@ void LauncherDialog::editGame(int item) {
// This is useful because e.g. MonkeyVGA needs AdLib music to have decent
// music support etc.
assert(item >= 0);
- String gameId(ConfMan.get("gameid", _domains[item]));
+ Common::String target = _domains[item];
+ String gameId(ConfMan.get("gameid", target));
if (gameId.empty())
- gameId = _domains[item];
- EditGameDialog editDialog(_domains[item], EngineMan.findGame(gameId).description());
+ gameId = target;
+
+ const EnginePlugin *plugin = 0;
+ GameDescriptor gameInfo = EngineMan.findGame(gameId, &plugin);
+ // The plugin may be null, e.g. in platforms that use engine
+ // plugins. One could have game entries in the config file, for
+ // which the engine plugin is no longer installed.
+ const ExtraGuiOptions extraOptions = plugin ? (*plugin)->getExtraGuiOptions(target) : ExtraGuiOptions();
+ EditGameDialog editDialog(target, gameInfo.description(), extraOptions);
if (editDialog.runModal() > 0) {
// User pressed OK, so make changes permanent
View
16 gui/options.cpp
@@ -997,6 +997,22 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre
_enableVolumeSettings = true;
}
+void OptionsDialog::addEngineControls(GuiObject *boss, const Common::String &prefix, const ExtraGuiOptions &engineOptions) {
+ // Note: up to 7 engine options can currently fit on screen (the most that
+ // can fit in a 320x200 screen with the classic theme).
+ // TODO: Increase this number by including the checkboxes inside a scroll
+ // widget. The appropriate number of checkboxes will need to be added to
+ // the theme files.
+
+ uint i = 1;
+ ExtraGuiOptions::const_iterator iter;
+ for (iter = engineOptions.begin(); iter != engineOptions.end(); ++iter, ++i) {
+ Common::String id = Common::String::format("%d", i);
+ _engineCheckboxes.push_back(new CheckboxWidget(boss,
+ prefix + "customOption" + id + "Checkbox", _(iter->label), _(iter->tooltip)));
+ }
+}
+
bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicType preferredType) {
if (!popup || !popup->isEnabled())
return true;
View
10 gui/options.h
@@ -22,6 +22,8 @@
#ifndef OPTIONS_DIALOG_H
#define OPTIONS_DIALOG_H
+#include "engines/metaengine.h"
+
#include "gui/dialog.h"
#include "common/str.h"
#include "audio/mididrv.h"
@@ -44,6 +46,8 @@ class RadiobuttonGroup;
class RadiobuttonWidget;
class OptionsDialog : public Dialog {
+ typedef Common::Array<CheckboxWidget *> CheckboxWidgetList;
+
public:
OptionsDialog(const Common::String &domain, int x, int y, int w, int h);
OptionsDialog(const Common::String &domain, const Common::String &name);
@@ -74,6 +78,7 @@ class OptionsDialog : public Dialog {
// The default value is the launcher's non-scaled talkspeed value. When SCUMM uses the widget,
// it uses its own scale
void addSubtitleControls(GuiObject *boss, const Common::String &prefix, int maxSliderVal = 255);
+ void addEngineControls(GuiObject *boss, const Common::String &prefix, const ExtraGuiOptions &engineOptions);
void setGraphicSettingsState(bool enabled);
void setAudioSettingsState(bool enabled);
@@ -183,6 +188,11 @@ class OptionsDialog : public Dialog {
//Theme Options
//
Common::String _oldTheme;
+
+ //
+ // Engine-specific controls
+ //
+ CheckboxWidgetList _engineCheckboxes;
};
View
25 gui/themes/default.inc
@@ -1187,6 +1187,31 @@
"</layout> "
"</layout> "
"</dialog> "
+"<dialog name = 'GameOptions_Engine' overlays = 'Dialog.GameOptions.TabWidget' shading = 'dim'> "
+"<layout type = 'vertical' padding = '16, 16, 16, 16'> "
+"<widget name = 'customOption1Checkbox' "
+"type = 'Checkbox' "
+"/> "
+"<widget name = 'customOption2Checkbox' "
+"type = 'Checkbox' "
+"/> "
+"<widget name = 'customOption3Checkbox' "
+"type = 'Checkbox' "
+"/> "
+"<widget name = 'customOption4Checkbox' "
+"type = 'Checkbox' "
+"/> "
+"<widget name = 'customOption5Checkbox' "
+"type = 'Checkbox' "
+"/> "
+"<widget name = 'customOption6Checkbox' "
+"type = 'Checkbox' "
+"/> "
+"<widget name = 'customOption7Checkbox' "
+"type = 'Checkbox' "
+"/> "
+"</layout> "
+"</dialog> "
"<dialog name='GlobalMenu' overlays='screen_center'> "
"<layout type='vertical' padding='2,2,4,6' center='true' spacing='6'> "
"<widget name='Title' "
View
BIN  gui/themes/scummclassic.zip
Binary file not shown
View
2  gui/themes/scummclassic/THEMERC
@@ -1 +1 @@
-[SCUMMVM_STX0.8.8:ScummVM Classic Theme:No Author]
+[SCUMMVM_STX0.8.9:ScummVM Classic Theme:No Author]
View
26 gui/themes/scummclassic/classic_layout.stx
@@ -627,6 +627,32 @@
</layout>
</dialog>
+ <dialog name = 'GameOptions_Engine' overlays = 'Dialog.GameOptions.TabWidget' shading = 'dim'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16'>
+ <widget name = 'customOption1Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption2Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption3Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption4Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption5Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption6Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption7Checkbox'
+ type = 'Checkbox'
+ />
+ </layout>
+ </dialog>
+
<dialog name = 'GlobalMenu' overlays = 'screen_center'>
<layout type = 'vertical' padding = '16, 16, 16, 16' center = 'true'>
<widget name = 'Title'
View
26 gui/themes/scummclassic/classic_layout_lowres.stx
@@ -639,6 +639,32 @@
</layout>
</dialog>
+ <dialog name = 'GameOptions_Engine' overlays = 'Dialog.GameOptions.TabWidget' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8'>
+ <widget name = 'customOption1Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption2Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption3Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption4Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption5Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption6Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption7Checkbox'
+ type = 'Checkbox'
+ />
+ </layout>
+ </dialog>
+
<dialog name = 'GlobalMenu' overlays = 'screen_center'>
<layout type = 'vertical' padding = '2, 2, 4, 6' center = 'true' spacing='6'>
<widget name = 'Title'
View
BIN  gui/themes/scummmodern.zip
Binary file not shown
View
2  gui/themes/scummmodern/THEMERC
@@ -1 +1 @@
-[SCUMMVM_STX0.8.8:ScummVM Modern Theme:No Author]
+[SCUMMVM_STX0.8.9:ScummVM Modern Theme:No Author]
View
26 gui/themes/scummmodern/scummmodern_layout.stx
@@ -642,6 +642,32 @@
</layout>
</dialog>
+ <dialog name = 'GameOptions_Engine' overlays = 'Dialog.GameOptions.TabWidget' shading = 'dim'>
+ <layout type = 'vertical' padding = '16, 16, 16, 16'>
+ <widget name = 'customOption1Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption2Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption3Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption4Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption5Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption6Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption7Checkbox'
+ type = 'Checkbox'
+ />
+ </layout>
+ </dialog>
+
<dialog name = 'GlobalMenu' overlays = 'screen_center'>
<layout type = 'vertical' padding = '16, 16, 16, 16' center = 'true'>
<widget name = 'Logo'
View
26 gui/themes/scummmodern/scummmodern_layout_lowres.stx
@@ -637,6 +637,32 @@
</layout>
</dialog>
+ <dialog name = 'GameOptions_Engine' overlays = 'Dialog.GameOptions.TabWidget' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8'>
+ <widget name = 'customOption1Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption2Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption3Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption4Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption5Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption6Checkbox'
+ type = 'Checkbox'
+ />
+ <widget name = 'customOption7Checkbox'
+ type = 'Checkbox'
+ />
+ </layout>
+ </dialog>
+
<dialog name = 'GlobalMenu' overlays = 'screen_center'>
<layout type = 'vertical' padding = '4, 4, 4, 4' center = 'true' spacing='2'>
<widget name = 'Title'
View
6 po/POTFILES
@@ -23,6 +23,8 @@ common/util.cpp
engines/advancedDetector.cpp
engines/dialogs.cpp
engines/engine.cpp
+engines/dreamweb/detection.cpp
+engines/sci/detection.cpp
engines/scumm/dialogs.cpp
engines/scumm/help.cpp
engines/scumm/scumm.cpp
@@ -37,14 +39,18 @@ engines/gob/inter_playtoons.cpp
engines/gob/inter_v2.cpp
engines/gob/inter_v5.cpp
engines/groovie/script.cpp
+engines/kyra/detection.cpp
engines/kyra/lol.cpp
engines/kyra/sound_midi.cpp
+engines/queen/queen.cpp
engines/sky/compact.cpp
+engines/sky/detection.cpp
engines/sword1/animation.cpp
engines/sword1/control.cpp
engines/sword1/logic.cpp
engines/sword1/sword1.cpp
engines/sword2/animation.cpp
+engines/sword2/sword2.cpp
engines/tinsel/saveload.cpp
engines/parallaction/saveload.cpp
Something went wrong with that request. Please try again.