aboutsummaryrefslogtreecommitdiff
path: root/engines/illusions/bbdou/bbdou_specialcode.h
blob: b9080c9810ca67314491d2957d7a152071b37808 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* 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 ILLUSIONS_BBDOU_BBDOU_SPECIALCODE_H
#define ILLUSIONS_BBDOU_BBDOU_SPECIALCODE_H

#include "illusions/specialcode.h"
#include "illusions/thread.h"
#include "common/hashmap.h"

namespace Illusions {

class IllusionsEngine_BBDOU;
class BbdouBubble;
class BbdouCursor;
class BbdouInventory;
struct CursorData;
struct Item10;

typedef Common::Functor1<OpCall&, void> SpecialCodeFunction;

class BbdouSpecialCode;

struct Struct10 {
	uint32 _verbId;
	uint32 _sequenceId1;
	uint32 _sequenceId2;
	uint32 _sequenceId3;
};

class CauseThread : public Thread {
public:
	CauseThread(IllusionsEngine_BBDOU *vm, uint32 threadId, uint32 callingThreadId,
		BbdouSpecialCode *bbdou, uint32 cursorObjectId, uint32 sceneId,
		uint32 verbId, uint32 objectId2, uint32 objectId);
	virtual void onNotify();
	virtual void onTerminated();
public:
	BbdouSpecialCode *_bbdou;
	uint32 _cursorObjectId;
	uint32 _sceneId;
	uint32 _verbId;
	uint32 _objectId2;
	uint32 _objectId;
};

class BbdouSpecialCode : public SpecialCode {
public:
	BbdouSpecialCode(IllusionsEngine_BBDOU *vm);
	virtual ~BbdouSpecialCode();
	virtual void init();
	virtual void run(uint32 specialCodeId, OpCall &opCall);
public:
	typedef Common::HashMap<uint32, SpecialCodeFunction*> Map;
	typedef Map::iterator MapIterator;
	IllusionsEngine_BBDOU *_vm;
	Map _map;
	BbdouCursor *_cursor;
	BbdouBubble *_bubble;
	BbdouInventory *_inventory;

	// Salad
	uint _saladCount;
	uint32 _saladObjectIds[12];

	// Special code interface functions
	void spcInitCursor(OpCall &opCall);
	void spcEnableCursor(OpCall &opCall);
	void spcDisableCursor(OpCall &opCall);
	void spcAddCursorSequence(OpCall &opCall);
	void spcCursorStartHoldingObjectId(OpCall &opCall);
	void spcCursorStopHoldingObjectId(OpCall &opCall);
	void spcInitBubble(OpCall &opCall);
	void spcSetupBubble(OpCall &opCall);
	void spcSetObjectInteractMode(OpCall &opCall);
	void spcRegisterInventoryBag(OpCall &opCall);
	void spcRegisterInventorySlot(OpCall &opCall);
	void spcRegisterInventoryItem(OpCall &opCall);
	void spcOpenInventory(OpCall &opCall);
	void spcAddInventoryItem(OpCall &opCall);
	void spcRemoveInventoryItem(OpCall &opCall);
	void spcHasInventoryItem(OpCall &opCall);
	void spcCloseInventory(OpCall &opCall);
	void spcIsCursorHoldingObjectId(OpCall &opCall);
	void spcSaladCtl(OpCall &opCall);

	void playSoundEffect(int soundIndex);
	void resetItem10(uint32 objectId, Item10 *item10);
	void startHoldingObjectId(uint32 objectId1, uint32 holdingObjectId, bool doPlaySound);
	void stopHoldingObjectId(uint32 objectId1, bool doPlaySound);
	bool isHoldingObjectId(uint32 objectId);

protected:
	// Internal functions
	bool testValueRange(int value);
	void setCursorControlRoutine(uint32 objectId, int num);
	Common::Point getBackgroundCursorPos(Common::Point cursorPos);
	void showBubble(uint32 objectId, uint32 overlappedObjectId, uint32 holdingObjectId,
		Item10 *item10, uint32 progResKeywordId);
	bool findVerbId(Item10 *item10, uint32 currOverlappedObjectId, int always0, uint32 &outVerbId);
	void cursorInteractControlRoutine(Control *cursorControl, uint32 deltaTime);
	void cursorControlRoutine2(Control *cursorControl, uint32 deltaTime);
	bool testVerbId(uint32 verbId, uint32 holdingObjectId, uint32 overlappedObjectId);
	bool getCause(uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId,
		uint32 &outVerbId, uint32 &outObjectId2, uint32 &outObjectId);
	bool runCause(Control *cursorControl, CursorData &cursorData,
		uint32 verbId, uint32 objectId2, uint32 objectId, int soundIndex);
	uint32 startCauseThread(uint32 cursorObjectId, uint32 sceneId, uint32 verbId, uint32 objectId2, uint32 objectId);
	// Salad
	void initSalad();
	void addSalad(uint32 sequenceId);
};

} // End of namespace Illusions

#endif // ILLUSIONS_BBDOU_BBDOU_SPECIALCODE_H