diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/prince/prince.cpp | 98 | ||||
-rw-r--r-- | engines/prince/prince.h | 20 | ||||
-rw-r--r-- | engines/prince/script.cpp | 85 | ||||
-rw-r--r-- | engines/prince/script.h | 1 |
4 files changed, 102 insertions, 102 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index b91155344b..101af7b35c 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -87,7 +87,8 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc) _optionsMob(-1), _currentPointerNumber(1), _selectedMob(-1), _selectedItem(0), _selectedMode(0), _optionsWidth(210), _optionsHeight(170), _invOptionsWidth(210), _invOptionsHeight(130), _optionsStep(20), _invOptionsStep(20), _optionsNumber(7), _invOptionsNumber(5), _optionsColor1(236), _optionsColor2(252), - _dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223), _dialogFlag(false) { + _dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223), + _dialogFlag(false), _dialogLines(0), _dialogText(nullptr) { // Debug/console setup DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); @@ -2229,22 +2230,36 @@ void PrinceEngine::displayInventory() { } } -void PrinceEngine::createDialogBox(Common::Array<DialogLine> &dialogData) { - int amountOfDialogLines = 0; - int amountOfDialogOptions = dialogData.size(); +void PrinceEngine::createDialogBox(int dialogBoxNr) { + _dialogLines = 0; + int amountOfDialogOptions = 0; + int dialogDataValue = (int)READ_UINT32(_dialogData); - for (int i = 0; i < amountOfDialogOptions; i++) { - amountOfDialogLines += calcText(dialogData[i]._line.c_str()); + byte c; + int sentenceNumber; + _dialogText = _dialogBoxAddr[dialogBoxNr]; + byte *dialogText = _dialogText; + + while ((sentenceNumber = *dialogText) != 0xFF) { + dialogText++; + if (!(dialogDataValue & (1 << sentenceNumber))) { + _dialogLines += calcText((const char *)dialogText); + amountOfDialogOptions++; + } + do { + c = *dialogText; + dialogText++; + } while (c); } - _dialogHeight = _font->getFontHeight() * amountOfDialogLines + _dialogLineSpace * (amountOfDialogOptions + 1); + _dialogHeight = _font->getFontHeight() * _dialogLines + _dialogLineSpace * (amountOfDialogOptions + 1); _dialogImage = new Graphics::Surface(); _dialogImage->create(_dialogWidth, _dialogHeight, Graphics::PixelFormat::createFormatCLUT8()); Common::Rect dBoxRect(0, 0, _dialogWidth, _dialogHeight); _dialogImage->fillRect(dBoxRect, _graph->kShadowColor); } -void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) { +void PrinceEngine::runDialog() { _dialogFlag = true; @@ -2265,27 +2280,38 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) { Common::Point mousePos = _system->getEventManager()->getMousePos(); + byte c; + int sentenceNumber; + byte *dialogText = _dialogText; + byte *dialogCurrentText = nullptr; int dialogSelected = -1; - int dialogSelectedText = -1; + int dialogDataValue = (int)READ_UINT32(_dialogData); - for (uint i = 0; i < dialogData.size(); i++) { + while ((sentenceNumber = *dialogText) != 0xFF) { + dialogText++; int actualColor = _dialogColor1; - Common::Array<Common::String> lines; - _font->wordWrapText(dialogData[i]._line, _graph->_frontScreen->w, lines); + if (!(dialogDataValue & (1 << sentenceNumber))) { + Common::Array<Common::String> lines; + _font->wordWrapText((const char *)dialogText, _graph->_frontScreen->w, lines); - Common::Rect dialogOption(dialogTextX, dialogTextY - dialogSkipUp / 2, dialogX + _dialogWidth - dialogSkipLeft, dialogTextY + lines.size() * _font->getFontHeight() + dialogSkipUp / 2 - 1); - if (dialogOption.contains(mousePos)) { - actualColor = _dialogColor2; - dialogSelected = dialogData[i]._nr; - dialogSelectedText = i; - } + Common::Rect dialogOption(dialogTextX, dialogTextY - dialogSkipUp / 2, dialogX + _dialogWidth - dialogSkipLeft, dialogTextY + lines.size() * _font->getFontHeight() + dialogSkipUp / 2 - 1); + if (dialogOption.contains(mousePos)) { + actualColor = _dialogColor2; + dialogSelected = sentenceNumber; + dialogCurrentText = dialogText; + } - for (uint j = 0; j < lines.size(); j++) { - _font->drawString(_graph->_frontScreen, lines[j], dialogTextX, dialogTextY, _graph->_frontScreen->w, actualColor); - dialogTextY += _font->getFontHeight(); + for (uint j = 0; j < lines.size(); j++) { + _font->drawString(_graph->_frontScreen, lines[j], dialogTextX, dialogTextY, _graph->_frontScreen->w, actualColor); + dialogTextY += _font->getFontHeight(); + } + dialogTextY += _dialogLineSpace; } - dialogTextY += _dialogLineSpace; + do { + c = *dialogText; + dialogText++; + } while (c); } Common::Event event; @@ -2301,7 +2327,7 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) { break; case Common::EVENT_LBUTTONDOWN: if (dialogSelected != -1) { - dialogLeftMouseButton(dialogSelected, dialogData[dialogSelectedText]._line.c_str()); + dialogLeftMouseButton(dialogCurrentText, dialogSelected); _dialogFlag = false; } break; @@ -2336,15 +2362,29 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) { // cursor? } -void PrinceEngine::dialogLeftMouseButton(int dialogSelected, const char *s) { - //TODO @@showa_dialoga: - talkHero(0, s); +void PrinceEngine::dialogLeftMouseButton(byte *string, int dialogSelected) { + _interpreter->setString(string); + talkHero(0); + + int dialogDataValue = (int)READ_UINT32(_dialogData); + int newValue = (dialogDataValue & (1 << dialogSelected)); // FIXME + WRITE_UINT32(_dialogData, newValue); // FIXME + + _flags->setFlagValue(Flags::BOXSEL, dialogSelected + 1); + setVoice(0, 28, dialogSelected + 1); + + int dialogOpt = dialogSelected << 4; + _flags->setFlagValue(Flags::VOICE_H_LINE, _dialogOptLines[dialogOpt]); + _flags->setFlagValue(Flags::VOICE_A_LINE, _dialogOptLines[dialogOpt + 1]); + _flags->setFlagValue(Flags::VOICE_B_LINE, _dialogOptLines[dialogOpt + 2]); + + _interpreter->setString(_dialogOptAddr[dialogSelected]); } -void PrinceEngine::talkHero(int slot, const char *s) { +void PrinceEngine::talkHero(int slot) { // heroSlot = textSlot Text &text = _textSlots[slot]; - int lines = calcText(s); + int lines = calcText((const char *)_interpreter->getString()); int time = lines * 30; if (slot == 0) { @@ -2361,7 +2401,7 @@ void PrinceEngine::talkHero(int slot, const char *s) { text._y = _secondHero->_middleY - _secondHero->_scaledFrameYSize; } text._time = time; // changed by SETSPECVOICE? - text._str = s; + text._str = (const char *)_interpreter->getString(); _interpreter->increaseString(); } diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 3110d6d9a5..d59a888815 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -234,11 +234,6 @@ struct DrawNode { void (*drawFunction)(Graphics::Surface *, DrawNode *); }; -struct DialogLine { - int _nr; - Common::String _line; -}; - struct DebugChannel { enum Type { @@ -309,7 +304,6 @@ public: Common::Array<AnimListItem> _animList; Common::Array<BackgroundAnim> _backAnimList; Common::Array<Anim> _normAnimList; - Common::Array<Common::Array<DialogLine>> _dialogBoxList; Common::Array<Mob> _mobList; void freeNormAnim(int slot); @@ -396,12 +390,18 @@ public: void rightMouseButton(); void inventoryLeftMouseButton(); void inventoryRightMouseButton(); - void dialogLeftMouseButton(int dialogSelected, const char *s); + void dialogLeftMouseButton(byte *string, int dialogSelected); uint32 _dialogDatSize; byte *_dialogDat; byte *_dialogData; // on, off flags for lines of dialog text + byte *_dialogBoxAddr[32]; // adresses of dialog windows + byte *_dialogOptAddr[32]; // adresses of dialog options + int _dialogOptLines[4 * 32]; // numbers of initial dialog lines + + byte *_dialogText; + int _dialogLines; bool _dialogFlag; int _dialogWidth; int _dialogHeight; @@ -410,9 +410,9 @@ public: int _dialogColor2; // color for selected option Graphics::Surface *_dialogImage; - void createDialogBox(Common::Array<DialogLine> &dialogData); - void runDialog(Common::Array<DialogLine> &dialogData); - void talkHero(int slot, const char *s); + void createDialogBox(int dialogBoxNr); + void runDialog(); + void talkHero(int slot); void doTalkAnim(int animNumber, int slot, AnimType animType); int testAnimNr; diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index ec31cda739..3fe03e8c1d 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -526,6 +526,10 @@ byte *Interpreter::getString() { return _string; } +void Interpreter::setString(byte *newString) { + _string = newString; +} + void Interpreter::increaseString() { while (*_string) { _string++; @@ -1125,7 +1129,7 @@ void Interpreter::O_CHECKINV() { void Interpreter::O_TALKHERO() { uint16 hero = readScriptFlagValue(); debugInterpreter("O_TALKHERO hero %d", hero); - _vm->talkHero(hero, (const char *)_string); + _vm->talkHero(hero); } void Interpreter::O_WAITTEXT() { @@ -1371,22 +1375,13 @@ void Interpreter::O_INITDIALOG() { stringCurrOff += 2; _string = string + adressOfFirstSequence; - for (uint i = 0; i < _vm->_dialogBoxList.size(); i++) { - _vm->_dialogBoxList[i].clear(); - } - _vm->_dialogBoxList.clear(); - - byte *dialogBoxAddr[32]; // adresses of dialog windows - byte *dialogOptAddr[32]; // adresses of dialog options - int dialogOptLines[4 * 32]; // numbers of initial dialog lines - for (int i = 0; i < 32; i++) { - dialogBoxAddr[i] = 0; - dialogOptAddr[i] = 0; + _vm->_dialogBoxAddr[i] = 0; + _vm->_dialogOptAddr[i] = 0; } for (int i = 0; i < 4 * 32; i++) { - dialogOptLines[i] = 0; + _vm->_dialogOptLines[i] = 0; } int16 off; @@ -1398,7 +1393,7 @@ void Interpreter::O_INITDIALOG() { if (off) { line = string + off; } - dialogBoxAddr[dialogBox] = line; + _vm->_dialogBoxAddr[dialogBox] = line; dialogBox++; } stringCurrOff += 2; @@ -1409,49 +1404,16 @@ void Interpreter::O_INITDIALOG() { if (off) { line = string + off; } - dialogOptAddr[dialogOpt] = line; + _vm->_dialogOptAddr[dialogOpt] = line; dialogOpt++; } - dialogBox = 0; - byte c; - int sentenceNumber; - DialogLine tempDialogLine; - Common::Array<DialogLine> tempDialogBox; - - while (dialogBoxAddr[dialogBox]) { - tempDialogBox.clear(); - byte *boxAddr = dialogBoxAddr[dialogBox]; - int dialogDataValue = (int)READ_UINT32(_vm->_dialogData); - while ((sentenceNumber = *boxAddr) != 0xFF) { - boxAddr++; - if (!(dialogDataValue & (1 << sentenceNumber))) { - tempDialogLine._line.clear(); - tempDialogLine._nr = sentenceNumber; - while ((c = *boxAddr)) { - tempDialogLine._line += c; - boxAddr++; - } - boxAddr++; - tempDialogBox.push_back(tempDialogLine); - } else { - do { - c = *boxAddr; - boxAddr++; - } while (c); - } - } - _vm->_dialogBoxList.push_back(tempDialogBox); - dialogBox++; - } - - // TODO - dialogOptAddr, dialogOptLines _flags->setFlagValue(Flags::VOICE_A_LINE, 0); _flags->setFlagValue(Flags::VOICE_B_LINE, 0); // bx in original? int freeHSlot = 0; for (int i = 31; i >= 0; i--) { - if (dialogOptAddr[i] != 0) { + if (_vm->_dialogOptAddr[i] != 0) { i++; freeHSlot = i; _flags->setFlagValue(Flags::VOICE_H_LINE, i); @@ -1462,11 +1424,11 @@ void Interpreter::O_INITDIALOG() { freeHSlot += checkSeq(_string); for (int i = 0; i < 32; i++) { - dialogOptLines[i * 4] = freeHSlot; - dialogOptLines[i * 4 + 1] = freeHSlot; - dialogOptLines[i * 4 + 2] = freeHSlot; - if (dialogOptAddr[i]) { - freeHSlot += checkSeq(dialogOptAddr[i]); + _vm->_dialogOptLines[i * 4] = freeHSlot; + _vm->_dialogOptLines[i * 4 + 1] = freeHSlot; + _vm->_dialogOptLines[i * 4 + 2] = freeHSlot; + if (_vm->_dialogOptAddr[i]) { + freeHSlot += checkSeq(_vm->_dialogOptAddr[i]); } } } @@ -1485,15 +1447,12 @@ void Interpreter::O_DISABLEDIALOGOPT() { void Interpreter::O_SHOWDIALOGBOX() { uint16 box = readScriptFlagValue(); debugInterpreter("O_SHOWDIALOGBOX box %d", box); - if (box < _vm->_dialogBoxList.size()) { - _vm->createDialogBox(_vm->_dialogBoxList[box]); - int dialogLines = _vm->_dialogBoxList[box].size(); - _flags->setFlagValue(Flags::DIALINES, dialogLines); - if (dialogLines != 0) { - _vm->changeCursor(1); - _vm->runDialog(_vm->_dialogBoxList[box]); - _vm->changeCursor(0); - } + _vm->createDialogBox(box); + _flags->setFlagValue(Flags::DIALINES, _vm->_dialogLines); + if (_vm->_dialogLines != 0) { + _vm->changeCursor(1); + _vm->runDialog(); + _vm->changeCursor(0); } } diff --git a/engines/prince/script.h b/engines/prince/script.h index a822b44ccb..5f9cdc3ab3 100644 --- a/engines/prince/script.h +++ b/engines/prince/script.h @@ -186,6 +186,7 @@ public: void setCurrentString(uint32 value); byte *getString(); + void setString(byte *newString); void increaseString(); |