aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
Diffstat (limited to 'engines/parallaction')
-rw-r--r--engines/parallaction/dialogue.cpp71
-rw-r--r--engines/parallaction/disk.cpp5
-rw-r--r--engines/parallaction/disk.h2
-rw-r--r--engines/parallaction/parallaction.cpp6
-rw-r--r--engines/parallaction/parallaction.h11
-rw-r--r--engines/parallaction/zone.cpp8
6 files changed, 55 insertions, 48 deletions
diff --git a/engines/parallaction/dialogue.cpp b/engines/parallaction/dialogue.cpp
index 1fe9aeaa79..fccf61a4c2 100644
--- a/engines/parallaction/dialogue.cpp
+++ b/engines/parallaction/dialogue.cpp
@@ -219,7 +219,7 @@ void freeDialogue(Dialogue *d) {
}
-uint16 askDialoguePassword(Dialogue *v60, StaticCnv *v48) {
+uint16 askDialoguePassword(Dialogue *q, StaticCnv *face) {
debugC(1, kDebugDialogue, "checkDialoguePassword()");
char password[100];
@@ -233,8 +233,8 @@ uint16 askDialoguePassword(Dialogue *v60, StaticCnv *v48) {
r.moveTo(_answerBalloonX[0], _answerBalloonY[0]);
_vm->_gfx->drawBalloon(r, 1);
- _vm->_gfx->displayWrappedString(v60->_answers[0], _answerBalloonX[0], _answerBalloonY[0], MAX_BALLOON_WIDTH, 3);
- _vm->_gfx->flatBlitCnv(v48, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y, Gfx::kBitFront);
+ _vm->_gfx->displayWrappedString(q->_answers[0], _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);
Common::Event e;
@@ -350,19 +350,19 @@ void displayQuestion(Dialogue *q, StaticCnv *face) {
return;
}
-uint16 getDialogueAnswer(Dialogue *v60, StaticCnv *v48) {
+uint16 getDialogueAnswer(Dialogue *q, StaticCnv *face) {
uint16 answer = 0;
- debugC(1, kDebugDialogue, "runDialogue: showing answering face (%p)", (const void*)v48->_data0);
- _vm->_gfx->flatBlitCnv(v48, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y, Gfx::kBitFront);
+ debugC(1, kDebugDialogue, "runDialogue: showing answering face (%p)", (const void*)face->_data0);
+ _vm->_gfx->flatBlitCnv(face, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y, Gfx::kBitFront);
debugC(1, kDebugDialogue, "runDialogue: answering face shown");
if (_askPassword == false) {
debugC(1, kDebugDialogue, "runDialogue: waiting for user to select answer");
- answer = selectAnswer(v60, v48);
+ answer = selectAnswer(q, face);
} else {
- answer = askDialoguePassword(v60, v48);
+ answer = askDialoguePassword(q, face);
}
_vm->_gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront); // erase answer screen
@@ -380,68 +380,69 @@ void runDialogue(SpeakData *data) {
_vm->_gfx->setFont("comic");
- Cnv v6E;
+ Cnv* v6E;
if (!scumm_stricmp(data->_name, "yourself") || data->_name[0] == '\0') {
- memcpy(&v6E, &_vm->_char._talk, sizeof(Cnv));
+ v6E = _vm->_char._talk;
debugC(1, kDebugDialogue, "runDialogue: using default character head");
} else {
debugC(1, kDebugDialogue, "runDialogue: loading 2nd character head '%s'", _vm->_characterName);
- _vm->_disk->loadTalk(data->_name, &v6E);
+ v6E = _vm->_disk->loadTalk(data->_name);
debugC(1, kDebugDialogue, "runDialogue: 2nd character head loaded");
}
StaticCnv questioner;
- questioner._width = v6E._width;
- questioner._height = v6E._height;
+ questioner._width = v6E->_width;
+ questioner._height = v6E->_height;
StaticCnv answerer;
- answerer._width = _vm->_char._talk._width;
- answerer._height = _vm->_char._talk._height;
+ answerer._width = _vm->_char._talk->_width;
+ answerer._height = _vm->_char._talk->_height;
bool displayedAnswers = false;
_askPassword = false;
uint16 answer = 0;
Command *v34 = NULL;
- Dialogue *v60 = data->_dialogue;
- while (v60) {
+ Dialogue *q = data->_dialogue;
+ while (q) {
- questioner._data0 = v6E._array[v60->_mood & 0xF];
+ questioner._data0 = v6E->_array[q->_mood & 0xF];
questioner._data1 = NULL; // v6E.field_8[v60->_mood & 0xF];
- answerer._data0 = _vm->_char._talk._array[0];
+ answerer._data0 = _vm->_char._talk->_array[0];
answerer._data1 = NULL; // _talk.field_8[0];
- displayQuestion(v60, &questioner);
+ displayQuestion(q, &questioner);
- if (v60->_answers[0] == NULL) break;
+ if (q->_answers[0] == NULL) break;
_answerBalloonY[0] = 10;
displayedAnswers = false;
- if (scumm_stricmp(v60->_answers[0], "NULL")) {
+ if (scumm_stricmp(q->_answers[0], "NULL")) {
- displayedAnswers = displayAnswers(v60);
+ displayedAnswers = displayAnswers(q);
if (displayedAnswers == true) {
- answer = getDialogueAnswer(v60, &answerer);
- v34 = v60->_commands[answer];
- v60 = (Dialogue*)v60->_following._questions[answer];
+ answer = getDialogueAnswer(q, &answerer);
+ v34 = q->_commands[answer];
+ q = (Dialogue*)q->_following._questions[answer];
} else {
debugC(1, kDebugDialogue, "runDialogue: no suitable answers found");
- v60 = NULL;
+ q = NULL;
}
} else {
- v60 = (Dialogue*)v60->_following._questions[answer];
+ q = (Dialogue*)q->_following._questions[answer];
}
}
debugC(1, kDebugDialogue, "runDialogue: out of dialogue loop");
_vm->_gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront);
- if (scumm_stricmp(data->_name, "yourself") || data->_name[0] == '\0')
- _vm->_gfx->freeCnv(&v6E);
-
+ if (scumm_stricmp(data->_name, "yourself") || data->_name[0] == '\0') {
+ _vm->_gfx->freeCnv(v6E);
+ delete v6E;
+ }
exitDialogue();
debugC(1, kDebugDialogue, "runDialogue: exit dialogue ok");
@@ -472,8 +473,8 @@ int16 selectAnswer(Question *q, StaticCnv *cnv) {
if (numAvailableAnswers == 1) {
_vm->_gfx->displayWrappedString(q->_answers[_di], _answerBalloonX[_di], _answerBalloonY[_di], MAX_BALLOON_WIDTH, 0);
- cnv->_data0 = _vm->_char._talk._array[q->_answer_moods[_di] & 0xF];
-// cnv->_data1 = _vm->_char._talk.field_8[q->_answer_moods[_di] & 0xF];
+ cnv->_data0 = _vm->_char._talk->_array[q->_answer_moods[_di] & 0xF];
+// cnv->_data1 = _vm->_char._talk->field_8[q->_answer_moods[_di] & 0xF];
_vm->_gfx->flatBlitCnv(cnv, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y, Gfx::kBitFront);
waitUntilLeftClick();
return _di;
@@ -492,8 +493,8 @@ int16 selectAnswer(Question *q, StaticCnv *cnv) {
_vm->_gfx->displayWrappedString(q->_answers[v2], _answerBalloonX[v2], _answerBalloonY[v2], MAX_BALLOON_WIDTH, 3);
_vm->_gfx->displayWrappedString(q->_answers[_si], _answerBalloonX[_si], _answerBalloonY[_si], MAX_BALLOON_WIDTH, 0);
- cnv->_data0 = _vm->_char._talk._array[q->_answer_moods[_si] & 0xF];
-// cnv->_data1 = _vm->_char._talk.field_8[q->_answer_moods[_si] & 0xF];
+ cnv->_data0 = _vm->_char._talk->_array[q->_answer_moods[_si] & 0xF];
+// cnv->_data1 = _vm->_char._talk->field_8[q->_answer_moods[_si] & 0xF];
_vm->_gfx->flatBlitCnv(cnv, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y, Gfx::kBitFront);
}
diff --git a/engines/parallaction/disk.cpp b/engines/parallaction/disk.cpp
index 49d80215cc..cbda89f8bf 100644
--- a/engines/parallaction/disk.cpp
+++ b/engines/parallaction/disk.cpp
@@ -197,7 +197,9 @@ void Disk::loadCnv(const char *filename, Cnv *cnv) {
return;
}
-void Disk::loadTalk(const char *name, Cnv *cnv) {
+Cnv* Disk::loadTalk(const char *name) {
+
+ Cnv *cnv = new Cnv;
const char *ext = strstr(name, ".talk");
if (ext != NULL) {
@@ -228,6 +230,7 @@ void Disk::loadTalk(const char *name, Cnv *cnv) {
}
+ return cnv;
}
Script* Disk::loadLocation(const char *name) {
diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h
index d5bac325a1..a4c8aa6125 100644
--- a/engines/parallaction/disk.h
+++ b/engines/parallaction/disk.h
@@ -105,7 +105,7 @@ public:
Script* loadLocation(const char *name);
Script* loadScript(const char* name);
- void loadTalk(const char *name, Cnv *cnv);
+ Cnv* loadTalk(const char *name);
void loadObjects(const char *name, Cnv *cnv);
void loadPointer(StaticCnv* cnv);
void loadHead(const char* name, StaticCnv* cnv);
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index 35c7ba0bc3..80da5e730c 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -725,7 +725,9 @@ void freeCharacter() {
if (!IS_DUMMY_CHARACTER(_vm->_characterName)) {
_vm->_gfx->freeCnv(&_vm->_char._miniFrames);
_vm->freeTable(_objectsNames);
- _vm->_gfx->freeCnv(&_vm->_char._talk);
+ _vm->_gfx->freeCnv(_vm->_char._talk);
+ if (_vm->_char._talk) delete _vm->_char._talk;
+
_vm->_gfx->freeStaticCnv(&_vm->_char._head);
_vm->_gfx->freeCnv(&_vm->_char._objs);
}
@@ -805,7 +807,7 @@ void Parallaction::changeCharacter(const char *name) {
if (!IS_DUMMY_CHARACTER(name)) {
_disk->loadHead(path, &_vm->_char._head);
- _disk->loadTalk(path, &_vm->_char._talk);
+ _vm->_char._talk = _disk->loadTalk(path);
_disk->loadObjects(name, &_vm->_char._objs);
sprintf(path, "mini%s", v32);
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
index 1818b2cbe6..53838d7323 100644
--- a/engines/parallaction/parallaction.h
+++ b/engines/parallaction/parallaction.h
@@ -237,16 +237,17 @@ struct Location {
struct Character {
Animation _ani;
StaticCnv _head;
- Cnv _talk;
+ Cnv *_talk;
Cnv _normalFrames;
Cnv _miniFrames;
Cnv _objs;
Character() {
- _talk._width = 0;
- _talk._height = 0;
- _talk._count = 0;
- _talk._array = NULL;
+ _talk = NULL;
+// ._width = 0;
+// _talk._height = 0;
+// _talk._count = 0;
+// _talk._array = NULL;
_head._width = 0;
_head._height = 0;
diff --git a/engines/parallaction/zone.cpp b/engines/parallaction/zone.cpp
index 00e94140fd..44d0f9d2a3 100644
--- a/engines/parallaction/zone.cpp
+++ b/engines/parallaction/zone.cpp
@@ -366,10 +366,10 @@ void displayCharacterComment(ExamineData *data) {
if (data->_description == NULL) return;
StaticCnv v3C;
- v3C._width = _vm->_char._talk._width;
- v3C._height = _vm->_char._talk._height;
- v3C._data0 = _vm->_char._talk._array[0];
- v3C._data1 = NULL; //_talk.field_8[0];
+ v3C._width = _vm->_char._talk->_width;
+ v3C._height = _vm->_char._talk->_height;
+ v3C._data0 = _vm->_char._talk->_array[0];
+ v3C._data1 = NULL; //_talk->field_8[0];
_vm->_gfx->setFont("comic");
_vm->_gfx->flatBlitCnv(&v3C, 190, 80, Gfx::kBitFront);