aboutsummaryrefslogtreecommitdiff
path: root/kyra/script_v1.cpp
diff options
context:
space:
mode:
authorJohannes Schickel2005-12-24 18:00:35 +0000
committerJohannes Schickel2005-12-24 18:00:35 +0000
commit515b69ddb87e5f7236f0e6ec98f65e7c6b4705d3 (patch)
tree7a3e9c0ee96acac8ebf1fe906bbea14c0e2fbb33 /kyra/script_v1.cpp
parent268d05955f7896058a2a87966282a525d315aa9a (diff)
downloadscummvm-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.cpp215
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;
}