/* 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.
 *
 * User events processing and utility functions
 */

#ifndef TINSEL_EVENTS_H
#define TINSEL_EVENTS_H

#include "common/coroutines.h"
#include "common/rect.h"
#include "tinsel/dw.h"

namespace Tinsel {

/*
enum BUTEVENT {
	PLR_NOEVENT, PLR_SLEFT, PLR_DLEFT, PLR_SRIGHT, PLR_DRIGHT,
	PLR_DRAG1_START, PLR_DRAG1_END, PLR_DRAG2_START, PLR_DRAG2_END,
	PLR_UNKNOWN
};

enum KEYEVENT {
	PLR_ESCAPE, PLR_QUIT, PLR_SAVE, PLR_LOAD, PLR_MENU,
	PLR_PGUP, PLR_PGDN, PLR_HOME, PLR_END,
	PLR_WALKTO, PLR_ACTION, PLR_LOOK,
	NOEVENT_KEY
};*/

enum PLR_EVENT {
	// action list
	PLR_PROV_WALKTO = 0,	// Provisional WALKTO !
	PLR_WALKTO = 1,
	PLR_LOOK = 2,
	PLR_ACTION = 3,
	PLR_ESCAPE = 4,
	PLR_MENU = 5,
	PLR_QUIT = 6,
	PLR_PGUP = 7,
	PLR_PGDN = 8,
	PLR_HOME = 9,
	PLR_END = 10,
	PLR_DRAG1_START = 11,
	PLR_DRAG1_END = 12,
	PLR_DRAG2_START = 13,
	PLR_DRAG2_END = 14,
	PLR_JUMP = 15,		// Call up scene hopper
	PLR_NOEVENT = 16,
	PLR_SAVE = 17,
	PLR_LOAD = 18,
	PLR_WHEEL_UP = 19,
	PLR_WHEEL_DOWN = 20,

	// Aliases used for DW1 actions
	PLR_SLEFT = PLR_WALKTO,
	PLR_DLEFT = PLR_ACTION,
	PLR_SRIGHT = PLR_LOOK,
	PLR_DRIGHT = PLR_NOEVENT,
	PLR_UNKNOWN = PLR_NOEVENT
};



/**
 * Reasons for running Glitter code.
 * Do not re-order these as equivalent CONSTs are defined in the master
 * scene Glitter source file for testing against the event() library function.
 *
 * Note: DW2 renames ENTER & LEAVE to WALKIN & WALKOUT, and has a new LEAVE event
 */
enum TINSEL_EVENT {
	NOEVENT, STARTUP, CLOSEDOWN, POINTED, UNPOINT, WALKIN, WALKOUT,
	PICKUP,	PUTDOWN, WALKTO, LOOK, ACTION, CONVERSE, SHOWEVENT,
	HIDEEVENT, TALKING, ENDTALK, LEAVE_T2, RESTORE, PROV_WALKTO
};

enum TINSEL1_EVENT {
	T1_POINTED, T1_WALKTO, T1_ACTION, T1_LOOK, T1_ENTER, T1_LEAVE, T1_STARTUP, T1_CONVERSE,
	T1_UNPOINT, T1_PUTDOWN, T1_NOEVENT
};

const TINSEL1_EVENT TINSEL1_EVENT_MAP[] = {
	T1_NOEVENT, T1_STARTUP, T1_NOEVENT, T1_POINTED, T1_UNPOINT, T1_ENTER, T1_LEAVE,
	T1_NOEVENT, T1_PUTDOWN, T1_WALKTO, T1_LOOK, T1_ACTION, T1_CONVERSE, T1_NOEVENT,
	T1_NOEVENT, T1_NOEVENT, T1_NOEVENT, T1_NOEVENT, T1_NOEVENT, T1_NOEVENT
};

void AllowDclick(CORO_PARAM, PLR_EVENT be);
bool GetControl(int param);
bool GetControl();
bool ControlIsOn();
void ControlOn();
void ControlOff();
void ControlStartOff();

void RunPolyTinselCode(HPOLYGON hPoly, TINSEL_EVENT event, PLR_EVENT be, bool tc);
void effRunPolyTinselCode(HPOLYGON hPoly, TINSEL_EVENT event, int actor);

void ProcessButEvent(PLR_EVENT be);
void ProcessKeyEvent(PLR_EVENT ke);


int GetEscEvents();
int GetLeftEvents();
bool LeftEventChange(int myleftEvent);

int getUserEvents();

uint32 getUserEventTime();
void resetUserEventTime();

void ResetEcount();

void PolygonEvent(CORO_PARAM, HPOLYGON hPoly, TINSEL_EVENT tEvent, int actor, bool bWait,
				int myEscape, bool *result = NULL);


void PlayerEvent(PLR_EVENT pEvent, const Common::Point &coOrds);

void ProcessedProvisional();
void ProvNotProcessed();
bool GetProvNotProcessed();

} // End of namespace Tinsel

#endif /* TINSEL_EVENTS_H */