diff options
-rw-r--r-- | engines/wintermute/ad/ad_game.cpp | 23 | ||||
-rw-r--r-- | engines/wintermute/ad/ad_game.h | 4 | ||||
-rw-r--r-- | engines/wintermute/ad/ad_response.cpp | 32 | ||||
-rw-r--r-- | engines/wintermute/ad/ad_response.h | 22 | ||||
-rw-r--r-- | engines/wintermute/ad/ad_response_box.cpp | 38 | ||||
-rw-r--r-- | engines/wintermute/ad/ad_response_box.h | 4 | ||||
-rw-r--r-- | engines/wintermute/ad/ad_response_context.h | 6 |
7 files changed, 90 insertions, 39 deletions
diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp index 6042bda060..fac59dc473 100644 --- a/engines/wintermute/ad/ad_game.cpp +++ b/engines/wintermute/ad/ad_game.cpp @@ -519,9 +519,14 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, if (_responseBox) { AdResponse *res = new AdResponse(_gameRef); if (res) { - res->_iD = id; - res->setText(text); - expandStringByStringTable(&res->_text); + res->setID(id); + + char *expandedText = new char[strlen(text) + 1]; + Common::strlcpy(expandedText, text, strlen(text) + 1); + expandStringByStringTable(&expandedText); + res->setText(expandedText); + delete[] expandedText; + if (!val1->isNULL()) { res->setIcon(val1->getString()); } @@ -1742,7 +1747,7 @@ bool AdGame::endDlgBranch(const char *branchName, const char *scriptName, const ////////////////////////////////////////////////////////////////////////// bool AdGame::clearBranchResponses(char *name) { for (uint32 i = 0; i < _responsesBranch.size(); i++) { - if (scumm_stricmp(name, _responsesBranch[i]->_context) == 0) { + if (scumm_stricmp(name, _responsesBranch[i]->getContext()) == 0) { delete _responsesBranch[i]; _responsesBranch.remove_at(i); i--; @@ -1770,7 +1775,7 @@ bool AdGame::branchResponseUsed(int id) const { char *context = _dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : nullptr; for (uint32 i = 0; i < _responsesBranch.size(); i++) { if (_responsesBranch[i]->_id == id) { - if ((context == nullptr && _responsesBranch[i]->_context == nullptr) || scumm_stricmp(context, _responsesBranch[i]->_context) == 0) { + if ((context == nullptr && _responsesBranch[i]->getContext() == nullptr) || scumm_stricmp(context, _responsesBranch[i]->getContext()) == 0) { return true; } } @@ -1796,9 +1801,9 @@ bool AdGame::addGameResponse(int id) { bool AdGame::gameResponseUsed(int id) const { char *context = _dlgPendingBranches.size() > 0 ? _dlgPendingBranches[_dlgPendingBranches.size() - 1] : nullptr; for (uint32 i = 0; i < _responsesGame.size(); i++) { - AdResponseContext *respContext = _responsesGame[i]; + const AdResponseContext *respContext = _responsesGame[i]; if (respContext->_id == id) { - if ((context == nullptr && respContext->_context == nullptr) || ((context != nullptr && respContext->_context != nullptr) && scumm_stricmp(context, respContext->_context) == 0)) { + if ((context == nullptr && respContext->getContext() == nullptr) || ((context != nullptr && respContext->getContext() != nullptr) && scumm_stricmp(context, respContext->getContext()) == 0)) { return true; } } @@ -1813,7 +1818,7 @@ bool AdGame::resetResponse(int id) { for (uint32 i = 0; i < _responsesGame.size(); i++) { if (_responsesGame[i]->_id == id) { - if ((context == nullptr && _responsesGame[i]->_context == nullptr) || scumm_stricmp(context, _responsesGame[i]->_context) == 0) { + if ((context == nullptr && _responsesGame[i]->getContext() == nullptr) || scumm_stricmp(context, _responsesGame[i]->getContext()) == 0) { delete _responsesGame[i]; _responsesGame.remove_at(i); break; @@ -1823,7 +1828,7 @@ bool AdGame::resetResponse(int id) { for (uint32 i = 0; i < _responsesBranch.size(); i++) { if (_responsesBranch[i]->_id == id) { - if ((context == nullptr && _responsesBranch[i]->_context == nullptr) || scumm_stricmp(context, _responsesBranch[i]->_context) == 0) { + if ((context == nullptr && _responsesBranch[i]->getContext() == nullptr) || scumm_stricmp(context, _responsesBranch[i]->getContext()) == 0) { delete _responsesBranch[i]; _responsesBranch.remove_at(i); break; diff --git a/engines/wintermute/ad/ad_game.h b/engines/wintermute/ad/ad_game.h index 9bcd0bb531..dfb7f1fe8e 100644 --- a/engines/wintermute/ad/ad_game.h +++ b/engines/wintermute/ad/ad_game.h @@ -151,8 +151,8 @@ private: BaseArray<AdSceneState *> _sceneStates; BaseArray<char *> _dlgPendingBranches; - BaseArray<AdResponseContext *> _responsesBranch; - BaseArray<AdResponseContext *> _responsesGame; + BaseArray<const AdResponseContext *> _responsesBranch; + BaseArray<const AdResponseContext *> _responsesGame; AdResponseBox *_responseBox; AdInventoryBox *_inventoryBox; diff --git a/engines/wintermute/ad/ad_response.cpp b/engines/wintermute/ad/ad_response.cpp index e4993b9ad4..0e6817ae6f 100644 --- a/engines/wintermute/ad/ad_response.cpp +++ b/engines/wintermute/ad/ad_response.cpp @@ -143,4 +143,36 @@ bool AdResponse::persist(BasePersistenceManager *persistMgr) { return STATUS_OK; } +void AdResponse::setID(int32 id) { + _iD = id; +} + +BaseSprite *AdResponse::getIcon() const { + return _icon; +} + +BaseSprite *AdResponse::getIconHover() const { + return _iconHover; +} + +BaseSprite *AdResponse::getIconPressed() const { + return _iconPressed; +} + +BaseFont *AdResponse::getFont() const { + return _font; +} + +int32 AdResponse::getID() const { + return _iD; +} + +const char *AdResponse::getText() const { + return _text; +} + +const char *AdResponse::getTextOrig() const { + return _textOrig; +} + } // end of namespace Wintermute diff --git a/engines/wintermute/ad/ad_response.h b/engines/wintermute/ad/ad_response.h index 2119067d3e..57cd302e9d 100644 --- a/engines/wintermute/ad/ad_response.h +++ b/engines/wintermute/ad/ad_response.h @@ -43,17 +43,29 @@ public: bool setIconHover(const char *filename); bool setIconPressed(const char *filename); void setText(const char *text); - int32 _iD; + void setID(int32 id); + BaseSprite *getIcon() const; + BaseSprite *getIconHover() const; + BaseSprite *getIconPressed() const; + BaseFont *getFont() const; + int32 getID() const; + + const char *getText() const; + const char *getTextOrig() const; + + AdResponse(BaseGame *inGame); + virtual ~AdResponse(); + TResponseType _responseType; +private: BaseSprite *_icon; BaseSprite *_iconHover; BaseSprite *_iconPressed; BaseFont *_font; + + int32 _iD; + char *_text; char *_textOrig; - AdResponse(BaseGame *inGame); - virtual ~AdResponse(); - TResponseType _responseType; - }; } // end of namespace Wintermute diff --git a/engines/wintermute/ad/ad_response_box.cpp b/engines/wintermute/ad/ad_response_box.cpp index 015bdff12d..a4e59c6a49 100644 --- a/engines/wintermute/ad/ad_response_box.cpp +++ b/engines/wintermute/ad/ad_response_box.cpp @@ -144,16 +144,16 @@ bool AdResponseBox::createButtons() { btn->_sharedFonts = btn->_sharedImages = true; btn->_sharedCursors = true; // iconic - if (_responses[i]->_icon) { - btn->_image = _responses[i]->_icon; - if (_responses[i]->_iconHover) { - btn->_imageHover = _responses[i]->_iconHover; + if (_responses[i]->getIcon()) { + btn->_image = _responses[i]->getIcon(); + if (_responses[i]->getIconHover()) { + btn->_imageHover = _responses[i]->getIconHover(); } - if (_responses[i]->_iconPressed) { - btn->_imagePress = _responses[i]->_iconPressed; + if (_responses[i]->getIconPressed()) { + btn->_imagePress = _responses[i]->getIconPressed(); } - btn->setCaption(_responses[i]->_text); + btn->setCaption(_responses[i]->getText()); if (_cursor) { btn->_cursor = _cursor; } else if (_gameRef->_activeCursor) { @@ -162,7 +162,7 @@ bool AdResponseBox::createButtons() { } // textual else { - btn->setText(_responses[i]->_text); + btn->setText(_responses[i]->getText()); btn->_font = (_font == nullptr) ? _gameRef->getSystemFont() : _font; btn->_fontHover = (_fontHover == nullptr) ? _gameRef->getSystemFont() : _fontHover; btn->_fontPress = btn->_fontHover; @@ -173,8 +173,8 @@ bool AdResponseBox::createButtons() { } - if (_responses[i]->_font) { - btn->_font = _responses[i]->_font; + if (_responses[i]->getFont()) { + btn->_font = _responses[i]->getFont(); } btn->_width = _responseArea.right - _responseArea.left; @@ -196,7 +196,7 @@ bool AdResponseBox::createButtons() { _respButtons.add(btn); if (_responseArea.bottom - _responseArea.top < btn->_height) { - _gameRef->LOG(0, "Warning: Response '%s' is too high to be displayed within response box. Correcting.", _responses[i]->_text); + _gameRef->LOG(0, "Warning: Response '%s' is too high to be displayed within response box. Correcting.", _responses[i]->getText()); _responseArea.bottom += (btn->_height - (_responseArea.bottom - _responseArea.top)); } } @@ -548,7 +548,7 @@ bool AdResponseBox::listen(BaseScriptHolder *param1, uint32 param2) { _scrollOffset++; } else if (scumm_stricmp(obj->getName(), "response") == 0) { if (_waitingScript) { - _waitingScript->_stack->pushInt(_responses[param2]->_iD); + _waitingScript->_stack->pushInt(_responses[param2]->getID()); } handleResponse(_responses[param2]); _waitingScript = nullptr; @@ -601,7 +601,7 @@ bool AdResponseBox::weedResponses() { for (uint32 i = 0; i < _responses.size(); i++) { switch (_responses[i]->_responseType) { case RESPONSE_ONCE: - if (adGame->branchResponseUsed(_responses[i]->_iD)) { + if (adGame->branchResponseUsed(_responses[i]->getID())) { delete _responses[i]; _responses.remove_at(i); i--; @@ -609,7 +609,7 @@ bool AdResponseBox::weedResponses() { break; case RESPONSE_ONCE_GAME: - if (adGame->gameResponseUsed(_responses[i]->_iD)) { + if (adGame->gameResponseUsed(_responses[i]->getID())) { delete _responses[i]; _responses.remove_at(i); i--; @@ -642,13 +642,13 @@ UIWindow *AdResponseBox::getResponseWindow() { return _window; } -void AdResponseBox::addResponse(AdResponse *response) { +void AdResponseBox::addResponse(const AdResponse *response) { _responses.add(response); } int32 AdResponseBox::getIdForResponseNum(uint32 num) const { assert(num < _responses.size()); - return _responses[num]->_iD; + return _responses[num]->getID(); } bool AdResponseBox::handleResponseNum(uint32 num) { @@ -657,17 +657,17 @@ bool AdResponseBox::handleResponseNum(uint32 num) { ////////////////////////////////////////////////////////////////////////// bool AdResponseBox::handleResponse(const AdResponse *response) { - setLastResponseText(response->_text, response->_textOrig); + setLastResponseText(response->getText(), response->getTextOrig()); AdGame *adGame = (AdGame *)_gameRef; switch (response->_responseType) { case RESPONSE_ONCE: - adGame->addBranchResponse(response->_iD); + adGame->addBranchResponse(response->getID()); break; case RESPONSE_ONCE_GAME: - adGame->addGameResponse(response->_iD); + adGame->addGameResponse(response->getID()); break; default: debugC(kWintermuteDebugGeneral, "AdResponseBox::HandleResponse - Unhandled enum"); diff --git a/engines/wintermute/ad/ad_response_box.h b/engines/wintermute/ad/ad_response_box.h index bce6f612fa..e1b766cbdb 100644 --- a/engines/wintermute/ad/ad_response_box.h +++ b/engines/wintermute/ad/ad_response_box.h @@ -44,7 +44,7 @@ public: BaseObject *getPrevAccessObject(BaseObject *CurrObject); bool getObjects(BaseArray<UIObject *> &objects, bool interactiveOnly); - void addResponse(AdResponse* response); + void addResponse(const AdResponse* response); bool handleResponse(const AdResponse *response); bool handleResponseNum(uint32 num); int32 getIdForResponseNum(uint32 num) const; @@ -87,7 +87,7 @@ private: int _verticalAlign; TTextAlign _align; BaseArray<UIButton *> _respButtons; - BaseArray<AdResponse *> _responses; + BaseArray<const AdResponse *> _responses; UIWindow *_shieldWindow; char *_lastResponseText; char *_lastResponseTextOrig; diff --git a/engines/wintermute/ad/ad_response_context.h b/engines/wintermute/ad/ad_response_context.h index 14bc1abd93..f2e2a45b21 100644 --- a/engines/wintermute/ad/ad_response_context.h +++ b/engines/wintermute/ad/ad_response_context.h @@ -37,12 +37,14 @@ namespace Wintermute { class AdResponseContext : public BaseClass { public: void setContext(const char *context); + const char *getContext() const { return _context; } int _id; - char *_context; + DECLARE_PERSISTENT(AdResponseContext, BaseClass) AdResponseContext(BaseGame *inGame); virtual ~AdResponseContext(); - +private: + char *_context; }; } // end of namespace Wintermute |