diff options
Diffstat (limited to 'engines/hugo/parser.cpp')
| -rw-r--r-- | engines/hugo/parser.cpp | 139 |
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; } |
