diff --git a/engines/access/access.cpp b/engines/access/access.cpp index 4035870dadcd..e90e5bad22dd 100644 --- a/engines/access/access.cpp +++ b/engines/access/access.cpp @@ -83,6 +83,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc) _establishFlag = false; _establishMode = 0; _establishGroup = 0; + _establishCtrlTblOfs = 0; Common::fill(&_help1[0], &_help1[366], 0); Common::fill(&_help2[0], &_help2[366], 0); Common::fill(&_help1[0], &_help3[366], 0); @@ -102,6 +103,9 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc) _screenVirtX = 0; _lastTime = g_system->getMillis(); _curTime = 0; + _narateFile = 0; + _txtPages = 0; + _sndSubFile = 0; } AccessEngine::~AccessEngine() { @@ -233,9 +237,31 @@ void AccessEngine::establishCenter(int esatabIndex, int sub) { doEstablish(esatabIndex, sub); } -byte *AccessEngine::loadEstablish(int sub) { - warning("TODO: loadEstablish"); - return nullptr; +const char *const _estTable[] = { "ETEXT0.DAT", "ETEXT1.DAT", "ETEXT2.DAT", "ETEXT3.DAT" }; + +void AccessEngine::loadEstablish(int sub) { + if (!_files->existFile("ETEXT.DAT")) { + int oldGroup = _establishGroup; + _establishGroup = 0; + + _eseg = _files->loadFile(_estTable[oldGroup]); + } else { + _eseg = _files->loadFile("ETEXT.DAT"); + } + + _establishCtrlTblOfs = READ_LE_UINT16(_eseg); + + int ofs = _establishCtrlTblOfs + (sub * 2); + int idx = READ_LE_UINT16(_eseg + ofs); + _narateFile = READ_LE_UINT16(_eseg + idx); + _txtPages = READ_LE_UINT16(_eseg + idx + 2); + + if (!_txtPages) + return; + + _sndSubFile = READ_LE_UINT16(_eseg + idx + 4); + for (int i = 0; i < _txtPages; ++i) + _countTbl[i] = READ_LE_UINT16(_eseg + idx + 6 + (2 * i)); } void AccessEngine::doEstablish(int esatabIndex, int sub) { @@ -260,7 +286,7 @@ void AccessEngine::doEstablish(int esatabIndex, int sub) { _bubbleBox->_maxChars = 37; _fonts._printOrg = _fonts._printStart = Common::Point(48, 35); - _eseg = loadEstablish(sub); + loadEstablish(sub); _et = sub; warning("CHECKME: Use of di"); _printEnd = 155; diff --git a/engines/access/access.h b/engines/access/access.h index 0d4ad1945242..db969357aa68 100644 --- a/engines/access/access.h +++ b/engines/access/access.h @@ -73,6 +73,8 @@ enum AccessDebugChannels { struct AccessGameDescription; +extern const char *const _estTable[]; + class AccessEngine : public Engine { private: uint32 _lastTime, _curTime; @@ -132,6 +134,7 @@ class AccessEngine : public Engine { bool _establishFlag; int _establishMode; int _establishGroup; + int _establishCtrlTblOfs; int _numAnimTimers; TimerList _timers; FontManager _fonts; @@ -164,6 +167,9 @@ class AccessEngine : public Engine { int _et; int _printEnd; int _txtPages; + int _narateFile; + int _sndSubFile; + int _countTbl[6]; // Fields that are included in savegames int _conversation; @@ -220,7 +226,7 @@ class AccessEngine : public Engine { */ void freeInactiveData(); - byte *AccessEngine::loadEstablish(int sub); + void AccessEngine::loadEstablish(int sub); void establish(int esatabIndex, int sub); diff --git a/engines/access/files.cpp b/engines/access/files.cpp index c805121d50ff..da3842492c55 100644 --- a/engines/access/files.cpp +++ b/engines/access/files.cpp @@ -82,6 +82,10 @@ byte *FileManager::loadFile(const Common::String &filename) { return handleFile(); } +bool FileManager::existFile(const Common::String &filename) { + return _file.exists(filename); +} + void FileManager::openFile(const Common::String &filename) { // Open up the file _fileNumber = -1; diff --git a/engines/access/files.h b/engines/access/files.h index 38d917919578..b91da7d6ffde 100644 --- a/engines/access/files.h +++ b/engines/access/files.h @@ -63,6 +63,11 @@ class FileManager { FileManager(AccessEngine *vm); ~FileManager(); + /** + * Check the existence of a given file + */ + bool FileManager::existFile(const Common::String &filename); + /** * Load a given subfile from a container file */