2007-07-29 16:33:11 +00:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* $URL$
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "kyra/kyra_v2.h"
|
2007-10-12 00:58:59 +00:00
|
|
|
#include "kyra/text_v2.h"
|
2007-07-29 16:33:11 +00:00
|
|
|
#include "kyra/wsamovie.h"
|
|
|
|
|
|
|
|
#include "common/endian.h"
|
|
|
|
|
|
|
|
namespace Kyra {
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_setCharacterFacingRefresh(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setCharacterFacingRefresh(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
|
|
|
|
int animFrame = stackPos(2);
|
|
|
|
if (animFrame >= 0)
|
|
|
|
_mainCharacter.animFrame = animFrame;
|
|
|
|
_mainCharacter.facing = stackPos(1);
|
|
|
|
updateCharacterAnim(0);
|
|
|
|
refreshAnimObjectsIfNeed();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-13 18:53:49 +00:00
|
|
|
int KyraEngine_v2::o2_setCharacterPos(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setCharacterFacingRefresh(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
|
|
|
|
int x = stackPos(1);
|
|
|
|
int y = stackPos(2);
|
|
|
|
|
|
|
|
if (x != -1 && y != -1) {
|
|
|
|
x &= ~3;
|
|
|
|
y &= ~1;
|
|
|
|
}
|
|
|
|
|
|
|
|
restorePage3();
|
|
|
|
_mainCharacter.x2 = _mainCharacter.x1 = x;
|
|
|
|
_mainCharacter.y2 = _mainCharacter.y1 = y;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_defineObject(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_defineObject(%p) (%d, '%s', %d, %d, %d, %d)", (const void *)script,
|
|
|
|
stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
|
2007-10-14 16:58:11 +00:00
|
|
|
TalkObject *object = &_talkObjectList[stackPos(0)];
|
2007-07-29 16:33:11 +00:00
|
|
|
strcpy(object->filename, stackPosString(1));
|
|
|
|
object->scriptId = stackPos(2);
|
|
|
|
object->x = stackPos(3);
|
|
|
|
object->y = stackPos(4);
|
2007-10-12 00:58:59 +00:00
|
|
|
object->color = stackPos(5);
|
2007-07-29 16:33:11 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_refreshCharacter(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_refreshCharacter(%p) (-, %d, %d, %d)", (const void *)script, stackPos(1), stackPos(2), stackPos(3));
|
|
|
|
int unk = stackPos(1);
|
|
|
|
int facing = stackPos(2);
|
|
|
|
int refresh = stackPos(3);
|
|
|
|
if (facing >= 0)
|
|
|
|
_mainCharacter.facing = facing;
|
|
|
|
if (unk >= 0 && unk != 32)
|
|
|
|
_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
|
|
|
|
updateCharacterAnim(0);
|
|
|
|
if (refresh)
|
|
|
|
refreshAnimObjectsIfNeed();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getCharacterX(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getCharacterX(%p) ()", (const void *)script);
|
|
|
|
return _mainCharacter.x1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getCharacterY(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getCharacterY(%p) ()", (const void *)script);
|
|
|
|
return _mainCharacter.y1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getCharacterFacing(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getCharacterFacing(%p) ()", (const void *)script);
|
|
|
|
return _mainCharacter.facing;
|
|
|
|
}
|
|
|
|
|
2008-03-15 09:57:41 +00:00
|
|
|
int KyraEngine_v2::o2_getCharacterScene(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getCharacterScene(%p) ()", (const void *)script);
|
|
|
|
return _mainCharacter.sceneId;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_setSceneComment(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setSceneComment(%p) ('%s')", (const void *)script, stackPosString(0));
|
|
|
|
_sceneCommentString = stackPosString(0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-13 18:47:52 +00:00
|
|
|
int KyraEngine_v2::o2_setCharacterAnimFrame(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setCharacterAnimFrame(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
|
|
|
|
int animFrame = stackPos(1);
|
2007-10-13 18:53:02 +00:00
|
|
|
int updateAnim = stackPos(2);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-10-13 18:47:52 +00:00
|
|
|
_mainCharacter.animFrame = animFrame;
|
2007-10-13 18:53:02 +00:00
|
|
|
if (updateAnim)
|
2007-10-13 18:47:52 +00:00
|
|
|
updateCharacterAnim(0);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2_trySceneChange(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_trySceneChange(%p) (%d, %d, %d, %d)", (const void *)script,
|
|
|
|
stackPos(0), stackPos(1), stackPos(2), stackPos(3));
|
|
|
|
|
|
|
|
_unkHandleSceneChangeFlag = 1;
|
|
|
|
int success = inputSceneChange(stackPos(0), stackPos(1), stackPos(2), stackPos(3));
|
|
|
|
_unkHandleSceneChangeFlag = 0;
|
|
|
|
|
|
|
|
if (success) {
|
|
|
|
_scriptInterpreter->initScript(script, script->dataPtr);
|
|
|
|
_unk4 = 0;
|
|
|
|
_unk3 = -1;
|
|
|
|
_unk5 = 1;
|
|
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
return (_unk4 != 0) ? 1 : 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_showChapterMessage(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_showChapterMessage(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
showChapterMessage(stackPos(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_wsaClose(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_wsaClose(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
assert(stackPos(0) >= 0 && stackPos(0) < ARRAYSIZE(_wsaSlots));
|
|
|
|
_wsaSlots[stackPos(0)]->close();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_displayWsaFrame(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_displayWsaFrame(%p) (%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));
|
|
|
|
int frame = stackPos(0);
|
|
|
|
int x = stackPos(1);
|
|
|
|
int y = stackPos(2);
|
|
|
|
int waitTime = stackPos(3);
|
|
|
|
int slot = stackPos(4);
|
|
|
|
int copyParam = stackPos(5);
|
|
|
|
int doUpdate = stackPos(6);
|
|
|
|
int dstPage = stackPos(7);
|
|
|
|
int backUp = stackPos(8);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
_screen->hideMouse();
|
|
|
|
uint32 endTime = _system->getMillis() + waitTime * _tickLength;
|
|
|
|
_wsaSlots[slot]->setX(x);
|
|
|
|
_wsaSlots[slot]->setY(y);
|
|
|
|
_wsaSlots[slot]->setDrawPage(dstPage);
|
|
|
|
_wsaSlots[slot]->displayFrame(frame, copyParam | 0xC000);
|
|
|
|
_screen->updateScreen();
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (backUp)
|
|
|
|
memcpy(_gamePlayBuffer, _screen->getCPagePtr(3), 46080);
|
|
|
|
|
|
|
|
while (_system->getMillis() < endTime) {
|
|
|
|
if (doUpdate)
|
|
|
|
update();
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (endTime - _system->getMillis() >= 10)
|
|
|
|
delay(10);
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
_screen->showMouse();
|
2007-07-29 16:33:11 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_displayWsaSequentialFrames(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_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));
|
|
|
|
int startFrame = stackPos(0);
|
|
|
|
int endFrame = stackPos(1);
|
|
|
|
int x = stackPos(2);
|
|
|
|
int y = stackPos(3);
|
|
|
|
int waitTime = stackPos(4);
|
|
|
|
int slot = stackPos(5);
|
|
|
|
int maxTimes = stackPos(6);
|
|
|
|
int copyFlags = stackPos(7);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (maxTimes > 1)
|
|
|
|
maxTimes = 1;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
_wsaSlots[slot]->setX(x);
|
|
|
|
_wsaSlots[slot]->setY(y);
|
|
|
|
_wsaSlots[slot]->setDrawPage(0);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
_screen->hideMouse();
|
|
|
|
int curTime = 0;
|
|
|
|
while (curTime < maxTimes) {
|
|
|
|
if (startFrame < endFrame) {
|
|
|
|
for (int i = startFrame; i <= endFrame; ++i) {
|
|
|
|
uint32 endTime = _system->getMillis() + waitTime * _tickLength;
|
|
|
|
_wsaSlots[slot]->displayFrame(i, 0xC000 | copyFlags);
|
|
|
|
_screen->updateScreen();
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
do {
|
|
|
|
update();
|
|
|
|
|
|
|
|
if (endTime - _system->getMillis() >= 10)
|
|
|
|
delay(10);
|
|
|
|
} while (_system->getMillis() < endTime);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for (int i = startFrame; i >= endFrame; --i) {
|
|
|
|
uint32 endTime = _system->getMillis() + waitTime * _tickLength;
|
|
|
|
_wsaSlots[slot]->displayFrame(i, 0xC000 | copyFlags);
|
|
|
|
_screen->updateScreen();
|
|
|
|
|
|
|
|
do {
|
|
|
|
update();
|
|
|
|
|
|
|
|
if (endTime - _system->getMillis() >= 10)
|
|
|
|
delay(10);
|
|
|
|
} while (_system->getMillis() < endTime);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
++curTime;
|
|
|
|
}
|
|
|
|
_screen->showMouse();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_wsaOpen(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_wsaOpen(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
|
|
|
|
assert(stackPos(1) >= 0 && stackPos(1) < ARRAYSIZE(_wsaSlots));
|
|
|
|
_wsaSlots[stackPos(1)]->open(stackPosString(0), 1, 0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-13 19:17:58 +00:00
|
|
|
int KyraEngine_v2::o2_checkForItem(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_checkForItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
return findItem(stackPos(0), stackPos(1)) == -1 ? 0 : 1;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_defineItem(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_defineItem(%p) (%d, %d, %d, %d)", (const void *)script,
|
|
|
|
stackPos(0), stackPos(1), stackPos(2), stackPos(3));
|
|
|
|
int freeItem = findFreeItem();
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (freeItem >= 0) {
|
|
|
|
_itemList[freeItem].id = stackPos(0);
|
|
|
|
_itemList[freeItem].x = stackPos(1);
|
|
|
|
_itemList[freeItem].y = stackPos(2);
|
|
|
|
_itemList[freeItem].sceneId = stackPos(3);
|
|
|
|
}
|
|
|
|
|
|
|
|
return freeItem;
|
|
|
|
}
|
|
|
|
|
2007-10-13 19:17:58 +00:00
|
|
|
int KyraEngine_v2::o2_countItemInInventory(ScriptState *script) {
|
2008-03-15 10:55:32 +00:00
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_countItemInInventory(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
uint16 item = stackPos(1);
|
2007-10-13 19:17:58 +00:00
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
for (int i = 0; i < 20; ++i) {
|
|
|
|
if (_mainCharacter.inventory[i] == item)
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
|
2008-03-15 10:55:32 +00:00
|
|
|
if ((stackPos(0) == 0) && _itemInHand == int16(item))
|
2007-10-13 19:17:58 +00:00
|
|
|
++count;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-10-13 19:17:58 +00:00
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_queryGameFlag(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_queryGameFlag(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
return queryGameFlag(stackPos(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_resetGameFlag(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_resetGameFlag(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
return resetGameFlag(stackPos(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_setGameFlag(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setGameFlag(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
return setGameFlag(stackPos(0));
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2_setHandItem(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setHandItem(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
setHandItem(stackPos(0));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-11-12 17:56:49 +00:00
|
|
|
int KyraEngine_v2::o2_removeHandItem(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_removeHandItem(%p) ()", (const void *)script);
|
|
|
|
removeHandItem();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2_handItemSet(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_handItemSet(%p) ()", (const void *)script);
|
|
|
|
return _handItemSet;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_hideMouse(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_hideMouse(%p) ()", (const void *)script);
|
|
|
|
_screen->hideMouse();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_addSpecialExit(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_addSpecialExit(%p) (%d, %d, %d, %d, %d)", (const void *)script,
|
|
|
|
stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
|
|
|
|
if (_specialExitCount < 5) {
|
|
|
|
_specialExitTable[_specialExitCount+0] = stackPos(0);
|
|
|
|
_specialExitTable[_specialExitCount+5] = stackPos(1);
|
2007-10-10 05:22:29 +00:00
|
|
|
_specialExitTable[_specialExitCount+10] = stackPos(2) + stackPos(0) - 1;
|
|
|
|
_specialExitTable[_specialExitCount+15] = stackPos(3) + stackPos(1) - 1;
|
2007-07-29 16:33:11 +00:00
|
|
|
_specialExitTable[_specialExitCount+20] = stackPos(4);
|
|
|
|
++_specialExitCount;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-13 19:17:58 +00:00
|
|
|
int KyraEngine_v2::o2_setMousePos(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setMousePos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
_system->warpMouse(stackPos(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_showMouse(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_showMouse(%p) ()", (const void *)script);
|
|
|
|
_screen->showMouse();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-03-15 09:57:41 +00:00
|
|
|
int KyraEngine_v2::o2_delaySecs(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_delaySecs(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
delay(stackPos(0) * 1000, true);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2_delay(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_delay(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
//if (stackPos(1))
|
|
|
|
// sub_27100(stackPos(0) * _tickLength);
|
|
|
|
//else
|
2007-10-13 18:47:52 +00:00
|
|
|
delay(stackPos(0) * _tickLength, true);
|
2007-10-09 08:44:45 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_setScaleTableItem(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setScaleTableItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
setScaleTableItem(stackPos(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_setDrawLayerTableItem(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setDrawLayerTableItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
setDrawLayerTableEntry(stackPos(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2_setCharPalEntry(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setCharPalEntry(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
setCharPalEntry(stackPos(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_drawSceneShape(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_drawSceneShape(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1),
|
|
|
|
stackPos(2), stackPos(3));
|
|
|
|
|
|
|
|
int shape = stackPos(0);
|
|
|
|
int x = stackPos(1);
|
|
|
|
int y = stackPos(2);
|
|
|
|
int flag = (stackPos(3) != 0) ? 1 : 0;
|
|
|
|
|
|
|
|
_screen->hideMouse();
|
|
|
|
restorePage3();
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
_screen->drawShape(2, _sceneShapeTable[shape], x, y, 2, flag);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
memcpy(_gamePlayBuffer, _screen->getCPagePtr(3), 46080);
|
|
|
|
|
|
|
|
_screen->drawShape(0, _sceneShapeTable[shape], x, y, 2, flag);
|
|
|
|
|
|
|
|
//sub_B521();
|
|
|
|
flagAnimObjsForRefresh();
|
|
|
|
refreshAnimObjectsIfNeed();
|
|
|
|
_screen->showMouse();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_drawSceneShapeOnPage(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_drawSceneShapeOnPage(%p) (%d, %d, %d, %d, %d)", (const void *)script,
|
|
|
|
stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
|
|
|
|
int shape = stackPos(0);
|
|
|
|
int x = stackPos(1);
|
|
|
|
int y = stackPos(2);
|
|
|
|
int flag = stackPos(3);
|
|
|
|
int drawPage = stackPos(4);
|
2007-12-24 22:27:30 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
_screen->drawShape(drawPage, _sceneShapeTable[shape], x, y, 2, flag ? 1 : 0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_restoreBackBuffer(ScriptState *script) {
|
2007-07-29 17:37:08 +00:00
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_restoreBackBuffer(%p) (%d)", (const void *)script, stackPos(0));
|
2007-07-29 16:33:11 +00:00
|
|
|
int disable = stackPos(0);
|
|
|
|
int oldState = 0;
|
2007-12-24 22:27:30 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (disable) {
|
|
|
|
oldState = _animObjects[0].enabled;
|
|
|
|
_animObjects[0].enabled = 0;
|
|
|
|
}
|
2007-12-24 22:27:30 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
restorePage3();
|
2007-12-24 22:27:30 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (disable)
|
|
|
|
_animObjects[0].enabled = oldState;
|
2007-12-24 22:27:30 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2_update(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_update(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
|
|
|
|
int times = stackPos(0);
|
|
|
|
while (times--) {
|
2007-10-12 00:58:59 +00:00
|
|
|
if (_chatText)
|
|
|
|
updateWithText();
|
|
|
|
else
|
2007-10-09 08:44:45 +00:00
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2008-01-27 19:47:41 +00:00
|
|
|
return 0;
|
2007-10-09 08:44:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_fadeScenePal(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_fadeScenePal(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
fadeScenePal(stackPos(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_enterNewSceneEx(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_enterNewSceneEx(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0),
|
|
|
|
stackPos(1), stackPos(2), stackPos(3), stackPos(4));
|
|
|
|
|
2008-02-17 21:58:46 +00:00
|
|
|
int skipNpcScript = stackPos(3);
|
|
|
|
enterNewScene(stackPos(0), stackPos(1), stackPos(2), skipNpcScript, stackPos(4));
|
2007-10-09 08:44:45 +00:00
|
|
|
|
2008-02-17 21:58:46 +00:00
|
|
|
if (!skipNpcScript)
|
2007-10-09 08:44:45 +00:00
|
|
|
runSceneScript4(0);
|
|
|
|
|
|
|
|
_unk5 = 1;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
if (_mainCharX == -1 || _mainCharY == -1) {
|
|
|
|
_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
|
|
|
|
updateCharacterAnim(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 09:15:12 +00:00
|
|
|
int KyraEngine_v2::o2_switchScene(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_switchScene(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
setGameFlag(0x1EF);
|
|
|
|
_mainCharX = _mainCharacter.x1;
|
|
|
|
_mainCharY = _mainCharacter.y1;
|
|
|
|
_noScriptEnter = 0;
|
|
|
|
enterNewScene(stackPos(0), _mainCharacter.facing, 0, 0, 0);
|
|
|
|
_noScriptEnter = 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getShapeFlag1(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getShapeFlag1(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
return _screen->getShapeFlag1(stackPos(0), stackPos(1));
|
|
|
|
}
|
|
|
|
|
2007-10-09 04:47:41 +00:00
|
|
|
int KyraEngine_v2::o2_setLayerFlag(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setLayerFlag(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
int layer = stackPos(0);
|
|
|
|
if (layer >= 1 && layer <= 16)
|
|
|
|
_layerFlagTable[layer] = 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2_setZanthiaPos(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setZanthiaPos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
_mainCharX = stackPos(0);
|
|
|
|
_mainCharY = stackPos(1);
|
|
|
|
|
|
|
|
if (_mainCharX == -1 && _mainCharY == -1)
|
|
|
|
_mainCharacter.animFrame = 32;
|
|
|
|
else
|
|
|
|
_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-10 09:06:15 +00:00
|
|
|
int KyraEngine_v2::o2_loadMusicTrack(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_loadMusicTrack(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
snd_loadSoundFile(stackPos(0));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_playWanderScoreViaMap(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_playWanderScoreViaMap(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
snd_playWanderScoreViaMap(stackPos(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_playSoundEffect(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_playSoundEffect(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
snd_playSoundEffect(stackPos(0));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_getRand(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getRand(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
assert(stackPos(0) < stackPos(1));
|
|
|
|
return _rnd.getRandomNumberRng(stackPos(0), stackPos(1));
|
|
|
|
}
|
|
|
|
|
2008-03-15 09:57:41 +00:00
|
|
|
int KyraEngine_v2::o2_fillRect(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_fillRect(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
|
|
|
|
_screen->fillRect(stackPos(1), stackPos(2), stackPos(1)+stackPos(3), stackPos(2)+stackPos(4), stackPos(5), stackPos(0));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_encodeShape(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_encodeShape(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1),
|
|
|
|
stackPos(2), stackPos(3), stackPos(4));
|
|
|
|
_sceneShapeTable[stackPos(0)] = _screen->encodeShape(stackPos(1), stackPos(2), stackPos(3), stackPos(4), 2);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_defineRoomEntrance(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_defineRoomEntrance(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
|
|
|
|
switch (stackPos(0)) {
|
|
|
|
case 0:
|
|
|
|
_sceneEnterX1 = stackPos(1);
|
|
|
|
_sceneEnterY1 = stackPos(2);
|
|
|
|
break;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
case 1:
|
|
|
|
_sceneEnterX2 = stackPos(1);
|
|
|
|
_sceneEnterY2 = stackPos(2);
|
|
|
|
break;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
case 2:
|
|
|
|
_sceneEnterX3 = stackPos(1);
|
|
|
|
_sceneEnterY3 = stackPos(2);
|
|
|
|
break;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
case 3:
|
|
|
|
_sceneEnterX4 = stackPos(1);
|
|
|
|
_sceneEnterY4 = stackPos(2);
|
|
|
|
break;
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2_runTemporaryScript(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_runTemporaryScript(%p) ('%s', %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1),
|
|
|
|
stackPos(2), stackPos(3));
|
|
|
|
|
2007-10-09 09:03:57 +00:00
|
|
|
runTemporaryScript(stackPosString(0), stackPos(3), stackPos(2) ? 1 : 0, stackPos(1), stackPos(2));
|
2007-10-09 08:44:45 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_setSpecialSceneScriptRunTime(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setSpecialSceneScriptRunTime(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
assert(stackPos(0) >= 0 && stackPos(0) < 10);
|
|
|
|
_sceneSpecialScriptsTimer[stackPos(0)] = _system->getMillis() + stackPos(1) * _tickLength;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_defineSceneAnim(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_defineSceneAnim(%p) (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s')", (const void *)script,
|
|
|
|
stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8),
|
|
|
|
stackPos(9), stackPos(10), stackPos(11), stackPosString(12));
|
|
|
|
int animId = stackPos(0);
|
|
|
|
SceneAnim &anim = _sceneAnims[animId];
|
|
|
|
anim.flags = stackPos(1);
|
|
|
|
anim.x = stackPos(2);
|
|
|
|
anim.y = stackPos(3);
|
|
|
|
anim.x2 = stackPos(4);
|
|
|
|
anim.y2 = stackPos(5);
|
|
|
|
anim.width = stackPos(6);
|
|
|
|
anim.height = stackPos(7);
|
|
|
|
anim.unkE = stackPos(8);
|
|
|
|
anim.specialSize = stackPos(9);
|
|
|
|
anim.unk12 = stackPos(10);
|
|
|
|
anim.shapeIndex = stackPos(11);
|
|
|
|
if (stackPosString(12) != 0)
|
|
|
|
strcpy(anim.filename, stackPosString(12));
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (anim.flags & 0x40) {
|
|
|
|
if (!_sceneAnimMovie[animId]->open(anim.filename, 1, 0))
|
|
|
|
error("couldn't load '%s'", anim.filename);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (_sceneAnimMovie[animId]->xAdd() || _sceneAnimMovie[animId]->yAdd())
|
|
|
|
anim.wsaFlag = 1;
|
|
|
|
else
|
|
|
|
anim.wsaFlag = 0;
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_updateSceneAnim(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_updateSceneAnim(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
updateSceneAnim(stackPos(0), stackPos(1));
|
|
|
|
_specialSceneScriptRunFlag = false;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-02-17 02:06:04 +00:00
|
|
|
int KyraEngine_v2::o2_useItemOnMainChar(ScriptState *script) {
|
|
|
|
ScriptState tmpScript;
|
|
|
|
_scriptInterpreter->initScript(&tmpScript, &_npcScriptData);
|
|
|
|
_scriptInterpreter->startScript(&tmpScript, 0);
|
|
|
|
tmpScript.regs[4] = _itemInHand;
|
|
|
|
tmpScript.regs[0] = _mainCharacter.sceneId;
|
|
|
|
|
|
|
|
int oldVocH = _vocHigh;
|
|
|
|
_vocHigh = 0x5a;
|
|
|
|
|
|
|
|
while(_scriptInterpreter->validScript(&tmpScript))
|
|
|
|
_scriptInterpreter->runScript(&tmpScript);
|
|
|
|
|
|
|
|
_vocHigh = oldVocH;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_startDialogue(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_startDialogue(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
startDialogue(stackPos(0));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-02-22 00:33:56 +00:00
|
|
|
int KyraEngine_v2::o2_zanthRandomChat(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_zanthRandomChat(%p)", (const void *)script);
|
|
|
|
zanthRandomChat();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-02-17 02:06:04 +00:00
|
|
|
int KyraEngine_v2::o2_setupDialogue(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setupDialogue(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
setNewDlgIndex(stackPos(0));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getDlgIndex(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setNewDlgIndex(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
return _mainCharacter.dlgIndex;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_defineRoom(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_defineRoom(%p) (%d, '%s', %d, %d, %d, %d, %d, %d)", (const void *)script,
|
|
|
|
stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
|
|
|
|
SceneDesc *scene = &_sceneList[stackPos(0)];
|
|
|
|
strcpy(scene->filename, stackPosString(1));
|
|
|
|
scene->exit1 = stackPos(2);
|
|
|
|
scene->exit2 = stackPos(3);
|
|
|
|
scene->exit3 = stackPos(4);
|
|
|
|
scene->exit4 = stackPos(5);
|
|
|
|
scene->flags = stackPos(6);
|
|
|
|
scene->sound = stackPos(7);
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
if (_mainCharacter.sceneId == stackPos(0)) {
|
|
|
|
_sceneExit1 = scene->exit1;
|
|
|
|
_sceneExit2 = scene->exit2;
|
|
|
|
_sceneExit3 = scene->exit3;
|
|
|
|
_sceneExit4 = scene->exit4;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-03-09 14:46:24 +00:00
|
|
|
int KyraEngine_v2::o2_addCauldronStateTableEntry(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_addCauldronStateTableEntry(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
return addToCauldronStateTable(stackPos(0), stackPos(1)) ? 1 : 0;
|
|
|
|
}
|
|
|
|
|
2008-02-18 23:04:37 +00:00
|
|
|
int KyraEngine_v2::o2_setCountDown(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setCountDown(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
_scriptCountDown = _system->getMillis() + stackPos(0) * _tickLength;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getCountDown(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getCountDown(%p)", (const void *)script);
|
|
|
|
uint32 time = _system->getMillis();
|
2008-02-18 23:22:22 +00:00
|
|
|
return (time > _scriptCountDown) ? 0 : (_scriptCountDown - time) / _tickLength;
|
2008-02-18 23:04:37 +00:00
|
|
|
}
|
|
|
|
|
2008-01-28 22:21:47 +00:00
|
|
|
int KyraEngine_v2::o2_objectChat(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_objectChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
|
|
|
|
if (_flags.isTalkie)
|
|
|
|
warning("Unexpected call: o2_objectChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
|
|
|
|
else
|
|
|
|
objectChat(stackPosString(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-02-17 02:06:04 +00:00
|
|
|
int KyraEngine_v2::o2_getColorCodeFlag1(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getColorCodeFlag1(%p)", (const void *)script);
|
|
|
|
return _colorCodeFlag1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_setColorCodeFlag1(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getColorCodeFlag1(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
_colorCodeFlag1 = stackPos(0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getColorCodeFlag2(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getColorCodeFlag2(%p)", (const void *)script);
|
|
|
|
return _colorCodeFlag2;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_setColorCodeFlag2(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getColorCodeFlag2(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
_colorCodeFlag2 = stackPos(0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-02-18 23:04:37 +00:00
|
|
|
int KyraEngine_v2::o2_getColorCodeValue(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getColorCodeValue(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
return _colorCode[stackPos(0)];
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_setColorCodeValue(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setColorCodeValue(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
_colorCode[stackPos(0)] = stackPos(1) & 0xff;
|
|
|
|
return stackPos(1) & 0xff;
|
|
|
|
}
|
|
|
|
|
2007-10-13 19:17:58 +00:00
|
|
|
int KyraEngine_v2::o2_countItemInstances(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_countItemInstances(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
uint16 item = stackPos(0);
|
|
|
|
|
|
|
|
int count = 0;
|
|
|
|
for (int i = 0; i < 20; ++i) {
|
|
|
|
if (_mainCharacter.inventory[i] == item)
|
|
|
|
++count;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_itemInHand == int16(item))
|
|
|
|
++count;
|
|
|
|
|
|
|
|
for (int i = 0; i < 30; ++i) {
|
|
|
|
if (_itemList[i].id == item)
|
|
|
|
++count;
|
|
|
|
}
|
2008-01-27 19:47:41 +00:00
|
|
|
|
2007-11-13 15:49:21 +00:00
|
|
|
if (_hiddenItems[0] == item && _newChapterFile == 1)
|
2007-10-13 19:17:58 +00:00
|
|
|
++count;
|
2007-11-13 15:49:21 +00:00
|
|
|
if (_hiddenItems[1] == item && _newChapterFile == 1)
|
2007-10-13 19:17:58 +00:00
|
|
|
++count;
|
2007-11-13 15:49:21 +00:00
|
|
|
if (_hiddenItems[2] == item && _newChapterFile == 2)
|
2007-10-13 19:17:58 +00:00
|
|
|
++count;
|
2007-11-13 15:49:21 +00:00
|
|
|
if (_hiddenItems[3] == item && _newChapterFile == 2)
|
|
|
|
++count;
|
|
|
|
if (_hiddenItems[4] == item && _newChapterFile == 1)
|
2007-10-13 19:17:58 +00:00
|
|
|
++count;
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
2007-10-14 16:58:11 +00:00
|
|
|
int KyraEngine_v2::o2_initObject(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_initObject(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
initTalkObject(stackPos(0));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-02-17 02:06:04 +00:00
|
|
|
int KyraEngine_v2::o2_npcChat(ScriptState *script) {
|
|
|
|
if (_flags.isTalkie) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_npcChat(%p) ('%s', %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), _vocHigh, stackPos(2));
|
|
|
|
npcChatSequence(stackPosString(0), stackPos(1), _vocHigh, stackPos(2));
|
|
|
|
} else {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_npcChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
|
|
|
|
npcChatSequence(stackPosString(0), stackPos(1));
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-14 16:58:11 +00:00
|
|
|
int KyraEngine_v2::o2_deinitObject(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_deinitObject(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
deinitTalkObject(stackPos(0));
|
2007-11-12 17:56:49 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2007-10-14 16:58:11 +00:00
|
|
|
|
2007-11-12 17:56:49 +00:00
|
|
|
int KyraEngine_v2::o2_makeBookOrCauldronAppear(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_makeBookOrCauldronAppear(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
seq_makeBookOrCauldronAppear(stackPos(0));
|
2007-10-14 16:58:11 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_setSpecialSceneScriptState(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setSpecialSceneScriptState(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
_specialSceneScriptState[stackPos(0)] = 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_clearSpecialSceneScriptState(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_clearSpecialSceneScriptState(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
_specialSceneScriptState[stackPos(0)] = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_querySpecialSceneScriptState(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_querySpecialSceneScriptState(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
return _specialSceneScriptState[stackPos(0)];
|
|
|
|
}
|
|
|
|
|
2007-11-13 15:49:21 +00:00
|
|
|
int KyraEngine_v2::o2_setHiddenItemsEntry(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setHiddenItemsEntry(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
2007-12-24 22:27:30 +00:00
|
|
|
return (_hiddenItems[stackPos(0)] = stackPos(1));
|
2007-11-13 15:49:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getHiddenItemsEntry(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getHiddenItemsEntry(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
return _hiddenItems[stackPos(0)];
|
|
|
|
}
|
|
|
|
|
2008-02-22 00:33:56 +00:00
|
|
|
int KyraEngine_v2::o2_mushroomEffect(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_mushroomEffect(%p)", (const void *)script);
|
|
|
|
memcpy(_screen->getPalette(1), _screen->_currentPalette, 768);
|
|
|
|
|
|
|
|
for (int i = 1; i < 768; i += 3)
|
|
|
|
_screen->_currentPalette[i] = 0;
|
|
|
|
snd_playSoundEffect(106);
|
|
|
|
_screen->fadePalette(_screen->_currentPalette, 90, &_updateFunctor);
|
|
|
|
memcpy(_screen->_currentPalette, _screen->getPalette(1), 768);
|
|
|
|
|
|
|
|
for (int i = 0; i < 768; i += 3) {
|
|
|
|
_screen->_currentPalette[i] = _screen->_currentPalette[i + 1] = 0;
|
|
|
|
_screen->_currentPalette[i + 2] += (((int8)_screen->_currentPalette[i + 2]) >> 1);
|
|
|
|
if (_screen->_currentPalette[i + 2] > 63)
|
|
|
|
_screen->_currentPalette[i + 2] = 63;
|
|
|
|
}
|
|
|
|
snd_playSoundEffect(106);
|
|
|
|
_screen->fadePalette(_screen->_currentPalette, 90, &_updateFunctor);
|
2008-02-22 07:00:12 +00:00
|
|
|
|
|
|
|
memcpy(_screen->_currentPalette, _screen->getPalette(1), 768);
|
|
|
|
_screen->fadePalette(_screen->_currentPalette, 30, &_updateFunctor);
|
2008-02-22 00:33:56 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-12 00:58:59 +00:00
|
|
|
int KyraEngine_v2::o2_customChat(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_customChat(%p) ('%s', %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2));
|
|
|
|
strcpy((char*)_unkBuf500Bytes, stackPosString(0));
|
|
|
|
_chatText = (char*)_unkBuf500Bytes;
|
|
|
|
_chatObject = stackPos(1);
|
2007-10-13 06:57:47 +00:00
|
|
|
|
|
|
|
_chatVocHigh = _chatVocLow = -1;
|
|
|
|
objectChatInit(_chatText, _chatObject, _vocHigh, stackPos(2));
|
|
|
|
playVoice(_vocHigh, stackPos(2));
|
2007-10-12 00:58:59 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_customChatFinish(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_customChatFinish(%p) ()", (const void *)script);
|
|
|
|
_text->restoreScreen();
|
|
|
|
_chatText = 0;
|
|
|
|
_chatObject = -1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-02-18 23:04:37 +00:00
|
|
|
int KyraEngine_v2::o2_getBoolFromStack(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getBoolFromStack(%p) ()", (const void *)script);
|
|
|
|
return stackPos(0) ? 1 : 0;
|
|
|
|
}
|
|
|
|
|
2007-10-13 06:57:47 +00:00
|
|
|
int KyraEngine_v2::o2_setVocHigh(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_setVocHigh(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
_vocHigh = stackPos(0);
|
|
|
|
return _vocHigh;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_getVocHigh(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getVocHigh(%p) ()", (const void *)script);
|
|
|
|
return _vocHigh;
|
|
|
|
}
|
|
|
|
|
2007-10-12 00:58:59 +00:00
|
|
|
int KyraEngine_v2::o2_zanthiaChat(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_zanthiaChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
|
2007-10-13 06:57:47 +00:00
|
|
|
objectChat(stackPosString(0), 0, _vocHigh, stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_isVoiceEnabled(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_isVoiceEnabled(%p) ()", (const void *)script);
|
2008-01-27 15:53:09 +00:00
|
|
|
return speechEnabled() ? 1 : 0;
|
2007-10-13 06:57:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_isVoicePlaying(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_isVoicePlaying(%p) ()", (const void *)script);
|
|
|
|
return snd_voiceIsPlaying() ? 1 : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2_stopVoicePlaying(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_stopVoicePlaying(%p) ()", (const void *)script);
|
|
|
|
snd_stopVoice();
|
2007-10-12 00:58:59 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-13 06:57:47 +00:00
|
|
|
int KyraEngine_v2::o2_getGameLanguage(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_getGameLanguage(%p) ()", (const void *)script);
|
|
|
|
return _lang;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
int KyraEngine_v2::o2_dummy(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2_dummy(%p) ()", (const void *)script);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
#pragma mark -
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2t_defineNewShapes(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2t_defineNewShapes(%p) ('%s', %d, %d, %d, %d, %d, %d)", (const void *)script, stackPosString(0),
|
|
|
|
stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6));
|
|
|
|
|
|
|
|
strcpy(_newShapeFilename, stackPosString(0));
|
|
|
|
_newShapeLastEntry = stackPos(1);
|
|
|
|
_newShapeWidth = stackPos(2);
|
|
|
|
_newShapeHeight = stackPos(3);
|
|
|
|
_newShapeXAdd = stackPos(4);
|
|
|
|
_newShapeYAdd = stackPos(5);
|
|
|
|
//word_324EB = stackPos(6); <- never used
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int KyraEngine_v2::o2t_setCurrentFrame(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2t_setCurrentFrame(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
_newShapeAnimFrame = stackPos(0);
|
|
|
|
_newShapeDelay = stackPos(1);
|
|
|
|
_temporaryScriptExecBit = true;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-10 09:06:15 +00:00
|
|
|
int KyraEngine_v2::o2t_playSoundEffect(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2t_playSoundEffect(%p) (%d)", (const void *)script, stackPos(0));
|
|
|
|
snd_playSoundEffect(stackPos(0));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-11-13 15:49:21 +00:00
|
|
|
int KyraEngine_v2::o2t_fadeScenePal(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2t_fadeScenePal(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
|
|
|
|
fadeScenePal(stackPos(0), stackPos(1));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-10-09 08:44:45 +00:00
|
|
|
int KyraEngine_v2::o2t_setShapeFlag(ScriptState *script) {
|
|
|
|
debugC(3, kDebugLevelScriptFuncs, "o2t_setShapeFlag(%p) (%d)", (const void *)script, stackPos(0));
|
2008-01-28 22:21:47 +00:00
|
|
|
if (_flags.isTalkie)
|
|
|
|
_newShapeFlag = stackPos(0);
|
2007-10-09 08:44:45 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
} // end of namespace Kyra
|
2007-12-24 22:27:30 +00:00
|
|
|
|
2008-01-28 22:21:47 +00:00
|
|
|
|
2008-02-17 02:06:04 +00:00
|
|
|
|
2008-02-18 23:04:37 +00:00
|
|
|
|