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