scummvm/engines/scumm/help.cpp
Eugene Sandulenko c5c50a2a47
SCUMM: Clarify keyboard bindings in the Help. Bug #14740
This also removes displayed keybinding on on the memory usage,
since that is now taken by stretch functionality and in general,
this is not very useful as of now (it prints out one line of stats
to the debug log)

All of this should in reality go to the keymapper.
2024-11-11 01:39:38 +01:00

361 lines
11 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/util.h"
#include "scumm/help.h"
#include "scumm/scumm.h"
#include "common/translation.h"
namespace Scumm {
int ScummHelp::numPages(byte gameId) {
switch (gameId) {
case GID_MANIAC:
case GID_ZAK:
return 4;
case GID_INDY4:
return 5;
case GID_INDY3:
return 6;
case GID_LOOM:
case GID_MONKEY_EGA:
case GID_MONKEY_VGA:
case GID_MONKEY:
case GID_MONKEY2:
case GID_TENTACLE:
case GID_SAMNMAX:
case GID_DIG:
case GID_FT:
case GID_CMI:
return 3;
/* TODO - I don't know the controls for these games
case GID_PUTTDEMO:
case GID_PUTTPUTT:
*/
default:
return 2;
}
}
#define ADD_BIND(k,d) do { key[i] = k; dsc[i] = d; i++; } while (0)
#define ADD_TEXT(d) ADD_BIND("",d)
#define ADD_LINE ADD_BIND("","")
void ScummHelp::updateStrings(byte gameId, byte version, Common::Platform platform,
int page, U32String &title, U32String *&key, U32String *&dsc) {
key = new U32String[HELP_NUM_LINES];
dsc = new U32String[HELP_NUM_LINES];
int i = 0;
switch (page) {
case 1:
title = _("Common keyboard commands:");
ADD_BIND("F5", _("Save / Load dialog"));
// I18N: "Selection screen" is what the English game manual
// calls it. It contains various options, a sound test, etc.
if (gameId == GID_LOOM && platform == Common::kPlatformPCEngine)
ADD_BIND("F6", _("Selection screen"));
ADD_BIND(".", _("Skip line of text"));
ADD_BIND(_("Esc"), _("Skip cutscene"));
ADD_BIND(_("Space"), _("Pause game"));
ADD_BIND(_("Ctrl") + U32String(" 0-9"), _("Load saved game 1-10"));
ADD_BIND(_("Alt") + U32String(" 0-9"), _("Save game 1-10"));
#ifdef MACOSX
ADD_BIND("Cmd q", _("Quit"));
#else
ADD_BIND(_("Alt") + U32String(" x, ") + _("Ctrl") + U32String(" z"), _("Quit"));
#endif
ADD_BIND(_("Alt") + U32String(" ") + _("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"));
break;
case 2:
title = _("Special keyboard commands:");
ADD_BIND("~, #", _("Show / Hide console"));
ADD_BIND(_("Ctrl") + _("Alt") + U32String(" d"), _("Start the debugger"));
ADD_BIND(_("Ctrl") + U32String(" f"), _("Run in fast mode (*)"));
ADD_BIND(_("Ctrl") + U32String(" g"), _("Run in really fast mode (*)"));
ADD_BIND(_("Ctrl") + U32String(" m"), _("Toggle mouse capture"));
ADD_BIND(_("Ctrl") + U32String(" ") + _("Alt") + U32String(" 9, 0"), _("Cycle between graphics filters"));
ADD_BIND(_("Ctrl") + U32String(" ") + _("Alt") + U32String(" +, -"), _("Increase / Decrease scale factor"));
ADD_BIND(_("Ctrl") + U32String(" ") + _("Alt") + U32String(" a"), _("Toggle aspect-ratio correction"));
ADD_LINE;
ADD_LINE;
// FIXME: This should use word-wrapping, and should not assume
// that the font is mono-spaced.
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 behavior."));
break;
case 3:
if (gameId == GID_LOOM)
title = _("Spinning drafts on the keyboard:");
else
title = _("Main game controls:");
switch (gameId) {
case GID_ZAK:
case GID_MANIAC:
if (platform == Common::kPlatformNES) {
ADD_BIND("q", _("Push"));
ADD_BIND("a", _("Pull"));
ADD_BIND("z", _("Give"));
ADD_BIND("w", _("Open"));
ADD_BIND("s", _("Close"));
ADD_BIND("x", _("Go to"));
ADD_BIND("e", _("Get"));
ADD_BIND("d", _("Use"));
ADD_BIND("c", _("Read"));
ADD_BIND("r", _("New kid"));
ADD_BIND("f", _("Turn on"));
ADD_BIND("v", _("Turn off"));
break;
}
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_MANIAC) {
ADD_BIND("r", _("Unlock"));
ADD_BIND("f", _("New kid"));
} else {
ADD_BIND("r", _("Put on"));
ADD_BIND("f", _("Take off"));
}
ADD_BIND("v", _("Use"));
ADD_BIND("t", _("Turn on"));
ADD_BIND("g", _("Turn off"));
if (gameId == GID_MANIAC)
ADD_BIND("b", _("Fix"));
else
ADD_BIND("b", _("Switch"));
break;
case GID_INDY3:
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"));
ADD_BIND("b", _("To Henry / To Indy"));
break;
case GID_LOOM:
// I18N: These are different musical notes
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"));
// I18N: Drafts is set of notes in Loom to invoke spells
ADD_BIND(_("Ctrl") + U32String(" d"), _("Shows the drafts inventory"));
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)"));
if (platform == Common::kPlatformSegaCD) {
ADD_BIND(_("KeyUp"), _("Highlight prev dialogue"));
ADD_BIND(_("KeyDown"), _("Highlight next dialogue"));
}
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"));
// I18N: Comm is a communication device
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;
default:
break;
}
break;
case 4:
title = _("Other game controls:");
if (version <= 2) {
ADD_TEXT(_("Inventory:"));
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"));
ADD_LINE;
} else if (gameId == GID_INDY3 || gameId == GID_ZAK) {
// Indy3, or FM-TOWNS Zak
ADD_TEXT(_("Inventory:"));
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"));
ADD_LINE;
}
if (gameId == GID_MANIAC) {
ADD_TEXT(_("Switching characters:"));
ADD_BIND("F1", "Dave");
ADD_BIND("F2", _("Second kid"));
ADD_BIND("F3", _("Third kid"));
} else if (gameId == GID_ZAK) {
ADD_TEXT(_("Switching characters:"));
ADD_BIND("F1", "Zak");
ADD_BIND("F2", "Annie");
ADD_BIND("F3", "Melissa");
ADD_BIND("F4", "Leslie");
}
if (gameId == GID_INDY4) {
ADD_BIND("i", _("Toggle Inventory/IQ Points display"));
ADD_BIND("f", _("Toggle Keyboard/Mouse Fighting (*)"));
ADD_LINE;
ADD_TEXT(_("* Keyboard Fighting is always on,"));
ADD_TEXT(_(" so despite the in-game message this"));
ADD_TEXT(_(" actually toggles Mouse Fighting Off/On"));
}
break;
case 5:
switch (gameId) {
case GID_INDY3:
case GID_INDY4:
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"));
if (gameId == GID_INDY4) {
ADD_BIND("0", _("Sucker punch"));
}
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;
default:
break;
}
break;
case 6:
switch (gameId) {
case GID_INDY3:
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;
default:
break;
}
break;
default:
break;
}
while (i < HELP_NUM_LINES) {
ADD_LINE;
}
}
#undef ADD_BIND
#undef ADD_TEXT
#undef ADD_LINE
} // End of namespace Scumm