aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/goblin.h
blob: 6058595ece44c9139bfb3203889366778c38d6f9 (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2004 Ivan Dubrov
 * Copyright (C) 2004-2006 The ScummVM project
 *
 * 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.
 *
 * $URL$
 * $Id$
 *
 */
#ifndef GOB_GOBLIN_H
#define GOB_GOBLIN_H

#include "gob/gob.h"
#include "gob/util.h"
#include "gob/sound.h"
#include "gob/mult.h"

namespace Gob {

#define TYPE_USUAL		0
#define TYPE_AMORPHOUS	1
#define TYPE_MOBILE		3

class Goblin {

public:
#pragma START_PACK_STRUCTS
	struct Gob_State {
		int16 animation;// +0h
		int16 layer;	// +2h
		int16 unk0;		// +4h
		int16 unk1;		// +6h
		int16 sndItem;	// +8h, high/low byte - sound sample index
		int16 freq;		// +Ah, high/low byte * 100 - frequency
		int16 repCount;	// +Ch high/low byte - repeat count
		int16 sndFrame;		// +Eh
	} GCC_PACK;

	typedef Gob_State *Gob_PState;

	typedef Gob_PState Gob_StateLine[6];

	struct Gob_Object {
		int16 animation;	// +0h
		int16 state;		// +2h
		int16 stateColumn;	// +4h
		int16 curFrame;		// +6h
		int16 xPos;			// +8h
		int16 yPos;			// +Ah
		int16 dirtyLeft;	// +Ch
		int16 dirtyTop;		// +Eh
		int16 dirtyRight;	// +10h
		int16 dirtyBottom;	// +12h
		int16 left;			// +14h
		int16 top;			// +16h
		int16 right;		// +18h
		int16 bottom;		// +1ah
		int16 nextState;	// +1ch
		int16 multState;	// +1eh
		int16 actionStartState;	// +20h
		int16 curLookDir;	// +22h
		int16 pickable;		// +24h
		int16 relaxTime;	// +26h
		Gob_StateLine *stateMach;	// +28h
		Gob_StateLine *realStateMach;	// +2ch
		char doAnim;		// +30h
		char order;			// +31h
		char noTick;		// +32h
		char toRedraw;		// +33h
		char type;			// +34h
		char maxTick;		// +35h
		char tick;			// +36h
		char multObjIndex;	// +37h, from which play mult animations
		char unk14;			// +38h
		char visible;		// +39h
	} GCC_PACK;

	struct Gob_Pos {
		char x;
		char y;
	} GCC_PACK;
#pragma END_PACK_STRUCTS

	Util::List *_objList;
	Gob_Object *_goblins[4];
	int16 _currentGoblin;
	Snd::SoundDesc *_soundData[16];
	int16 _gobStateLayer;
	char _goesAtTarget;
	char _readyToAct;
	int16 _gobAction;	// 0 - move, 3 - do action, 4 - pick
						// goblins  0 - picker, 1 - fighter, 2 - mage
	Gob_Pos _gobPositions[3];
	int16 _gobDestX;
	int16 _gobDestY;
	int16 _pressedMapX;
	int16 _pressedMapY;
	char _pathExistence;

	// Pointers to interpreter variables
	int32 *_some0ValPtr;

	int32 *_gobRetVarPtr;
	int32 *_curGobVarPtr;
	int32 *_curGobXPosVarPtr;
	int32 *_curGobYPosVarPtr;
	int32 *_itemInPocketVarPtr;

	int32 *_curGobStateVarPtr;
	int32 *_curGobFrameVarPtr;
	int32 *_curGobMultStateVarPtr;
	int32 *_curGobNextStateVarPtr;
	int32 *_curGobScrXVarPtr;
	int32 *_curGobScrYVarPtr;
	int32 *_curGobLeftVarPtr;
	int32 *_curGobTopVarPtr;
	int32 *_curGobRightVarPtr;
	int32 *_curGobBottomVarPtr;
	int32 *_curGobDoAnimVarPtr;
	int32 *_curGobOrderVarPtr;
	int32 *_curGobNoTickVarPtr;
	int32 *_curGobTypeVarPtr;
	int32 *_curGobMaxTickVarPtr;
	int32 *_curGobTickVarPtr;
	int32 *_curGobActStartStateVarPtr;
	int32 *_curGobLookDirVarPtr;
	int32 *_curGobPickableVarPtr;
	int32 *_curGobRelaxVarPtr;
	int32 *_curGobMaxFrameVarPtr;

	int32 *_destItemStateVarPtr;
	int32 *_destItemFrameVarPtr;
	int32 *_destItemMultStateVarPtr;
	int32 *_destItemNextStateVarPtr;
	int32 *_destItemScrXVarPtr;
	int32 *_destItemScrYVarPtr;
	int32 *_destItemLeftVarPtr;
	int32 *_destItemTopVarPtr;
	int32 *_destItemRightVarPtr;
	int32 *_destItemBottomVarPtr;
	int32 *_destItemDoAnimVarPtr;
	int32 *_destItemOrderVarPtr;
	int32 *_destItemNoTickVarPtr;
	int32 *_destItemTypeVarPtr;
	int32 *_destItemMaxTickVarPtr;
	int32 *_destItemTickVarPtr;
	int32 *_destItemActStartStVarPtr;
	int32 *_destItemLookDirVarPtr;
	int32 *_destItemPickableVarPtr;
	int32 *_destItemRelaxVarPtr;
	int32 *_destItemMaxFrameVarPtr;

	int16 _destItemType;
	int16 _destItemState;
	int16 _itemToObject[20];
	Gob_Object *_objects[20];
	int16 _objCount;
	int16 _gobsCount;
	int16 _itemIndInPocket;
	int16 _itemIdInPocket;
	char _itemByteFlag;
	int16 _destItemId;
	int16 _destActionItem;
	Gob_Object *_actDestItemDesc;
	int16 _forceNextState[10];
	char _boreCounter;
	int16 _positionedGob;
	char _noPick;

	// GOB2:
	int16 _soundSlotsCount;
	int16 _soundSlots[60];
	int16 _word_2F9C0;
	int16 _word_2F9BE;
	int16 _word_2F9BC;
	int16 _word_2F9BA;
	int16 _dword_2F9B6; // index into the variables array
	int16 _dword_2F9B2; // index into the variables array

	// Functions
	char rotateState(int16 from, int16 to);
	void playSound(Snd::SoundDesc * snd, int16 repCount, int16 freq);
	void drawObjects(void);
	void animateObjects(void);
	int16 getObjMaxFrame(Gob_Object * obj);
	int16 objIntersected(Gob_Object * obj1, Gob_Object * obj2);
	void setMultStates(Gob_Object * gobDesc);
	int16 nextLayer(Gob_Object * gobDesc);
	void showBoredom(int16 gobIndex);
	void switchGoblin(int16 index);
	void zeroObjects(void);
	void freeAllObjects(void);
	void loadObjects(char *source);
	void initVarPointers(void);
	void saveGobDataToVars(int16 xPos, int16 yPos, int16 someVal);
	void loadGobDataFromVars(void);
	void pickItem(int16 indexToPocket, int16 idToPocket);
	void placeItem(int16 indexInPocket, int16 idInPocket);
	void swapItems(int16 indexToPick, int16 idToPick);
	void treatItemPick(int16 itemId);
	int16 treatItem(int16 action);
	int16 doMove(Gob_Object *gobDesc, int16 cont, int16 action);

	void sub_19BD3(void);
	void sub_195C7(int16 index, int16 state);
	void sub_11984(Mult::Mult_Object *obj);

	virtual void placeObject(Gob_Object * objDesc, char animated,
			int16 index, int16 x, int16 y, int16 state) = 0;
	virtual void freeObjects(void) = 0;
	virtual void initiateMove(Mult::Mult_Object *obj) = 0;
	virtual void moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
			int16 nextAct, int16 framesCount) = 0;

	Goblin(GobEngine *vm);
	virtual ~Goblin();

protected:
	int16 _rotStates[4][4];
	GobEngine *_vm;

	int16 peekGoblin(Gob_Object *curGob);
	void initList(void);
	void sortByOrder(Util::List *list);
	void adjustDest(int16 posX, int16 posY);
	void adjustTarget(void);
	void targetDummyItem(Gob_Object *gobDesc);
	void targetItem(void);
	void moveFindItem(int16 posX, int16 posY);
	void moveCheckSelect(int16 framesCount, Gob_Object * gobDesc, int16 *pGobIndex, int16 *nextAct);
	void moveInitStep(int16 framesCount, int16 action, int16 cont,
					  Gob_Object *gobDesc, int16 *pGobIndex, int16 *pNextAct);
	void moveTreatRopeStairs(Gob_Object *gobDesc);
	void playSounds(Mult::Mult_Object *obj);

	virtual void movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct) = 0;
};

class Goblin_v1 : public Goblin {
public:
	virtual void placeObject(Gob_Object * objDesc, char animated,
			int16 index, int16 x, int16 y, int16 state);
	virtual void freeObjects(void);
	virtual void initiateMove(Mult::Mult_Object *obj);
	virtual void moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
			int16 nextAct, int16 framesCount);

	Goblin_v1(GobEngine *vm);
	virtual ~Goblin_v1() {};

protected:
	virtual void movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct);
};

class Goblin_v2 : public Goblin_v1 {
public:
	virtual void placeObject(Gob_Object * objDesc, char animated,
			int16 index, int16 x, int16 y, int16 state);
	virtual void freeObjects(void);
	virtual void initiateMove(Mult::Mult_Object *obj);
	virtual void moveAdvance(Mult::Mult_Object *obj, Gob_Object *gobDesc,
			int16 nextAct, int16 framesCount);

	Goblin_v2(GobEngine *vm);
	virtual ~Goblin_v2() {};

protected:
	virtual void movePathFind(Mult::Mult_Object *obj, Gob_Object *gobDesc, int16 nextAct);
};

}				// End of namespace Gob

#endif	/* __GOBLIN_H */