/* 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"));
		if (version >= 5)
			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") + U32String(" d"), _("Start the debugger"));
		ADD_BIND(_("Ctrl") + U32String(" s"), _("Show memory consumption"));
		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(" 1-8"), _("Switch 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"));
			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
