diff options
| author | Johannes Schickel | 2005-12-24 18:00:35 +0000 |
|---|---|---|
| committer | Johannes Schickel | 2005-12-24 18:00:35 +0000 |
| commit | 515b69ddb87e5f7236f0e6ec98f65e7c6b4705d3 (patch) | |
| tree | 7a3e9c0ee96acac8ebf1fe906bbea14c0e2fbb33 /kyra/script_v1.cpp | |
| parent | 268d05955f7896058a2a87966282a525d315aa9a (diff) | |
| download | scummvm-rg350-515b69ddb87e5f7236f0e6ec98f65e7c6b4705d3.tar.gz scummvm-rg350-515b69ddb87e5f7236f0e6ec98f65e7c6b4705d3.tar.bz2 scummvm-rg350-515b69ddb87e5f7236f0e6ec98f65e7c6b4705d3.zip | |
Started to implement button handling (atm only the inventory works)
Also implemented following opcodes:
- cmd_waitForConfirmationMouseClick
- cmd_drawItemShapeIntoScene
- cmd_setFireberryGlowPalette
- cmd_findBrightestFireberry
- cmd_sceneToDirection
- cmd_createAmuletJewel
- cmd_getCharactersMovementDelay
- cmd_setNoDrawShapesFlag
- cmd_checkClickOnNPC
- cmd_getFoyerItem
- cmd_setFoyerItem
- cmd_passiveProtection
- cmd_fillRect
Fixed bugs in some opcodes (mostly wrong debug calls)
Also changed debuglevel of all sprite functions to level 6 (from 5).
svn-id: r19831
Diffstat (limited to 'kyra/script_v1.cpp')
| -rw-r--r-- | kyra/script_v1.cpp | 215 |
1 files changed, 182 insertions, 33 deletions
diff --git a/kyra/script_v1.cpp b/kyra/script_v1.cpp index 7bbef65157..cd2109182f 100644 --- a/kyra/script_v1.cpp +++ b/kyra/script_v1.cpp @@ -402,6 +402,11 @@ int KyraEngine::cmd_walkPlayerToPoint(ScriptState *script) { if (reinitScript) { _scriptInterpreter->initScript(script, script->dataPtr); } + + if (_sceneChangeState) { + _sceneChangeState = 0; + return 1; + } return 0; } @@ -450,7 +455,7 @@ int KyraEngine::cmd_drawAnimShapeIntoScene(ScriptState *script) { } int KyraEngine::cmd_createMouseItem(ScriptState *script) { - debug(3, "cmd_createMouseItem(0x%X) (%d)", stackPos(0)); + debug(3, "cmd_createMouseItem(0x%X) (%d)", script, stackPos(0)); createMouseItem(stackPos(0)); return 0; } @@ -473,7 +478,7 @@ int KyraEngine::cmd_sceneAnimOff(ScriptState *script) { } int KyraEngine::cmd_getElapsedSeconds(ScriptState *script) { - debug(3, "cmd_getElapsedSeconds(0x%X) ()"); + debug(3, "cmd_getElapsedSeconds(0x%X) ()", script); return _system->getMillis() / 1000; } @@ -531,25 +536,50 @@ int KyraEngine::cmd_phaseInSameScene(ScriptState *script) { } int KyraEngine::cmd_setScenePhasingFlag(ScriptState *script) { - debug(3, "cmd_setScenePhasingFlag(0x%X) ()"); + debug(3, "cmd_setScenePhasingFlag(0x%X) ()", script); _scenePhasingFlag = 1; return 1; } int KyraEngine::cmd_resetScenePhasingFlag(ScriptState *script) { - debug(3, "cmd_resetScenePhasingFlag(0x%X) ()"); + debug(3, "cmd_resetScenePhasingFlag(0x%X) ()", script); _scenePhasingFlag = 0; return 0; } int KyraEngine::cmd_queryScenePhasingFlag(ScriptState *script) { - debug(3, "cmd_queryScenePhasingFlag(0x%X) ()"); + debug(3, "cmd_queryScenePhasingFlag(0x%X) ()", script); return _scenePhasingFlag; } int KyraEngine::cmd_sceneToDirection(ScriptState *script) { - warning("STUB: cmd_sceneToDirection"); - return 0; + debug(3, "cmd_sceneToDirection(0x%X) (%d, %d)", script, stackPos(0), stackPos(1)); + assert(stackPos(0) < _roomTableSize); + Room *curRoom = &_roomTable[stackPos(0)]; + uint16 returnValue = 0xFFFF; + switch (stackPos(1)) { + case 0: + returnValue = curRoom->northExit; + break; + + case 2: + returnValue = curRoom->eastExit; + break; + + case 4: + returnValue = curRoom->southExit; + break; + + case 6: + returnValue = curRoom->westExit; + break; + + default: + break; + } + if (returnValue == 0xFFFF) + return -1; + return returnValue; } int KyraEngine::cmd_setBirthstoneGem(ScriptState *script) { @@ -943,20 +973,22 @@ int KyraEngine::cmd_displayWSASequentialFrames(ScriptState *script) { while (_system->getMillis() < continueTime) { _sprites->updateSceneAnims(); updateAllObjectShapes(); - delay(10); + if (continueTime - _system->getMillis() >= 10) + delay(10); } ++frame; } } else { - int frame = endFrame; - while (startFrame <= frame) { + int frame = startFrame; + while (endFrame <= frame) { wsa_play(_wsaObjects[wsaIndex], frame, xpos, ypos, 0); _updateScreen = true; uint32 continueTime = waitTime * _tickLength + _system->getMillis(); while (_system->getMillis() < continueTime) { _sprites->updateSceneAnims(); updateAllObjectShapes(); - delay(10); + if (continueTime - _system->getMillis() >= 10) + delay(10); } --frame; } @@ -1008,18 +1040,18 @@ int KyraEngine::cmd_changeCharactersXAndY(ScriptState *script) { } int KyraEngine::cmd_clearSceneAnimatorBeacon(ScriptState *script) { - debug(3, "cmd_clearSceneAnimatorBeacon(0x%X) ()"); + debug(3, "cmd_clearSceneAnimatorBeacon(0x%X) ()", script); _sprites->_sceneAnimatorBeaconFlag = 0; return 0; } int KyraEngine::cmd_querySceneAnimatorBeacon(ScriptState *script) { - debug(3, "cmd_querySceneAnimatorBeacon(0x%X) ()"); + debug(3, "cmd_querySceneAnimatorBeacon(0x%X) ()", script); return _sprites->_sceneAnimatorBeaconFlag; } int KyraEngine::cmd_refreshSceneAnimator(ScriptState *script) { - debug(3, "cmd_refreshSceneAnimator(0x%X) ()"); + debug(3, "cmd_refreshSceneAnimator(0x%X) ()", script); _sprites->updateSceneAnims(); updateAllObjectShapes(); return 0; @@ -1071,7 +1103,7 @@ int KyraEngine::cmd_placeCharacterInOtherScene(ScriptState *script) { } int KyraEngine::cmd_getKey(ScriptState *script) { - debug(3, "cmd_getKey(0x%X) ()"); + debug(3, "cmd_getKey(0x%X) ()", script); waitForEvent(); return 0; } @@ -1314,12 +1346,83 @@ int KyraEngine::cmd_dispelMagicAnimation(ScriptState *script) { } int KyraEngine::cmd_findBrightestFireberry(ScriptState *script) { - warning("STUB: cmd_findBrightestFireberry"); - return 0; + debug(3, "cmd_findBrightestFireberry(0x%X) ()", script); + if (_currentCharacter->sceneId >= 187 && _currentCharacter->sceneId <= 198) { + return 29; + } + if (_currentCharacter->sceneId == 133 || _currentCharacter->sceneId == 137 || + _currentCharacter->sceneId == 165 || _currentCharacter->sceneId == 173) { + return 29; + } + if (_itemInHand == 28) + return 28; + int brightestFireberry = 107; + if (_itemInHand >= 29 && _itemInHand <= 33) + brightestFireberry = _itemInHand; + for (int i = 0; i < 10; ++i) { + uint8 item = _currentCharacter->inventoryItems[i]; + if (item == 0xFF) + continue; + if (item == 28) + return 28; + if (item >= 29 && item <= 33) { + if (item < brightestFireberry) + brightestFireberry = item; + } + } + assert(_currentCharacter->sceneId < _roomTableSize); + Room *curRoom = &_roomTable[_currentCharacter->sceneId]; + for (int i = 0; i < 12; ++i) { + uint8 item = curRoom->itemsTable[i]; + if (item == 0xFF) + continue; + if (item == 28) + return 28; + if (item >= 29 && item <= 33) { + if (item < brightestFireberry) + brightestFireberry = item; + } + } + if (brightestFireberry == 107) + return -1; + return brightestFireberry; } int KyraEngine::cmd_setFireberryGlowPalette(ScriptState *script) { - warning("STUB: cmd_setFireberryGlowPalette"); + debug(3, "cmd_setFireberryGlowPalette(0x%X) (%d)", script, stackPos(0)); + int palIndex = 0; + switch (stackPos(0)) { + case 0x1E: + palIndex = 9; + break; + + case 0x1F: + palIndex = 10; + break; + + case 0x20: + palIndex = 11; + break; + + case 0x21: + case -1: + palIndex = 12; + break; + + default: + palIndex = 8; + break; + } + if (_brandonStatusBit & 2) { + if (_currentCharacter->sceneId != 133 && _currentCharacter->sceneId != 137 && + _currentCharacter->sceneId != 165 && _currentCharacter->sceneId != 173 && + (_currentCharacter->sceneId < 187 || _currentCharacter->sceneId > 198)) { + palIndex = 14; + } + } + uint8 *palette = _specialPalettes[palIndex]; + memcpy(&_screen->_currentPalette[684], palette, 44); + _screen->setScreenPalette(_screen->_currentPalette); return 0; } @@ -1373,7 +1476,26 @@ int KyraEngine::cmd_makeAmuletAppear(ScriptState *script) { } int KyraEngine::cmd_drawItemShapeIntoScene(ScriptState *script) { - warning("STUB: cmd_drawItemShapeIntoScene"); + debug(3, "cmd_drawItemShapeIntoScene(0x%X) (%d, %d, %d, %d, %d)", script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); + int item = stackPos(0); + int x = stackPos(1); + int y = stackPos(2); + int flags = stackPos(3); + int onlyHidPage = stackPos(4); + if (flags) + flags = 1; + if (onlyHidPage) { + _screen->drawShape(2, _shapes[220+item], x, y, 0, flags); + } else { + _screen->hideMouse(); + restoreAllObjectBackgrounds(); + _screen->drawShape(2, _shapes[220+item], x, y, 0, flags); + _screen->drawShape(0, _shapes[220+item], x, y, 0, flags); + flagAllObjectsForBkgdChange(); + flagAllObjectsForRefresh(); + updateAllObjectShapes(); + _screen->showMouse(); + } return 0; } @@ -1384,7 +1506,25 @@ int KyraEngine::cmd_setCharactersCurrentFrame(ScriptState *script) { } int KyraEngine::cmd_waitForConfirmationMouseClick(ScriptState *script) { - warning("STUB: cmd_waitForConfirmationMouseClick"); + debug(3, "cmd_waitForConfirmationMouseClick(0x%X) ()", script); + // if (mouseEnabled) { + while (!_mousePressFlag) { + updateMousePointer(); + _sprites->updateSceneAnims(); + updateAllObjectShapes(); + delay(10); + } + + while (_mousePressFlag) { + updateMousePointer(); + _sprites->updateSceneAnims(); + updateAllObjectShapes(); + delay(10); + } + // } + // XXX processButtonList calls + script->variables[1] = _mouseX; + script->variables[2] = _mouseY; return 0; } @@ -1426,7 +1566,8 @@ int KyraEngine::cmd_shakeScreen(ScriptState *script) { } int KyraEngine::cmd_createAmuletJewel(ScriptState *script) { - warning("STUB: cmd_createAmuletJewel"); + debug(3, "cmd_createAmuletJewel(0x%X) (%d)", script, stackPos(0)); + seq_createAmuletJewel(stackPos(0), 0, 0, 0); return 0; } @@ -1448,8 +1589,8 @@ int KyraEngine::cmd_fillFlaskWithWater(ScriptState *script) { } int KyraEngine::cmd_getCharactersMovementDelay(ScriptState *script) { - warning("STUB: cmd_getCharactersMovementDelay"); - return 0; + debug(3, "cmd_getCharactersMovementDelay(0x%X) (%d)", script, stackPos(0)); + return getTimerDelay(stackPos(0)+5); } int KyraEngine::cmd_getBirthstoneGem(ScriptState *script) { @@ -1526,7 +1667,8 @@ int KyraEngine::cmd_itemAppearsOnGround(ScriptState *script) { } int KyraEngine::cmd_setNoDrawShapesFlag(ScriptState *script) { - warning("STUB: cmd_setNoDrawShapesFlag"); + debug(3, "cmd_setNoDrawShapesFlag(0x%X) (%d)", script, stackPos(0)); + _noDrawShapesFlag = stackPos(0); return 0; } @@ -1608,18 +1750,21 @@ int KyraEngine::cmd_message(ScriptState *script) { } int KyraEngine::cmd_checkClickOnNPC(ScriptState *script) { - warning("STUB: cmd_checkClickOnNPC"); - return 0; + debug(3, "cmd_checkClickOnNPC(0x%X) (%d, %d)", script, stackPos(0), stackPos(1)); + return checkForNPCScriptRun(stackPos(0), stackPos(1)); } int KyraEngine::cmd_getFoyerItem(ScriptState *script) { - warning("STUB: cmd_getFoyerItem"); - return 0; + debug(3, "cmd_getFoyerItem(0x%X) (%d)", stackPos(0)); + assert(stackPos(0) < ARRAYSIZE(_foyerItemTable)); + return _foyerItemTable[stackPos(0)]; } int KyraEngine::cmd_setFoyerItem(ScriptState *script) { - warning("STUB: cmd_setFoyerItem"); - return 0; + debug(3, "cmd_setFoyerItem(0x%X) (%d, %d)", stackPos(0), stackPos(1)); + assert(stackPos(0) < ARRAYSIZE(_foyerItemTable)); + _foyerItemTable[stackPos(0)] = stackPos(1); + return stackPos(1); } int KyraEngine::cmd_setNoItemDropRegion(ScriptState *script) { @@ -1634,8 +1779,8 @@ int KyraEngine::cmd_walkMalcolmOn(ScriptState *script) { } int KyraEngine::cmd_passiveProtection(ScriptState *script) { - warning("STUB: cmd_passiveProtection"); - return 0; + debug(3, "cmd_passiveProtection(0x%X) ()", script); + return 1; } int KyraEngine::cmd_setPlayingLoop(ScriptState *script) { @@ -1675,7 +1820,11 @@ int KyraEngine::cmd_setPaletteChangeFlag(ScriptState *script) { } int KyraEngine::cmd_fillRect(ScriptState *script) { - warning("STUB: cmd_fillRect"); + debug(3, "cmd_fillRect(0x%X) (%d, %d, %d, %d, %d, 0x%X)", script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5)); + int videoPageBackup = _screen->_curPage; + _screen->_curPage = stackPos(0); + _screen->fillRect(stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5)); + _screen->_curPage = videoPageBackup; return 0; } |
