diff options
author | Paul Gilbert | 2019-06-12 22:15:58 -0700 |
---|---|---|
committer | Paul Gilbert | 2019-06-12 22:15:58 -0700 |
commit | 86126974096e14ff54aaa75fbb9cd5e4b9b5420d (patch) | |
tree | 5bd8b825cf897b663cd2221904c3f316c098b2b5 /engines | |
parent | 0e543b06823e629a007bad26f94d452bfb38abf1 (diff) | |
download | scummvm-rg350-86126974096e14ff54aaa75fbb9cd5e4b9b5420d.tar.gz scummvm-rg350-86126974096e14ff54aaa75fbb9cd5e4b9b5420d.tar.bz2 scummvm-rg350-86126974096e14ff54aaa75fbb9cd5e4b9b5420d.zip |
GLK: ADVSYS: Remainder of parseInput method
Diffstat (limited to 'engines')
-rw-r--r-- | engines/glk/advsys/vm.cpp | 96 |
1 files changed, 90 insertions, 6 deletions
diff --git a/engines/glk/advsys/vm.cpp b/engines/glk/advsys/vm.cpp index bbe958a11b..17db9ab743 100644 --- a/engines/glk/advsys/vm.cpp +++ b/engines/glk/advsys/vm.cpp @@ -436,8 +436,7 @@ bool VM::nextCommand() { bool VM::parseInput() { int noun1 = 0, cnt1 = 0, noun2 = 0, cnt2 = 0; - int preposition = 0; - bool flag = false; + int preposition = 0, flags = 0; // Initialize the parser result fields _actor = _action = _dObject = _iObject = 0; @@ -450,15 +449,100 @@ bool VM::parseInput() { return false; // Check for actor - WordType wordType = getWordType(_words.front()); + WordType wordType = getWordType(*_wordPtr); if (wordType == WT_ADJECTIVE || wordType == WT_NOUN) { if (!(_actor = getNoun())) return false; - flag |= A_ACTOR; + flags |= A_ACTOR; } - // TODO: stub - return false; + // Check for a verb + if (getVerb()) + return false; + + // Get direct object, preposition, and/or indirect object + if (_wordPtr != _words.end()) { + // Get any direct objects + noun1 = _adjectiveList.size(); + for (;;) { + // Get the next direct object + if (!getNoun()) + return false; + ++cnt1; + + // Check for more direct objects + if (_wordPtr == _words.end() || getWordType(*_wordPtr)) + break; + ++_wordPtr; + } + + // Get any reposition and indirect object + if (_wordPtr != _words.end()) { + // Get the preposition + if (getWordType(*_wordPtr) == WT_PREPOSITION) + preposition = *_wordPtr++; + + // Get the indirect object + noun2 = _adjectiveList.size(); + for (;;) { + // Get the indirect object + if (!getNoun()) + return false; + ++cnt2; + + // Check for more objects + if (_wordPtr == _words.end() || getWordType(*_wordPtr) != WT_CONJUNCTION) + break; + ++_wordPtr; + } + } + + // Ensure we're at the end of the input line + if (_wordPtr != _words.end()) { + parseError(); + return false; + } + } + + // Setup resulting properties + if (preposition) { + if (cnt2 > 1) { + parseError(); + return false; + } + + _dObject = noun1; + _ndObjects = cnt1; + _iObject = noun2; + } + else if (noun2) { + if (cnt1 > 1) { + parseError(); + return false; + } + + preposition = findWord("to"); + _dObject = noun2; + _ndObjects = cnt2; + _iObject = noun1; + } else { + _dObject = noun1; + _ndObjects = cnt1; + } + + // Setup the flags for the action lookup + if (_dObject) + flags |= A_DOBJECT; + if (_iObject) + flags |= A_IOBJECT; + + // Find the action + if (!(_action == findAction(_verbs, preposition, flags))) { + parseError(); + return false; + } + + return true; } bool VM::getLine() { |