void LoLEngine::setHandItem(Item itemIndex) { if (itemIndex && _itemProperties[_itemsInPlay[itemIndex].itemPropertyIndex].flags & 0x80) { runItemScript(-1, itemIndex, 0x400, 0, 0); if (_itemsInPlay[itemIndex].shpCurFrame_flg & 0x8000) itemIndex = 0; } int mouseOffs = 0; if (itemIndex && !(_flagsTable[31] & 0x02)) { mouseOffs = 10; if (!_currentControlMode || textEnabled()) _txt->printMessage(0, getLangString(0x403E), getLangString(_itemProperties[_itemsInPlay[itemIndex].itemPropertyIndex].nameStringId)); } _itemInHand = itemIndex; _screen->setMouseCursor(mouseOffs, mouseOffs, getItemIconShapePtr(itemIndex)); }
void KyraEngine_LoK::characterSays(int vocFile, const char *chatStr, int8 charNum, int8 chatDuration) { uint8 startAnimFrames[] = { 0x10, 0x32, 0x56, 0x0, 0x0, 0x0 }; uint16 chatTicks; int16 convoInitialized; int8 chatPartnerNum; if (_currentCharacter->sceneId == 210) return; snd_voiceWaitForFinish(true); convoInitialized = initCharacterChat(charNum); chatPartnerNum = getChatPartnerNum(); if (chatPartnerNum >= 0 && chatPartnerNum < 5) backupChatPartnerAnimFrame(chatPartnerNum); if (charNum < 5) { _characterList[charNum].currentAnimFrame = startAnimFrames[charNum]; _charSayUnk3 = charNum; _talkingCharNum = charNum; _animator->animRefreshNPC(charNum); } char *processedString = _text->preprocessString(chatStr); int lineNum = _text->buildMessageSubstrings(processedString); int16 yPos = _characterList[charNum].y1; yPos -= ((_scaleTable[yPos] * _characterList[charNum].height) >> 8); yPos -= 8; yPos -= lineNum * 10; if (yPos < 11) yPos = 11; if (yPos > 100) yPos = 100; _text->_talkMessageY = yPos; _text->_talkMessageH = lineNum * 10; const bool printText = textEnabled(); if (printText) { _animator->restoreAllObjectBackgrounds(); _screen->copyRegion(12, _text->_talkMessageY, 12, 136, 296, _text->_talkMessageH, 2, 2); _text->printCharacterText(processedString, charNum, _characterList[charNum].x1); } if (chatDuration == -2) chatTicks = strlen(processedString) * 9; else chatTicks = chatDuration; if (!speechEnabled()) vocFile = -1; waitForChatToFinish(vocFile, chatTicks, chatStr, charNum, printText); if (printText) { _animator->restoreAllObjectBackgrounds(); _screen->copyRegion(12, 136, 12, _text->_talkMessageY, 296, _text->_talkMessageH, 2, 2); _animator->preserveAllBackgrounds(); _animator->prepDrawAllObjects(); _screen->copyRegion(12, _text->_talkMessageY, 12, _text->_talkMessageY, 296, _text->_talkMessageH, 2, 0); _animator->flagAllObjectsForRefresh(); _animator->copyChangedObjectsForward(0); } if (chatPartnerNum != -1 && chatPartnerNum < 5) restoreChatPartnerAnimFrame(chatPartnerNum); endCharacterChat(charNum, convoInitialized); }
uint16 KyraRpgEngine::processDialogue() { int df = _dialogueHighlightedButton; int res = 0; for (int i = 0; i < _dialogueNumButtons; i++) { int x = _dialogueButtonPosX[i]; int y = ((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) & ~7) - 1 : (_dialogueButtonYoffs + _dialogueButtonPosY[i])); Common::Point p = getMousePos(); if (posWithinRect(p.x, p.y, x, y, x + _dialogueButtonWidth, y + guiSettings()->buttons.height)) { _dialogueHighlightedButton = i; break; } } if (_dialogueNumButtons == 0) { int e = checkInput(0, false) & 0xFF; removeInputTop(); if (e) { gui_notifyButtonListChanged(); if (e == _keyMap[Common::KEYCODE_SPACE] || e == _keyMap[Common::KEYCODE_RETURN]) { snd_stopSpeech(true); } } if (snd_updateCharacterSpeech() != 2) { res = 1; if (!shouldQuit()) { removeInputTop(); gui_notifyButtonListChanged(); } } } else { int e = checkInput(0, false, 0) & 0xFF; removeInputTop(); if (e) gui_notifyButtonListChanged(); if ((_flags.gameID == GI_LOL && (e == 200 || e == 202)) || (_flags.gameID != GI_LOL && (e == 199 || e == 201))) { for (int i = 0; i < _dialogueNumButtons; i++) { int x = _dialogueButtonPosX[i]; int y = (gameFlags().use16ColorMode ? ((_dialogueButtonYoffs + _dialogueButtonPosY[i]) & ~7) - 1 : (_dialogueButtonYoffs + _dialogueButtonPosY[i])); Common::Point p = getMousePos(); if (posWithinRect(p.x, p.y, x, y, x + _dialogueButtonWidth, y + guiSettings()->buttons.height)) { _dialogueHighlightedButton = i; res = _dialogueHighlightedButton + 1; break; } } } else if (e == _keyMap[Common::KEYCODE_SPACE] || e == _keyMap[Common::KEYCODE_RETURN]) { snd_stopSpeech(true); res = _dialogueHighlightedButton + 1; } else if (e == _keyMap[Common::KEYCODE_LEFT] || e == _keyMap[Common::KEYCODE_DOWN]) { if (_dialogueNumButtons > 1 && _dialogueHighlightedButton > 0) _dialogueHighlightedButton--; } else if (e == _keyMap[Common::KEYCODE_RIGHT] || e == _keyMap[Common::KEYCODE_UP]) { if (_dialogueNumButtons > 1 && _dialogueHighlightedButton < (_dialogueNumButtons - 1)) _dialogueHighlightedButton++; } } if (df != _dialogueHighlightedButton) drawDialogueButtons(); screen()->updateScreen(); if (res == 0) return 0; stopPortraitSpeechAnim(); if (game() == GI_LOL) { if (!textEnabled() && _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); } else { const ScreenDim *d = screen()->_curDim; if (gameFlags().use16ColorMode) screen()->fillRect(d->sx, d->sy, d->sx + d->w - 3, d->sy + d->h - 2, d->unkA); else screen()->fillRect(d->sx, d->sy, d->sx + d->w - 2, d->sy + d->h - 1, d->unkA); txt()->clearDim(4); txt()->resetDimTextPositions(4); } } return res; }