diff options
author | Nicola Mettifogo | 2007-04-07 14:00:23 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2007-04-07 14:00:23 +0000 |
commit | 9cf94ef46ae54653610d6762348f69c5fb9691ea (patch) | |
tree | eecb8e71bd359a74c049db9f741dd3f3b7f2922c /engines/parallaction | |
parent | 16dc3436adc60d77eb5f4e5093c8ba4d65cdc3bd (diff) | |
download | scummvm-rg350-9cf94ef46ae54653610d6762348f69c5fb9691ea.tar.gz scummvm-rg350-9cf94ef46ae54653610d6762348f69c5fb9691ea.tar.bz2 scummvm-rg350-9cf94ef46ae54653610d6762348f69c5fb9691ea.zip |
Implemented destructors for Question and Answer.
svn-id: r26405
Diffstat (limited to 'engines/parallaction')
-rw-r--r-- | engines/parallaction/dialogue.cpp | 126 | ||||
-rw-r--r-- | engines/parallaction/parallaction.h | 1 | ||||
-rw-r--r-- | engines/parallaction/zone.cpp | 2 | ||||
-rw-r--r-- | engines/parallaction/zone.h | 18 |
4 files changed, 77 insertions, 70 deletions
diff --git a/engines/parallaction/dialogue.cpp b/engines/parallaction/dialogue.cpp index 7a09fe8d16..a56669ad27 100644 --- a/engines/parallaction/dialogue.cpp +++ b/engines/parallaction/dialogue.cpp @@ -94,6 +94,8 @@ Dialogue *Parallaction::parseDialogue(Script &script) { fillBuffers(script, true); while (scumm_stricmp(_tokens[0], "endquestion")) { // parse answers + vB4->_answers[_di] = new Answer; + if (_tokens[1][0]) { Table* v60 = _localFlagNames; @@ -102,17 +104,17 @@ Dialogue *Parallaction::parseDialogue(Script &script) { if (!scumm_stricmp(_tokens[1], "global")) { v56 = 2; v60 = _globalTable; - vB4->_answers[_di]._yesFlags |= kFlagsGlobal; + vB4->_answers[_di]->_yesFlags |= kFlagsGlobal; } do { if (!scumm_strnicmp(_tokens[v56], "no", 2)) { byte _al = v60->lookup(_tokens[v56]+2); - vB4->_answers[_di]._noFlags |= 1 << (_al - 1); + vB4->_answers[_di]->_noFlags |= 1 << (_al - 1); } else { byte _al = v60->lookup(_tokens[v56]); - vB4->_answers[_di]._yesFlags |= 1 << (_al - 1); + vB4->_answers[_di]->_yesFlags |= 1 << (_al - 1); } v56++; @@ -121,17 +123,17 @@ Dialogue *Parallaction::parseDialogue(Script &script) { } - vB4->_answers[_di]._text = parseDialogueString(script); + vB4->_answers[_di]->_text = parseDialogueString(script); // printf("answer[%i]: '%s'\n", _di, vB4->_answers[_di]); fillBuffers(script, true); - vB4->_answers[_di]._mood = atoi(_tokens[0]); - vB4->_answers[_di]._following._name = parseDialogueString(script); + vB4->_answers[_di]->_mood = atoi(_tokens[0]); + vB4->_answers[_di]->_following._name = parseDialogueString(script); fillBuffers(script, true); if (!scumm_stricmp(_tokens[0], "commands")) { - vB4->_answers[_di]._commands = parseCommands(script); + vB4->_answers[_di]->_commands = parseCommands(script); fillBuffers(script, true); } @@ -146,18 +148,18 @@ Dialogue *Parallaction::parseDialogue(Script &script) { for (uint16 _si = 0; _si <num_questions; _si++) { for (uint16 v5A = 0; v5A < 5; v5A++) { - if (_questions[_si]->_answers[v5A]._text == 0) continue; + if (_questions[_si]->_answers[v5A] == 0) continue; - int16 v58 = _questions_names.lookup(_questions[_si]->_answers[v5A]._following._name); - free(_questions[_si]->_answers[v5A]._following._name); + int16 v58 = _questions_names.lookup(_questions[_si]->_answers[v5A]->_following._name); + free(_questions[_si]->_answers[v5A]->_following._name); if (v58 == -1) { - _questions[_si]->_answers[v5A]._following._question = 0; + _questions[_si]->_answers[v5A]->_following._question = 0; } else { - _questions[_si]->_answers[v5A]._following._question = _questions[v58-1]; + _questions[_si]->_answers[v5A]->_following._question = _questions[v58-1]; if (v50[v58]) { - _questions[_si]->_answers[v5A]._mood |= 0x10; + _questions[_si]->_answers[v5A]->_mood |= 0x10; } v50[v58] = 1; @@ -191,29 +193,6 @@ char *Parallaction::parseDialogueString(Script &script) { return vCC; } - -void Parallaction::freeDialogue(Dialogue *d) { - - if (!d) return; - - uint16 _si; - for (_si = 0; _si < NUM_ANSWERS; _si++) { - if (d->_answers[_si]._mood & 0x10) - freeDialogue(d->_answers[_si]._following._question); - } - - for (_si = 0; _si < NUM_ANSWERS; _si++) { - freeCommands(d->_answers[_si]._commands); - free(d->_answers[_si]._text); - } - - free(d->_text); - delete d; - - return; -} - - uint16 askDialoguePassword(Dialogue *q, StaticCnv *face) { debugC(1, kDebugDialogue, "checkDialoguePassword()"); @@ -228,7 +207,7 @@ uint16 askDialoguePassword(Dialogue *q, StaticCnv *face) { r.moveTo(_answerBalloonX[0], _answerBalloonY[0]); _vm->_gfx->drawBalloon(r, 1); - _vm->_gfx->displayWrappedString(q->_answers[0]._text, _answerBalloonX[0], _answerBalloonY[0], MAX_BALLOON_WIDTH, 3); + _vm->_gfx->displayWrappedString(q->_answers[0]->_text, _answerBalloonX[0], _answerBalloonY[0], MAX_BALLOON_WIDTH, 3); _vm->_gfx->flatBlitCnv(face, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y, Gfx::kBitFront); _vm->_gfx->displayBalloonString(_answerBalloonX[0] + 5, _answerBalloonY[0] + _answerBalloonH[0] - 15, "> ", 0); @@ -269,13 +248,13 @@ bool _askPassword; bool displayAnswer(Dialogue *q, uint16 i) { uint32 v28 = _localFlags[_vm->_currentLocationIndex]; - if (q->_answers[i]._yesFlags & kFlagsGlobal) + if (q->_answers[i]->_yesFlags & kFlagsGlobal) v28 = _commandFlags | kFlagsGlobal; // display suitable answers - if (((q->_answers[i]._yesFlags & v28) == q->_answers[i]._yesFlags) && ((q->_answers[i]._noFlags & ~v28) == q->_answers[i]._noFlags)) { + if (((q->_answers[i]->_yesFlags & v28) == q->_answers[i]->_yesFlags) && ((q->_answers[i]->_noFlags & ~v28) == q->_answers[i]->_noFlags)) { - _vm->_gfx->getStringExtent(q->_answers[i]._text, MAX_BALLOON_WIDTH, &_answerBalloonW[i], &_answerBalloonH[i]); + _vm->_gfx->getStringExtent(q->_answers[i]->_text, MAX_BALLOON_WIDTH, &_answerBalloonW[i], &_answerBalloonH[i]); Common::Rect r(_answerBalloonW[i], _answerBalloonH[i]); r.moveTo(_answerBalloonX[i], _answerBalloonY[i]); @@ -283,7 +262,7 @@ bool displayAnswer(Dialogue *q, uint16 i) { _vm->_gfx->drawBalloon(r, 1); _answerBalloonY[i+1] = 10 + _answerBalloonY[i] + _answerBalloonH[i]; - _askPassword = _vm->_gfx->displayWrappedString(q->_answers[i]._text, _answerBalloonX[i], _answerBalloonY[i], MAX_BALLOON_WIDTH, 3); + _askPassword = _vm->_gfx->displayWrappedString(q->_answers[i]->_text, _answerBalloonX[i], _answerBalloonY[i], MAX_BALLOON_WIDTH, 3); return true; } @@ -298,7 +277,7 @@ bool displayAnswers(Dialogue *q) { uint16 i = 0; - while (i < NUM_ANSWERS && q->_answers[i]._text) { + while (i < NUM_ANSWERS && q->_answers[i]) { if (displayAnswer(q, i)) { displayed = true; } else { @@ -382,18 +361,18 @@ void Parallaction::runDialogue(SpeakData *data) { while (q) { displayQuestion(q, face); - if (q->_answers[0]._text == NULL) break; + if (q->_answers[0] == NULL) break; _answerBalloonY[0] = 10; - if (scumm_stricmp(q->_answers[0]._text, "NULL")) { + if (scumm_stricmp(q->_answers[0]->_text, "NULL")) { if (!displayAnswers(q)) break; answer = getDialogueAnswer(q, _vm->_char._talk); - cmdlist = q->_answers[answer]._commands; + cmdlist = q->_answers[answer]->_commands; } - q = (Dialogue*)q->_answers[answer]._following._question; + q = (Dialogue*)q->_answers[answer]->_following._question; } debugC(1, kDebugDialogue, "runDialogue: out of dialogue loop"); @@ -418,7 +397,7 @@ int16 selectAnswer(Question *q, StaticCnv *cnv) { int16 _di = 0; int16 i = 0; - for (; q->_answers[i]._text; i++) { + for (; q->_answers[i]; i++) { if (_answerBalloonY[i] == SKIPPED_ANSWER) continue; _di = i; @@ -427,9 +406,9 @@ int16 selectAnswer(Question *q, StaticCnv *cnv) { _answerBalloonY[i] = 2000; if (numAvailableAnswers == 1) { - _vm->_gfx->displayWrappedString(q->_answers[_di]._text, _answerBalloonX[_di], _answerBalloonY[_di], MAX_BALLOON_WIDTH, 0); - cnv->_data0 = _vm->_char._talk->getFramePtr(q->_answers[_di]._mood & 0xF); -// cnv->_data1 = _vm->_char._talk->field_8[q->_answers[_di]._mood & 0xF]; + _vm->_gfx->displayWrappedString(q->_answers[_di]->_text, _answerBalloonX[_di], _answerBalloonY[_di], MAX_BALLOON_WIDTH, 0); + cnv->_data0 = _vm->_char._talk->getFramePtr(q->_answers[_di]->_mood & 0xF); +// cnv->_data1 = _vm->_char._talk->field_8[q->_answers[_di]->_mood & 0xF]; _vm->_gfx->flatBlitCnv(cnv, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y, Gfx::kBitFront); waitUntilLeftClick(); return _di; @@ -445,11 +424,11 @@ int16 selectAnswer(Question *q, StaticCnv *cnv) { if (_si != v2) { if (v2 != -1) - _vm->_gfx->displayWrappedString(q->_answers[v2]._text, _answerBalloonX[v2], _answerBalloonY[v2], MAX_BALLOON_WIDTH, 3); + _vm->_gfx->displayWrappedString(q->_answers[v2]->_text, _answerBalloonX[v2], _answerBalloonY[v2], MAX_BALLOON_WIDTH, 3); - _vm->_gfx->displayWrappedString(q->_answers[_si]._text, _answerBalloonX[_si], _answerBalloonY[_si], MAX_BALLOON_WIDTH, 0); - cnv->_data0 = _vm->_char._talk->getFramePtr(q->_answers[_si]._mood & 0xF); -// cnv->_data1 = _vm->_char._talk->field_8[q->_answers[_si]._mood & 0xF]; + _vm->_gfx->displayWrappedString(q->_answers[_si]->_text, _answerBalloonX[_si], _answerBalloonY[_si], MAX_BALLOON_WIDTH, 0); + cnv->_data0 = _vm->_char._talk->getFramePtr(q->_answers[_si]->_mood & 0xF); +// cnv->_data1 = _vm->_char._talk->field_8[q->_answers[_si]->_mood & 0xF]; _vm->_gfx->flatBlitCnv(cnv, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y, Gfx::kBitFront); } @@ -470,7 +449,7 @@ int16 getHoverAnswer(int16 x, int16 y, Question *q) { int16 bottom = 1000; for (int16 _si = 0; _si < NUM_ANSWERS; _si++) { - if (q->_answers[_si]._text == NULL) break; + if (q->_answers[_si] == NULL) break; if (_answerBalloonY[_si] != SKIPPED_ANSWER) { top = _answerBalloonY[_si]; @@ -505,5 +484,42 @@ void exitDialogue() { return; } +Answer::Answer() { + _text = NULL; + _mood = 0; + _following._question = NULL; + _commands = NULL; + _noFlags = 0; + _yesFlags = 0; +} + +Answer::~Answer() { + if (_mood & 0x10) + delete _following._question; + + if (_commands) + _vm->freeCommands(_commands); + + if (_text) + free(_text); + +} + +Question::Question() { + _text = NULL; + _mood = 0; + + for (uint32 i = 0; i < NUM_ANSWERS; i++) + _answers[i] = NULL; + +} + +Question::~Question() { + + for (uint32 i = 0; i < NUM_ANSWERS; i++) + if (_answers[i]) delete _answers[i]; + + free(_text); +} } // namespace Parallaction diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index 8e96a06ee5..1a405820f8 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -352,7 +352,6 @@ public: uint16 runZone(Zone*); void runDialogue(SpeakData*); - void freeDialogue(Dialogue *d); void runCommands(Command *list, Zone *z = NULL); public: diff --git a/engines/parallaction/zone.cpp b/engines/parallaction/zone.cpp index 2f31c8e9d7..80174f432b 100644 --- a/engines/parallaction/zone.cpp +++ b/engines/parallaction/zone.cpp @@ -624,7 +624,7 @@ Zone::~Zone() { break; case kZoneSpeak: - _vm->freeDialogue(u.speak->_dialogue); + delete u.speak->_dialogue; delete u.speak; break; diff --git a/engines/parallaction/zone.h b/engines/parallaction/zone.h index a3866d658b..7ee5bbf66d 100644 --- a/engines/parallaction/zone.h +++ b/engines/parallaction/zone.h @@ -79,25 +79,17 @@ struct Answer { uint32 _noFlags; uint32 _yesFlags; - Answer() { - _text = NULL; - _mood = 0; - _following._question = NULL; - _commands = NULL; - _noFlags = 0; - _yesFlags = 0; - } + Answer(); + ~Answer(); }; struct Question { char* _text; uint16 _mood; - Answer _answers[NUM_ANSWERS]; + Answer* _answers[NUM_ANSWERS]; - Question() { - _text = NULL; - _mood = 0; - } + Question(); + ~Question(); }; typedef Question Dialogue; |