/* 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.
 *
 */

#ifndef SCUMM_SCRIPT_V0_H
#define SCUMM_SCRIPT_V0_H

#include "scumm/scumm_v2.h"

namespace Scumm {

/**
 * Engine for Apple II and Commodore 64 versions of Maniac Mansion
 */
class ScummEngine_v0 : public ScummEngine_v2 {
protected:
	enum CurrentMode {
		kModeCutscene = 0,   // cutscene active
		kModeKeypad = 1,     // kid selection / dial pad / save-load dialog
		kModeNoNewKid = 2,   // verb "new kid" disabled (e.g. when entering lab)
		kModeNormal = 3      // normal playing mode
	};

	enum WalkToObjectState {
		kWalkToObjectStateDone = 0,
		kWalkToObjectStateWalk = 1,
		kWalkToObjectStateTurn = 2
	};

protected:
	bool _drawDemo;
	byte _currentMode;
	byte _currentLights;

	int _activeVerb;		// selected verb
	int _activeObject;		// 1st selected object (see OBJECT_V0())
	int _activeObject2;		// 2nd selected object or actor (see OBJECT_V0())

	int _cmdVerb;			// script verb
	int _cmdObject;			// 1st script object (see OBJECT_V0())
	int _cmdObject2;		// 2nd script object or actor (see OBJECT_V0())
	int _sentenceNestedCount;

	int _walkToObject;
	int _walkToObjectState;
	bool _redrawSentenceLine;

public:
	ScummEngine_v0(OSystem *syst, const DetectorResult &dr);

	virtual void resetScumm();

	byte walkboxFindTarget(Actor *a, int destbox, Common::Point walkdest);

	/* Delay calculation */
	void DelayReset();
	int DelayCalculateDelta();

protected:
	virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL);

	virtual void setupOpcodes();

	virtual void setupScummVars();
	virtual void resetScummVars();
	virtual void scummLoop(int delta);
	virtual void decodeParseString();

	virtual void processInput();

	virtual void saveLoadWithSerializer(Common::Serializer &s);

	virtual bool objIsActor(int obj);
	virtual int objToActor(int obj);
	virtual int actorToObj(int actor);

	// V0 MM Verb commands
	int getVerbPrepId();
	int activeVerbPrep();
	void walkToActorOrObject(int object);
	void verbExec();

	virtual void runSentenceScript();
	virtual void checkAndRunSentenceScript();
	bool checkPendingWalkAction();
	bool checkSentenceComplete();
	virtual void checkExecVerbs();
	virtual void handleMouseOver(bool updateInventory);
	int verbPrepIdType(int verbid);
	void resetVerbs();
	void verbDemoMode();
	void verbDrawDemoString(int VerbDemoNumber);

	void clearSentenceLine();
	void flushSentenceLine();
	void drawSentenceObject(int object);
	void drawSentenceLine();

	void setMode(byte mode);

	void switchActor(int slot);

	virtual int getVarOrDirectWord(byte mask);
	virtual uint fetchScriptWord();

	virtual int getActiveObject();

	void resetSentence();

	bool areBoxesNeighbors(int box1nr, int box2nr);

	bool ifEqualActiveObject2Common(bool checkType);

	virtual int getCurrentLights() const;

	/* Version 0 script opcodes */
	void o_stopCurrentScript();
	void o_walkActorToObject();
	void o_loadSound();
	void o_getActorMoving();
	void o_animateActor();
	void o_putActorAtObject();
	void o_pickupObject();
	void o_setObjectName();
	void o_lockSound();
	void o_lockCostume();
	void o_loadCostume();
	void o_loadRoom();
	void o_loadRoomWithEgo();
	void o_lockScript();
	void o_loadScript();
	void o_lockRoom();
	void o_setMode();
	void o_lights();
	void o_unlockCostume();
	void o_unlockScript();
	void o_decrement();
	void o_nop();
	void o_getObjectOwner();
	void o_getActorBitVar();
	void o_setActorBitVar();
	void o_getBitVar();
	void o_setBitVar();
	void o_doSentence();
	void o_ifEqualActiveObject2();
	void o_ifNotEqualActiveObject2();
	void o_getClosestActor();
	void o_printEgo();
	void o_print();
	void o_unlockRoom();
	void o_unlockSound();
	void o_cutscene();
	void o_endCutscene();
	void o_setOwnerOf();
	void o_screenPrepare();

	byte VAR_ACTIVE_OBJECT2;
	byte VAR_IS_SOUND_RUNNING;
	byte VAR_ACTIVE_VERB;
};


} // End of namespace Scumm

#endif
