/* 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "common/str.h" #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, 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")); if (version >= 5) ADD_BIND(".", _("Skip line of text")); ADD_BIND(_("Esc"), _("Skip cutscene")); ADD_BIND(_("Space"), _("Pause game")); ADD_BIND(String(_("Ctrl")) + " 0-9", _("Load saved game 1-10")); ADD_BIND(String(_("Alt")) + " 0-9", _("Save game 1-10")); #ifdef MACOSX ADD_BIND("Cmd q", _("Quit")); #else ADD_BIND(String(_("Alt")) + " x, " + _("Ctrl") + " z", _("Quit")); #endif ADD_BIND(String(_("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")); break; case 2: title = _("Special keyboard commands:"); ADD_BIND("~, #", _("Show / Hide console")); ADD_BIND(String(_("Ctrl")) + " d", _("Start the debugger")); ADD_BIND(String(_("Ctrl")) + " s", _("Show memory consumption")); ADD_BIND(String(_("Ctrl")) + " f", _("Run in fast mode (*)")); ADD_BIND(String(_("Ctrl")) + " g", _("Run in really fast mode (*)")); ADD_BIND(String(_("Ctrl")) + " m", _("Toggle mouse capture")); ADD_BIND(String(_("Ctrl")) + " " + _("Alt") + " 1-8", _("Switch between graphics filters")); ADD_BIND(String(_("Ctrl")) + " " + _("Alt") + " +, -", _("Increase / Decrease scale factor")); ADD_BIND(String(_("Ctrl")) + " " + _("Alt") + " 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")); 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