diff options
Diffstat (limited to 'engines/titanic/true_talk/script_handler.cpp')
-rw-r--r-- | engines/titanic/true_talk/script_handler.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/engines/titanic/true_talk/script_handler.cpp b/engines/titanic/true_talk/script_handler.cpp new file mode 100644 index 0000000000..64e789a4b9 --- /dev/null +++ b/engines/titanic/true_talk/script_handler.cpp @@ -0,0 +1,148 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "titanic/true_talk/script_handler.h" +#include "titanic/true_talk/tt_concept.h" +#include "titanic/true_talk/tt_sentence.h" +#include "titanic/true_talk/tt_parser.h" +#include "titanic/true_talk/tt_word.h" +#include "titanic/titanic.h" + +namespace Titanic { + +/*------------------------------------------------------------------------*/ + +CScriptHandler::CScriptHandler(CTitleEngine *owner, int val1, int val2) : + _owner(owner), _script(owner->_script), _resources(g_vm->_exeResources), + _parser(this), _field10(0), _inputCtr(0), + _concept1P(nullptr), _concept2P(nullptr), _concept3P(nullptr), + _concept4P(nullptr), _field30(0) { + g_vm->_scriptHandler = this; + g_vm->_script = _script; + g_vm->_exeResources.reset(this, val1, val2); + _vocab = new TTvocab(val2); +} + +CScriptHandler::~CScriptHandler() { + delete _vocab; + delete _concept1P; + delete _concept2P; + delete _concept3P; + delete _concept4P; +} + +ScriptChangedResult CScriptHandler::scriptChanged(TTroomScript *roomScript, TTnpcScript *npcScript, uint dialogueId) { + if (!npcScript || !roomScript) { + ++_inputCtr; + return SCR_5; + } + + ScriptChangedResult result = roomScript->notifyScript(npcScript, dialogueId); + if (result == SCR_1) + result = npcScript->notifyScript(roomScript, dialogueId); + + if (result != SCR_3 && result != SCR_4) + return result; + + ++_inputCtr; + delete _concept1P; + delete _concept2P; + delete _concept3P; + delete _concept4P; + _concept1P = nullptr; + _concept2P = nullptr; + _concept3P = nullptr; + _concept4P = nullptr; + + return result; +} + +int CScriptHandler::processInput(TTroomScript *roomScript, TTnpcScript *npcScript, + const TTstring &line) { + if (!roomScript || !line.isValid()) + return SS_5; + + TTsentence *sentence = new TTsentence(_inputCtr++, line, this, roomScript, npcScript); + int result = _parser.preprocess(sentence); + roomScript->scriptPreprocess(sentence); + npcScript->scriptPreprocess(sentence); + + int canProcess = 0; + if (result) { + sentence->setState(result); + if (roomScript->canRespond(npcScript, sentence, result)) { + canProcess = npcScript->chooseResponse(roomScript, sentence, result); + } + } + + if (canProcess == 0 || canProcess == 1) { + if (!_parser.findFrames(sentence)) { + if (roomScript->canProcess(npcScript, sentence) && npcScript) { + npcScript->process(roomScript, sentence); + } + } + } + + delete sentence; + return SS_VALID; +} + +SimpleFile *CScriptHandler::openResource(const CString &name) { + return _owner->open(name); +} + +void CScriptHandler::setParserConcept(TTconcept *newConcept, TTconcept *oldConcept) { + _parser.conceptChanged(newConcept, oldConcept); +} + +int CScriptHandler::setResponse(TTscriptBase *script, TTresponse *response) { + return _owner->setResponse(script, response); +} + +void CScriptHandler::handleWord(const TTstring *str) { + handleWord1(str); + handleWord2(str); +} + +void CScriptHandler::handleWord1(const TTstring *str) { + if (_concept2P) + delete _concept2P; + _concept2P = nullptr; + + if (str) { + TTword word(*str, WC_UNKNOWN, 0); + _concept2P = new TTconcept(&word); + } +} + +void CScriptHandler::handleWord2(const TTstring *str) { + if (_concept1P) + delete _concept1P; + _concept1P = nullptr; + + if (str) { + TTword word(*str, WC_UNKNOWN, 0); + _concept1P = new TTconcept(&word); + } +} + +} // End of namespace Titanic |