GLK: SCOTT: Implement detectTI994A

This commit is contained in:
Avijeet 2022-06-25 18:26:16 +05:30 committed by Eugene Sandulenko
parent 23f4211038
commit 0557e9818c
3 changed files with 90 additions and 4 deletions

View File

@ -93,7 +93,7 @@ void loadTI994A(Common::SeekableReadStream *f) {
if (result != _G(_fileLength))
g_scott->fatal("File empty or read error!");
_G(_fallbackGame)._gameID = detectTI994A(&_G(_entireFile), &_G(_fileLength));
_G(_fallbackGame)._gameID = detectTI994A(f, &_G(_entireFile), &_G(_fileLength));
}
void loadGameFile(Common::SeekableReadStream *f) {

View File

@ -30,13 +30,98 @@
* https://github.com/angstsmurf/spatterlight/tree/master/terps/scott
*/
#include "glk/scott/scott.h"
#include "glk/scott/globals.h"
#include "glk/scott/resource.h"
#include "glk/scott/load_ti99_4a.h"
namespace Glk {
namespace Scott {
GameIDType detectTI994A(uint8_t **sf, size_t *extent) {
return GameIDType();
struct DataHeader {
uint8_t _numObjects; /* number of objects */
uint8_t _numVerbs; /* number of verbs */
uint8_t _numNouns; /* number of nouns */
uint8_t _redRoom; /* the red room (dead room) */
uint8_t _maxItemsCarried; /* max number of items can be carried */
uint8_t _beginLocn; /* room to start in */
uint8_t _numTreasures; /* number of treasures */
uint8_t _cmdLength; /* number of letters in commands */
uint16_t _lightTurns; /* max number of turns light lasts */
uint8_t _treasureLocn; /* location of where to store treasures */
uint8_t _strange; /* !?! not known. */
uint16_t _pObjTable; /* pointer to object table */
uint16_t _pOrigItems; /* pointer to original items */
uint16_t _pObjLink; /* pointer to link table from noun to object */
uint16_t _pObjDescr; /* pointer to object descriptions */
uint16_t _pMessage; /* pointer to message pointers */
uint16_t _pRoomExit; /* pointer to room exits table */
uint16_t _pRoomDescr; /* pointer to room descr table */
uint16_t _pNounTable; /* pointer to noun table */
uint16_t _pVerbTable; /* pointer to verb table */
uint16_t _pExplicit; /* pointer to explicit action table */
uint16_t _pImplicit; /* pointer to implicit actions */
};
void getMaxTI99Messages(DataHeader dh) {
}
void getMaxTI99Items(DataHeader dh) {
}
int tryLoadingTI994A(DataHeader dh, int loud) {
return 0;
}
void readHeader(Common::SeekableReadStream *f, DataHeader &dh) {
f->seek(0);
f->seek(_G(_fileBaselineOffset) + 0x8a0);
dh._numObjects = f->readByte();
dh._numVerbs = f->readByte();
dh._numNouns = f->readByte();
dh._redRoom = f->readByte();
dh._maxItemsCarried = f->readByte();
dh._beginLocn = f->readByte();
dh._numTreasures = f->readByte();
dh._cmdLength = f->readByte();
dh._lightTurns = f->readUint16LE();
dh._treasureLocn = f->readByte();
dh._strange = f->readByte();
dh._pObjTable = f->readUint16LE();
dh._pOrigItems = f->readUint16LE();
dh._pObjLink = f->readUint16LE();
dh._pObjDescr = f->readUint16LE();
dh._pMessage = f->readUint16LE();
dh._pRoomExit = f->readUint16LE();
dh._pRoomDescr = f->readUint16LE();
dh._pNounTable = f->readUint16LE();
dh._pVerbTable = f->readUint16LE();
dh._pExplicit = f->readUint16LE();
dh._pImplicit = f->readUint16LE();
}
GameIDType detectTI994A(Common::SeekableReadStream *f, uint8_t **sf, size_t *extent) {
int offset = findCode("\x30\x30\x30\x30\x00\x30\x30\x00\x28\x28", 0);
if (offset == -1)
return UNKNOWN_GAME;
_G(_fileBaselineOffset) = offset - 0x589;
DataHeader dh;
readHeader(f, dh);
getMaxTI99Messages(dh);
getMaxTI99Items(dh);
return static_cast<GameIDType>(tryLoadingTI994A(dh, 0));
}
} // End of namespace Scott

View File

@ -33,13 +33,14 @@
#ifndef GLK_SCOTT_LOAD_TI99_4A_H
#define GLK_SCOTT_LOAD_TI99_4A_H
#include "common/file.h"
#include "glk/scott/types.h"
#include "glk/scott/definitions.h"
namespace Glk {
namespace Scott {
GameIDType detectTI994A(uint8_t **sf, size_t *extent);
GameIDType detectTI994A(Common::SeekableReadStream *f, uint8_t **sf, size_t *extent);
} // End of namespace Scott
} // End of namespace Glk