diff options
author | Nicola Mettifogo | 2007-03-04 13:27:29 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2007-03-04 13:27:29 +0000 |
commit | b440bc1a0357503c6edec22ea1182613040de41c (patch) | |
tree | 5babcda3e4ae74037bd69e2b51f987a0840b2786 /engines | |
parent | 826b16ef714a228c8908b0f312cf342ee1216dfd (diff) | |
download | scummvm-rg350-b440bc1a0357503c6edec22ea1182613040de41c.tar.gz scummvm-rg350-b440bc1a0357503c6edec22ea1182613040de41c.tar.bz2 scummvm-rg350-b440bc1a0357503c6edec22ea1182613040de41c.zip |
wrapped loader routines into a new class named Disk. The new class is also responsible for handling Archives in place of the Parallaction engine.
svn-id: r25972
Diffstat (limited to 'engines')
-rw-r--r-- | engines/parallaction/animation.cpp | 4 | ||||
-rw-r--r-- | engines/parallaction/callables.cpp | 1 | ||||
-rw-r--r-- | engines/parallaction/dialogue.cpp | 11 | ||||
-rw-r--r-- | engines/parallaction/disk.cpp | 120 | ||||
-rw-r--r-- | engines/parallaction/disk.h | 49 | ||||
-rw-r--r-- | engines/parallaction/graphics.cpp | 4 | ||||
-rw-r--r-- | engines/parallaction/inventory.cpp | 4 | ||||
-rw-r--r-- | engines/parallaction/location.cpp | 33 | ||||
-rw-r--r-- | engines/parallaction/menu.cpp | 22 | ||||
-rw-r--r-- | engines/parallaction/parallaction.cpp | 11 | ||||
-rw-r--r-- | engines/parallaction/parallaction.h | 4 | ||||
-rw-r--r-- | engines/parallaction/saveload.cpp | 1 | ||||
-rw-r--r-- | engines/parallaction/zone.cpp | 18 |
13 files changed, 154 insertions, 128 deletions
diff --git a/engines/parallaction/animation.cpp b/engines/parallaction/animation.cpp index 45c479bcbf..f6cf8c89f6 100644 --- a/engines/parallaction/animation.cpp +++ b/engines/parallaction/animation.cpp @@ -128,7 +128,7 @@ Animation *Parallaction::parseAnimation(Script& script, Node *list, char *name) } } - loadFrames(vC8, &vD0->_cnv); + _disk->loadFrames(vC8, &vD0->_cnv); // int16 _ax = _vm->_graphics->loadCnv(vC8, &vD0->_cnv); // if (_ax == -1) exit(-1); } @@ -253,7 +253,7 @@ void Parallaction::loadProgram(Animation *a, char *filename) { // the largest script in Nippon Safes is 3,668 bytes, so 4 kb is well enough char* src = (char*)malloc(0x1000); - loadScript(filename, src); + _disk->loadScript(filename, src); _numLocals = 0; diff --git a/engines/parallaction/callables.cpp b/engines/parallaction/callables.cpp index 537c8c851b..1ae2cf7357 100644 --- a/engines/parallaction/callables.cpp +++ b/engines/parallaction/callables.cpp @@ -353,7 +353,6 @@ void _c_ridux(void *parm) { void _c_testResult(void *parm) { _vm->_graphics->swapBuffers(); _vm->parseLocation("common"); - _vm->_archive.close(); _vm->_graphics->setFont("slide"); _vm->_graphics->_proportionalFont = false; diff --git a/engines/parallaction/dialogue.cpp b/engines/parallaction/dialogue.cpp index 6f506d947b..d0bd979b69 100644 --- a/engines/parallaction/dialogue.cpp +++ b/engines/parallaction/dialogue.cpp @@ -229,7 +229,7 @@ void runDialogue(SpeakData *data) { debugC(1, kDebugDialogue, "runDialogue: special trick for 'museum' location"); } - loadTalk(_vm->_characterName, &_characterFace); + _vm->_disk->loadTalk(_vm->_characterName, &_characterFace); _vm->_graphics->setFont("comic"); @@ -241,7 +241,7 @@ void runDialogue(SpeakData *data) { debugC(1, kDebugDialogue, "runDialogue: using default character head"); } else { debugC(1, kDebugDialogue, "runDialogue: loading 2nd character head '%s'", _vm->_characterName); - loadTalk(data->_name, &v6E); + _vm->_disk->loadTalk(data->_name, &v6E); debugC(1, kDebugDialogue, "runDialogue: 2nd character head loaded"); } @@ -509,11 +509,8 @@ void runDialogue(SpeakData *data) { debugC(1, kDebugDialogue, "runDialogue: exit dialogue ok"); if (!scumm_stricmp(_location, "museum")) { - - _vm->_archive.close(); - strcpy(_vm->_disk, "disk1"); - _vm->_archive.open(_vm->_disk); - loadFrames("dino", &_tempFrames); + _vm->_disk->selectArchive("disk1"); + _vm->_disk->loadFrames("dino", &_tempFrames); memcpy(&_yourself._cnv, &_tempFrames, sizeof(Cnv)); diff --git a/engines/parallaction/disk.cpp b/engines/parallaction/disk.cpp index 10d2d197b1..513afa2739 100644 --- a/engines/parallaction/disk.cpp +++ b/engines/parallaction/disk.cpp @@ -27,10 +27,19 @@ namespace Parallaction { +Disk::Disk(Parallaction* vm) : _vm(vm) { + +} + +Disk::~Disk() { + _archive.close(); +} + + // // decompress a graphics block // -uint16 decompressChunk(byte *src, byte *dst, uint16 size) { +uint16 Disk::decompressChunk(byte *src, byte *dst, uint16 size) { uint16 written = 0; uint16 read = 0; @@ -66,7 +75,7 @@ uint16 decompressChunk(byte *src, byte *dst, uint16 size) { // // loads a cnv from an external file // -void loadExternalCnv(const char *filename, Cnv *cnv) { +void Disk::loadExternalCnv(const char *filename, Cnv *cnv) { // printf("Graphics::loadExternalCnv(%s)...", filename); char path[PATH_LEN]; @@ -98,7 +107,7 @@ void loadExternalCnv(const char *filename, Cnv *cnv) { return; } -void loadExternalStaticCnv(const char *filename, StaticCnv *cnv) { +void Disk::loadExternalStaticCnv(const char *filename, StaticCnv *cnv) { char path[PATH_LEN]; @@ -125,30 +134,30 @@ void loadExternalStaticCnv(const char *filename, StaticCnv *cnv) { return; } -void loadCnv(const char *filename, Cnv *cnv) { +void Disk::loadCnv(const char *filename, Cnv *cnv) { // printf("Graphics::loadCnv(%s)\n", filename); char path[PATH_LEN]; strcpy(path, filename); - if (!_vm->_archive.openArchivedFile(path)) { + if (!_archive.openArchivedFile(path)) { sprintf(path, "%s.pp", filename); - if (!_vm->_archive.openArchivedFile(path)) + if (!_archive.openArchivedFile(path)) errorFileNotFound(path); } - cnv->_count = _vm->_archive.readByte(); - cnv->_width = _vm->_archive.readByte(); - cnv->_height = _vm->_archive.readByte(); + cnv->_count = _archive.readByte(); + cnv->_width = _archive.readByte(); + cnv->_height = _archive.readByte(); uint16 framesize = cnv->_width*cnv->_height; cnv->_array = (byte**)malloc(cnv->_count * sizeof(byte*)); - uint32 size = _vm->_archive.size() - 3; + uint32 size = _archive.size() - 3; byte *buf = (byte*)malloc(size); - _vm->_archive.read(buf, size); + _archive.read(buf, size); byte *s = buf; @@ -161,14 +170,14 @@ void loadCnv(const char *filename, Cnv *cnv) { s += read; } - _vm->_archive.closeArchivedFile(); + _archive.closeArchivedFile(); free(buf); return; } -void loadTalk(const char *name, Cnv *cnv) { +void Disk::loadTalk(const char *name, Cnv *cnv) { char* ext = strstr(name, ".talk"); if (ext != NULL) { @@ -196,7 +205,7 @@ void loadTalk(const char *name, Cnv *cnv) { } -void loadLocation(const char *name, char* script) { +void Disk::loadLocation(const char *name, char* script) { char archivefile[PATH_LEN]; @@ -211,44 +220,44 @@ void loadLocation(const char *name, char* script) { strcat(archivefile, name); strcat(archivefile, ".loc"); - _vm->_archive.close(); + _archive.close(); _vm->_languageDir[2] = '\0'; - _vm->_archive.open(_vm->_languageDir); + _archive.open(_vm->_languageDir); _vm->_languageDir[2] = '/'; - if (!_vm->_archive.openArchivedFile(archivefile)) { + if (!_archive.openArchivedFile(archivefile)) { sprintf(archivefile, "%s%s.loc", _vm->_languageDir, name); - if (!_vm->_archive.openArchivedFile(archivefile)) + if (!_archive.openArchivedFile(archivefile)) error("can't find location file '%s'", name); } - uint32 count = _vm->_archive.size(); - _vm->_archive.read(script, count); - _vm->_archive.closeArchivedFile(); - _vm->_archive.close(); + uint32 count = _archive.size(); + _archive.read(script, count); + _archive.closeArchivedFile(); + _archive.close(); } -void loadScript(const char* name, char *script) { +void Disk::loadScript(const char* name, char *script) { char vC8[PATH_LEN]; sprintf(vC8, "%s.script", name); - if (!_vm->_archive.openArchivedFile(vC8)) + if (!_archive.openArchivedFile(vC8)) errorFileNotFound(vC8); - uint32 size = _vm->_archive.size(); + uint32 size = _archive.size(); - _vm->_archive.read(script, size); + _archive.read(script, size); script[size] = '\0'; - _vm->_archive.closeArchivedFile(); + _archive.closeArchivedFile(); } -void loadHead(const char* name, StaticCnv* cnv) { +void Disk::loadHead(const char* name, StaticCnv* cnv) { char path[PATH_LEN]; @@ -264,11 +273,11 @@ void loadHead(const char* name, StaticCnv* cnv) { } -void loadPointer(StaticCnv* cnv) { +void Disk::loadPointer(StaticCnv* cnv) { loadExternalStaticCnv("pointer", cnv); } -void loadFont(const char* name, Cnv* cnv) { +void Disk::loadFont(const char* name, Cnv* cnv) { char path[PATH_LEN]; sprintf(path, "%scnv", name); @@ -277,7 +286,7 @@ void loadFont(const char* name, Cnv* cnv) { // loads character's icons set -void loadObjects(const char *name, Cnv* cnv) { +void Disk::loadObjects(const char *name, Cnv* cnv) { if (!scumm_strnicmp("mini", name, 4)) { name += 4; @@ -292,29 +301,29 @@ void loadObjects(const char *name, Cnv* cnv) { } -void loadStatic(const char* name, StaticCnv* cnv) { +void Disk::loadStatic(const char* name, StaticCnv* cnv) { char path[PATH_LEN]; strcpy(path, name); - if (!_vm->_archive.openArchivedFile(path)) { + if (!_archive.openArchivedFile(path)) { sprintf(path, "%s.pp", name); - if (!_vm->_archive.openArchivedFile(path)) + if (!_archive.openArchivedFile(path)) errorFileNotFound(path); } - _vm->_archive.skip(1); - cnv->_width = _vm->_archive.readByte(); - cnv->_height = _vm->_archive.readByte(); + _archive.skip(1); + cnv->_width = _archive.readByte(); + cnv->_height = _archive.readByte(); - uint16 compressedsize = _vm->_archive.size() - 3; + uint16 compressedsize = _archive.size() - 3; byte *compressed = (byte*)malloc(compressedsize); uint16 size = cnv->_width*cnv->_height; cnv->_data0 = (byte*)malloc(size); - _vm->_archive.read(compressed, compressedsize); - _vm->_archive.closeArchivedFile(); + _archive.read(compressed, compressedsize); + _archive.closeArchivedFile(); decompressChunk(compressed, cnv->_data0, size); free(compressed); @@ -322,7 +331,7 @@ void loadStatic(const char* name, StaticCnv* cnv) { return; } -void loadFrames(const char* name, Cnv* cnv) { +void Disk::loadFrames(const char* name, Cnv* cnv) { loadCnv(name, cnv); @@ -339,7 +348,7 @@ void loadFrames(const char* name, Cnv* cnv) { // -void unpackBackgroundScanline(byte *src, byte *screen, byte *mask, byte *path) { +void Disk::unpackBackgroundScanline(byte *src, byte *screen, byte *mask, byte *path) { // update mask, path and screen for (uint16 i = 0; i < SCREEN_WIDTH; i++) { @@ -351,20 +360,20 @@ void unpackBackgroundScanline(byte *src, byte *screen, byte *mask, byte *path) { return; } -void loadBackground(const char *filename) { +void Disk::loadBackground(const char *filename) { // printf("Graphics::loadBackground(%s)\n", filename); - if (!_vm->_archive.openArchivedFile(filename)) + if (!_archive.openArchivedFile(filename)) errorFileNotFound(filename); - _vm->_graphics->parseBackground(_vm->_archive); + _vm->_graphics->parseBackground(_archive); byte *bg = (byte*)calloc(1, SCREEN_WIDTH*SCREEN_HEIGHT); byte *mask = (byte*)calloc(1, SCREENMASK_WIDTH*SCREEN_HEIGHT); byte *path = (byte*)calloc(1, SCREENPATH_WIDTH*SCREEN_HEIGHT); byte *v4 = (byte*)malloc(SCREEN_SIZE); - _vm->_archive.read(v4, SCREEN_SIZE); + _archive.read(v4, SCREEN_SIZE); byte v144[SCREEN_WIDTH]; @@ -393,20 +402,20 @@ void loadBackground(const char *filename) { // mask and path are normally combined (via OR) into the background picture itself // read the comment on the top of this file for more // -void loadMaskAndPath(const char *name) { +void Disk::loadMaskAndPath(const char *name) { char path[PATH_LEN]; sprintf(path, "%s.msk", name); - if (!_vm->_archive.openArchivedFile(path)) + if (!_archive.openArchivedFile(path)) errorFileNotFound(name); byte *maskBuf = (byte*)calloc(1, SCREENMASK_WIDTH*SCREEN_HEIGHT); byte *pathBuf = (byte*)calloc(1, SCREENPATH_WIDTH*SCREEN_HEIGHT); - _vm->_graphics->parseDepths(_vm->_archive); + _vm->_graphics->parseDepths(_archive); - _vm->_archive.read(pathBuf, SCREENPATH_WIDTH*SCREEN_HEIGHT); - _vm->_archive.read(maskBuf, SCREENMASK_WIDTH*SCREEN_HEIGHT); + _archive.read(pathBuf, SCREENPATH_WIDTH*SCREEN_HEIGHT); + _archive.read(maskBuf, SCREENMASK_WIDTH*SCREEN_HEIGHT); _vm->_graphics->setMask(maskBuf); _vm->_graphics->setPath(pathBuf); @@ -414,13 +423,13 @@ void loadMaskAndPath(const char *name) { return; } -void loadSlide(const char *filename) { +void Disk::loadSlide(const char *filename) { char path[PATH_LEN]; sprintf(path, "%s.slide", filename); loadBackground(path); } -void loadScenery(const char *name, const char *mask) { +void Disk::loadScenery(const char *name, const char *mask) { char path[PATH_LEN]; sprintf(path, "%s.dyn", name); loadBackground(path); @@ -432,4 +441,9 @@ void loadScenery(const char *name, const char *mask) { } +void Disk::selectArchive(const char *name) { + _archive.close(); + _archive.open(name); +} + } // namespace Parallaction diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h index 7b00ccd87d..3ab56dfcc4 100644 --- a/engines/parallaction/disk.h +++ b/engines/parallaction/disk.h @@ -37,6 +37,9 @@ namespace Parallaction { #define DIRECTORY_OFFSET_IN_FILE 0x4000 +class Parallaction; +class Graphics; + class Archive : public Common::SeekableReadStream { protected: @@ -72,17 +75,41 @@ public: uint32 read(void *dataPtr, uint32 dataSize); }; -void loadLocation(const char *name, char* script); -void loadScript(const char* name, char *script); -void loadTalk(const char *name, Cnv *cnv); -void loadObjects(const char *name, Cnv *cnv); -void loadPointer(StaticCnv* cnv); -void loadHead(const char* name, StaticCnv* cnv); -void loadFont(const char* name, Cnv* cnv); -void loadStatic(const char* name, StaticCnv* cnv); -void loadFrames(const char* name, Cnv* cnv); -void loadSlide(const char *filename); -void loadScenery(const char* background, const char* mask); +class Disk { + +private: + uint16 decompressChunk(byte *src, byte *dst, uint16 size); + void unpackBackgroundScanline(byte *src, byte *screen, byte *mask, byte *path); + void loadExternalCnv(const char *filename, Cnv *cnv); + void loadCnv(const char *filename, Cnv *cnv); + void loadExternalStaticCnv(const char *filename, StaticCnv *cnv); + void loadBackground(const char *filename); + void loadMaskAndPath(const char *name); + +protected: + Archive _archive; + + Parallaction *_vm; + Graphics *_gfx; + +public: + Disk(Parallaction *vm); + virtual ~Disk(); + + void selectArchive(const char *name); + + void loadLocation(const char *name, char* script); + void loadScript(const char* name, char *script); + void loadTalk(const char *name, Cnv *cnv); + void loadObjects(const char *name, Cnv *cnv); + void loadPointer(StaticCnv* cnv); + void loadHead(const char* name, StaticCnv* cnv); + void loadFont(const char* name, Cnv* cnv); + void loadStatic(const char* name, StaticCnv* cnv); + void loadFrames(const char* name, Cnv* cnv); + void loadSlide(const char *filename); + void loadScenery(const char* background, const char* mask); +}; } // namespace Parallaction diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp index 901b4d2d8e..e71cd61738 100644 --- a/engines/parallaction/graphics.cpp +++ b/engines/parallaction/graphics.cpp @@ -509,7 +509,7 @@ void jobEraseLabel(void *parm, Job *j) { void Graphics::initMouse(uint16 arg_0) { - loadPointer(&_mouseComposedArrow); + _vm->_disk->loadPointer(&_mouseComposedArrow); byte temp[16*16]; memcpy(temp, _mouseArrow, 16*16); @@ -800,7 +800,7 @@ void Graphics::setFont(const char* name) { if (_font._array != NULL) freeCnv(&_font); - loadFont(name, &_font); + _vm->_disk->loadFont(name, &_font); } diff --git a/engines/parallaction/inventory.cpp b/engines/parallaction/inventory.cpp index 9aa6f2f283..f8dbcf04ab 100644 --- a/engines/parallaction/inventory.cpp +++ b/engines/parallaction/inventory.cpp @@ -372,7 +372,7 @@ void cleanInventory() { void refreshInventory(const char *character) { - loadObjects(character, &_characterInventory); + _vm->_disk->loadObjects(character, &_characterInventory); redrawInventory(); _vm->_graphics->freeCnv(&_characterInventory); @@ -381,7 +381,7 @@ void refreshInventory(const char *character) { void refreshInventoryItem(const char *character, uint16 index) { - loadObjects(character, &_characterInventory); + _vm->_disk->loadObjects(character, &_characterInventory); drawInventoryItem(index, &_inventory[index]); _vm->_graphics->freeCnv(&_characterInventory); diff --git a/engines/parallaction/location.cpp b/engines/parallaction/location.cpp index 32e5163dfa..f92638723e 100644 --- a/engines/parallaction/location.cpp +++ b/engines/parallaction/location.cpp @@ -48,7 +48,7 @@ void Parallaction::parseLocation(const char *filename) { _vm->_graphics->setFont("topaz"); location_src = (char*)malloc(0x4000); - loadLocation(filename, location_src); + _disk->loadLocation(filename, location_src); _locationScript = new Script(location_src); fillBuffers(*_locationScript, true); @@ -105,8 +105,7 @@ void Parallaction::parseLocation(const char *filename) { } } if (!scumm_stricmp(_tokens[0], "DISK")) { - strcpy(_disk, _tokens[1]); - _archive.open(_disk); + _disk->selectArchive(_tokens[1]); } if (!scumm_stricmp(_tokens[0], "LOCALFLAGS")) { _si = 1; // _localFlagNames[0] = 'visited' @@ -277,7 +276,7 @@ void switchBackground(const char* background, const char* mask) { _vm->_graphics->palUnk0(palette); } - loadScenery(background, mask); + _vm->_disk->loadScenery(background, mask); return; } @@ -355,19 +354,19 @@ void Parallaction::changeLocation(char *location) { *tmp = '\0'; if (!scumm_strnicmp(tmp+1, "slide", 5)) { - loadSlide(_newLocation); - _vm->_graphics->palUnk0(_palette); - _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); + _disk->loadSlide(_newLocation); + _graphics->palUnk0(_palette); + _graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); debugC(1, kDebugLocation, "changeLocation: new background set"); - _vm->_graphics->_proportionalFont = false; - _vm->_graphics->setFont("slide"); + _graphics->_proportionalFont = false; + _graphics->setFont("slide"); uint16 _ax = strlen(_slideText[0]); _ax <<= 3; // text width uint16 _dx = (SCREEN_WIDTH - _ax) >> 1; // center text - _vm->_graphics->displayString(_dx, 14, _slideText[0]); // displays text on screen + _graphics->displayString(_dx, 14, _slideText[0]); // displays text on screen waitUntilLeftClick(); @@ -397,7 +396,7 @@ void Parallaction::changeLocation(char *location) { strcpy(_saveData1, _newLocation); parseLocation(_newLocation); - _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBit2); + _graphics->copyScreen(Graphics::kBitBack, Graphics::kBit2); debugC(1, kDebugLocation, "changeLocation: new location '%s' parsed", _newLocation); _yourself._zone.pos._oldposition._x = -1000; @@ -416,14 +415,14 @@ void Parallaction::changeLocation(char *location) { byte palette[PALETTE_SIZE]; for (uint16 _si = 0; _si < PALETTE_SIZE; _si++) palette[_si] = 0; - _vm->_graphics->palUnk0(palette); - _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); + _graphics->palUnk0(palette); + _graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); if (_locationCommands) { runCommands(_locationCommands); runJobs(); - _vm->_graphics->swapBuffers(); + _graphics->swapBuffers(); runJobs(); - _vm->_graphics->swapBuffers(); + _graphics->swapBuffers(); } if (_locationComment) { @@ -432,9 +431,9 @@ void Parallaction::changeLocation(char *location) { } runJobs(); - _vm->_graphics->swapBuffers(); + _graphics->swapBuffers(); - _vm->_graphics->palUnk0(_palette); + _graphics->palUnk0(_palette); if (_locationACommands) { runCommands(_locationACommands); debugC(1, kDebugLocation, "changeLocation: location acommands run"); diff --git a/engines/parallaction/menu.cpp b/engines/parallaction/menu.cpp index 51d884bc99..e5322ae5dc 100644 --- a/engines/parallaction/menu.cpp +++ b/engines/parallaction/menu.cpp @@ -101,24 +101,24 @@ Menu::~Menu() { void Menu::start() { - _vm->_archive.open("disk1"); + _vm->_disk->selectArchive("disk1"); _vm->_graphics->_proportionalFont = false; _vm->_graphics->setFont("slide"); - loadSlide("intro"); + _vm->_disk->loadSlide("intro"); _vm->_graphics->palUnk0(_palette); _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); g_system->delayMillis(2000); - loadSlide("minintro"); + _vm->_disk->loadSlide("minintro"); _vm->_graphics->palUnk0(_palette); _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); g_system->delayMillis(2000); - loadSlide("lingua"); + _vm->_disk->loadSlide("lingua"); _vm->_graphics->palUnk0(_palette); _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); @@ -146,7 +146,7 @@ void Menu::start() { break; } - loadSlide("restore"); + _vm->_disk->loadSlide("restore"); _vm->_graphics->palUnk0(_palette); _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront); @@ -157,8 +157,6 @@ void Menu::start() { newGame(); } - _vm->_archive.close(); - return; } @@ -167,7 +165,7 @@ void Menu::newGame() { const char **v14 = introMsg3; - loadScenery("test", NULL); + _vm->_disk->loadScenery("test", NULL); _vm->_graphics->palUnk0(_palette); _vm->_graphics->swapBuffers(); @@ -196,8 +194,6 @@ void Menu::newGame() { if (_mouseButtons != kMouseRightUp) return; // show intro - _vm->_archive.close(); - selectCharacter(); char *v4 = strchr(_location, '.') + 1; @@ -284,7 +280,6 @@ uint16 Menu::selectGame() { strcpy(_engine->_characterName, "dough"); _vm->loadGame(); - _vm->_archive.close(); return 1; // load game } @@ -315,9 +310,9 @@ void Menu::selectCharacter() { _vm->_graphics->_proportionalFont = false; _vm->_graphics->setFont("slide"); - _vm->_archive.open("disk1"); + _vm->_disk->selectArchive("disk1"); - loadSlide("password"); + _vm->_disk->loadSlide("password"); _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBit2); _vm->_graphics->palUnk0(_palette); @@ -411,7 +406,6 @@ void Menu::selectCharacter() { _vm->_graphics->setPalette(palette); _engineFlags |= kEngineChangeLocation; - _vm->_archive.close(); free(v14._data0); diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index b7048f15e7..cb31ad63f4 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -162,6 +162,7 @@ Parallaction::Parallaction(OSystem *syst) : // FIXME _vm = this; + _disk = new Disk(this); _skipMenu = false; @@ -203,6 +204,7 @@ Parallaction::Parallaction(OSystem *syst) : Parallaction::~Parallaction() { delete _midiPlayer; + delete _disk; } @@ -850,18 +852,15 @@ void Parallaction::changeCharacter(const char *name) { freeCharacterFrames(); } - _archive.close(); - - strcpy(_disk, "disk1"); - _archive.open("disk1"); + _disk->selectArchive("disk1"); char path[PATH_LEN]; strcpy(path, v32); - loadFrames(path, &_tempFrames); + _disk->loadFrames(path, &_tempFrames); if (name[0] != 'D') { sprintf(path, "mini%s", v32); - loadFrames(path, &_miniCharacterFrames); + _disk->loadFrames(path, &_miniCharacterFrames); sprintf(path, "%s.tab", name); initTable(path, _objectsNames); diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index 840a252053..cf36a436f1 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -264,7 +264,7 @@ public: Menu* _menu; char _characterName[30]; char _languageDir[6]; - char _disk[6]; + Disk* _disk; char _locationNames[120][32]; int16 _currentLocationIndex; @@ -274,8 +274,6 @@ public: Script *_locationScript; - Archive _archive; - protected: // data struct InputData { diff --git a/engines/parallaction/saveload.cpp b/engines/parallaction/saveload.cpp index 66694723f0..8dec664e30 100644 --- a/engines/parallaction/saveload.cpp +++ b/engines/parallaction/saveload.cpp @@ -134,7 +134,6 @@ void Parallaction::doLoadGame(uint16 slot) { refreshInventory(_vm->_characterName); parseLocation("common"); - _archive.close(); strcat(_location, _vm->_characterName); _engineFlags |= kEngineChangeLocation; diff --git a/engines/parallaction/zone.cpp b/engines/parallaction/zone.cpp index 50c59e22b5..82669c3ca4 100644 --- a/engines/parallaction/zone.cpp +++ b/engines/parallaction/zone.cpp @@ -279,7 +279,7 @@ void Parallaction::parseZoneTypeBlock(Script &script, Zone *z) { strcpy(vC8, _tokens[1]); StaticCnv vE0; - loadFrames(vC8, doorcnv); + _disk->loadFrames(vC8, doorcnv); // printf("door width: %i, height: %i", doorcnv->_width, doorcnv->_height ); @@ -293,9 +293,9 @@ void Parallaction::parseZoneTypeBlock(Script &script, Zone *z) { // vE0._data1 = doorcnv->field_8[_ax]; vE0._data2 = u->door->_background = (byte*)malloc(vE0._width*vE0._height); - _vm->_graphics->backupCnvBackground(&vE0, z->_limits._left, z->_limits._top); + _graphics->backupCnvBackground(&vE0, z->_limits._left, z->_limits._top); - _vm->_graphics->flatBlitCnv(&vE0, z->_limits._left, z->_limits._top, Graphics::kBitBack, vE0._data1); + _graphics->flatBlitCnv(&vE0, z->_limits._left, z->_limits._top, Graphics::kBitBack, vE0._data1); } if (!scumm_stricmp(_tokens[0], "startpos")) { @@ -309,12 +309,12 @@ void Parallaction::parseZoneTypeBlock(Script &script, Zone *z) { if (!scumm_stricmp(_tokens[0], "file")) { StaticCnv *vE4 = &u->get->_cnv; strcpy(vC8, _tokens[1]); - loadStatic(vC8, vE4); + _disk->loadStatic(vC8, vE4); vE4->_data2 = (byte*)malloc(vE4->_width*vE4->_height); if ((z->_flags & kFlagsRemove) == 0) { - _vm->_graphics->backupCnvBackgroundTransparent(vE4, z->_limits._left, z->_limits._top); - _vm->_graphics->flatBlitCnv(vE4, z->_limits._left, z->_limits._top, Graphics::kBitBack, vE4->_data1); + _graphics->backupCnvBackgroundTransparent(vE4, z->_limits._left, z->_limits._top); + _graphics->flatBlitCnv(vE4, z->_limits._left, z->_limits._top, Graphics::kBitBack, vE4->_data1); } } @@ -365,7 +365,7 @@ void Parallaction::parseZoneTypeBlock(Script &script, Zone *z) { void displayCharacterComment(ExamineData *data) { if (data->_description == NULL) return; - loadTalk(_vm->_characterName, &_characterFace); + _vm->_disk->loadTalk(_vm->_characterName, &_characterFace); StaticCnv v3C; v3C._width = _characterFace._width; @@ -412,12 +412,12 @@ void displayItemComment(ExamineData *data) { char v68[PATH_LEN]; strcpy(v68, data->_filename); - loadStatic(v68, &data->_cnv); + _vm->_disk->loadStatic(v68, &data->_cnv); _vm->_graphics->flatBlitCnv(&data->_cnv, 140, (SCREEN_HEIGHT - data->_cnv._height)/2, Graphics::kBitFront, data->_cnv._data1); _vm->_graphics->freeStaticCnv(&data->_cnv); StaticCnv cnv; - loadHead(_vm->_characterName, &cnv); + _vm->_disk->loadHead(_vm->_characterName, &cnv); int16 v6A = 0, v6C = 0; |