* Fixed positioning of balloons and faces in BRA (dos, at least).

* Adapted loading of faces.

svn-id: r33392
This commit is contained in:
Nicola Mettifogo 2008-07-29 03:14:35 +00:00
parent e5c09b018a
commit c8400e9725
4 changed files with 78 additions and 31 deletions

View File

@ -315,11 +315,11 @@ int BalloonManager_br::setSingleBalloon(char *text, uint16 x, uint16 y, uint16 w
Balloon *balloon = &_intBalloons[id];
if (winding == 0) {
src = _leftBalloon;
src = _rightBalloon;
srcFrame = 0;
} else
if (winding == 1) {
src = _rightBalloon;
src = _leftBalloon;
srcFrame = 0;
}
@ -332,10 +332,12 @@ int BalloonManager_br::setSingleBalloon(char *text, uint16 x, uint16 y, uint16 w
// TODO: extract some text to make a name for obj
balloon->obj = _gfx->registerBalloon(new SurfaceToFrames(balloon->surface), 0);
balloon->obj->x = x;
balloon->obj->y = y;
balloon->obj->x = x + balloon->box.left;
balloon->obj->y = y + balloon->box.top;
balloon->obj->transparentKey = BALLOON_TRANSPARENT_COLOR_BR;
printf("balloon (%i, %i)\n", balloon->obj->x, balloon->obj->y);
_numBalloons++;
return id;
@ -351,11 +353,11 @@ int BalloonManager_br::setDialogueBalloon(char *text, uint16 winding, byte textC
Balloon *balloon = &_intBalloons[id];
if (winding == 0) {
src = _leftBalloon;
src = _rightBalloon;
srcFrame = id;
} else
if (winding == 1) {
src = _rightBalloon;
src = _leftBalloon;
srcFrame = 0;
}
@ -368,8 +370,8 @@ int BalloonManager_br::setDialogueBalloon(char *text, uint16 winding, byte textC
// TODO: extract some text to make a name for obj
balloon->obj = _gfx->registerBalloon(new SurfaceToFrames(balloon->surface), 0);
balloon->obj->x = 0;
balloon->obj->y = 10;
balloon->obj->x = balloon->box.left;
balloon->obj->y = balloon->box.top;
balloon->obj->transparentKey = BALLOON_TRANSPARENT_COLOR_BR;
if (id > 0) {

View File

@ -33,7 +33,7 @@
namespace Parallaction {
#define MAX_PASSWORD_LENGTH 7
/*
#define QUESTION_BALLOON_X 140
#define QUESTION_BALLOON_Y 10
#define QUESTION_CHARACTER_X 190
@ -41,6 +41,25 @@ namespace Parallaction {
#define ANSWER_CHARACTER_X 10
#define ANSWER_CHARACTER_Y 80
*/
struct BalloonPositions {
Common::Point _questionBalloon;
Common::Point _questionChar;
Common::Point _answerChar;
};
BalloonPositions _balloonPositions_NS = {
Common::Point(140, 10),
Common::Point(190, 80),
Common::Point(10, 80)
};
BalloonPositions _balloonPositions_BR = {
Common::Point(0, 0),
Common::Point(380, 80),
Common::Point(10, 80)
};
class DialogueManager {
@ -78,6 +97,7 @@ class DialogueManager {
bool _isKeyDown;
uint16 _downKey;
BalloonPositions _ballonPos;
public:
DialogueManager(Parallaction *vm, ZonePtr z);
@ -112,6 +132,15 @@ protected:
};
DialogueManager::DialogueManager(Parallaction *vm, ZonePtr z) : _vm(vm), _z(z) {
int gtype = vm->getGameType();
if (gtype == GType_Nippon) {
_ballonPos = _balloonPositions_NS;
} else
if (gtype == GType_BRA) {
_ballonPos = _balloonPositions_BR;
} else
error("unsupported game in DialogueManager");
_dialogue = _z->u.speak->_dialogue;
isNpc = scumm_stricmp(_z->u.speak->_name, "yourself") && _z->u.speak->_name[0] != '\0';
_questioner = isNpc ? _vm->_disk->loadTalk(_z->u.speak->_name) : _vm->_char._talk;
@ -168,16 +197,16 @@ bool DialogueManager::displayAnswers() {
if (_askPassword) {
resetPassword();
// _vm->_balloonMan->setDialogueBalloon(_q->_answers[0]->_text, 1, 3);
int id = _vm->_gfx->setItem(_answerer, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y);
int id = _vm->_gfx->setItem(_answerer, _ballonPos._answerChar.x, _ballonPos._answerChar.y);
_vm->_gfx->setItemFrame(id, 0);
} else
if (_numVisAnswers == 1) {
int id = _vm->_gfx->setItem(_answerer, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y);
int id = _vm->_gfx->setItem(_answerer, _ballonPos._answerChar.x, _ballonPos._answerChar.y);
_vm->_gfx->setItemFrame(id, _q->_answers[0]->_mood & 0xF);
_vm->_balloonMan->setBalloonText(0, _q->_answers[_visAnswers[0]]->_text, 0);
} else
if (_numVisAnswers > 1) {
int id = _vm->_gfx->setItem(_answerer, ANSWER_CHARACTER_X, ANSWER_CHARACTER_Y);
int id = _vm->_gfx->setItem(_answerer, _ballonPos._answerChar.x, _ballonPos._answerChar.y);
_vm->_gfx->setItemFrame(id, _q->_answers[_visAnswers[0]]->_mood & 0xF);
_oldSelection = -1;
_selection = 0;
@ -189,8 +218,8 @@ bool DialogueManager::displayAnswers() {
bool DialogueManager::displayQuestion() {
if (!scumm_stricmp(_q->_text, "NULL")) return false;
_vm->_balloonMan->setSingleBalloon(_q->_text, QUESTION_BALLOON_X, QUESTION_BALLOON_Y, _q->_mood & 0x10, 0);
int id = _vm->_gfx->setItem(_questioner, QUESTION_CHARACTER_X, QUESTION_CHARACTER_Y);
_vm->_balloonMan->setSingleBalloon(_q->_text, _ballonPos._questionBalloon.x, _ballonPos._questionBalloon.y, _q->_mood & 0x10, 0);
int id = _vm->_gfx->setItem(_questioner, _ballonPos._questionChar.x, _ballonPos._questionChar.y);
_vm->_gfx->setItemFrame(id, _q->_mood & 0xF);
return true;

View File

@ -144,7 +144,16 @@ GfxObj* DosDisk_br::loadTalk(const char *name) {
Common::File stream;
stream.open(node);
return new GfxObj(0, createSprites(stream), name);
// talk position is set to (0,0), because talks are always displayed at
// absolute coordinates, set in the dialogue manager. The original used
// to null out coordinates every time they were needed. We do it better!
Sprites *spr = createSprites(stream);
for (int i = 0; i < spr->getNum(); i++) {
spr->_sprites[i].x = 0;
spr->_sprites[i].y = 0;
}
return new GfxObj(0, spr, name);
}
Script* DosDisk_br::loadLocation(const char *name) {

View File

@ -499,24 +499,31 @@ void Parallaction::enterCommentMode(ZonePtr z) {
return;
}
int id;
// TODO: move this balloons stuff into DialogueManager and BalloonManager
if (getGameType() == GType_Nippon) {
int id;
if (data->_filename) {
if (data->_cnv == 0) {
data->_cnv = _disk->loadStatic(data->_filename);
}
if (data->_filename) {
if (data->_cnv == 0) {
data->_cnv = _disk->loadStatic(data->_filename);
_gfx->setHalfbriteMode(true);
_balloonMan->setSingleBalloon(data->_description, 0, 90, 0, 0);
Common::Rect r;
data->_cnv->getRect(0, r);
id = _gfx->setItem(data->_cnv, 140, (_screenHeight - r.height())/2);
_gfx->setItemFrame(id, 0);
id = _gfx->setItem(_char._head, 100, 152);
_gfx->setItemFrame(id, 0);
} else {
_balloonMan->setSingleBalloon(data->_description, 140, 10, 0, 0);
id = _gfx->setItem(_char._talk, 190, 80);
_gfx->setItemFrame(id, 0);
}
_gfx->setHalfbriteMode(true);
_balloonMan->setSingleBalloon(data->_description, 0, 90, 0, 0);
Common::Rect r;
data->_cnv->getRect(0, r);
id = _gfx->setItem(data->_cnv, 140, (_screenHeight - r.height())/2);
_gfx->setItemFrame(id, 0);
id = _gfx->setItem(_char._head, 100, 152);
_gfx->setItemFrame(id, 0);
} else {
_balloonMan->setSingleBalloon(data->_description, 140, 10, 0, 0);
id = _gfx->setItem(_char._talk, 190, 80);
} else
if (getGameType() == GType_BRA) {
_balloonMan->setSingleBalloon(data->_description, 0, 0, 1, 0);
int id = _gfx->setItem(_char._talk, 10, 80);
_gfx->setItemFrame(id, 0);
}