[Scummvm-cvs-logs] SF.net SVN: scummvm: [23950] scummvm/branches/branch-0-9-0
lordhoto at users.sourceforge.net
lordhoto at users.sourceforge.net
Wed Sep 20 22:19:16 CEST 2006
Revision: 23950
http://svn.sourceforge.net/scummvm/?rev=23950&view=rev
Author: lordhoto
Date: 2006-09-20 13:19:07 -0700 (Wed, 20 Sep 2006)
Log Message:
-----------
- backports resource handling fix for Kyrandia
- mentions it in the NEWS file
Modified Paths:
--------------
scummvm/branches/branch-0-9-0/NEWS
scummvm/branches/branch-0-9-0/engines/kyra/kyra.h
scummvm/branches/branch-0-9-0/engines/kyra/resource.cpp
scummvm/branches/branch-0-9-0/engines/kyra/resource.h
scummvm/branches/branch-0-9-0/engines/kyra/scene.cpp
Modified: scummvm/branches/branch-0-9-0/NEWS
===================================================================
--- scummvm/branches/branch-0-9-0/NEWS 2006-09-20 17:16:58 UTC (rev 23949)
+++ scummvm/branches/branch-0-9-0/NEWS 2006-09-20 20:19:07 UTC (rev 23950)
@@ -33,6 +33,7 @@
not being as smooth as before.
- Fixed a tiny graphics glitch in the Kyrandia intro.
- Improved screen update handling, speeds up drawing on small devices.
+ - Improved resource loading, faster startup.
PSP Port:
- Fixed crashes during scrolling scenes in certain SCUMM games.
Modified: scummvm/branches/branch-0-9-0/engines/kyra/kyra.h
===================================================================
--- scummvm/branches/branch-0-9-0/engines/kyra/kyra.h 2006-09-20 17:16:58 UTC (rev 23949)
+++ scummvm/branches/branch-0-9-0/engines/kyra/kyra.h 2006-09-20 20:19:07 UTC (rev 23950)
@@ -508,6 +508,8 @@
int setGameFlag(int flag);
int queryGameFlag(int flag);
int resetGameFlag(int flag);
+
+ void setupSceneResource(int sceneId);
void enterNewScene(int sceneId, int facing, int unk1, int unk2, int brandonAlive);
void transcendScenes(int roomIndex, int roomName);
Modified: scummvm/branches/branch-0-9-0/engines/kyra/resource.cpp
===================================================================
--- scummvm/branches/branch-0-9-0/engines/kyra/resource.cpp 2006-09-20 17:16:58 UTC (rev 23949)
+++ scummvm/branches/branch-0-9-0/engines/kyra/resource.cpp 2006-09-20 20:19:07 UTC (rev 23950)
@@ -66,32 +66,11 @@
};*/
static const char *kyra1CDFilelist[] = {
- "ALTAR.APK", "BELROOM.APK", "BONKBG.APK", "BROKEN.APK", "CASTLE.APK", "CAVE.APK", "CGATE.APK",
- "DEAD.APK", "DNSTAIR.APK", "DRAGON1.APK", "DRAGON2.APK", "EXTPOT.APK", "FORESTA.APK", "FORESTB.APK",
- "FOUNTN.APK", "FOYER.APK", "GATECV.APK", "GEM.APK", "GEMCUT.APK", "GENHALL.APK", "GLADE.APK",
- "GRAVE.APK", "HEALER.APK", "LAGOON.APK", "LANDING.APK", "LAVA.APK", "LEPHOLE.APK", "LIBRARY.APK",
- "MIX.APK", "MOONCAV.APK", "POTION.APK", "SONG.APK", "SORROW.APK", "SPELL.APK", "STUMP.APK",
- "TEMPLE.APK", "TRUNK.APK", "WILLOW.APK", "XEDGE.APK",
-
- "ADL.PAK", "BRINS.PAK", "CLIFF.PAK", "ENTER.PAK", "FORESTA.PAK", "GEM.PAK", "INTRO1.PAK",
- "LEPHOLE.PAK", "OAKS.PAK", "SPELL.PAK", "WILLOW.PAK", "ALCHEMY.PAK", "BROKEN.PAK", "COL.PAK",
- "EXTHEAL.PAK", "FORESTB.PAK", "GEMCUT.PAK", "INTRO2.PAK", "LIBRARY.PAK", "PLATEAU.PAK", "SPRING.PAK",
- "WISE.PAK", "ALGAE.PAK", "BURN.PAK", "DARMS.PAK", "EXTPOT.PAK", "FORESTC.PAK", "GENCAVB.PAK",
- "INTRO3.PAK", "MISC.PAK", "PLTCAVE.PAK", "SQUARE.PAK", "XEDGE.PAK", "ALTAR.PAK", "CASTLE.PAK",
- "DEAD.PAK", "EXTSPEL.PAK", "FOUNTN.PAK", "GENHALL.PAK", "INTRO4.PAK", "MIX.PAK", "POTION.PAK",
- "STARTUP.PAK", "XEDGEB.PAK", "ARCH.PAK", "CATACOM.PAK", "DNSTAIR.PAK", "FALLS.PAK", "FOYER.PAK",
- "GEN_CAV.PAK", "KITCHEN.PAK", "MOONCAV.PAK", "RUBY.PAK", "STUMP.PAK", "XEDGEC.PAK", "BALCONY.PAK",
- "CAVE.PAK", "DRAGON.PAK", "FESTSTH.PAK", "FSOUTH.PAK", "GLADE.PAK", "KYRAGEM.PAK", "NCLIFF.PAK",
- "SICKWIL.PAK", "TEMPLE.PAK", "XMI.PAK", "BELROOM.PAK", "CAVEB.PAK", "EDGE.PAK", "FGOWEST.PAK",
- "FSOUTHB.PAK", "GRAVE.PAK", "LAGOON.PAK", "NCLIFFB.PAK", "SND.PAK", "TRUNK.PAK", "ZROCK.PAK",
- "BONKBG.PAK", "CGATE.PAK", "EDGEB.PAK", "FINALE.PAK", "FWSTSTH.PAK", "GRTHALL.PAK", "LANDING.PAK",
- "NWCLIFB.PAK", "SONG.PAK", "UPSTAIR.PAK", "BRIDGE.PAK", "CHASM.PAK", "EMCAV.PAK", "FNORTH.PAK",
- "GATECV.PAK", "HEALER.PAK", "LAVA.PAK", "NWCLIFF.PAK", "SORROW.PAK", "WELL.PAK",
-
- "CHAPTER1.VRM", 0
+ "adl.pak", "col.pak", "finale.pak", "intro1.pak", "intro2.pak", "intro3.pak", "intro4.pak",
+ "misc.pak", "snd.pak", "startup.pak", "xmi.pak", "chapter1.vrm", 0
};
- static const char *kyra2CDFilelist[] = {
+ /*static const char *kyra2CDFilelist[] = {
"ALLEY.PAK", "COST3_SH.PAK", "DINOD.PAK", "GARDEN.PAK", "INJAIL2.PAK", "MISC_EMC.PAK", "PHONE_B.PAK",
"STATION.PAK", "VOLCANO.PAK", "VOLC_L.PAK", "ALTAR.PAK", "COST4_SH.PAK", "DOCK.PAK", "GEARS.PAK",
"INSHOP.PAK", "MYSTRM.PAK", "PHONE_C.PAK", "STREET.PAK", "VOLC_A.PAK", "VOLC_M.PAK", "ANCHOR.PAK",
@@ -114,7 +93,7 @@
static const char *kyra3Filelist[] = {
// enough for now
"MISC_EMC.PAK", "MISC_CPS.PAK", "OTHER.PAK", "ONETIME.PAK", 0
- };
+ };*/
const char **usedFilelist = 0;
@@ -125,12 +104,12 @@
usedFilelist = kyra1Filelist;
else if (_engine->features() & GF_TALKIE)
usedFilelist = kyra1CDFilelist;
- } else if (_engine->game() == GI_KYRA2) {
+ } /*else if (_engine->game() == GI_KYRA2) {
// TODO: add kyra2 floppy file list
usedFilelist = kyra2CDFilelist;
} else if (_engine->game() == GI_KYRA3) {
usedFilelist = kyra3Filelist;
- }
+ }*/
// we're loading KYRA.DAT here too (but just for Kyrandia 1)
if (_engine->game() == GI_KYRA1) {
@@ -173,8 +152,14 @@
}
bool Resource::loadPakFile(const Common::String &filename) {
- if (isInPakList(filename))
- return true;
+ Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
+ for (;start != _pakfiles.end(); ++start) {
+ if (scumm_stricmp(start->_filename.c_str(), filename.c_str()) == 0) {
+ start->_file->open();
+ return true;
+ }
+ }
+
PAKFile *file = new PAKFile(filename.c_str());
if (!file)
return false;
@@ -191,8 +176,7 @@
Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
for (;start != _pakfiles.end(); ++start) {
if (scumm_stricmp(start->_filename.c_str(), filename.c_str()) == 0) {
- delete start->_file;
- _pakfiles.erase(start);
+ start->_file->close();
break;
}
}
@@ -203,7 +187,7 @@
Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
for (;start != _pakfiles.end(); ++start) {
if (scumm_stricmp(start->_filename.c_str(), filename.c_str()) == 0)
- return true;
+ return start->_file->isOpen();
}
return false;
}
@@ -227,6 +211,9 @@
Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
for (;start != _pakfiles.end(); ++start) {
+ if (!start->_file->isOpen())
+ continue;
+
*size = start->_file->getFileSize(file);
if (!(*size))
@@ -253,6 +240,9 @@
Common::List<PakFileEntry>::iterator start = _pakfiles.begin();
for (;start != _pakfiles.end(); ++start) {
+ if (!start->_file->isOpen())
+ continue;
+
*size = start->_file->getFileSize(file);
if (!(*size))
@@ -273,7 +263,6 @@
_isAmiga = isAmiga;
Common::File pakfile;
- uint8 *buffer = 0;
_open = false;
if (!pakfile.open(file)) {
@@ -282,37 +271,40 @@
}
uint32 filesize = pakfile.size();
- buffer = new uint8[filesize];
- assert(buffer);
- pakfile.read(buffer, filesize);
- pakfile.close();
-
// works with the file
uint32 pos = 0, startoffset = 0, endoffset = 0;
if (!_isAmiga) {
- startoffset = READ_LE_UINT32(buffer + pos);
+ startoffset = pakfile.readUint32LE();
} else {
- startoffset = READ_BE_UINT32(buffer + pos);
+ startoffset = pakfile.readUint32BE();
}
pos += 4;
while (pos < filesize) {
PakChunk chunk;
+ uint8 buffer[256];
+ uint32 nameLength;
- // saves the name
- chunk._name = (const char*)buffer + pos;
- pos += strlen(chunk._name.c_str()) + 1;
- if (!(chunk._name[0]))
+ // Move to the position of the next file entry
+ pakfile.seek(pos);
+
+ // Read in the header
+ pakfile.read(&buffer, sizeof(buffer));
+
+ // Quit now if we encounter an empty string
+ if (!(*((const char*)buffer)))
break;
+ chunk._name = (const char*)buffer;
+ nameLength = strlen(chunk._name.c_str()) + 1;
+
if (!_isAmiga) {
- endoffset = READ_LE_UINT32(buffer + pos);
+ endoffset = READ_LE_UINT32(buffer + nameLength);
} else {
- endoffset = READ_BE_UINT32(buffer + pos);
+ endoffset = READ_BE_UINT32(buffer + nameLength);
}
- pos += 4;
if (endoffset == 0) {
endoffset = filesize;
@@ -327,9 +319,9 @@
break;
startoffset = endoffset;
+ pos += nameLength + 4;
}
_open = true;
- delete [] buffer;
_filename = file;
}
Modified: scummvm/branches/branch-0-9-0/engines/kyra/resource.h
===================================================================
--- scummvm/branches/branch-0-9-0/engines/kyra/resource.h 2006-09-20 17:16:58 UTC (rev 23949)
+++ scummvm/branches/branch-0-9-0/engines/kyra/resource.h 2006-09-20 20:19:07 UTC (rev 23950)
@@ -52,6 +52,8 @@
bool isValid(void) const { return !(_filename.empty()); }
bool isOpen(void) const { return _open; }
+ void open() { _open = true; }
+ void close() { _open = false; }
private:
bool _open;
bool _isAmiga;
Modified: scummvm/branches/branch-0-9-0/engines/kyra/scene.cpp
===================================================================
--- scummvm/branches/branch-0-9-0/engines/kyra/scene.cpp 2006-09-20 17:16:58 UTC (rev 23949)
+++ scummvm/branches/branch-0-9-0/engines/kyra/scene.cpp 2006-09-20 20:19:07 UTC (rev 23950)
@@ -143,16 +143,8 @@
Room *currentRoom = &_roomTable[sceneId];
- if (_currentRoom != 0xFFFF && (_features & GF_TALKIE)) {
- char file[32];
- assert(_currentRoom < _roomTableSize);
- int tableId = _roomTable[_currentRoom].nameIndex;
- assert(tableId < _roomFilenameTableSize);
- strcpy(file, _roomFilenameTable[tableId]);
- strcat(file, ".VRM");
- _res->unloadPakFile(file);
- }
-
+ setupSceneResource(sceneId);
+
_currentRoom = sceneId;
int tableId = _roomTable[_currentCharacter->sceneId].nameIndex;
@@ -164,12 +156,6 @@
_scriptInterpreter->unloadScript(_scriptClickData);
loadSceneMSC();
- if ((_features & GF_TALKIE)) {
- strcpy(fileNameBuffer, _roomFilenameTable[tableId]);
- strcat(fileNameBuffer, ".VRM");
- _res->loadPakFile(fileNameBuffer);
- }
-
_walkBlockNorth = currentRoom->northExit;
_walkBlockEast = currentRoom->eastExit;
_walkBlockSouth = currentRoom->southExit;
@@ -1569,4 +1555,47 @@
return retValue;
}
+void KyraEngine::setupSceneResource(int sceneId) {
+ debugC(9, kDebugLevelMain, "KyraEngine::setupSceneResource(%d)", sceneId);
+ if (_features & GF_FLOPPY)
+ return;
+
+ if (_currentRoom != 0xFFFF) {
+ assert(_currentRoom < _roomTableSize);
+ int tableId = _roomTable[_currentRoom].nameIndex;
+ assert(tableId < _roomFilenameTableSize);
+
+ // unload our old room
+ char file[64];
+ strcpy(file, _roomFilenameTable[tableId]);
+ strcat(file, ".VRM");
+ _res->unloadPakFile(file);
+ strcpy(file, _roomFilenameTable[tableId]);
+ strcat(file, ".PAK");
+ _res->unloadPakFile(file);
+ strcpy(file, _roomFilenameTable[tableId]);
+ strcat(file, ".APK");
+ _res->unloadPakFile(file);
+ }
+
+ assert(sceneId < _roomTableSize);
+ int tableId = _roomTable[sceneId].nameIndex;
+ assert(tableId < _roomFilenameTableSize);
+
+ // load our new room
+ char file[64];
+ strcpy(file, _roomFilenameTable[tableId]);
+ strcat(file, ".VRM");
+ if (Common::File::exists(file))
+ _res->loadPakFile(file);
+ strcpy(file, _roomFilenameTable[tableId]);
+ strcat(file, ".PAK");
+ if (Common::File::exists(file))
+ _res->loadPakFile(file);
+ strcpy(file, _roomFilenameTable[tableId]);
+ strcat(file, ".APK");
+ if (Common::File::exists(file))
+ _res->loadPakFile(file);
+}
+
} // end of namespace Kyra
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list