aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorJohannes Schickel2006-07-31 16:37:34 +0000
committerJohannes Schickel2006-07-31 16:37:34 +0000
commit01b3a0b56836427cafe7707ae9e8a7189144d717 (patch)
tree6a4d04d4af7b64e95bfff1c93b8cad8f2b1a1d31 /engines
parentff10c827fdc153346809b1baba62c94a35f4f467 (diff)
downloadscummvm-rg350-01b3a0b56836427cafe7707ae9e8a7189144d717.tar.gz
scummvm-rg350-01b3a0b56836427cafe7707ae9e8a7189144d717.tar.bz2
scummvm-rg350-01b3a0b56836427cafe7707ae9e8a7189144d717.zip
Yet more kyra3 init code.
svn-id: r23648
Diffstat (limited to 'engines')
-rw-r--r--engines/kyra/kyra3.cpp94
-rw-r--r--engines/kyra/kyra3.h28
-rw-r--r--engines/kyra/resource.cpp32
-rw-r--r--engines/kyra/resource.h3
-rw-r--r--engines/kyra/staticres.cpp10
5 files changed, 163 insertions, 4 deletions
diff --git a/engines/kyra/kyra3.cpp b/engines/kyra/kyra3.cpp
index c90ee81448..37c6fd4775 100644
--- a/engines/kyra/kyra3.cpp
+++ b/engines/kyra/kyra3.cpp
@@ -47,6 +47,13 @@ KyraEngine_v3::KyraEngine_v3(OSystem *system) : KyraEngine(system) {
_itemBuffer1 = _itemBuffer2 = 0;
_mouseSHPBuf = 0;
_tableBuffer1 = _tableBuffer2 = 0;
+ _unkBuffer5 = _unkBuffer6 = _unkBuffer7 = _unkBuffer9 = 0;
+ _costpalData = 0;
+ _unkWSAPtr = 0;
+ memset(_unkShapeTable, 0, sizeof(_unkShapeTable));
+ _scoreFile = 0;
+ _cCodeFile = 0;
+ _scenesList = 0;
}
KyraEngine_v3::~KyraEngine_v3() {
@@ -63,6 +70,18 @@ KyraEngine_v3::~KyraEngine_v3() {
delete [] _shapePoolBuffer;
delete [] _mouseSHPBuf;
+
+ delete [] _unkBuffer5;
+ delete [] _unkBuffer6;
+ delete [] _unkBuffer7;
+ delete [] _unkBuffer9;
+
+ delete [] _costpalData;
+ delete [] _unkWSAPtr;
+
+ delete [] _scoreFile;
+ delete [] _cCodeFile;
+ delete [] _scenesList;
}
int KyraEngine_v3::setupGameFlags() {
@@ -408,10 +427,6 @@ int KyraEngine_v3::handleMainMenu(Movie *logo) {
if (_mousePressFlag) {
// TODO: Flash the text
command = item;
-
- // TODO: For now, only playing the intro and quitting is supported
- if (command != 1 && command != 3)
- command = -1;
}
}
}
@@ -525,6 +540,31 @@ void KyraEngine_v3::preinit() {
void KyraEngine_v3::realInit() {
debugC(9, kDebugLevelMain, "KyraEngine::realInit()");
+
+ // XXX sound specific stuff
+
+ _unkBuffer5 = new uint8[500];
+ _unkBuffer6 = new uint8[200];
+ _unkBuffer7 = new uint8[600];
+ _costpalData = new uint8[864];
+ _unkBuffer9 = new uint8[3618];
+ _unkWSAPtr = new uint8[624];
+
+ musicUpdate(0);
+
+ _unkPage2 = new uint8[64000];
+
+ musicUpdate(0);
+ musicUpdate(0);
+
+ assert(loadLanguageFile("ITEMS.", _itemList));
+ assert(loadLanguageFile("C_CODE.", _cCodeFile));
+ assert(loadLanguageFile("SCENES.", _scenesList));
+
+ assert(_unkBuffer5 && _unkBuffer6 && _unkBuffer7 && _costpalData && _unkBuffer9 &&
+ _unkWSAPtr && _unkPage2 && _itemList && _cCodeFile && _scenesList);
+
+ musicUpdate(0);
}
#pragma mark -
@@ -770,4 +810,50 @@ void KyraEngine_v3::initItems() {
_screen->_curPage = 0;
}
+#pragma mark -
+
+int KyraEngine_v3::getMaxFileSize(const char *file) {
+ debugC(9, kDebugLevelMain, "KyraEngine::getMaxFileSize(%s)", file);
+ int size = 0;
+
+ char buffer[32];
+
+ for (int i = 0; i < _languageExtensionSize; ++i) {
+ strncpy(buffer, file, 32);
+ size = MAX<uint32>(size, _res->getFileSize(appendLanguage(buffer, i, sizeof(buffer))));
+ }
+
+ return size + 20;
+}
+
+char *KyraEngine_v3::appendLanguage(char *buf, int lang, int bufSize) {
+ debugC(9, kDebugLevelMain, "KyraEngine::appendLanguage([%p|'%s'], %d, %d)", (const void*)buf, buf, lang, bufSize);
+ assert(lang < _languageExtensionSize);
+
+ int size = strlen(buf) + strlen(_languageExtension[lang]);
+
+ if (size > bufSize) {
+ warning("buffer too small to append language extension");
+ return 0;
+ }
+
+ char *temp = buf + strlen(buf);
+ bufSize -= strlen(buf);
+
+ strncat(temp, _languageExtension[lang], bufSize);
+
+ return buf;
+}
+
+bool KyraEngine_v3::loadLanguageFile(const char *file, uint8 *&buffer) {
+ debugC(9, kDebugLevelMain, "KyraEngine::loadLanguageFile('%s', %p)", file, (const void*)buffer);
+
+ uint32 size = 0;
+ char nBuf[32];
+ strncpy(nBuf, file, 32);
+ buffer = _res->fileData(appendLanguage(nBuf, _lang, sizeof(nBuf)), &size);
+
+ return size != 0 && buffer != 0;
+}
+
} // end of namespace Kyra
diff --git a/engines/kyra/kyra3.h b/engines/kyra/kyra3.h
index ac07f49824..e15f195a85 100644
--- a/engines/kyra/kyra3.h
+++ b/engines/kyra/kyra3.h
@@ -85,6 +85,22 @@ private:
uint8 *_unkPage1;
uint8 *_unkPage2;
+ uint8 *_unkBuffer5;
+ uint8 *_unkBuffer6;
+ uint8 *_unkBuffer7;
+ uint8 *_unkBuffer9;
+
+ uint8 *_costpalData;
+
+ uint8 *_unkWSAPtr;
+
+ uint8 *_unkShapeTable[20];
+
+ // translation stuff
+ uint8 *_scoreFile;
+ uint8 *_cCodeFile;
+ uint8 *_scenesList;
+
// interface?
uint8 *_interfaceCPS1;
uint8 *_interfaceCPS2;
@@ -99,6 +115,8 @@ private:
uint8 *_itemBuffer1;
uint8 *_itemBuffer2;
+ uint8 *_itemList;
+
void initItems();
// used for CSH loading and some sound stuff (maybe voice files?)
@@ -116,6 +134,16 @@ private:
int addShapeToTable(uint8 *buf, int id, int shapeNum);
uint8 *findShapeInTable(int id);
+
+ // resource specific
+private:
+ static const char *_languageExtension[];
+ static const int _languageExtensionSize;
+
+ int getMaxFileSize(const char *file);
+ char *appendLanguage(char *buf, int lang, int bufSize);
+
+ bool loadLanguageFile(const char *file, uint8 *&buffer);
};
} // end of namespace Kyra
diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp
index 2d9e22b9e8..995d8869c5 100644
--- a/engines/kyra/resource.cpp
+++ b/engines/kyra/resource.cpp
@@ -214,6 +214,38 @@ bool Resource::fileHandle(const char *file, uint32 *size, Common::File &filehand
return false;
}
+uint32 Resource::getFileSize(const char *file) {
+ Common::List<ResourceFile*>::iterator start = _pakfiles.begin();
+
+ Common::File temp;
+ if (temp.open(file))
+ return temp.size();
+
+ for (;start != _pakfiles.end(); ++start) {
+ uint32 size = (*start)->getFileSize(file);
+
+ if (size)
+ return size;
+ }
+
+ return 0;
+}
+
+bool Resource::loadFileToBuf(const char *file, void *buf, uint32 maxSize) {
+ Common::File tempHandle;
+ uint32 size = 0;
+ if (!fileHandle(file, &size, tempHandle))
+ return false;
+
+ if (size > maxSize)
+ return false;
+
+ memset(buf, 0, maxSize);
+ tempHandle.read(buf, size);
+
+ return true;
+}
+
///////////////////////////////////////////
// Pak file manager
#define PAKFile_Iterate Common::List<PakChunk>::iterator start=_files.begin();start != _files.end(); ++start
diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h
index beb79bfbb8..23bcd7ea32 100644
--- a/engines/kyra/resource.h
+++ b/engines/kyra/resource.h
@@ -105,12 +105,15 @@ public:
void unloadPakFile(const Common::String &filename);
bool isInPakList(const Common::String &filename);
+ uint32 getFileSize(const char *file);
uint8* fileData(const char *file, uint32 *size);
// it gives back a file handle (used for the speech player)
// it could be that the needed file is embedded in the returned
// handle
bool fileHandle(const char *file, uint32 *size, Common::File &filehandle);
+ bool loadFileToBuf(const char *file, void *buf, uint32 maxSize);
+
protected:
KyraEngine *_engine;
Common::List<ResourceFile*> _pakfiles;
diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp
index f4924181e1..e58517e7bd 100644
--- a/engines/kyra/staticres.cpp
+++ b/engines/kyra/staticres.cpp
@@ -1289,4 +1289,14 @@ const char *KyraEngine_v3::_soundList[] = {
const int KyraEngine_v3::_soundListSize = ARRAYSIZE(KyraEngine_v3::_soundList);
+const char *KyraEngine_v3::_languageExtension[] = {
+ "TRE",
+ "TRF",
+ "TRG"/*,
+ "TRI", Italian and Spanish was never included
+ "TRS"*/
+};
+
+const int KyraEngine_v3::_languageExtensionSize = ARRAYSIZE(KyraEngine_v3::_languageExtension);
+
} // End of namespace Kyra