/* 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 ZVISION_RESULT_ACTION_H
#define ZVISION_RESULT_ACTION_H

#include "common/scummsys.h"

#include "audio/mixer.h"

namespace Common {
class String;
}

namespace ZVision {

// Forward declaration of ZVision. This file is included before ZVision is declared
class ZVision;

class ResultAction {
public:
	virtual ~ResultAction() {}
	virtual bool execute(ZVision *engine) = 0;
};


// The different types of actions
// DEBUG,
// DISABLE_CONTROL,
// DISABLE_VENUS,
// DISPLAY_MESSAGE,
// DISSOLVE,
// DISTORT,
// ENABLE_CONTROL,
// FLUSH_MOUSE_EVENTS,
// INVENTORY,
// KILL,
// MENU_BAR_ENABLE,
// MUSIC,
// PAN_TRACK,
// PLAY_PRELOAD,
// PREFERENCES,
// QUIT,
// RANDOM,
// REGION,
// RESTORE_GAME,
// ROTATE_TO,
// SAVE_GAME,
// SET_PARTIAL_SCREEN,
// SET_SCREEN,
// SET_VENUS,
// STOP,
// STREAM_VIDEO,
// SYNC_SOUND,
// TTY_TEXT,
// UNIVERSE_MUSIC,

class ActionAdd : public ResultAction {
public:
	ActionAdd(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _key;
	uint _value;
};

class ActionAssign : public ResultAction {
public:
	ActionAssign(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _key;
	uint _value;
};

class ActionAttenuate : public ResultAction {
public:
	ActionAttenuate(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _key;
	int _attenuation;
};

class ActionChangeLocation : public ResultAction {
public:
	ActionChangeLocation(const Common::String &line);
	bool execute(ZVision *engine);

private:
	char _world;
	char _room;
	char _node;
	char _view;
	uint32 _x;
};

class ActionCrossfade : public ResultAction {
public:
	ActionCrossfade(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _keyOne;
	uint32 _keyTwo;
	uint _oneStartVolume;
	uint _twoStartVolume;
	uint _oneEndVolume;
	uint _twoEndVolume;
	uint _timeInMillis;
};

class ActionDebug : public ResultAction {
public:
	ActionDebug(const Common::String &line);
	bool execute(ZVision *engine);

private:
};

class ActionDelayRender : public ResultAction {
public:
	ActionDelayRender(const Common::String &line);
	bool execute(ZVision *engine);

private:
	// TODO: Check if this should actually be frames or if it should be milliseconds/seconds
	uint32 framesToDelay;
};

class ActionDisableControl : public ResultAction {
public:
	ActionDisableControl(const Common::String &line);
	bool execute(ZVision *engine);

private:
};

class ActionDisableVenus : public ResultAction {
public:
	ActionDisableVenus(const Common::String &line);
	bool execute(ZVision *engine);

private:
};

class ActionDisplayMessage : public ResultAction {
public:
	ActionDisplayMessage(const Common::String &line);
	bool execute(ZVision *engine);

private:
};

class ActionDissolve : public ResultAction {
public:
	ActionDissolve(const Common::String &line);
	bool execute(ZVision *engine);

private:
};

class ActionDistort : public ResultAction {
public:
	ActionDistort(const Common::String &line);
	bool execute(ZVision *engine);

private:
};

class ActionEnableControl : public ResultAction {
public:
	ActionEnableControl(const Common::String &line);
	bool execute(ZVision *engine);

private:
};

class ActionMusic : public ResultAction {
public:
	ActionMusic(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _key;
	Audio::Mixer::SoundType _soundType;
	Common::String _fileName;
	bool _loop;
	byte _volume;
};

class ActionPlayAnimation : public ResultAction {
public:
	ActionPlayAnimation(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _key;
	Common::String _fileName;
	uint32 _x;
	uint32 _y;
	uint32 _width;
	uint32 _height;
	uint32 _start;
	uint32 _end;
	uint _mask;
	uint _framerate;
	bool _loop;
};

class ActionPreloadAnimation : public ResultAction {
public:
	ActionPreloadAnimation(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _key;
	Common::String _fileName;
	uint _mask;
	uint _framerate;
};

// TODO: See if this exists in ZGI. It doesn't in ZNem
class ActionUnloadAnimation : public ResultAction {
public:
	ActionUnloadAnimation(const Common::String &line);
	bool execute(ZVision *engine);
};

class ActionRandom : public ResultAction {
public:
	ActionRandom(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _key;
	uint _max;
};

class ActionSetScreen : public ResultAction {
public:
	ActionSetScreen(const Common::String &line);
	bool execute(ZVision *engine);

private:
	Common::String _fileName;
};

class ActionTimer : public ResultAction {
public:
	ActionTimer(const Common::String &line);
	bool execute(ZVision *engine);

private:
	uint32 _key;
	uint _time;
};

} // End of namespace ZVision

#endif