aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Mettifogo2008-07-03 10:31:25 +0000
committerNicola Mettifogo2008-07-03 10:31:25 +0000
commit59e672ef40e4c227c27022ec764f8b811b375220 (patch)
tree8a200cb1813a620467e71ad7e18cc6f393af347a
parentde09845319f43f6bad3582af5d570de43c7f9632 (diff)
downloadscummvm-rg350-59e672ef40e4c227c27022ec764f8b811b375220.tar.gz
scummvm-rg350-59e672ef40e4c227c27022ec764f8b811b375220.tar.bz2
scummvm-rg350-59e672ef40e4c227c27022ec764f8b811b375220.zip
Changed balloons to use GfxObj as well. Next step is to integrate balloons for BRA.
svn-id: r32883
-rw-r--r--engines/parallaction/disk.h10
-rw-r--r--engines/parallaction/disk_br.cpp8
-rw-r--r--engines/parallaction/disk_ns.cpp8
-rw-r--r--engines/parallaction/gfxbase.cpp12
-rw-r--r--engines/parallaction/graphics.cpp85
-rw-r--r--engines/parallaction/graphics.h13
6 files changed, 82 insertions, 54 deletions
diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h
index 176f10aa10..694d4efa6d 100644
--- a/engines/parallaction/disk.h
+++ b/engines/parallaction/disk.h
@@ -61,7 +61,7 @@ public:
virtual GfxObj* loadHead(const char* name) = 0;
virtual Font* loadFont(const char* name) = 0;
virtual GfxObj* loadStatic(const char* name) = 0;
- virtual GfxObj* loadFrames(const char* name) = 0;
+ virtual Frames* loadFrames(const char* name) = 0;
virtual void loadSlide(BackgroundInfo& info, const char *filename) = 0;
virtual void loadScenery(BackgroundInfo& info, const char* background, const char* mask, const char* path) = 0;
virtual Table* loadTable(const char* name) = 0;
@@ -153,7 +153,7 @@ public:
GfxObj* loadHead(const char* name);
Font* loadFont(const char* name);
GfxObj* loadStatic(const char* name);
- GfxObj* loadFrames(const char* name);
+ Frames* loadFrames(const char* name);
void loadSlide(BackgroundInfo& info, const char *filename);
void loadScenery(BackgroundInfo& info, const char* background, const char* mask, const char* path);
Table* loadTable(const char* name);
@@ -187,7 +187,7 @@ public:
GfxObj* loadHead(const char* name);
Font* loadFont(const char* name);
GfxObj* loadStatic(const char* name);
- GfxObj* loadFrames(const char* name);
+ Frames* loadFrames(const char* name);
void loadSlide(BackgroundInfo& info, const char *filename);
void loadScenery(BackgroundInfo& info, const char* background, const char* mask, const char* path);
Table* loadTable(const char* name);
@@ -226,7 +226,7 @@ public:
GfxObj* loadHead(const char* name);
Font* loadFont(const char* name);
GfxObj* loadStatic(const char* name);
- GfxObj* loadFrames(const char* name);
+ Frames* loadFrames(const char* name);
void loadSlide(BackgroundInfo& info, const char *filename);
void loadScenery(BackgroundInfo& info, const char* name, const char* mask, const char* path);
Table* loadTable(const char* name);
@@ -251,7 +251,7 @@ public:
GfxObj* loadTalk(const char *name);
Font* loadFont(const char* name);
GfxObj* loadStatic(const char* name);
- GfxObj* loadFrames(const char* name);
+ Frames* loadFrames(const char* name);
void loadSlide(BackgroundInfo& info, const char *filename);
void loadScenery(BackgroundInfo& info, const char* name, const char* mask, const char* path);
};
diff --git a/engines/parallaction/disk_br.cpp b/engines/parallaction/disk_br.cpp
index 0159d9d406..543ed14146 100644
--- a/engines/parallaction/disk_br.cpp
+++ b/engines/parallaction/disk_br.cpp
@@ -280,7 +280,7 @@ Sprites* DosDisk_br::createSprites(Common::ReadStream &stream) {
return sprites;
}
-GfxObj* DosDisk_br::loadFrames(const char* name) {
+Frames* DosDisk_br::loadFrames(const char* name) {
debugC(5, kDebugDisk, "DosDisk_br::loadFrames");
char path[PATH_LEN];
@@ -291,7 +291,7 @@ GfxObj* DosDisk_br::loadFrames(const char* name) {
errorFileNotFound(path);
- return new GfxObj(0, createSprites(stream), name);
+ return createSprites(stream);
}
// Slides in Nippon Safes are basically screen-sized pictures with valid
@@ -600,13 +600,13 @@ Sprites* AmigaDisk_br::createSprites(const char *path) {
return sprites;
}
-GfxObj* AmigaDisk_br::loadFrames(const char* name) {
+Frames* AmigaDisk_br::loadFrames(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_br::loadFrames '%s'", name);
char path[PATH_LEN];
sprintf(path, "%s/anims/%s", _partPath, name);
- return new GfxObj(0, createSprites(path));
+ return createSprites(path);
}
GfxObj* AmigaDisk_br::loadTalk(const char *name) {
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index f45cf83f56..55e6fc5e77 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -490,8 +490,8 @@ GfxObj* DosDisk_ns::loadStatic(const char* name) {
return new GfxObj(0, new SurfaceToFrames(cnv), name);
}
-GfxObj* DosDisk_ns::loadFrames(const char* name) {
- return new GfxObj(0, loadCnv(name), name);
+Frames* DosDisk_ns::loadFrames(const char* name) {
+ return loadCnv(name);
}
//
@@ -1258,7 +1258,7 @@ void AmigaDisk_ns::loadSlide(BackgroundInfo& info, const char *name) {
return;
}
-GfxObj* AmigaDisk_ns::loadFrames(const char* name) {
+Frames* AmigaDisk_ns::loadFrames(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadFrames '%s'", name);
Common::SeekableReadStream *s;
@@ -1273,7 +1273,7 @@ GfxObj* AmigaDisk_ns::loadFrames(const char* name) {
Cnv *cnv = makeCnv(*s);
delete s;
- return new GfxObj(0, cnv, name);
+ return cnv;
}
GfxObj* AmigaDisk_ns::loadHead(const char* name) {
diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp
index 383f5d549c..8d7041305d 100644
--- a/engines/parallaction/gfxbase.cpp
+++ b/engines/parallaction/gfxbase.cpp
@@ -86,12 +86,14 @@ void GfxObj::clearFlags(uint32 flags) {
}
GfxObj* Gfx::loadAnim(const char *name) {
- GfxObj *obj = _disk->loadFrames(name);
+ Frames* frames = _disk->loadFrames(name);
+ assert(frames);
+
+ GfxObj *obj = new GfxObj(kGfxObjTypeAnim, frames, name);
assert(obj);
// animation Z is not set here, but controlled by game scripts and user interaction.
// it is always >=0 and <screen height
- obj->type = kGfxObjTypeAnim;
obj->transparentKey = 0;
_gfxobjList.push_back(obj);
return obj;
@@ -110,11 +112,13 @@ GfxObj* Gfx::loadGet(const char *name) {
}
GfxObj* Gfx::loadDoor(const char *name) {
- GfxObj *obj = _disk->loadFrames(name);
+ Frames *frames = _disk->loadFrames(name);
+ assert(frames);
+
+ GfxObj *obj = new GfxObj(kGfxObjTypeDoor, frames, name);
assert(obj);
obj->z = kGfxObjDoorZ; // this preset Z value ensures that doors are drawn first
- obj->type = kGfxObjTypeDoor;
obj->transparentKey = 0;
_gfxobjList.push_back(obj);
return obj;
diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp
index 838827b19f..24c78d1703 100644
--- a/engines/parallaction/graphics.cpp
+++ b/engines/parallaction/graphics.cpp
@@ -362,15 +362,13 @@ void Gfx::drawItems() {
}
void Gfx::drawBalloons() {
- if (_numBalloons == 0) {
+ if (_balloons.size() == 0) {
return;
}
Graphics::Surface *surf = g_system->lockScreen();
- for (uint i = 0; i < _numBalloons; i++) {
- Common::Rect r(_balloons[i].surface.w, _balloons[i].surface.h);
- r.moveTo(_balloons[i].x, _balloons[i].y);
- blt(r, (byte*)_balloons[i].surface.getBasePtr(0, 0), surf, LAYER_FOREGROUND, BALLOON_TRANSPARENT_COLOR);
+ for (uint i = 0; i < _balloons.size(); i++) {
+ drawGfxObject(_balloons[i], *surf, false);
}
g_system->unlockScreen();
}
@@ -832,7 +830,7 @@ void Gfx::setItemFrame(uint item, uint16 f) {
Gfx::Balloon* Gfx::getBalloon(uint id) {
assert(id < _numBalloons);
- return &_balloons[id];
+ return &_intBalloons[id];
}
int Gfx::createBalloon(int16 w, int16 h, int16 winding, uint16 borderThickness) {
@@ -840,18 +838,19 @@ int Gfx::createBalloon(int16 w, int16 h, int16 winding, uint16 borderThickness)
int id = _numBalloons;
- Gfx::Balloon *balloon = &_balloons[id];
+ Gfx::Balloon *balloon = &_intBalloons[id];
int16 real_h = (winding == -1) ? h : h + 9;
- balloon->surface.create(w, real_h, 1);
- balloon->surface.fillRect(Common::Rect(w, real_h), BALLOON_TRANSPARENT_COLOR);
+ balloon->surface = new Graphics::Surface;
+ balloon->surface->create(w, real_h, 1);
+ balloon->surface->fillRect(Common::Rect(w, real_h), BALLOON_TRANSPARENT_COLOR);
Common::Rect r(w, h);
- balloon->surface.fillRect(r, 0);
+ balloon->surface->fillRect(r, 0);
balloon->outerBox = r;
r.grow(-borderThickness);
- balloon->surface.fillRect(r, 1);
+ balloon->surface->fillRect(r, 1);
balloon->innerBox = r;
if (winding != -1) {
@@ -860,7 +859,7 @@ int Gfx::createBalloon(int16 w, int16 h, int16 winding, uint16 borderThickness)
winding = (winding == 0 ? 1 : 0);
Common::Rect s(BALLOON_TAIL_WIDTH, BALLOON_TAIL_HEIGHT);
s.moveTo(r.width()/2 - 5, r.bottom - 1);
- blt(s, _resBalloonTail[winding], &balloon->surface, LAYER_FOREGROUND, BALLOON_TRANSPARENT_COLOR);
+ blt(s, _resBalloonTail[winding], balloon->surface, LAYER_FOREGROUND, BALLOON_TRANSPARENT_COLOR);
}
_numBalloons++;
@@ -868,6 +867,20 @@ int Gfx::createBalloon(int16 w, int16 h, int16 winding, uint16 borderThickness)
return id;
}
+GfxObj* Gfx::registerBalloon(Frames *frames, const char *text) {
+
+ GfxObj *obj = new GfxObj(kGfxObjTypeBalloon, frames, text);
+
+ obj->layer = LAYER_FOREGROUND;
+ obj->frame = 0;
+ obj->transparentKey = BALLOON_TRANSPARENT_COLOR;
+ obj->setFlags(kGfxObjVisible);
+
+ _balloons.push_back(obj);
+
+ return obj;
+}
+
int Gfx::setSingleBalloon(char *text, uint16 x, uint16 y, uint16 winding, byte textColor) {
int16 w, h;
@@ -875,12 +888,14 @@ int Gfx::setSingleBalloon(char *text, uint16 x, uint16 y, uint16 winding, byte t
getStringExtent(_vm->_dialogueFont, text, MAX_BALLOON_WIDTH, &w, &h);
int id = createBalloon(w+5, h, winding, 1);
- Gfx::Balloon *balloon = &_balloons[id];
+ Gfx::Balloon *balloon = &_intBalloons[id];
- drawWrappedText(_vm->_dialogueFont, &balloon->surface, text, textColor, MAX_BALLOON_WIDTH);
+ drawWrappedText(_vm->_dialogueFont, balloon->surface, text, textColor, MAX_BALLOON_WIDTH);
- balloon->x = x;
- balloon->y = y;
+ // TODO: extract some text to make a name for obj
+ balloon->obj = registerBalloon(new SurfaceToFrames(balloon->surface), 0);
+ balloon->obj->x = x;
+ balloon->obj->y = y;
return id;
}
@@ -892,15 +907,17 @@ int Gfx::setDialogueBalloon(char *text, uint16 winding, byte textColor) {
getStringExtent(_vm->_dialogueFont, text, MAX_BALLOON_WIDTH, &w, &h);
int id = createBalloon(w+5, h, winding, 1);
- Gfx::Balloon *balloon = &_balloons[id];
+ Gfx::Balloon *balloon = &_intBalloons[id];
- drawWrappedText(_vm->_dialogueFont, &balloon->surface, text, textColor, MAX_BALLOON_WIDTH);
+ drawWrappedText(_vm->_dialogueFont, balloon->surface, text, textColor, MAX_BALLOON_WIDTH);
- balloon->x = _dialogueBalloonX[id];
- balloon->y = 10;
+ // TODO: extract some text to make a name for obj
+ balloon->obj = registerBalloon(new SurfaceToFrames(balloon->surface), 0);
+ balloon->obj->x = _dialogueBalloonX[id];
+ balloon->obj->y = 10;
if (id > 0) {
- balloon->y += _balloons[id - 1].y + _balloons[id - 1].outerBox.height();
+ balloon->obj->y += _intBalloons[id - 1].obj->y + _intBalloons[id - 1].outerBox.height();
}
@@ -909,8 +926,8 @@ int Gfx::setDialogueBalloon(char *text, uint16 winding, byte textColor) {
void Gfx::setBalloonText(uint id, char *text, byte textColor) {
Gfx::Balloon *balloon = getBalloon(id);
- balloon->surface.fillRect(balloon->innerBox, 1);
- drawWrappedText(_vm->_dialogueFont, &balloon->surface, text, textColor, MAX_BALLOON_WIDTH);
+ balloon->surface->fillRect(balloon->innerBox, 1);
+ drawWrappedText(_vm->_dialogueFont, balloon->surface, text, textColor, MAX_BALLOON_WIDTH);
}
@@ -921,11 +938,13 @@ int Gfx::setLocationBalloon(char *text, bool endGame) {
getStringExtent(_vm->_dialogueFont, text, MAX_BALLOON_WIDTH, &w, &h);
int id = createBalloon(w+(endGame ? 5 : 10), h+5, -1, BALLOON_TRANSPARENT_COLOR);
- Gfx::Balloon *balloon = &_balloons[id];
- drawWrappedText(_vm->_dialogueFont, &balloon->surface, text, 0, MAX_BALLOON_WIDTH);
+ Gfx::Balloon *balloon = &_intBalloons[id];
+ drawWrappedText(_vm->_dialogueFont, balloon->surface, text, 0, MAX_BALLOON_WIDTH);
- balloon->x = 5;
- balloon->y = 5;
+ // TODO: extract some text to make a name for obj
+ balloon->obj = registerBalloon(new SurfaceToFrames(balloon->surface), 0);
+ balloon->obj->x = 5;
+ balloon->obj->y = 5;
return id;
}
@@ -935,10 +954,10 @@ int Gfx::hitTestDialogueBalloon(int x, int y) {
Common::Point p;
for (uint i = 0; i < _numBalloons; i++) {
- p.x = x - _balloons[i].x;
- p.y = y - _balloons[i].y;
+ p.x = x - _intBalloons[i].obj->x;
+ p.y = y - _intBalloons[i].obj->y;
- if (_balloons[i].innerBox.contains(p))
+ if (_intBalloons[i].innerBox.contains(p))
return i;
}
@@ -947,8 +966,12 @@ int Gfx::hitTestDialogueBalloon(int x, int y) {
void Gfx::freeBalloons() {
+ _balloons.clear();
+
for (uint i = 0; i < _numBalloons; i++) {
- _balloons[i].surface.free();
+ delete _intBalloons[i].obj;
+ _intBalloons[i].obj = 0;
+ _intBalloons[i].surface = 0; // no need to delete surface, since it is done by obj (GfxObj)
}
_numBalloons = 0;
}
diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h
index df4cab4caf..b15da432d9 100644
--- a/engines/parallaction/graphics.h
+++ b/engines/parallaction/graphics.h
@@ -344,7 +344,8 @@ enum {
kGfxObjTypeDoor = 0,
kGfxObjTypeGet = 1,
kGfxObjTypeAnim = 2,
- kGfxObjTypeLabel = 3
+ kGfxObjTypeLabel = 3,
+ kGfxObjTypeBalloon = 4
};
enum {
@@ -484,6 +485,7 @@ public:
void setBalloonText(uint id, char *text, byte textColor);
int hitTestDialogueBalloon(int x, int y);
void getStringExtent(Font *font, char *text, uint16 maxwidth, int16* width, int16* height);
+ GfxObj* registerBalloon(Frames *frames, const char *text);
// other items
int setItem(GfxObj* obj, uint16 x, uint16 y, byte transparentColor = 0);
@@ -552,13 +554,11 @@ public:
static int16 _dialogueBalloonX[5];
struct Balloon {
- uint16 x;
- uint16 y;
Common::Rect outerBox;
Common::Rect innerBox;
- uint16 winding;
- Graphics::Surface surface;
- } _balloons[5];
+ Graphics::Surface *surface;
+ GfxObj *obj;
+ } _intBalloons[5];
uint _numBalloons;
@@ -573,6 +573,7 @@ public:
typedef Common::Array<GfxObj*> GfxObjArray;
GfxObjArray _labels;
+ GfxObjArray _balloons;
uint _floatingLabel;