Files
2026-02-02 04:50:13 +01:00

1134 lines
40 KiB
C++

/* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "common/system.h"
#include "common/config-manager.h"
#include "common/macresman.h"
#include "engines/engine.h"
#include "graphics/macgui/macfontmanager.h"
#include "graphics/macgui/macwindowmanager.h"
#include "graphics/surface.h"
#include "scumm/scumm.h"
#include "scumm/detection.h"
#include "scumm/macgui/macgui_impl.h"
#include "scumm/macgui/macgui_v5.h"
#include "scumm/music.h"
#include "scumm/sound.h"
namespace Scumm {
// ===========================================================================
// The Mac SCUMM v5 GUI.
// ===========================================================================
MacV5Gui::MacV5Gui(ScummEngine *vm, const Common::Path &resourceFile) : MacGuiImpl(vm, resourceFile) {
}
bool MacV5Gui::initialize() {
if (!MacGuiImpl::initialize())
return false;
Graphics::MacMenu *menu = _windowManager->getMenu();
Graphics::MacMenuItem *gameMenu = menu->getMenuItem(1);
menu->getSubMenuItem(gameMenu, 5)->enabled = false; // Fix color map
Graphics::MacMenuItem *windowMenu = menu->getMenuItem(3);
menu->getSubMenuItem(windowMenu, 0)->enabled = false; // Hide Desktop
menu->getSubMenuItem(windowMenu, 1)->enabled = false; // Hide Menubar
menu->getSubMenuItem(windowMenu, 3)->enabled = false; // Tiny
menu->getSubMenuItem(windowMenu, 4)->enabled = false; // Medium
menu->getSubMenuItem(windowMenu, 5)->enabled = false; // Large
return true;
}
const Graphics::Font *MacV5Gui::getFontByScummId(int32 id) {
// V5 games do not use CharsetRendererMac
return nullptr;
}
bool MacV5Gui::getFontParams(FontId fontId, int &id, int &size, int &slant) const {
switch (fontId) {
case kAboutFontRegular:
id = Graphics::kMacFontApplication;
size = 9;
slant = Graphics::kMacFontRegular;
return true;
case kAboutFontBold:
id = Graphics::kMacFontApplication;
size = 9;
slant = Graphics::kMacFontBold;
return true;
case kAboutFontBold2:
id = Graphics::kMacFontTimes;
size = 10;
slant = Graphics::kMacFontBold;
return true;
case kAboutFontHeader:
id = Graphics::kMacFontTimes;
size = 18;
// TODO: This is WRONG! We shouldn't use the Extended style
// here, but apparently ScummVM doesn't handle character
// spacing correctly for Mac fonts.
slant = Graphics::kMacFontBold | Graphics::kMacFontItalic | Graphics::kMacFontOutline | Graphics::kMacFontExtend;
return true;
case kAboutFontHeaderSimple1:
id = Graphics::kMacFontApplication;
size = 12;
slant = Graphics::kMacFontBold | Graphics::kMacFontItalic | Graphics::kMacFontOutline;
return true;
case kAboutFontHeaderSimple2:
id = Graphics::kMacFontSystem;
size = 12;
slant = Graphics::kMacFontBold | Graphics::kMacFontItalic | Graphics::kMacFontOutline;
return true;
default:
return MacGuiImpl::getFontParams(fontId, id, size, slant);
}
}
void MacV5Gui::setupCursor(int &width, int &height, int &hotspotX, int &hotspotY, int &animate) {
if (!setupResourceCursor(128, width, height, hotspotX, hotspotY, animate)) {
// Monkey Island 1 uses the arrow cursor, and we have to use it
// for the Fate of Atlantis demo as well.
_windowManager->replaceCursor(Graphics::MacGUIConstants::kMacCursorArrow);
width = 11;
height = 16;
hotspotX = 1;
hotspotY = 3;
animate = 0;
}
}
void MacV5Gui::updateMenus() {
MacGuiImpl::updateMenus();
Graphics::MacMenu *menu = _windowManager->getMenu();
Graphics::MacMenuItem *windowMenu = menu->getMenuItem("Window");
if (menu->numberOfMenuItems(windowMenu) >= 8)
menu->getSubMenuItem(windowMenu, 7)->checked = _vm->_useMacGraphicsSmoothing;
Graphics::MacMenuItem *speechMenu = menu->getMenuItem("Speech");
if (speechMenu) {
menu->getSubMenuItem(speechMenu, 0)->checked = false; // Voice Only
menu->getSubMenuItem(speechMenu, 1)->checked = false; // Text Only
menu->getSubMenuItem(speechMenu, 2)->checked = false; // Voice and Text
switch (_vm->_voiceMode) {
case 0: // Voice Only
menu->getSubMenuItem(speechMenu, 0)->checked = true;
break;
case 1: // Voice and Text
menu->getSubMenuItem(speechMenu, 2)->checked = true;
break;
case 2: // Text Only
menu->getSubMenuItem(speechMenu, 1)->checked = true;
break;
default:
warning("MacV5Gui::updateMenus(): Invalid voice mode %d", _vm->_voiceMode);
break;
}
}
}
bool MacV5Gui::handleMenu(int id, Common::String &name) {
if (MacGuiImpl::handleMenu(id, name))
return true;
switch (id) {
case 204: // Fix color map
return true;
case 205: // Options
runOptionsDialog();
return true;
case 206: // Quit
if (runQuitDialog())
_vm->quitGame();
return true;
// Window menu
case 402: // Tiny
case 403: // Medium
case 404: // Large
return true;
case 405: // Graphics Smoothing
_vm->mac_toggleSmoothing();
return true;
case 500: // Voice Only
ConfMan.setBool("subtitles", false);
ConfMan.setBool("speech_mute", false);
ConfMan.flushToDisk();
_vm->syncSoundSettings();
return true;
case 501: // Text Only
ConfMan.setBool("subtitles", true);
ConfMan.setBool("speech_mute", true);
ConfMan.flushToDisk();
_vm->syncSoundSettings();
return true;
case 502: // Voice and Text
ConfMan.setBool("subtitles", true);
ConfMan.setBool("speech_mute", false);
ConfMan.flushToDisk();
_vm->syncSoundSettings();
return true;
default:
warning("Unknown menu command: %d", id);
break;
}
return false;
}
void MacV5Gui::runAboutDialog() {
int width = 416;
int height = 166;
int x = (640 - width) / 2;
int y = (400 - height) / 2;
Common::Rect bounds(x, y, x + width, y + height);
MacDialogWindow *window = createWindow(bounds, kWindowStyleNormal, kMenuStyleApple);
switch (_vm->_game.id) {
case GID_MONKEY:
runAboutDialogMI1(window);
break;
case GID_MONKEY2:
runAboutDialogMI2(window);
break;
case GID_INDY4:
if (_strsStrings[kMSIAboutString34] != "")
runAboutDialogIndy4(window);
else
runAboutDialogIndy4Demo(window);
break;
default:
break;
}
delete window;
}
void MacV5Gui::runAboutDialogMI1(MacDialogWindow *window) {
Graphics::Surface *lucasArts = loadPict(5000);
Graphics::Surface *monkeys = loadPict(5001);
Graphics::Surface *s = window->innerSurface();
const TextLine page3[] = {
{ 0, 68, kStyleBold, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString2].c_str() }, // "PRESENTS"
TEXT_END_MARKER
};
const TextLine page12[] = {
{ 0, 0, kStyleHeaderSimple1, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString3].c_str() }, // "The Secret"
{ 87, 13, kStyleBold, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString5].c_str() }, // "of"
{ 40, 26, kStyleHeaderSimple1, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString4].c_str() }, // "Monkey Island\xAA"
{ 178, 120, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString6].c_str() }, // "TM & \xA9 1990 LucasArts Entertainment Company."
{ 312, 133, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString7].c_str() }, // "All rights reserved."
TEXT_END_MARKER
};
const TextLine page13[] = {
{ 0, 47, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString8].c_str() }, // "Macintosh version by"
{ 50, 62, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString9].c_str() }, // "Eric Johnston"
TEXT_END_MARKER
};
const TextLine page14[] = {
{ 85, 32, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString10].c_str() }, // "Created by"
{ 60, 47, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString12].c_str() }, // "Ron Gilbert"
{ 39, 70, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString11].c_str() }, // "Macintosh Version Produced by"
{ 47, 85, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString13].c_str() }, // "Brenna Holden"
TEXT_END_MARKER
};
const TextLine page15[] = {
{ 59, 27, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString14].c_str() }, // "SCUMM Story System"
{ 85, 37, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString15].c_str() }, // "created by"
{ 35, 57, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString17].c_str() }, // "Ron Gilbert"
{ 102, 72, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString16].c_str() }, // "and"
{ 59, 87, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString18].c_str() }, // "Aric Wilmunder"
TEXT_END_MARKER
};
const TextLine page16[] = {
{ 29, 37, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString19].c_str() }, // "Stumped? Hint books are available"
{ 15, 55, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString22].c_str() }, // "In the U.S. call"
{ 89, 55, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString20].c_str() }, // "1 (800) STAR-WARS"
{ 89, 65, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString24].c_str() }, // "that\xD5s 1 (800)782-7927"
{ 19, 85, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString23].c_str() }, // "In Canada call"
{ 89, 85, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString21].c_str() }, // "1 (800) 828-7927"
TEXT_END_MARKER
};
const TextLine page17[] = {
{ 27, 32, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString25].c_str() }, // "Need a hint NOW? Having problems?"
{ 6, 47, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString28].c_str() }, // "For technical support call"
{ 130, 47, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString26].c_str() }, // "1 (415) 721-3333"
{ 62, 57, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString29].c_str() }, // "For hints call"
{ 130, 57, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString27].c_str() }, // "1 (900) 740-JEDI"
{ 5, 72, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString30].c_str() }, // "The charge for the hint line is 75\xA2 per minute."
{ 10, 82, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString31].c_str() }, // "(You must have your parents\xD5 permission to"
{ 25, 92, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString32].c_str() }, // "call this number if you are under 18.)"
TEXT_END_MARKER
};
AboutPage aboutPages[] = {
{ nullptr, 0, 3600 },
{ nullptr, 0, 100 },
{ nullptr, 0, 100 },
{ page3, 0, 2100 },
{ nullptr, 0, 300 },
{ nullptr, 0, 400 },
{ nullptr, 0, 400 },
{ nullptr, 0, 300 },
{ nullptr, 0, 400 },
{ nullptr, 0, 100 },
{ nullptr, 0, 100 },
{ nullptr, 0, 600 },
{ page12, 1, 7000 },
{ page13, 2, 4300 },
{ page14, 2, 4200 },
{ page15, 2, 4200 },
{ page16, 2, 14000 },
{ page17, 2, 0 }
};
Common::Rect drawAreas[] = {
Common::Rect(2, 2, s->w - 2, s->h - 2),
Common::Rect(0, 7, s->w, s->h - 2),
Common::Rect(176, 10, 394, 144)
};
// We probably can't trust our ellipse drawing function to get pixel
// perfect shadows, so at least for now we define our own. Note that
// all of the shadows have an even height. The bottom half is just a
// mirror of the top half.
Common::Pair<int, int> shadow1[] = {
Common::Pair<int, int>(0, 10)
};
Common::Pair<int, int> shadow2[] = {
Common::Pair<int, int>(4, 21),
Common::Pair<int, int>(0, 30)
};
Common::Pair<int, int> shadow3[] = {
Common::Pair<int, int>(13, 34),
Common::Pair<int, int>(4, 52),
Common::Pair<int, int>(0, 60),
};
Common::Pair<int, int> shadow4[] = {
Common::Pair<int, int>(25, 50),
Common::Pair<int, int>(10, 80),
Common::Pair<int, int>(3, 94),
Common::Pair<int, int>(0, 100)
};
Common::Pair<int, int> shadow5[] = {
Common::Pair<int, int>(41, 67),
Common::Pair<int, int>(21, 108),
Common::Pair<int, int>(10, 130),
Common::Pair<int, int>(3, 144),
Common::Pair<int, int>(0, 150)
};
bool allowMegaSkip = false;
bool megaSkip = false;
int page = 0;
uint32 black = getBlack();
uint32 white = getWhite();
window->show();
Common::Rect monkeysRect(monkeys->w, monkeys->h);
while (!_vm->shouldQuit() && page < ARRAYSIZE(aboutPages)) {
Common::Rect &drawArea = drawAreas[aboutPages[page].drawArea];
switch (page) {
case 0:
s->fillRect(drawArea, black);
window->drawSprite(lucasArts, 64, 2, drawArea);
break;
case 1:
window->fillPattern(drawArea, 0xD7D7, false, true);
break;
case 2:
s->fillRect(drawArea, white);
break;
case 4:
allowMegaSkip = true;
s->fillRect(drawArea, white);
drawShadow(s, 77, 141, 2 * ARRAYSIZE(shadow1), shadow1);
break;
case 5:
drawShadow(s, 67, 140, 2 * ARRAYSIZE(shadow2), shadow2);
break;
case 6:
drawShadow(s, 52, 139, 2 * ARRAYSIZE(shadow3), shadow3);
break;
case 7:
drawShadow(s, 32, 138, 2 * ARRAYSIZE(shadow4), shadow4);
break;
case 8:
drawShadow(s, 7, 137, 2 * ARRAYSIZE(shadow5), shadow5);
break;
case 9:
monkeysRect.moveTo(2, 18);
window->drawSprite(monkeys, monkeysRect.left, monkeysRect.top);
break;
case 10:
s->fillRect(monkeysRect, white);
monkeysRect.moveTo(2, 36);
s->fillRect(Common::Rect(monkeysRect.left, monkeysRect.top + monkeys->h, monkeysRect.left + monkeys->w, 146), white);
window->drawSprite(monkeys, monkeysRect.left, monkeysRect.top);
break;
case 11:
s->fillRect(monkeysRect, white);
window->drawSprite(monkeys, 2, 54, drawArea);
allowMegaSkip = megaSkip = false;
break;
case 13:
s->fillRect(Common::Rect(178, 127, s->w, s->h), white);
window->markRectAsDirty(Common::Rect(178, 127, s->w, s->h));
break;
default:
break;
}
if (aboutPages[page].text) {
if (aboutPages[page].drawArea == 2) {
window->drawTextBox(drawArea, aboutPages[page].text);
} else {
window->drawTexts(drawArea, aboutPages[page].text);
}
}
if (aboutPages[page].drawArea != 2)
window->markRectAsDirty(drawArea);
window->update();
uint32 ms = megaSkip ? 100 : aboutPages[page].delayMs;
if (delay(ms) == kDelayInterrupted && allowMegaSkip)
megaSkip = true;
page++;
}
lucasArts->free();
monkeys->free();
delete lucasArts;
delete monkeys;
}
void MacV5Gui::drawShadow(Graphics::Surface *s, int x, int y, int h, Common::Pair<int, int> *drawData) {
int y1 = y;
int y2 = y + h - 1;
uint32 black = getBlack();
uint32 white = getWhite();
for (int i = 0; i < h / 2; i++) {
int x1 = x + drawData[i].first;
for (int j = 0; j < drawData[i].second; j++) {
if ((x1 + y1) & 1) {
s->setPixel(x1, y1, white);
s->setPixel(x1, y2, black);
} else {
s->setPixel(x1, y1, black);
s->setPixel(x1, y2, white);
}
x1++;
}
y1++;
y2--;
}
}
void MacV5Gui::runAboutDialogMI2(MacDialogWindow *window) {
Graphics::Surface *s = window->innerSurface();
Graphics::Surface *lucasArts = loadPict(5000);
const TextLine page3[] = {
{ 0, 68, kStyleBold, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString2].c_str() }, // "PRESENTS"
TEXT_END_MARKER
};
const TextLine page5[] = {
{ 152, 16, kStyleBold2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString3].c_str() }, // "LeChuck\xD5s Revenge"
{ 114, 31, kStyleHeader2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString4].c_str() }, // "Monkey Island 2"
{ 176, 125, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString6].c_str() }, // "TM & \xA9 1990 LucasArts Entertainment Company."
{ 310, 138, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString7].c_str() }, // "All rights reserved."
TEXT_END_MARKER
};
const TextLine page6[] = {
{ 0, 19, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString8].c_str() }, // "Macintosh version by
{ 133, 34, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString9].c_str() }, // "Eric Johnston"
TEXT_END_MARKER
};
const TextLine page7[] = {
{ 168, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString10].c_str() }, // "Created by"
{ 143, 19, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString12].c_str() }, // "Ron Gilbert"
{ 141, 42, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString11].c_str() }, // "Macintosh Scripting by"
{ 127, 57, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString13].c_str() }, // "Alric Wilmunder"
TEXT_END_MARKER
};
const TextLine page8[] = {
{ 142, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString14].c_str() }, // "SCUMM Story System"
{ 168, 14, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString15].c_str() }, // "created by"
{ 68, 28, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString17].c_str() }, // "Ron Gilbert Aric Wilmunder"
{ 79, 43, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString18].c_str() }, // "Brad P. Taylor Vince Lee"
{ 135, 60, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString16].c_str() }, // "and"
{ 109, 58, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString19].c_str() }, // " Eric Johnston"
TEXT_END_MARKER
};
const TextLine page9[] = {
{ 137, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString20].c_str() }, // "Macintosh Orchestration"
{ 125, 19, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString22].c_str() }, // "Robin Goldstein"
{ 152, 42, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString21].c_str() }, // "Macintosh Testing"
{ 144, 57, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString23].c_str() }, // "Jo Ashburn"
TEXT_END_MARKER
};
const TextLine page10[] = {
{ 2, 19, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString24].c_str() }, // "\xD2djm\xD3 Sound and Music System \xA91992 Eric Johnston
{ 2, 39, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString25].c_str() }, // "\xD2epx\xD3 Graphics Smoothing System \xA91992 Eric Johnson
{ 2, 54, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString26].c_str() }, // "Type 'rough' to see the difference."
TEXT_END_MARKER
};
const TextLine page11[] = {
{ 112, 9, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString27].c_str() }, // "Stumped? Hint books are available!"
{ 98, 27, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString30].c_str() }, // "In the U.S. call"
{ 172, 27, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString28].c_str() }, // "1 (800) STAR-WARS"
{ 172, 37, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString32].c_str() }, // "that\xD5s 1 (800) 782-7927"
{ 102, 57, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString31].c_str() }, // "In Canada call"
{ 172, 57, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString29].c_str() }, // "1 (800) 828-7927"
TEXT_END_MARKER
};
const TextLine page12[] = {
{ 110, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString33].c_str() }, // "Need a hint NOW? Having problems?"
{ 89, 19, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString36].c_str() }, // "For technical support call"
{ 213, 19, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString34].c_str() }, // "1 (415) 721-3333"
{ 145, 29, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString37].c_str() }, // "For hints call"
{ 213, 29, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString35].c_str() }, // "1 (900) 740-JEDI"
{ 88, 44, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString38].c_str() }, // "The charge for the hint line is 75\xA2 per minute."
{ 93, 54, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString39].c_str() }, // "(You must have your parents\xD5 permission to"
{ 108, 64, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString40].c_str() }, // "call this number if you are under 18.)"
TEXT_END_MARKER
};
AboutPage aboutPages[] = {
{ nullptr, 0, 2800 },
{ nullptr, 0, 100 },
{ nullptr, 0, 100 },
{ page3, 0, 2100 },
{ nullptr, 0, 500 },
{ page5, 0, 2800 },
{ page6, 1, 4300 },
{ page7, 1, 4300 },
{ page8, 1, 4200 },
{ page9, 1, 4200 },
{ page10, 1, 4200 },
{ page11, 1, 14000 },
{ page12, 1, 0 }
};
Common::Rect drawAreas[] = {
Common::Rect(2, 2, s->w - 2, s->h - 2),
Common::Rect(10, 63, s->w - 10, s->h - 10)
};
int page = 0;
window->show();
uint32 black = getBlack();
while (!_vm->shouldQuit() && page < ARRAYSIZE(aboutPages)) {
Common::Rect &drawArea = drawAreas[aboutPages[page].drawArea];
switch (page) {
case 0:
s->fillRect(drawArea, black);
window->drawSprite(lucasArts, 64, 2, drawArea);
break;
case 1:
window->fillPattern(drawArea, 0xADAD, true, false);
break;
case 2:
case 4:
s->fillRect(drawArea, black);
break;
case 6:
s->fillRect(Common::Rect(178, 129, s->w - 2, s->h - 2), black);
window->markRectAsDirty(Common::Rect(178, 129, s->w - 2, s->h - 2));
break;
default:
break;
}
if (aboutPages[page].text) {
if (aboutPages[page].drawArea == 1) {
window->drawTextBox(drawArea, aboutPages[page].text, true);
} else {
window->drawTexts(drawArea, aboutPages[page].text, true);
}
}
if (aboutPages[page].drawArea != 1)
window->markRectAsDirty(drawArea);
window->update();
delay(aboutPages[page].delayMs);
page++;
}
lucasArts->free();
delete lucasArts;
}
void MacV5Gui::runAboutDialogIndy4(MacDialogWindow *window) {
Graphics::Surface *s = window->innerSurface();
Graphics::Surface *lucasArts = loadPict(5000);
Graphics::Surface *indianaJones = loadPict(5001);
const TextLine page3[] = {
{ 0, 68, kStyleBold, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString2].c_str() }, // "PRESENTS"
TEXT_END_MARKER
};
const TextLine page5[] = {
{ 317, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString3].c_str() }, // "\xA8"
{ 176, 125, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString4].c_str() }, // "TM & \xA9 1990 LucasArts Entertainment Company."
{ 310, 138, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString5].c_str() }, // "All rights reserved."
TEXT_END_MARKER
};
const TextLine page6[] = {
{ 0, 19, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString6].c_str() }, // "Macintosh version by
{ 133, 34, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString7].c_str() }, // "Eric Johnston"
TEXT_END_MARKER
};
const TextLine page7[] = {
{ 168, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString8].c_str() }, // "Created by"
{ 138, 19, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString10].c_str() }, // "Hal Barwood"
{ 141, 42, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString9].c_str() }, // "Macintosh Scripting by"
{ 127, 57, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString11].c_str() }, // "Alric Wilmunder"
TEXT_END_MARKER
};
// The original drew this page in two passes, 0.1 seconds apart. But I
// guess that's an implementation thing, not an intended effect, because
// none of the other pages do it.
const TextLine page8[] = {
{ 142, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString12].c_str() }, // "SCUMM Story System"
{ 168, 14, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString13].c_str() }, // "created by"
{ 68, 28, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString15].c_str() }, // "Ron Gilbert Aric Wilmunder"
{ 79, 43, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString16].c_str() }, // "Brad P. Taylor Vince Lee"
{ 135, 60, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString14].c_str() }, // "and"
{ 109, 58, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString17].c_str() }, // " Eric Johnston"
TEXT_END_MARKER
};
const TextLine page9[] = {
{ 137, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString18].c_str() }, // "Macintosh Orchestration"
{ 125, 19, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString20].c_str() }, // "Robin Goldstein"
{ 152, 42, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString19].c_str() }, // "Macintosh Testing"
{ 144, 57, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString21].c_str() }, // "Jo Ashburn"
TEXT_END_MARKER
};
// In the CD version, kMSIAboutString38 is empty. Probably because it
// added a menu item for it instead.
const TextLine page10[] = {
{ 2, 19, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString22].c_str() }, // "\xD2djm\xD3 Sound and Music System \xA91992 Eric Johnston
{ 2, 39, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString23].c_str() }, // "\xD2epx\xD3 Graphics Smoothing System \xA91992 Eric Johnson
{ 2, 54, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString38].c_str() }, // "Type 'rough' to see the difference."
TEXT_END_MARKER
};
const TextLine page11[] = {
{ 112, 9, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString24].c_str() }, // "Stumped? Hint books are available!"
{ 98, 27, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString27].c_str() }, // "In the U.S. call"
{ 172, 27, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString25].c_str() }, // "1 (800) STAR-WARS"
{ 172, 37, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString29].c_str() }, // "that\xD5s 1 (800) 782-7927"
{ 102, 57, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString28].c_str() }, // "In Canada call"
{ 172, 57, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString26].c_str() }, // "1 (800) 828-7927"
TEXT_END_MARKER
};
const TextLine page12[] = {
{ 110, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString30].c_str() }, // "Need a hint NOW? Having problems?"
{ 89, 19, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString33].c_str() }, // "For technical support call"
{ 213, 19, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString31].c_str() }, // "1 (415) 721-3333"
{ 145, 29, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString34].c_str() }, // "For hints call"
{ 213, 29, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString32].c_str() }, // "1 (900) 740-JEDI"
{ 88, 44, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString35].c_str() }, // "The charge for the hint line is 75\xA2 per minute."
{ 93, 54, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString36].c_str() }, // "(You must have your parents\xD5 permission to"
{ 108, 64, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString37].c_str() }, // "call this number if you are under 18.)"
TEXT_END_MARKER
};
AboutPage aboutPages[] = {
{ nullptr, 0, 2800 },
{ nullptr, 0, 100 },
{ nullptr, 0, 100 },
{ page3, 0, 2100 },
{ nullptr, 0, 500 },
{ page5, 0, 2900 },
{ page6, 1, 4200 },
{ page7, 1, 4300 },
{ page8, 1, 4200 },
{ page9, 1, 4200 },
{ page10, 1, 4200 },
{ page11, 1, 14100 },
{ page12, 1, 0 }
};
Common::Rect drawAreas[] = {
Common::Rect(2, 2, s->w - 2, s->h - 2),
Common::Rect(10, 63, s->w - 10, s->h - 10)
};
int page = 0;
window->show();
uint32 black = getBlack();
uint32 white = getWhite();
while (!_vm->shouldQuit() && page < ARRAYSIZE(aboutPages)) {
Common::Rect &drawArea = drawAreas[aboutPages[page].drawArea];
switch (page) {
case 0:
s->fillRect(drawArea, black);
window->drawSprite(lucasArts, 64, 2, drawArea);
break;
case 1:
window->fillPattern(drawArea, 0xD7D7, false, true);
break;
case 2:
window->fillPattern(drawArea, 0x5A5A, false, true);
break;
case 3:
s->fillRect(drawArea, white);
break;
case 4:
s->fillRect(drawArea, white);
window->drawSprite(indianaJones, 89, 6);
break;
case 6:
s->fillRect(Common::Rect(178, 129, s->w - 2, s->h - 2), white);
window->markRectAsDirty(Common::Rect(178, 129, s->w - 2, s->h - 2));
break;
default:
break;
}
if (aboutPages[page].text) {
if (aboutPages[page].drawArea == 1) {
window->drawTextBox(drawArea, aboutPages[page].text);
} else {
window->drawTexts(drawArea, aboutPages[page].text);
}
}
if (aboutPages[page].drawArea != 1)
window->markRectAsDirty(drawArea);
window->update();
delay(aboutPages[page].delayMs);
page++;
}
lucasArts->free();
indianaJones->free();
delete lucasArts;
delete indianaJones;
}
void MacV5Gui::runAboutDialogIndy4Demo(MacDialogWindow *window) {
Graphics::Surface *s = window->innerSurface();
Graphics::Surface *lucasArts = loadPict(5000);
const TextLine page4[] = {
{ 0, 68, kStyleBold, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString2].c_str() }, // "PRESENTS"
TEXT_END_MARKER
};
const TextLine page5[] = {
{ 0, 5, kStyleHeaderSimple1, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString3].c_str() }, // "Indiana Jones"
{ 73, 18, kStyleBold, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString5].c_str() }, // "and the"
{ 40, 31, kStyleHeaderSimple1, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString4].c_str() }, // "Fate of Atlantis"
// { 317, 4, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString3].c_str() }, // "\xA8"
{ 178, 125, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString6].c_str() }, // "TM & \xA9 1990 LucasArts Entertainment Company."
{ 312, 138, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString7].c_str() }, // "All rights reserved."
TEXT_END_MARKER
};
const TextLine page6[] = {
{ 0, 47, kStyleRegular, Graphics::kTextAlignCenter, _strsStrings[kMSIAboutString8].c_str() }, // "Macintosh version by
{ 50, 62, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString9].c_str() }, // "Eric Johnston"
TEXT_END_MARKER
};
const TextLine page7[] = {
{ 85, 32, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString10].c_str() }, // "Created by"
{ 55, 47, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString12].c_str() }, // "Hal Barwood"
{ 58, 70, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString11].c_str() }, // "Macintosh Scripting by"
{ 44, 85, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString13].c_str() }, // "Alric Wilmunder"
TEXT_END_MARKER
};
const TextLine page8[] = {
{ 59, 27, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString14].c_str() }, // "SCUMM Story System"
{ 85, 37, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString15].c_str() }, // "created by"
{ 35, 57, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString17].c_str() }, // "Ron Gilbert"
{ 102, 72, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString16].c_str() }, // "and"
{ 59, 87, kStyleHeaderSimple2, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString18].c_str() }, // "Aric Wilmunder"
TEXT_END_MARKER
};
const TextLine page9[] = {
{ 29, 37, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString19].c_str() }, // "Stumped? Hint books are available!"
{ 15, 55, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString22].c_str() }, // "In the U.S. call"
{ 89, 55, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString20].c_str() }, // "1 (800) STAR-WARS"
{ 89, 65, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString24].c_str() }, // "that\xD5s 1 (800) 782-7927"
{ 19, 85, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString23].c_str() }, // "In Canada call"
{ 89, 85, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString21].c_str() }, // "1 (800) 828-7927"
TEXT_END_MARKER
};
const TextLine page10[] = {
{ 27, 32, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString25].c_str() }, // "Need a hint NOW? Having problems?"
{ 6, 47, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString29].c_str() }, // "For technical support call"
{ 130, 47, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString26].c_str() }, // "1 (415) 721-3333"
{ 62, 57, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString30].c_str() }, // "For hints call"
{ 130, 57, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString27].c_str() }, // "1 (900) 740-JEDI"
{ 5, 72, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString31].c_str() }, // "The charge for the hint line is 75\xA2 per minute."
{ 10, 82, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString32].c_str() }, // "(You must have your parents\xD5 permission to"
{ 25, 92, kStyleRegular, Graphics::kTextAlignLeft, _strsStrings[kMSIAboutString33].c_str() }, // "call this number if you are under 18.)"
TEXT_END_MARKER
};
AboutPage aboutPages[] = {
{ nullptr, 0, 3500 },
{ nullptr, 0, 100 },
{ nullptr, 0, 100 },
{ nullptr, 0, 100 },
{ page4, 1, 2100 },
{ page5, 1, 7000 },
{ page6, 2, 4200 },
{ page7, 2, 4200 },
{ page8, 2, 4200 },
{ page9, 2, 14100 },
{ page10, 2, 0 }
};
Common::Rect drawAreas[] = {
Common::Rect(2, 2, s->w - 2, s->h - 2),
Common::Rect(0, 2, s->w, s->h - 2),
Common::Rect(176, 10, s->w - 10, s->h - 10)
};
int page = 0;
window->show();
uint32 black = getBlack();
uint32 white = getWhite();
while (!_vm->shouldQuit() && page < ARRAYSIZE(aboutPages)) {
Common::Rect &drawArea = drawAreas[aboutPages[page].drawArea];
switch (page) {
case 0:
s->fillRect(drawArea, black);
window->drawSprite(lucasArts, 64, 2, drawArea);
break;
case 1:
window->fillPattern(drawArea, 0xD7D7, false, true);
break;
case 2:
window->fillPattern(drawArea, 0x5A5A, false, true);
break;
case 3:
case 5:
s->fillRect(drawArea, white);
break;
case 6:
s->fillRect(Common::Rect(176, 129, s->w - 2, s->h - 2), white);
window->markRectAsDirty(Common::Rect(176, 129, s->w - 2, s->h - 2));
break;
default:
break;
}
if (aboutPages[page].text) {
if (aboutPages[page].drawArea == 2) {
window->drawTextBox(drawArea, aboutPages[page].text);
} else {
window->drawTexts(drawArea, aboutPages[page].text);
}
}
window->markRectAsDirty(drawArea);
window->update();
delay(aboutPages[page].delayMs);
page++;
}
lucasArts->free();
delete lucasArts;
}
bool MacV5Gui::runOptionsDialog() {
// Widgets:
//
// 0 - Okay button
// 1 - Cancel button
// 2 - Sound checkbox
// 3 - Music checkbox
// 4 - Picture (text speed background)
// 5 - Picture (text speed handle)
// 6 - Checkbox (dummy?)
// 7 - Checkbox (dummy?)
// 8 - Picture (music quality background)
// 9 - Picture (music quality handle)
// 10 - Static text (dummy?)
//
// Note: While the widget list is the same, Monkey Island 1 shows
// individual checkboxes for Sound and Music, while Monkey Island
// 2 and Fate of Atlantis show a single Music and Sound Effects
// checkbox.
MacDialogWindow *window = createDialog(1000);
MacButton *buttonOk = (MacButton *)window->getWidget(kWidgetButton, 0);
MacButton *buttonCancel = (MacButton *)window->getWidget(kWidgetButton, 1);
MacCheckbox *checkboxSound = (MacCheckbox *)window->getWidget(kWidgetCheckbox, 0);
MacCheckbox *checkboxMusic = nullptr;
MacImageSlider *sliderTextSpeed = window->addImageSlider(4, 5, true, 5, 105, 0, 9);
MacImageSlider *sliderMusicQuality = window->addImageSlider(8, 9, true, 5, 69, 0, 2, 6, 4);
bool sound = !ConfMan.hasKey("mute") || !ConfMan.getBool("mute");
bool music;
int textSpeed = _vm->_defaultTextSpeed;
int musicQuality = ConfMan.hasKey("mac_snd_quality") ? ConfMan.getInt("mac_snd_quality") : 0;
int musicQualityOption = (musicQuality == 0) ? 1 : (musicQuality - 1) % 3;
musicQuality = (musicQuality == 0) ? 2 : (musicQuality - 1) / 3;
if (_vm->_game.id == GID_MONKEY) {
checkboxMusic = (MacCheckbox *)window->getWidget(kWidgetCheckbox, 1);
music = !ConfMan.hasKey("music_mute") || !ConfMan.getBool("music_mute");
checkboxMusic->setValue(music);
if (!sound) {
checkboxMusic->setEnabled(false);
music = false;
}
} else {
checkboxMusic = nullptr;
music = sound;
}
checkboxSound->setValue(sound);
sliderTextSpeed->setValue(textSpeed);
sliderMusicQuality->setValue(musicQualityOption);
while (!_vm->shouldQuit()) {
MacDialogEvent event;
while (window->runDialog(event)) {
switch (event.type) {
case kDialogClick:
if (event.widget == buttonOk) {
// TEXT SPEED
_vm->_defaultTextSpeed = CLIP<int>(sliderTextSpeed->getValue(), 0, 9);
ConfMan.setInt("original_gui_text_speed", _vm->_defaultTextSpeed);
_vm->setTalkSpeed(_vm->_defaultTextSpeed);
// SOUND&MUSIC ACTIVATION
sound = checkboxSound->getValue();
music = checkboxMusic ? checkboxMusic->getValue() : sound;
if (!sound)
music = false;
_vm->_musicEngine->toggleMusic(music);
_vm->_musicEngine->toggleSoundEffects(sound);
ConfMan.setBool("music_mute", !music);
ConfMan.setBool("mute", !sound);
// MUSIC QUALITY SELECTOR
musicQuality = musicQuality * 3 + 1 + sliderMusicQuality->getValue();
_vm->_musicEngine->setQuality(musicQuality);
ConfMan.setInt("mac_snd_quality", musicQuality);
_vm->syncSoundSettings();
ConfMan.flushToDisk();
delete window;
return true;
} else if (event.widget == buttonCancel) {
delete window;
return false;
}
break;
case kDialogValueChange:
if (event.widget == checkboxSound && checkboxMusic) {
checkboxMusic->setEnabled(checkboxSound->getValue() != 0);
}
break;
default:
break;
}
}
window->delayAndUpdate();
}
delete window;
return false;
}
void MacV5Gui::resetAfterLoad() {
reset();
int dummyW, dummyH, dummyHX, dummyHY, dummyAnimate;
setupCursor(dummyW, dummyH, dummyHX, dummyHY, dummyAnimate);
}
bool MacV5Gui::handleEvent(Common::Event event) {
if (MacGuiImpl::handleEvent(event))
return true;
if (_vm->isPaused())
return false;
bool checkRough = (_vm->_game.id != GID_MONKEY || _vm->enhancementEnabled(kEnhUIUX));
if (checkRough && event.type == Common::EVENT_KEYDOWN) {
const char *rough = "rough";
if (event.kbd.keycode == rough[_roughProgress]) {
_roughProgress++;
if (_roughProgress >= strlen(rough)) {
_roughProgress = 0;
if (_vm->_useMacGraphicsSmoothing && !_roughWarned) {
_roughWarned = true;
Common::String msg = _strsStrings[kMSIRoughCommandMsg];
if (msg.empty())
msg = "Warning: The 'rough' command will make your Mac screen look dangerously like a PC. (eek!)";
if (!runOkCancelDialog(msg))
return false;
}
_vm->mac_toggleSmoothing();
}
} else {
_roughProgress = 0;
}
}
return false;
}
} // End of namespace Scumm