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

#ifndef TSAGE_RINGWORLD_SCENES3_H
#define TSAGE_RINGWORLD_SCENES3_H

#include "common/scummsys.h"
#include "tsage/core.h"
#include "tsage/converse.h"
#include "tsage/ringworld/ringworld_logic.h"
#include "tsage/ringworld/ringworld_speakers.h"

namespace TsAGE {

namespace Ringworld {

using namespace TsAGE;

class Scene2000 : public Scene {
	/* Actions */
	class Action1 : public Action {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};
	class Action3 : public Action {
	public:
		void signal() override;
	};
	class Action4 : public Action {
	public:
		void signal() override;
	};
	class Action5 : public Action {
	public:
		void signal() override;
	};
	class Action6 : public Action {
	public:
		void signal() override;
	};
	class Action7 : public Action {
	public:
		void signal() override;
	};
	class Action8 : public Action {
	public:
		void signal() override;
	};
	class Action9 : public Action {
	public:
		void signal() override;
	};
	class Action10 : public Action {
	public:
		void signal() override;
	};
	class Action11 : public Action {
	public:
		void signal() override;
	};
	class Action12 : public Action {
	public:
		void signal() override;
	};
	class Action13 : public Action {
	public:
		void signal() override;
	};
	class Action14 : public Action {
	public:
		void signal() override;
	};

public:
	SpeakerSL _speakerSL;
	SpeakerQR _speakerQR;
	SpeakerMR _speakerMR;
	SpeakerQText _speakerQText;
	SpeakerMText _speakerMText;
	SpeakerSText _speakerSText;
	SpeakerHText _speakerHText;
	SpeakerGameText _speakerGameText;
	Action1 _action1;
	Action2 _action2;
	Action3 _action3;
	Action4 _action4;
	Action5 _action5;
	Action6 _action6;
	Action7 _action7;
	Action8 _action8;
	Action9 _action9;
	Action10 _action10;
	Action11 _action11;
	Action12 _action12;
	Action13 _action13;
	Action14 _action14;
	SceneObject _object1, _object2, _object3, _object4, _object5;
	SceneObject _object6, _object7, _object8, _object9, _object10;
	ASound _soundHandler1, _soundHandler2;

	void postInit(SceneObjectList *OwnerList = NULL) override;
	void stripCallback(int v) override;
};

class Scene2100 : public Scene {
	/* Actions */
	class Action1 : public ActionExt {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};
	class Action3 : public Action {
	public:
		void signal() override;
	};
	class Action4 : public Action {
	public:
		void signal() override;
	};
	class Action5 : public Action {
	public:
		void signal() override;
	};
	class Action6 : public Action {
	public:
		void signal() override;
	};
	class Action7 : public Action {
	public:
		void signal() override;
	};
	class Action8 : public Action {
	public:
		void signal() override;
	};
	class Action9 : public Action {
	public:
		void signal() override;
	};
	class Action10 : public Action {
	public:
		void signal() override;
	};
	class Action11 : public Action {
	public:
		void signal() override;
	};
	class Action12 : public Action {
	public:
		void signal() override;
	};
	class Action13 : public Action {
	public:
		void signal() override;
	};
	class Action14 : public Action {
	public:
		void signal() override;
	};
	class Action15 : public Action {
	public:
		void signal() override;
	};
	class Action16 : public Action {
	public:
		void signal() override;
	};
	class Action17 : public Action {
	public:
		void signal() override;
	};

	/* Hotspots */
	class Hotspot2 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot3 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot4 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot8 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot10 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot14 : public SceneObject {
	public:
		void doAction(int action) override;
	};

	/* Objects */
	class Object1 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Object2 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Object3 : public SceneObject {
	public:
		void doAction(int action) override;
	};
public:
	SequenceManager _sequenceManager;
	ASound _soundHandler;
	SpeakerMText _speakerMText;
	SpeakerMR _speakerMR;
	SpeakerQL _speakerQL;
	SpeakerQR _speakerQR;
	SpeakerQText _speakerQText;
	SpeakerGameText _speakerGameText;
	SpeakerSText _speakerSText;
	SpeakerSL _speakerSL;
	SpeakerSAL _speakerSAL;
	SpeakerHText _speakerHText;

	DisplayHotspot _hotspot1;
	Hotspot2 _hotspot2;
	Hotspot3 _hotspot3;
	Hotspot4 _hotspot4;
	DisplayHotspot _hotspot5, _hotspot6, _hotspot7;
	Hotspot8 _hotspot8;
	DisplayHotspot _hotspot9;
	Hotspot10 _hotspot10;
	DisplayHotspot _hotspot11, _hotspot12, _hotspot13;
	Hotspot14 _hotspot14;
	DisplayHotspot _hotspot15;

	Object1 _object1;
	Object2 _object2;
	Object3 _object3;
	SceneObject _object4;

	Action1 _action1;
	Action2 _action2;
	Action3 _action3;
	Action4 _action4;
	Action5 _action5;
	Action6 _action6;
	Action7 _action7;
	Action8 _action8;
	Action9 _action9;
	Action10 _action10;
	Action11 _action11;
	Action12 _action12;
	Action13 _action13;
	Action14 _action14;
	Action15 _action15;
	Action16 _action16;
	Action17 _action17;
	bool _sitFl;
	SceneArea _area1, _area2, _area3, _area4;

	Scene2100();
	void postInit(SceneObjectList *OwnerList = NULL) override;
	void stripCallback(int v) override;
	void signal() override;
	void synchronize(Serializer &s) override;
};

class Scene2120 : public Scene {
	/* Actions */
	class Entry {
	public:
		int _size;
		int _lineNum;
		int _visage;

		Entry() { _size = 0; _lineNum = 0; _visage = 0; }
		Entry(int size, int lineNum, int visage) { _size = size; _lineNum = lineNum; _visage = visage; }
	};

	class Action1 : public Action {
	private:
		Common::Array<Entry> _entries;
	public:
		Action1();

		void signal() override;
		void dispatch() override;
	};

public:
	ASound _soundHandler;
	SceneObject _topicArrowHotspot, _arrowHotspot, _visageHotspot;
	SceneObject _subjectButton, _nextPageButton, _previousPageButton, _exitButton;
	Action1 _action1;
	Rect _listRect;
	int _dbMode, _prevDbMode;
	bool _visageVisable;
	int _subjectIndex;
	int _lineOffset;

	Scene2120();
	void postInit(SceneObjectList *OwnerList = NULL) override;
	void synchronize(Serializer &s) override;
};

class Scene2150 : public Scene {
	/* Actions */
	class Action1 : public ActionExt {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};

	/* Hotspots */
	class Hotspot1 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot2 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot4 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot7 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot10 : public SceneObject {
	public:
		void doAction(int action) override;
	};
public:
	ASound _soundHandler;
	SequenceManager _sequenceManager;
	SpeakerGameText _speakerGameText;

	Rect _rect1, _rect2;
	Hotspot1 _hotspot1;
	Hotspot2 _hotspot2;
	DisplayHotspot _hotspot3;
	Hotspot4 _hotspot4;
	DisplayHotspot _hotspot5, _hotspot6;
	Hotspot7 _hotspot7;
	DisplayHotspot _hotspot8, _hotspot9;
	Hotspot10 _hotspot10;
	DisplayHotspot _hotspot11;
	SceneObject _hotspot12, _hotspot13, _hotspot14;
	SceneArea _area1, _area2, _area3, _area4;
	Action1 _action1;
	Action2 _action2;

	Scene2150();
	void postInit(SceneObjectList *OwnerList = NULL) override;
	void synchronize(Serializer &s) override;
	void signal() override;
	void dispatch() override;
};

class Scene2200 : public Scene {
	/* Actions */
	class Action1 : public Action {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};
	class Action3 : public ActionExt {
	public:
		void signal() override;
		void process(Event &event) override;
	};
	class Action4 : public Action {
	public:
		void signal() override;
	};

	/* Hotspots */
	class Hotspot3 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot5 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot9 : public SceneObject {
	public:
		void doAction(int action) override;
	};
public:
	SequenceManager _sequenceManager;
	SpeakerMText _speakerMText;
	SpeakerSText _speakerSText;
	SpeakerQText _speakerQText;
	SpeakerSL _speakerSL;
	SpeakerQR _speakerQR;
	SpeakerQL _speakerQL;
	SpeakerMR _speakerMR;
	SpeakerGameText _speakerGameText;
	Rect _exitRect;
	Action1 _action1;
	Action2 _action2;
	Action3 _action3;
	Action4 _action4;
	DisplayHotspot _hotspot1;
	Hotspot3 _hotspot3;
	Hotspot5 _hotspot5;
	Hotspot9 _hotspot9;
	DisplayHotspot _hotspot10;
	SceneObject _hotspot2, _hotspot4;
	SceneObject _hotspot6, _hotspot7, _hotspot8;
	ASound _soundHandler1, _soundHandler2;

	Scene2200();
	void postInit(SceneObjectList *OwnerList = NULL) override;
	void stripCallback(int v) override;
	void synchronize(Serializer &s) override;
	void signal() override;
	void dispatch() override;
};

class Scene2222 : public Scene {
	/* Actions */
	class Action1 : public Action {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};

public:
	ASound _soundHandler;
	SpeakerSText _speakerSText;
	SpeakerMText _speakerMText;
	SpeakerQText _speakerQText;
	SpeakerML _speakerML;
	SpeakerSR _speakerSR;
	Action1 _action1;
	Action2 _action2;
	SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4, _hotspot5;

	void postInit(SceneObjectList *OwnerList = NULL) override;
};

class Scene2230 : public Scene {
	/* Actions */
	class Action1 : public Action {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};
	class Action3 : public Action {
	public:
		void signal() override;
	};
	class Action4 : public Action {
	public:
		void signal() override;
	};
	class Action5 : public Action {
	public:
		void signal() override;
	};
	class Action6 : public Action {
	public:
		void signal() override;
	};
	class Action7 : public Action {
	public:
		void signal() override;
	};
	class Action8 : public Action {
	public:
		void signal() override;
	};

	/* Hotspots */
	class Hotspot1 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot3 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot4 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot5 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot6 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot7 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot8 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot10 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot11 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot12 : public SceneObject {
	public:
		void doAction(int action) override;
	};
public:
	ASound _soundHandler;
	Action1 _action1;
	Action2 _action2;
	Action3 _action3;
	Action4 _action4;
	Action5 _action5;
	Action6 _action6;
	Action7 _action7;
	Action8 _action8;
	Hotspot1 _hotspot1;
	Hotspot3 _hotspot3;
	Hotspot4 _hotspot4;
	SceneObject _hotspot2;
	Hotspot5 _hotspot5;
	Hotspot6 _hotspot6;
	Hotspot7 _hotspot7;
	Hotspot8 _hotspot8;
	DisplayHotspot _hotspot9;
	Hotspot10 _hotspot10;
	Hotspot11 _hotspot11;
	Hotspot12 _hotspot12;
	Rect _rect1;
	int _sceneMode;

	Scene2230();
	void postInit(SceneObjectList *OwnerList = NULL) override;
	void synchronize(Serializer &s) override;
	void dispatch() override;
};

class Scene2280 : public Scene {
	/* Actions */
	class Action1 : public Action {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};
	class Action3 : public Action {
	public:
		void signal() override;
	};
	class Action4 : public ActionExt {
	public:
		void signal() override;
	};

	/* Hotspots */
	class Hotspot1 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot2 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot4 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot7 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot8 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot10 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot12 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot14 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot15 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot16 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot17 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot18 : public SceneObject {
	public:
		void doAction(int action) override;
	};

public:
	ASound _soundHandler;
	SequenceManager _sequenceManager;
	Rect _exitRect;
	Action1 _action1;
	Action2 _action2;
	Action3 _action3;
	Action4 _action4;
	Hotspot1 _hotspot1;
	Hotspot2 _hotspot2;
	DisplayHotspot _hotspot3;
	Hotspot4 _hotspot4;
	DisplayHotspot _hotspot5, _hotspot6;
	Hotspot7 _hotspot7;
	Hotspot8 _hotspot8;
	DisplayHotspot _hotspot9;
	Hotspot10 _hotspot10;
	DisplayHotspot _hotspot11;
	Hotspot12 _hotspot12;
	DisplayHotspot _hotspot13;
	Hotspot14 _hotspot14;
	DisplayHotspot _hotspot15, _hotspot16;
	Hotspot17 _hotspot17;
	Hotspot18 _hotspot18;

	Scene2280();
	void postInit(SceneObjectList *OwnerList = NULL) override;
	void synchronize(Serializer &s) override;
	void signal() override;
	void dispatch() override;
};

class Scene2300 : public Scene {
	/* Actions */
	class Action1 : public Action {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};
	class Action3 : public Action {
	public:
		void signal() override;
	};
	class Action4 : public ActionExt {
	public:
		void signal() override;
	};

	/* Hotspots */
	class Hotspot5 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot7 : public SceneObject {
	public:
		void doAction(int action) override;
	};
public:
	ASound _soundHandler1, _soundHandler2;
	SpeakerSL _speakerSL;
	SpeakerMText _speakerMText;
	SpeakerQText _speakerQText;
	SpeakerSText _speakerSText;
	Action1 _action1;
	Action2 _action2;
	Action3 _action3;
	Action4 _action4;
	SceneObject _hotspot1, _hotspot2, _hotspot3, _hotspot4;
	Hotspot5 _hotspot5;
	SceneObject _hotspot6;
	Hotspot7 _hotspot7;
	SceneObject _hotspot8, _hotspot9, _hotspot10;
	DisplayHotspot _hotspot11, _hotspot12, _hotspot13, _hotspot14, _hotspot15;

	Scene2300();
	void postInit(SceneObjectList *OwnerList = NULL) override;
};

class Scene2310 : public Scene {
private:
	int findObject(int objIndex);

	/* Custom classes */
	class ProtectionEntry {
	public:
		int _pageNumber;
		int _connectionList[5];

		void set(int pageNumber, int v1, int v2, int v3, int v4, int v5) {
			_pageNumber = pageNumber;
			_connectionList[0] = v1; _connectionList[1] = v2; _connectionList[2] = v3;
			_connectionList[3] = v4; _connectionList[4] = v5;
		}
	};

public:
	SequenceManager _sequenceManager;
	int _wireIndex, _pageIndex;
	SceneObject _wireList[5];
	Rect _rectList[5];
	SceneText _sceneText;
	ProtectionEntry _pageList[21];

	Scene2310();
	void postInit(SceneObjectList *OwnerList = NULL) override;
	void synchronize(Serializer &s) override;
	void signal() override;
	void process(Event &event) override;
	void dispatch() override;
};

class Scene2320 : public Scene {
	/* Actions */
	class Action1 : public Action {
	public:
		void signal() override;
	};
	class Action2 : public Action {
	public:
		void signal() override;
	};
	class Action3 : public ActionExt {
	public:
		void signal() override;
	};
	class Action4 : public Action {
	public:
		void signal() override;
	};
	class Action5 : public Action {
	public:
		void signal() override;
	};
	class Action6 : public Action {
	public:
		void signal() override;
	};
	class Action7 : public Action {
	public:
		void signal() override;
	};
	class Action8 : public Action {
	public:
		void signal() override;
	};

	/* Hotspots */
	class Hotspot5 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot6 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot8 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot10 : public SceneObjectExt {
	public:
		void doAction(int action) override;
	};
	class Hotspot11 : public SceneObjectExt {
	public:
		void doAction(int action) override;
	};
	class Hotspot12 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot14 : public SceneObject {
	public:
		void doAction(int action) override;
	};
	class Hotspot15 : public SceneObject {
	public:
		void doAction(int action) override;
	};
public:
	ASound _soundHandler;
	SequenceManager _sequenceManager1, _sequenceManager2;
	SpeakerMText _speakerMText;
	SpeakerMR _speakerMR;
	SpeakerML _speakerML;
	SpeakerQText _speakerQText;
	SpeakerQL _speakerQL;
	SpeakerQR _speakerQR;
	SpeakerSAL _speakerSAL;
	SpeakerSL _speakerSL;
	SpeakerSR _speakerSR;
	SpeakerSText _speakerSText;
	SpeakerGameText _speakerGameText;
	SceneArea _area1, _area2, _area3, _area4;
	DisplayHotspot _hotspot1, _hotspot2, _hotspot3, _hotspot4;
	Hotspot5 _hotspot5;
	Hotspot6 _hotspot6;
	SceneObject _hotspot7, _hotspot9;
	Hotspot8 _hotspot8;
	Hotspot10 _hotspot10;
	Hotspot11 _hotspot11;
	Hotspot12 _hotspot12;
	DisplayHotspot _hotspot13;
	Hotspot14 _hotspot14;
	Hotspot15 _hotspot15;
	SceneObject _hotspot16;
	SceneItem *_hotspotPtr;
	Action1 _action1;
	Action2 _action2;
	Action3 _action3;
	Action4 _action4;
	Action5 _action5;
	Action6 _action6;
	Action7 _action7;
	Action8 _action8;

	Scene2320();
	void postInit(SceneObjectList *OwnerList = NULL) override;
	void synchronize(Serializer &s) override;
	void signal() override;
};

class Scene2400 : public Scene {
	/* Actions */
	class Action1 : public Action {
	public:
		void signal() override;
		void dispatch() override;
	};
public:
	Action1 _action1;
	SceneObject _object;

	void postInit(SceneObjectList *OwnerList = NULL) override;
};

} // End of namespace Ringworld

} // End of namespace TsAGE

#endif
