Logo Search packages:      
Sourcecode: scummvm version File versions  Download package

script_v2.cpp

/* 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: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/tags/release-0-11-1/engines/kyra/script_v2.cpp $
 * $Id: script_v2.cpp 30944 2008-02-23 22:50:18Z sev $
 *
 */

#include "kyra/kyra_v2.h"
#include "kyra/text_v2.h"
#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;
}

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;
}

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));
      TalkObject *object = &_talkObjectList[stackPos(0)];
      strcpy(object->filename, stackPosString(1));
      object->scriptId = stackPos(2);
      object->x = stackPos(3);
      object->y = stackPos(4);
      object->color = stackPos(5);
      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;
}

int KyraEngine_v2::o2_setSceneComment(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_setSceneComment(%p) ('%s')", (const void *)script, stackPosString(0));
      _sceneCommentString = stackPosString(0);
      return 0;
}

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);
      int updateAnim = stackPos(2);
      
      _mainCharacter.animFrame = animFrame;
      if (updateAnim)
            updateCharacterAnim(0);

      return 0;
}

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;
      }
}

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);
      
      _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();
      
      if (backUp)
            memcpy(_gamePlayBuffer, _screen->getCPagePtr(3), 46080);

      while (_system->getMillis() < endTime) {
            if (doUpdate)
                  update();
            
            if (endTime - _system->getMillis() >= 10)
                  delay(10);
      }
      _screen->showMouse();   
      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);
      
      if (maxTimes > 1)
            maxTimes = 1;
      
      _wsaSlots[slot]->setX(x);
      _wsaSlots[slot]->setY(y);
      _wsaSlots[slot]->setDrawPage(0);
      
      _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();
                        
                        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;
}

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;
}

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();
      
      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;
}

int KyraEngine_v2::o2_countItemInInventory(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_countItemInInventory(%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;
      
      return count;
}

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));
}

int KyraEngine_v2::o2_setHandItem(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_setHandItem(%p) (%d)", (const void *)script, stackPos(0));
      setHandItem(stackPos(0));
      return 0;
}

int KyraEngine_v2::o2_removeHandItem(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_removeHandItem(%p) ()", (const void *)script);
      removeHandItem();
      return 0;
}

int KyraEngine_v2::o2_handItemSet(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_handItemSet(%p) ()", (const void *)script);
      return _handItemSet;
}

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);
            _specialExitTable[_specialExitCount+10] = stackPos(2) + stackPos(0) - 1;
            _specialExitTable[_specialExitCount+15] = stackPos(3) + stackPos(1) - 1;
            _specialExitTable[_specialExitCount+20] = stackPos(4);
            ++_specialExitCount;
      }
      return 0;
}

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;
}

int KyraEngine_v2::o2_showMouse(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_showMouse(%p) ()", (const void *)script);
      _screen->showMouse();
      return 0;
}

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
            delay(stackPos(0) * _tickLength, true);
      return 0;
}

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;
}

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();
      
      _screen->drawShape(2, _sceneShapeTable[shape], x, y, 2, flag);
      
      memcpy(_gamePlayBuffer, _screen->getCPagePtr(3), 46080);

      _screen->drawShape(0, _sceneShapeTable[shape], x, y, 2, flag);

      //sub_B521();
      flagAnimObjsForRefresh();
      refreshAnimObjectsIfNeed();
      _screen->showMouse();
      return 0;
}

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);

      _screen->drawShape(drawPage, _sceneShapeTable[shape], x, y, 2, flag ? 1 : 0);
      return 0;
}

int KyraEngine_v2::o2_restoreBackBuffer(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_restoreBackBuffer(%p) (%d)", (const void *)script, stackPos(0));
      int disable = stackPos(0);
      int oldState = 0;

      if (disable) {
            oldState = _animObjects[0].enabled;
            _animObjects[0].enabled = 0;
      }

      restorePage3();

      if (disable)
            _animObjects[0].enabled = oldState;

      return 0;
}

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--) {
            if (_chatText)
                  updateWithText();
            else
                  update();
      }

      return 0;   
}

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));

      enterNewScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));

      if (!stackPos(3))
            runSceneScript4(0);

      _unk5 = 1;
      
      if (_mainCharX == -1 || _mainCharY == -1) {
            _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
            updateCharacterAnim(0);
      }

      return 0;
}

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));
}

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;
}

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;
}

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;
}

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));
}

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;
      
      case 1:
            _sceneEnterX2 = stackPos(1);
            _sceneEnterY2 = stackPos(2);
            break;
      
      case 2:
            _sceneEnterX3 = stackPos(1);
            _sceneEnterY3 = stackPos(2);
            break;
      
      case 3:
            _sceneEnterX4 = stackPos(1);
            _sceneEnterY4 = stackPos(2);
            break;
      
      default:
            break;
      }
      return 0;
}

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));

      runTemporaryScript(stackPosString(0), stackPos(3), stackPos(2) ? 1 : 0, stackPos(1), stackPos(2));
      return 0;
}

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));
      
      if (anim.flags & 0x40) {
            if (!_sceneAnimMovie[animId]->open(anim.filename, 1, 0))
                  error("couldn't load '%s'", anim.filename);
      
            if (_sceneAnimMovie[animId]->xAdd() || _sceneAnimMovie[animId]->yAdd())
                  anim.wsaFlag = 1;
            else
                  anim.wsaFlag = 0;
      }
      
      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;
}

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);
      
      if (_mainCharacter.sceneId == stackPos(0)) {
            _sceneExit1 = scene->exit1;
            _sceneExit2 = scene->exit2;
            _sceneExit3 = scene->exit3;
            _sceneExit4 = scene->exit4;
      }

      return 0;
}

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;
      }
      
      if (_hiddenItems[0] == item && _newChapterFile == 1)
            ++count;
      if (_hiddenItems[1] == item && _newChapterFile == 1)
            ++count;
      if (_hiddenItems[2] == item && _newChapterFile == 2)
            ++count;
      if (_hiddenItems[3] == item && _newChapterFile == 2)
            ++count;
      if (_hiddenItems[4] == item && _newChapterFile == 1)
            ++count;

      return count;
}

int KyraEngine_v2::o2_initObject(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_initObject(%p) (%d)", (const void *)script, stackPos(0));
      initTalkObject(stackPos(0));
      return 0;
}

int KyraEngine_v2::o2_deinitObject(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_deinitObject(%p) (%d)", (const void *)script, stackPos(0));
      deinitTalkObject(stackPos(0));
      return 0;
}

int KyraEngine_v2::o2_makeBookOrCauldronAppear(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_makeBookOrCauldronAppear(%p) (%d)", (const void *)script, stackPos(0));
      seq_makeBookOrCauldronAppear(stackPos(0));
      return 0;
}

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)];
}

int KyraEngine_v2::o2_setHiddenItemsEntry(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_setHiddenItemsEntry(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
      return (_hiddenItems[stackPos(0)] = stackPos(1));
}

int KyraEngine_v2::o2_getHiddenItemsEntry(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_getHiddenItemsEntry(%p) (%d)", (const void *)script, stackPos(0));
      return _hiddenItems[stackPos(0)];
}

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);

      _chatVocHigh = _chatVocLow = -1;
      objectChatInit(_chatText, _chatObject, _vocHigh, stackPos(2));
      playVoice(_vocHigh, stackPos(2));
      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;
}

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;
}

int KyraEngine_v2::o2_zanthiaChat(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_zanthiaChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
      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);
      return 1/*voiceEnabled()*/;
}

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();
      return 0;
}

int KyraEngine_v2::o2_getGameLanguage(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_getGameLanguage(%p) ()", (const void *)script);
      return _lang;
}

int KyraEngine_v2::o2_dummy(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2_dummy(%p) ()", (const void *)script);
      return 0;
}

#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;
}

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;
}

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;
}

int KyraEngine_v2::o2t_setShapeFlag(ScriptState *script) {
      debugC(3, kDebugLevelScriptFuncs, "o2t_setShapeFlag(%p) (%d)", (const void *)script, stackPos(0));
      _newShapeFlag = stackPos(0);
      return 0;
}

} // end of namespace Kyra


Generated by  Doxygen 1.6.0   Back to index