aboutsummaryrefslogtreecommitdiff
path: root/engines/hugo/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/hugo/parser.cpp')
-rw-r--r--engines/hugo/parser.cpp139
1 files changed, 137 insertions, 2 deletions
diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp
index 001ddac8e4..2d5f6c99bb 100644
--- a/engines/hugo/parser.cpp
+++ b/engines/hugo/parser.cpp
@@ -51,17 +51,152 @@
namespace Hugo {
-Parser::Parser(HugoEngine *vm) :
- _vm(vm), _putIndex(0), _getIndex(0), _checkDoubleF1Fl(false) {
+Parser::Parser(HugoEngine *vm) : _vm(vm), _putIndex(0), _getIndex(0), _arrayReqs(0), _catchallList(0), _backgroundObjects(0), _cmdList(0) {
_cmdLineIndex = 0;
_cmdLineTick = 0;
_cmdLineCursor = '_';
_cmdLine[0] = '\0';
+ _cmdListSize = 0;
+ _checkDoubleF1Fl = false;
+ _backgroundObjectsSize = 0;
}
Parser::~Parser() {
}
+/**
+ * Read a cmd structure from Hugo.dat
+ */
+void Parser::readCmd(Common::ReadStream &in, cmd &curCmd) {
+ curCmd.verbIndex = in.readUint16BE();
+ curCmd.reqIndex = in.readUint16BE();
+ curCmd.textDataNoCarryIndex = in.readUint16BE();
+ curCmd.reqState = in.readByte();
+ curCmd.newState = in.readByte();
+ curCmd.textDataWrongIndex = in.readUint16BE();
+ curCmd.textDataDoneIndex = in.readUint16BE();
+ curCmd.actIndex = in.readUint16BE();
+}
+
+/**
+ * Load _cmdList from Hugo.dat
+ */
+void Parser::loadCmdList(Common::ReadStream &in) {
+ cmd tmpCmd;
+ for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
+ uint16 numElem = in.readUint16BE();
+ if (varnt == _vm->_gameVariant) {
+ _cmdListSize = numElem;
+ _cmdList = (cmd **)malloc(sizeof(cmd *) * _cmdListSize);
+ }
+
+ for (int16 i = 0; i < numElem; i++) {
+ uint16 numSubElem = in.readUint16BE();
+ if (varnt == _vm->_gameVariant)
+ _cmdList[i] = (cmd *)malloc(sizeof(cmd) * numSubElem);
+ for (int16 j = 0; j < numSubElem; j++)
+ readCmd(in, (varnt == _vm->_gameVariant) ? _cmdList[i][j] : tmpCmd);
+ }
+ }
+}
+
+
+void Parser::readBG(Common::ReadStream &in, background_t &curBG) {
+ curBG.verbIndex = in.readUint16BE();
+ curBG.nounIndex = in.readUint16BE();
+ curBG.commentIndex = in.readSint16BE();
+ curBG.matchFl = (in.readByte() != 0);
+ curBG.roomState = in.readByte();
+ curBG.bonusIndex = in.readByte();
+}
+
+/**
+ * Read _backgrounObjects from Hugo.dat
+ */
+void Parser::loadBackgroundObjects(Common::ReadStream &in) {
+ background_t tmpBG;
+
+ for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
+ uint16 numElem = in.readUint16BE();
+
+ if (varnt == _vm->_gameVariant) {
+ _backgroundObjectsSize = numElem;
+ _backgroundObjects = (background_t **)malloc(sizeof(background_t *) * numElem);
+ }
+
+ for (int i = 0; i < numElem; i++) {
+ uint16 numSubElem = in.readUint16BE();
+ if (varnt == _vm->_gameVariant)
+ _backgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem);
+
+ for (int j = 0; j < numSubElem; j++)
+ readBG(in, (varnt == _vm->_gameVariant) ? _backgroundObjects[i][j] : tmpBG);
+ }
+ }
+}
+
+/**
+ * Read _catchallList from Hugo.dat
+ */
+void Parser::loadCatchallList(Common::ReadStream &in) {
+ background_t *wrkCatchallList = 0;
+ background_t tmpBG;
+
+ for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
+ uint16 numElem = in.readUint16BE();
+
+ if (varnt == _vm->_gameVariant)
+ _catchallList = wrkCatchallList = (background_t *)malloc(sizeof(background_t) * numElem);
+
+ for (int i = 0; i < numElem; i++)
+ readBG(in, (varnt == _vm->_gameVariant) ? wrkCatchallList[i] : tmpBG);
+ }
+}
+
+void Parser::loadArrayReqs(Common::SeekableReadStream &in) {
+ _arrayReqs = _vm->loadLongArray(in);
+}
+
+/**
+ * Search background command list for this screen for supplied object.
+ * Return first associated verb (not "look") or 0 if none found.
+ */
+const char *Parser::useBG(const char *name) {
+ debugC(1, kDebugEngine, "useBG(%s)", name);
+
+ objectList_t p = _backgroundObjects[*_vm->_screen_p];
+ for (int i = 0; p[i].verbIndex != 0; i++) {
+ if ((name == _vm->_text->getNoun(p[i].nounIndex, 0) &&
+ p[i].verbIndex != _vm->_look) &&
+ ((p[i].roomState == kStateDontCare) || (p[i].roomState == _vm->_screenStates[*_vm->_screen_p])))
+ return _vm->_text->getVerb(p[i].verbIndex, 0);
+ }
+
+ return 0;
+}
+
+void Parser::freeParser() {
+ if (_arrayReqs) {
+ for (int i = 0; _arrayReqs[i] != 0; i++)
+ free(_arrayReqs[i]);
+ free(_arrayReqs);
+ }
+
+ free(_catchallList);
+
+ if (_backgroundObjects) {
+ for (int i = 0; i < _backgroundObjectsSize; i++)
+ free(_backgroundObjects[i]);
+ free(_backgroundObjects);
+ }
+
+ if (_cmdList) {
+ for (int i = 0; i < _cmdListSize; i++)
+ free(_cmdList[i]);
+ free(_cmdList);
+ }
+}
+
void Parser::switchTurbo() {
_vm->_config.turboFl = !_vm->_config.turboFl;
}