aboutsummaryrefslogtreecommitdiff
path: root/gob/goblin.h
blob: 36c76b14f05a80074b1e9feebc957378fcf371e3 (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
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2004 Ivan Dubrov
 * Copyright (C) 2004-2005 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.
 *
 * $Header$
 *
 */
#ifndef GOB_GOBLIN_H
#define GOB_GOBLIN_H

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

namespace Gob {

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

class Goblin {
public:
#pragma START_PACK_STRUCTS
	typedef 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 Gob_State;

	typedef Gob_State *Gob_PState;

#define szGob_StateLine 24
	typedef Gob_PState Gob_StateLine[6];

	typedef 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 Gob_Object;

	typedef struct Gob_Pos {
		char x;
		char y;
	} GCC_PACK Gob_Pos;
#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;

	// Functions
	char rotateState(int16 from, int16 to);
	void playSound(Snd::SoundDesc * snd, int16 repCount, int16 freq);
	void drawObjects(void);
	void animateObjects(void);
	void placeObject(Gob_Object * objDesc, char animated);
	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 freeObjects(void);
	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);
	void interFunc(void);

	Goblin(GobEngine *vm);

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 initiateMove(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 movePathFind(Gob_Object *gobDesc, int16 nextAct);
	void moveAdvance(Gob_Object *gobDesc, int16 nextAct, int16 framesCount);
	int16 doMove(Gob_Object *gobDesc, int16 cont, int16 action);
};

}				// End of namespace Gob

#endif	/* __GOBLIN_H */