LOL: add support for floppy installer files
(startup will fail nonethelesse since we have different pak file names) svn-id: r33777
This commit is contained in:
parent
9d0b0523cf
commit
3fdc699411
3 changed files with 80 additions and 19 deletions
|
@ -67,11 +67,14 @@ namespace {
|
||||||
#define KYRA3_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, true, false, Kyra::GI_KYRA3)
|
#define KYRA3_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, true, false, Kyra::GI_KYRA3)
|
||||||
|
|
||||||
#define LOL_CD_FLAGS FLAGS(false, false, true, false, false, false, Kyra::GI_LOL)
|
#define LOL_CD_FLAGS FLAGS(false, false, true, false, false, false, Kyra::GI_LOL)
|
||||||
|
#define LOL_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, Kyra::GI_LOL)
|
||||||
|
#define LOL_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, true, Kyra::GI_LOL)
|
||||||
#define LOL_PC98_FLAGS FLAGS(false, false, false, false, false, false, Kyra::GI_LOL)
|
#define LOL_PC98_FLAGS FLAGS(false, false, false, false, false, false, Kyra::GI_LOL)
|
||||||
#define LOL_PC98_SJIS_FLAGS FLAGS(false, false, false, true, false, false, Kyra::GI_LOL)
|
#define LOL_PC98_SJIS_FLAGS FLAGS(false, false, false, true, false, false, Kyra::GI_LOL)
|
||||||
#define LOL_DEMO_FLAGS FLAGS(true, false, false, false, false, false, Kyra::GI_KYRA2)
|
#define LOL_DEMO_FLAGS FLAGS(true, false, false, false, false, false, Kyra::GI_KYRA2)
|
||||||
|
|
||||||
const KYRAGameDescription adGameDescs[] = {
|
const KYRAGameDescription adGameDescs[] = {
|
||||||
|
/* disable these targets until they get supported
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
"kyra1",
|
"kyra1",
|
||||||
|
@ -83,6 +86,7 @@ const KYRAGameDescription adGameDescs[] = {
|
||||||
},
|
},
|
||||||
KYRA1_FLOPPY_CMP_FLAGS
|
KYRA1_FLOPPY_CMP_FLAGS
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
"kyra1",
|
"kyra1",
|
||||||
|
@ -94,6 +98,8 @@ const KYRAGameDescription adGameDescs[] = {
|
||||||
},
|
},
|
||||||
KYRA1_FLOPPY_CMP_FLAGS
|
KYRA1_FLOPPY_CMP_FLAGS
|
||||||
},
|
},
|
||||||
|
*/
|
||||||
|
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
"kyra1",
|
"kyra1",
|
||||||
|
@ -696,7 +702,7 @@ const KYRAGameDescription adGameDescs[] = {
|
||||||
KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY)
|
KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY)
|
||||||
},
|
},
|
||||||
|
|
||||||
// Itlian fan translation, see fr#2003504 "KYRA: add support for Italian version of Kyrandia 2&3"
|
// Italian fan translation, see fr#2003504 "KYRA: add support for Italian version of Kyrandia 2&3"
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
"kyra3",
|
"kyra3",
|
||||||
|
@ -840,7 +846,23 @@ const KYRAGameDescription adGameDescs[] = {
|
||||||
LOL_CD_FLAGS
|
LOL_CD_FLAGS
|
||||||
},
|
},
|
||||||
|
|
||||||
/*{
|
{
|
||||||
|
{
|
||||||
|
"lol",
|
||||||
|
0,
|
||||||
|
{
|
||||||
|
{ "WESTWOOD.1", 0, "3c61cb7de5b2ec452f5851f5075207ee", -1 },
|
||||||
|
{ 0, 0, 0, 0 }
|
||||||
|
},
|
||||||
|
Common::DE_DEU,
|
||||||
|
Common::kPlatformPC,
|
||||||
|
Common::ADGF_NO_FLAGS
|
||||||
|
},
|
||||||
|
LOL_FLOPPY_CMP_FLAGS
|
||||||
|
},
|
||||||
|
|
||||||
|
/* disable these targets until they get supported
|
||||||
|
{
|
||||||
{
|
{
|
||||||
"lol",
|
"lol",
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -259,10 +259,13 @@ void LoLEngine::setupPrologueData(bool load) {
|
||||||
"xxx/intro9.pak"
|
"xxx/intro9.pak"
|
||||||
};
|
};
|
||||||
|
|
||||||
char filename[32];
|
char filepath[32];
|
||||||
|
char *filename = filepath;
|
||||||
for (uint i = 0; i < ARRAYSIZE(fileList); ++i) {
|
for (uint i = 0; i < ARRAYSIZE(fileList); ++i) {
|
||||||
strcpy(filename, fileList[i]);
|
strcpy(filename, fileList[i]);
|
||||||
memcpy(filename, _languageExt[_lang], 3);
|
memcpy(filename, _languageExt[_lang], 3);
|
||||||
|
if (!_flags.isTalkie)
|
||||||
|
filename += 4;
|
||||||
|
|
||||||
if (load) {
|
if (load) {
|
||||||
if (!_res->loadPakFile(filename))
|
if (!_res->loadPakFile(filename))
|
||||||
|
|
|
@ -103,6 +103,9 @@ bool Resource::reset() {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else if (_vm->game() == GI_LOL) {
|
} else if (_vm->game() == GI_LOL) {
|
||||||
|
if (_vm->gameFlags().useInstallerPackage)
|
||||||
|
tryLoadCompFiles();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1257,10 +1260,17 @@ uint8 FileExpander::calcCmdAndIndex(const uint8 *tbl, int16 ¶) {
|
||||||
|
|
||||||
class CompLoaderInsHof : public CompArchiveLoader {
|
class CompLoaderInsHof : public CompArchiveLoader {
|
||||||
public:
|
public:
|
||||||
bool checkForFiles() const;
|
CompLoaderInsHof() {
|
||||||
bool loadFile(CompFileMap &loadTo) const;
|
_fileExtP = "%03d";
|
||||||
|
_checkFile1 = "WESTWOOD.001";
|
||||||
|
_checkFile2 = "WESTWOOD.002";
|
||||||
|
_containerOffset = 6;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
virtual bool checkForFiles() const;
|
||||||
|
virtual bool loadFile(CompFileMap &loadTo) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
struct Archive {
|
struct Archive {
|
||||||
Common::String filename;
|
Common::String filename;
|
||||||
uint32 firstFile;
|
uint32 firstFile;
|
||||||
|
@ -1269,10 +1279,25 @@ private:
|
||||||
uint32 endOffset;
|
uint32 endOffset;
|
||||||
uint32 totalSize;
|
uint32 totalSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const char *_fileExtP;
|
||||||
|
const char *_checkFile1;
|
||||||
|
const char *_checkFile2;
|
||||||
|
uint8 _containerOffset;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CompLoaderInsLol : public CompLoaderInsHof {
|
||||||
|
public:
|
||||||
|
CompLoaderInsLol() {
|
||||||
|
_fileExtP = "%d";
|
||||||
|
_checkFile1 = "WESTWOOD.1";
|
||||||
|
_checkFile2 = "WESTWOOD.2";
|
||||||
|
_containerOffset = 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
bool CompLoaderInsHof::checkForFiles() const {
|
bool CompLoaderInsHof::checkForFiles() const {
|
||||||
return (Common::File::exists("WESTWOOD.001") && Common::File::exists("WESTWOOD.002"));
|
return (Common::File::exists(_checkFile1) && Common::File::exists(_checkFile2));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
|
@ -1294,7 +1319,7 @@ bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
Common::List<Archive> archives;
|
Common::List<Archive> archives;
|
||||||
|
|
||||||
for (int8 currentFile = 1; currentFile; currentFile++) {
|
for (int8 currentFile = 1; currentFile; currentFile++) {
|
||||||
sprintf(filenameExt, "%03d", currentFile);
|
sprintf(filenameExt, _fileExtP, currentFile);
|
||||||
filenameTemp = filenameBase + Common::String(filenameExt);
|
filenameTemp = filenameBase + Common::String(filenameExt);
|
||||||
|
|
||||||
if (!tmpFile.open(filenameTemp)) {
|
if (!tmpFile.open(filenameTemp)) {
|
||||||
|
@ -1310,9 +1335,9 @@ bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
if (startFile) {
|
if (startFile) {
|
||||||
size -= 4;
|
size -= 4;
|
||||||
if (fileId == currentFile) {
|
if (fileId == currentFile) {
|
||||||
size -= 6;
|
size -= _containerOffset;
|
||||||
pos += 6;
|
pos += _containerOffset;
|
||||||
tmpFile.seek(6, SEEK_CUR);
|
tmpFile.seek(_containerOffset, SEEK_CUR);
|
||||||
} else {
|
} else {
|
||||||
size = size + 1 - pos;
|
size = size + 1 - pos;
|
||||||
}
|
}
|
||||||
|
@ -1356,6 +1381,7 @@ bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
uint8 *outbuffer = 0;
|
uint8 *outbuffer = 0;
|
||||||
uint32 inPart1 = 0;
|
uint32 inPart1 = 0;
|
||||||
uint32 inPart2 = 0;
|
uint32 inPart2 = 0;
|
||||||
|
uint8 compressionType = 0;
|
||||||
Common::String entryStr;
|
Common::String entryStr;
|
||||||
|
|
||||||
pos = 0;
|
pos = 0;
|
||||||
|
@ -1367,7 +1393,7 @@ bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
for (Common::List<Archive>::iterator a = archives.begin(); a != archives.end(); ++a) {
|
for (Common::List<Archive>::iterator a = archives.begin(); a != archives.end(); ++a) {
|
||||||
startFile = true;
|
startFile = true;
|
||||||
for (uint32 i = a->firstFile; i != (a->lastFile + 1); i++) {
|
for (uint32 i = a->firstFile; i != (a->lastFile + 1); i++) {
|
||||||
sprintf(filenameExt, "%03d", i);
|
sprintf(filenameExt, _fileExtP, i);
|
||||||
filenameTemp = a->filename + Common::String(filenameExt);
|
filenameTemp = a->filename + Common::String(filenameExt);
|
||||||
|
|
||||||
if (!tmpFile.open(filenameTemp)) {
|
if (!tmpFile.open(filenameTemp)) {
|
||||||
|
@ -1390,7 +1416,12 @@ bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
tmpFile.seek(1);
|
tmpFile.seek(1);
|
||||||
tmpFile.read(inbuffer + inPart1, inPart2);
|
tmpFile.read(inbuffer + inPart1, inPart2);
|
||||||
inPart2 = 0;
|
inPart2 = 0;
|
||||||
|
|
||||||
|
if (compressionType > 0)
|
||||||
exp.process(outbuffer, inbuffer, outsize, insize);
|
exp.process(outbuffer, inbuffer, outsize, insize);
|
||||||
|
else
|
||||||
|
memcpy(outbuffer, inbuffer, outsize);
|
||||||
|
|
||||||
delete[] inbuffer;
|
delete[] inbuffer;
|
||||||
inbuffer = 0;
|
inbuffer = 0;
|
||||||
newEntry.data = outbuffer;
|
newEntry.data = outbuffer;
|
||||||
|
@ -1419,7 +1450,7 @@ bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(filenameExt, "%03d", i + 1);
|
sprintf(filenameExt, _fileExtP, i + 1);
|
||||||
filenameTemp = a->filename + Common::String(filenameExt);
|
filenameTemp = a->filename + Common::String(filenameExt);
|
||||||
|
|
||||||
Common::File tmpFile2;
|
Common::File tmpFile2;
|
||||||
|
@ -1435,8 +1466,7 @@ bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
uint32 id = READ_LE_UINT32(hdr);
|
uint32 id = READ_LE_UINT32(hdr);
|
||||||
|
|
||||||
if (id == 0x04034B50) {
|
if (id == 0x04034B50) {
|
||||||
if (hdr[8] != 8)
|
compressionType = hdr[8];
|
||||||
error("compression type not implemented");
|
|
||||||
insize = READ_LE_UINT32(hdr + 18);
|
insize = READ_LE_UINT32(hdr + 18);
|
||||||
outsize = READ_LE_UINT32(hdr + 22);
|
outsize = READ_LE_UINT32(hdr + 22);
|
||||||
|
|
||||||
|
@ -1464,7 +1494,12 @@ bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const {
|
||||||
} else {
|
} else {
|
||||||
tmpFile.read(inbuffer, insize);
|
tmpFile.read(inbuffer, insize);
|
||||||
inPart2 = 0;
|
inPart2 = 0;
|
||||||
|
|
||||||
|
if (compressionType > 0)
|
||||||
exp.process(outbuffer, inbuffer, outsize, insize);
|
exp.process(outbuffer, inbuffer, outsize, insize);
|
||||||
|
else
|
||||||
|
memcpy(outbuffer, inbuffer, outsize);
|
||||||
|
|
||||||
delete[] inbuffer;
|
delete[] inbuffer;
|
||||||
inbuffer = 0;
|
inbuffer = 0;
|
||||||
newEntry.data = outbuffer;
|
newEntry.data = outbuffer;
|
||||||
|
@ -1498,6 +1533,7 @@ void Resource::initializeLoaders() {
|
||||||
_loaders.push_back(LoaderList::value_type(new ResLoaderTlk()));
|
_loaders.push_back(LoaderList::value_type(new ResLoaderTlk()));
|
||||||
|
|
||||||
_compLoaders.push_back(CompLoaderList::value_type(new CompLoaderInsHof()));
|
_compLoaders.push_back(CompLoaderList::value_type(new CompLoaderInsHof()));
|
||||||
|
_compLoaders.push_back(CompLoaderList::value_type(new CompLoaderInsLol()));
|
||||||
}
|
}
|
||||||
|
|
||||||
const ResArchiveLoader *Resource::getLoader(ResFileEntry::kType type) const {
|
const ResArchiveLoader *Resource::getLoader(ResFileEntry::kType type) const {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue