SHERLOCK: RT: Fix Options dialog event handling
This commit is contained in:
parent
58380d5661
commit
67d2bf8589
7 changed files with 82 additions and 34 deletions
|
@ -62,6 +62,8 @@ static const PlainGameDescriptor sherlockGames[] = {
|
|||
#define GAMEOPTION_HELP_STYLE GUIO_GAMEOPTIONS3
|
||||
#define GAMEOPTION_PORTRAITS_ON GUIO_GAMEOPTIONS4
|
||||
#define GAMEOPTION_WINDOW_STYLE GUIO_GAMEOPTIONS5
|
||||
#define GAMEOPTION_TRANSPARENT_WINDOWS GUIO_GAMEOPTIONS6
|
||||
#define GAMEOPTION_TEXT_WINDOWS GUIO_GAMEOPTIONS7
|
||||
|
||||
static const ADExtraGuiOptionsMap optionsList[] = {
|
||||
{
|
||||
|
@ -114,6 +116,26 @@ static const ADExtraGuiOptionsMap optionsList[] = {
|
|||
}
|
||||
},
|
||||
|
||||
{
|
||||
GAMEOPTION_TRANSPARENT_WINDOWS,
|
||||
{
|
||||
_s("Transparent windows"),
|
||||
_s("Show windows with a partially transparent background"),
|
||||
"transparent_windows",
|
||||
true
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
GAMEOPTION_TEXT_WINDOWS,
|
||||
{
|
||||
_s("Text windows"),
|
||||
_s("Show text windows during conversations"),
|
||||
"text_windows",
|
||||
true
|
||||
}
|
||||
},
|
||||
|
||||
AD_EXTRA_GUI_OPTIONS_TERMINATOR
|
||||
};
|
||||
|
||||
|
|
|
@ -130,7 +130,8 @@ static const SherlockGameDescription gameDescriptions[] = {
|
|||
Common::EN_ANY,
|
||||
Common::kPlatformDOS,
|
||||
ADGF_UNSTABLE,
|
||||
GUIO0()
|
||||
GUIO4(GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_HELP_STYLE, GAMEOPTION_TEXT_WINDOWS,
|
||||
GAMEOPTION_TRANSPARENT_WINDOWS)
|
||||
},
|
||||
GType_RoseTattoo
|
||||
},
|
||||
|
@ -145,7 +146,8 @@ static const SherlockGameDescription gameDescriptions[] = {
|
|||
Common::EN_ANY,
|
||||
Common::kPlatformDOS,
|
||||
ADGF_UNSTABLE,
|
||||
GUIO0()
|
||||
GUIO4(GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_HELP_STYLE, GAMEOPTION_TEXT_WINDOWS,
|
||||
GAMEOPTION_TRANSPARENT_WINDOWS)
|
||||
},
|
||||
GType_RoseTattoo,
|
||||
},
|
||||
|
@ -160,7 +162,8 @@ static const SherlockGameDescription gameDescriptions[] = {
|
|||
Common::DE_DEU,
|
||||
Common::kPlatformDOS,
|
||||
ADGF_UNSTABLE,
|
||||
GUIO0()
|
||||
GUIO4(GAMEOPTION_ORIGINAL_SAVES, GAMEOPTION_HELP_STYLE, GAMEOPTION_TEXT_WINDOWS,
|
||||
GAMEOPTION_TRANSPARENT_WINDOWS)
|
||||
},
|
||||
GType_RoseTattoo,
|
||||
},
|
||||
|
|
|
@ -87,11 +87,6 @@ private:
|
|||
* Handle all player input
|
||||
*/
|
||||
void handleInput();
|
||||
|
||||
/**
|
||||
* Load game configuration esttings
|
||||
*/
|
||||
void loadConfig();
|
||||
protected:
|
||||
/**
|
||||
* Does basic initialization of the game engine
|
||||
|
@ -106,6 +101,11 @@ protected:
|
|||
* Returns a list of features the game itself supports
|
||||
*/
|
||||
virtual bool hasFeature(EngineFeature f) const;
|
||||
|
||||
/**
|
||||
* Load game configuration esttings
|
||||
*/
|
||||
virtual void loadConfig();
|
||||
public:
|
||||
const SherlockGameDescription *_gameDescription;
|
||||
Animation *_animation;
|
||||
|
@ -165,6 +165,11 @@ public:
|
|||
*/
|
||||
virtual void syncSoundSettings();
|
||||
|
||||
/**
|
||||
* Saves game configuration information
|
||||
*/
|
||||
virtual void saveConfig();
|
||||
|
||||
/**
|
||||
* Returns whether the version is a demo
|
||||
*/
|
||||
|
@ -209,11 +214,6 @@ public:
|
|||
*/
|
||||
void setFlagsDirect(int flagNum);
|
||||
|
||||
/**
|
||||
* Saves game configuration information
|
||||
*/
|
||||
void saveConfig();
|
||||
|
||||
/**
|
||||
* Synchronize the data for a savegame
|
||||
*/
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "common/config-manager.h"
|
||||
#include "engines/util.h"
|
||||
#include "sherlock/tattoo/tattoo.h"
|
||||
#include "sherlock/tattoo/tattoo_fixed_text.h"
|
||||
|
@ -178,6 +179,21 @@ void TattooEngine::doHangManPuzzle() {
|
|||
_hangmanWidget.show();
|
||||
}
|
||||
|
||||
void TattooEngine::loadConfig() {
|
||||
SherlockEngine::loadConfig();
|
||||
|
||||
_transparentMenus = ConfMan.getBool("transparent_windows");
|
||||
_textWindowsOn = ConfMan.getBool("text_windows");
|
||||
}
|
||||
|
||||
void TattooEngine::saveConfig() {
|
||||
SherlockEngine::saveConfig();
|
||||
|
||||
ConfMan.setBool("transparent_windows", _transparentMenus);
|
||||
ConfMan.setBool("text_windows", _textWindowsOn);
|
||||
ConfMan.flushToDisk();
|
||||
}
|
||||
|
||||
} // End of namespace Tattoo
|
||||
|
||||
} // End of namespace Sherlock
|
||||
|
|
|
@ -78,6 +78,11 @@ protected:
|
|||
* Starting a scene within the game
|
||||
*/
|
||||
virtual void startScene();
|
||||
|
||||
/**
|
||||
* Load configuration options
|
||||
*/
|
||||
virtual void loadConfig();
|
||||
public:
|
||||
bool _runningProlog;
|
||||
bool _fastMode, _allowFastMode;
|
||||
|
@ -95,7 +100,7 @@ public:
|
|||
/**
|
||||
* Save the game configuration
|
||||
*/
|
||||
void saveConfig() {}
|
||||
virtual void saveConfig();
|
||||
};
|
||||
|
||||
} // End of namespace Tattoo
|
||||
|
|
|
@ -37,23 +37,9 @@ WidgetOptions::WidgetOptions(SherlockEngine *vm) : WidgetBase(vm) {
|
|||
|
||||
void WidgetOptions::load() {
|
||||
Events &events = *_vm->_events;
|
||||
Music &music = *_vm->_music;
|
||||
Sound &sound = *_vm->_sound;
|
||||
TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
|
||||
Common::Point mousePos = events.mousePos();
|
||||
_centerPos = events.mousePos();
|
||||
|
||||
// Set bounds for the dialog
|
||||
Common::String widestString = Common::String::format("%s %s", FIXED(TransparentMenus), FIXED(Off));
|
||||
_bounds = Common::Rect(_surface.stringWidth(widestString) + _surface.widestChar() * 2 + 6,
|
||||
(_surface.fontHeight() + 7) * 11 + 3);
|
||||
_bounds.moveTo(mousePos.x - _bounds.width() / 2, mousePos.y - _bounds.height() / 2);
|
||||
|
||||
// Get slider positions
|
||||
_midiSliderX = music._musicVolume * (_bounds.width() - _surface.widestChar() * 2) / 255 + _surface.widestChar();
|
||||
_digiSliderX = sound._soundVolume * (_bounds.width() - _surface.widestChar() * 2) / 255 + _surface.widestChar();
|
||||
|
||||
// Setup the dialog
|
||||
_surface.create(_bounds.width(), _bounds.height());
|
||||
render();
|
||||
|
||||
summonWindow();
|
||||
|
@ -127,7 +113,7 @@ void WidgetOptions::handleEvents() {
|
|||
_midiSliderX = _bounds.width() - _surface.widestChar();
|
||||
|
||||
int temp = music._musicVolume;
|
||||
music._musicVolume = (_midiSliderX - _surface.widestChar()) * 127 / (_bounds.width() - _surface.widestChar() * 2);
|
||||
music._musicVolume = (_midiSliderX - _surface.widestChar()) * 255 / (_bounds.width() - _surface.widestChar() * 2);
|
||||
if (music._musicVolume != temp) {
|
||||
music.setMIDIVolume(music._musicVolume);
|
||||
vm.saveConfig();
|
||||
|
@ -146,7 +132,7 @@ void WidgetOptions::handleEvents() {
|
|||
_digiSliderX = _bounds.width() - _surface.widestChar();
|
||||
|
||||
int temp = sound._soundVolume;
|
||||
sound._soundVolume = (_digiSliderX - _surface.widestChar()) * 15 / (_bounds.width() - _surface.widestChar() * 2);
|
||||
sound._soundVolume = (_digiSliderX - _surface.widestChar()) * 255 / (_bounds.width() - _surface.widestChar() * 2);
|
||||
if (sound._soundVolume != temp) {
|
||||
sound.setVolume(sound._soundVolume);
|
||||
vm.saveConfig();
|
||||
|
@ -165,7 +151,7 @@ void WidgetOptions::handleEvents() {
|
|||
events.clearEvents();
|
||||
_outsideMenu = false;
|
||||
int temp = _selector;
|
||||
_selector = 255;
|
||||
_selector = -1;
|
||||
|
||||
switch (temp) {
|
||||
case 0:
|
||||
|
@ -224,7 +210,7 @@ void WidgetOptions::handleEvents() {
|
|||
fontNumber = 0;
|
||||
screen.setFont(fontNumber);
|
||||
|
||||
render(OP_CONTENTS);
|
||||
render(OP_ALL);
|
||||
vm.saveConfig();
|
||||
break;
|
||||
}
|
||||
|
@ -233,7 +219,7 @@ void WidgetOptions::handleEvents() {
|
|||
// Toggle Transparent Menus
|
||||
vm._transparentMenus = !vm._transparentMenus;
|
||||
|
||||
render(OP_CONTENTS);
|
||||
render(OP_NAMES);
|
||||
vm.saveConfig();
|
||||
break;
|
||||
|
||||
|
@ -253,17 +239,32 @@ void WidgetOptions::handleEvents() {
|
|||
|
||||
void WidgetOptions::render(OptionRenderMode mode) {
|
||||
TattooEngine &vm = *(TattooEngine *)_vm;
|
||||
Events &events = *_vm->_events;
|
||||
Music &music = *_vm->_music;
|
||||
Sound &sound = *_vm->_sound;
|
||||
TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
|
||||
Common::Point mousePos = events.mousePos();
|
||||
ImageFile &images = *ui._interfaceImages;
|
||||
const char *const OFF_ON[2] = { FIXED(Off), FIXED(On) };
|
||||
|
||||
// Draw the border if necessary
|
||||
if (mode == OP_ALL) {
|
||||
// Set bounds for the dialog
|
||||
Common::String widestString = Common::String::format("%s %s", FIXED(TransparentMenus), FIXED(Off));
|
||||
_bounds = Common::Rect(_surface.stringWidth(widestString) + _surface.widestChar() * 2 + 6,
|
||||
(_surface.fontHeight() + 7) * 11 + 3);
|
||||
_bounds.moveTo(_centerPos.x - _bounds.width() / 2, _centerPos.y - _bounds.height() / 2);
|
||||
|
||||
// Get slider positions
|
||||
_midiSliderX = music._musicVolume * (_bounds.width() - _surface.widestChar() * 2) / 255 + _surface.widestChar();
|
||||
_digiSliderX = sound._soundVolume * (_bounds.width() - _surface.widestChar() * 2) / 255 + _surface.widestChar();
|
||||
|
||||
// Setup the dialog
|
||||
_surface.create(_bounds.width(), _bounds.height());
|
||||
_surface.fill(TRANSPARENCY);
|
||||
makeInfoArea();
|
||||
|
||||
// Draw the lines separating options in the dialog
|
||||
int yp = _surface.fontHeight() + 7;
|
||||
for (int idx = 0; idx < 7; ++idx) {
|
||||
_surface.transBlitFrom(images[4], Common::Point(0, yp - 1));
|
||||
|
|
|
@ -41,6 +41,7 @@ class WidgetOptions : public WidgetBase {
|
|||
private:
|
||||
int _midiSliderX, _digiSliderX;
|
||||
int _selector, _oldSelector;
|
||||
Common::Point _centerPos;
|
||||
|
||||
/**
|
||||
* Render the contents of the dialog onto the widget's surface
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue