diff --git a/engines/mohawk/dialogs.cpp b/engines/mohawk/dialogs.cpp
index a70ea67281..0965b7d607 100644
a
|
b
|
MystOptionsWidget::MystOptionsWidget(GuiObject *boss, const Common::String &name
|
99 | 99 | _zipModeCheckbox(nullptr), |
100 | 100 | _transitionsCheckbox(nullptr), |
101 | 101 | _mystFlyByCheckbox(nullptr), |
| 102 | _spaceshipFuzzyLogicCheckbox(nullptr), |
102 | 103 | _languagePopUp(nullptr), |
103 | 104 | _dropPageButton(nullptr), |
104 | 105 | _showMapButton(nullptr), |
… |
… |
MystOptionsWidget::MystOptionsWidget(GuiObject *boss, const Common::String &name
|
119 | 120 | _("The Myst fly by movie was not played by the original engine.")); |
120 | 121 | } |
121 | 122 | |
| 123 | if (!isDemo) { |
| 124 | /* I18N: |
| 125 | This Option is for hard-of-hearing. |
| 126 | It makes it easier to solve the spaceship puzzle. |
| 127 | Normally game uses strict binary logic here. |
| 128 | We change it to use fuzzy logic. |
| 129 | */ |
| 130 | |
| 131 | _spaceshipFuzzyLogicCheckbox = new GUI::CheckboxWidget(widgetsBoss(), "MystGameOptionsDialog.FuzzyMode", _("~F~uzzy Logic in SpaceShip Active")); |
| 132 | } |
| 133 | |
122 | 134 | if (isInGame()) { |
123 | 135 | MohawkEngine_Myst *vm = static_cast<MohawkEngine_Myst *>(g_engine); |
124 | 136 | assert(vm); |
… |
… |
void MystOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common::Stri
|
161 | 173 | .addWidget("ZipMode", "Checkbox") |
162 | 174 | .addWidget("Transistions", "Checkbox") |
163 | 175 | .addWidget("PlayMystFlyBy", "Checkbox") |
| 176 | .addWidget("FuzzyMode", "Checkbox") |
164 | 177 | .addLayout(GUI::ThemeLayout::kLayoutHorizontal) |
165 | 178 | .addPadding(0, 0, 0, 0) |
166 | 179 | .addWidget("LanguageDesc", "OptionsLabel") |
… |
… |
void MystOptionsWidget::load() {
|
193 | 206 | _mystFlyByCheckbox->setState(ConfMan.getBool("playmystflyby", _domain)); |
194 | 207 | } |
195 | 208 | |
| 209 | if (_spaceshipFuzzyLogicCheckbox) { |
| 210 | _spaceshipFuzzyLogicCheckbox->setState(ConfMan.getBool("fuzzy_logic", _domain)); |
| 211 | } |
| 212 | |
196 | 213 | if (_languagePopUp) { |
197 | 214 | Common::Language language = Common::parseLanguage(ConfMan.get("language", _domain)); |
198 | 215 | const MystLanguage *languageDesc = MohawkEngine_Myst::getLanguageDesc(language); |
… |
… |
bool MystOptionsWidget::save() {
|
229 | 246 | ConfMan.setBool("playmystflyby", _mystFlyByCheckbox->getState(), _domain); |
230 | 247 | } |
231 | 248 | |
| 249 | if (_spaceshipFuzzyLogicCheckbox) { |
| 250 | ConfMan.setBool("fuzzy_logic", _spaceshipFuzzyLogicCheckbox->getState(), _domain); |
| 251 | } |
| 252 | |
232 | 253 | if (_languagePopUp) { |
233 | 254 | MohawkEngine_Myst *vm = static_cast<MohawkEngine_Myst *>(g_engine); |
234 | 255 | assert(vm); |
diff --git a/engines/mohawk/dialogs.h b/engines/mohawk/dialogs.h
index 776172b537..d479dddf94 100644
a
|
b
|
private:
|
100 | 100 | GUI::CheckboxWidget *_zipModeCheckbox; |
101 | 101 | GUI::CheckboxWidget *_transitionsCheckbox; |
102 | 102 | GUI::CheckboxWidget *_mystFlyByCheckbox; |
| 103 | GUI::CheckboxWidget *_spaceshipFuzzyLogicCheckbox; |
| 104 | |
103 | 105 | GUI::PopUpWidget *_languagePopUp; |
104 | 106 | |
105 | 107 | GUI::ButtonWidget *_dropPageButton; |
diff --git a/engines/mohawk/myst_metaengine.cpp b/engines/mohawk/myst_metaengine.cpp
index 7f400bb308..a77b3e8573 100644
a
|
b
|
void Mohawk::MohawkMetaEngine_Myst::registerDefaultSettings() {
|
26 | 26 | ConfMan.registerDefault("playmystflyby", false); |
27 | 27 | ConfMan.registerDefault("zip_mode", false); |
28 | 28 | ConfMan.registerDefault("transition_mode", false); |
| 29 | ConfMan.registerDefault("fuzzy_logic", false); |
29 | 30 | } |
30 | 31 | |
31 | 32 | const Mohawk::MystLanguage *Mohawk::MohawkMetaEngine_Myst::listLanguages() { |
diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp
index de9a375d0c..0355cc430f 100644
a
|
b
|
|
30 | 30 | #include "mohawk/video.h" |
31 | 31 | #include "mohawk/myst_stacks/myst.h" |
32 | 32 | |
| 33 | #include "common/config-manager.h" |
33 | 34 | #include "common/events.h" |
34 | 35 | #include "common/math.h" |
35 | 36 | #include "common/system.h" |
… |
… |
uint16 Myst::rocketSliderGetSound(uint16 pos) {
|
2292 | 2293 | return (uint16)(9530 + (pos - 216) * 35.0 / 61.0); |
2293 | 2294 | } |
2294 | 2295 | |
| 2296 | |
| 2297 | uint16 Myst::rocketCheckSolutionLogicHelper(uint16 sound1, uint16 sound2, uint16 logictype) { |
| 2298 | |
| 2299 | debugN("helper: %i %i %i (diff:% 3i) ",sound1, sound2 , logictype, sound1-sound2); |
| 2300 | if (logictype==0) { |
| 2301 | |
| 2302 | if (sound1 != sound2) { |
| 2303 | debugN("strict : false \n"); |
| 2304 | return false; |
| 2305 | } |
| 2306 | |
| 2307 | } else { |
| 2308 | |
| 2309 | if ( abs(sound1-sound2)>=5) { |
| 2310 | debugN(" fuzzy : false \n"); |
| 2311 | return false; |
| 2312 | } |
| 2313 | |
| 2314 | } |
| 2315 | |
| 2316 | debugN("either : true \n"); |
| 2317 | return true; |
| 2318 | |
| 2319 | } |
| 2320 | |
2295 | 2321 | void Myst::rocketCheckSolution() { |
2296 | 2322 | _vm->_cursor->hideCursor(); |
2297 | 2323 | |
2298 | 2324 | uint16 soundId; |
2299 | 2325 | bool solved = true; |
| 2326 | bool fuzzylogic = false; |
| 2327 | |
| 2328 | if (ConfMan.getBool("fuzzy_logic")) { |
| 2329 | fuzzylogic = true; |
| 2330 | } |
| 2331 | |
2300 | 2332 | |
2301 | 2333 | soundId = rocketSliderGetSound(_rocketSlider1->_pos.y); |
2302 | 2334 | _vm->_sound->playEffect(soundId); |
2303 | 2335 | _rocketSlider1->drawConditionalDataToScreen(2); |
2304 | 2336 | _vm->wait(250); |
2305 | | if (soundId != 9558) |
| 2337 | if ( !rocketCheckSolutionLogicHelper(soundId,9558,fuzzylogic) ) |
2306 | 2338 | solved = false; |
2307 | 2339 | |
2308 | 2340 | soundId = rocketSliderGetSound(_rocketSlider2->_pos.y); |
2309 | 2341 | _vm->_sound->playEffect(soundId); |
2310 | 2342 | _rocketSlider2->drawConditionalDataToScreen(2); |
2311 | 2343 | _vm->wait(250); |
2312 | | if (soundId != 9546) |
| 2344 | if ( !rocketCheckSolutionLogicHelper(soundId,9546,fuzzylogic) ) |
2313 | 2345 | solved = false; |
2314 | 2346 | |
2315 | 2347 | soundId = rocketSliderGetSound(_rocketSlider3->_pos.y); |
2316 | 2348 | _vm->_sound->playEffect(soundId); |
2317 | 2349 | _rocketSlider3->drawConditionalDataToScreen(2); |
2318 | 2350 | _vm->wait(250); |
2319 | | if (soundId != 9543) |
| 2351 | if ( !rocketCheckSolutionLogicHelper(soundId,9543,fuzzylogic) ) |
2320 | 2352 | solved = false; |
2321 | 2353 | |
2322 | 2354 | soundId = rocketSliderGetSound(_rocketSlider4->_pos.y); |
2323 | 2355 | _vm->_sound->playEffect(soundId); |
2324 | 2356 | _rocketSlider4->drawConditionalDataToScreen(2); |
2325 | 2357 | _vm->wait(250); |
2326 | | if (soundId != 9553) |
| 2358 | if ( !rocketCheckSolutionLogicHelper(soundId,9553,fuzzylogic) ) |
2327 | 2359 | solved = false; |
2328 | 2360 | |
2329 | 2361 | soundId = rocketSliderGetSound(_rocketSlider5->_pos.y); |
2330 | 2362 | _vm->_sound->playEffect(soundId); |
2331 | 2363 | _rocketSlider5->drawConditionalDataToScreen(2); |
2332 | 2364 | _vm->wait(250); |
2333 | | if (soundId != 9560) |
| 2365 | if ( !rocketCheckSolutionLogicHelper(soundId,9560,fuzzylogic) ) |
2334 | 2366 | solved = false; |
2335 | 2367 | |
2336 | 2368 | _vm->_sound->stopEffect(); |
diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h
index 3739630379..6e8c9d95de 100644
a
|
b
|
protected:
|
312 | 312 | |
313 | 313 | void rocketSliderMove(); |
314 | 314 | uint16 rocketSliderGetSound(uint16 pos); |
| 315 | uint16 rocketCheckSolutionLogicHelper(uint16 sound1, uint16 sound2, uint16 logictype); |
315 | 316 | void rocketCheckSolution(); |
316 | 317 | |
317 | 318 | void libraryBookPageTurnLeft(); |