1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #include "kyra/engine/kyra_lok.h"
24 #include "kyra/engine/sprites.h"
25 #include "kyra/graphics/wsamovie.h"
26 #include "kyra/graphics/animator_lok.h"
27 #include "kyra/text/text.h"
28 #include "kyra/engine/timer.h"
29 #include "kyra/sound/sound.h"
30 
31 #include "common/system.h"
32 
33 namespace Kyra {
34 
o1_magicInMouseItem(EMCState * script)35 int KyraEngine_LoK::o1_magicInMouseItem(EMCState *script) {
36 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_magicInMouseItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
37 	magicInMouseItem(stackPos(0), stackPos(1), -1);
38 	return 0;
39 }
40 
o1_characterSays(EMCState * script)41 int KyraEngine_LoK::o1_characterSays(EMCState *script) {
42 	resetSkipFlag();
43 	if (_flags.isTalkie) {
44 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_characterSays(%p) (%d, '%s', %d, %d)", (const void *)script, stackPos(0), stackPosString(1), stackPos(2), stackPos(3));
45 		characterSays(stackPos(0), stackPosString(1), stackPos(2), stackPos(3));
46 	} else {
47 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_characterSays(%p) ('%s', %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2));
48 		const char *string = stackPosString(0);
49 
50 		if ((_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) && _flags.lang == Common::JA_JPN) {
51 			static const uint8 townsString1[] = {
52 				0x83, 0x75, 0x83, 0x89, 0x83, 0x93, 0x83, 0x83, 0x93, 0x81,
53 				0x41, 0x82, 0xDC, 0x82, 0xBD, 0x97, 0x88, 0x82, 0xBD, 0x82,
54 				0xCC, 0x82, 0xA9, 0x81, 0x48, 0x00, 0x00, 0x00
55 			};
56 			static const uint8 townsString2[] = {
57 				0x83, 0x75, 0x83, 0x89, 0x83, 0x93, 0x83, 0x5C, 0x83, 0x93,
58 				0x81, 0x41, 0x82, 0xDC, 0x82, 0xBD, 0x97, 0x88, 0x82, 0xBD,
59 				0x82, 0xCC, 0x82, 0xA9, 0x81, 0x48, 0x00, 0x00
60 			};
61 
62 			if (strncmp((const char *)townsString1, string, sizeof(townsString1)) == 0)
63 				string = (const char *)townsString2;
64 		}
65 
66 		characterSays(-1, string, stackPos(1), stackPos(2));
67 	}
68 
69 	return 0;
70 }
71 
o1_delay(EMCState * script)72 int KyraEngine_LoK::o1_delay(EMCState *script) {
73 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_delay(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
74 	if (stackPos(1)) {
75 		warning("STUB: special o1_delay");
76 		// delete this after correct implementing
77 		delayWithTicks(stackPos(0));
78 	} else {
79 		delayWithTicks(stackPos(0));
80 	}
81 	return 0;
82 }
83 
o1_drawSceneAnimShape(EMCState * script)84 int KyraEngine_LoK::o1_drawSceneAnimShape(EMCState *script) {
85 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_drawSceneAnimShape(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
86 	_screen->drawShape(stackPos(4), _sprites->_sceneShapes[stackPos(0)], stackPos(1), stackPos(2), 0, (stackPos(3) != 0) ? 1 : 0);
87 	return 0;
88 }
89 
o1_runNPCScript(EMCState * script)90 int KyraEngine_LoK::o1_runNPCScript(EMCState *script) {
91 	warning("STUB: o1_runNPCScript");
92 	return 0;
93 }
94 
o1_setSpecialExitList(EMCState * script)95 int KyraEngine_LoK::o1_setSpecialExitList(EMCState *script) {
96 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setSpecialExitList(%p) (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8), stackPos(9));
97 
98 	for (int i = 0; i < 10; ++i)
99 		_exitList[i] = stackPos(i);
100 	_exitListPtr = _exitList;
101 
102 	return 0;
103 }
104 
o1_walkPlayerToPoint(EMCState * script)105 int KyraEngine_LoK::o1_walkPlayerToPoint(EMCState *script) {
106 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_walkPlayerToPoint(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
107 
108 	int normalTimers = stackPos(2);
109 	if (!normalTimers) {
110 		_timer->disable(19);
111 		_timer->disable(14);
112 		_timer->disable(18);
113 	}
114 
115 	int reinitScript = handleSceneChange(stackPos(0), stackPos(1), stackPos(2), stackPos(3));
116 
117 	if (!normalTimers) {
118 		_timer->enable(19);
119 		_timer->enable(14);
120 		_timer->enable(18);
121 	}
122 
123 	if (reinitScript)
124 		_emc->init(script, script->dataPtr);
125 
126 	if (_sceneChangeState) {
127 		_sceneChangeState = 0;
128 		return 1;
129 	}
130 	return 0;
131 }
132 
o1_dropItemInScene(EMCState * script)133 int KyraEngine_LoK::o1_dropItemInScene(EMCState *script) {
134 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_dropItemInScene(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
135 	int item = stackPos(0);
136 	int xpos = stackPos(1);
137 	int ypos = stackPos(2);
138 
139 	byte freeItem = findFreeItemInScene(_currentCharacter->sceneId);
140 	if (freeItem != 0xFF) {
141 		int sceneId = _currentCharacter->sceneId;
142 		Room *room = &_roomTable[sceneId];
143 		room->itemsXPos[freeItem] = xpos;
144 		room->itemsYPos[freeItem] = ypos;
145 		room->itemsTable[freeItem] = item;
146 
147 		_animator->animAddGameItem(freeItem, sceneId);
148 		_animator->updateAllObjectShapes();
149 	} else {
150 		if (item == 43)
151 			placeItemInGenericMapScene(item, 0);
152 		else
153 			placeItemInGenericMapScene(item, 1);
154 	}
155 	return 0;
156 }
157 
o1_drawAnimShapeIntoScene(EMCState * script)158 int KyraEngine_LoK::o1_drawAnimShapeIntoScene(EMCState *script) {
159 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_drawAnimShapeIntoScene(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
160 	_animator->restoreAllObjectBackgrounds();
161 	int shape = stackPos(0);
162 	int xpos = stackPos(1);
163 	int ypos = stackPos(2);
164 	int flags = (stackPos(3) != 0) ? 1 : 0;
165 	_screen->drawShape(2, _sprites->_sceneShapes[shape], xpos, ypos, 0, flags);
166 	_screen->drawShape(0, _sprites->_sceneShapes[shape], xpos, ypos, 0, flags);
167 	_animator->flagAllObjectsForBkgdChange();
168 	_animator->preserveAnyChangedBackgrounds();
169 	_animator->flagAllObjectsForRefresh();
170 	_animator->updateAllObjectShapes();
171 	return 0;
172 }
173 
o1_savePageToDisk(EMCState * script)174 int KyraEngine_LoK::o1_savePageToDisk(EMCState *script) {
175 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_savePageToDisk(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
176 	_screen->savePageToDisk(stackPosString(0), stackPos(1));
177 	return 0;
178 }
179 
o1_sceneAnimOn(EMCState * script)180 int KyraEngine_LoK::o1_sceneAnimOn(EMCState *script) {
181 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_sceneAnimOn(%p) (%d)", (const void *)script, stackPos(0));
182 	_sprites->_anims[stackPos(0)].play = true;
183 	return 0;
184 }
185 
o1_sceneAnimOff(EMCState * script)186 int KyraEngine_LoK::o1_sceneAnimOff(EMCState *script) {
187 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_sceneAnimOff(%p) (%d)", (const void *)script, stackPos(0));
188 	_sprites->_anims[stackPos(0)].play = false;
189 	return 0;
190 }
191 
o1_getElapsedSeconds(EMCState * script)192 int KyraEngine_LoK::o1_getElapsedSeconds(EMCState *script) {
193 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getElapsedSeconds(%p) ()", (const void *)script);
194 	return _system->getMillis() / 1000;
195 }
196 
o1_mouseIsPointer(EMCState * script)197 int KyraEngine_LoK::o1_mouseIsPointer(EMCState *script) {
198 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_mouseIsPointer(%p) ()", (const void *)script);
199 	return (_itemInHand == kItemNone);
200 }
201 
o1_runSceneAnimUntilDone(EMCState * script)202 int KyraEngine_LoK::o1_runSceneAnimUntilDone(EMCState *script) {
203 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_runSceneAnimUntilDone(%p) (%d)", (const void *)script, stackPos(0));
204 	_screen->hideMouse();
205 	_animator->restoreAllObjectBackgrounds();
206 	_sprites->_anims[stackPos(0)].play = true;
207 	_animator->sprites()[stackPos(0)].active = 1;
208 	_animator->flagAllObjectsForBkgdChange();
209 	_animator->preserveAnyChangedBackgrounds();
210 	while (_sprites->_anims[stackPos(0)].play) {
211 		_sprites->updateSceneAnims();
212 		_animator->updateAllObjectShapes();
213 		delay(10);
214 	}
215 	_animator->restoreAllObjectBackgrounds();
216 	_screen->showMouse();
217 	return 0;
218 }
219 
o1_fadeSpecialPalette(EMCState * script)220 int KyraEngine_LoK::o1_fadeSpecialPalette(EMCState *script) {
221 	if (_flags.platform == Common::kPlatformAmiga) {
222 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_fadeSpecialPalette(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
223 		if (_currentCharacter->sceneId != 45) {
224 			if (stackPos(0) == 13) {
225 				_screen->copyPalette(0, 12);
226 				_screen->setScreenPalette(_screen->getPalette(0));
227 			}
228 		} else {
229 			setupZanthiaPalette(stackPos(0));
230 			_screen->getPalette(0).copy(_screen->getPalette(4), 12, 1);
231 			_screen->fadePalette(_screen->getPalette(0), 2);
232 		}
233 	} else {
234 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_fadeSpecialPalette(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
235 		_screen->fadeSpecialPalette(stackPos(0), stackPos(1), stackPos(2), stackPos(3));
236 	}
237 	return 0;
238 }
239 
o1_phaseInSameScene(EMCState * script)240 int KyraEngine_LoK::o1_phaseInSameScene(EMCState *script) {
241 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_phaseInSameScene(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
242 	transcendScenes(stackPos(0), stackPos(1));
243 	return 0;
244 }
245 
o1_setScenePhasingFlag(EMCState * script)246 int KyraEngine_LoK::o1_setScenePhasingFlag(EMCState *script) {
247 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setScenePhasingFlag(%p) ()", (const void *)script);
248 	_scenePhasingFlag = 1;
249 	return 1;
250 }
251 
o1_resetScenePhasingFlag(EMCState * script)252 int KyraEngine_LoK::o1_resetScenePhasingFlag(EMCState *script) {
253 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_resetScenePhasingFlag(%p) ()", (const void *)script);
254 	_scenePhasingFlag = 0;
255 	return 0;
256 }
257 
o1_queryScenePhasingFlag(EMCState * script)258 int KyraEngine_LoK::o1_queryScenePhasingFlag(EMCState *script) {
259 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_queryScenePhasingFlag(%p) ()", (const void *)script);
260 	return _scenePhasingFlag;
261 }
262 
o1_sceneToDirection(EMCState * script)263 int KyraEngine_LoK::o1_sceneToDirection(EMCState *script) {
264 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_sceneToDirection(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
265 	assert(stackPos(0) < _roomTableSize);
266 	Room *curRoom = &_roomTable[stackPos(0)];
267 	uint16 returnValue = 0xFFFF;
268 	switch (stackPos(1)) {
269 	case 0:
270 		returnValue = curRoom->northExit;
271 		break;
272 
273 	case 2:
274 		returnValue = curRoom->eastExit;
275 		break;
276 
277 	case 4:
278 		returnValue = curRoom->southExit;
279 		break;
280 
281 	case 6:
282 		returnValue = curRoom->westExit;
283 		break;
284 
285 	default:
286 		break;
287 	}
288 	if (returnValue == 0xFFFF)
289 		return -1;
290 	return returnValue;
291 }
292 
o1_setBirthstoneGem(EMCState * script)293 int KyraEngine_LoK::o1_setBirthstoneGem(EMCState *script) {
294 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setBirthstoneGem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
295 	int index = stackPos(0);
296 	if (index < 4 && index >= 0) {
297 		_birthstoneGemTable[index] = stackPos(1);
298 		return 1;
299 	}
300 	return 0;
301 }
302 
o1_placeItemInGenericMapScene(EMCState * script)303 int KyraEngine_LoK::o1_placeItemInGenericMapScene(EMCState *script) {
304 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_placeItemInGenericMapScene(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
305 	placeItemInGenericMapScene(stackPos(0), stackPos(1));
306 	return 0;
307 }
308 
o1_setBrandonStatusBit(EMCState * script)309 int KyraEngine_LoK::o1_setBrandonStatusBit(EMCState *script) {
310 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setBrandonStatusBit(%p) (%d)", (const void *)script, stackPos(0));
311 	_brandonStatusBit |= stackPos(0);
312 	return 0;
313 }
314 
o1_delaySecs(EMCState * script)315 int KyraEngine_LoK::o1_delaySecs(EMCState *script) {
316 	if (_flags.isTalkie && speechEnabled()) {
317 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_voiceDelay(%p) (%d)", (const void *)script, stackPos(0));
318 		if (stackPos(0) == 0) {
319 			snd_voiceWaitForFinish(true);
320 		} else if (stackPos(0) < 0) {
321 			uint32 time = ABS(stackPos(0)) * _tickLength;
322 			delay(time, true);
323 		}
324 	} else {
325 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_delaySecs(%p) (%d)", (const void *)script, stackPos(0));
326 		if (stackPos(0) >= 0 && !skipFlag())
327 			delay(stackPos(0) * 1000, true);
328 	}
329 
330 	resetSkipFlag();
331 	return 0;
332 }
333 
o1_getCharacterScene(EMCState * script)334 int KyraEngine_LoK::o1_getCharacterScene(EMCState *script) {
335 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getCharacterScene(%p) (%d)", (const void *)script, stackPos(0));
336 	return _characterList[stackPos(0)].sceneId;
337 }
338 
o1_runNPCSubscript(EMCState * script)339 int KyraEngine_LoK::o1_runNPCSubscript(EMCState *script) {
340 	warning("STUB: o1_runNPCSubscript");
341 	return 0;
342 }
343 
o1_magicOutMouseItem(EMCState * script)344 int KyraEngine_LoK::o1_magicOutMouseItem(EMCState *script) {
345 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_magicOutMouseItem(%p) (%d)", (const void *)script, stackPos(0));
346 	magicOutMouseItem(stackPos(0), -1);
347 	return 0;
348 }
349 
o1_internalAnimOn(EMCState * script)350 int KyraEngine_LoK::o1_internalAnimOn(EMCState *script) {
351 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_internalAnimOn(%p) (%d)", (const void *)script, stackPos(0));
352 	_animator->sprites()[stackPos(0)].active = 1;
353 	return 0;
354 }
355 
o1_forceBrandonToNormal(EMCState * script)356 int KyraEngine_LoK::o1_forceBrandonToNormal(EMCState *script) {
357 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_forceBrandonToNormal(%p) ()", (const void *)script);
358 	checkAmuletAnimFlags();
359 	return 0;
360 }
361 
o1_poisonDeathNow(EMCState * script)362 int KyraEngine_LoK::o1_poisonDeathNow(EMCState *script) {
363 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_poisonDeathNow(%p) ()", (const void *)script);
364 	seq_poisonDeathNow(1);
365 
366 	// WORKAROUND for the poison animation after drinking the green potion
367 	// that can be made at the alchemists' crystals.
368 	// The next animator update from inside delay() after completing the
369 	// poison animation would cause invalid memory access (tryin to draw the
370 	// already freed special anim shape 142).
371 	// I can definitely confirm that for the FM-TOWNS version. I don't know
372 	// about the DOS-CD version. Maybe this has been fixed there somehow.
373 	// I simply repeat the same steps that are done after the potion animation
374 	// when bitten by the snake (scene_lok.cpp, lines 964, 966).
375 	_characterList[0].currentAnimFrame = 7;
376 	_animator->animRefreshNPC(0);
377 
378 	return 0;
379 }
380 
o1_setScaleMode(EMCState * script)381 int KyraEngine_LoK::o1_setScaleMode(EMCState *script) {
382 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setScaleMode(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
383 	int len = stackPos(0);
384 	int setValue1 = stackPos(1);
385 	int start2 = stackPos(2);
386 	int setValue2 = stackPos(3);
387 	for (int i = 0; i < len; ++i)
388 		_scaleTable[i] = setValue1;
389 	int temp = setValue2 - setValue1;
390 	int temp2 = start2 - len;
391 	for (int i = len, offset = 0; i < start2; ++i, ++offset)
392 		_scaleTable[i] = (offset * temp) / temp2 + setValue1;
393 	for (int i = start2; i < 145; ++i)
394 		_scaleTable[i] = setValue2;
395 	_scaleMode = 1;
396 	return _scaleMode;
397 }
398 
o1_openWSAFile(EMCState * script)399 int KyraEngine_LoK::o1_openWSAFile(EMCState *script) {
400 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_openWSAFile(%p) ('%s', %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3));
401 
402 	const char *filename = stackPosString(0);
403 	int wsaIndex = stackPos(1);
404 
405 	_movieObjects[wsaIndex]->open(filename, (stackPos(3) != 0) ? 1 : 0, 0);
406 	assert(_movieObjects[wsaIndex]->opened());
407 
408 	return 0;
409 }
410 
o1_closeWSAFile(EMCState * script)411 int KyraEngine_LoK::o1_closeWSAFile(EMCState *script) {
412 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_closeWSAFile(%p) (%d)", (const void *)script, stackPos(0));
413 
414 	int wsaIndex = stackPos(0);
415 	if (_movieObjects[wsaIndex])
416 		_movieObjects[wsaIndex]->close();
417 
418 	return 0;
419 }
420 
o1_runWSAFromBeginningToEnd(EMCState * script)421 int KyraEngine_LoK::o1_runWSAFromBeginningToEnd(EMCState *script) {
422 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_runWSAFromBeginningToEnd(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
423 
424 	_screen->hideMouse();
425 
426 	bool running = true;
427 
428 	int xpos = stackPos(0);
429 	int ypos = stackPos(1);
430 	int waitTime = stackPos(2);
431 	int wsaIndex = stackPos(3);
432 	int worldUpdate = stackPos(4);
433 	int wsaFrame = 0;
434 
435 	while (running) {
436 		const uint32 continueTime = waitTime * _tickLength + _system->getMillis();
437 
438 		_movieObjects[wsaIndex]->displayFrame(wsaFrame++, 0, xpos, ypos, 0, 0, 0);
439 		if (wsaFrame >= _movieObjects[wsaIndex]->frames())
440 			running = false;
441 
442 		delayUntil(continueTime, false, worldUpdate != 0);
443 	}
444 
445 	_screen->showMouse();
446 
447 	return 0;
448 }
449 
o1_displayWSAFrame(EMCState * script)450 int KyraEngine_LoK::o1_displayWSAFrame(EMCState *script) {
451 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_displayWSAFrame(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
452 	int frame = stackPos(0);
453 	int xpos = stackPos(1);
454 	int ypos = stackPos(2);
455 	int waitTime = stackPos(3);
456 	int wsaIndex = stackPos(4);
457 	_screen->hideMouse();
458 	const uint32 continueTime = waitTime * _tickLength + _system->getMillis();
459 	_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos, 0, 0, 0);
460 	delayUntil(continueTime, false, true);
461 	_screen->showMouse();
462 	return 0;
463 }
464 
o1_enterNewScene(EMCState * script)465 int KyraEngine_LoK::o1_enterNewScene(EMCState *script) {
466 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_enterNewScene(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
467 	enterNewScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
468 	return 0;
469 }
470 
o1_setSpecialEnterXAndY(EMCState * script)471 int KyraEngine_LoK::o1_setSpecialEnterXAndY(EMCState *script) {
472 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setSpecialEnterXAndY(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
473 	_brandonPosX = stackPos(0);
474 	_brandonPosY = stackPos(1);
475 	if (_brandonPosX + 1 == 0 && _brandonPosY + 1 == 0)
476 		_currentCharacter->currentAnimFrame = 88;
477 	return 0;
478 }
479 
o1_runWSAFrames(EMCState * script)480 int KyraEngine_LoK::o1_runWSAFrames(EMCState *script) {
481 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_runWSAFrames(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
482 	int xpos = stackPos(0);
483 	int ypos = stackPos(1);
484 	int delayTime = stackPos(2);
485 	int startFrame = stackPos(3);
486 	int endFrame = stackPos(4);
487 	int wsaIndex = stackPos(5);
488 	_screen->hideMouse();
489 	for (; startFrame <= endFrame; ++startFrame) {
490 		const uint32 nextRun = _system->getMillis() + delayTime * _tickLength;
491 		_movieObjects[wsaIndex]->displayFrame(startFrame, 0, xpos, ypos, 0, 0, 0);
492 		delayUntil(nextRun, false, true);
493 	}
494 	_screen->showMouse();
495 	return 0;
496 }
497 
o1_popBrandonIntoScene(EMCState * script)498 int KyraEngine_LoK::o1_popBrandonIntoScene(EMCState *script) {
499 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_popBrandonIntoScene(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
500 	int changeScaleMode = stackPos(3);
501 	int xpos = (int16)(stackPos(0) & 0xFFFC);
502 	int ypos = (int16)(stackPos(1) & 0xFFFE);
503 	int facing = stackPos(2);
504 	_currentCharacter->x1 = _currentCharacter->x2 = xpos;
505 	_currentCharacter->y1 = _currentCharacter->y2 = ypos;
506 	_currentCharacter->facing = facing;
507 	_currentCharacter->currentAnimFrame = 7;
508 	int xOffset = _defaultShapeTable[0].xOffset;
509 	int yOffset = _defaultShapeTable[0].yOffset;
510 	int width = _defaultShapeTable[0].w << 3;
511 	int height = _defaultShapeTable[0].h;
512 	Animator_LoK::AnimObject *curAnim = _animator->actors();
513 
514 	if (changeScaleMode) {
515 		curAnim->x1 = _currentCharacter->x1;
516 		curAnim->y1 = _currentCharacter->y1;
517 		_animator->_brandonScaleY = _scaleTable[_currentCharacter->y1];
518 		_animator->_brandonScaleX = _animator->_brandonScaleY;
519 
520 		int animWidth = _animator->fetchAnimWidth(curAnim->sceneAnimPtr, _animator->_brandonScaleX) >> 1;
521 		int animHeight = _animator->fetchAnimHeight(curAnim->sceneAnimPtr, _animator->_brandonScaleY);
522 
523 		animWidth = (xOffset * animWidth) /  width;
524 		animHeight = (yOffset * animHeight) / height;
525 
526 		curAnim->x2 = curAnim->x1 += animWidth;
527 		curAnim->y2 = curAnim->y1 += animHeight;
528 	} else {
529 		curAnim->x2 = curAnim->x1 = _currentCharacter->x1 + xOffset;
530 		curAnim->y2 = curAnim->y1 = _currentCharacter->y1 + yOffset;
531 	}
532 
533 	int scaleModeBackup = _scaleMode;
534 	if (changeScaleMode)
535 		_scaleMode = 1;
536 
537 	_animator->animRefreshNPC(0);
538 	_animator->preserveAllBackgrounds();
539 	_animator->prepDrawAllObjects();
540 	_animator->copyChangedObjectsForward(0);
541 
542 	_scaleMode = scaleModeBackup;
543 
544 	return 0;
545 }
546 
o1_restoreAllObjectBackgrounds(EMCState * script)547 int KyraEngine_LoK::o1_restoreAllObjectBackgrounds(EMCState *script) {
548 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_restoreAllObjectBackgrounds(%p) (%d)", (const void *)script, stackPos(0));
549 	int disable = stackPos(0);
550 	int activeBackup = 0;
551 	if (disable) {
552 		activeBackup = _animator->actors()->active;
553 		_animator->actors()->active = 0;
554 	}
555 	_animator->restoreAllObjectBackgrounds();
556 	if (disable)
557 		_animator->actors()->active = activeBackup;
558 	return 0;
559 }
560 
o1_setCustomPaletteRange(EMCState * script)561 int KyraEngine_LoK::o1_setCustomPaletteRange(EMCState *script) {
562 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setCustomPaletteRange(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
563 	if (_flags.platform == Common::kPlatformAmiga) {
564 		if (_currentCharacter->sceneId == 45) {
565 			setupZanthiaPalette(stackPos(0));
566 		} else if (stackPos(0) == 29) {
567 			_screen->copyPalette(0, 11);
568 		} else if (stackPos(0) == 13) {
569 			_screen->copyPalette(0, 12);
570 		}
571 	} else {
572 		if (!_specialPalettes[stackPos(0)])
573 			warning("KyraEngine_LoK::o1_setCustomPaletteRange(): Trying to use missing special palette %d", stackPos(0));
574 		else
575 			_screen->getPalette(1).copy(_specialPalettes[stackPos(0)], 0, stackPos(2), stackPos(1));
576 	}
577 	return 0;
578 }
579 
o1_loadPageFromDisk(EMCState * script)580 int KyraEngine_LoK::o1_loadPageFromDisk(EMCState *script) {
581 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_loadPageFromDisk(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
582 	_screen->loadPageFromDisk(stackPosString(0), stackPos(1));
583 	return 0;
584 }
585 
o1_customPrintTalkString(EMCState * script)586 int KyraEngine_LoK::o1_customPrintTalkString(EMCState *script) {
587 	if (_flags.isTalkie) {
588 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_customPrintTalkString(%p) (%d, '%s', %d, %d, %d)", (const void *)script, stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4) & 0xFF);
589 
590 		if (speechEnabled()) {
591 			snd_voiceWaitForFinish();
592 			snd_playVoiceFile(stackPos(0));
593 		}
594 
595 		resetSkipFlag();
596 		if (textEnabled())
597 			_text->printTalkTextMessage(stackPosString(1), stackPos(2), stackPos(3), stackPos(4) & 0xFF, 0, 2);
598 	} else {
599 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_customPrintTalkString(%p) ('%s', %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3) & 0xFF);
600 		resetSkipFlag();
601 		_text->printTalkTextMessage(stackPosString(0), stackPos(1), stackPos(2), stackPos(3) & 0xFF, 0, 2);
602 	}
603 	_screen->updateScreen();
604 	return 0;
605 }
606 
o1_restoreCustomPrintBackground(EMCState * script)607 int KyraEngine_LoK::o1_restoreCustomPrintBackground(EMCState *script) {
608 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_restoreCustomPrintBackground(%p) ()", (const void *)script);
609 	_text->restoreTalkTextMessageBkgd(2, 0);
610 	return 0;
611 }
612 
o1_getCharacterX(EMCState * script)613 int KyraEngine_LoK::o1_getCharacterX(EMCState *script) {
614 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getCharacterX(%p) (%d)", (const void *)script, stackPos(0));
615 	return _characterList[stackPos(0)].x1;
616 }
617 
o1_getCharacterY(EMCState * script)618 int KyraEngine_LoK::o1_getCharacterY(EMCState *script) {
619 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getCharacterY(%p) (%d)", (const void *)script, stackPos(0));
620 	return _characterList[stackPos(0)].y1;
621 }
622 
o1_setCharacterFacing(EMCState * script)623 int KyraEngine_LoK::o1_setCharacterFacing(EMCState *script) {
624 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setCharacterFacing(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
625 	int character = stackPos(0);
626 	int facing = stackPos(1);
627 	int newAnimFrame = stackPos(2);
628 
629 	_animator->restoreAllObjectBackgrounds();
630 	if (newAnimFrame != -1)
631 		_characterList[character].currentAnimFrame = newAnimFrame;
632 	_characterList[character].facing = facing;
633 	_animator->animRefreshNPC(character);
634 	_animator->preserveAllBackgrounds();
635 	_animator->prepDrawAllObjects();
636 	_animator->copyChangedObjectsForward(0);
637 
638 	return 0;
639 }
640 
o1_copyWSARegion(EMCState * script)641 int KyraEngine_LoK::o1_copyWSARegion(EMCState *script) {
642 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_copyWSARegion(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
643 	int xpos = stackPos(0);
644 	int ypos = stackPos(1);
645 	int width = stackPos(2);
646 	int height = stackPos(3);
647 	int srcPage = stackPos(4);
648 	int dstPage = stackPos(5);
649 	_screen->copyRegion(xpos, ypos, xpos, ypos, width, height, srcPage, dstPage);
650 	return 0;
651 }
652 
o1_printText(EMCState * script)653 int KyraEngine_LoK::o1_printText(EMCState *script) {
654 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_printText(%p) ('%s', %d, %d, 0x%X, 0x%X)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
655 	if (_flags.lang == Common::JA_JPN && stackPos(3) == 7)
656 		_screen->printText(stackPosString(0), stackPos(1), stackPos(2), 0, 0x80);
657 	else
658 		_screen->printText(stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
659 	_screen->updateScreen();
660 	return 0;
661 }
662 
o1_loadSoundFile(EMCState * script)663 int KyraEngine_LoK::o1_loadSoundFile(EMCState *script) {
664 	warning("STUB: o1_loadSoundFile");
665 	return 0;
666 }
667 
o1_displayWSAFrameOnHidPage(EMCState * script)668 int KyraEngine_LoK::o1_displayWSAFrameOnHidPage(EMCState *script) {
669 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_displayWSAFrameOnHidPage(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
670 	int frame = stackPos(0);
671 	int xpos = stackPos(1);
672 	int ypos = stackPos(2);
673 	int waitTime = stackPos(3);
674 	int wsaIndex = stackPos(4);
675 
676 	_screen->hideMouse();
677 	const uint32 continueTime = waitTime * _tickLength + _system->getMillis();
678 	_movieObjects[wsaIndex]->displayFrame(frame, 2, xpos, ypos, 0, 0, 0);
679 	delayUntil(continueTime, false, true);
680 	_screen->showMouse();
681 
682 	return 0;
683 }
684 
o1_displayWSASequentialFrames(EMCState * script)685 int KyraEngine_LoK::o1_displayWSASequentialFrames(EMCState *script) {
686 	if (_flags.isTalkie)
687 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_displayWSASequentialFrames(%p) (%d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
688 	else
689 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_displayWSASequentialFrames(%p) (%d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6));
690 	int startFrame = stackPos(0);
691 	int endFrame = stackPos(1);
692 	int xpos = stackPos(2);
693 	int ypos = stackPos(3);
694 	int waitTime = stackPos(4);
695 	int wsaIndex = stackPos(5);
696 	int maxTime = stackPos(6);
697 
698 	if (_flags.isTalkie) {
699 		int specialTime = stackPos(7);
700 		if (specialTime) {
701 			uint32 voiceTime = snd_getVoicePlayTime();
702 			if (voiceTime) {
703 				int displayFrames = ABS(endFrame - startFrame) + 1;
704 				displayFrames *= maxTime;
705 				assert(displayFrames != 0);
706 
707 				bool voiceSync = false;
708 
709 				if (specialTime < 0) {
710 					voiceSync = true;
711 					specialTime = ABS(specialTime);
712 				}
713 
714 				voiceTime *= specialTime;
715 				voiceTime /= 100;
716 
717 				if (voiceSync) {
718 					uint32 voicePlayedTime = _sound->voicePlayedTime(_speechHandle);
719 					if (voicePlayedTime >= voiceTime)
720 						voiceTime = 0;
721 					else
722 						voiceTime -= voicePlayedTime;
723 				}
724 
725 				waitTime = voiceTime / displayFrames;
726 				waitTime /= _tickLength;
727 			}
728 		}
729 	}
730 
731 	if (maxTime - 1 <= 0)
732 		maxTime = 1;
733 
734 	// WORKAROUND for bug #1498221 "KYRA1: Glitches when meeting Zanthia".
735 	// The original did not do a forced screen update after displaying a WSA
736 	// frame while we have to do it, which makes Brandon disappear for a short
737 	// moment. That is not supposed to happen. So we're not updating the
738 	// screen for this special case.
739 	// This is only an issue for the CD version, but since the floppy version
740 	// does not use the specified paramaeters like these, it is safe to enable
741 	// it for all versions.
742 	if (startFrame == 18 && endFrame == 18 && waitTime == 10 && wsaIndex == 0 && _currentRoom == 45) {
743 		_movieObjects[wsaIndex]->displayFrame(18, 0, xpos, ypos, 0, 0, 0);
744 		// We call delayMillis manually here to avoid the screen getting
745 		// updated.
746 		_system->delayMillis(waitTime * _tickLength);
747 		return 0;
748 	}
749 
750 	int curTime = 0;
751 	_screen->hideMouse();
752 	while (curTime < maxTime) {
753 		if (endFrame >= startFrame) {
754 			int frame = startFrame;
755 			while (endFrame >= frame) {
756 				const uint32 continueTime = waitTime * _tickLength + _system->getMillis();
757 				_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos, 0, 0, 0);
758 				delayUntil(continueTime, false, true);
759 				++frame;
760 			}
761 		} else {
762 			int frame = startFrame;
763 			while (endFrame <= frame) {
764 				const uint32 continueTime = waitTime * _tickLength + _system->getMillis();
765 				_movieObjects[wsaIndex]->displayFrame(frame, 0, xpos, ypos, 0, 0, 0);
766 				delayUntil(continueTime, false, true);
767 				--frame;
768 			}
769 		}
770 
771 		if (skipFlag())
772 			break;
773 		else
774 			++curTime;
775 	}
776 	_screen->showMouse();
777 
778 	return 0;
779 }
780 
o1_refreshCharacter(EMCState * script)781 int KyraEngine_LoK::o1_refreshCharacter(EMCState *script) {
782 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_refreshCharacter(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
783 	int character = stackPos(0);
784 	int animFrame = stackPos(1);
785 	int newFacing = stackPos(2);
786 	int updateShapes = stackPos(3);
787 	_characterList[character].currentAnimFrame = animFrame;
788 	if (newFacing != -1)
789 		_characterList[character].facing = newFacing;
790 	_animator->animRefreshNPC(character);
791 	if (updateShapes)
792 		_animator->updateAllObjectShapes();
793 	return 0;
794 }
795 
o1_internalAnimOff(EMCState * script)796 int KyraEngine_LoK::o1_internalAnimOff(EMCState *script) {
797 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_internalAnimOff(%p) (%d)", (const void *)script, stackPos(0));
798 	_animator->sprites()[stackPos(0)].active = 0;
799 	return 0;
800 }
801 
o1_changeCharactersXAndY(EMCState * script)802 int KyraEngine_LoK::o1_changeCharactersXAndY(EMCState *script) {
803 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_changeCharactersXAndY(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
804 	Character *ch = &_characterList[stackPos(0)];
805 	int16 x = stackPos(1);
806 	int16 y = stackPos(2);
807 	if (x != -1 && y != -1) {
808 		x &= 0xFFFC;
809 		y &= 0xFFFE;
810 	}
811 	_animator->restoreAllObjectBackgrounds();
812 	ch->x1 = ch->x2 = x;
813 	ch->y1 = ch->y2 = y;
814 	_animator->preserveAllBackgrounds();
815 	return 0;
816 }
817 
o1_clearSceneAnimatorBeacon(EMCState * script)818 int KyraEngine_LoK::o1_clearSceneAnimatorBeacon(EMCState *script) {
819 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_clearSceneAnimatorBeacon(%p) ()", (const void *)script);
820 	_sprites->_sceneAnimatorBeaconFlag = 0;
821 	return 0;
822 }
823 
o1_querySceneAnimatorBeacon(EMCState * script)824 int KyraEngine_LoK::o1_querySceneAnimatorBeacon(EMCState *script) {
825 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_querySceneAnimatorBeacon(%p) ()", (const void *)script);
826 	return _sprites->_sceneAnimatorBeaconFlag;
827 }
828 
o1_refreshSceneAnimator(EMCState * script)829 int KyraEngine_LoK::o1_refreshSceneAnimator(EMCState *script) {
830 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_refreshSceneAnimator(%p) ()", (const void *)script);
831 	_sprites->updateSceneAnims();
832 	_animator->updateAllObjectShapes();
833 	return 0;
834 }
835 
o1_placeItemInOffScene(EMCState * script)836 int KyraEngine_LoK::o1_placeItemInOffScene(EMCState *script) {
837 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_placeItemInOffScene(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
838 	int item = stackPos(0);
839 	int xpos = stackPos(1);
840 	int ypos = stackPos(2);
841 	int sceneId = stackPos(3);
842 
843 	byte freeItem = findFreeItemInScene(sceneId);
844 	if (freeItem != 0xFF) {
845 		assert(sceneId < _roomTableSize);
846 		Room *room = &_roomTable[sceneId];
847 
848 		room->itemsTable[freeItem] = item;
849 		room->itemsXPos[freeItem] = xpos;
850 		room->itemsYPos[freeItem] = ypos;
851 	}
852 	return 0;
853 }
854 
o1_wipeDownMouseItem(EMCState * script)855 int KyraEngine_LoK::o1_wipeDownMouseItem(EMCState *script) {
856 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_wipeDownMouseItem(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
857 	_screen->hideMouse();
858 	wipeDownMouseItem(stackPos(1), stackPos(2));
859 	removeHandItem();
860 	_screen->showMouse();
861 	return 0;
862 }
863 
o1_placeCharacterInOtherScene(EMCState * script)864 int KyraEngine_LoK::o1_placeCharacterInOtherScene(EMCState *script) {
865 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_placeCharacterInOtherScene(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
866 	int id = stackPos(0);
867 	int sceneId = stackPos(1);
868 	int xpos = (int16)(stackPos(2) & 0xFFFC);
869 	int ypos = (int16)(stackPos(3) & 0xFFFE);
870 	int facing = stackPos(4);
871 	int animFrame = stackPos(5);
872 
873 	_characterList[id].sceneId = sceneId;
874 	_characterList[id].x1 = _characterList[id].x2 = xpos;
875 	_characterList[id].y1 = _characterList[id].y2 = ypos;
876 	_characterList[id].facing = facing;
877 	_characterList[id].currentAnimFrame = animFrame;
878 	return 0;
879 }
880 
o1_getKey(EMCState * script)881 int KyraEngine_LoK::o1_getKey(EMCState *script) {
882 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getKey(%p) ()", (const void *)script);
883 
884 	while (true) {
885 		delay(10);
886 
887 		if (skipFlag())
888 			break;
889 	}
890 
891 	resetSkipFlag();
892 	return 0;
893 }
894 
o1_specificItemInInventory(EMCState * script)895 int KyraEngine_LoK::o1_specificItemInInventory(EMCState *script) {
896 	warning("STUB: o1_specificItemInInventory");
897 	return 0;
898 }
899 
o1_popMobileNPCIntoScene(EMCState * script)900 int KyraEngine_LoK::o1_popMobileNPCIntoScene(EMCState *script) {
901 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_popMobileNPCIntoScene(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), (int16)(stackPos(4) & 0xFFFC), (int8)(stackPos(5) & 0xFE));
902 	int character = stackPos(0);
903 	int sceneId = stackPos(1);
904 	int animFrame = stackPos(2);
905 	int facing = stackPos(3);
906 	int16 xpos = (int16)(stackPos(4) & 0xFFFC);
907 	int8 ypos = (int16)(stackPos(5) & 0xFFFE);
908 	Character *curChar = &_characterList[character];
909 
910 	curChar->sceneId = sceneId;
911 	curChar->currentAnimFrame = animFrame;
912 	curChar->facing = facing;
913 	curChar->x1 = curChar->x2 = xpos;
914 	curChar->y1 = curChar->y2 = ypos;
915 
916 	_animator->animAddNPC(character);
917 	_animator->updateAllObjectShapes();
918 	return 0;
919 }
920 
o1_mobileCharacterInScene(EMCState * script)921 int KyraEngine_LoK::o1_mobileCharacterInScene(EMCState *script) {
922 	warning("STUB: o1_mobileCharacterInScene");
923 	return 0;
924 }
925 
o1_hideMobileCharacter(EMCState * script)926 int KyraEngine_LoK::o1_hideMobileCharacter(EMCState *script) {
927 	warning("STUB: o1_hideMobileCharacter");
928 	return 0;
929 }
930 
o1_unhideMobileCharacter(EMCState * script)931 int KyraEngine_LoK::o1_unhideMobileCharacter(EMCState *script) {
932 	warning("STUB: o1_unhideMobileCharacter");
933 	return 0;
934 }
935 
o1_setCharacterLocation(EMCState * script)936 int KyraEngine_LoK::o1_setCharacterLocation(EMCState *script) {
937 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setCharacterLocation(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
938 	Character *ch = &_characterList[stackPos(0)];
939 	Animator_LoK::AnimObject *animObj = &_animator->actors()[stackPos(0)];
940 	int newScene = stackPos(1);
941 	if (_currentCharacter->sceneId == ch->sceneId) {
942 		if (_currentCharacter->sceneId != newScene)
943 			animObj->active = 0;
944 	} else if (_currentCharacter->sceneId == newScene) {
945 		if (_currentCharacter->sceneId != ch->sceneId)
946 			animObj->active = 1;
947 	}
948 
949 	ch->sceneId = stackPos(1);
950 	return 0;
951 }
952 
o1_walkCharacterToPoint(EMCState * script)953 int KyraEngine_LoK::o1_walkCharacterToPoint(EMCState *script) {
954 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_walkCharacterToPoint(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
955 	int character = stackPos(0);
956 	int toX = stackPos(1);
957 	int toY = stackPos(2);
958 	_pathfinderFlag2 = 1;
959 	uint32 nextFrame;
960 	int findWayReturn = findWay(_characterList[character].x1, _characterList[character].y1, toX, toY, _movFacingTable, 150);
961 	_pathfinderFlag2 = 0;
962 
963 	if (_lastFindWayRet < findWayReturn)
964 		_lastFindWayRet = findWayReturn;
965 	if (findWayReturn == 0x7D00 || findWayReturn == 0)
966 		return 0;
967 
968 	int *curPos = _movFacingTable;
969 	bool running = true;
970 	while (running) {
971 		bool forceContinue = false;
972 		switch (*curPos) {
973 		case 0:
974 			_characterList[character].facing = 2;
975 			break;
976 
977 		case 1:
978 			_characterList[character].facing = 1;
979 			break;
980 
981 		case 2:
982 			_characterList[character].facing = 0;
983 			break;
984 
985 		case 3:
986 			_characterList[character].facing = 7;
987 			break;
988 
989 		case 4:
990 			_characterList[character].facing = 6;
991 			break;
992 
993 		case 5:
994 			_characterList[character].facing = 5;
995 			break;
996 
997 		case 6:
998 			_characterList[character].facing = 4;
999 			break;
1000 
1001 		case 7:
1002 			_characterList[character].facing = 3;
1003 			break;
1004 
1005 		case 8:
1006 			running = 0;
1007 			break;
1008 
1009 		default:
1010 			++curPos;
1011 			forceContinue = true;
1012 		}
1013 
1014 		if (forceContinue || !running)
1015 			continue;
1016 
1017 		setCharacterPosition(character, 0);
1018 		++curPos;
1019 
1020 		delayUntil(nextFrame = _timer->getDelay(5 + character) * _tickLength + _system->getMillis(), true, true);
1021 	}
1022 	return 0;
1023 }
1024 
o1_specialEventDisplayBrynnsNote(EMCState * script)1025 int KyraEngine_LoK::o1_specialEventDisplayBrynnsNote(EMCState *script) {
1026 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_specialEventDisplayBrynnsNote(%p) ()", (const void *)script);
1027 	_screen->hideMouse();
1028 	_screen->savePageToDisk("HIDPAGE.TMP", 2);
1029 	_screen->savePageToDisk("SEENPAGE.TMP", 0);
1030 	if (_flags.isTalkie) {
1031 		if (_flags.lang == Common::EN_ANY || _flags.lang == Common::IT_ITA)
1032 			_screen->loadBitmap("NOTEENG.CPS", 3, 3, 0);
1033 		else if (_flags.lang == Common::FR_FRA)
1034 			_screen->loadBitmap("NOTEFRE.CPS", 3, 3, 0);
1035 		else if (_flags.lang == Common::DE_DEU)
1036 			_screen->loadBitmap("NOTEGER.CPS", 3, 3, 0);
1037 	} else {
1038 		_screen->loadBitmap("NOTE.CPS", 3, 3, 0);
1039 	}
1040 	_screen->copyRegion(63, 8, 63, 8, 194, 128, 2, 0);
1041 	_screen->updateScreen();
1042 	_screen->showMouse();
1043 
1044 	if (_flags.platform != Common::kPlatformAmiga && !_flags.isTalkie && _flags.lang != Common::JA_JPN)
1045 		_screen->setFont(Screen::FID_6_FNT);
1046 	return 0;
1047 }
1048 
o1_specialEventRemoveBrynnsNote(EMCState * script)1049 int KyraEngine_LoK::o1_specialEventRemoveBrynnsNote(EMCState *script) {
1050 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_specialEventRemoveBrynnsNote(%p) ()", (const void *)script);
1051 	_screen->hideMouse();
1052 	_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
1053 	_screen->loadPageFromDisk("HIDPAGE.TMP", 2);
1054 	_screen->updateScreen();
1055 	_screen->showMouse();
1056 
1057 	if (_flags.platform != Common::kPlatformAmiga && !_flags.isTalkie && _flags.lang != Common::JA_JPN)
1058 		_screen->setFont(Screen::FID_8_FNT);
1059 	return 0;
1060 }
1061 
o1_setLogicPage(EMCState * script)1062 int KyraEngine_LoK::o1_setLogicPage(EMCState *script) {
1063 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setLogicPage(%p) (%d)", (const void *)script, stackPos(0));
1064 	_screen->_curPage = stackPos(0);
1065 	return stackPos(0);
1066 }
1067 
o1_fatPrint(EMCState * script)1068 int KyraEngine_LoK::o1_fatPrint(EMCState *script) {
1069 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_fatPrint(%p) ('%s', %d, %d, %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
1070 
1071 	// Workaround for bug #1582672 ("KYRA1: Text crippled and drawn wrong")
1072 	// I'm not sure how the original handles this, since it seems to call
1073 	// printText also, maybe it fails somewhere inside...
1074 	// TODO: fix the reason for this workaround
1075 	if (_currentRoom == 117)
1076 		return 0;
1077 	_text->printText(stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
1078 	return 0;
1079 }
1080 
o1_preserveAllObjectBackgrounds(EMCState * script)1081 int KyraEngine_LoK::o1_preserveAllObjectBackgrounds(EMCState *script) {
1082 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_preserveAllObjectBackgrounds(%p) ()", (const void *)script);
1083 	_animator->preserveAllBackgrounds();
1084 	return 0;
1085 }
1086 
o1_updateSceneAnimations(EMCState * script)1087 int KyraEngine_LoK::o1_updateSceneAnimations(EMCState *script) {
1088 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_updateSceneAnimations(%p) (%d)", (const void *)script, stackPos(0));
1089 	int times = stackPos(0);
1090 	while (times--) {
1091 		_sprites->updateSceneAnims();
1092 		_animator->updateAllObjectShapes();
1093 	}
1094 	return 0;
1095 }
1096 
o1_sceneAnimationActive(EMCState * script)1097 int KyraEngine_LoK::o1_sceneAnimationActive(EMCState *script) {
1098 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_sceneAnimationActive(%p) (%d)", (const void *)script, stackPos(0));
1099 	return _sprites->_anims[stackPos(0)].play;
1100 }
1101 
o1_setCharacterMovementDelay(EMCState * script)1102 int KyraEngine_LoK::o1_setCharacterMovementDelay(EMCState *script) {
1103 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setCharacterMovementDelay(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1104 	_timer->setDelay(stackPos(0) + 5, stackPos(1));
1105 	return 0;
1106 }
1107 
o1_getCharacterFacing(EMCState * script)1108 int KyraEngine_LoK::o1_getCharacterFacing(EMCState *script) {
1109 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getCharacterFacing(%p) (%d)", (const void *)script, stackPos(0));
1110 	return _characterList[stackPos(0)].facing;
1111 }
1112 
o1_bkgdScrollSceneAndMasksRight(EMCState * script)1113 int KyraEngine_LoK::o1_bkgdScrollSceneAndMasksRight(EMCState *script) {
1114 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_bkgdScrollSceneAndMasksRight(%p) (%d)", (const void *)script, stackPos(0));
1115 	_screen->copyBackgroundBlock(stackPos(0), 2, 0);
1116 	_screen->copyBackgroundBlock2(stackPos(0));
1117 	// update the whole screen
1118 	_screen->copyRegion(7, 7, 7, 7, 305, 129, 3, 0);
1119 	// Don't do a screen update here, see bug #1910180 "KYRA1: Screen 'flash'"
1120 	// it would cause to draw the screen with a wrong palette and thus look
1121 	// strange for the user. Since this opcode should be just called on scene
1122 	// initialization anyway, there should be no problem with not updating the
1123 	// screen right now.
1124 	return 0;
1125 }
1126 
o1_dispelMagicAnimation(EMCState * script)1127 int KyraEngine_LoK::o1_dispelMagicAnimation(EMCState *script) {
1128 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_dispelMagicAnimation(%p) ()", (const void *)script);
1129 	seq_dispelMagicAnimation();
1130 	return 0;
1131 }
1132 
o1_findBrightestFireberry(EMCState * script)1133 int KyraEngine_LoK::o1_findBrightestFireberry(EMCState *script) {
1134 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_findBrightestFireberry(%p) ()", (const void *)script);
1135 	if (_currentCharacter->sceneId >= 187 && _currentCharacter->sceneId <= 198)
1136 		return 29;
1137 
1138 	// The following rooms are only a "A fireberry bush" scene in the CD version
1139 	// of Kyrandia 1. In all other versions they are a usual dark cave, thus we do only
1140 	// return a glow value of "29" over here, when we are running a CD version.
1141 	if (_flags.isTalkie) {
1142 		if (_currentCharacter->sceneId == 133 || _currentCharacter->sceneId == 137 ||
1143 		        _currentCharacter->sceneId == 165 || _currentCharacter->sceneId == 173)
1144 			return 29;
1145 	}
1146 
1147 	if (_itemInHand == 28)
1148 		return 28;
1149 
1150 	int brightestFireberry = 107;
1151 	if (_itemInHand >= 29 && _itemInHand <= 33)
1152 		brightestFireberry = _itemInHand;
1153 	for (int i = 0; i < 10; ++i) {
1154 		uint8 item = _currentCharacter->inventoryItems[i];
1155 		if (item == 0xFF)
1156 			continue;
1157 		if (item == 28)
1158 			return 28;
1159 		if (item >= 29 && item <= 33) {
1160 			if (item < brightestFireberry)
1161 				brightestFireberry = item;
1162 		}
1163 	}
1164 	assert(_currentCharacter->sceneId < _roomTableSize);
1165 	Room *curRoom = &_roomTable[_currentCharacter->sceneId];
1166 	for (int i = 0; i < 12; ++i) {
1167 		uint8 item = curRoom->itemsTable[i];
1168 		if (item == 0xFF)
1169 			continue;
1170 		if (item == 28)
1171 			return 28;
1172 		if (item >= 29 && item <= 33) {
1173 			if (item < brightestFireberry)
1174 				brightestFireberry = item;
1175 		}
1176 	}
1177 	if (brightestFireberry == 107)
1178 		return -1;
1179 	return brightestFireberry;
1180 }
1181 
o1_setFireberryGlowPalette(EMCState * script)1182 int KyraEngine_LoK::o1_setFireberryGlowPalette(EMCState *script) {
1183 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setFireberryGlowPalette(%p) (%d)", (const void *)script, stackPos(0));
1184 
1185 	if (_flags.platform == Common::kPlatformAmiga) {
1186 		int palIndex = 0;
1187 
1188 		switch (stackPos(0)) {
1189 		case -1:
1190 			// The original seemed to draw some lines on page 2 here, which looks strange...
1191 			//if (!(_brandonStatusBit & 2))
1192 			//  warning("Unimplemented case for o1_setFireberryGlowPalette");
1193 			palIndex = 9;
1194 			break;
1195 
1196 		case 30:
1197 			palIndex = 7;
1198 			break;
1199 
1200 		case 31:
1201 			palIndex = 8;
1202 			break;
1203 
1204 		case 32:
1205 		case 33:
1206 			palIndex = 9;
1207 			break;
1208 
1209 	case 28: case 29: default:
1210 			palIndex = 6;
1211 		}
1212 
1213 		if (_brandonStatusBit & 2) {
1214 			if (_currentCharacter->sceneId < 187 || _currentCharacter->sceneId > 198)
1215 				palIndex = 10;
1216 		}
1217 
1218 		_screen->copyPalette(0, palIndex);
1219 	} else {
1220 		int palIndex = 0;
1221 
1222 		switch (stackPos(0)) {
1223 		case 0x1E:
1224 			palIndex = 9;
1225 			break;
1226 
1227 		case 0x1F:
1228 			palIndex = 10;
1229 			break;
1230 
1231 		case 0x20:
1232 			palIndex = 11;
1233 			break;
1234 
1235 		case 0x21:
1236 		case -1:
1237 			palIndex = 12;
1238 			break;
1239 
1240 		default:
1241 			palIndex = 8;
1242 		}
1243 
1244 		if (_brandonStatusBit & 2) {
1245 			if (_currentCharacter->sceneId != 133 && _currentCharacter->sceneId != 137 &&
1246 			        _currentCharacter->sceneId != 165 && _currentCharacter->sceneId != 173 &&
1247 			        (_currentCharacter->sceneId < 187 || _currentCharacter->sceneId > 198)) {
1248 				palIndex = 14;
1249 			}
1250 		}
1251 
1252 		_screen->getPalette(1).copy(_specialPalettes[palIndex], 0, 15, 228);
1253 	}
1254 
1255 	return 0;
1256 }
1257 
o1_drinkPotionAnimation(EMCState * script)1258 int KyraEngine_LoK::o1_drinkPotionAnimation(EMCState *script) {
1259 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_drinkPotionAnimation(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
1260 	seq_playDrinkPotionAnim(stackPos(0), stackPos(1), stackPos(2));
1261 	return 0;
1262 }
1263 
o1_makeAmuletAppear(EMCState * script)1264 int KyraEngine_LoK::o1_makeAmuletAppear(EMCState *script) {
1265 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_makeAmuletAppear(%p) ()", (const void *)script);
1266 	Movie *amulet = createWSAMovie();
1267 	assert(amulet);
1268 	amulet->open("AMULET.WSA", 1, 0);
1269 
1270 	if (amulet->opened()) {
1271 		assert(_amuleteAnim);
1272 		_screen->hideMouse();
1273 		snd_playSoundEffect(0x70);
1274 		for (int i = 0; _amuleteAnim[i] != 0xFF; ++i) {
1275 			const uint32 nextTime = _system->getMillis() + 5 * _tickLength;
1276 
1277 			uint8 code = _amuleteAnim[i];
1278 			if (code == 3 || code == 7)
1279 				snd_playSoundEffect(0x71);
1280 
1281 			if (code == 5)
1282 				snd_playSoundEffect(0x72);
1283 
1284 			if (code == 14)
1285 				snd_playSoundEffect(0x73);
1286 
1287 			amulet->displayFrame(code, 0, 224, 152, 0, 0, 0);
1288 			delayUntil(nextTime, false, true);
1289 		}
1290 		_screen->showMouse();
1291 	}
1292 
1293 	delete amulet;
1294 	setGameFlag(0x2D);
1295 	return 0;
1296 }
1297 
o1_drawItemShapeIntoScene(EMCState * script)1298 int KyraEngine_LoK::o1_drawItemShapeIntoScene(EMCState *script) {
1299 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_drawItemShapeIntoScene(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
1300 	int item = stackPos(0);
1301 	int x = stackPos(1);
1302 	int y = stackPos(2);
1303 	int flags = stackPos(3);
1304 	int onlyHidPage = stackPos(4);
1305 
1306 	if (flags)
1307 		flags = 1;
1308 
1309 	if (onlyHidPage) {
1310 		_screen->drawShape(2, _shapes[216 + item], x, y, 0, flags);
1311 	} else {
1312 		_animator->restoreAllObjectBackgrounds();
1313 		_screen->drawShape(2, _shapes[216 + item], x, y, 0, flags);
1314 		_screen->drawShape(0, _shapes[216 + item], x, y, 0, flags);
1315 		_animator->flagAllObjectsForBkgdChange();
1316 		_animator->preserveAnyChangedBackgrounds();
1317 		_animator->flagAllObjectsForRefresh();
1318 		_animator->updateAllObjectShapes();
1319 	}
1320 	return 0;
1321 }
1322 
o1_setCharacterCurrentFrame(EMCState * script)1323 int KyraEngine_LoK::o1_setCharacterCurrentFrame(EMCState *script) {
1324 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setCharacterCurrentFrame(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1325 	_characterList[stackPos(0)].currentAnimFrame = stackPos(1);
1326 	return 0;
1327 }
1328 
o1_waitForConfirmationMouseClick(EMCState * script)1329 int KyraEngine_LoK::o1_waitForConfirmationMouseClick(EMCState *script) {
1330 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_waitForConfirmationMouseClick(%p) ()", (const void *)script);
1331 
1332 	_eventList.clear();
1333 	while (true) {
1334 		updateMousePointer();
1335 		_sprites->updateSceneAnims();
1336 		_animator->updateAllObjectShapes();
1337 
1338 		updateInput();
1339 
1340 		int input = checkInput(0, false) & 0xFF;
1341 		removeInputTop();
1342 		if (input == 200)
1343 			break;
1344 
1345 		delay(10);
1346 	}
1347 
1348 	script->regs[1] = _mouseX;
1349 	script->regs[2] = _mouseY;
1350 
1351 	return 0;
1352 }
1353 
o1_pageFlip(EMCState * script)1354 int KyraEngine_LoK::o1_pageFlip(EMCState *script) {
1355 	warning("STUB: o1_pageFlip");
1356 	return 0;
1357 }
1358 
o1_setSceneFile(EMCState * script)1359 int KyraEngine_LoK::o1_setSceneFile(EMCState *script) {
1360 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setSceneFile(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1361 	setSceneFile(stackPos(0), stackPos(1));
1362 	return 0;
1363 }
1364 
o1_getItemInMarbleVase(EMCState * script)1365 int KyraEngine_LoK::o1_getItemInMarbleVase(EMCState *script) {
1366 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getItemInMarbleVase(%p) ()", (const void *)script);
1367 	return _marbleVaseItem;
1368 }
1369 
o1_setItemInMarbleVase(EMCState * script)1370 int KyraEngine_LoK::o1_setItemInMarbleVase(EMCState *script) {
1371 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setItemInMarbleVase(%p) (%d)", (const void *)script, stackPos(0));
1372 	_marbleVaseItem = stackPos(0);
1373 	return 0;
1374 }
1375 
o1_addItemToInventory(EMCState * script)1376 int KyraEngine_LoK::o1_addItemToInventory(EMCState *script) {
1377 	warning("STUB: o1_addItemToInventory");
1378 	return 0;
1379 }
1380 
o1_intPrint(EMCState * script)1381 int KyraEngine_LoK::o1_intPrint(EMCState *script) {
1382 	warning("STUB: o1_intPrint");
1383 	return 0;
1384 }
1385 
o1_shakeScreen(EMCState * script)1386 int KyraEngine_LoK::o1_shakeScreen(EMCState *script) {
1387 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_shakeScreen(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1388 	int waitTicks = stackPos(1);
1389 	int times = stackPos(0);
1390 
1391 	for (int i = 0; i < times; ++i) {
1392 		_screen->shakeScreen(1);
1393 		delay(waitTicks * _tickLength);
1394 	}
1395 
1396 	return 0;
1397 }
1398 
o1_createAmuletJewel(EMCState * script)1399 int KyraEngine_LoK::o1_createAmuletJewel(EMCState *script) {
1400 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_createAmuletJewel(%p) (%d)", (const void *)script, stackPos(0));
1401 	seq_createAmuletJewel(stackPos(0), 0, 0, 0);
1402 	return 0;
1403 }
1404 
o1_setSceneAnimCurrXY(EMCState * script)1405 int KyraEngine_LoK::o1_setSceneAnimCurrXY(EMCState *script) {
1406 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setSceneAnimCurrXY(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
1407 	_sprites->_anims[stackPos(0)].x = stackPos(1);
1408 	_sprites->_anims[stackPos(0)].y = stackPos(2);
1409 	return 0;
1410 }
1411 
o1_poisonBrandonAndRemaps(EMCState * script)1412 int KyraEngine_LoK::o1_poisonBrandonAndRemaps(EMCState *script) {
1413 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_poisonBrandonAndRemaps(%p) ()", (const void *)script);
1414 	setBrandonPoisonFlags(1);
1415 	return 0;
1416 }
1417 
o1_fillFlaskWithWater(EMCState * script)1418 int KyraEngine_LoK::o1_fillFlaskWithWater(EMCState *script) {
1419 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_fillFlaskWithWater(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1420 	seq_fillFlaskWithWater(stackPos(0), stackPos(1));
1421 	return 0;
1422 }
1423 
o1_getCharacterMovementDelay(EMCState * script)1424 int KyraEngine_LoK::o1_getCharacterMovementDelay(EMCState *script) {
1425 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getCharacterMovementDelay(%p) (%d)", (const void *)script, stackPos(0));
1426 	return _timer->getDelay(stackPos(0) + 5);
1427 }
1428 
o1_getBirthstoneGem(EMCState * script)1429 int KyraEngine_LoK::o1_getBirthstoneGem(EMCState *script) {
1430 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getBirthstoneGem(%p) (%d)", (const void *)script, stackPos(0));
1431 	if (stackPos(0) < 4)
1432 		return _birthstoneGemTable[stackPos(0)];
1433 	return 0;
1434 }
1435 
o1_queryBrandonStatusBit(EMCState * script)1436 int KyraEngine_LoK::o1_queryBrandonStatusBit(EMCState *script) {
1437 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_queryBrandonStatusBit(%p) (%d)", (const void *)script, stackPos(0));
1438 	if (_brandonStatusBit & stackPos(0))
1439 		return 1;
1440 	return 0;
1441 }
1442 
o1_playFluteAnimation(EMCState * script)1443 int KyraEngine_LoK::o1_playFluteAnimation(EMCState *script) {
1444 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_playFluteAnimation(%p) ()", (const void *)script);
1445 	seq_playFluteAnimation();
1446 	return 0;
1447 }
1448 
o1_playWinterScrollSequence(EMCState * script)1449 int KyraEngine_LoK::o1_playWinterScrollSequence(EMCState *script) {
1450 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_playWinterScrollSequence(%p) (%d)", (const void *)script, stackPos(0));
1451 	if (!stackPos(0))
1452 		seq_winterScroll2();
1453 	else
1454 		seq_winterScroll1();
1455 	return 0;
1456 }
1457 
o1_getIdolGem(EMCState * script)1458 int KyraEngine_LoK::o1_getIdolGem(EMCState *script) {
1459 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getIdolGem(%p) (%d)", (const void *)script, stackPos(0));
1460 	return _idolGemsTable[stackPos(0)];
1461 }
1462 
o1_setIdolGem(EMCState * script)1463 int KyraEngine_LoK::o1_setIdolGem(EMCState *script) {
1464 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setIdolGem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1465 	_idolGemsTable[stackPos(0)] = stackPos(1);
1466 	return 0;
1467 }
1468 
o1_totalItemsInScene(EMCState * script)1469 int KyraEngine_LoK::o1_totalItemsInScene(EMCState *script) {
1470 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_totalItemsInScene(%p) (%d)", (const void *)script, stackPos(0));
1471 	return countItemsInScene(stackPos(0));
1472 }
1473 
o1_restoreBrandonsMovementDelay(EMCState * script)1474 int KyraEngine_LoK::o1_restoreBrandonsMovementDelay(EMCState *script) {
1475 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_restoreBrandonsMovementDelay(%p) ()", (const void *)script);
1476 	setWalkspeed(_configWalkspeed);
1477 	return 0;
1478 }
1479 
o1_setEntranceMouseCursorTrack(EMCState * script)1480 int KyraEngine_LoK::o1_setEntranceMouseCursorTrack(EMCState *script) {
1481 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setEntranceMouseCursorTrack(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
1482 	_entranceMouseCursorTracks[0] = stackPos(0);
1483 	_entranceMouseCursorTracks[1] = stackPos(1);
1484 	_entranceMouseCursorTracks[2] = stackPos(0) + stackPos(2) - 1;
1485 	_entranceMouseCursorTracks[3] = stackPos(1) + stackPos(3) - 1;
1486 	_entranceMouseCursorTracks[4] = stackPos(4);
1487 	return 0;
1488 }
1489 
o1_itemAppearsOnGround(EMCState * script)1490 int KyraEngine_LoK::o1_itemAppearsOnGround(EMCState *script) {
1491 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_itemAppearsOnGround(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
1492 	processItemDrop(_currentCharacter->sceneId, stackPos(0), stackPos(1), stackPos(2), 2, 0);
1493 	return 0;
1494 }
1495 
o1_setNoDrawShapesFlag(EMCState * script)1496 int KyraEngine_LoK::o1_setNoDrawShapesFlag(EMCState *script) {
1497 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setNoDrawShapesFlag(%p) (%d)", (const void *)script, stackPos(0));
1498 	_animator->_noDrawShapesFlag = stackPos(0);
1499 	return 0;
1500 }
1501 
o1_fadeEntirePalette(EMCState * script)1502 int KyraEngine_LoK::o1_fadeEntirePalette(EMCState *script) {
1503 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_fadeEntirePalette(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1504 	int cmd = stackPos(0);
1505 
1506 	int fadePal = 0;
1507 
1508 	if (_flags.platform == Common::kPlatformAmiga) {
1509 		if (cmd == 0) {
1510 			_screen->getPalette(2).clear();
1511 			fadePal = 2;
1512 			_screen->copyPalette(4, 0);
1513 		} else if (cmd == 1) {
1514 			fadePal = 0;
1515 			_screen->copyPalette(0, 4);
1516 		} else if (cmd == 2) {
1517 			fadePal = 0;
1518 			_screen->getPalette(2).clear();
1519 		}
1520 	} else {
1521 		if (cmd == 0) {
1522 			fadePal = 2;
1523 			_screen->getPalette(2).clear();
1524 			_screen->copyPalette(3, 0);
1525 		} else if (cmd == 1) {
1526 			//fadePal = 3;
1527 			warning("unimplemented o1_fadeEntirePalette function");
1528 			return 0;
1529 		} else if (cmd == 2) {
1530 			_screen->getPalette(2).clear();
1531 			_screen->copyPalette(0, 1);
1532 			fadePal = 0;
1533 		}
1534 	}
1535 
1536 	_screen->fadePalette(_screen->getPalette(fadePal), stackPos(1));
1537 	return 0;
1538 }
1539 
o1_itemOnGroundHere(EMCState * script)1540 int KyraEngine_LoK::o1_itemOnGroundHere(EMCState *script) {
1541 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_itemOnGroundHere(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1542 	assert(stackPos(0) < _roomTableSize);
1543 	Room *curRoom = &_roomTable[stackPos(0)];
1544 	for (int i = 0; i < 12; ++i) {
1545 		if (curRoom->itemsTable[i] == stackPos(1))
1546 			return 1;
1547 	}
1548 	return 0;
1549 }
1550 
o1_queryCauldronState(EMCState * script)1551 int KyraEngine_LoK::o1_queryCauldronState(EMCState *script) {
1552 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_queryCauldronState(%p) ()", (const void *)script);
1553 	return _cauldronState;
1554 }
1555 
o1_setCauldronState(EMCState * script)1556 int KyraEngine_LoK::o1_setCauldronState(EMCState *script) {
1557 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setCauldronState(%p) (%d)", (const void *)script, stackPos(0));
1558 	_cauldronState = stackPos(0);
1559 	return _cauldronState;
1560 }
1561 
o1_queryCrystalState(EMCState * script)1562 int KyraEngine_LoK::o1_queryCrystalState(EMCState *script) {
1563 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_queryCrystalState(%p) (%d)", (const void *)script, stackPos(0));
1564 	if (!stackPos(0))
1565 		return _crystalState[0];
1566 	else if (stackPos(0) == 1)
1567 		return _crystalState[1];
1568 	return -1;
1569 }
1570 
o1_setCrystalState(EMCState * script)1571 int KyraEngine_LoK::o1_setCrystalState(EMCState *script) {
1572 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setCrystalState(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1573 	if (!stackPos(0))
1574 		_crystalState[0] = stackPos(1);
1575 	else if (stackPos(0) == 1)
1576 		_crystalState[1] = stackPos(1);
1577 	return stackPos(1);
1578 }
1579 
o1_setPaletteRange(EMCState * script)1580 int KyraEngine_LoK::o1_setPaletteRange(EMCState *script) {
1581 	warning("STUB: o1_setPaletteRange");
1582 	return 0;
1583 }
1584 
o1_shrinkBrandonDown(EMCState * script)1585 int KyraEngine_LoK::o1_shrinkBrandonDown(EMCState *script) {
1586 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_shrinkBrandonDown(%p) (%d)", (const void *)script, stackPos(0));
1587 	int delayTime = stackPos(0);
1588 	checkAmuletAnimFlags();
1589 	int scaleValue = _scaleTable[_currentCharacter->y1];
1590 	int scale = 0;
1591 
1592 	if (_scaleMode)
1593 		scale = scaleValue;
1594 	else
1595 		scale = 256;
1596 
1597 	int scaleModeBackUp = _scaleMode;
1598 	_scaleMode = 1;
1599 	int scaleEnd = scale >> 1;
1600 	for (; scaleEnd <= scale; --scale) {
1601 		_scaleTable[_currentCharacter->y1] = scale;
1602 		_animator->animRefreshNPC(0);
1603 		delayWithTicks(1);
1604 	}
1605 	delayWithTicks(delayTime); // XXX
1606 	_scaleTable[_currentCharacter->y1] = scaleValue;
1607 	_scaleMode = scaleModeBackUp;
1608 	return 0;
1609 }
1610 
o1_growBrandonUp(EMCState * script)1611 int KyraEngine_LoK::o1_growBrandonUp(EMCState *script) {
1612 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_growBrandonUp(%p) ()", (const void *)script);
1613 	int scaleValue = _scaleTable[_currentCharacter->y1];
1614 	int scale = 0;
1615 	if (_scaleMode)
1616 		scale = scaleValue;
1617 	else
1618 		scale = 256;
1619 
1620 	int scaleModeBackUp = _scaleMode;
1621 	_scaleMode = 1;
1622 	for (int curScale = scale >> 1; curScale <= scale; ++curScale) {
1623 		_scaleTable[_currentCharacter->y1] = curScale;
1624 		_animator->animRefreshNPC(0);
1625 		delayWithTicks(1);
1626 	}
1627 	_scaleTable[_currentCharacter->y1] = scaleValue;
1628 	_scaleMode = scaleModeBackUp;
1629 	return 0;
1630 }
1631 
o1_setBrandonScaleXAndY(EMCState * script)1632 int KyraEngine_LoK::o1_setBrandonScaleXAndY(EMCState *script) {
1633 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setBrandonScaleXAndY(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1634 	_animator->_brandonScaleX = stackPos(0);
1635 	_animator->_brandonScaleY = stackPos(1);
1636 	return 0;
1637 }
1638 
o1_resetScaleMode(EMCState * script)1639 int KyraEngine_LoK::o1_resetScaleMode(EMCState *script) {
1640 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_resetScaleMode(%p) ()", (const void *)script);
1641 	_scaleMode = 0;
1642 	return 0;
1643 }
1644 
o1_getScaleDepthTableValue(EMCState * script)1645 int KyraEngine_LoK::o1_getScaleDepthTableValue(EMCState *script) {
1646 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getScaleDepthTableValue(%p) (%d)", (const void *)script, stackPos(0));
1647 	assert(stackPos(0) < ARRAYSIZE(_scaleTable));
1648 	return _scaleTable[stackPos(0)];
1649 }
1650 
o1_setScaleDepthTableValue(EMCState * script)1651 int KyraEngine_LoK::o1_setScaleDepthTableValue(EMCState *script) {
1652 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setScaleDepthTableValue(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1653 	assert(stackPos(0) < ARRAYSIZE(_scaleTable));
1654 	_scaleTable[stackPos(0)] = stackPos(1);
1655 	return stackPos(1);
1656 }
1657 
o1_message(EMCState * script)1658 int KyraEngine_LoK::o1_message(EMCState *script) {
1659 	if (_flags.isTalkie) {
1660 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_message(%p) (%d, '%s', %d)", (const void *)script, stackPos(0), stackPosString(1), stackPos(2));
1661 		drawSentenceCommand(stackPosString(1), stackPos(2));
1662 	} else {
1663 		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_message(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
1664 		drawSentenceCommand(stackPosString(0), stackPos(1));
1665 	}
1666 
1667 	return 0;
1668 }
1669 
o1_checkClickOnNPC(EMCState * script)1670 int KyraEngine_LoK::o1_checkClickOnNPC(EMCState *script) {
1671 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_checkClickOnNPC(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1672 	return checkForNPCScriptRun(stackPos(0), stackPos(1));
1673 }
1674 
o1_getFoyerItem(EMCState * script)1675 int KyraEngine_LoK::o1_getFoyerItem(EMCState *script) {
1676 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getFoyerItem(%p) (%d)", (const void *)script, stackPos(0));
1677 	assert(stackPos(0) < ARRAYSIZE(_foyerItemTable));
1678 	return _foyerItemTable[stackPos(0)];
1679 }
1680 
o1_setFoyerItem(EMCState * script)1681 int KyraEngine_LoK::o1_setFoyerItem(EMCState *script) {
1682 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setFoyerItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
1683 	assert(stackPos(0) < ARRAYSIZE(_foyerItemTable));
1684 	_foyerItemTable[stackPos(0)] = stackPos(1);
1685 	return stackPos(1);
1686 }
1687 
o1_setNoItemDropRegion(EMCState * script)1688 int KyraEngine_LoK::o1_setNoItemDropRegion(EMCState *script) {
1689 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setNoItemDropRegion(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
1690 	addToNoDropRects(stackPos(0), stackPos(1), stackPos(2), stackPos(3));
1691 	return 0;
1692 }
1693 
o1_walkMalcolmOn(EMCState * script)1694 int KyraEngine_LoK::o1_walkMalcolmOn(EMCState *script) {
1695 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_walkMalcolmOn(%p) ()", (const void *)script);
1696 	if (!_malcolmFlag)
1697 		_malcolmFlag = 1;
1698 	return 0;
1699 }
1700 
o1_passiveProtection(EMCState * script)1701 int KyraEngine_LoK::o1_passiveProtection(EMCState *script) {
1702 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_passiveProtection(%p) ()", (const void *)script);
1703 	return 1;
1704 }
1705 
o1_setPlayingLoop(EMCState * script)1706 int KyraEngine_LoK::o1_setPlayingLoop(EMCState *script) {
1707 	warning("STUB: o1_setPlayingLoop");
1708 	return 0;
1709 }
1710 
o1_brandonToStoneSequence(EMCState * script)1711 int KyraEngine_LoK::o1_brandonToStoneSequence(EMCState *script) {
1712 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_brandonToStoneSequence(%p) ()", (const void *)script);
1713 	seq_brandonToStone();
1714 	return 0;
1715 }
1716 
o1_brandonHealingSequence(EMCState * script)1717 int KyraEngine_LoK::o1_brandonHealingSequence(EMCState *script) {
1718 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_brandonHealingSequence(%p) ()", (const void *)script);
1719 	seq_brandonHealing();
1720 	return 0;
1721 }
1722 
o1_protectCommandLine(EMCState * script)1723 int KyraEngine_LoK::o1_protectCommandLine(EMCState *script) {
1724 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_protectCommandLine(%p) (%d)", (const void *)script, stackPos(0));
1725 	return stackPos(0);
1726 }
1727 
o1_pauseMusicSeconds(EMCState * script)1728 int KyraEngine_LoK::o1_pauseMusicSeconds(EMCState *script) {
1729 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_pauseMusicSeconds(%p) ()", (const void *)script);
1730 	// if music disabled
1731 	//     return
1732 	delay(stackPos(0) * 1000, true);
1733 	return 0;
1734 }
1735 
o1_resetMaskRegion(EMCState * script)1736 int KyraEngine_LoK::o1_resetMaskRegion(EMCState *script) {
1737 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_resetMaskRegion(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
1738 	_screen->fillRect(stackPos(1), stackPos(2), stackPos(1) + stackPos(3), stackPos(2) + stackPos(4), 0, 5);
1739 	return 0;
1740 }
1741 
o1_setPaletteChangeFlag(EMCState * script)1742 int KyraEngine_LoK::o1_setPaletteChangeFlag(EMCState *script) {
1743 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_setPaletteChangeFlag(%p) (%d)", (const void *)script, stackPos(0));
1744 	_paletteChanged = stackPos(0);
1745 	return _paletteChanged;
1746 }
1747 
o1_vocUnload(EMCState * script)1748 int KyraEngine_LoK::o1_vocUnload(EMCState *script) {
1749 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_vocUnload(%p) ()", (const void *)script);
1750 	// this should unload all voc files (not needed)
1751 	return 0;
1752 }
1753 
o1_vocLoad(EMCState * script)1754 int KyraEngine_LoK::o1_vocLoad(EMCState *script) {
1755 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_vocLoad(%p) (%d)", (const void *)script, stackPos(0));
1756 	// this should load the specified voc file (not needed)
1757 	return 0;
1758 }
1759 
o1_dummy(EMCState * script)1760 int KyraEngine_LoK::o1_dummy(EMCState *script) {
1761 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_dummy(%p) ()", (const void *)script);
1762 	return 0;
1763 }
1764 
1765 #pragma mark -
1766 
1767 typedef Common::Functor1Mem<EMCState *, int, KyraEngine_LoK> OpcodeV1;
1768 #define SetOpcodeTable(x) table = &x;
1769 #define Opcode(x) table->push_back(new OpcodeV1(this, &KyraEngine_LoK::x))
setupOpcodeTable()1770 void KyraEngine_LoK::setupOpcodeTable() {
1771 	Common::Array<const Opcode *> *table = 0;
1772 
1773 	_opcodes.reserve(157);
1774 	SetOpcodeTable(_opcodes);
1775 	// 0x00
1776 	Opcode(o1_magicInMouseItem);
1777 	Opcode(o1_characterSays);
1778 	Opcode(o1_delay);
1779 	Opcode(o1_drawSceneAnimShape);
1780 	// 0x04
1781 	Opcode(o1_queryGameFlag);
1782 	Opcode(o1_setGameFlag);
1783 	Opcode(o1_resetGameFlag);
1784 	Opcode(o1_runNPCScript);
1785 	// 0x08
1786 	Opcode(o1_setSpecialExitList);
1787 	Opcode(o1_blockInWalkableRegion);
1788 	Opcode(o1_blockOutWalkableRegion);
1789 	Opcode(o1_walkPlayerToPoint);
1790 	// 0x0C
1791 	Opcode(o1_dropItemInScene);
1792 	Opcode(o1_drawAnimShapeIntoScene);
1793 	Opcode(o1_setHandItem);
1794 	Opcode(o1_savePageToDisk);
1795 	// 0x10
1796 	Opcode(o1_sceneAnimOn);
1797 	Opcode(o1_sceneAnimOff);
1798 	Opcode(o1_getElapsedSeconds);
1799 	Opcode(o1_mouseIsPointer);
1800 	// 0x14
1801 	Opcode(o1_removeHandItem);
1802 	Opcode(o1_runSceneAnimUntilDone);
1803 	Opcode(o1_fadeSpecialPalette);
1804 	Opcode(o1_playSoundEffect);
1805 	// 0x18
1806 	Opcode(o1_playWanderScoreViaMap);
1807 	Opcode(o1_phaseInSameScene);
1808 	Opcode(o1_setScenePhasingFlag);
1809 	Opcode(o1_resetScenePhasingFlag);
1810 	// 0x1C
1811 	Opcode(o1_queryScenePhasingFlag);
1812 	Opcode(o1_sceneToDirection);
1813 	Opcode(o1_setBirthstoneGem);
1814 	Opcode(o1_placeItemInGenericMapScene);
1815 	// 0x20
1816 	Opcode(o1_setBrandonStatusBit);
1817 	Opcode(o1_delaySecs);
1818 	Opcode(o1_getCharacterScene);
1819 	Opcode(o1_runNPCSubscript);
1820 	// 0x24
1821 	Opcode(o1_magicOutMouseItem);
1822 	Opcode(o1_internalAnimOn);
1823 	Opcode(o1_forceBrandonToNormal);
1824 	Opcode(o1_poisonDeathNow);
1825 	// 0x28
1826 	Opcode(o1_setScaleMode);
1827 	Opcode(o1_openWSAFile);
1828 	Opcode(o1_closeWSAFile);
1829 	Opcode(o1_runWSAFromBeginningToEnd);
1830 	// 0x2C
1831 	Opcode(o1_displayWSAFrame);
1832 	Opcode(o1_enterNewScene);
1833 	Opcode(o1_setSpecialEnterXAndY);
1834 	Opcode(o1_runWSAFrames);
1835 	// 0x30
1836 	Opcode(o1_popBrandonIntoScene);
1837 	Opcode(o1_restoreAllObjectBackgrounds);
1838 	Opcode(o1_setCustomPaletteRange);
1839 	Opcode(o1_loadPageFromDisk);
1840 	// 0x34
1841 	Opcode(o1_customPrintTalkString);
1842 	Opcode(o1_restoreCustomPrintBackground);
1843 	Opcode(o1_hideMouse);
1844 	Opcode(o1_showMouse);
1845 	// 0x38
1846 	Opcode(o1_getCharacterX);
1847 	Opcode(o1_getCharacterY);
1848 	Opcode(o1_setCharacterFacing);
1849 	Opcode(o1_copyWSARegion);
1850 	// 0x3C
1851 	Opcode(o1_printText);
1852 	Opcode(o1_getRand);
1853 	Opcode(o1_loadSoundFile);
1854 	Opcode(o1_displayWSAFrameOnHidPage);
1855 	// 0x40
1856 	Opcode(o1_displayWSASequentialFrames);
1857 	Opcode(o1_refreshCharacter);
1858 	Opcode(o1_internalAnimOff);
1859 	Opcode(o1_changeCharactersXAndY);
1860 	// 0x44
1861 	Opcode(o1_clearSceneAnimatorBeacon);
1862 	Opcode(o1_querySceneAnimatorBeacon);
1863 	Opcode(o1_refreshSceneAnimator);
1864 	Opcode(o1_placeItemInOffScene);
1865 	// 0x48
1866 	Opcode(o1_wipeDownMouseItem);
1867 	Opcode(o1_placeCharacterInOtherScene);
1868 	Opcode(o1_getKey);
1869 	Opcode(o1_specificItemInInventory);
1870 	// 0x4C
1871 	Opcode(o1_popMobileNPCIntoScene);
1872 	Opcode(o1_mobileCharacterInScene);
1873 	Opcode(o1_hideMobileCharacter);
1874 	Opcode(o1_unhideMobileCharacter);
1875 	// 0x50
1876 	Opcode(o1_setCharacterLocation);
1877 	Opcode(o1_walkCharacterToPoint);
1878 	Opcode(o1_specialEventDisplayBrynnsNote);
1879 	Opcode(o1_specialEventRemoveBrynnsNote);
1880 	// 0x54
1881 	Opcode(o1_setLogicPage);
1882 	Opcode(o1_fatPrint);
1883 	Opcode(o1_preserveAllObjectBackgrounds);
1884 	Opcode(o1_updateSceneAnimations);
1885 	// 0x58
1886 	Opcode(o1_sceneAnimationActive);
1887 	Opcode(o1_setCharacterMovementDelay);
1888 	Opcode(o1_getCharacterFacing);
1889 	Opcode(o1_bkgdScrollSceneAndMasksRight);
1890 	// 0x5C
1891 	Opcode(o1_dispelMagicAnimation);
1892 	Opcode(o1_findBrightestFireberry);
1893 	Opcode(o1_setFireberryGlowPalette);
1894 	Opcode(o1_setDeathHandler);
1895 	// 0x60
1896 	Opcode(o1_drinkPotionAnimation);
1897 	Opcode(o1_makeAmuletAppear);
1898 	Opcode(o1_drawItemShapeIntoScene);
1899 	Opcode(o1_setCharacterCurrentFrame);
1900 	// 0x64
1901 	Opcode(o1_waitForConfirmationMouseClick);
1902 	Opcode(o1_pageFlip);
1903 	Opcode(o1_setSceneFile);
1904 	Opcode(o1_getItemInMarbleVase);
1905 	// 0x68
1906 	Opcode(o1_setItemInMarbleVase);
1907 	Opcode(o1_addItemToInventory);
1908 	Opcode(o1_intPrint);
1909 	Opcode(o1_shakeScreen);
1910 	// 0x6C
1911 	Opcode(o1_createAmuletJewel);
1912 	Opcode(o1_setSceneAnimCurrXY);
1913 	Opcode(o1_poisonBrandonAndRemaps);
1914 	Opcode(o1_fillFlaskWithWater);
1915 	// 0x70
1916 	Opcode(o1_getCharacterMovementDelay);
1917 	Opcode(o1_getBirthstoneGem);
1918 	Opcode(o1_queryBrandonStatusBit);
1919 	Opcode(o1_playFluteAnimation);
1920 	// 0x74
1921 	Opcode(o1_playWinterScrollSequence);
1922 	Opcode(o1_getIdolGem);
1923 	Opcode(o1_setIdolGem);
1924 	Opcode(o1_totalItemsInScene);
1925 	// 0x78
1926 	Opcode(o1_restoreBrandonsMovementDelay);
1927 	Opcode(o1_setMousePos);
1928 	Opcode(o1_getMouseState);
1929 	Opcode(o1_setEntranceMouseCursorTrack);
1930 	// 0x7C
1931 	Opcode(o1_itemAppearsOnGround);
1932 	Opcode(o1_setNoDrawShapesFlag);
1933 	Opcode(o1_fadeEntirePalette);
1934 	Opcode(o1_itemOnGroundHere);
1935 	// 0x80
1936 	Opcode(o1_queryCauldronState);
1937 	Opcode(o1_setCauldronState);
1938 	Opcode(o1_queryCrystalState);
1939 	Opcode(o1_setCrystalState);
1940 	// 0x84
1941 	Opcode(o1_setPaletteRange);
1942 	Opcode(o1_shrinkBrandonDown);
1943 	Opcode(o1_growBrandonUp);
1944 	Opcode(o1_setBrandonScaleXAndY);
1945 	// 0x88
1946 	Opcode(o1_resetScaleMode);
1947 	Opcode(o1_getScaleDepthTableValue);
1948 	Opcode(o1_setScaleDepthTableValue);
1949 	Opcode(o1_message);
1950 	// 0x8C
1951 	Opcode(o1_checkClickOnNPC);
1952 	Opcode(o1_getFoyerItem);
1953 	Opcode(o1_setFoyerItem);
1954 	Opcode(o1_setNoItemDropRegion);
1955 	// 0x90
1956 	Opcode(o1_walkMalcolmOn);
1957 	Opcode(o1_passiveProtection);
1958 	Opcode(o1_setPlayingLoop);
1959 	Opcode(o1_brandonToStoneSequence);
1960 	// 0x94
1961 	Opcode(o1_brandonHealingSequence);
1962 	Opcode(o1_protectCommandLine);
1963 	Opcode(o1_pauseMusicSeconds);
1964 	Opcode(o1_resetMaskRegion);
1965 	// 0x98
1966 	Opcode(o1_setPaletteChangeFlag);
1967 	Opcode(o1_fillRect);
1968 	Opcode(o1_vocUnload);
1969 	Opcode(o1_vocLoad);
1970 	// 0x9C
1971 	Opcode(o1_dummy);
1972 }
1973 #undef Opcode
1974 
1975 } // End of namespace Kyra
1976