From 404088f58b0630ee357a03123e917c30d7674ee2 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 14 Mar 2010 05:47:33 +0000 Subject: Further separation of MADS and M4 scene logic svn-id: r48257 --- engines/m4/m4_scene.cpp | 22 +++++++++ engines/m4/m4_scene.h | 1 + engines/m4/mads_scene.cpp | 98 ++++++++++++++++++++++++++++++++++++++ engines/m4/mads_scene.h | 1 + engines/m4/scene.cpp | 119 ---------------------------------------------- engines/m4/scene.h | 2 - 6 files changed, 122 insertions(+), 121 deletions(-) (limited to 'engines/m4') diff --git a/engines/m4/m4_scene.cpp b/engines/m4/m4_scene.cpp index 912ec45ceb..90f288c31a 100644 --- a/engines/m4/m4_scene.cpp +++ b/engines/m4/m4_scene.cpp @@ -117,6 +117,28 @@ void M4Scene::loadSceneInverseColourTable(int sceneNumber) { iplS->read(_inverseColourTable, iplS->size()); _vm->res()->toss(filename); } + +void M4Scene::loadSceneSpriteCodes(int sceneNumber) { + char filename[kM4MaxFilenameSize]; + sprintf(filename, "%i.ssc", sceneNumber); + + Common::SeekableReadStream *sceneS = _vm->res()->get(filename); + + // TODO + + if (sceneS != NULL) { + SpriteAsset* _sceneSpriteCodes = new SpriteAsset(_vm, sceneS, sceneS->size(), filename); + int colorCount = _sceneSpriteCodes->getColorCount(); +// RGB8* spritePalette = _sceneSpriteCodes->getPalette(); + //_vm->_palette->setPalette(spritePalette, 0, colorCount); + + printf("Scene has %d sprite codes, each one having %d colors\n", _sceneSpriteCodes->getCount(), colorCount); + + // Note that toss() deletes the MemoryReadStream + _vm->res()->toss(filename); + } +} + void M4Scene::loadScene(int sceneNumber) { Scene::loadScene(sceneNumber); diff --git a/engines/m4/m4_scene.h b/engines/m4/m4_scene.h index c90bdbfeaa..14eea3dfac 100644 --- a/engines/m4/m4_scene.h +++ b/engines/m4/m4_scene.h @@ -55,6 +55,7 @@ private: void loadSceneSprites(int sceneNumber); void loadSceneResources(int sceneNumber); void loadSceneInverseColourTable(int sceneNumber); + void loadSceneSpriteCodes(int sceneNumber); void nextCommonCursor(); public: M4Scene(M4Engine *vm); diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 94ae83366b..338bc8fb4f 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -370,6 +370,104 @@ void MadsScene::loadPlayerSprites(const char *prefix) { error("Couldn't find player sprites"); } +enum boxSprites { + topLeft = 0, + topRight = 1, + bottomLeft = 2, + bottomRight = 3, + left = 4, + right = 5, + top = 6, + bottom = 7, + topMiddle = 8, + filler1 = 9, + filler2 = 10 + // TODO: finish this +}; + +// TODO: calculate width and height, show text, show face if it exists +// TODO: this has been tested with Dragonsphere only, there are some differences +// in the sprites used in Phantom +void MadsScene::showMADSV2TextBox(char *text, int x, int y, char *faceName) { + int repeatX = 40; // FIXME: this is hardcoded + int repeatY = 30; // FIXME: this is hardcoded + int curX = x, curY = y; + int topRightX = x; // TODO: this is probably not needed + Common::SeekableReadStream *data = _vm->res()->get("box.ss"); + SpriteAsset *boxSprites = new SpriteAsset(_vm, data, data->size(), "box.ss"); + _vm->res()->toss("box.ss"); + + RGBList *palData = new RGBList(boxSprites->getColorCount(), boxSprites->getPalette(), true); + _vm->_palette->addRange(palData); + + for (int i = 0; i < boxSprites->getCount(); i++) + boxSprites->getFrame(i)->translate(palData); // sprite pixel translation + + // Top left corner + boxSprites->getFrame(topLeft)->copyTo(_backgroundSurface, x, curY); + curX += boxSprites->getFrame(topLeft)->width(); + + // Top line + for (int i = 0; i < repeatX; i++) { + boxSprites->getFrame(top)->copyTo(_backgroundSurface, curX, curY + 3); + curX += boxSprites->getFrame(top)->width(); + } + + // Top right corner + boxSprites->getFrame(topRight)->copyTo(_backgroundSurface, curX, curY); + topRightX = curX; + + // Top middle + // FIXME: the transparent color for this is also the black border color + boxSprites->getFrame(topMiddle)->copyTo(_backgroundSurface, + x + (curX - x) / 2 - boxSprites->getFrame(topMiddle)->width() / 2, + curY - 5, 167); + curX = x; + curY += boxSprites->getFrame(topLeft)->height(); + + // ----------------------------------------------------------------------------------------------- + + // Draw contents + for (int i = 0; i < repeatY; i++) { + for (int j = 0; j < repeatX; j++) { + if (j == 0) { + boxSprites->getFrame(left)->copyTo(_backgroundSurface, curX + 3, curY); + curX += boxSprites->getFrame(left)->width(); + } else if (j == repeatX - 1) { + curX = topRightX - 2; + boxSprites->getFrame(right)->copyTo(_backgroundSurface, curX + 3, curY + 1); + } else { + // TODO: the background of the contents follows a pattern which is not understood yet + if (j % 2 == 0) { + boxSprites->getFrame(filler1)->copyTo(_backgroundSurface, curX + 3, curY); + curX += boxSprites->getFrame(filler1)->width(); + } else { + boxSprites->getFrame(filler2)->copyTo(_backgroundSurface, curX + 3, curY); + curX += boxSprites->getFrame(filler2)->width(); + } + } + } // for j + curX = x; + curY += boxSprites->getFrame(left)->height(); + } // for i + + // ----------------------------------------------------------------------------------------------- + curX = x; + + // Bottom left corner + boxSprites->getFrame(bottomLeft)->copyTo(_backgroundSurface, curX, curY); + curX += boxSprites->getFrame(bottomLeft)->width(); + + // Bottom line + for (int i = 0; i < repeatX; i++) { + boxSprites->getFrame(bottom)->copyTo(_backgroundSurface, curX, curY + 1); + curX += boxSprites->getFrame(bottom)->width(); + } + + // Bottom right corner + boxSprites->getFrame(bottomRight)->copyTo(_backgroundSurface, curX, curY + 1); +} + /*--------------------------------------------------------------------------*/ MadsAction::MadsAction() { diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index e8b30b32ff..82ac4f28ba 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -192,6 +192,7 @@ public: int loadSceneSpriteSet(const char *setName); void loadPlayerSprites(const char *prefix); + void showMADSV2TextBox(char *text, int x, int y, char *faceName); MadsInterfaceView *getInterface() { return (MadsInterfaceView *)_interfaceSurface; }; MadsSceneResources &getSceneResources() { return _sceneResources; }; diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index da0f0e42aa..fb4145c123 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -91,27 +91,6 @@ void Scene::hideInterface() { _vm->_viewManager->deleteView(_interfaceSurface); } -void Scene::loadSceneSpriteCodes(int sceneNumber) { - char filename[kM4MaxFilenameSize]; - sprintf(filename, "%i.ssc", sceneNumber); - - Common::SeekableReadStream *sceneS = _vm->res()->get(filename); - - // TODO - - if (sceneS != NULL) { - SpriteAsset* _sceneSpriteCodes = new SpriteAsset(_vm, sceneS, sceneS->size(), filename); - int colorCount = _sceneSpriteCodes->getColorCount(); -// RGB8* spritePalette = _sceneSpriteCodes->getPalette(); - //_vm->_palette->setPalette(spritePalette, 0, colorCount); - - printf("Scene has %d sprite codes, each one having %d colors\n", _sceneSpriteCodes->getCount(), colorCount); - - // Note that toss() deletes the MemoryReadStream - _vm->res()->toss(filename); - } -} - void Scene::showSprites() { // TODO: This is all experimental code, it needs heavy restructuring // and cleanup @@ -222,102 +201,4 @@ bool Scene::onEvent(M4EventType eventType, int32 param1, int x, int y, bool &cap return true; } -enum boxSprites { - topLeft = 0, - topRight = 1, - bottomLeft = 2, - bottomRight = 3, - left = 4, - right = 5, - top = 6, - bottom = 7, - topMiddle = 8, - filler1 = 9, - filler2 = 10 - // TODO: finish this -}; - -// TODO: calculate width and height, show text, show face if it exists -// TODO: this has been tested with Dragonsphere only, there are some differences -// in the sprites used in Phantom -void Scene::showMADSV2TextBox(char *text, int x, int y, char *faceName) { - int repeatX = 40; // FIXME: this is hardcoded - int repeatY = 30; // FIXME: this is hardcoded - int curX = x, curY = y; - int topRightX = x; // TODO: this is probably not needed - Common::SeekableReadStream *data = _vm->res()->get("box.ss"); - SpriteAsset *boxSprites = new SpriteAsset(_vm, data, data->size(), "box.ss"); - _vm->res()->toss("box.ss"); - - RGBList *palData = new RGBList(boxSprites->getColorCount(), boxSprites->getPalette(), true); - _vm->_palette->addRange(palData); - - for (int i = 0; i < boxSprites->getCount(); i++) - boxSprites->getFrame(i)->translate(palData); // sprite pixel translation - - // Top left corner - boxSprites->getFrame(topLeft)->copyTo(_backgroundSurface, x, curY); - curX += boxSprites->getFrame(topLeft)->width(); - - // Top line - for (int i = 0; i < repeatX; i++) { - boxSprites->getFrame(top)->copyTo(_backgroundSurface, curX, curY + 3); - curX += boxSprites->getFrame(top)->width(); - } - - // Top right corner - boxSprites->getFrame(topRight)->copyTo(_backgroundSurface, curX, curY); - topRightX = curX; - - // Top middle - // FIXME: the transparent color for this is also the black border color - boxSprites->getFrame(topMiddle)->copyTo(_backgroundSurface, - x + (curX - x) / 2 - boxSprites->getFrame(topMiddle)->width() / 2, - curY - 5, 167); - curX = x; - curY += boxSprites->getFrame(topLeft)->height(); - - // ----------------------------------------------------------------------------------------------- - - // Draw contents - for (int i = 0; i < repeatY; i++) { - for (int j = 0; j < repeatX; j++) { - if (j == 0) { - boxSprites->getFrame(left)->copyTo(_backgroundSurface, curX + 3, curY); - curX += boxSprites->getFrame(left)->width(); - } else if (j == repeatX - 1) { - curX = topRightX - 2; - boxSprites->getFrame(right)->copyTo(_backgroundSurface, curX + 3, curY + 1); - } else { - // TODO: the background of the contents follows a pattern which is not understood yet - if (j % 2 == 0) { - boxSprites->getFrame(filler1)->copyTo(_backgroundSurface, curX + 3, curY); - curX += boxSprites->getFrame(filler1)->width(); - } else { - boxSprites->getFrame(filler2)->copyTo(_backgroundSurface, curX + 3, curY); - curX += boxSprites->getFrame(filler2)->width(); - } - } - } // for j - curX = x; - curY += boxSprites->getFrame(left)->height(); - } // for i - - // ----------------------------------------------------------------------------------------------- - curX = x; - - // Bottom left corner - boxSprites->getFrame(bottomLeft)->copyTo(_backgroundSurface, curX, curY); - curX += boxSprites->getFrame(bottomLeft)->width(); - - // Bottom line - for (int i = 0; i < repeatX; i++) { - boxSprites->getFrame(bottom)->copyTo(_backgroundSurface, curX, curY + 1); - curX += boxSprites->getFrame(bottom)->width(); - } - - // Bottom right corner - boxSprites->getFrame(bottomRight)->copyTo(_backgroundSurface, curX, curY + 1); -} - } // End of namespace M4 diff --git a/engines/m4/scene.h b/engines/m4/scene.h index d8349b541e..67acfc6654 100644 --- a/engines/m4/scene.h +++ b/engines/m4/scene.h @@ -108,7 +108,6 @@ public: // TODO: perhaps move playIntro() someplace else? void playIntro(); - void loadSceneSpriteCodes(int sceneNumber); void showSprites(); void showHotSpots(); void showCodes(); @@ -116,7 +115,6 @@ public: M4Surface *getBackgroundSurface() const { return _backgroundSurface; } void showInterface(); void hideInterface(); - void showMADSV2TextBox(char *text, int x, int y, char *faceName); GameInterfaceView *getInterface() { return _interfaceSurface; }; SceneResources &getSceneResources() { return *_sceneResources; }; -- cgit v1.2.3