aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/wintermute/ad/ad_game.cpp23
-rw-r--r--engines/wintermute/ad/ad_game.h4
-rw-r--r--engines/wintermute/ad/ad_response.cpp32
-rw-r--r--engines/wintermute/ad/ad_response.h22
-rw-r--r--engines/wintermute/ad/ad_response_box.cpp38
-rw-r--r--engines/wintermute/ad/ad_response_box.h4
-rw-r--r--engines/wintermute/ad/ad_response_context.h6
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