int KyraEngine_v2::o2_runAnimationScript(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o2_runAnimationScript(%p) ('%s', %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3)); runAnimationScript(stackPosString(0), stackPos(3), stackPos(2) ? 1 : 0, stackPos(1), stackPos(2)); return 0; }
int KyraEngine_MR::o3_addItemToCurScene(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_addItemToCurScene(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); const uint16 item = stackPos(0); int x = stackPos(1); int y = stackPos(2); int itemSlot = findFreeItem(); if (x < 20) x = 20; else if (x > 299) x = 299; if (y < 18) y = 18; else if (y > 187) y = 187; if (itemSlot >= 0) { _itemList[itemSlot].x = x; _itemList[itemSlot].y = y; _itemList[itemSlot].id = item; _itemList[itemSlot].sceneId = _mainCharacter.sceneId; addItemToAnimList(itemSlot); refreshAnimObjectsIfNeed(); } return itemSlot; }
int KyraEngine_MR::o3_wipeDownMouseItem(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o3_wipeDownMouseItem(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2)); _screen->hideMouse(); const int x = stackPos(1) - 12; const int y = stackPos(2) - 19; if (_itemInHand >= 0) { backUpGfxRect32x32(x, y); uint8 *shape = getShapePtr(_itemInHand+248); for (int curY = y, height = 20; height > 0; height -= 2, curY += 2) { restoreGfxRect32x32(x, y); _screen->setNewShapeHeight(shape, height); const uint32 waitTime = _system->getMillis() + _tickLength; _screen->drawShape(0, shape, x, curY, 0, 0); _screen->updateScreen(); delayUntil(waitTime); } restoreGfxRect32x32(x, y); _screen->resetShapeHeight(shape); } _screen->showMouse(); removeHandItem(); return 0; }
int KyraEngine_v1::o1_getRand(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v1::o1_getRand(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); int min = stackPos(0); int max = stackPos(1); if (max < min) SWAP(min, max); return _rnd.getRandomNumberRng(min, max); }
int KyraEngine_MR::o3_npcChatSequence(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_npcChatSequence(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); const int id = stackPos(0); const char *str = (const char *)getTableEntry(_sceneStrings, id); if (str) npcChatSequence(str, stackPos(1), _vocHigh, id); return 0; }
int KyraEngine_MR::o3_drawSceneShapeOnPage(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_drawSceneShapeOnPage(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); const int shape = stackPos(0); int x = _sceneShapeDescs[shape].drawX; int y = _sceneShapeDescs[shape].drawY; _screen->drawShape(stackPos(2), _sceneShapes[shape], x, y, 2, (stackPos(1) != 0) ? 1 : 0); return 0; }
int KyraEngine_v2::o2_defineRoomEntrance(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::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::o2a_setAnimationShapes(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o2a_setAnimationShapes(%p) ('%s', %d, %d, %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5)); strcpy(_animShapeFilename, stackPosString(0)); _animShapeLastEntry = stackPos(1); _animShapeWidth = stackPos(2); _animShapeHeight = stackPos(3); _animShapeXAdd = stackPos(4); _animShapeYAdd = stackPos(5); return 0; }
int KyraEngine_MR::o3_setMalcolmPos(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_setMalcolmPos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); _mainCharX = stackPos(0); _mainCharY = stackPos(1); if (_mainCharX == -1 && _mainCharY == -1) _mainCharacter.animFrame = 87; else _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; return 0; }
int KyraEngine_MR::o3_blockOutWalkableRegion(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_blockOutWalkableRegion(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3)); const int x1 = stackPos(0); int y1 = stackPos(1); const int x2 = stackPos(2); int y2 = stackPos(3); if (y1 < _maskPageMinY) y1 = _maskPageMinY; if (y2 > _maskPageMaxY) y2 = _maskPageMaxY; _screen->blockOutRegion(x1, y1, x2-x1+1, y2-y1+1); return 0; }
int KyraEngine_MR::o3_setCharacterPos(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_setCharacterPos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); int x = stackPos(0); int y = stackPos(1); if (x != -1 && y != -1) { x &= ~3; y &= ~1; } _mainCharacter.x1 = _mainCharacter.x2 = x; _mainCharacter.y1 = _mainCharacter.y2 = y; return 0; }
int KyraEngine_MR::o3_goodConscienceChat(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_goodConscienceChat(%p) (%d)", (const void *)script, stackPos(0)); int id = stackPos(0); const char *str = (const char *)getTableEntry(_useActorBuffer ? _actorFile : _sceneStrings, id); goodConscienceChat(str, _vocHigh, id); return 0; }
int KyraEngine_MR::o3_removeItemInstances(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_removeItemInstances(%p) (%d)", (const void *)script, stackPos(0)); const int16 item = stackPos(0); int deleted = 0; for (int i = 0; i < 10; ++i) { if (_mainCharacter.inventory[i] == item) { _mainCharacter.inventory[i] = kItemNone; ++deleted; } } if (_itemInHand == item) { removeHandItem(); ++deleted; } for (int i = 0; i < 50; ++i) { if (_itemList[i].id == item) { _itemList[i].id = kItemNone; ++deleted; } } return deleted; }
int KyraEngine_MR::o3_removeInventoryItemInstances(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_removeInventoryItemInstances(%p) (%d)", (const void *)script, stackPos(0)); const int item = stackPos(0); for (int i = 0; i < 10; ++i) { if (_mainCharacter.inventory[i] == item) _mainCharacter.inventory[i] = kItemNone; } return 0; }
int KyraEngine_MR::o3_removeItemsFromScene(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_removeItemsFromScene(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); const uint16 itemId = stackPos(0); const uint16 sceneId = stackPos(1); const bool allItems = (stackPos(2) != 0); int retValue = 0; for (int i = 0; i < 50; ++i) { if (_itemList[i].sceneId == sceneId && _itemList[i].id == itemId) { resetItem(i); retValue = 1; if (!allItems) return 1; } } return retValue; }
int KyraEngine_v2::o2_update(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o2_update(%p) (%d)", (const void *)script, stackPos(0)); for (int times = stackPos(0); times != 0; --times) { if (_chatText) updateWithText(); else update(); } return 0; }
int KyraEngine_MR::o3_objectChat(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_objectChat(%p) (%d)", (const void *)script, stackPos(0)); int id = stackPos(0); const char *str = (const char *)getTableEntry(_useActorBuffer ? _actorFile : _sceneStrings, id); if (str) { objectChat(str, 0, _vocHigh, id); playStudioSFX(str); } return 0; }
int KyraEngine_MR::o3_switchScene(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_switchScene(%p) (%d)", (const void *)script, stackPos(0)); setGameFlag(1); _mainCharX = _mainCharacter.x1; _mainCharY = _mainCharacter.y1; _noScriptEnter = false; enterNewScene(stackPos(0), _mainCharacter.facing, 0, 0, 0); _noScriptEnter = true; return 0; }
int KyraEngine_MR::o3_addItemToInventory(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_addItemToInventory(%p) (%d)", (const void *)script, stackPos(0)); int slot = findFreeInventorySlot(); if (slot >= 0) { _mainCharacter.inventory[slot] = stackPos(0); if (_inventoryState) { redrawInventory(0); } } return slot; }
int KyraEngine_MR::o3_refreshCharacter(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_refreshCharacter(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); const int frame = stackPos(0); const int facing = stackPos(1); const bool updateNeed = stackPos(2) != 0; if (facing >= 0) _mainCharacter.facing = facing; if (frame >= 0 && frame != 87) _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; else _mainCharacter.animFrame = 87; updateCharacterAnim(0); if (updateNeed) refreshAnimObjectsIfNeed(); return 0; }
int KyraEngine_MR::o3_enterNewScene(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_enterNewScene(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); _screen->hideMouse(); enterNewScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); _unk5 = 1; if (_mainCharX == -1 || _mainCharY == -1) { _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing]; updateCharacterAnim(0); } _screen->showMouse(); return 0; }
int KyraEngine_MR::o3_drawSceneShape(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o3_drawSceneShape(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); int shape = stackPos(0); int flag = (stackPos(1) != 0) ? 1 : 0; restorePage3(); const int x = _sceneShapeDescs[shape].drawX; const int y = _sceneShapeDescs[shape].drawY; _screen->drawShape(2, _sceneShapes[shape], x, y, 2, flag); _screen->copyRegionToBuffer(3, 0, 0, 320, 200, _gamePlayBuffer); _screen->drawShape(0, _sceneShapes[shape], x, y, 2, flag); flagAnimObjsForRefresh(); refreshAnimObjectsIfNeed(); return 0; }
int KyraEngine_v2::o2_defineItem(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::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_delay(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o2_delay(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); if (stackPos(1)) { uint32 maxWaitTime = _system->getMillis() + stackPos(0) * _tickLength; while (_system->getMillis() < maxWaitTime) { int inputFlag = checkInput(0); removeInputTop(); if (inputFlag == 198 || inputFlag == 199) return 1; if (_chatText) updateWithText(); else update(); _system->delayMillis(10); } } else { delay(stackPos(0) * _tickLength, true); } return 0; }
int KyraEngine_MR::o3_countInventoryItemInstances(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_countInventoryItemInstances(%p) (%d)", (const void *)script, stackPos(0)); const int item = stackPos(0); int count = 0; for (int i = 0; i < 10; ++i) { if (_mainCharacter.inventory[i] == item) ++count; } if (_itemInHand == item) ++count; return count; }
int KyraEngine_v2::o2_trySceneChange(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::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) { _emc->init(script, script->dataPtr); _unk4 = 0; _savedMouseState = -1; _unk5 = 1; return 0; } else { return (_unk4 != 0) ? 1 : 0; } }
int KyraEngine_v2::o2_waitForConfirmationClick(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o2_waitForConfirmationClick(%p) (%d)", (const void *)script, stackPos(0)); resetSkipFlag(); uint32 maxWaitTime = _system->getMillis() + stackPos(0) * _tickLength; while (_system->getMillis() < maxWaitTime) { int inputFlag = checkInput(0); removeInputTop(); if (inputFlag == 198 || inputFlag == 199) { _sceneScriptState.regs[1] = _mouseX; _sceneScriptState.regs[2] = _mouseY; return 0; } update(); _system->delayMillis(10); } _sceneScriptState.regs[1] = _mouseX; _sceneScriptState.regs[2] = _mouseY; return 1; }
int KyraEngine_MR::o3_setCharacterFacing(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_setCharacterFacing(%p) (%d)", (const void *)script, stackPos(0)); _mainCharacter.facing = stackPos(0); return 0; }
int KyraEngine_MR::o3_defineSceneAnim(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_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)); const int animId = stackPos(0); SceneAnim &anim = _sceneAnims[animId]; uint16 flags = anim.flags = stackPos(1); int x = anim.x = stackPos(2); int y = anim.y = stackPos(3); int x2 = anim.x2 = stackPos(4); int y2 = anim.y2 = stackPos(5); int w = anim.width = stackPos(6); int h = anim.height = stackPos(7); anim.specialSize = stackPos(9); anim.shapeIndex = stackPos(11); const char *filename = stackPosString(12); if (filename) strcpy(anim.filename, filename); if (flags & 8) { _sceneAnimMovie[animId]->open(filename, 1, 0); if (_sceneAnimMovie[animId]->opened()) { anim.wsaFlag = 1; if (x2 == -1) x2 = _sceneAnimMovie[animId]->xAdd(); if (y2 == -1) y2 = _sceneAnimMovie[animId]->yAdd(); if (w == -1) w = _sceneAnimMovie[animId]->width(); if (h == -1) h = _sceneAnimMovie[animId]->height(); if (x == -1) x = (w >> 1) + x2; if (y == -1) y = y2 + h - 1; anim.x = x; anim.y = y; anim.x2 = x2; anim.y2 = y2; anim.width = w; anim.height = h; }
int KyraEngine_MR::o3_showSceneStringsMessage(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_showSceneStringsMessage(%p) (%d)", (const void *)script, stackPos(0)); showMessage((const char *)getTableEntry(_sceneStrings, stackPos(0)), 0xFF, 0xF0); return 0; }