scummvm/engines/titanic/true_talk/deskbot_script.cpp

1592 lines
39 KiB
C++

/* 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 "common/textconsole.h"
#include "titanic/true_talk/deskbot_script.h"
#include "titanic/true_talk/true_talk_manager.h"
#include "titanic/titanic.h"
#include "titanic/translation.h"
namespace Titanic {
int DeskbotScript::_oldId;
#define CURRENT_STATE 17
DeskbotScript::DeskbotScript(int val1, const char *charClass, int v2,
const char *charName, int v3, int val2) :
TTnpcScript(val1, charClass, v2, charName, v3, val2, -1, -1, -1, 0) {
CTrueTalkManager::setFlags(18, 0);
CTrueTalkManager::setFlags(19, 0);
CTrueTalkManager::setFlags(20, 0);
CTrueTalkManager::setFlags(21, 0);
CTrueTalkManager::setFlags(22, 0);
setupDials(0, 0, 0);
_data[0] = 100;
if (_currentDialNum == 1)
_currentDialNum = 0;
loadRanges("Ranges/Deskbot");
loadResponses("Responses/Deskbot", 4);
setupSentences();
_tagMappings.load("TagMap/Deskbot");
_words.load("Words/Deskbot");
_quotes.load("Quotes/Deskbot");
_states.load("States/Deskbot");
}
void DeskbotScript::setupSentences() {
_mappings.load("Mappings/Deskbot", 4);
_entries.load("Sentences/Deskbot");
_entries2.load("Sentences/Deskbot/2");
_entries3.load("Sentences/Deskbot/3");
_dialValues[0] = _dialValues[1] = 0;
_field68 = 0;
_entryCount = 0;
}
int DeskbotScript::process(const TTroomScript *roomScript, const TTsentence *sentence) {
if (roomScript->_scriptId != 110)
return 2;
bool flag20 = getValue(20) != 0;
CTrueTalkManager::setFlags(20, 0);
checkItems(nullptr, nullptr);
if (preprocess(roomScript, sentence) != 1)
return 1;
CTrueTalkManager::setFlags(CURRENT_STATE, 0);
setState(0);
updateCurrentDial(false);
if (getValue(1) == 3) {
if (sentence->localWord("competition") || sentence->contains("competition")
|| sentence->localWord("won") || sentence->contains("won")
|| sentence->localWord("winning") || sentence->contains("winning")
|| sentence->localWord("winner") || sentence->contains("winner")
|| sentence->contains("35279") || sentence->contains("3 5 2 7 9")
|| (g_language == Common::DE_DEU && (
sentence->contains("preisaus") ||
sentence->contains("tombola") ||
sentence->contains("lotterie") ||
sentence->contains("gewonnen") ||
sentence->contains("glueck") ||
sentence->contains("das goldene los") ||
sentence->contains("sechs richtige")
))
) {
addResponse(getDialogueId(41773));
applyResponse();
return 2;
} else if (sentence->localWord("magazine") || sentence->contains("magazine")) {
addResponse(getDialogueId(41771));
applyResponse();
return 2;
} else if (sentence->localWord("upgrade") || sentence->contains("upgrade")
|| sentence->localWord("secondclass")) {
if (CTrueTalkManager::_currentNPC) {
CGameObject *obj;
if (CTrueTalkManager::_currentNPC->find("Magazine", &obj, FIND_PET)) {
addResponse(getDialogueId(41773));
applyResponse();
return 2;
}
}
}
}
if (processEntries(&_entries, _entryCount, roomScript, sentence) != 2
&& processEntries(&_entries2, 0, roomScript, sentence) != 2) {
if (sentence->localWord("sauce") || sentence->localWord("pureed")) {
addResponse(getDialogueId(240398));
applyResponse();
} else if (sentence->contains("cherries")) {
addResponse(getDialogueId(240358));
applyResponse();
} else if (sentence->contains("42")) {
addResponse(getDialogueId(240453));
applyResponse();
} else if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(241778));
applyResponse();
} else {
if (sentence->contains("98129812"))
setDialRegion(1, 1);
if (!defaultProcess(roomScript, sentence)
&& processEntries(&_entries3, 0, roomScript, sentence) != 2
&& processEntries(_defaultEntries, 0, roomScript, sentence) != 2) {
if (flag20)
CTrueTalkManager::setFlags(20, 1);
addResponse(getDialogueId(240569));
applyResponse();
}
}
}
return 2;
}
ScriptChangedResult DeskbotScript::scriptChanged(const TTroomScript *roomScript, uint id) {
switch (id) {
case 3:
case 100:
case 108:
CTrueTalkManager::setFlags(21, getValue(21) + 1);
addResponse(getDialogueId(getValue(22) ? 240577 : 241261));
applyResponse();
break;
case 109:
addResponse(getDialogueId(241627));
applyResponse();
break;
case 140:
if (getValue(1) == 3)
addAssignedRoomDialogue3();
break;
case 148:
CTrueTalkManager::setFlags(3, 1);
break;
case 150:
CTrueTalkManager::setFlags(2, 1);
break;
}
return SCR_2;
}
int DeskbotScript::handleQuote(const TTroomScript *roomScript, const TTsentence *sentence,
uint tag1, uint tag2, uint remainder) {
switch (tag2) {
case MKTAG('A', 'D', 'V', 'T'):
case MKTAG('A', 'R', 'T', 'I'):
case MKTAG('A', 'R', 'T', 'Y'):
case MKTAG('B', 'R', 'N', 'D'):
case MKTAG('C', 'O', 'M', 'D'):
case MKTAG('D', 'N', 'C', 'E'):
case MKTAG('H', 'B', 'B', 'Y'):
case MKTAG('L', 'I', 'T', 'R'):
case MKTAG('M', 'A', 'G', 'S'):
case MKTAG('M', 'C', 'P', 'Y'):
case MKTAG('M', 'I', 'N', 'S'):
case MKTAG('M', 'U', 'S', 'I'):
case MKTAG('N', 'I', 'K', 'E'):
case MKTAG('S', 'F', 'S', 'F'):
case MKTAG('S', 'O', 'A', 'P'):
case MKTAG('S', 'O', 'N', 'G'):
case MKTAG('S', 'P', 'R', 'T'):
case MKTAG('T', 'E', 'A', 'M'):
case MKTAG('T', 'V', 'S', 'H'):
tag2 = MKTAG('E', 'N', 'T', 'N');
break;
case MKTAG('A', 'C', 'T', 'R'):
case MKTAG('A', 'C', 'T', 'S'):
case MKTAG('A', 'U', 'T', 'H'):
case MKTAG('B', 'A', 'R', 'K'):
case MKTAG('B', 'A', 'R', 'U'):
case MKTAG('B', 'L', 'F', '1'):
case MKTAG('B', 'L', 'F', '2'):
case MKTAG('B', 'L', 'P', '1'):
case MKTAG('B', 'L', 'P', '2'):
case MKTAG('B', 'L', 'P', '3'):
case MKTAG('B', 'L', 'P', '4'):
case MKTAG('B', 'L', 'R', '1'):
case MKTAG('B', 'L', 'R', '2'):
case MKTAG('B', 'L', 'T', '1'):
case MKTAG('B', 'L', 'T', '2'):
case MKTAG('B', 'L', 'T', '3'):
case MKTAG('B', 'L', 'T', '4'):
case MKTAG('B', 'L', 'T', '5'):
case MKTAG('B', 'O', 'Y', 'S'):
case MKTAG('C', 'O', 'P', 'S'):
case MKTAG('D', 'C', 'T', 'R'):
case MKTAG('F', 'A', 'M', 'E'):
case MKTAG('F', 'A', 'S', 'H'):
case MKTAG('G', 'I', 'R', 'L'):
case MKTAG('H', 'E', 'R', 'O'):
case MKTAG('H', 'O', 'S', 'T'):
case MKTAG('K', 'N', 'O', 'B'):
case MKTAG('N', 'H', 'R', 'O'):
case MKTAG('R', 'A', 'C', 'E'):
case MKTAG('S', 'C', 'I', 'T'):
case MKTAG('T', 'D', 'V', 'P'):
case MKTAG('T', 'W', 'A', 'T'):
case MKTAG('W', 'E', 'A', 'T'):
case MKTAG('W', 'W', 'E', 'B'):
tag2 = MKTAG('P', 'R', 'S', 'N');
break;
case MKTAG('C', 'H', 'S', 'E'):
case MKTAG('C', 'M', 'N', 'T'):
case MKTAG('F', 'I', 'L', 'M'):
case MKTAG('J', 'F', 'O', 'D'):
case MKTAG('L', 'I', 'Q', 'D'):
tag2 = MKTAG('F', 'O', 'O', 'D');
break;
case MKTAG('C', 'R', 'I', 'M'):
case MKTAG('C', 'S', 'P', 'Y'):
case MKTAG('D', 'R', 'U', 'G'):
tag2 = MKTAG('V', 'B', 'A', 'D');
break;
case MKTAG('E', 'A', 'R', 'T'):
case MKTAG('H', 'O', 'M', 'E'):
case MKTAG('N', 'P', 'L', 'C'):
case MKTAG('P', 'L', 'A', 'N'):
tag2 = MKTAG('P', 'L', 'A', 'C');
break;
case MKTAG('F', 'A', 'U', 'N'):
case MKTAG('F', 'I', 'S', 'H'):
case MKTAG('F', 'L', 'O', 'R'):
tag2 = MKTAG('N', 'A', 'T', 'R');
break;
case MKTAG('H', 'H', 'L', 'D'):
case MKTAG('T', 'O', 'Y', 'S'):
case MKTAG('W', 'E', 'A', 'P'):
tag2 = MKTAG('M', 'A', 'C', 'H');
break;
case MKTAG('M', 'L', 'T', 'Y'):
case MKTAG('P', 'G', 'R', 'P'):
case MKTAG('P', 'T', 'I', 'C'):
tag2 = MKTAG('G', 'R', 'U', 'P');
break;
case MKTAG('P', 'K', 'U', 'P'):
case MKTAG('S', 'E', 'X', '1'):
case MKTAG('S', 'W', 'E', 'R'):
tag2 = MKTAG('R', 'U', 'D', 'E');
break;
case MKTAG('P', 'H', 'I', 'L'):
case MKTAG('R', 'C', 'K', 'T'):
tag2 = MKTAG('S', 'C', 'I', 'E');
break;
case MKTAG('T', 'R', 'A', '2'):
case MKTAG('T', 'R', 'A', '3'):
tag2 = MKTAG('T', 'R', 'A', 'V');
break;
default:
break;
}
return TTnpcScript::handleQuote(roomScript, sentence, tag1, tag2, remainder);
}
int DeskbotScript::updateState(uint oldId, uint newId, int index) {
if (isDial1Medium() || getValue(1) < 4)
CTrueTalkManager::setFlags(22, 1);
if (newId == 240420 || newId == 240947 || newId == 241261) {
if (getValue(22) && (newId == 240947 || newId == 241261))
newId = getRangeValue(241184);
}
if (newId == 240832)
setDialRegion(1, 0);
if (oldId == 241183) {
if (getValue(1) == 2)
newId = getRangeValue(241182);
else if (getValue(1) == 1)
newId = getRangeValue(241181);
}
if (newId == 240931 && getValue(1) <= 2) {
newId = 240924;
} else if (newId == 240924 && getValue(1) > 2) {
newId = 240931;
}
if (newId == 240830 && getValue(1) == 1) {
newId = 240801;
} else if (newId == 240801 && getValue(1) > 1) {
newId = 240830;
}
if (oldId >= 241217 && oldId <= 241259) {
addResponse(getDialogueId(241202));
addResponse(getDialogueId(241200));
newId = getRangeValue(241199);
}
if (newId == 241354)
newId = addAssignedRoomDialogue2();
if (newId == 241353)
newId = getStateDialogueId();
if (newId == 240464 && getValue(1) != 1)
newId = 240462;
if (newId == 241635 && isDial1Medium()) {
addResponse(getDialogueId(241556));
newId = getRangeValue(241632);
}
if (getValue(20) && (oldId == 240569 || oldId == 240576))
newId = 240460;
if (!getValue(20)) {
if (newId != 240460)
goto exit;
CTrueTalkManager::setFlags(20, 1);
}
if (newId == 240460 && _oldId != 240569) {
CTrueTalkManager::setFlags(20, 0);
newId = 240455;
}
exit:
_oldId = oldId;
setCurrentState(newId, index);
return newId;
}
int DeskbotScript::preResponse(uint id) {
int newId = 0;
if (getValue(1) >= 3 && (
id == (uint)TRANSLATE(41176, 41190) ||
id == (uint)TRANSLATE(41738, 41429) ||
id == (uint)TRANSLATE(41413, 41755) ||
id == (uint)TRANSLATE(41740, 41757)
)) {
newId = 241601;
}
if (id == (uint)TRANSLATE(42114, 42132))
CTrueTalkManager::triggerAction(20, 0);
return newId;
}
uint DeskbotScript::getDialsBitset() const {
if (getDialRegion(1))
return getDialRegion(0) ? 2 : 3;
else
return getDialRegion(0) ? 0 : 1;
}
int DeskbotScript::doSentenceEntry(int val1, const int *srcIdP, const TTroomScript *roomScript, const TTsentence *sentence) {
uint id = *srcIdP;
if (g_language == Common::DE_DEU) {
if (val1 != 4501)
return TTnpcScript::doSentenceEntry(val1, srcIdP, roomScript, sentence);
switch (getValue(1)) {
case 1:
id = 240336;
break;
case 2:
id = addAssignedRoomDialogue();
break;
case 3:
if (id == 240431 || id == 240432) {
if (getValue(3) == 1) {
if (id == 240431)
id = 240432;
} else {
if (id == 240432)
id = 240431;
}
}
break;
default:
break;
}
addResponse(getDialogueId(id));
applyResponse();
return 2;
} else {
switch (val1) {
case 1:
if (id == 240431 || id == 240432) {
switch (getValue(1)) {
case 1:
id = 240336;
break;
case 2:
id = addAssignedRoomDialogue();
break;
case 3:
if (getValue(3) == 1) {
if (id == 240431)
id = 240432;
} else {
if (id == 240432)
id = 240431;
}
default:
break;
}
addResponse(getDialogueId(id));
applyResponse();
return 2;
}
break;
case 2:
if (getValue(1) == 1)
return 1;
break;
case 3:
if (getValue(1) != 1)
return 1;
break;
default:
break;
}
return 0;
}
}
bool DeskbotScript::randomResponse(uint index) {
if (getValue(1) == 1 || getRandomNumber(100) > 10 || getRandomNumber(2) <= index)
return 0;
if (getRandomNumber(100) > 95) {
deleteResponses();
addResponse(getDialogueId(241195));
applyResponse();
} else {
setResponseFromArray(index, 241193);
}
return true;
}
bool DeskbotScript::isDial0Medium() const {
return getDialRegion(0) == 1;
}
bool DeskbotScript::isDial0Low() const {
return getDialRegion(0) == 0;
}
bool DeskbotScript::isDial1Medium() const {
return getDialRegion(1) == 1;
}
bool DeskbotScript::isDial1Low() const {
return getDialRegion(1) == 0;
}
uint DeskbotScript::addAssignedRoomDialogue() {
if (isDial1Medium()) {
addResponse(getDialogueId(240407));
addResponse(getDialogueId(241510));
CTrueTalkManager::setFlags(1, 1);
CTrueTalkManager::triggerAction(19, 1);
int roomNum, floorNum, elevatorNum;
getAssignedRoom(&roomNum, &floorNum, &elevatorNum);
addResponse(getDialogueId(241317 + roomNum));
addResponse(getDialogueId(241271 + floorNum));
addResponse(getDialogueId(241511));
addResponse(getDialogueId(241313 + elevatorNum));
return 241512;
} else {
return 240567;
}
}
uint DeskbotScript::addAssignedRoomDialogue2() {
addResponse(getDialogueId(241355));
int roomNum = 0, floorNum = 0, elevatorNum = 0;
getAssignedRoom(&roomNum, &floorNum, &elevatorNum);
addResponse(getDialogueId(241317 + roomNum));
addResponse(getDialogueId(241271 + floorNum));
addResponse(getDialogueId(241356));
addResponse(getDialogueId(241313 + elevatorNum));
return 241357;
}
void DeskbotScript::addAssignedRoomDialogue3() {
addResponse(getDialogueId(241513));
addResponse(getDialogueId(241510));
CTrueTalkManager::setFlags(1, 2);
setDialRegion(0, 0);
setDialRegion(1, 0);
CTrueTalkManager::triggerAction(19, 2);
CTrueTalkManager::setFlags(3, 0);
int roomNum = 1, floorNum = 1, elevatorNum = 1;
getAssignedRoom(&roomNum, &floorNum, &elevatorNum);
addResponse(getDialogueId(241317 + roomNum));
addResponse(getDialogueId(241271 + floorNum));
addResponse(getDialogueId(241511));
addResponse(getDialogueId(241313 + elevatorNum));
addResponse(getDialogueId(241512));
applyResponse();
}
uint DeskbotScript::getStateDialogueId() const {
switch (getValue(1)) {
case 1:
return 241503;
case 2:
return 241504;
default:
return 241505;
}
}
void DeskbotScript::setCurrentState(uint newId, uint index) {
int newValue = getValue(CURRENT_STATE);
for (uint idx = 0; idx < _states.size(); ++idx) {
const TTupdateState &us = _states[idx];
if (newId == (idx == 0 ? 0 : us._newId)) {
uint bits = us._dialBits;
if (!bits
|| (index == 1 && (bits & 1) && (bits & 4))
|| (index == 0 && (bits & 2) && (bits & 4))
|| (index == 3 && (bits & 1) && (bits & 8))
|| (index == 2 && (bits & 2) && (bits & 8))) {
newValue = us._newValue;
break;
}
}
}
CTrueTalkManager::setFlags(CURRENT_STATE, newValue);
}
int DeskbotScript::preprocess(const TTroomScript *roomScript, const TTsentence *sentence) {
if (!roomScript || !sentence)
return 1;
bool stateFlag = true, applyFlag = false;
switch (getValue(CURRENT_STATE)) {
case 1:
if (sentence->_category != 3 && sentence->_category != 4
&& sentence->_category != 6 && sentence->_category != 10
&& sentence->_category != 2) {
addResponse(getDialogueId(240423));
applyFlag = true;
}
break;
case 2:
if (sentence->localWord("gobbledygook")) {
addResponse(getDialogueId(240427));
applyFlag = true;
}
break;
case 3:
if (sentence->_category == 11 || sentence->_category == 13
|| sentence->_category == 3 || sentence->localWord("upgrade")) {
addResponse(getDialogueId(240433));
applyFlag = true;
}
break;
case 4:
addResponse(getDialogueId(sentence->_category == 11 || sentence->_category == 13
? 240495 : 240494));
applyFlag = true;
break;
case 5:
if (isDial1Low() && getValue(1) == 4) {
if (sentence->localWord("name") || sentence->localWord("called")
|| sentence->localWord("passenger")) {
addResponse(getDialogueId(240867));
addResponse(getDialogueId(240745));
} else {
addResponse(getDialogueId(240446));
}
applyFlag = true;
stateFlag = false;
}
break;
case 6:
if (isDial1Low() && getValue(1) == 4) {
if (sentence->localWord("passenger")) {
addResponse(getDialogueId(240449));
applyFlag = true;
stateFlag = false;
} else if (sentence->localWord("home")
|| sentence->localWord("destroy")) {
addResponse(getDialogueId(240574));
stateFlag = true;
} else if (sentence->localWord("name")
|| sentence->localWord("called")
|| sentence->_category == 11) {
addResponse(getDialogueId(240448));
stateFlag = true;
} else {
addResponse(getDialogueId(240489));
stateFlag = true;
}
}
break;
case 7:
if (sentence->_category == 11 || sentence->_category == 13
|| (sentence->localWord("what") && sentence->localWord("wrong"))
|| sentence->localWord("clothes")) {
addResponse(getDialogueId(240489));
applyFlag = true;
stateFlag = false;
}
break;
case 8:
if (isDial1Low() && getValue(1) == 4) {
if (sentence->_category == 12 || sentence->_category == 13 ||
(g_language != Common::DE_DEU && sentence->contains("do not"))) {
addResponse(getDialogueId(240447));
setDialRegion(0, 0);
setDialRegion(1, 0);
CTrueTalkManager::setFlags(1, 3);
CTrueTalkManager::triggerAction(19, 3);
CTrueTalkManager::setFlags(22, 1);
applyFlag = true;
} else if (sentence->_category == 11) {
addResponse(getDialogueId(240746));
applyFlag = true;
stateFlag = false;
} else {
addResponse(getDialogueId(240448));
applyFlag = true;
stateFlag = false;
}
}
break;
case 9:
if (searchQuotes(roomScript, sentence)) {
if (isDial0Medium()) {
addResponse(getDialogueId(240382));
applyFlag = true;
stateFlag = false;
} else {
addResponse(getDialogueId(240548));
applyFlag = true;
}
}
break;
case 10:
if (isDial1Medium() && searchQuotes(roomScript, sentence)) {
if (isDial0Medium()) {
addResponse(getDialogueId(240405));
applyFlag = true;
stateFlag = false;
} else {
addResponse(getDialogueId(240548));
applyFlag = true;
}
}
break;
case 11:
if (isDial0Medium() && isDial1Medium()
&& searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240406));
applyFlag = true;
stateFlag = false;
}
break;
case 12:
if (isDial0Medium() && isDial1Medium()
&& searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240548));
applyFlag = true;
stateFlag = false;
}
break;
case 13:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240348));
applyFlag = true;
stateFlag = false;
}
break;
case 14:
if (isDial1Medium()) {
addResponse(getDialogueId(240568));
applyFlag = true;
stateFlag = false;
}
break;
case 15:
if (sentence->localWord("magazine")) {
addAssignedRoomDialogue3();
stateFlag = true;
}
break;
case 17:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240401));
applyFlag = true;
stateFlag = false;
}
break;
case 18:
if (!isDial0Low() || !isDial1Low()) {
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240402));
applyFlag = true;
stateFlag = false;
}
}
break;
case 19:
if (!isDial0Low() && searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240403));
applyFlag = true;
stateFlag = false;
}
break;
case 20:
if (!isDial1Medium() && searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240548));
applyFlag = true;
}
break;
case 21:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240382));
applyFlag = true;
stateFlag = false;
}
break;
case 22:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240383));
applyFlag = true;
stateFlag = false;
}
break;
case 23:
if (isDial0Medium() && searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240384));
applyFlag = true;
stateFlag = false;
}
break;
case 24:
setDialRegion(0, 0);
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240548));
applyFlag = true;
}
break;
case 25:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240349));
applyFlag = true;
stateFlag = false;
}
break;
case 26:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240350));
applyFlag = true;
stateFlag = false;
}
break;
case 27:
case 30:
case 33:
case 36:
case 40:
case 43:
case 46:
case 50:
case 55:
case 58:
case 61:
case 68:
case 73:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240548));
applyFlag = true;
}
break;
case 28:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240373));
applyFlag = true;
stateFlag = false;
}
break;
case 29:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240374));
applyFlag = true;
stateFlag = false;
}
break;
case 31:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240346));
applyFlag = true;
stateFlag = false;
}
break;
case 32:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240347));
applyFlag = true;
stateFlag = false;
}
break;
case 34:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240376));
applyFlag = true;
stateFlag = false;
}
break;
case 35:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240377));
applyFlag = true;
stateFlag = false;
}
break;
case 37:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240369));
applyFlag = true;
stateFlag = false;
}
break;
case 38:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240370));
applyFlag = true;
stateFlag = false;
}
break;
case 39:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240371));
applyFlag = true;
stateFlag = false;
}
break;
case 41:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240352));
applyFlag = true;
stateFlag = false;
}
break;
case 42:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240353));
applyFlag = true;
stateFlag = false;
}
break;
case 44:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240389));
applyFlag = true;
stateFlag = false;
}
break;
case 45:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240390));
applyFlag = true;
stateFlag = false;
}
break;
case 47:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240395));
applyFlag = true;
stateFlag = false;
}
break;
case 48:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240396));
applyFlag = true;
stateFlag = false;
}
break;
case 49:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240397));
applyFlag = true;
stateFlag = false;
}
break;
case 51:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240363));
applyFlag = true;
stateFlag = false;
}
break;
case 52:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240364));
applyFlag = true;
stateFlag = false;
}
break;
case 53:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240365));
applyFlag = true;
stateFlag = false;
}
break;
case 54:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240366));
applyFlag = true;
stateFlag = false;
}
break;
case 56:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240392));
applyFlag = true;
stateFlag = false;
}
break;
case 57:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240393));
applyFlag = true;
stateFlag = false;
}
break;
case 59:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240386));
applyFlag = true;
stateFlag = false;
}
break;
case 60:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240387));
applyFlag = true;
stateFlag = false;
}
break;
case 62:
if (isDial1Medium() && getValue(1) == 1) {
if (isDial0Medium()) {
if (sentence->localWord("down")) {
addResponse(getDialogueId(240413));
applyFlag = true;
}
} else if (sentence->contains("left") || sentence->contains("right")) {
addResponse(getDialogueId(240415));
CTrueTalkManager::triggerAction(sentence->localWord("down") ? 22 : 23, 0);
} else {
addResponse(getDialogueId(240414));
applyFlag = true;
}
}
break;
case 63:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240836));
applyFlag = true;
stateFlag = false;
}
break;
case 64:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240837));
applyFlag = true;
stateFlag = false;
}
break;
case 65:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240838));
applyFlag = true;
stateFlag = false;
}
break;
case 66:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240839));
applyFlag = true;
stateFlag = false;
}
break;
case 67:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(240840));
applyFlag = true;
stateFlag = false;
}
break;
case 69:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(241104));
applyFlag = true;
stateFlag = false;
}
break;
case 70:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(241105));
applyFlag = true;
stateFlag = false;
}
break;
case 71:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(241106));
applyFlag = true;
stateFlag = false;
}
break;
case 72:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(241107));
applyFlag = true;
stateFlag = false;
}
break;
case 74:
case 75:
if (sentence->_category == 24) {
addResponse(getDialogueId(240972));
applyFlag = true;
} else if (sentence->localWord("good") || sentence->localWord("yes")
|| sentence->localWord("well") || sentence->localWord("ill")
|| sentence->localWord("sad")) {
addResponse(getDialogueId(240805));
applyFlag = true;
}
break;
case 76:
if (sentence->_category == 6) {
addResponse(getDialogueId(240767));
applyFlag = true;
stateFlag = false;
}
break;
case 77:
if (sentence->_category == 3) {
addResponse(getDialogueId(241109));
applyFlag = true;
stateFlag = false;
}
break;
case 78:
// "Do you have a reservation?"
if (sentence->_category == 11 || sentence->_category == 13) {
// Player said they have a reservation
addResponse(getDialogueId(241262));
} else if (sentence->_category == 12 ||
(g_language != Common::DE_DEU && sentence->contains("do not"))) {
// Player said they don't have a reservation
setDialRegion(0, 0);
setDialRegion(1, 0);
addResponse(getDialogueId(241268));
addAskBreakfast();
} else if (sentence->contains("skip")) {
// WORKAROUND: Added 'skip' to allow skipping entire checkin
addAssignedRoom();
setState(0);
CTrueTalkManager::setFlags(CURRENT_STATE, 0);
} else {
// Player didn't say yes or no
addResponse(getDialogueId(240745));
}
applyFlag = true;
stateFlag = false;
break;
case 79:
switch (checkCommonWords(sentence)) {
case 1:
addResponse(getDialogueId(241263));
break;
case 2:
addResponse(getDialogueId(241266));
break;
case 3:
addAssignedRoom();
setState(0);
CTrueTalkManager::setFlags(CURRENT_STATE, 0);
return 2;
default:
addResponse(getDialogueId(241267));
break;
}
addAskBreakfast();
applyFlag = true;
stateFlag = false;
break;
case 81:
addResponse(getDialogueId(sentence->_category == 12 ? 240602 : 241337));
applyResponse();
setState(0);
CTrueTalkManager::setFlags(CURRENT_STATE, 0);
return 2;
case 82:
if (sentence->_category == 2) {
addResponse(getDialogueId(241339));
applyFlag = true;
}
break;
case 83:
if ((isDial1Medium() && isDial0Low()) ||
(isDial1Low() && isDial0Medium())) {
if (sentence->localWord("yes") || sentence->localWord("but")) {
if (sentence->localWord("will") || sentence->localWord("do")) {
addResponse(getDialogueId(241366));
applyFlag = true;
}
}
}
break;
case 84:
if (sentence->_category == 12 || sentence->contains("vegetarian")
|| sentence->contains("vegitarian")) {
addResponse(getDialogueId(241718));
addResponse(getDialogueId(241709));
applyFlag = true;
stateFlag = false;
} else if (sentence->contains("continental")
|| sentence->contains("kontinent")
|| sentence->contains("full")
|| sentence->contains("porky")
|| sentence->contains("the 1")
|| sentence->contains("the 2")
|| sentence->contains("former")
|| sentence->contains("latter")
|| sentence->contains("speck")
|| sentence->contains("wurst")
|| sentence->contains("englisch")
) {
addResponse(getDialogueId(241717));
addResponse(getDialogueId(241709));
applyFlag = true;
stateFlag = false;
} else {
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241707));
addResponse(getDialogueId(241719));
applyFlag = true;
stateFlag = false;
}
break;
case 85:
if (sentence->_category == 12 || sentence->contains("bugle")
|| sentence->contains("buggle") || sentence->contains("trumpet")
|| sentence->contains("saxophone") || sentence->contains("kazoo")
|| sentence->contains("blerontin 1") || sentence->contains("the 1")
|| sentence->contains("the 2") || sentence->contains("the 3")
|| sentence->contains("the 4") || sentence->contains("all of them")
|| sentence->contains("the lot") || sentence->contains("buegelhorn")
|| sentence->contains("bugelhorn") || sentence->contains("trompete")
|| sentence->contains("saxophon") || sentence->contains("popanz")
) {
addResponse(getDialogueId(241710));
addResponse(getDialogueId(241713));
} else {
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241707));
addResponse(getDialogueId(241711));
}
applyFlag = true;
stateFlag = false;
break;
case 86:
if (sentence->_category == 12 || sentence->_category == 11
|| sentence->contains(TRANSLATE("view", "aussicht"))) {
addResponse(getDialogueId(241714));
addResponse(getDialogueId(241699));
} else {
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241707));
if (getRandomNumber(100) < 50) {
addResponse(getDialogueId(241715));
} else {
addResponse(getDialogueId(241712));
addResponse(getDialogueId(241713));
}
}
applyFlag = true;
stateFlag = false;
break;
case 87:
if (sentence->contains("corner") || sentence->contains("on the end")
|| sentence->contains("balcony") || sentence->contains("neither")
|| sentence->contains("the 1") || sentence->contains("the 2")
|| sentence->contains("former") || sentence->contains("latter")
|| sentence->contains("either") || sentence->contains("suedlage")
|| sentence->contains("balkon")) {
addResponse(getDialogueId(241700));
addResponse(getDialogueId(241687));
} else {
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241707));
addResponse(getDialogueId(241701));
addResponse(getDialogueId(241699));
}
applyFlag = true;
stateFlag = false;
break;
case 88:
if (sentence->contains("imperial") || sentence->contains(TRANSLATE("the 1", "fuerstlich"))) {
addResponse(getDialogueId(241700));
addResponse(getDialogueId(241739));
} else if (sentence->contains("royal") || sentence->contains(TRANSLATE("the 2", "majest"))) {
addResponse(getDialogueId(241690));
} else if (sentence->contains("despotic") || sentence->contains("despot")
|| sentence->contains("the last") || sentence->contains("latter")) {
addResponse(getDialogueId(241688));
} else if (sentence->contains("president") || sentence->contains("presidential")
|| sentence->contains("the 3") || sentence->contains("praesident")) {
addResponse(getDialogueId(241689));
addResponse(getDialogueId(241739));
} else {
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241707));
addResponse(getDialogueId(241692));
}
applyFlag = true;
stateFlag = false;
break;
case 89:
if (sentence->contains("king")) {
addResponse(getDialogueId(241691));
} else if (sentence->contains("queen") || sentence->contains("prince")
|| sentence->contains("princess") || sentence->contains("small")
|| sentence->contains("the 1") || sentence->contains("the 2")
|| sentence->contains("the 3") || sentence->contains("the 4")
|| sentence->contains("big") || sentence->contains("large")
|| sentence->contains("prinz") || sentence->contains("gross")) {
addResponse(getDialogueId(241700));
addResponse(getDialogueId(241739));
} else {
if (getRandomNumber(100) < 100 && sentence2C(sentence))
addResponse(getDialogueId(241707));
addResponse(getDialogueId(241690));
}
applyFlag = true;
stateFlag = false;
break;
case 90:
if (sentence->contains("constitutional") || sentence->contains("const")
|| sentence->contains("absolute") || sentence->contains("small")
|| sentence->contains("the 1") || sentence->contains("the 2")
|| sentence->contains("big") || sentence->contains("large")
|| sentence->contains("verfassung") || sentence->contains("absolut")
|| sentence->contains("gross")) {
addResponse(getDialogueId(241700));
addResponse(getDialogueId(241739));
} else {
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241708));
addResponse(getDialogueId(241691));
}
applyFlag = true;
stateFlag = false;
break;
case 91:
if (sentence->contains("benev") || sentence->contains("dict")
|| sentence->contains("small") || sentence->contains("the 1")
|| sentence->contains("the 2") || sentence->contains("big")
|| sentence->contains("large") || sentence->contains("former")
|| sentence->contains("latter")
|| sentence->contains("aufgekl") || sentence->contains("diktator")
|| sentence->contains("gross")) {
addResponse(getDialogueId(241700));
addResponse(getDialogueId(241739));
} else {
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241708));
addResponse(getDialogueId(241688));
}
applyFlag = true;
stateFlag = false;
break;
case 92:
case 93:
// "Fish?"
if (sentence->_category == 11 || sentence->_category == 13) {
// Yes
addResponse(getDialogueId(241077));
addResponse(getDialogueId(241706));
} else if (sentence->_category == 12) {
// No
addAssignedRoom();
setState(0);
CTrueTalkManager::setFlags(CURRENT_STATE, 0);
return 2;
} else if (g_vm->_trueTalkManager->_quotes.find(sentence->_initialLine.c_str())
== MKTAG('F', 'I', 'S', 'H')) {
// WORKAROUND: Original passed _normalizedLine, but "fish" is one of the common
// phrases replaced with with alternative text "completelyrandom"
addResponse(getDialogueId(240877));
addResponse(getDialogueId(241706));
}else {
// All other responses
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241707));
addResponse(getDialogueId(241705));
if (getRandomNumber(100) < 80)
addResponse(getDialogueId(241739));
}
applyFlag = true;
stateFlag = false;
break;
case 94:
if (sentence->contains("seperate") || sentence->contains("separate")
|| sentence->contains("detached") || sentence->contains("outside")
|| sentence->contains("onsweet") || sentence->contains("ensuite")
|| sentence->contains("suite") || sentence->contains("next door")
|| sentence->contains("the 1") || sentence->contains("the 2")
|| sentence->contains("former") || sentence->contains("latter")
|| sentence->contains("same room") || sentence->contains("ohne")
|| sentence->contains("mit") || sentence->contains("die gleiche kabine")
|| sentence->contains("dieselbe kabine")) {
addAssignedRoom();
setState(0);
CTrueTalkManager::setFlags(CURRENT_STATE, 0);
return 2;
} else {
if (getRandomNumber(100) < 80 && sentence2C(sentence))
addResponse(getDialogueId(241707));
addResponse(getDialogueId(241706));
applyFlag = true;
stateFlag = false;
}
break;
case 95:
if (isDial1Medium()) {
if ((sentence->localWord("i") && sentence->localWord("am"))
|| sentence->localWord("me")) {
addResponse(getDialogueId(240632));
applyFlag = true;
stateFlag = false;
}
}
break;
case 96:
if (sentence->_category == 2) {
addResponse(getDialogueId(241350));
applyFlag = true;
stateFlag = false;
}
break;
case 97:
if (searchQuotes(roomScript, sentence)) {
addResponse(getDialogueId(241351));
applyFlag = true;
stateFlag = false;
}
break;
default:
break;
}
if (applyFlag)
applyResponse();
if (stateFlag) {
setState(0);
CTrueTalkManager::setFlags(CURRENT_STATE, 0);
}
return applyFlag ? 2 : 1;
}
int DeskbotScript::searchQuotes(const TTroomScript *roomScript, const TTsentence *sentence) {
TTtreeResult treeResult[32];
return g_vm->_trueTalkManager->_quotesTree.search(sentence->_normalizedLine.c_str(),
TREE_2, &treeResult[0], 0, 0) != -1;
}
int DeskbotScript::checkCommonWords(const TTsentence *sentence) {
if (sentence->contains("xyzzy"))
return 3;
const TTquotes &quotes = g_vm->_trueTalkManager->_quotes;
if (quotes._loaded) {
uint tagId = quotes.find(sentence->_normalizedLine.c_str());
if (tagId == MKTAG('F', 'U', 'L', 'N')
|| tagId == MKTAG('T', 'D', 'V', 'P')
|| tagId == MKTAG('H', 'E', 'R', 'O')
|| sentence->contains("douglas adam"))
return 1;
else if (tagId == MKTAG('J', 'N', 'A', 'M')
|| tagId == MKTAG('N', 'I', 'K', 'N')
|| tagId == MKTAG('B', 'O', 'Y', 'S')
|| tagId == MKTAG('G', 'I', 'R', 'L'))
return 2;
} else {
if (sentence->contains("douglas adams")
|| sentence->contains("shaikh")
|| sentence->contains("millican")
|| sentence->contains("williams")
|| sentence->contains("henkes")
|| sentence->contains("kenny"))
return 1;
else if (sentence->contains("richard")
|| sentence->contains("jason")
|| sentence->contains("mike")
|| sentence->contains("renata"))
return 2;
}
return 0;
}
void DeskbotScript::addAskBreakfast() {
addResponse(getDialogueId(241716));
}
void DeskbotScript::addAssignedRoom() {
addResponse(getDialogueId(241696));
addResponse(getDialogueId(241697));
CTrueTalkManager::setFlags(1, 3);
CTrueTalkManager::triggerAction(19, 3);
CTrueTalkManager::setFlags(22, 1);
int roomNum = 1, floorNum = 1, elevatorNum = 1;
getAssignedRoom(&roomNum, &floorNum, &elevatorNum);
addResponse(getDialogueId(241313 + elevatorNum));
addResponse(getDialogueId(241271 + floorNum));
addResponse(getDialogueId(241317 + roomNum));
addResponse(getDialogueId(241698));
applyResponse();
}
} // End of namespace Titanic