diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/kyra/gui_lol.cpp | 46 | ||||
-rw-r--r-- | engines/kyra/items_lol.cpp | 28 | ||||
-rw-r--r-- | engines/kyra/lol.cpp | 120 | ||||
-rw-r--r-- | engines/kyra/lol.h | 100 | ||||
-rw-r--r-- | engines/kyra/scene_lol.cpp | 392 | ||||
-rw-r--r-- | engines/kyra/script_lol.cpp | 288 | ||||
-rw-r--r-- | engines/kyra/script_tim.cpp | 12 | ||||
-rw-r--r-- | engines/kyra/sprites_lol.cpp | 14 | ||||
-rw-r--r-- | engines/kyra/staticres.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/text_lol.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/timer_lol.cpp | 4 |
11 files changed, 718 insertions, 290 deletions
diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp index de531a8c66..e7c3d6f138 100644 --- a/engines/kyra/gui_lol.cpp +++ b/engines/kyra/gui_lol.cpp @@ -74,7 +74,7 @@ void LoLEngine::gui_drawScene(int pageNum) { } void LoLEngine::gui_drawInventory() { - if (!_hideControls || !_hideInventory) { + if (!_currentControlMode || !_hideInventory) { for (int i = 0; i < 9; i++) gui_drawInventoryItem(i); } @@ -342,7 +342,7 @@ void LoLEngine::gui_drawCharPortraitWithStats(int charNum) { int cp = _screen->setCurPage(6); gui_drawBox(0, 0, 66, 34, 1, 1, -1); - gui_drawCharFaceShape(0, 0, 1, _screen->_curPage); + gui_drawCharFaceShape(charNum, 0, 1, _screen->_curPage); gui_drawLiveMagicBar(33, 32, _characters[charNum].magicPointsCur, 0, _characters[charNum].magicPointsMax, 5, 32, 162, 1, 0); gui_drawLiveMagicBar(39, 32, _characters[charNum].hitPointsCur, 0, _characters[charNum].hitPointsMax, 5, 32, 154, 1, 1); @@ -427,11 +427,11 @@ void LoLEngine::gui_drawBox(int x, int y, int w, int h, int frameColor1, int fra } void LoLEngine::gui_drawCharFaceShape(int charNum, int x, int y, int pageNum) { - if (_characters[charNum].curFaceFrame < 7 && _characters[charNum].nextFaceFrame) - _characters[charNum].curFaceFrame = _characters[charNum].nextFaceFrame; + if (_characters[charNum].curFaceFrame < 7 && _characters[charNum].defaultFaceFrame) + _characters[charNum].curFaceFrame = _characters[charNum].defaultFaceFrame; - if (_characters[charNum].nextFaceFrame == 0 && _characters[charNum].curFaceFrame > 1 && _characters[charNum].curFaceFrame < 7) - _characters[charNum].curFaceFrame = _characters[charNum].nextFaceFrame; + if (_characters[charNum].defaultFaceFrame == 0 && _characters[charNum].curFaceFrame > 1 && _characters[charNum].curFaceFrame < 7) + _characters[charNum].curFaceFrame = _characters[charNum].defaultFaceFrame; int frm = (_characters[charNum].flags & 0x1108 && _characters[charNum].curFaceFrame < 7) ? 1 : _characters[charNum].curFaceFrame; @@ -573,7 +573,7 @@ void LoLEngine::gui_drawCompass() { int LoLEngine::gui_enableControls() { _floatingMouseArrowControl = 0; - if (!_hideControls) { + if (!_currentControlMode) { for (int i = 76; i < 85; i++) gui_toggleButtonDisplayMode(i, 2); } @@ -583,7 +583,7 @@ int LoLEngine::gui_enableControls() { } int LoLEngine::gui_disableControls(int controlMode) { - if (_hideControls) + if (_currentControlMode) return 0; _floatingMouseArrowControl = (controlMode & 2) ? 2 : 1; @@ -603,7 +603,7 @@ void LoLEngine::gui_toggleButtonDisplayMode(int shapeIndex, int mode) { if (shapeIndex == 78 && !(_gameFlags[15] & 0x1000)) return; - if (_hideControls && _hideInventory) + if (_currentControlMode && _hideInventory) return; if (mode == 0) @@ -807,11 +807,11 @@ void LoLEngine::gui_triggerEvent(int eventType) { void LoLEngine::gui_enableDefaultPlayfieldButtons() { gui_resetButtonList(); gui_initButtonsFromList(_buttonList1); - gui_initCharacterControlButtons(7, 44); - gui_initCharacterControlButtons(11, 44); - gui_initCharacterControlButtons(17, 0); - gui_initCharacterControlButtons(29, 0); - gui_initCharacterControlButtons(25, 33); + gui_setFaceFramesControlButtons(7, 44); + gui_setFaceFramesControlButtons(11, 44); + gui_setFaceFramesControlButtons(17, 0); + gui_setFaceFramesControlButtons(29, 0); + gui_setFaceFramesControlButtons(25, 33); if (_gameFlags[15] & 0x2000) gui_initMagicScrollButtons(); @@ -834,11 +834,19 @@ void LoLEngine::gui_enableSequenceButtons(int x, int y, int w, int h, int enable gui_initButtonsFromList(_buttonList5); } +void LoLEngine::gui_specialSceneRestoreButtons() { + if (!_spsWindowW && !_spsWindowH) + return; + + gui_enableDefaultPlayfieldButtons(); + _spsWindowX = _spsWindowY = _spsWindowW = _spsWindowH = _seqTrigger = 0; +} + void LoLEngine::gui_enableCharInventoryButtons(int charNum) { gui_resetButtonList(); gui_initButtonsFromList(_buttonList2); gui_initCharInventorySpecialButtons(charNum); - gui_initCharacterControlButtons(21, 0); + gui_setFaceFramesControlButtons(21, 0); } void LoLEngine::gui_resetButtonList() { @@ -857,7 +865,7 @@ void LoLEngine::gui_initButtonsFromList(const int16 *list) { gui_initButton(*list++); } -void LoLEngine::gui_initCharacterControlButtons(int index, int xOffs) { +void LoLEngine::gui_setFaceFramesControlButtons(int index, int xOffs) { int c = countActiveCharacters(); for (int i = 0; i < c; i++) gui_initButton(index + i, _activeCharsXpos[i] + xOffs); @@ -1061,7 +1069,7 @@ int LoLEngine::clickedMagicSubmenu(Button *button) { // TODO /// /*if (processSpellcast(c, _availableSpells[_selectedSpell], spellLevel)) { - initCharacterUnkSub(c, 1, 8, 1); + setFaceFramesUnkArrays(c, 1, 8, 1); sub_718F(c, 2, spellLevel * spellLevel); } else {*/ _characters[c].flags &= 0xfffb; @@ -1252,7 +1260,7 @@ int LoLEngine::clickedScenePickupItem(Button *button) { int found = checkSceneForItems(&_levelBlockProperties[block].drawObjects, p & 0x7f); if (found != -1) { - pickupItem(found, block); + removeLevelItem(found, block); setHandItem(found); } @@ -1348,7 +1356,7 @@ int LoLEngine::clickedWall(Button *button) { break; case 2: - res = clicked2(block, dir); + res = clickedLever(block, dir); break; case 3: diff --git a/engines/kyra/items_lol.cpp b/engines/kyra/items_lol.cpp index 1977ba9a60..64a6850fcb 100644 --- a/engines/kyra/items_lol.cpp +++ b/engines/kyra/items_lol.cpp @@ -110,7 +110,7 @@ void LoLEngine::takeCredits(int credits, int redraw) { } } -int LoLEngine::makeItem(int itemIndex, int curFrame, int flags) { +int LoLEngine::makeItem(int itemType, int curFrame, int flags) { int cnt = 0; int r = 0; int i = 1; @@ -171,13 +171,29 @@ int LoLEngine::makeItem(int itemIndex, int curFrame, int flags) { memset(&_itemsInPlay[slot], 0, sizeof(ItemInPlay)); - _itemsInPlay[slot].itemPropertyIndex = itemIndex; + _itemsInPlay[slot].itemPropertyIndex = itemType; _itemsInPlay[slot].shpCurFrame_flg = (curFrame & 0x1fff) | flags; _itemsInPlay[slot].level = -1; return slot; } +void LoLEngine::placeMoveLevelItem(int itemIndex, int level, int block, int xOffs, int yOffs, int flyingHeight) { + calcCoordinates(_itemsInPlay[itemIndex].x, _itemsInPlay[itemIndex].y, block, xOffs, yOffs); + + if (_itemsInPlay[itemIndex].blockPropertyIndex) + removeLevelItem(itemIndex, _itemsInPlay[itemIndex].blockPropertyIndex); + + if (_currentLevel == level) { + setItemPosition(itemIndex, _itemsInPlay[itemIndex].x, _itemsInPlay[itemIndex].y, flyingHeight, 1); + } else { + _itemsInPlay[itemIndex].level = level; + _itemsInPlay[itemIndex].blockPropertyIndex = block; + _itemsInPlay[itemIndex].flyingHeight = flyingHeight; + _itemsInPlay[itemIndex].shpCurFrame_flg |= 0x4000; + } +} + bool LoLEngine::addItemToInventory(int itemIndex) { int pos = 0; int i = 0; @@ -265,7 +281,7 @@ void LoLEngine::setHandItem(uint16 itemIndex) { if (itemIndex && !(_gameFlags[15] & 0x200)) { mouseOffs = 10; - if (!_hideControls || textEnabled()) + if (!_currentControlMode || textEnabled()) _txt->printMessage(0, getLangString(0x403E), getLangString(_itemProperties[_itemsInPlay[itemIndex].itemPropertyIndex].nameStringId)); } @@ -300,7 +316,7 @@ void LoLEngine::setItemPosition(int item, uint16 x, uint16 y, int flyingHeight, checkSceneUpdateNeed(block); } -void LoLEngine::pickupItem(int item, int block) { +void LoLEngine::removeLevelItem(int item, int block) { removeAssignedObjectFromBlock(&_levelBlockProperties[block], item); removeDrawObjectFromBlock(&_levelBlockProperties[block], item); runLevelScriptCustom(block, 0x100, -1, item, 0, 0); @@ -310,7 +326,7 @@ void LoLEngine::pickupItem(int item, int block) { bool LoLEngine::throwItem(int a, int item, int x, int y, int flyingHeight, int direction, int, int charNum, int c) { int sp = checkDrawObjectSpace(_partyPosX, _partyPosX, x, y); - FlyingObject *t = _flyingItems; + FlyingObject *t = _flyingObjects; int slot = -1; int i = 0; @@ -331,7 +347,7 @@ bool LoLEngine::throwItem(int a, int item, int x, int y, int flyingHeight, int d if (sp != -1 && slot != -1) { i = slot; - t = &_flyingItems[i]; + t = &_flyingObjects[i]; endObjectFlight(t, x, y, 8); } diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 526cfc01ac..34ee0891ac 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -86,7 +86,8 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy _itemInHand = 0; memset(_inventory, 0, sizeof(_inventory)); _inventoryCurItem = 0; - _hideControls = 0; + _currentControlMode = 0; + _specialSceneFlag = 0; _lastCharInventory = -1; _itemIconShapes = _itemShapes = _gameShapes = _thrownShapes = _effectShapes = _fireballShapes = 0; @@ -119,7 +120,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy _scriptDirection = 0; _currentDirection = 0; _currentBlock = 0; - memset(_currentBlockPropertyIndex, 0, sizeof(_currentBlockPropertyIndex)); + memset(_visibleBlockIndex, 0, sizeof(_visibleBlockIndex)); _scrollSceneBuffer = 0; _smoothScrollModeNormal = 1; @@ -147,12 +148,13 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy _lampOilStatus = _brightness = _lampStatusUnk = 0; _lampStatusSuspended = false; _tempBuffer5120 = 0; - _flyingItems = 0; + _flyingObjects = 0; _monsters = 0; _lastMouseRegion = 0; _monsterLastWalkDirection = _monsterCountUnk = _monsterShiftAlt = 0; _monsterCurBlock = 0; _seqWindowX1 = _seqWindowY1 = _seqWindowX2 = _seqWindowY2 = _seqTrigger = 0; + _spsWindowX = _spsWindowY = _spsWindowW = _spsWindowH = 0; _dscUnk1 = 0; _dscShapeIndex = 0; @@ -181,7 +183,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy _curMusicFileIndex = -1; _environmentSfx = _environmentSfxVol = _environmentSfxDistThreshold = 0; - _sceneDrawVar1 = _sceneDrawVar2 = _sceneDrawVar3 = _wllProcessFlag = 0; + _sceneDrawVarDown = _sceneDrawVarRight = _sceneDrawVarLeft = _wllProcessFlag = 0; _partyPosX = _partyPosY = 0; _shpDmX = _shpDmY = _dmScaleW = _dmScaleH = 0; @@ -209,6 +211,8 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy _monsterDifficulty = 1; _smoothScrollingEnabled = true; _floatingCursorsEnabled = false; + + _unkIceSHpFlag = 0; } LoLEngine::~LoLEngine() { @@ -299,7 +303,7 @@ LoLEngine::~LoLEngine() { delete[] _lvlShapeBottom; delete[] _lvlShapeLeftRight; delete[] _tempBuffer5120; - delete[] _flyingItems; + delete[] _flyingObjects; delete[] _monsters; delete[] _levelBlockProperties; delete[] _monsterProperties; @@ -418,8 +422,8 @@ Common::Error LoLEngine::init() { _tempBuffer5120 = new uint8[5120]; memset(_tempBuffer5120, 0, 5120); - _flyingItems = new FlyingObject[8]; - memset(_flyingItems, 0, 8 * sizeof(FlyingObject)); + _flyingObjects = new FlyingObject[8]; + memset(_flyingObjects, 0, 8 * sizeof(FlyingObject)); memset(_gameFlags, 0, sizeof(_gameFlags)); memset(_globalScriptVars, 0, sizeof(_globalScriptVars)); @@ -757,7 +761,7 @@ void LoLEngine::startupNew() { gui_enableDefaultPlayfieldButtons(); - loadLevel(1); + loadLevel(_currentLevel); _screen->showMouse(); } @@ -885,29 +889,29 @@ bool LoLEngine::addCharacter(int id) { calcCharPortraitXpos(); if (numChars > 0) - initCharacter(numChars, 2, 6, 0); + setFaceFrames(numChars, 2, 6, 0); return true; } -void LoLEngine::initCharacter(int charNum, int firstFaceFrame, int unk2, int redraw) { - _characters[charNum].nextFaceFrame = firstFaceFrame; - if (firstFaceFrame || unk2) - initCharacterUnkSub(charNum, 6, unk2, 1); +void LoLEngine::setFaceFrames(int charNum, int defaultFrame, int unk2, int redraw) { + _characters[charNum].defaultFaceFrame = defaultFrame; + if (defaultFrame || unk2) + setFaceFramesUnkArrays(charNum, 6, unk2, 1); if (redraw) gui_drawCharPortraitWithStats(charNum); } -void LoLEngine::initCharacterUnkSub(int charNum, int unk1, int unk2, int unk3) { +void LoLEngine::setFaceFramesUnkArrays(int charNum, int unk1, int unk2, int unk3) { + LoLCharacter *l = &_characters[charNum]; for (int i = 0; i < 5; i++) { - if (_characters[charNum].arrayUnk1[i] == 0 || (unk3 && _characters[charNum].arrayUnk1[i] == unk1)) { - _characters[charNum].arrayUnk1[i] = unk1; - _characters[charNum].arrayUnk2[i] = unk2; - - // TODO + if (l->arrayUnk2[i] && (!unk3 || l->arrayUnk2[i] != unk1)) + continue; - break; - } + l->arrayUnk2[i] = unk1; + l->arrayUnk1[i] = unk2; + _timer->setNextRun(3, _system->getMillis()); + _timer->enable(3); } } @@ -1029,10 +1033,10 @@ void LoLEngine::setCharFaceFrame(int charNum, int frameNum) { void LoLEngine::faceFrameRefresh(int charNum) { if (_characters[charNum].curFaceFrame == 1) - initCharacter(charNum, 0, 0, 0); + setFaceFrames(charNum, 0, 0, 0); else if (_characters[charNum].curFaceFrame == 6) - if (_characters[charNum].nextFaceFrame != 5) - initCharacter(charNum, 0, 0, 0); + if (_characters[charNum].defaultFaceFrame != 5) + setFaceFrames(charNum, 0, 0, 0); else _characters[charNum].curFaceFrame = 5; else @@ -1156,8 +1160,8 @@ void LoLEngine::setupScreenDims() { } } -void LoLEngine::initAnimatedDialogue(int controlMode) { - resetPortraitsArea(); +void LoLEngine::initSceneWindowDialogue(int controlMode) { + resetPortraitsAndDisableSysTimer(); gui_prepareForSequence(112, 0, 176, 120, controlMode); _updateFlags |= 3; @@ -1182,7 +1186,7 @@ void LoLEngine::toggleSelectedCharacterFrame(bool mode) { } void LoLEngine::gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags) { - setSequenceGui(x, y, w, h, buttonFlags); + setSequenceButtons(x, y, w, h, buttonFlags); _seqWindowX1 = x; _seqWindowY1 = y; @@ -1200,12 +1204,34 @@ void LoLEngine::gui_prepareForSequence(int x, int y, int w, int h, int buttonFla } } -void LoLEngine::restoreAfterAnimatedDialogue(int redraw) { +void LoLEngine::gui_specialSceneSuspendControls(int controlMode) { + if (controlMode) { + _updateFlags |= 4; + setLampMode(false); + } + _updateFlags |= 1; + _specialSceneFlag = 1; + _currentControlMode = controlMode; + calcCharPortraitXpos(); + //checkMouseRegions(); +} + +void LoLEngine::gui_specialSceneRestoreControls(int restoreLamp) { + if (restoreLamp) { + _updateFlags &= 0xfffa; + resetLampStatus(); + } + _updateFlags &= 0xfffe; + _specialSceneFlag = 0; + //checkMouseRegions(); +} + +void LoLEngine::restoreAfterSceneWindowDialogue(int redraw) { gui_enableControls(); _txt->setupField(false); _updateFlags &= 0xffdf; - restoreDefaultGui(); + setDefaultButtonState(); for (int i = 0; i < 6; i++) _tim->freeAnimStruct(i); @@ -1224,7 +1250,7 @@ void LoLEngine::restoreAfterAnimatedDialogue(int redraw) { enableSysTimer(2); } -void LoLEngine::initNonAnimatedDialogue(int controlMode, int pageNum) { +void LoLEngine::initDialogueSequence(int controlMode, int pageNum) { if (controlMode) { _timer->disable(11); _fadeText = false; @@ -1239,7 +1265,7 @@ void LoLEngine::initNonAnimatedDialogue(int controlMode, int pageNum) { _txt->clearDim(4); _updateFlags |= 2; - _hideControls = controlMode; + _currentControlMode = controlMode; calcCharPortraitXpos(); if (!textEnabled() && (!(controlMode & 2))) { @@ -1261,19 +1287,19 @@ void LoLEngine::initNonAnimatedDialogue(int controlMode, int pageNum) { _txt->clearDim(4); } - _hideControls = controlMode; + _currentControlMode = controlMode; _dialogueField = true; } -void LoLEngine::restoreAfterNonAnimatedDialogue(int controlMode) { +void LoLEngine::restoreAfterDialogueSequence(int controlMode) { if (!_dialogueField) return; updatePortraits(); - _hideControls = controlMode; + _currentControlMode = controlMode; calcCharPortraitXpos(); - if (_hideControls) { + if (_currentControlMode) { _screen->modifyScreenDim(4, 11, 124, 28, 45); _screen->modifyScreenDim(5, 85, 123, 233, 54); _updateFlags &= 0xfffd; @@ -1287,9 +1313,9 @@ void LoLEngine::restoreAfterNonAnimatedDialogue(int controlMode) { _dialogueField = false; } -void LoLEngine::resetPortraitsArea() { +void LoLEngine::resetPortraitsAndDisableSysTimer() { _hideInventory = 1; - if (!textEnabled() || (!(_hideControls & 2))) + if (!textEnabled() || (!(_currentControlMode & 2))) timerUpdatePortraitAnimations(1); disableSysTimer(2); @@ -1613,16 +1639,16 @@ bool LoLEngine::characterSays(int track, int charId, bool redraw) { if (charId == 1) { charId = _selectedCharacter; } else { - if (charId < 0) { - for (int i = 0; i < 4; i++) { - if (charId != _characters[i].id || !(_characters[i].flags & 1)) - continue; - charId = i; - break; - } - } else { - charId = 0; + int i = 0; + for (;i < 4; i++) { + if (charId != _characters[i].id || !(_characters[i].flags & 1)) + continue; + charId = i; + break; } + + if (i == 4) + return false; } bool r = snd_playCharacterSpeech(track, charId, 0); @@ -1683,7 +1709,7 @@ int LoLEngine::playCharacterScriptChat(int charId, int mode, int unk1, char *str if (script) snd_playCharacterSpeech(script->stack[script->sp + 2], ch, 0); else if (paramList) - snd_playCharacterSpeech(paramList[1], ch, 0); + snd_playCharacterSpeech(paramList[2], ch, 0); if (textEnabled()) { if (mode == 0) { diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 593b04c01b..e117239ef0 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -49,7 +49,7 @@ struct LoLCharacter { uint8 raceClassSex; int16 id; uint8 curFaceFrame; - uint8 nextFaceFrame; + uint8 defaultFaceFrame; uint8 field_12; const uint16 *defaultModifiers; uint16 itemsMight[8]; @@ -180,8 +180,8 @@ struct ItemProperty { struct LevelShapeProperty { uint16 shapeIndex[10]; uint8 scaleFlag[10]; - uint16 shapeX[10]; - uint16 shapeY[10]; + int16 shapeX[10]; + int16 shapeY[10]; int8 next; uint8 flags; }; @@ -420,6 +420,8 @@ private: void gui_toggleButtonDisplayMode(int shapeIndex, int mode); void gui_toggleFightButtons(bool disable); void gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags); + void gui_specialSceneSuspendControls(int controlMode); + void gui_specialSceneRestoreControls(int restoreLamp); bool _weaponsDisabled; int _lastButtonShape; @@ -437,11 +439,12 @@ private: void gui_triggerEvent(int eventType); void gui_enableDefaultPlayfieldButtons(); void gui_enableSequenceButtons(int x, int y, int w, int h, int enableFlags); + void gui_specialSceneRestoreButtons(); void gui_enableCharInventoryButtons(int charNum); void gui_resetButtonList(); void gui_initButtonsFromList(const int16 *list); - void gui_initCharacterControlButtons(int index, int xOffs); + void gui_setFaceFramesControlButtons(int index, int xOffs); void gui_initCharInventorySpecialButtons(int charNum); void gui_initMagicScrollButtons(); void gui_initMagicSubmenu(int charNum); @@ -524,7 +527,7 @@ private: uint16 _currentDirection; uint16 _currentBlock; bool _sceneUpdateRequired; - int16 _currentBlockPropertyIndex[18]; + int16 _visibleBlockIndex[18]; uint16 _gameFlags[16]; uint16 _globalScriptVars[16]; @@ -542,6 +545,7 @@ private: int olol_allocItemPropertiesBuffer(EMCState *script); int olol_setItemProperty(EMCState *script); int olol_makeItem(EMCState *script); + int olol_createLevelItem(EMCState *script); int olol_getItemPara(EMCState *script); int olol_getCharacterStat(EMCState *script); int olol_setCharacterStat(EMCState *script); @@ -553,10 +557,13 @@ private: int olol_freeAnimStruct(EMCState *script); int olol_getDirection(EMCState *script); int olol_setMusicTrack(EMCState *script); + int olol_setSequenceButtons(EMCState *script); + int olol_setDefaultButtonState(EMCState *script); int olol_checkRectForMousePointer(EMCState *script); int olol_clearDialogueField(EMCState *script); int olol_setupBackgroundAnimationPart(EMCState *script); int olol_startBackgroundAnimation(EMCState *script); + int olol_fadeToBlack(EMCState *script); int olol_fadePalette(EMCState *script); int olol_loadBitmap(EMCState *script); int olol_stopBackgroundAnimation(EMCState *script); @@ -572,6 +579,8 @@ private: int olol_initMonster(EMCState *script); int olol_fadeClearSceneWindow(EMCState *script); int olol_fadeSequencePalette(EMCState *script); + int olol_redrawPlayfield(EMCState *script); + int olol_loadNewLevel(EMCState *script); int olol_dummy0(EMCState *script); int olol_loadMonsterProperties(EMCState *script); int olol_battleHitSkillTest(EMCState *script); @@ -581,11 +590,12 @@ private: int olol_checkMoney(EMCState *script); int olol_setScriptTimer(EMCState *script); int olol_createHandItem(EMCState *script); + int olol_characterJoinsParty(EMCState *script); int olol_loadTimScript(EMCState *script); int olol_runTimScript(EMCState *script); int olol_releaseTimScript(EMCState *script); - int olol_initAnimatedDialogue(EMCState *script); - int olol_restoreAfterAnimatedDialogue(EMCState *script); + int olol_initSceneWindowDialogue(EMCState *script); + int olol_restoreAfterSceneWindowDialogue(EMCState *script); int olol_getItemInHand(EMCState *script); int olol_giveItemToMonster(EMCState *script); int olol_loadLangFile(EMCState *script); @@ -593,6 +603,7 @@ private: int olol_processDialogue(EMCState *script); int olol_stopTimScript(EMCState *script); int olol_getWallFlags(EMCState *script); + int olol_changeMonsterSettings(EMCState *script); int olol_playCharacterScriptChat(EMCState *script); int olol_update(EMCState *script); int olol_drawExitButton(EMCState *script); @@ -604,17 +615,25 @@ private: int olol_playDialogueTalkText(EMCState *script); int olol_checkMonsterTypeHostility(EMCState *script); int olol_setNextFunc(EMCState *script); + int olol_dummy1(EMCState *script); + int olol_suspendMonster(EMCState *script); int olol_setDoorState(EMCState *script); int olol_processButtonClick(EMCState *script); int olol_savePage5(EMCState *script); int olol_restorePage5(EMCState *script); - int olol_initNonAnimatedDialogue(EMCState *script); - int olol_restoreAfterNonAnimatedDialogue(EMCState *script); + int olol_initDialogueSequence(EMCState *script); + int olol_restoreAfterDialogueSequence(EMCState *script); + int olol_setSpecialSceneButtons(EMCState *script); + int olol_prepareSpecialScene(EMCState *script); + int olol_restoreAfterSpecialScene(EMCState *script); int olol_assignCustomSfx(EMCState *script); - int olol_resetPortraitsArea(EMCState *script); + int olol_resetPortraitsAndDisableSysTimer(EMCState *script); int olol_enableSysTimer(EMCState *script); + int olol_disableControls(EMCState *script); + int olol_enableControls(EMCState *script); int olol_queueSpeech(EMCState *script); int olol_getItemPrice(EMCState *script); + int olol_getLanguage(EMCState *script); // tim scripts TIM *_activeTim[10]; @@ -629,8 +648,8 @@ private: int tlol_processWsaFrame(const TIM *tim, const uint16 *param); int tlol_displayText(const TIM *tim, const uint16 *param); - int tlol_initAnimatedDialogue(const TIM *tim, const uint16 *param); - int tlol_restoreAfterAnimatedDialogue(const TIM *tim, const uint16 *param); + int tlol_initSceneWindowDialogue(const TIM *tim, const uint16 *param); + int tlol_restoreAfterSceneWindowDialogue(const TIM *tim, const uint16 *param); int tlol_giveItem(const TIM *tim, const uint16 *param); int tlol_setPartyPosition(const TIM *tim, const uint16 *param); int tlol_fadeClearWindow(const TIM *tim, const uint16 *param); @@ -663,11 +682,11 @@ private: // graphics void setupScreenDims(); - void initAnimatedDialogue(int controlMode); - void restoreAfterAnimatedDialogue(int redraw); - void initNonAnimatedDialogue(int controlMode, int pageNum); - void restoreAfterNonAnimatedDialogue(int controlMode); - void resetPortraitsArea(); + void initSceneWindowDialogue(int controlMode); + void restoreAfterSceneWindowDialogue(int redraw); + void initDialogueSequence(int controlMode, int pageNum); + void restoreAfterDialogueSequence(int controlMode); + void resetPortraitsAndDisableSysTimer(); void toggleSelectedCharacterFrame(bool mode); void fadeText(); void setPaletteBrightness(uint8 *palette, int brightness, int modifier); @@ -699,8 +718,8 @@ private: // characters bool addCharacter(int id); - void initCharacter(int charNum, int firstFaceFrame, int unk2, int redraw); - void initCharacterUnkSub(int charNum, int unk1, int unk2, int unk3); + void setFaceFrames(int charNum, int defaultFrame, int unk2, int redraw); + void setFaceFramesUnkArrays(int charNum, int unk1, int unk2, int unk3); int countActiveCharacters(); void loadCharFaceShapes(int charNum, int id); void calcCharPortraitXpos(); @@ -774,20 +793,20 @@ private: void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile); void resetItems(int flag); - void resetLvlBuffer(); + void disableMonsters(); void resetBlockProperties(); bool testWallFlag(int block, int direction, int flag); bool testWallInvisibility(int block, int direction); void drawScene(int pageNum); - void generateBlockDrawingBuffer(int block, int direction); - void generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries); - void generateBlockDrawingBufferF1(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries); + void generateBlockDrawingBuffer(); + void generateVmpTileData(int16 startBlockX, uint8 startBlockY, uint8 wllVmpIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY); + void generateVmpTileDataFlipped(int16 startBlockX, uint8 startBlockY, uint8 wllVmpIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY); bool hasWall(int index); - void assignBlockCaps(int block, int direction); + void assignVisibleBlocks(int block, int direction); - void drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint8 *vcnShift, int pageNum); + void drawVcnBlocks(); void drawSceneShapes(); void setLevelShapesDim(int index, int16 &x1, int16 &x2, int dim); void scaleLevelShapesDim(int index, int16 &y1, int16 &y2, int dim); @@ -798,8 +817,12 @@ private: void setWallType(int block, int wall, int val); void updateSceneWindow(); - void setSequenceGui(int x, int y, int w, int h, int enableFlags); - void restoreDefaultGui(); + void prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag); + int restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode); + + void setSequenceButtons(int x, int y, int w, int h, int enableFlags); + void setSpecialSceneButtons(int x, int y, int w, int h, int enableFlags); + void setDefaultButtonState(); void updateCompass(); @@ -814,7 +837,7 @@ private: void calcCoordinatesAddDirectionOffset(int16 &x, int16 &y, int direction); int clickedWallShape(uint16 block, uint16 direction); - int clicked2(uint16 block, uint16 direction); + int clickedLever(uint16 block, uint16 direction); int clicked3(uint16 block, uint16 direction); int clickedWallOnlyScript(uint16 block); int clickedDoorSwitch(uint16 block, uint16 direction); @@ -823,6 +846,7 @@ private: bool clickedShape(int shapeIndex); void processDoorSwitch(uint16 block, int unk); void openCloseDoor(uint16 block, int openClose); + void resetDoors(); void movePartySmoothScrollBlocked(int speed); void movePartySmoothScrollUp(int speed); @@ -874,9 +898,9 @@ private: int _lastSpecialColor; int _lastSpecialColorWeight; - int _sceneDrawVar1; - int _sceneDrawVar2; - int _sceneDrawVar3; + int _sceneDrawVarDown; + int _sceneDrawVarRight; + int _sceneDrawVarLeft; int _wllProcessFlag; uint8 *_trueLightTable2; @@ -895,7 +919,7 @@ private: int16 *_lvlShapeLeftRight; LevelBlockProperty *_levelBlockProperties; - LevelBlockProperty *_curBlockCaps[18]; + LevelBlockProperty *_visibleBlocks[18]; uint16 _partyPosX; uint16 _partyPosY; @@ -913,6 +937,7 @@ private: int _lastMouseRegion; int _seqWindowX1, _seqWindowY1, _seqWindowX2, _seqWindowY2, _seqTrigger; + int _spsWindowX, _spsWindowY, _spsWindowW, _spsWindowH; uint8 *_tempBuffer5120; @@ -970,7 +995,8 @@ private: // items void giveCredits(int credits, int redraw); void takeCredits(int credits, int redraw); - int makeItem(int itemIndex, int curFrame, int flags); + int makeItem(int itemType, int curFrame, int flags); + void placeMoveLevelItem(int itemIndex, int level, int block, int xOffs, int yOffs, int flyingHeight); bool addItemToInventory(int itemIndex); bool testUnkItemFlags(int itemIndex); void deleteItem(int itemIndex); @@ -979,7 +1005,7 @@ private: void setHandItem(uint16 itemIndex); void setItemPosition(int item, uint16 x, uint16 y, int flyingHeight, int b); - void pickupItem(int item, int block); + void removeLevelItem(int item, int block); bool throwItem(int a, int item, int x, int y, int flyingHeight, int direction, int, int charNum, int c); void endObjectFlight(FlyingObject *t, int x, int y, int objectOnNextBlock); void processObjectFlight(FlyingObject *t, int x, int y); @@ -1000,10 +1026,11 @@ private: int _itemInHand; uint16 _inventory[48]; int _inventoryCurItem; - int _hideControls; + int _currentControlMode; + int _specialSceneFlag; int _lastCharInventory; - FlyingObject *_flyingItems; + FlyingObject *_flyingObjects; EMCData _itemScript; @@ -1121,6 +1148,7 @@ private: const SpellProperty *_spellProperties; int _spellPropertiesSize; int _subMenuIndex; + uint16 _unkIceSHpFlag; // unneeded void setWalkspeed(uint8) {} diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 429223101e..ae868ea8ea 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -51,7 +51,7 @@ void LoLEngine::loadLevel(int index) { _emc->unload(&_scriptData); resetItems(1); - resetLvlBuffer(); + disableMonsters(); resetBlockProperties(); releaseMonsterShapes(0); @@ -63,7 +63,7 @@ void LoLEngine::loadLevel(int index) { _currentLevel = index; _updateFlags = 0; - restoreDefaultGui(); + setDefaultButtonState(); loadTalkFile(index); @@ -335,9 +335,9 @@ void LoLEngine::loadLevelShpDat(const char *shpFile, const char *datFile, bool f for (int ii = 0; ii < 10; ii++) l->scaleFlag[ii] = s->readByte(); for (int ii = 0; ii < 10; ii++) - l->shapeX[ii] = s->readUint16LE(); + l->shapeX[ii] = s->readSint16LE(); for (int ii = 0; ii < 10; ii++) - l->shapeY[ii] = s->readUint16LE(); + l->shapeY[ii] = s->readSint16LE(); l->next = s->readByte(); l->flags = s->readByte(); } @@ -402,7 +402,19 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight memset(_screen->_currentPalette + 384, 0xff, 384); memcpy(_screen->_currentPalette + 384, tmpPal, 384);*/ - //loadSwampIceCol(); + if (_currentLevel == 11) { + uint8 *swampPal = _res->fileData("SWAMPICE.COL", 0); + memcpy(_screen->getPalette(2), swampPal, 384); + memcpy(_screen->getPalette(2) + 0x180, _screen->_currentPalette, 384); + delete[] swampPal; + + if (_unkIceSHpFlag & 4) { + uint8 *pal0 = _screen->_currentPalette; + uint8 *pal2 = _screen->getPalette(2); + for (int i = 1; i < 768; i++) + SWAP(pal0[i], pal2[i]); + } + } memcpy(_vcnBlocks, v, vcnLen); v += vcnLen; @@ -469,14 +481,15 @@ void LoLEngine::resetItems(int flag) { ItemInPlay *it = &_itemsInPlay[id]; it->level = _currentLevel; it->blockPropertyIndex = i; - r->nextAssignedObject = 0; + if (r) + r->nextAssignedObject = 0; } if (flag) - memset(_flyingItems, 0, 8 * sizeof(FlyingObject)); + memset(_flyingObjects, 0, 8 * sizeof(FlyingObject)); } -void LoLEngine::resetLvlBuffer() { +void LoLEngine::disableMonsters() { memset(_monsters, 0, 30 * sizeof(MonsterInPlay)); for (int i = 0; i < 30; i++) _monsters[i].mode = 0x10; @@ -726,7 +739,7 @@ int LoLEngine::clickedWallShape(uint16 block, uint16 direction) { return 1; } -int LoLEngine::clicked2(uint16 block, uint16 direction) { +int LoLEngine::clickedLever(uint16 block, uint16 direction) { return 1; } @@ -856,6 +869,22 @@ void LoLEngine::openCloseDoor(uint16 block, int openClose) { } } +void LoLEngine::resetDoors() { + for (int i = 0; i < 3; i++) { + if (!_openDoorState[i].block) + continue; + + uint16 b = _openDoorState[i].block; + + do { + _levelBlockProperties[b].walls[_openDoorState[i].wall] += _openDoorState[i].state; + _levelBlockProperties[b].walls[_openDoorState[i].wall ^ 2] += _openDoorState[i].state; + } while (!(_wllWallFlags[_levelBlockProperties[b].walls[_openDoorState[i].wall]] & 0x30)); + + _openDoorState[i].block = 0; + } +} + void LoLEngine::movePartySmoothScrollBlocked(int speed) { if (!_smoothScrollingEnabled || (_smoothScrollingEnabled && _hideInventory)) return; @@ -1152,8 +1181,8 @@ void LoLEngine::drawScene(int pageNum) { updateSceneWindow(); } - generateBlockDrawingBuffer(_currentBlock, _currentDirection); - drawVcnBlocks(_vcnBlocks, _blockDrawingBuffer, _vcnShift, _sceneDrawPage1); + generateBlockDrawingBuffer(); + drawVcnBlocks(); drawSceneShapes(); if (!pageNum) { @@ -1192,7 +1221,108 @@ void LoLEngine::updateSceneWindow() { _screen->showMouse(); } -void LoLEngine::setSequenceGui(int x, int y, int w, int h, int enableFlags) { +void LoLEngine::prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag) { + resetPortraitsAndDisableSysTimer(); + if (fieldType) { + if (suspendGui) + gui_specialSceneSuspendControls(1); + + if (!allowSceneUpdate) + _sceneDefaultUpdate = 0; + + if (hasDialogue) + initDialogueSequence(fieldType, 0); + + if (fadeFlag) { + _screen->fadePalette(_screen->getPalette(3), 10); + _screen->_fadeFlag = 0; + } + + setSpecialSceneButtons(0, 0, 320, 130, controlMode); + + } else { + if (suspendGui) + gui_specialSceneSuspendControls(0); + + if (!allowSceneUpdate) + _sceneDefaultUpdate = 0; + + gui_disableControls(controlMode); + + if (fadeFlag) { + memcpy(_screen->getPalette(3) + 384, _screen->_currentPalette + 384, 384); + _screen->loadSpecialColours(_screen->getPalette(3)); + _screen->fadePalette(_screen->getPalette(3), 10); + _screen->_fadeFlag = 0; + } + + if (hasDialogue) + initDialogueSequence(fieldType, 0); + + setSpecialSceneButtons(112, 0, 176, 120, controlMode); + } +} + +int LoLEngine::restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode) { + if (!_hideInventory) + return 0; + + _hideInventory = 0; + enableSysTimer(2); + + if (_dialogueField) + restoreAfterDialogueSequence(_currentControlMode); + + if (_specialSceneFlag) + gui_specialSceneRestoreControls(_currentControlMode); + + int l = _currentControlMode; + _currentControlMode = 0; + + gui_specialSceneRestoreButtons(); + calcCharPortraitXpos(); + + _currentControlMode = l; + + if (releaseTimScripts) { + for (int i = 0; i < TIM::kWSASlots; i++) + _tim->freeAnimStruct(i); + + for (int i = 0; i < 10; i++) + _tim->unload(_activeTim[i]); + } + + gui_enableControls(); + + if (fadeFlag) { + if ((_screen->_fadeFlag != 1 && _screen->_fadeFlag != 2) || (_screen->_fadeFlag == 1 && _currentControlMode)) { + if (_currentControlMode) + _screen->fadeToBlack(10); + else + _screen->fadeClearSceneWindow(10); + } + + _currentControlMode = 0; + calcCharPortraitXpos(); + + if (redrawPlayField) + gui_drawPlayField(); + + setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus); + + } else { + _currentControlMode = 0; + calcCharPortraitXpos(); + + if (redrawPlayField) + gui_drawPlayField(); + } + + _sceneDefaultUpdate = sceneUpdateMode; + return 1; +} + +void LoLEngine::setSequenceButtons(int x, int y, int w, int h, int enableFlags) { gui_enableSequenceButtons(x, y, w, h, enableFlags); _seqWindowX1 = x; _seqWindowY1 = y; @@ -1204,7 +1334,15 @@ void LoLEngine::setSequenceGui(int x, int y, int w, int h, int enableFlags) { _lampStatusSuspended = true; } -void LoLEngine::restoreDefaultGui() { +void LoLEngine::setSpecialSceneButtons(int x, int y, int w, int h, int enableFlags) { + gui_enableSequenceButtons(x, y, w, h, enableFlags); + _spsWindowX = x; + _spsWindowY = y; + _spsWindowW = w; + _spsWindowH = h; +} + +void LoLEngine::setDefaultButtonState() { gui_enableDefaultPlayfieldButtons(); _seqWindowX1 = _seqWindowY1 = _seqWindowX2 = _seqWindowY2 = _seqTrigger = 0; if (_lampStatusSuspended) @@ -1212,140 +1350,157 @@ void LoLEngine::restoreDefaultGui() { _lampStatusSuspended = false; } -void LoLEngine::generateBlockDrawingBuffer(int block, int direction) { - _sceneDrawVar1 = _dscBlockMap[_currentDirection]; - _sceneDrawVar2 = _dscBlockMap[_currentDirection + 4]; - _sceneDrawVar3 = _dscBlockMap[_currentDirection + 8]; +void LoLEngine::generateBlockDrawingBuffer() { + _sceneDrawVarDown = _dscBlockMap[_currentDirection]; + _sceneDrawVarRight = _dscBlockMap[_currentDirection + 4]; + _sceneDrawVarLeft = _dscBlockMap[_currentDirection + 8]; + + /******************************************* + * _visibleBlocks map * + * * + * | | | | | | * + * 00 | 01 | 02 | 03 | 04 | 05 | 06 * + * ____|_____|_____|_____|_____|_____|_____ * + * | | | | | | * + * | 07 | 08 | 09 | 10 | 11 | * + * |_____|_____|_____|_____|_____| * + * | | | | * + * | 12 | 13 | 14 | * + * |_____|_____|_____| * + * | | * + * 15 | 16 | 17 * + * | (P) | * + ********************************************/ memset(_blockDrawingBuffer, 0, 660 * sizeof(uint16)); - _wllProcessFlag = ((block >> 5) + (block & 0x1f) + _currentDirection) & 1; + _wllProcessFlag = ((_currentBlock >> 5) + (_currentBlock & 0x1f) + _currentDirection) & 1; if (_wllProcessFlag) // floor and ceiling - generateBlockDrawingBufferF1(0, 15, 1, -330, 22, 15); + generateVmpTileDataFlipped(0, 15, 1, -330, 22, 15); else - generateBlockDrawingBufferF0(0, 15, 1, -330, 22, 15); + generateVmpTileData(0, 15, 1, -330, 22, 15); - assignBlockCaps(block, direction); + assignVisibleBlocks(_currentBlock, _currentDirection); - uint8 t = _curBlockCaps[0]->walls[_sceneDrawVar2]; + uint8 t = _visibleBlocks[0]->walls[_sceneDrawVarRight]; if (t) - generateBlockDrawingBufferF0(-2, 3, t, 102, 3, 5); + generateVmpTileData(-2, 3, t, 102, 3, 5); - t = _curBlockCaps[6]->walls[_sceneDrawVar3]; + t = _visibleBlocks[6]->walls[_sceneDrawVarLeft]; if (t) - generateBlockDrawingBufferF1(21, 3, t, 102, 3, 5); + generateVmpTileDataFlipped(21, 3, t, 102, 3, 5); - t = _curBlockCaps[1]->walls[_sceneDrawVar2]; - uint8 t2 = _curBlockCaps[2]->walls[_sceneDrawVar1]; + t = _visibleBlocks[1]->walls[_sceneDrawVarRight]; + uint8 t2 = _visibleBlocks[2]->walls[_sceneDrawVarDown]; if (hasWall(t) && !(_wllWallFlags[t2] & 8)) - generateBlockDrawingBufferF0(2, 3, t, 102, 3, 5); + generateVmpTileData(2, 3, t, 102, 3, 5); else if (t && (_wllWallFlags[t2] & 8)) - generateBlockDrawingBufferF0(2, 3, t2, 102, 3, 5); + generateVmpTileData(2, 3, t2, 102, 3, 5); - t = _curBlockCaps[5]->walls[_sceneDrawVar3]; - t2 = _curBlockCaps[4]->walls[_sceneDrawVar1]; + t = _visibleBlocks[5]->walls[_sceneDrawVarLeft]; + t2 = _visibleBlocks[4]->walls[_sceneDrawVarDown]; if (hasWall(t) && !(_wllWallFlags[t2] & 8)) - generateBlockDrawingBufferF1(17, 3, t, 102, 3, 5); + generateVmpTileDataFlipped(17, 3, t, 102, 3, 5); else if (t && (_wllWallFlags[t2] & 8)) - generateBlockDrawingBufferF1(17, 3, t2, 102, 3, 5); + generateVmpTileDataFlipped(17, 3, t2, 102, 3, 5); - t = _curBlockCaps[2]->walls[_sceneDrawVar2]; + t = _visibleBlocks[2]->walls[_sceneDrawVarRight]; if (t) - generateBlockDrawingBufferF0(8, 3, t, 97, 1, 5); + generateVmpTileData(8, 3, t, 97, 1, 5); - t = _curBlockCaps[4]->walls[_sceneDrawVar3]; + t = _visibleBlocks[4]->walls[_sceneDrawVarLeft]; if (t) - generateBlockDrawingBufferF1(13, 3, t, 97, 1, 5); + generateVmpTileDataFlipped(13, 3, t, 97, 1, 5); - t = _curBlockCaps[1]->walls[_sceneDrawVar1]; + t = _visibleBlocks[1]->walls[_sceneDrawVarDown]; if (hasWall(t)) - generateBlockDrawingBufferF0(-4, 3, t, 129, 6, 5); + generateVmpTileData(-4, 3, t, 129, 6, 5); - t = _curBlockCaps[5]->walls[_sceneDrawVar1]; + t = _visibleBlocks[5]->walls[_sceneDrawVarDown]; if (hasWall(t)) - generateBlockDrawingBufferF0(20, 3, t, 129, 6, 5); + generateVmpTileData(20, 3, t, 129, 6, 5); - t = _curBlockCaps[2]->walls[_sceneDrawVar1]; + t = _visibleBlocks[2]->walls[_sceneDrawVarDown]; if (hasWall(t)) - generateBlockDrawingBufferF0(2, 3, t, 129, 6, 5); + generateVmpTileData(2, 3, t, 129, 6, 5); - t = _curBlockCaps[4]->walls[_sceneDrawVar1]; + t = _visibleBlocks[4]->walls[_sceneDrawVarDown]; if (hasWall(t)) - generateBlockDrawingBufferF0(14, 3, t, 129, 6, 5); + generateVmpTileData(14, 3, t, 129, 6, 5); - t = _curBlockCaps[3]->walls[_sceneDrawVar1]; + t = _visibleBlocks[3]->walls[_sceneDrawVarDown]; if (t) - generateBlockDrawingBufferF0(8, 3, t, 129, 6, 5); + generateVmpTileData(8, 3, t, 129, 6, 5); - t = _curBlockCaps[7]->walls[_sceneDrawVar2]; + t = _visibleBlocks[7]->walls[_sceneDrawVarRight]; if (t) - generateBlockDrawingBufferF0(0, 3, t, 117, 2, 6); + generateVmpTileData(0, 3, t, 117, 2, 6); - t = _curBlockCaps[11]->walls[_sceneDrawVar3]; + t = _visibleBlocks[11]->walls[_sceneDrawVarLeft]; if (t) - generateBlockDrawingBufferF1(20, 3, t, 117, 2, 6); + generateVmpTileDataFlipped(20, 3, t, 117, 2, 6); - t = _curBlockCaps[8]->walls[_sceneDrawVar2]; + t = _visibleBlocks[8]->walls[_sceneDrawVarRight]; if (t) - generateBlockDrawingBufferF0(6, 2, t, 81, 2, 8); + generateVmpTileData(6, 2, t, 81, 2, 8); - t = _curBlockCaps[10]->walls[_sceneDrawVar3]; + t = _visibleBlocks[10]->walls[_sceneDrawVarLeft]; if (t) - generateBlockDrawingBufferF1(14, 2, t, 81, 2, 8); + generateVmpTileDataFlipped(14, 2, t, 81, 2, 8); - t = _curBlockCaps[8]->walls[_sceneDrawVar1]; + t = _visibleBlocks[8]->walls[_sceneDrawVarDown]; if (hasWall(t)) - generateBlockDrawingBufferF0(-4, 2, t, 159, 10, 8); + generateVmpTileData(-4, 2, t, 159, 10, 8); - t = _curBlockCaps[10]->walls[_sceneDrawVar1]; + t = _visibleBlocks[10]->walls[_sceneDrawVarDown]; if (hasWall(t)) - generateBlockDrawingBufferF0(16, 2, t, 159, 10, 8); + generateVmpTileData(16, 2, t, 159, 10, 8); - t = _curBlockCaps[9]->walls[_sceneDrawVar1]; + t = _visibleBlocks[9]->walls[_sceneDrawVarDown]; if (t) - generateBlockDrawingBufferF0(6, 2, t, 159, 10, 8); + generateVmpTileData(6, 2, t, 159, 10, 8); - t = _curBlockCaps[12]->walls[_sceneDrawVar2]; + t = _visibleBlocks[12]->walls[_sceneDrawVarRight]; if (t) - generateBlockDrawingBufferF0(3, 1, t, 45, 3, 12); + generateVmpTileData(3, 1, t, 45, 3, 12); - t = _curBlockCaps[14]->walls[_sceneDrawVar3]; + t = _visibleBlocks[14]->walls[_sceneDrawVarLeft]; if (t) - generateBlockDrawingBufferF1(16, 1, t, 45, 3, 12); + generateVmpTileDataFlipped(16, 1, t, 45, 3, 12); - t = _curBlockCaps[12]->walls[_sceneDrawVar1]; + t = _visibleBlocks[12]->walls[_sceneDrawVarDown]; if (!(_wllWallFlags[t] & 8)) - generateBlockDrawingBufferF0(-13, 1, t, 239, 16, 12); + generateVmpTileData(-13, 1, t, 239, 16, 12); - t = _curBlockCaps[14]->walls[_sceneDrawVar1]; + t = _visibleBlocks[14]->walls[_sceneDrawVarDown]; if (!(_wllWallFlags[t] & 8)) - generateBlockDrawingBufferF0(19, 1, t, 239, 16, 12); + generateVmpTileData(19, 1, t, 239, 16, 12); - t = _curBlockCaps[13]->walls[_sceneDrawVar1]; + t = _visibleBlocks[13]->walls[_sceneDrawVarDown]; if (t) - generateBlockDrawingBufferF0(3, 1, t, 239, 16, 12); + generateVmpTileData(3, 1, t, 239, 16, 12); - t = _curBlockCaps[15]->walls[_sceneDrawVar2]; - t2 = _curBlockCaps[17]->walls[_sceneDrawVar3]; - if (t) // wall to the immediate left - generateBlockDrawingBufferF0(0, 0, t, 0, 3, 15); - if (t2) // wall to the immediate right - generateBlockDrawingBufferF1(19, 0, t2, 0, 3, 15); + t = _visibleBlocks[15]->walls[_sceneDrawVarRight]; + t2 = _visibleBlocks[17]->walls[_sceneDrawVarLeft]; + if (t) + generateVmpTileData(0, 0, t, 0, 3, 15); + if (t2) + generateVmpTileDataFlipped(19, 0, t2, 0, 3, 15); } -void LoLEngine::generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries) { - if (!_wllVmpMap[wllVmpIndex]) +void LoLEngine::generateVmpTileData(int16 startBlockX, uint8 startBlockY, uint8 vmpMapIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY) { + if (!_wllVmpMap[vmpMapIndex]) return; - uint16 *vmp = &_vmpPtr[(_wllVmpMap[wllVmpIndex] - 1) * 431 + vmpOffset + 330]; + uint16 *vmp = &_vmpPtr[(_wllVmpMap[vmpMapIndex] - 1) * 431 + vmpOffset + 330]; - for (int i = 0; i < numEntries; i++) { - uint16 *bl = &_blockDrawingBuffer[(wllIndex + i) * 22 + wllOffset]; - for (int ii = 0; ii < len; ii++) { - if ((wllOffset + ii >= 0) && (wllOffset + ii < 22) && *vmp) + for (int i = 0; i < numBlocksY; i++) { + uint16 *bl = &_blockDrawingBuffer[(startBlockY + i) * 22 + startBlockX]; + for (int ii = 0; ii < numBlocksX; ii++) { + if ((startBlockX + ii >= 0) && (startBlockX + ii < 22) && *vmp) *bl = *vmp; bl++; vmp++; @@ -1353,18 +1508,18 @@ void LoLEngine::generateBlockDrawingBufferF0(int16 wllOffset, uint8 wllIndex, ui } } -void LoLEngine::generateBlockDrawingBufferF1(int16 wllOffset, uint8 wllIndex, uint8 wllVmpIndex, int16 vmpOffset, uint8 len, uint8 numEntries) { - if (!_wllVmpMap[wllVmpIndex]) +void LoLEngine::generateVmpTileDataFlipped(int16 startBlockX, uint8 startBlockY, uint8 vmpMapIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY) { + if (!_wllVmpMap[vmpMapIndex]) return; - uint16 *vmp = &_vmpPtr[(_wllVmpMap[wllVmpIndex] - 1) * 431 + vmpOffset + 330]; + uint16 *vmp = &_vmpPtr[(_wllVmpMap[vmpMapIndex] - 1) * 431 + vmpOffset + 330]; - for (int i = 0; i < numEntries; i++) { - for (int ii = 0; ii < len; ii++) { - if ((wllOffset + ii) < 0 || (wllOffset + ii) > 21) + for (int i = 0; i < numBlocksY; i++) { + for (int ii = 0; ii < numBlocksX; ii++) { + if ((startBlockX + ii) < 0 || (startBlockX + ii) > 21) continue; - uint16 v = vmp[i * len + (len - 1 - ii)]; + uint16 v = vmp[i * numBlocksX + (numBlocksX - 1 - ii)]; if (!v) continue; @@ -1373,7 +1528,7 @@ void LoLEngine::generateBlockDrawingBufferF1(int16 wllOffset, uint8 wllIndex, ui else v |= 0x4000; - _blockDrawingBuffer[(wllIndex + i) * 22 + wllOffset + ii] = v; + _blockDrawingBuffer[(startBlockY + i) * 22 + startBlockX + ii] = v; } } } @@ -1384,48 +1539,51 @@ bool LoLEngine::hasWall(int index) { return true; } -void LoLEngine::assignBlockCaps(int block, int direction) { +void LoLEngine::assignVisibleBlocks(int block, int direction) { for (int i = 0; i < 18; i++) { uint16 t = (block + _dscBlockIndex[direction * 18 + i]) & 0x3ff; - _currentBlockPropertyIndex[i] = t; + _visibleBlockIndex[i] = t; - _curBlockCaps[i] = &_levelBlockProperties[t]; + _visibleBlocks[i] = &_levelBlockProperties[t]; _lvlShapeLeftRight[i] = _lvlShapeLeftRight[18 + i] = -1; } } -void LoLEngine::drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint8 *vcnShift, int pageNum) { +void LoLEngine::drawVcnBlocks() { uint8 *d = _sceneWindowBuffer; + uint16 *bdb = _blockDrawingBuffer; for (int y = 0; y < 15; y++) { for (int x = 0; x < 22; x++) { - bool flag = false; + bool horizontalFlip = false; int remainder = 0; - uint16 vcnOffset = *blockDrawingBuffer++; + uint16 vcnOffset = *bdb++; if (vcnOffset & 0x8000) { + // this renders a wall block over the transparent pixels of a floor/ceiling block remainder = vcnOffset - 0x8000; vcnOffset = 0; } if (vcnOffset & 0x4000) { - flag = true; + horizontalFlip = true; vcnOffset &= 0x3fff; } if (!vcnOffset) { - vcnOffset = blockDrawingBuffer[329]; + // floor/ceiling blocks + vcnOffset = bdb[329]; if (vcnOffset & 0x4000) { - flag = true; + horizontalFlip = true; vcnOffset &= 0x3fff; } } - uint8 shift = vcnShift[vcnOffset]; - uint8 *src = &vcnBlocks[vcnOffset << 5]; + uint8 shift = _vcnShift[vcnOffset]; + uint8 *src = &_vcnBlocks[vcnOffset << 5]; - if (flag) { + if (horizontalFlip) { for (int blockY = 0; blockY < 8; blockY++) { src += 3; for (int blockX = 0; blockX < 4; blockX++) { @@ -1450,17 +1608,17 @@ void LoLEngine::drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint if (remainder) { d -= 8; - flag = false; + horizontalFlip = false; if (remainder & 0x4000) { remainder &= 0x3fff; - flag = true; + horizontalFlip = true; } - shift = vcnShift[remainder]; - src = &vcnBlocks[remainder << 5]; + shift = _vcnShift[remainder]; + src = &_vcnBlocks[remainder << 5]; - if (flag) { + if (horizontalFlip) { for (int blockY = 0; blockY < 8; blockY++) { src += 3; for (int blockX = 0; blockX < 4; blockX++) { @@ -1499,13 +1657,13 @@ void LoLEngine::drawVcnBlocks(uint8 *vcnBlocks, uint16 *blockDrawingBuffer, uint d += 1232; } - _screen->copyBlockToPage(pageNum, 112, 0, 176, 120, _sceneWindowBuffer); + _screen->copyBlockToPage(_sceneDrawPage1, 112, 0, 176, 120, _sceneWindowBuffer); } void LoLEngine::drawSceneShapes() { for (int i = 0; i < 18; i++) { uint8 t = _dscTileIndex[i]; - uint8 s = _curBlockCaps[t]->walls[_sceneDrawVar1]; + uint8 s = _visibleBlocks[t]->walls[_sceneDrawVarDown]; int16 x1 = 0; int16 x2 = 0; @@ -1527,7 +1685,7 @@ void LoLEngine::drawSceneShapes() { drawBlockEffects(t, 0); - if (_curBlockCaps[t]->assignedObjects && (w & 0x80)) + if (_visibleBlocks[t]->assignedObjects && (w & 0x80)) drawBlockObjects(t); drawBlockEffects(t, 1); @@ -1554,7 +1712,7 @@ void LoLEngine::setLevelShapesDim(int index, int16 &x1, int16 &x2, int dim) { int m = index * 18; for (int i = 0; i < 18; i++) { - uint8 d = _curBlockCaps[i]->walls[_sceneDrawVar1]; + uint8 d = _visibleBlocks[i]->walls[_sceneDrawVarDown]; uint8 a = _wllWallFlags[d]; if (a & 8) { @@ -1650,7 +1808,7 @@ void LoLEngine::drawDecorations(int index) { continue; uint8 d = (_currentDirection + _dscUnk1[s]) & 3; - int8 l = _wllShapeMap[_curBlockCaps[index]->walls[d]]; + int8 l = _wllShapeMap[_visibleBlocks[index]->walls[d]]; uint8 *shapeData = 0; @@ -1716,7 +1874,7 @@ void LoLEngine::drawDecorations(int index) { void LoLEngine::drawBlockEffects(int index, int type) { static const int16 yOffs[] = { 0xff, 0xff, 0x80, 0x80 }; - uint8 flg = _curBlockCaps[index]->flags; + uint8 flg = _visibleBlocks[index]->flags; // flags: 0x10 = ice wall, 0x20 = teleporter, 0x40 = blue slime spot, 0x80 = blood spot if (!(flg & 0xf0)) return; @@ -1734,8 +1892,8 @@ void LoLEngine::drawBlockEffects(int index, int type) { calcCoordinatesAddDirectionOffset(x, y, _currentDirection); - x |= ((_currentBlockPropertyIndex[index] & 0x1f) << 8); - y |= ((_currentBlockPropertyIndex[index] & 0xffe0) << 3); + x |= ((_visibleBlockIndex[index] & 0x1f) << 8); + y |= ((_visibleBlockIndex[index] & 0xffe0) << 3); drawItemOrMonster(_effectShapes[type], ovl, x, y, 0, (type == 1) ? -20 : 0, drawFlag, -1, false); } diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp index dce08e6462..c706ce4741 100644 --- a/engines/kyra/script_lol.cpp +++ b/engines/kyra/script_lol.cpp @@ -98,7 +98,7 @@ bool LoLEngine::checkSceneUpdateNeed(int func) { return true; for (int i = 0; i < 15; i++) { - if (_currentBlockPropertyIndex[i] == func) { + if (_visibleBlockIndex[i] == func) { _sceneUpdateRequired = true; return true; } @@ -212,6 +212,15 @@ int LoLEngine::olol_makeItem(EMCState *script) { return makeItem(stackPos(0), stackPos(1), stackPos(2)); } +int LoLEngine::olol_createLevelItem(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setItemProperty(%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 item = makeItem(stackPos(0), stackPos(1), stackPos(2)); + if (item == -1) + return item; + placeMoveLevelItem(item, stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7)); + return item; +} + int LoLEngine::olol_getItemPara(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_getItemPara(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); if (!stackPos(0)) @@ -458,6 +467,18 @@ int LoLEngine::olol_setMusicTrack(EMCState *script) { return 1; } +int LoLEngine::olol_setSequenceButtons(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setSequenceButtons(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); + setSequenceButtons(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); + return 1; +} + +int LoLEngine::olol_setDefaultButtonState(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setDefaultButtonState(%p)", (const void *)script); + setDefaultButtonState(); + return 1; +} + int LoLEngine::olol_checkRectForMousePointer(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_checkRectForMousePointer(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3)); return posWithinRect(_mouseX, _mouseY, stackPos(0), stackPos(1), stackPos(2), stackPos(3)) ? 1 : 0; @@ -465,7 +486,7 @@ int LoLEngine::olol_checkRectForMousePointer(EMCState *script) { int LoLEngine::olol_clearDialogueField(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_clearDialogueField(%p) (%d)", (const void *)script, stackPos(0)); - if (_hideControls && (!textEnabled())) + if (_currentControlMode && (!textEnabled())) return 1; _screen->setScreenDim(5); @@ -489,6 +510,12 @@ int LoLEngine::olol_startBackgroundAnimation(EMCState *script) { return 1; } +int LoLEngine::olol_fadeToBlack(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_fadeToBlack(%p) (%d)", (const void *)script, stackPos(0)); + _screen->fadeToBlack(10); + return 1; +} + int LoLEngine::olol_fadePalette(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_fadePalette(%p)", (const void *)script); _screen->fadePalette(_screen->getPalette(3), 10); @@ -602,7 +629,7 @@ int LoLEngine::olol_setGlobalVar(EMCState *script) { case 8: _updateFlags = b; if (b == 1) { - if (!textEnabled() || (!(_hideControls & 2))) + if (!textEnabled() || (!(_currentControlMode & 2))) timerUpdatePortraitAnimations(1); disableSysTimer(2); } else { @@ -735,6 +762,45 @@ int LoLEngine::olol_fadeSequencePalette(EMCState *script) { return 1; } +int LoLEngine::olol_redrawPlayfield(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_redrawPlayfield(%p)", (const void *)script); + if (_screen->_fadeFlag != 2) + _screen->fadeClearSceneWindow(10); + gui_drawPlayField(); + setPaletteBrightness(_screen->_currentPalette, _brightness, _lampOilStatus); + _screen->_fadeFlag = 0; + return 1; +} + +int LoLEngine::olol_loadNewLevel(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_loadNewLevel(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); + _screen->fadeClearSceneWindow(10); + _screen->fillRect(112, 0, 288, 120, 0); + disableSysTimer(2); + + for (int i = 0; i < 8; i++) { + if (!_flyingObjects[i].enable || _flyingObjects[i].a) + continue; + endObjectFlight(&_flyingObjects[i], _flyingObjects[i].x, _flyingObjects[i].y, 1); + } + + resetDoors(); + + /////////////////////// + // TODO: generate temp files + + _currentBlock = stackPos(1); + _currentDirection = stackPos(2); + calcCoordinates(_partyPosX, _partyPosY, _currentBlock, 0x80, 0x80); + + loadLevel(stackPos(0)); + + enableSysTimer(2); + + script->ip = 0; + return 1; +} + int LoLEngine::olol_dummy0(EMCState *script) { return 0; } @@ -865,6 +931,41 @@ int LoLEngine::olol_createHandItem(EMCState *script) { return 1; } +int LoLEngine::olol_characterJoinsParty(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_characterJoinsParty(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); + + int16 id = stackPos(0); + if (id < 0) + id = -id; + + for (int i = 0; i < 4; i++) { + if (!(_characters[i].flags & 1) || _characters[i].id != id) + continue; + + _characters[i].flags &= 0xfffe; + calcCharPortraitXpos(); + + if (!_updateFlags) { + gui_enableDefaultPlayfieldButtons(); + gui_drawPlayField(); + } + + if (_selectedCharacter == i) + _selectedCharacter = 0; + + return 1; + } + + addCharacter(id); + + if (!_updateFlags) { + gui_enableDefaultPlayfieldButtons(); + gui_drawPlayField(); + } + + return 1; +} + int LoLEngine::olol_loadTimScript(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_loadTimScript(%p) (%d, %s)", (const void *)script, stackPos(0), stackPosString(1)); if (_activeTim[stackPos(0)]) @@ -886,15 +987,15 @@ int LoLEngine::olol_releaseTimScript(EMCState *script) { return 1; } -int LoLEngine::olol_initAnimatedDialogue(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0)); - initAnimatedDialogue(stackPos(0)); +int LoLEngine::olol_initSceneWindowDialogue(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initSceneWindowDialogue(%p) (%d)", (const void *)script, stackPos(0)); + initSceneWindowDialogue(stackPos(0)); return 1; } -int LoLEngine::olol_restoreAfterAnimatedDialogue(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0)); - restoreAfterAnimatedDialogue(stackPos(0)); +int LoLEngine::olol_restoreAfterSceneWindowDialogue(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterSceneWindowDialogue(%p) (%d)", (const void *)script, stackPos(0)); + restoreAfterSceneWindowDialogue(stackPos(0)); return 1; } @@ -943,6 +1044,48 @@ int LoLEngine::olol_getWallFlags(EMCState *script) { return _wllWallFlags[_levelBlockProperties[stackPos(0)].walls[stackPos(1) & 3]]; } +int LoLEngine::olol_changeMonsterSettings(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_changeMonsterSettings(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); + if (stackPos(0) == -1) + return 1; + + MonsterInPlay *m = &_monsters[stackPos(0) & 0x7fff]; + + int16 d = stackPos(2); + uint16 x = 0; + uint16 y = 0; + + switch (stackPos(1)) { + case 0: + setMonsterMode(m, d); + break; + + case 1: + m->might = d; + break; + + case 2: + calcCoordinates(x, y, d, m->x & 0xff, m->y & 0xff); + if (!walkMonsterCheckDest(x, y, m, 7)) + placeMonster(m, x, y); + break; + + case 3: + setMonsterDirection(m, d << 1); + break; + + case 6: + m->flags |= d; + break; + + default: + break; + } + + return 1; +} + + int LoLEngine::olol_playCharacterScriptChat(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_playCharacterScriptChat(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); snd_stopSpeech(1); @@ -1047,6 +1190,19 @@ int LoLEngine::olol_setNextFunc(EMCState *script) { return 1; } +int LoLEngine::olol_dummy1(EMCState *script) { + return 1; +} + +int LoLEngine::olol_suspendMonster(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_suspendMonster(%p) (%d)", (const void *)script, stackPos(0)); + MonsterInPlay *m = &_monsters[stackPos(0) & 0x7fff]; + setMonsterMode(m, 14); + checkSceneUpdateNeed(m->blockPropertyIndex); + placeMonster(m, 0, 0); + return 1; +} + int LoLEngine::olol_setDoorState(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setDoorState(%p) (%d)", (const void *)script, stackPos(0)); _emcDoorState = stackPos(0); @@ -1071,18 +1227,35 @@ int LoLEngine::olol_restorePage5(EMCState *script) { return 1; } -int LoLEngine::olol_initNonAnimatedDialogue(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initNonAnimatedDialogue(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); - initNonAnimatedDialogue(stackPos(0), stackPos(1)); +int LoLEngine::olol_initDialogueSequence(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_initDialogueSequence(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); + initDialogueSequence(stackPos(0), stackPos(1)); + return 1; +} + +int LoLEngine::olol_restoreAfterDialogueSequence(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterDialogueSequence(%p) (%d)", (const void *)script, stackPos(0)); + restoreAfterDialogueSequence(stackPos(0)); + return 1; +} + +int LoLEngine::olol_setSpecialSceneButtons(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setSpecialSceneButtons(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); + setSpecialSceneButtons(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); return 1; } -int LoLEngine::olol_restoreAfterNonAnimatedDialogue(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterNonAnimatedDialogue(%p) (%d)", (const void *)script, stackPos(0)); - restoreAfterNonAnimatedDialogue(stackPos(0)); +int LoLEngine::olol_prepareSpecialScene(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_prepareSpecialScene(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5)); + prepareSpecialScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5)); return 1; } +int LoLEngine::olol_restoreAfterSpecialScene(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreAfterSpecialScene(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3)); + return restoreAfterSpecialScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3)); +} + int LoLEngine::olol_assignCustomSfx(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_assignCustomSfx(%p) (%s, %d)", (const void *)script, stackPosString(0), stackPos(1)); const char *c = stackPosString(0); @@ -1100,17 +1273,29 @@ int LoLEngine::olol_assignCustomSfx(EMCState *script) { return 0; } -int LoLEngine::olol_resetPortraitsArea(EMCState *script) { - resetPortraitsArea(); +int LoLEngine::olol_resetPortraitsAndDisableSysTimer(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_resetPortraitsAndDisableSysTimer(%p)", (const void *)script); + resetPortraitsAndDisableSysTimer(); return 1; } int LoLEngine::olol_enableSysTimer(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_enableSysTimer(%p)", (const void *)script); _hideInventory = 0; enableSysTimer(2); return 1; } +int LoLEngine::olol_disableControls(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_disableControls(%p) (%d)", (const void *)script, stackPos(0)); + return gui_disableControls(stackPos(0)); +} + +int LoLEngine::olol_enableControls(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_enableControls(%p)", (const void *)script); + return gui_enableControls(); +} + int LoLEngine::olol_queueSpeech(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_queueSpeech(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); if (stackPos(0) && stackPos(1)) { @@ -1140,6 +1325,11 @@ int LoLEngine::olol_getItemPrice(EMCState *script) { return 0; } +int LoLEngine::olol_getLanguage(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_getLanguage(%p)", (const void *)script); + return _lang; +} + #pragma mark - int LoLEngine::tlol_setupPaletteFade(const TIM *tim, const uint16 *param) { @@ -1199,15 +1389,15 @@ int LoLEngine::tlol_displayText(const TIM *tim, const uint16 *param) { return 1; } -int LoLEngine::tlol_initAnimatedDialogue(const TIM *tim, const uint16 *param) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_initAnimatedDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]); - initAnimatedDialogue(param[0]); +int LoLEngine::tlol_initSceneWindowDialogue(const TIM *tim, const uint16 *param) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_initSceneWindowDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]); + initSceneWindowDialogue(param[0]); return 1; } -int LoLEngine::tlol_restoreAfterAnimatedDialogue(const TIM *tim, const uint16 *param) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_restoreAfterAnimatedDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]); - restoreAfterAnimatedDialogue(param[0]); +int LoLEngine::tlol_restoreAfterSceneWindowDialogue(const TIM *tim, const uint16 *param) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::tlol_restoreAfterSceneWindowDialogue(%p, %p) (%d)", (const void*)tim, (const void*)param, param[0]); + restoreAfterSceneWindowDialogue(param[0]); return 1; } @@ -1388,7 +1578,7 @@ void LoLEngine::setupOpcodeTable() { // 0x10 OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(olol_createLevelItem); Opcode(olol_getItemPara); Opcode(olol_getCharacterStat); @@ -1408,19 +1598,19 @@ void LoLEngine::setupOpcodeTable() { Opcode(olol_getDirection); OpcodeUnImpl(); Opcode(olol_setMusicTrack); - OpcodeUnImpl(); + Opcode(olol_setSequenceButtons); // 0x20 - OpcodeUnImpl(); + Opcode(olol_setDefaultButtonState); Opcode(olol_checkRectForMousePointer); Opcode(olol_clearDialogueField); Opcode(olol_setupBackgroundAnimationPart); // 0x24 Opcode(olol_startBackgroundAnimation); - OpcodeUnImpl(); - OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(o1_hideMouse); + Opcode(o1_showMouse); + Opcode(olol_fadeToBlack); // 0x28 Opcode(olol_fadePalette); @@ -1450,10 +1640,10 @@ void LoLEngine::setupOpcodeTable() { Opcode(olol_initMonster); Opcode(olol_fadeClearSceneWindow); Opcode(olol_fadeSequencePalette); - OpcodeUnImpl(); + Opcode(olol_redrawPlayfield); // 0x3C - OpcodeUnImpl(); + Opcode(olol_loadNewLevel); OpcodeUnImpl(); Opcode(olol_dummy0); Opcode(olol_loadMonsterProperties); @@ -1474,7 +1664,7 @@ void LoLEngine::setupOpcodeTable() { Opcode(olol_setScriptTimer); Opcode(olol_createHandItem); OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(olol_characterJoinsParty); // 0x4C OpcodeUnImpl(); @@ -1484,8 +1674,8 @@ void LoLEngine::setupOpcodeTable() { // 0x50 Opcode(olol_releaseTimScript); - Opcode(olol_initAnimatedDialogue); - Opcode(olol_restoreAfterAnimatedDialogue); + Opcode(olol_initSceneWindowDialogue); + Opcode(olol_restoreAfterSceneWindowDialogue); Opcode(olol_getItemInHand); // 0x54 @@ -1498,7 +1688,7 @@ void LoLEngine::setupOpcodeTable() { Opcode(olol_processDialogue); Opcode(olol_stopTimScript); Opcode(olol_getWallFlags); - OpcodeUnImpl(); + Opcode(olol_changeMonsterSettings); // 0x5C OpcodeUnImpl(); @@ -1550,9 +1740,9 @@ void LoLEngine::setupOpcodeTable() { // 0x7C Opcode(olol_setNextFunc); + Opcode(olol_dummy1); OpcodeUnImpl(); - OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(olol_suspendMonster); // 0x80 OpcodeUnImpl(); @@ -1573,16 +1763,16 @@ void LoLEngine::setupOpcodeTable() { Opcode(olol_restorePage5); // 0x8C - Opcode(olol_initNonAnimatedDialogue); - Opcode(olol_restoreAfterNonAnimatedDialogue); - OpcodeUnImpl(); + Opcode(olol_initDialogueSequence); + Opcode(olol_restoreAfterDialogueSequence); + Opcode(olol_setSpecialSceneButtons); OpcodeUnImpl(); // 0x90 OpcodeUnImpl(); OpcodeUnImpl(); - OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(olol_prepareSpecialScene); + Opcode(olol_restoreAfterSpecialScene); // 0x94 Opcode(olol_assignCustomSfx); @@ -1593,7 +1783,7 @@ void LoLEngine::setupOpcodeTable() { // 0x98 OpcodeUnImpl(); OpcodeUnImpl(); - Opcode(olol_resetPortraitsArea); + Opcode(olol_resetPortraitsAndDisableSysTimer); Opcode(olol_enableSysTimer); // 0x9C @@ -1629,11 +1819,11 @@ void LoLEngine::setupOpcodeTable() { // 0xB0 OpcodeUnImpl(); OpcodeUnImpl(); - OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(olol_dummy1); // anim buffer select? + Opcode(olol_disableControls); // 0xB4 - OpcodeUnImpl(); + Opcode(olol_enableControls); OpcodeUnImpl(); OpcodeUnImpl(); OpcodeUnImpl(); @@ -1647,7 +1837,7 @@ void LoLEngine::setupOpcodeTable() { // 0xBC Opcode(olol_queueSpeech); Opcode(olol_getItemPrice); - OpcodeUnImpl(); + Opcode(olol_getLanguage); OpcodeUnImpl(); Common::Array<const TIMOpcode*> *timTable = 0; @@ -1668,8 +1858,8 @@ void LoLEngine::setupOpcodeTable() { SetTimOpcodeTable(_timIngameOpcodes); // 0x00 - OpcodeTim(tlol_initAnimatedDialogue); - OpcodeTim(tlol_restoreAfterAnimatedDialogue); + OpcodeTim(tlol_initSceneWindowDialogue); + OpcodeTim(tlol_restoreAfterSceneWindowDialogue); OpcodeTimUnImpl(); OpcodeTim(tlol_giveItem); diff --git a/engines/kyra/script_tim.cpp b/engines/kyra/script_tim.cpp index 8333d4c612..2a6811f8b1 100644 --- a/engines/kyra/script_tim.cpp +++ b/engines/kyra/script_tim.cpp @@ -936,10 +936,12 @@ void TIMInterpreter_LoL::startBackgroundAnimation(int animIndex, int part) { anim->curFrame = p->firstFrame; anim->cyclesCompleted = 0; - anim->wsa->setX(anim->x); - anim->wsa->setY(anim->y); - anim->wsa->setDrawPage(0); - anim->wsa->displayFrame(anim->curFrame - 1, 0, 0); + if (anim->wsa) { + anim->wsa->setX(anim->x); + anim->wsa->setY(anim->y); + anim->wsa->setDrawPage(0); + anim->wsa->displayFrame(anim->curFrame - 1, 0, 0); + } } void TIMInterpreter_LoL::stopBackgroundAnimation(int animIndex) { @@ -1128,7 +1130,7 @@ uint16 TIMInterpreter_LoL::processDialogue() { _vm->updatePortraits(); - if (!_vm->textEnabled() && _vm->_hideControls) { + if (!_vm->textEnabled() && _vm->_currentControlMode) { _screen->setScreenDim(5); const ScreenDim *d = _screen->getScreenDim(5); _screen->fillRect(d->sx, d->sy + d->h - 9, d->sx + d->w - 1, d->sy + d->h - 1, d->unkA); diff --git a/engines/kyra/sprites_lol.cpp b/engines/kyra/sprites_lol.cpp index c7cbe98bfb..c5f269a5ee 100644 --- a/engines/kyra/sprites_lol.cpp +++ b/engines/kyra/sprites_lol.cpp @@ -228,7 +228,7 @@ bool LoLEngine::updateMonsterAdjustBlocks(MonsterInPlay *monster) { return false; for (int i = 0; i < 18; i++) - _curBlockCaps[i] = &_levelBlockProperties[(monster->blockPropertyIndex + _dscBlockIndex[dir + i]) & 0x3ff]; + _visibleBlocks[i] = &_levelBlockProperties[(monster->blockPropertyIndex + _dscBlockIndex[dir + i]) & 0x3ff]; int16 fx1 = 0; int16 fx2 = 0; @@ -523,7 +523,7 @@ bool LoLEngine::checkBlockOccupiedByParty(int x, int y, int testFlag) { } void LoLEngine::drawBlockObjects(int blockArrayIndex) { - LevelBlockProperty *l = _curBlockCaps[blockArrayIndex]; + LevelBlockProperty *l = _visibleBlocks[blockArrayIndex]; uint16 s = l->assignedObjects; ItemInPlay *i = findObject(s); @@ -565,10 +565,10 @@ void LoLEngine::drawBlockObjects(int blockArrayIndex) { int shpIndex = _itemProperties[i->itemPropertyIndex].flags & 0x800 ? 7 : _itemProperties[i->itemPropertyIndex].shpIndex; int ii = 0; for (; ii < 8; ii++) { - if (!_flyingItems[ii].enable) + if (!_flyingObjects[ii].enable) continue; - if (_flyingItems[ii].item == s) + if (_flyingObjects[ii].item == s) break; } @@ -578,7 +578,7 @@ void LoLEngine::drawBlockObjects(int blockArrayIndex) { flg |= _flyingItemShapes[shpIndex].drawFlags; if (ii != 8) { - switch (_currentDirection - (_flyingItems[ii].direction >> 1) + 3) { + switch (_currentDirection - (_flyingObjects[ii].direction >> 1) + 3) { case 1: case 5: shpIndex = _flyingItemShapes[shpIndex].shapeFront; @@ -764,7 +764,7 @@ void LoLEngine::reassignDrawObjects(uint16 direction, uint16 itemIndex, LevelBlo } void LoLEngine::redrawSceneItem() { - assignBlockCaps(_currentBlock, _currentDirection); + assignVisibleBlocks(_currentBlock, _currentDirection); _screen->fillRect(112, 0, 287, 119, 0); static const uint8 sceneClickTileIndex[] = { 13, 16}; @@ -775,7 +775,7 @@ void LoLEngine::redrawSceneItem() { for (int i = 0; i < 2; i++) { uint8 tile = sceneClickTileIndex[i]; setLevelShapesDim(tile, x1, x2, 13); - uint16 s = _curBlockCaps[tile]->drawObjects; + uint16 s = _visibleBlocks[tile]->drawObjects; int t = (i << 7) + 1; while (s) { diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 5d2fda8c53..40920eb007 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -986,7 +986,7 @@ bool StaticResource::loadCharData(const char *filename, void *&ptr, int &size) { t->raceClassSex = file->readByte(); t->id = file->readSint16LE(); t->curFaceFrame = file->readByte(); - t->nextFaceFrame = file->readByte(); + t->defaultFaceFrame = file->readByte(); t->field_12 = file->readByte(); file->readUint32LE(); for (int ii = 0; ii < 8; ii++) diff --git a/engines/kyra/text_lol.cpp b/engines/kyra/text_lol.cpp index 656f4b44c3..f7087cd846 100644 --- a/engines/kyra/text_lol.cpp +++ b/engines/kyra/text_lol.cpp @@ -607,7 +607,7 @@ void TextDisplayer_LoL::textPageBreak() { int y = 0; if (_vm->_hideInventory && (_vm->_updateFlags & 2)) { - if (_vm->_hideControls || !(_vm->_updateFlags & 2)) { + if (_vm->_currentControlMode || !(_vm->_updateFlags & 2)) { y = dim->sy + dim->h - 5; } else { x += 6; diff --git a/engines/kyra/timer_lol.cpp b/engines/kyra/timer_lol.cpp index 96344b0472..c6ed885a29 100644 --- a/engines/kyra/timer_lol.cpp +++ b/engines/kyra/timer_lol.cpp @@ -117,9 +117,9 @@ void LoLEngine::timerSub3(int timerNum) { void LoLEngine::timerProcessFlyingObjects(int timerNum) { for (int i = 0; i < 8; i++) { - if (!_flyingItems[i].enable) + if (!_flyingObjects[i].enable) continue; - updateFlyingObjects(&_flyingItems[i]); + updateFlyingObjects(&_flyingObjects[i]); } } |