aboutsummaryrefslogtreecommitdiff
path: root/engines/lilliput/script.h
blob: 5969ec130d9d897449d9a354e6a19e5d82b94e91 (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
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
/* 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 LILLIPUT_SCRIPT_H
#define LILLIPUT_SCRIPT_H

#include "common/memstream.h"
#include "common/stack.h"
#include "common/random.h"
#include "common/rect.h"

#include "lilliput/stream.h"

namespace Lilliput {

class LilliputEngine;

enum KValueType {
	kNone,
	kImmediateValue,
	kCompareOperation,
	kComputeOperation,
	kGetValue1,
	kgetPosFromScript
};


struct OpCode {
	const char* _opName;
	int _numArgs;
	KValueType _arg1;
	KValueType _arg2;
	KValueType _arg3;
	KValueType _arg4;
	KValueType _arg5;
};

class LilliputScript {
public:
	byte _heroismLevel;
	byte _speechTimer;

	byte _characterScriptEnabled[40];
	int8 _interfaceHotspotStatus[20];
	int8 _array16123PosX[40];
	int8 _array1614BPosY[40];
	int8 _array12811[40];
	int8 _array10AB1[40];
	byte _array122FD[20];
	byte _array122C1[40];
	byte _array10A39[40];
	int16 _array10B51[40 * 40];

	byte *_savedBuffer215Ptr;

	Common::Point _viewportPos;
	int16 _viewportCharacterTarget;
	int16 _talkingCharacter;
	int _heroismBarX;
	int _heroismBarBottomY;

	Common::Point _array12311[640];
	byte _array128EF[40];
	int8 _array12839[40];
	Common::Point _array1813BPos[32];

	LilliputScript(LilliputEngine *vm);
	~LilliputScript();

	void disasmScript(ScriptStream script);
	void listAllTexts();
	static Common::String getArgumentString(KValueType type, ScriptStream& script);
	void runScript(ScriptStream script);
	void runMenuScript(ScriptStream script);
private:
	LilliputEngine *_vm;

	ScriptStream *_currScript;
	Common::Stack<ScriptStream *> _scriptStack;

	byte _byte16F05_ScriptHandler;
	byte _byte10806;
	byte _lastRandomValue;
	byte _byte16F04;
	byte _byte1881A;
	byte _byte18823;
	byte _speechDisplaySpeed;

	int16 _word16F00;
	int _currentSpeechId;
	int _word18821;
	int _word129A3;
	Common::Point _word1825E;

	char _array129A5[4];

	int handleOpcode(ScriptStream *script);
	byte handleOpcodeType1(int curWord);
	void handleOpcodeType2(int curWord);
	
	void enableCharacterScript(byte index, byte var1, byte *curBufPtr);
	void sub17B6C(int var1);
	void sub16C86(int index, byte *buf);
	void sub16C5C(int index, int8 var3);
	void checkSpeechAllowed(bool &forceReturnFl);
	void decodePackedText(char *buf);
	void startSpeech(int var);
	void displayNumber(byte var1, Common::Point pos);
	byte *getMapPtr(Common::Point val);
	byte *getCurrentCharacterVarFromScript();
	void sub171AF(int16 var1, uint16 var2, int16 var4);
	void sub18B7C(int var1, int var3);
	void sub189B8();
	void formatSpeechString();
	Common::Point getCharacterTilePos(int index);
	int sub18BB7(int index);

	int16 getValue1();
	Common::Point getPosFromScript();

	byte *getCharacterVariablePtr();
	byte compareValues(int16 var1, uint16 oper, int16 var2);
	void computeOperation(byte *bufPtr, uint16 oper, int16 var2);

	//Opcodes Type 1
	byte OC_checkCharacterGoalPos();
	byte OC_comparePos();
	byte OC_checkIsoMap3();
	byte OC_compareCharacterVariable();
	byte OC_CompareLastRandomValue();
	byte OC_getRandom();
	byte OC_for();
	byte OC_compCurrentSpeechId();
	byte OC_checkSaveFlag();
	byte OC_compByte16F04();
	byte OC_sub174D8();
	byte OC_CompareCharacterVariables();
	byte OC_compareCoords_1();
	byte OC_compareCoords_2();
	byte OC_CompareDistanceFromCharacterToPositionWith();
	byte OC_compareRandomCharacterId();
	byte OC_IsCurrentCharacterIndex();
	byte OC_sub175C8();
	byte OC_sub17640();
	byte OC_sub176C4();
	byte OC_compWord10804();
	byte OC_sub17766();
	byte OC_sub17782();
	byte OC_CompareMapValueWith();
	byte OC_IsCharacterValid();
	byte OC_compWord16EFE();
	byte OC_AreCurrentCharacterVar0AndVar1EqualsTo();
	byte OC_CurrentCharacterVar0Equals();
	byte OC_checkLastInterfaceHotspotIndexMenu13();
	byte OC_checkLastInterfaceHotspotIndexMenu2();
	byte OC_CompareNumberOfCharacterWithVar0Equals();
	byte OC_IsPositionInViewport();
	byte OC_CompareGameVariables();
	byte OC_skipNextOpcode();
	byte OC_CurrentCharacterVar2Equals1();
	byte OC_sub178D2();
	byte OC_CharacterVariableAnd();
	byte OC_IsCurrentCharacterVar0LessEqualThan();
	byte OC_sub1790F();
	byte OC_CurrentCharacterVar1Equals();
	byte OC_isCurrentCharacterActive();
	byte OC_CurrentCharacterVar3Equals1();
	byte OC_checkCharacterDirection();
	byte OC_checkLastInterfaceHotspotIndex();
	byte OC_checkSelectedCharacter();
	byte OC_sub179AE();
	byte OC_sub179C2();
	byte OC_checkFunctionKeyPressed();
	byte OC_sub17A07();
	byte OC_checkViewPortCharacterTarget();

	// Opcodes Type 2
	void OC_setWord18821();
	void OC_ChangeIsoMap();
	void OC_startSpeech();
	void OC_sub17D7F_speech2();
	void OC_sub17DB9_speech3();
	void OC_startSpeechIfMute();
	void OC_sub17E07_speech4param();
	void OC_startSpeechIfSilent();
	void OC_ComputeCharacterVariable();
	void OC_getRandom_type2();
	void OC_setCharacterPosition();
	void OC_DisableCharacter();
	void OC_saveAndQuit();
	void OC_sub17B93();
	void OC_sub17E37_speech4();
	void OC_resetByte1714E();
	void OC_deleteSavegameAndQuit();
	void OC_incByte16F04();
	void OC_sub17BA5();
	void OC_setByte18823();
	void OC_callScript();
	void OC_callScriptAndReturn();
	void OC_setCurrentScriptCharacterPos();
	void OC_resetByte16F04();
	void OC_sub17AE1();
	void OC_sub17AEE();
	void OC_setWord10804();
	void OC_sub17C0E();
	void OC_sub17C55();
	void OC_sub17C76();
	void OC_setCurrentCharacter();
	void OC_sub17C8B();
	void OC_sub17CA2();
	void OC_sub17CB9();
	void OC_sub17CD1();
	void OC_resetWord16EFE();
	void OC_enableCurrentCharacterScript();
	void OC_IncCurrentCharacterVar1();
	void OC_sub17D23();
	void OC_sub17E6D();
	void OC_changeCurrentCharacterSprite();
	void OC_sub17E99();
	void OC_sub17EC5();
	void OC_setCharacterDirectionTowardsPos();
	void OC_turnCharacterTowardsAnother();
	void OC_sub17F4F();
	void OC_scrollAwayFromCharacter();
	void OC_skipNextVal();
	void OC_setCurrentCharacterVar6();
	void OC_sub17FDD();
	void OC_setCharacterScriptEnabled();
	void OC_setCurrentCharacterVar2();
	void OC_SetCurrentCharacterVar2ToZero();
	void OC_setCharacterProperties();
	void OC_sub1805D();
	void OC_sub18074();
	void OC_setCurrentCharacterDirection();
	void OC_setInterfaceHotspot();
	void OC_scrollViewPort();
	void OC_setViewPortPos();
	void OC_setCurrentCharacterAltitude();
	void OC_sub1817F();
	void sub1818B(Common::Point point);
	void OC_sub181BB();
	void OC_sub18213();
	void OC_sub18252();
	void OC_sub18260();
	void OC_CharacterVariableAddOrRemoveFlag();
	void OC_PaletteFadeOut();
	void OC_PaletteFadeIn();
	void OC_loadAndDisplayCUBESx_GFX();
	void OC_setCurrentCharacterVar3();
	void OC_setArray122C1();
	void OC_sub18367();
	void OC_enableCharacterScript();
	void OC_sub18387();
	void OC_setDebugFlag();
	void OC_setByte14837();
	void OC_waitForEvent();
	void OC_disableInterfaceHotspot();
	void OC_loadFile_AERIAL_GFX();
	void OC_sub17E22_speech1IfSoundOff();
	void OC_sub1844A();
	void OC_displayNumericCharacterVariable();
	void OC_displayVGAFile();
	void OC_startSpeechWithoutSpeeker();
	void OC_displayTitleScreen();
	void OC_initGameAreaDisplay();
	void OC_displayCharacterStatBar();
	void OC_initSmallAnim();
	void OC_setCharacterHeroismBar();
	void OC_sub18690();
	void OC_setViewPortCharacterTarget();
	void OC_sub186A1();
	void OC_sub186E5_snd();
	void OC_sub1870A_snd();
	void OC_sub18725_snd();
	void OC_sub18733_snd();
	void OC_sub1873F_snd();
	void OC_sub18746_snd();
	void OC_sub1875D_snd();
	void OC_setArray128EF();
};

} // End of namespace Lilliput

#endif