/* 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.
 *
 * System variable handling.
 */

#include "tinsel/dw.h"
#include "tinsel/graphics.h"
#include "tinsel/dialogs.h"
#include "tinsel/strres.h"
#include "tinsel/sysvar.h"
#include "tinsel/tinsel.h"

#include "common/textconsole.h"

namespace Tinsel {

// Return for SYS_Platform
typedef enum { DOS_PC, WIN_PC, APPLE_MAC, SONY_PSX, SEGA_SATURN } platform;

//----------------- GLOBAL GLOBAL DATA --------------------

extern int NewestSavedGame();

//----------------- LOCAL GLOBAL DATA --------------------

// FIXME: Avoid non-const global vars

static int g_systemVars[SV_TOPVALID] = {

		INV_1,		// Default inventory

		10,		// Y-offset of Conversation(TOP)
		320,		// Y-offset of Conversation(BOT)
		15,		// Minimum distance from side
		10,		// Minimum distance from top
		115,		// Distance above actor
		10,		// Distance below actor

		0,		// Current language **READ ONLY**
		0,		// Sample language **READ ONLY**
		0,		// Current state **READ ONLY**
		0,		// Saved Game Exists **READ ONLY**

		true,		// Should Conversation() wait for scroll? [TRUE]
		true,		// Should Talk()/Say() wait for scroll? [TRUE]

		true,		// Enable PointTag()
		true,		// Enable cursor with PrintCursor()

		100,		// SV_SCROLL_XTRIGGER
		0,			// SV_SCROLL_XDISTANCE
		16,			// SV_SCROLL_XSPEED
		40,			// SV_SCROLL_YTRIGGERTOP
		40,			// SV_SCROLL_YTRIGGERBOT
		0,			// SV_SCROLL_YDISTANCE
		16,			// SV_SCROLL_YSPEED

		2,		// Speech Delay
		2,		// Music dim factor

		0,		// if set, default actor's text color gets poked in here

		0,		// user 1
		0,		// user 2
		0,		// user 3
		0,		// user 4
		0,		// user 5
		0,		// user 6

		0,		// SYS_MinimumXoffset
		0,		// SYS_MaximumXoffset
		0,		// SYS_MinimumYoffset
		0,		// SYS_MaximumYoffset

		0,		// SYS_DefaultFxDimFactor
		0,		// SYS_SceneFxDimFactor

		0x606060,	// SYS_HighlightRGB
		WIN_PC,		// SYS_Platform,
		0,		// SYS_Debug

		0,		// ISV_DIVERT_ACTOR
		false,		// ISV_NO_BLOCKING

		0,		// ISV_GHOST_ACTOR
		0,		// ISV_GHOST_BASE
		0		// ISV_GHOST_COLOR
};

static SCNHANDLE g_systemStrings[SS_MAX_VALID];	// FIXME: Avoid non-const global vars

//static bool bFlagNoBlocking = false;

//----------------- FUNCTIONS --------------------------------

/**
 * Initializes the system variable list
 */

void InitSysVars() {
	g_systemVars[SV_SCROLL_XDISTANCE] = SCREEN_WIDTH / 2;
	g_systemVars[SV_SCROLL_YDISTANCE] = SCREEN_BOX_HEIGHT1 / 2;
}

/**
 * SetSysVar
 */

void SetSysVar(int varId, int newValue) {
	if (varId < 0 || varId >= SV_TOPVALID)
		error("SetSystemVar(): out of range identifier");

	switch (varId) {
	case SV_LANGUAGE:
	case SV_SAMPLE_LANGUAGE:
	case SV_SUBTITLES:
	case SV_SAVED_GAME_EXISTS:
	case SYS_Platform:
	case SYS_Debug:
		error("SetSystemVar(): read only identifier");

	default:
		g_systemVars[varId] = newValue;
	}
}

int SysVar(int varId) {
	if (varId < 0 || varId >= SV_TOPVALID)
		error("SystemVar(): out of range identifier");

	switch (varId) {
	case SV_LANGUAGE:
		return TextLanguage();

	case SV_SAMPLE_LANGUAGE:
		return SampleLanguage();

	case SV_SUBTITLES:
		// FIXME: This isn't currently defined
		return false;
		//return _vm->_config->_useSubtitles;

	case SV_SAVED_GAME_EXISTS:
		return NewestSavedGame() != -1;

	case SYS_Debug:
		// FIXME: This isn't currently defined
		return false;
		//return bDebuggingAllowed;

	default:
		return g_systemVars[varId];
	}
}

void SaveSysVars(int *pSv) {
	memcpy(pSv, g_systemVars, sizeof(g_systemVars));
}

void RestoreSysVars(int *pSv) {
	memcpy(g_systemVars, pSv, sizeof(g_systemVars));
}

void SetSysString(int number, SCNHANDLE hString) {
	assert(number >= 0 && number < SS_MAX_VALID);

	g_systemStrings[number] = hString;
}

SCNHANDLE SysString(int number) {
	assert(number >= 0 && number < SS_MAX_VALID);

	return g_systemStrings[number];
}

/**
 * Gets the no blocking flag. Note that for convenience, the systemVars array
 * entry is used even for Tinsel 1, which originally used a separate variable.
 */
bool GetNoBlocking() {
	return SysVar(ISV_NO_BLOCKING);
}

/**
 * Sets the no blocking flag. Note that for convenience, the systemVars array
 * entry is used even for Tinsel 1, which originally used a separate variable.
 */
void SetNoBlocking(bool flag) {
	SetSysVar(ISV_NO_BLOCKING, flag);
}

} // End of namespace Tinsel
