diff options
author | Max Horn | 2003-06-14 21:18:14 +0000 |
---|---|---|
committer | Max Horn | 2003-06-14 21:18:14 +0000 |
commit | b8e32a5b6fb07424b5dc6329ee72a83c710a11fb (patch) | |
tree | e100fe8fe9b5cb2431fc205da1d796fb5a1536ad | |
parent | 9f8338503aabee8f2c4bc44d33d6266d573009e9 (diff) | |
download | scummvm-rg350-b8e32a5b6fb07424b5dc6329ee72a83c710a11fb.tar.gz scummvm-rg350-b8e32a5b6fb07424b5dc6329ee72a83c710a11fb.tar.bz2 scummvm-rg350-b8e32a5b6fb07424b5dc6329ee72a83c710a11fb.zip |
Patch #745843: Help Dialog; in addition, I moved the 'About' dialog button from the options dialog to the main save/load dialog and enlarged & rearranged that dialog
svn-id: r8485
-rw-r--r-- | scumm/dialogs.cpp | 145 | ||||
-rw-r--r-- | scumm/dialogs.h | 40 | ||||
-rw-r--r-- | scumm/help.cpp | 304 | ||||
-rw-r--r-- | scumm/help.h | 38 | ||||
-rw-r--r-- | scumm/module.mk | 1 |
5 files changed, 506 insertions, 22 deletions
diff --git a/scumm/dialogs.cpp b/scumm/dialogs.cpp index c3c9539cdf..c010e00d17 100644 --- a/scumm/dialogs.cpp +++ b/scumm/dialogs.cpp @@ -27,6 +27,10 @@ #include "player_v2.h" #include "verbs.h" +#ifndef DISABLE_HELP +#include "help.h" +#endif + #include "gui/newgui.h" #include "gui/ListWidget.h" #include "common/config-file.h" @@ -79,7 +83,8 @@ static const char* string_map_table_custom[] = { "Map", //24 "Choose an action to map", //25 "Press the key to associate", //26 - "Please select an action" //27 + "Please select an action", //27 + "Help" //28 }; #ifdef __PALM_OS__ @@ -220,25 +225,51 @@ enum { kLoadCmd = 'LOAD', kPlayCmd = 'PLAY', kOptionsCmd = 'OPTN', + kHelpCmd = 'HELP', + kAboutCmd = 'ABOU', kQuitCmd = 'QUIT' }; SaveLoadDialog::SaveLoadDialog(NewGui *gui, Scumm *scumm) - : ScummDialog(gui, scumm, 30, 18, 260, 162) { + : ScummDialog(gui, scumm, 20, 8, 280, 184) { const int x = _w - kButtonWidth - 8; + int y = 20; // The headline addResText(0, 7, 260, 16, 1); // The five buttons on the side - _saveButton = addPushButton(x, 20, queryResString(4), kSaveCmd, 'S'); - _loadButton = addPushButton(x, 40, queryResString(5), kLoadCmd, 'L'); - addButton(x, 60, queryResString(6), kPlayCmd, 'P'); // Play - addButton(x, 80, queryCustomString(17), kOptionsCmd, 'O'); // Options - addButton(x, 100, queryResString(8), kQuitCmd, 'Q'); // Quit + _saveButton = addPushButton(x, y, queryResString(4), kSaveCmd, 'S'); y += 20; + _loadButton = addPushButton(x, y, queryResString(5), kLoadCmd, 'L'); y += 20; + y += 5; + + addButton(x, y, "About", kAboutCmd, 'A'); y += 20; // About +#ifndef DISABLE_HELP + addButton(x, y, queryCustomString(28), kHelpCmd, 'H'); y += 20; // Help +#endif + addButton(x, y, queryCustomString(17), kOptionsCmd, 'O'); y += 20; // Options + y += 5; + + addButton(x, y, queryResString(6), kPlayCmd, 'P'); y += 20; // Play + addButton(x, y, queryResString(8), kQuitCmd, 'Q'); y += 20; // Quit + + // + // Create the sub dialog(s) + // + _aboutDialog = new AboutDialog(gui, scumm); +#ifndef DISABLE_HELP + _helpDialog = new HelpDialog(gui, scumm); +#endif // The save game list - _savegameList = new ListWidget(this, 8, 20, x - 14, 134); + _savegameList = new ListWidget(this, 8, 20, x - 14, 156); +} + +SaveLoadDialog::~SaveLoadDialog() { + delete _aboutDialog; +#ifndef DISABLE_HELP + delete _helpDialog; +#endif } void SaveLoadDialog::open() { @@ -297,6 +328,14 @@ void SaveLoadDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat case kOptionsCmd: _scumm->optionsDialog(); break; + case kAboutCmd: + _aboutDialog->runModal(); + break; +#ifndef DISABLE_HELP + case kHelpCmd: + _helpDialog->runModal(); + break; +#endif case kQuitCmd: _scumm->_quit = true; close(); @@ -383,8 +422,7 @@ enum { }; enum { - kKeysCmd = 'KEYS', - kAboutCmd = 'ABOU' + kKeysCmd = 'KEYS' }; #ifndef _WIN32_WCE @@ -401,14 +439,10 @@ OptionsDialog::OptionsDialog(NewGui *gui, Scumm *scumm) addButton(_w-kButtonWidth-8, _h-24 - kButtonHeight - 4, "OK", kOKCmd, 'O'); addButton(_w-2*kButtonWidth-12, _h-24 - kButtonHeight - 4, "Cancel", kCancelCmd, 'C'); - addButton(8, _h-24 - kButtonHeight - 4, "About", kAboutCmd, 'A'); - addButton(kButtonWidth+12, _h-24, "Keys", kKeysCmd, 'K'); #else addButton(_w-kButtonWidth-8, _h-24, "OK", kOKCmd, 'O'); addButton(_w-2*kButtonWidth-12, _h-24, "Cancel", kCancelCmd, 'C'); - - addButton(8, _h-24, "About", kAboutCmd, 'A'); #endif // @@ -441,16 +475,14 @@ OptionsDialog::OptionsDialog(NewGui *gui, Scumm *scumm) amigaPalCheckbox = new CheckboxWidget(this, 15, 80, 200, 16, "Amiga palette conversion", 0, 'P'); // - // Finally create the sub dialogs + // Create the sub dialog(s) // - _aboutDialog = new AboutDialog(gui, scumm); #ifdef _WIN32_WCE _keysDialog = new KeysDialog(gui, scumm); #endif } OptionsDialog::~OptionsDialog() { - delete _aboutDialog; #ifdef _WIN32_WCE delete _keysDialog; #endif @@ -484,9 +516,6 @@ void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data _keysDialog->runModal(); #endif break; - case kAboutCmd: - _aboutDialog->runModal(); - break; case kMasterVolumeChanged: _soundVolumeMaster = _masterVolumeSlider->getValue(); _masterVolumeLabel->setValue(_soundVolumeMaster); @@ -558,6 +587,82 @@ AboutDialog::AboutDialog(NewGui *gui, Scumm *scumm) new StaticTextWidget(this, 10, 78, 240, 16, "Simon the Sorcerer (c) Adventuresoft", kTextAlignCenter); } +#ifndef DISABLE_HELP + +#pragma mark - + +enum { + kNextCmd = 'NEXT', + kPrevCmd = 'PREV' +}; + +HelpDialog::HelpDialog(NewGui *gui, Scumm *scumm) + : ScummDialog(gui, scumm, 15, 10, 290, 184) { + + _page = 1; + _gameId = scumm->_gameId; + _numPages = ScummHelp::numPages(_gameId); + + _prevButton = addPushButton(10, 160, "Previous", kPrevCmd, 'P'); + _nextButton = addPushButton(90, 160, "Next", kNextCmd, 'N'); + addButton(210, 160, "Close", kCloseCmd, 'C'); + _prevButton->clearFlags(WIDGET_ENABLED); + + _title = new StaticTextWidget(this, 10, 5, 270, 16, "", kTextAlignCenter); + for (int i = 0; i < HELP_NUM_LINES; i++) { + _key[i] = new StaticTextWidget(this, 10, 20 + (10 * i), 80, 16, "", kTextAlignLeft); + _dsc[i] = new StaticTextWidget(this, 90, 20 + (10 * i), 190, 16, "", kTextAlignLeft); + } + + displayKeyBindings(); +} + +void HelpDialog::displayKeyBindings() { + String titleStr, *keyStr, *dscStr; + + ScummHelp::updateStrings(_gameId, _page, titleStr, keyStr, dscStr); + + _title->setLabel(titleStr); + for (int i = 0; i < HELP_NUM_LINES; i++) { + _key[i]->setLabel(keyStr[i]); + _dsc[i]->setLabel(dscStr[i]); + } + + delete [] keyStr; + delete [] dscStr; +} + +void HelpDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { + switch (cmd) { + case kNextCmd: + _page++; + if (_page >= _numPages) { + _nextButton->clearFlags(WIDGET_ENABLED); + } + if (_page >= 2) { + _prevButton->setFlags(WIDGET_ENABLED); + } + displayKeyBindings(); + draw(); + break; + case kPrevCmd: + _page--; + if (_page <= _numPages) { + _nextButton->setFlags(WIDGET_ENABLED); + } + if (_page <= 1) { + _prevButton->clearFlags(WIDGET_ENABLED); + } + displayKeyBindings(); + draw(); + break; + default: + ScummDialog::handleCommand(sender, cmd, data); + } +} + +#endif + #pragma mark - InfoDialog::InfoDialog(NewGui *gui, Scumm *scumm, int res) diff --git a/scumm/dialogs.h b/scumm/dialogs.h index a114bafe99..573fbbaba2 100644 --- a/scumm/dialogs.h +++ b/scumm/dialogs.h @@ -24,6 +24,10 @@ #include "common/str.h" #include "gui/dialog.h" +#ifndef DISABLE_HELP +#include "help.h" +#endif + class ListWidget; class Scumm; @@ -50,16 +54,22 @@ protected: class SaveLoadDialog : public ScummDialog { public: SaveLoadDialog(NewGui *gui, Scumm *scumm); + ~SaveLoadDialog(); virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); virtual void open(); virtual void close(); protected: - ListWidget *_savegameList; + ListWidget *_savegameList; PushButtonWidget *_saveButton; PushButtonWidget *_loadButton; + Dialog *_aboutDialog; +#ifndef DISABLE_HELP + Dialog *_helpDialog; +#endif + bool _saveMode; void fillList(); @@ -74,9 +84,35 @@ public: AboutDialog(NewGui *gui, Scumm *scumm); }; +#ifndef DISABLE_HELP + +class HelpDialog : public ScummDialog { +public: + HelpDialog(NewGui *gui, Scumm *scumm); + virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); + +protected: + typedef ScummVM::String String; + + PushButtonWidget *_nextButton; + PushButtonWidget *_prevButton; + + StaticTextWidget *_title; + StaticTextWidget *_key[HELP_NUM_LINES]; + StaticTextWidget *_dsc[HELP_NUM_LINES]; + + int _page; + int _numPages; + + byte _gameId; + + void displayKeyBindings(); +}; + +#endif + class OptionsDialog : public ScummDialog { protected: - Dialog *_aboutDialog; #ifdef _WIN32_WCE Dialog *_keysDialog; #endif diff --git a/scumm/help.cpp b/scumm/help.cpp new file mode 100644 index 0000000000..d6a74b4fe7 --- /dev/null +++ b/scumm/help.cpp @@ -0,0 +1,304 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2002-2003 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "stdafx.h" +#include "help.h" +#include "scumm.h" +#include "common/str.h" + +int ScummHelp::numPages(byte gameId) { + switch (gameId) { + case GID_MANIAC: + case GID_ZAK: + case GID_ZAK256: + return 4; + break; + case GID_INDY3: + case GID_INDY3_256: + return 6; + break; + case GID_LOOM: + case GID_LOOM256: + case GID_MONKEY_EGA: + case GID_MONKEY_VGA: + case GID_MONKEY: + case GID_MONKEY2: + case GID_INDY4: + case GID_TENTACLE: + case GID_SAMNMAX: + case GID_DIG: + case GID_FT: + case GID_CMI: + return 3; + break; +/* TODO - I don't know the controls for these games + case GID_PUTTDEMO: +*/ + default: + return 2; + } +} + +#define ADD_BIND(k,d) key[i] = k; dsc[i] = d; i++; +#define ADD_TEXT(d) ADD_BIND("",d) +#define ADD_LINE ADD_BIND("","") + +void ScummHelp::updateStrings(byte gameId, int page, String &title, + String *&key, String *&dsc) { + key = new String[HELP_NUM_LINES]; + dsc = new String[HELP_NUM_LINES]; + int i = 0; + switch (page) { + case 1: + title = "Common keyboard commands:"; + ADD_BIND("F5", "Save / Load dialog"); + ADD_BIND(".", "Skip line of text"); + ADD_BIND("Esc", "Skip cutscene"); + ADD_BIND("Space", "Pause game"); + ADD_BIND("Ctrl 0-9", "Load game state 1-10"); + ADD_BIND("Alt 0-9", "Save game state 1-10"); + ADD_BIND("Alt x, Ctrl q", "Quit"); + ADD_BIND("Alt Enter", "Toggle fullscreen"); + ADD_BIND("[, ]", "Music volume up / down"); + ADD_BIND("-, +", "Text speed slower / faster"); + ADD_BIND("Enter", "Simulate left mouse button"); + ADD_BIND("Tab", "Simulate right mouse button"); + ADD_BIND("Arrow Keys", "Simulate mouse movement"); + break; + case 2: + title = "Special keyboard commands:"; + ADD_BIND("~, #", "Show / Hide console"); + ADD_BIND("Ctrl d", "Start the debugger"); + ADD_BIND("Ctrl s", "Show memory consumption"); + ADD_BIND("Ctrl f", "Run in fast mode *"); + ADD_BIND("Ctrl g", "Run in really fast mode *"); + ADD_BIND("Ctrl Alt 0-9", "Set graphics filter"); + ADD_LINE; + ADD_LINE; + ADD_LINE; + ADD_LINE; + ADD_TEXT("* Note that using ctrl-f and"); + ADD_TEXT("ctrl-g are not recommended"); + ADD_TEXT("since they may cause crashes"); + ADD_TEXT("or incorrect game behaviour."); + break; + case 3: + if (gameId == GID_LOOM || gameId == GID_LOOM256) + title = "Spinning drafts on the keyboard:"; + else + title = "Main game controls:"; + switch (gameId) { + case GID_ZAK: + case GID_ZAK256: + case GID_MANIAC: + ADD_BIND("q", "Push"); + ADD_BIND("a", "Pull"); + ADD_BIND("z", "Give"); + ADD_BIND("w", "Open"); + ADD_BIND("s", "Close"); + ADD_BIND("x", "Read"); + ADD_BIND("e", "Walk to"); + ADD_BIND("d", "Pick up"); + ADD_BIND("c", "What is"); + if (gameId == GID_ZAK || gameId == GID_ZAK256) { + ADD_BIND("r", "Put on"); + ADD_BIND("f", "Take off"); + } else { + ADD_BIND("r", "New kid"); + ADD_BIND("f", "Unlock"); + } + ADD_BIND("v", "Use"); + ADD_BIND("t", "Turn on"); + ADD_BIND("g", "Turn off"); + break; + case GID_INDY3: + case GID_INDY3_256: + ADD_BIND("q", "Push"); + ADD_BIND("a", "Pull"); + ADD_BIND("z", "Give"); + ADD_BIND("w", "Open"); + ADD_BIND("s", "Close"); + ADD_BIND("x", "Look"); + ADD_BIND("e", "Walk to"); + ADD_BIND("d", "Pick up"); + ADD_BIND("c", "What is"); + ADD_BIND("r", "Use"); + ADD_BIND("f", "Turn on"); + ADD_BIND("v", "Turn off"); + ADD_BIND("t", "Talk"); + ADD_BIND("g", "Travel"); + break; + case GID_LOOM: + case GID_LOOM256: + ADD_BIND("q, c", "play C minor on distaff"); + ADD_BIND("w, d", "play D on distaff"); + ADD_BIND("e, e", "play E on distaff"); + ADD_BIND("r, f", "play F on distaff"); + ADD_BIND("t, g", "play G on distaff"); + ADD_BIND("y, a", "play A on distaff"); + ADD_BIND("u, b", "play B on distaff"); + ADD_BIND("i, C", "play C major on distaff"); + break; + case GID_MONKEY_EGA: + case GID_MONKEY_VGA: + ADD_BIND("o", "Open"); + ADD_BIND("c", "Close"); + ADD_BIND("s", "puSh"); + ADD_BIND("y", "pull (Yank)"); + ADD_BIND("w", "Walk to"); + ADD_BIND("p", "Pick up"); + ADD_BIND("t", "Talk to"); + ADD_BIND("g", "Give"); + ADD_BIND("u", "Use"); + ADD_BIND("l", "Look at"); + ADD_BIND("n", "turn oN"); + ADD_BIND("f", "turn oFf"); + break; + case GID_MONKEY: + case GID_MONKEY2: + case GID_INDY4: + case GID_TENTACLE: + ADD_BIND("g", "Give"); + ADD_BIND("o", "Open"); + ADD_BIND("c", "Close"); + ADD_BIND("p", "Pick up"); + ADD_BIND("l", "Look at"); + ADD_BIND("t", "Talk to"); + ADD_BIND("u", "Use"); + ADD_BIND("s", "puSh"); + ADD_BIND("y", "pull (Yank)"); + break; + case GID_SAMNMAX: + ADD_BIND("w", "Walk"); + ADD_BIND("t", "Talk"); + ADD_BIND("u", "Use"); + ADD_BIND("i", "Inventory"); + ADD_BIND("o", "Object"); + ADD_BIND("p", "Pick up"); + ADD_BIND("l", "Look"); + ADD_BIND("b", "Black and White / Color"); + break; + case GID_FT: + ADD_BIND("e", "Eyes"); + ADD_BIND("t", "Tongue"); + ADD_BIND("i", "Inventory"); + ADD_BIND("p", "Punch"); + ADD_BIND("k", "Kick"); + break; + case GID_DIG: + ADD_BIND("e", "Examine"); + ADD_BIND("t", "Regular cursor"); + ADD_BIND("i", "Inventory"); + ADD_BIND("c", "Comm"); + break; + case GID_CMI: + ADD_BIND("F1", "Save / Load / Options"); + ADD_BIND("e", "Examine"); + ADD_BIND("t", "Talk to"); + ADD_BIND("i", "Inventory"); + ADD_BIND("u", "Use"); + break; + } + break; + case 4: + switch (gameId) { + case GID_MANIAC: + case GID_ZAK: + case GID_ZAK256: + title = "Main game controls:"; + if (gameId == GID_ZAK || gameId == GID_ZAK256) { + ADD_BIND("b", "Switch"); + } else { + ADD_BIND("b", "Fix"); + } + ADD_LINE; + ADD_TEXT("Inventory Controls (not implemented):"); + ADD_BIND("u", "Scroll list up"); + ADD_BIND("j", "Scroll list down"); + ADD_BIND("i", "Upper left item"); + ADD_BIND("k", "Lower left item"); + ADD_BIND("o", "Upper right item"); + ADD_BIND("l", "Lower right item"); + break; + case GID_INDY3: + case GID_INDY3_256: + title = "Main game controls:"; + ADD_BIND("b", "To Henry / To Indy"); + ADD_LINE; + ADD_TEXT("Inventory Controls:"); + ADD_BIND("y", "Upper left item"); + ADD_BIND("h", "Middle left item"); + ADD_BIND("n", "Lower left item"); + ADD_BIND("u", "Upper right item"); + ADD_BIND("j", "Middle right item"); + ADD_BIND("m", "Lower right item"); + ADD_BIND("o", "Scroll list up"); + ADD_BIND("l", "Scroll list down"); + break; + } + break; + case 5: + switch (gameId) { + case GID_INDY3: + case GID_INDY3_256: + title = "Fighting controls (numpad):"; + ADD_BIND("7", "Step back"); + ADD_BIND("4", "Step back"); + ADD_BIND("1", "Step back"); + ADD_BIND("8", "Block high"); + ADD_BIND("5", "Block middle"); + ADD_BIND("2", "Block low"); + ADD_BIND("9", "Punch high"); + ADD_BIND("6", "Punch middle"); + ADD_BIND("3", "Punch low"); + ADD_LINE; + ADD_TEXT("These are for Indy on left."); + ADD_TEXT("When Indy is on the right,"); + ADD_TEXT("7, 4, and 1 are switched with"); + ADD_TEXT("9, 6, and 3, respectively."); + break; + } + break; + case 6: + switch (gameId) { + case GID_INDY3: + case GID_INDY3_256: + title = "Biplane controls (numpad):"; + ADD_BIND("7", "Fly to upper left"); + ADD_BIND("4", "Fly to left"); + ADD_BIND("1", "Fly to lower left"); + ADD_BIND("8", "Fly upwards"); + ADD_BIND("5", "Fly straight"); + ADD_BIND("2", "Fly down"); + ADD_BIND("9", "Fly to upper right"); + ADD_BIND("6", "Fly to right"); + ADD_BIND("3", "Fly to lower right"); + break; + } + break; + } + while (i < HELP_NUM_LINES) { + ADD_LINE; + } +} + +#undef ADD_BIND +#undef ADD_TEXT +#undef ADD_LINE + diff --git a/scumm/help.h b/scumm/help.h new file mode 100644 index 0000000000..c4383ca31a --- /dev/null +++ b/scumm/help.h @@ -0,0 +1,38 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2002-2003 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef SCUMM_HELP_H +#define SCUMM_HELP_H + +#include "common/str.h" + +#define HELP_NUM_LINES 14 + +class ScummHelp { +protected: + typedef ScummVM::String String; + +public: + static int numPages(byte gameId); + static void updateStrings(byte gameId, int page, String &title, + String *&key, String *&dsc); +}; + +#endif + diff --git a/scumm/module.mk b/scumm/module.mk index 1f58f63422..241fcf2cab 100644 --- a/scumm/module.mk +++ b/scumm/module.mk @@ -17,6 +17,7 @@ SCUMM_OBJS = \ scumm/imuse_digi.o \ scumm/imuse_player.o \ scumm/instrument.o \ + scumm/help.o \ scumm/nut_renderer.o \ scumm/object.o \ scumm/player_v2.o\ |