From 919c0a2833273d3ae92d0eb3635a479c34e1ced9 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Thu, 22 Nov 2007 21:51:33 +0000 Subject: * added adapter from Graphics::Surface to Frames * changed all Disk routines to return Frames* instead of Graphics::Surface* * changed displayItemComment to use new gfx routines * merged code for Examine zones into displayComment svn-id: r29615 --- engines/parallaction/disk.h | 28 ++++++------ engines/parallaction/disk_br.cpp | 8 ++-- engines/parallaction/disk_ns.cpp | 26 +++++------ engines/parallaction/exec_ns.cpp | 74 +++++++++++--------------------- engines/parallaction/graphics.cpp | 11 +++-- engines/parallaction/graphics.h | 30 +++++++++++++ engines/parallaction/objects.cpp | 6 +-- engines/parallaction/objects.h | 4 +- engines/parallaction/parallaction.cpp | 2 + engines/parallaction/parallaction.h | 15 +++---- engines/parallaction/parallaction_br.cpp | 9 ++-- engines/parallaction/parallaction_ns.cpp | 4 +- engines/parallaction/parser_ns.cpp | 9 +++- 13 files changed, 117 insertions(+), 109 deletions(-) (limited to 'engines/parallaction') diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h index 6adab69f51..f6bb87d247 100644 --- a/engines/parallaction/disk.h +++ b/engines/parallaction/disk.h @@ -56,10 +56,10 @@ public: virtual Script* loadScript(const char* name) = 0; virtual Frames* loadTalk(const char *name) = 0; virtual Frames* loadObjects(const char *name) = 0; - virtual Graphics::Surface* loadPointer(const char *name) = 0; - virtual Graphics::Surface* loadHead(const char* name) = 0; + virtual Frames* loadPointer(const char *name) = 0; + virtual Frames* loadHead(const char* name) = 0; virtual Font* loadFont(const char* name) = 0; - virtual Graphics::Surface* loadStatic(const char* name) = 0; + virtual Frames* loadStatic(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; @@ -130,7 +130,7 @@ private: void unpackBackground(Common::ReadStream *stream, byte *screen, byte *mask, byte *path); Cnv* loadExternalCnv(const char *filename); Cnv* loadCnv(const char *filename); - Graphics::Surface *loadExternalStaticCnv(const char *filename); + Frames* loadExternalStaticCnv(const char *filename); void loadBackground(BackgroundInfo& info, const char *filename); void loadMaskAndPath(BackgroundInfo& info, const char *name); void parseDepths(Common::SeekableReadStream &stream); @@ -148,10 +148,10 @@ public: Script* loadScript(const char* name); Frames* loadTalk(const char *name); Frames* loadObjects(const char *name); - Graphics::Surface* loadPointer(const char *name); - Graphics::Surface* loadHead(const char* name); + Frames* loadPointer(const char *name); + Frames* loadHead(const char* name); Font* loadFont(const char* name); - Graphics::Surface* loadStatic(const char* name); + Frames* loadStatic(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); @@ -164,7 +164,7 @@ class AmigaDisk_ns : public Disk_ns { protected: Cnv* makeCnv(Common::SeekableReadStream &stream); - Graphics::Surface* makeStaticCnv(Common::SeekableReadStream &stream); + Frames* makeStaticCnv(Common::SeekableReadStream &stream); void patchFrame(byte *dst, byte *dlta, uint16 bytesPerPlane, uint16 height); void unpackFrame(byte *dst, byte *src, uint16 planeSize); void unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 bytesPerPlane, uint16 height); @@ -182,10 +182,10 @@ public: Script* loadScript(const char* name); Frames* loadTalk(const char *name); Frames* loadObjects(const char *name); - Graphics::Surface* loadPointer(const char *name); - Graphics::Surface* loadHead(const char* name); + Frames* loadPointer(const char *name); + Frames* loadHead(const char* name); Font* loadFont(const char* name); - Graphics::Surface* loadStatic(const char* name); + Frames* loadStatic(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); @@ -220,10 +220,10 @@ public: Script* loadScript(const char* name); Frames* loadTalk(const char *name); Frames* loadObjects(const char *name); - Graphics::Surface* loadPointer(const char *name); - Graphics::Surface* loadHead(const char* name); + Frames* loadPointer(const char *name); + Frames* loadHead(const char* name); Font* loadFont(const char* name); - Graphics::Surface* loadStatic(const char* name); + Frames* loadStatic(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); diff --git a/engines/parallaction/disk_br.cpp b/engines/parallaction/disk_br.cpp index c89bc0ddde..aca01e0880 100644 --- a/engines/parallaction/disk_br.cpp +++ b/engines/parallaction/disk_br.cpp @@ -166,13 +166,13 @@ Script* DosDisk_br::loadScript(const char* name) { } // there are no Head resources in Big Red Adventure -Graphics::Surface* DosDisk_br::loadHead(const char* name) { +Frames* DosDisk_br::loadHead(const char* name) { debugC(5, kDebugDisk, "DosDisk_br::loadHead"); return 0; } -Graphics::Surface* DosDisk_br::loadPointer(const char *name) { +Frames* DosDisk_br::loadPointer(const char *name) { debugC(5, kDebugDisk, "DosDisk_br::loadPointer"); char path[PATH_LEN]; @@ -193,7 +193,7 @@ Graphics::Surface* DosDisk_br::loadPointer(const char *name) { surf->create(width, height, 1); stream.read(surf->pixels, width * height); - return surf; + return new SurfaceToFrames(surf); } @@ -220,7 +220,7 @@ void genSlidePath(char *path, const char* name) { sprintf(path, "%s.bmp", name); } -Graphics::Surface* DosDisk_br::loadStatic(const char* name) { +Frames* DosDisk_br::loadStatic(const char* name) { debugC(5, kDebugDisk, "DosDisk_br::loadStatic"); return 0; } diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp index 1ec15c842c..3654d0a336 100644 --- a/engines/parallaction/disk_ns.cpp +++ b/engines/parallaction/disk_ns.cpp @@ -343,7 +343,7 @@ Cnv* DosDisk_ns::loadExternalCnv(const char *filename) { return new Cnv(numFrames, width, height, data); } -Graphics::Surface *DosDisk_ns::loadExternalStaticCnv(const char *filename) { +Frames* DosDisk_ns::loadExternalStaticCnv(const char *filename) { char path[PATH_LEN]; @@ -363,7 +363,7 @@ Graphics::Surface *DosDisk_ns::loadExternalStaticCnv(const char *filename) { cnv->create(w, h, 1); stream.read(cnv->pixels, w*h); - return cnv; + return new SurfaceToFrames(cnv); } Cnv* DosDisk_ns::loadCnv(const char *filename) { @@ -440,7 +440,7 @@ Script* DosDisk_ns::loadScript(const char* name) { return new Script(new DummyArchiveStream(_resArchive), true); } -Graphics::Surface* DosDisk_ns::loadHead(const char* name) { +Frames* DosDisk_ns::loadHead(const char* name) { char path[PATH_LEN]; @@ -451,7 +451,7 @@ Graphics::Surface* DosDisk_ns::loadHead(const char* name) { } -Graphics::Surface* DosDisk_ns::loadPointer(const char *name) { +Frames* DosDisk_ns::loadPointer(const char *name) { return loadExternalStaticCnv(name); } @@ -471,7 +471,7 @@ Frames* DosDisk_ns::loadObjects(const char *name) { } -Graphics::Surface* DosDisk_ns::loadStatic(const char* name) { +Frames* DosDisk_ns::loadStatic(const char* name) { char path[PATH_LEN]; @@ -493,7 +493,7 @@ Graphics::Surface* DosDisk_ns::loadStatic(const char* name) { Graphics::PackBitsReadStream decoder(_resArchive); decoder.read(cnv->pixels, w*h); - return cnv; + return new SurfaceToFrames(cnv); } Frames* DosDisk_ns::loadFrames(const char* name) { @@ -937,7 +937,7 @@ void AmigaDisk_ns::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 b } -Graphics::Surface* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) { +Frames* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) { stream.skip(1); uint16 width = stream.readByte(); @@ -958,7 +958,7 @@ Graphics::Surface* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &strea free(buf); - return cnv; + return new SurfaceToFrames(cnv); } Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream &stream) { @@ -1017,7 +1017,7 @@ Script* AmigaDisk_ns::loadScript(const char* name) { return new Script(new DummyArchiveStream(_resArchive), true); } -Graphics::Surface* AmigaDisk_ns::loadPointer(const char* name) { +Frames* AmigaDisk_ns::loadPointer(const char* name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadPointer"); Common::File stream; @@ -1027,11 +1027,11 @@ Graphics::Surface* AmigaDisk_ns::loadPointer(const char* name) { return makeStaticCnv(stream); } -Graphics::Surface* AmigaDisk_ns::loadStatic(const char* name) { +Frames* AmigaDisk_ns::loadStatic(const char* name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadStatic '%s'", name); Common::SeekableReadStream *s = openArchivedFile(name, true); - Graphics::Surface *cnv = makeStaticCnv(*s); + Frames *cnv = makeStaticCnv(*s); delete s; @@ -1285,14 +1285,14 @@ Frames* AmigaDisk_ns::loadFrames(const char* name) { return cnv; } -Graphics::Surface* AmigaDisk_ns::loadHead(const char* name) { +Frames* AmigaDisk_ns::loadHead(const char* name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadHead '%s'", name); char path[PATH_LEN]; sprintf(path, "%s.head", name); Common::SeekableReadStream *s = openArchivedFile(path, true); - Graphics::Surface *cnv = makeStaticCnv(*s); + Frames *cnv = makeStaticCnv(*s); delete s; diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp index 1545dc9d07..1c63d78ac3 100644 --- a/engines/parallaction/exec_ns.cpp +++ b/engines/parallaction/exec_ns.cpp @@ -482,53 +482,29 @@ void Parallaction::runCommands(CommandList& list, Zone *z) { // ZONE TYPE: EXAMINE // -// displays character head commenting an examined object -// -void Parallaction::displayCharacterComment(ExamineData *data) { - if (data->_description == NULL) return; +void Parallaction::displayComment(ExamineData *data) { + if (!data->_description) { + return; + } - _gfx->setDialogueBalloon(data->_description, 140, 10, 130, 0, 0); - _gfx->setItem(_char._talk, 190, 80); - _gfx->setItemFrame(0, 0); + if (data->_filename) { + _gfx->setHalfbriteMode(true); + _gfx->setDialogueBalloon(data->_description, 0, 90, 130, 0, 0); + Common::Rect r; + data->_cnv->getRect(0, r); + _gfx->setItem(data->_cnv, 140, (_screenHeight - r.height())/2); + _gfx->setItemFrame(0, 0); + _gfx->setItem(_char._head, 100, 152); + _gfx->setItemFrame(1, 0); + } else { + _gfx->setDialogueBalloon(data->_description, 140, 10, 130, 0, 0); + _gfx->setItem(_char._talk, 190, 80); + _gfx->setItemFrame(0, 0); + } _inputMode = kInputModeComment; } -// display detail view of an item (and eventually comments) -// -void Parallaction::displayItemComment(ExamineData *data) { - - if (data->_description == NULL) return; - - _gfx->setHalfbriteMode(true); - - char v68[PATH_LEN]; - strcpy(v68, data->_filename); - data->_cnv = _disk->loadStatic(v68); - _gfx->flatBlitCnv(data->_cnv, 140, (_screenHeight - data->_cnv->h)/2, Gfx::kBitFront); - delete data->_cnv; - - int16 v6A = 0, v6C = 0; - - _gfx->setFont(_dialogueFont); - _gfx->getStringExtent(data->_description, 130, &v6C, &v6A); - Common::Rect r(v6C, v6A); - r.moveTo(0, 90); - _gfx->drawBalloon(r, 0); - _gfx->flatBlitCnv(_char._head, 100, 152, Gfx::kBitFront); - _gfx->displayWrappedString(data->_description, 0, 90, 0, 130); - - _gfx->updateScreen(); - - waitUntilLeftClick(); - - _gfx->setHalfbriteMode(false); - _gfx->copyScreen(Gfx::kBitBack, Gfx::kBitFront); - _gfx->updateScreen(); - - return; -} - uint16 Parallaction::runZone(Zone *z) { @@ -540,11 +516,7 @@ uint16 Parallaction::runZone(Zone *z) { switch(subtype) { case kZoneExamine: - if (z->u.examine->_filename) { - displayItemComment(z->u.examine); - } else { - displayCharacterComment(z->u.examine); - } + displayComment(z->u.examine); break; case kZoneGet: @@ -631,7 +603,9 @@ void Parallaction_ns::jobRemovePickedItem(void *parm, Job *j) { static uint16 count = 0; if (z->u.get->_cnv) { - Common::Rect r(z->_left, z->_top, z->_left + z->u.get->_cnv->w, z->_top + z->u.get->_cnv->h); + Common::Rect r; + z->u.get->_cnv->getRect(0, r); + r.moveTo(z->_left, z->_top); _gfx->restoreGetBackground(r, z->u.get->_backup); } @@ -655,8 +629,8 @@ void Parallaction_ns::jobDisplayDroppedItem(void *parm, Job *j) { _gfx->backupGetBackground(z->u.get, z->_left, z->_top); } - _gfx->flatBlitCnv(z->u.get->_cnv, z->_left, z->_top, Gfx::kBitBack); - _gfx->flatBlitCnv(z->u.get->_cnv, z->_left, z->_top, Gfx::kBit2); + _gfx->flatBlitCnv(z->u.get->_cnv, 0, z->_left, z->_top, Gfx::kBitBack); + _gfx->flatBlitCnv(z->u.get->_cnv, 0, z->_left, z->_top, Gfx::kBit2); } j->_count++; diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp index e40d954f10..41f818a8a8 100644 --- a/engines/parallaction/graphics.cpp +++ b/engines/parallaction/graphics.cpp @@ -565,14 +565,17 @@ void Gfx::backupDoorBackground(DoorData *data, int16 x, int16 y) { void Gfx::backupGetBackground(GetData *data, int16 x, int16 y) { - byte *t = (byte*)data->_cnv->pixels; + byte *t = (byte*)data->_cnv->getData(0); byte *s = (byte*)_buffers[kBitBack]->getBasePtr(x, y); byte *d = data->_backup; - uint pitch = _backgroundWidth - data->_cnv->w; + Common::Rect r; + data->_cnv->getRect(0, r); + + uint pitch = _backgroundWidth - r.width(); - for (uint16 i = 0; i < data->_cnv->h ; i++) { - for (uint16 j = 0; j < data->_cnv->w ; j++) { + for (uint16 i = 0; i < r.height(); i++) { + for (uint16 j = 0; j < r.width(); j++) { *d = (*t) ? *s : 0; d++; diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h index 2bc17f0b77..7eacff4f5d 100644 --- a/engines/parallaction/graphics.h +++ b/engines/parallaction/graphics.h @@ -84,6 +84,36 @@ struct Frames { }; +struct SurfaceToFrames : public Frames { + + Graphics::Surface *_surf; + +public: + SurfaceToFrames(Graphics::Surface *surf) : _surf(surf) { + } + + ~SurfaceToFrames() { + delete _surf; + } + + uint16 getNum() { + return 1; + } + byte* getData(uint16 index) { + assert(index == 0); + return (byte*)_surf->getBasePtr(0,0); + } + void getRect(uint16 index, Common::Rect &r) { + assert(index == 0); + r.left = 0; + r.top = 0; + r.setWidth(_surf->w); + r.setHeight(_surf->h); + } + + +}; + struct Cnv : public Frames { uint16 _count; // # of frames uint16 _width; // diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp index 0d46568106..93ebca5ff1 100644 --- a/engines/parallaction/objects.cpp +++ b/engines/parallaction/objects.cpp @@ -131,6 +131,7 @@ Zone::~Zone() { case kZoneExamine: free(u.examine->_filename); free(u.examine->_description); + delete u.examine->_cnv; delete u.examine; break; @@ -148,10 +149,7 @@ Zone::~Zone() { case kZoneGet: free(u.get->_backup); - if (u.get->_cnv) { - u.get->_cnv->free(); - delete u.get->_cnv; - } + delete u.get->_cnv; delete u.get; break; diff --git a/engines/parallaction/objects.h b/engines/parallaction/objects.h index fdbe062e8b..c62dedc829 100644 --- a/engines/parallaction/objects.h +++ b/engines/parallaction/objects.h @@ -170,7 +170,7 @@ struct Dialogue { struct GetData { // size = 24 uint32 _icon; - Graphics::Surface *_cnv; + Frames *_cnv; byte *_backup; uint16 field_14; // unused uint16 field_16; // unused @@ -191,7 +191,7 @@ struct SpeakData { // size = 36 } }; struct ExamineData { // size = 28 - Graphics::Surface *_cnv; + Frames *_cnv; uint16 _opBase; // unused uint16 field_12; // unused char* _description; diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index 5031e7be22..1bbe06984b 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -432,6 +432,8 @@ void Parallaction::updateCommentInput() { waitUntilLeftClick(); _gfx->hideDialogueStuff(); + _gfx->setHalfbriteMode(false); + _inputMode = kInputModeGame; } diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index f6749d908f..521aa634b5 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -213,7 +213,7 @@ struct Character { Animation _ani; - Graphics::Surface *_head; + Frames *_head; Frames *_talk; Frames *_objs; PathBuilder _builder; @@ -558,8 +558,7 @@ protected: // members void freeLocation(); void showLocationComment(const char *text, bool end); - void displayCharacterComment(ExamineData *data); - void displayItemComment(ExamineData *data); + void displayComment(ExamineData *data); uint16 checkDoor(); @@ -705,7 +704,7 @@ private: void initCursors(); static byte _mouseArrow[256]; - Graphics::Surface *_mouseComposedArrow; + Frames *_mouseComposedArrow; static const Callable _dosCallables[25]; static const Callable _amigaCallables[25]; @@ -1002,10 +1001,10 @@ private: void setMousePointer(int16 index); void initCursors(); - Graphics::Surface *_dinoCursor; - Graphics::Surface *_dougCursor; - Graphics::Surface *_donnaCursor; - Graphics::Surface *_mouseArrow; + Frames *_dinoCursor; + Frames *_dougCursor; + Frames *_donnaCursor; + Frames *_mouseArrow; int showMenu(); diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 232e08799e..b832b50fd9 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -92,10 +92,6 @@ int Parallaction_br::init() { Parallaction_br::~Parallaction_br() { freeFonts(); - _dinoCursor->free(); - _dougCursor->free(); - _donnaCursor->free(); - delete _dinoCursor; delete _dougCursor; delete _donnaCursor; @@ -308,7 +304,10 @@ void Parallaction_br::initCursors() { void Parallaction_br::setMousePointer(int16 index) { - _system->setMouseCursor((byte*)_mouseArrow->pixels, _mouseArrow->w, _mouseArrow->h, 0, 0, 0); + Common::Rect r; + _mouseArrow->getRect(0, r); + + _system->setMouseCursor(_mouseArrow->getData(0), r.width(), r.height(), 0, 0, 0); _system->showMouse(true); } diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index b810ff7da7..6541498988 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -146,10 +146,8 @@ int Parallaction_ns::init() { Parallaction_ns::~Parallaction_ns() { freeFonts(); - _mouseComposedArrow->free(); delete _mouseComposedArrow; - delete _commandsNames; delete _instructionNames; delete _locationStmt; @@ -223,7 +221,7 @@ void Parallaction_ns::setInventoryCursor(int pos) { _activeItem._id = item->_id; - byte *v8 = (byte*)_mouseComposedArrow->pixels; + byte *v8 = _mouseComposedArrow->getData(0); // FIXME: destination offseting is not clear byte* s = _char._objs->getData(item->_index); diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp index 35f6f20346..9681d67a8b 100644 --- a/engines/parallaction/parser_ns.cpp +++ b/engines/parallaction/parser_ns.cpp @@ -1275,11 +1275,15 @@ void Parallaction_ns::parseGetData(Script &script, Zone *z) { if (!scumm_stricmp(_tokens[0], "file")) { data->_cnv = _disk->loadStatic(_tokens[1]); - data->_backup = (byte*)malloc(data->_cnv->w*data->_cnv->h); + + Common::Rect r; + data->_cnv->getRect(0, r); + + data->_backup = (byte*)malloc(r.width() * r.height()); if ((z->_flags & kFlagsRemove) == 0) { _gfx->backupGetBackground(data, z->_left, z->_top); - _gfx->flatBlitCnv(data->_cnv, z->_left, z->_top, Gfx::kBitBack); + _gfx->flatBlitCnv(data->_cnv, 0, z->_left, z->_top, Gfx::kBitBack); } } @@ -1303,6 +1307,7 @@ void Parallaction_ns::parseExamineData(Script &script, Zone *z) { if (!scumm_stricmp(_tokens[0], "file")) { data->_filename = strdup(_tokens[1]); + data->_cnv = _disk->loadStatic(_tokens[1]); } if (!scumm_stricmp(_tokens[0], "desc")) { data->_description = parseComment(script); -- cgit v1.2.3