1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #include "common/textconsole.h"
24 #include "titanic/true_talk/barbot_script.h"
25 #include "titanic/true_talk/true_talk_manager.h"
26 #include "titanic/titanic.h"
27 #include "titanic/translation.h"
28 
29 namespace Titanic {
30 
31 static const int STATE_ARRAY_EN[7] = {
32 	51888, 51890, 51891, 51892, 51893, 51894, 51895
33 };
34 static const int STATE_ARRAY_DE[7] = {
35 	51903, 51905, 51906, 51907, 51908, 51909, 51910
36 };
37 
38 static const uint ARRAY1_EN[23] = {
39 	0, 50033, 50044, 50045, 50046, 50047, 50048, 50049,
40 	50050, 50051, 50034, 50035, 50036, 50037, 50038, 50039,
41 	50040, 50041, 50042, 50043, 50411, 0
42 };
43 static const uint ARRAY1_DE[23] = {
44 	0, 50033, 50044, 50045, 50046, 50047, 50048, 50049, 50050,
45 	50051, 50034, 50035, 50036, 50037, 50038, 50039, 50040,
46 	50041, 50042, 50043, 50421, 0, 0
47 };
48 
49 static const uint ARRAY2_EN[10] = {
50 	51899, 51900, 51901, 51902, 51903, 51904, 51905, 51906, 51907, 0
51 };
52 static const uint ARRAY2_DE[10] = {
53 	51914, 51915, 51916, 51917, 51918, 51919, 51920, 51921, 51922, 0
54 };
55 
BarbotScript(int val1,const char * charClass,int v2,const char * charName,int v3,int val2,int v4,int v5,int v6,int v7)56 BarbotScript::BarbotScript(int val1, const char *charClass, int v2,
57 		const char *charName, int v3, int val2, int v4, int v5, int v6, int v7) :
58 		TTnpcScript(val1, charClass, v2, charName, v3, val2, v4, v5, v6, v7) {
59 	_state = 0;
60 	_arrIndex = 0;
61 
62 	loadRanges("Ranges/Barbot");
63 	loadResponses("Responses/Barbot");
64 	setupSentences();
65 	_tagMappings.load("TagMap/Barbot");
66 	_quotes.load("Quotes/Barbot");
67 	_states.load("States/Barbot");
68 	_preResponses.load("PreResponses/Barbot");
69 }
70 
setupSentences()71 void BarbotScript::setupSentences() {
72 	for (int idx = 28; idx < 35; ++idx)
73 		CTrueTalkManager::setFlags(idx, 0);
74 	setupDials(100, 100, 100);
75 
76 	if (!_currentDialNum)
77 		_currentDialNum = 2;
78 
79 	_mappings.load("Mappings/Barbot", 8);
80 	_entries.load("Sentences/Barbot");
81 	_entries2.load("Sentences/Barbot2");
82 	_words.load("Words/Barbot");
83 }
84 
chooseResponse(const TTroomScript * roomScript,const TTsentence * sentence,uint tag)85 int BarbotScript::chooseResponse(const TTroomScript *roomScript, const TTsentence *sentence, uint tag) {
86 	if (tag == MKTAG('D', 'N', 'A', '1') || tag == MKTAG('H', 'H', 'G', 'Q') ||
87 			tag == MKTAG('A', 'N', 'S', 'W') || tag == MKTAG('S', 'U', 'M', 'S')) {
88 		if (_state < 7) {
89 			addResponse(TRANSLATE(STATE_ARRAY_EN[_state++], STATE_ARRAY_DE[_state++]));
90 		} else {
91 			selectResponse(TRANSLATE(51896, 51911));
92 			setState(1);
93 			_state = 0;
94 		}
95 
96 		applyResponse();
97 		return 2;
98 
99 	} else if (tag == MKTAG('S', 'W', 'E', 'R')) {
100 		adjustDial(0, -18);
101 		adjustDial(1, -5);
102 
103 		if (getRandomNumber(100) > 50) {
104 			addResponse(getDialogueId(getDialRegion(0) == 0 ? 250200 : 250062));
105 			applyResponse();
106 			return 2;
107 		}
108 
109 	} else if (tag == MKTAG('B', 'A', 'R', 'K') && getRandomNumber(100) > 50) {
110 		selectResponse(250025);
111 		switch (getDialsBitset()) {
112 		case 4:
113 		case 6:
114 			addResponse(getDialogueId(250125));
115 			break;
116 		default:
117 			break;
118 		}
119 
120 		applyResponse();
121 		return 2;
122 
123 	} else if (tag == MKTAG('B', 'A', 'R', 'U') && getRandomNumber(100) > 50) {
124 		selectResponse(250025);
125 		switch (getDialsBitset()) {
126 		case 4:
127 		case 6:
128 			addResponse(getDialogueId(250112));
129 			break;
130 		default:
131 			break;
132 		}
133 
134 		applyResponse();
135 		return 2;
136 	}
137 
138 	if (tag == MKTAG('T', 'H', 'R', 'T') || tag == MKTAG('S', 'L', 'O', 'W') ||
139 			tag == MKTAG('S', 'E', 'X', '1') || tag == MKTAG('P', 'K', 'U', 'P')) {
140 		adjustDial(0, -7);
141 		adjustDial(1, -3);
142 	}
143 
144 	return TTnpcScript::chooseResponse(roomScript, sentence, tag);
145 }
146 
process(const TTroomScript * roomScript,const TTsentence * sentence)147 int BarbotScript::process(const TTroomScript *roomScript, const TTsentence *sentence) {
148 	int dialogueId = 0;
149 
150 	if (roomScript->_scriptId != 112)
151 		return 2;
152 
153 	checkItems(roomScript, sentence);
154 	if (isState9()) {
155 		if (sentence->localWord("visioncenter") || sentence->localWord("brain") ||
156 				sentence->contains("vision") || sentence->contains("visual") ||
157 				sentence->contains("brain") || sentence->contains("crystal") ||
158 				sentence->contains("gesichtsmodul") || sentence->contains("sehmodul") ||
159 				sentence->contains("gesichtszentrum") || sentence->contains("hirn") ||
160 				sentence->contains("hirnstueck")
161 			) {
162 			if (CTrueTalkManager::getStateValue(2)) {
163 				addResponse(getDialogueId(251003));
164 				applyResponse();
165 				CTrueTalkManager::triggerAction(6, 0);
166 				return 2;
167 			}
168 		}
169 
170 		if (sentence->contains("goldfish") || sentence->contains("goldfisch")) {
171 			addResponse(getDialogueId(250184));
172 			applyResponse();
173 			return 2;
174 		}
175 
176 		dialogueId = TRANSLATE(ARRAY1_EN[getRandomNumber(20)], ARRAY1_DE[getRandomNumber(20)]);
177 		if (!TRANSLATE(ARRAY2_EN[_arrIndex], ARRAY2_DE[_arrIndex]))
178 			_arrIndex = 0;
179 
180 		if (_arrIndex) {
181 			dialogueId = TRANSLATE(ARRAY2_EN[_arrIndex++], ARRAY2_DE[_arrIndex++]);
182 		} else if (getRandomNumber(100) > 35) {
183 			dialogueId = TRANSLATE(ARRAY2_EN[0], ARRAY2_DE[0]);
184 			_arrIndex = 1;
185 		} else if (getRandomNumber(100) > 60) {
186 			switch (sentence->_category) {
187 			case 2:
188 				dialogueId = TRANSLATE(51914, 51929);
189 				break;
190 			case 3:
191 				dialogueId = TRANSLATE(51911, 51926);
192 				break;
193 			case 4:
194 				dialogueId = TRANSLATE(51913, 51928);
195 				break;
196 			case 5:
197 				dialogueId = TRANSLATE(51912, 51927);
198 				break;
199 			case 6:
200 				dialogueId = TRANSLATE(51915, 51930);
201 				break;
202 			case 7:
203 				dialogueId = TRANSLATE(51909, 51924);
204 				break;
205 			default:
206 				break;
207 			}
208 		}
209 
210 		addResponse(dialogueId);
211 		if (getRandomNumber(100) > 65)
212 			addResponse(getDialogueId(251250));
213 		applyResponse();
214 		return 2;
215 	}
216 
217 	CTrueTalkManager::setFlags(29, getValue(29) - 1);
218 	CTrueTalkManager::setFlags(30, getValue(30) - 1);
219 	CTrueTalkManager::setFlags(31, getValue(31) - 1);
220 	CTrueTalkManager::setFlags(32, getValue(32) - 1);
221 	CTrueTalkManager::setFlags(33, getValue(33) - 1);
222 	CTrueTalkManager::setFlags(34, getValue(34) - 1);
223 
224 	TTtreeResult treeResult[32];
225 	int val34 = getState();
226 	setState(0);
227 
228 	int val2C = sentence->_category;
229 	bool flag = val2C == 11 || val2C == 13;
230 	bool flag2 = val2C == 12;
231 
232 	if (!val34) {
233 		goto done;
234 	} else if (val34 > TRANSLATE(50357, 50366)) {
235 		goto done;
236 	} else if (val34 == TRANSLATE(50357, 50366)) {
237 		return applySentenceIds(TRANSLATE(50358, 50367), -1);
238 	}
239 
240 	switch (val34) {
241 	case 1:
242 		if (flag)
243 			return applySentenceIds(TRANSLATE(51898, 51913), 2);
244 		if (flag2)
245 			return applySentenceIds(TRANSLATE(51897, 51912));
246 		break;
247 	case 2:
248 		if (flag)
249 			return applySentenceIds(TRANSLATE(51897, 51912));
250 		break;
251 	case 3:
252 		if (sentence->localWord("useless") || sentence->contains("useless") ||
253 				sentence->contains("hoffnungsloser fall"))
254 			return applySentenceIds(TRANSLATE(50824, 50837));
255 		break;
256 	case 4:
257 		if (flag)
258 			return applySentenceIds(getRandomBit() ?
259 				TRANSLATE(50512, 50522) : TRANSLATE(51642, 51657));
260 		else if (flag2)
261 			return applySentenceIds(getRandomBit() ?
262 				TRANSLATE(50511, 50521) : TRANSLATE(51643, 51658));
263 		break;
264 	case 5:
265 		if (flag)
266 			return applySentenceIds(TRANSLATE(50829, 50842), 6);
267 		if (flag2)
268 			return applySentenceIds(TRANSLATE(50828, 50841));
269 		break;
270 	case 6:
271 		if (flag)
272 			return applySentenceIds(TRANSLATE(50831, 50844));
273 		if (flag2)
274 			return applySentenceIds(TRANSLATE(50830, 50843));
275 		break;
276 	case 7:
277 		if (flag2 || sentence->contains("never") || sentence->contains("niemals") ||
278 				sentence->contains("nie"))
279 			return applySentenceIds(TRANSLATE(51553, 51568));
280 		if (flag || sentence->contains("nicest") || sentence->contains("schoenste"))
281 			return applySentenceIds(TRANSLATE(51554, 51569));
282 		break;
283 	case 8:
284 		if (flag)
285 			return applySentenceIds(TRANSLATE(50961, 50974));
286 		if (flag2)
287 			return applySentenceIds(TRANSLATE(50960, 50973));
288 		break;
289 	case 9:
290 		if (flag)
291 			return applySentenceIds(getDialogueId(251858));
292 		break;
293 	case 10:
294 		if (flag)
295 			return applySentenceIds(getDialogueId(251014));
296 		else if (flag2)
297 			return applySentenceIds(getDialogueId(251013));
298 		break;
299 	case 11:
300 		if (flag)
301 			return applySentenceIds(getDialogueId(251008));
302 		else if (flag2)
303 			return applySentenceIds(getDialogueId(251007));
304 		break;
305 	case 12:
306 		if (flag)
307 			return applySentenceIds(getDialogueId(250656));
308 		else if (flag2)
309 			return applySentenceIds(getDialogueId(250655));
310 		break;
311 	case 13:
312 		if (flag)
313 			return applySentenceIds(getDialogueId(250614));
314 		else if (flag2)
315 			return applySentenceIds(getDialogueId(250613));
316 		break;
317 	case 14:
318 		if (val2C == 6)
319 			return applySentenceIds(getDialogueId(250946));
320 		break;
321 	case 15:
322 		if (flag || sentence->contains("or") || sentence->contains("oder")) {
323 			return applySentenceIds(getDialogueId(250526), 16);
324 		} else {
325 			if (g_vm->_trueTalkManager->_quotesTree.search(
326 					sentence->_normalizedLine.c_str(), TREE_3, &treeResult[0], 0, nullptr) != -1) {
327 				uint newId = getDialogueId(250526);
328 				return applySentenceIds(newId, 16);
329 			}
330 		}
331 		break;
332 	case 17:
333 		if (flag) {
334 			return applySentenceIds(TRANSLATE(50382, 50391));
335 		} else if (flag2) {
336 			return applySentenceIds(TRANSLATE(51423, 51438));
337 		}
338 		// Intentional fall-through
339 
340 	case 16:
341 		if (val2C == 7 || val2C == 10)
342 			return applySentenceIds(getDialogueId(250525));
343 		break;
344 	case 18:
345 		return applySentenceIds(getDialogueId(250589));
346 	case 19:
347 		return applySentenceIds(getDialogueId(250565), 20);
348 	case 20:
349 		if (flag)
350 			return applySentenceIds(TRANSLATE(50307, 50315));
351 		if (flag2)
352 			return applySentenceIds(TRANSLATE(50306, 50314));
353 		break;
354 	case 21:
355 		if (flag)
356 			return applySentenceIds(TRANSLATE(50359, 50368));
357 		if (flag2)
358 			return applySentenceIds(TRANSLATE(50357, 50366));
359 		break;
360 	case 23:
361 		if (val2C == 6 || val2C == 10)
362 			return applySentenceIds(getDialogueId(250551));
363 		break;
364 	case 24:
365 		if (sentence->contains("do not know")
366 				|| sentence->contains("no idea")
367 				|| sentence->contains("a clue")
368 				|| sentence->contains("keine ahnung")
369 				|| sentence->contains("weiss nicht")
370 				|| sentence->contains("keinen schimmer")) {
371 			return applySentenceIds(getDialogueId(250553));
372 		} else {
373 			return applySentenceIds(getDialogueId(250552));
374 		}
375 		break;
376 	case 25:
377 		if (flag || val2C == 10)
378 			applySentenceIds(getDialogueId(251899), 26);
379 		else if (flag2)
380 			return applySentenceIds(TRANSLATE(50215, 50223));
381 		break;
382 	case 26:
383 		if (g_vm->_trueTalkManager->_quotesTree.search(
384 				sentence->_normalizedLine.c_str(), TREE_3, &treeResult[0], 0, nullptr) != -1)
385 			return applySentenceIds(getDialogueId(251899), 26);
386 		break;
387 
388 	case 27:
389 		if (flag)
390 			return applySentenceIds(getDialogueId(250766));
391 		else if (flag2)
392 			return applySentenceIds(getDialogueId(250764));
393 		break;
394 	case 28:
395 		return applySentenceIds(getDialogueId(250765));
396 	case 29:
397 		return applySentenceIds(getDialogueId(250652));
398 	case 30:
399 		return applySentenceIds(getDialogueId(250653));
400 	case 31:
401 		if (flag)
402 			return applySentenceIds(getDialogueId(250664));
403 		else if (flag2)
404 			return applySentenceIds(getDialogueId(250663));
405 		break;
406 	case 32:
407 		if (flag)
408 			return applySentenceIds(getDialogueId(250643));
409 		else if (flag2)
410 			return applySentenceIds(getDialogueId(250642));
411 		break;
412 	case 33:
413 		return applySentenceIds(TRANSLATE(50763, 50776));
414 	case 34:
415 		if (flag)
416 			return applySentenceIds(getDialogueId(251622));
417 		else if (flag2)
418 			return applySentenceIds(getDialogueId(251624));
419 		break;
420 	case 35:
421 		if (val2C == 6 || val2C == 10)
422 			return applySentenceIds(getDialogueId(251623));
423 		break;
424 	case 36:
425 		if (flag)
426 			return applySentenceIds(TRANSLATE(50335, 50344));
427 		if (flag2)
428 			return applySentenceIds(TRANSLATE(50334, 50343));
429 		break;
430 	case 37:
431 		if (flag)
432 			return applySentenceIds(TRANSLATE(50217, 50225));
433 		if (flag2)
434 			return applySentenceIds(TRANSLATE(50153, 50157));
435 		break;
436 	case 38:
437 		return applySentenceIds(getDialogueId(250637));
438 	case 39:
439 		return applySentenceIds(getDialogueId(250638));
440 	case 40:
441 		return applySentenceIds(getDialogueId(250639));
442 	case 41:
443 		return applySentenceIds(getDialogueId(250640));
444 	case 42:
445 		if (flag)
446 			return applySentenceIds(getDialogueId(250676));
447 		else if (flag2)
448 			return applySentenceIds(getDialogueId(250673));
449 		break;
450 	case 43:
451 		if (flag)
452 			return applySentenceIds(TRANSLATE(50416, 50426), -1);
453 		if (flag2)
454 			return applySentenceIds(TRANSLATE(50415, 50425), -1);
455 		break;
456 	case 44:
457 		if (flag)
458 			return applySentenceIds(getDialogueId(250468));
459 		else if (flag2)
460 			return applySentenceIds(getDialogueId(250413));
461 
462 		if (val2C == 6 || val2C == 10)
463 			return applySentenceIds(getDialogueId(251649));
464 		break;
465 	case 45:
466 		if (sentence->localWord("summer")
467 				|| sentence->contains("summer")
468 				|| sentence->localWord("autumn")
469 				|| sentence->contains("autumn")
470 				|| sentence->contains("herbst")) {
471 			return applySentenceIds(TRANSLATE(50743, 50755));
472 		} else if (sentence->localWord("winter") || sentence->contains("winter")) {
473 			return applySentenceIds(TRANSLATE(50696, 50708));
474 		} else {
475 			return applySentenceIds(TRANSLATE(50225, 50233));
476 		}
477 		break;
478 	case 46:
479 		if (val2C == 7 || val2C == 10)
480 			return applySentenceIds(TRANSLATE(50698, 50710));
481 		break;
482 	case 47:
483 		if (flag || flag2 || val2C == 6)
484 			return applySentenceIds(TRANSLATE(50717, 50729));
485 		break;
486 	case 48:
487 		if (flag)
488 			return applySentenceIds(TRANSLATE(50710, 50722));
489 		if (flag2)
490 			return applySentenceIds(TRANSLATE(50225, 50233));
491 		break;
492 	case 49:
493 		if (sentence->localWord("scraliontis") || sentence->contains("scraliontis") ||
494 				sentence->contains("skraliontis"))
495 			return applySentenceIds(TRANSLATE(50711, 50723));
496 		if (sentence->localWord("brobostigon") || sentence->contains("brobostigon"))
497 			return applySentenceIds(TRANSLATE(50712, 50724));
498 		break;
499 	case 50:
500 		return applySentenceIds(TRANSLATE(50713, 50725));
501 	case 51:
502 		if (flag)
503 			return applySentenceIds(TRANSLATE(50715, 50727));
504 		if (flag2)
505 			return applySentenceIds(TRANSLATE(50714, 50726));
506 		break;
507 	case 52:
508 		if (sentence->localWord("note") || sentence->contains("note"))
509 			return applySentenceIds(TRANSLATE(50716, 50728));
510 		return  applySentenceIds(TRANSLATE(50210, 50218));
511 	case 53:
512 		return applySentenceIds(TRANSLATE(50210, 50218));
513 	case 54:
514 		if (getDialRegion(0) != 0) {
515 			if (val2C)
516 				return applySentenceIds(TRANSLATE(50174, 50178));
517 			else
518 				return applySentenceIds(TRANSLATE(50300, 50308));
519 		} else if (val2C == 7 || val2C == 10) {
520 			return applySentenceIds(TRANSLATE(50871, 50884));
521 		}
522 		break;
523 	case 55:
524 		if (flag)
525 			return applySentenceIds(TRANSLATE(50302, 50310));
526 		if (flag2)
527 			return applySentenceIds(TRANSLATE(50301, 50309));
528 		break;
529 	case 56:
530 		if (flag)
531 			return applySentenceIds(TRANSLATE(50304, 50312));
532 		if (flag2)
533 			return applySentenceIds(TRANSLATE(50303, 50311));
534 		break;
535 	case 57:
536 		if (sentence->localWord("mustard")
537 			|| sentence->contains("mustard")
538 			|| sentence->localWord("tomato")
539 			|| sentence->contains("tomato")
540 			|| sentence->contains("senf")
541 			|| sentence->contains("tomate"))
542 			return applySentenceIds(TRANSLATE(50320, 50329));
543 		if (sentence->localWord("sauce")
544 			|| sentence->localWord("puree")
545 			|| sentence->contains("sauce")
546 			|| sentence->contains("puree")
547 			|| sentence->contains("bird")
548 			|| sentence->contains("starling")
549 			|| sentence->contains("sosse")
550 			|| sentence->contains("pueree")
551 			|| sentence->contains("vogel")
552 			|| sentence->contains("staren")) {
553 			applySentenceIds(TRANSLATE(50321, 50330));
554 			CTrueTalkManager::triggerAction(30, 0);
555 			return 2;
556 		}
557 
558 		return applySentenceIds(TRANSLATE(50320, 50329));
559 	case 58:
560 		if (val2C == 6 || val2C == 10)
561 			return applySentenceIds(TRANSLATE(50880, 50893));
562 		break;
563 	case 59:
564 		if (flag) {
565 			if (addRandomResponse(true)) {
566 				setState(59);
567 				return 2;
568 			}
569 		} else if (flag2) {
570 			return applySentenceIds(getDialogueId(251754));
571 		}
572 		break;
573 	case 60:
574 		if (flag && addRandomResponse(true)) {
575 			setState(59);
576 			return 2;
577 		} else if (flag2 || val2C == 7 || val2C == 10) {
578 			return applySentenceIds(getDialogueId(251712));
579 		}
580 		break;
581 	case 61:
582 		if (val2C == 3) {
583 			if (sentence->localWord("loop"))
584 				return applySentenceIds(getDialogueId(250269));
585 			else if (sentence->localWord("do"))
586 				return applySentenceIds(getDialogueId(250270));
587 		} else if (val2C == 7) {
588 			return applySentenceIds(getDialogueId(250270));
589 		} else if (flag) {
590 			return applySentenceIds(getDialogueId(250270));
591 		}
592 
593 		return applySentenceIds(getDialogueId(250272));
594 	case 62:
595 		if (flag
596 				|| (val2C == 3 && sentence->localWord("do"))
597 				|| val2C == 7
598 				|| sentence->localWord("help"))
599 			return applySentenceIds(getDialogueId(250270));
600 
601 		return applySentenceIds(getDialogueId(2570272));
602 	case 63:
603 		if (flag
604 				|| (val2C == 3 || sentence->localWord("do"))
605 				|| val2C == 7
606 				|| sentence->localWord("help"))
607 			return applySentenceIds(getDialogueId(250271));
608 
609 		return applySentenceIds(getDialogueId(250272));
610 	case 64:
611 		if (flag || val2C == 3 || val2C == 8)
612 			return applySentenceIds(getDialogueId(250631));
613 		break;
614 	case 65:
615 		if (sentence->localWord("now") || sentence->localWord("soon"))
616 			return applySentenceIds(getDialogueId(250424));
617 		return applySentenceIds(getDialogueId(250506));
618 	case 66:
619 		if (flag || sentence->localWord("good") || sentence->localWord("well"))
620 			return applySentenceIds(getDialogueId(251027));
621 		return applySentenceIds(getDialogueId(251021));
622 	case 67:
623 		if (flag || val2C == 6 || val2C == 10) {
624 			setDial(0, getDialLevel(0, false) - 8);
625 			return applySentenceIds(getDialogueId(251589));
626 		}
627 		break;
628 	case 68:
629 		if (flag || val2C == 6 || val2C == 10) {
630 			setDial(0, getDialLevel(0, false) - 12);
631 			return applySentenceIds(getDialogueId(251590));
632 		}
633 		break;
634 	case 69:
635 		if (flag || val2C == 6 || val2C == 10) {
636 			setDial(0, getDialLevel(0, false) - 25);
637 			return applySentenceIds(getDialogueId(251591));
638 		}
639 		break;
640 	default:
641 		break;
642 	}
643 
644 done:
645 	// Adjust primary dial
646 	setState(0);
647 	if (sentence->get58() != 5) {
648 		adjustDial(0, sentence->get58() * 4 - 20);
649 	} else if (getDialLevel(0, false) > 65) {
650 		adjustDial(0, -2 - getRandomNumber(7));
651 	} else if (getDialLevel(0, false) < 35) {
652 		adjustDial(0, 2 + getRandomNumber(7));
653 	}
654 
655 	updateCurrentDial(true);
656 
657 	if (sentence->contains("goldfish") || sentence->contains("goldfisch")) {
658 		addResponse(250184);
659 	} else if ((sentence->localWord("puree") || sentence->localWord("pureed"))
660 		&& sentence->localWord("parrot")) {
661 		addResponse(250021);
662 	} else if (sentence->localWord("starling")) {
663 		addResponse(250024);
664 	} else {
665 		if (getRandomNumber(100) > 95 && getDialRegion(2) == 0) {
666 			addResponse(getDialogueId(250210));
667 		}
668 
669 		if (processEntries(&_entries, _entryCount, roomScript, sentence) == 2)
670 			return 2;
671 		if (processEntries(_defaultEntries, 0, roomScript, sentence) != 2
672 				&& !defaultProcess(roomScript, sentence)) {
673 			int dval = 0;
674 			flag = getRandomNumber(100) > 50;
675 			int val;
676 
677 			switch (_field2C) {
678 			case 2:
679 				val = getValue(29);
680 				if (val < 16)
681 					val += 4;
682 				if (val < 9) {
683 					val = val / 2;
684 					dval = 250081 + (flag ? 0 : 267);
685 				}
686 				CTrueTalkManager::setFlags(29, val);
687 				break;
688 
689 			case 3:
690 				val = getValue(30);
691 				if (val < 16)
692 					val += 4;
693 				if (val < 9) {
694 					val = val / 2;
695 					dval = 250081 + (flag ? 0 : 243);
696 				}
697 				CTrueTalkManager::setFlags(30, val);
698 				break;
699 
700 			case 4:
701 				val = getValue(31);
702 				if (val < 16)
703 					val += 4;
704 				if (val < 9) {
705 					val = val / 2;
706 					dval = 250081 + (flag ? 0 : 256);
707 				}
708 				CTrueTalkManager::setFlags(31, val);
709 				break;
710 
711 			case 5:
712 				val = getValue(32);
713 				if (val < 16)
714 					val += 4;
715 				if (val < 9) {
716 					val = val / 2;
717 					dval = 250081 + (flag ? 0 : 251);
718 				}
719 				CTrueTalkManager::setFlags(32, val);
720 				break;
721 
722 			case 6:
723 				val = getValue(33);
724 				if (val < 16)
725 					val += 4;
726 				if (val < 9) {
727 					val = val / 2;
728 					dval = 250081 + (flag ? 0 : 273);
729 				}
730 				CTrueTalkManager::setFlags(33, val);
731 				break;
732 
733 			case 7:
734 				val = getValue(34);
735 				if (val < 16)
736 					val += 4;
737 				if (val < 9) {
738 					val = val / 2;
739 					dval = 250081 + (flag ? 0 : 236);
740 				}
741 				CTrueTalkManager::setFlags(34, val);
742 				break;
743 
744 
745 			case 11:
746 				addResponse(getDialogueId(250463));
747 				applyResponse();
748 				return 2;
749 
750 			case 12:
751 				addResponse(getDialogueId(250455));
752 				applyResponse();
753 				return 2;
754 
755 			case 13:
756 				addResponse(getDialogueId(250447));
757 				applyResponse();
758 				return 2;
759 
760 			case 19:
761 				return applySentenceIds(getDialogueId(getDialRegion(0) ? 250062 : 250200));
762 
763 			default:
764 				break;
765 			}
766 
767 			if (dval) {
768 				adjustDial(0, -9);
769 				adjustDial(1, -2);
770 
771 				if (dval != 250081) {
772 					selectResponse(250286);
773 					selectResponse(250296);
774 					selectResponse(250307);
775 					applyResponse();
776 					return 2;
777 				}
778 			} else if (processEntries(&_entries2, 0, roomScript, sentence) == 2) {
779 				return 2;
780 			}
781 
782 			addResponse(getDialogueId(250082 + (getRandomNumber(100) <= 89 ? 128 : 0)));
783 		}
784 	}
785 
786 	applyResponse();
787 	return 2;
788 }
789 
scriptChanged(const TTroomScript * roomScript,uint id)790 ScriptChangedResult BarbotScript::scriptChanged(const TTroomScript *roomScript, uint id) {
791 	switch (id) {
792 	case 1:
793 	case 100:
794 		if (!isState9()) {
795 			selectResponse(250210);
796 			applyResponse();
797 		}
798 
799 		adjustDial(0, getRandomBit() ? getRandomNumber(5) * 4 :
800 			-(int)getRandomNumber(5) * 4);
801 		break;
802 
803 	case 3:
804 		if (isState9()) {
805 			selectResponse(250244);
806 			applyResponse();
807 			resetFlags();
808 		} else {
809 			if (!getValue(28) || !fn10(true)) {
810 				addResponse(getDialogueId(251627 + (getValue(28) ? -1034 : 0)));
811 				applyResponse();
812 			}
813 
814 			CTrueTalkManager::setFlags(28, 1);
815 			resetFlags();
816 		}
817 		break;
818 
819 	case 4:
820 		selectResponse(isState9() ? 250141 : 250140);
821 		applyResponse();
822 		adjustDial(2, getDialLevel(2, false) < 50 ? -15 - getRandomNumber(30) :
823 			15 + getRandomNumber(30));
824 
825 		if (getDialRegion(1) != 0 && getRandomNumber(100) > 75)
826 			adjustDial(1, -35);
827 		break;
828 
829 	case 143:
830 		addResponse(getDialogueId(isState9() ? 250577 : 250576));
831 		break;
832 
833 	case 144:
834 		addResponse(getDialogueId(isState9() ? 250577 : 250584));
835 		break;
836 
837 	case 145:
838 		if (isState9()) {
839 			addResponse(getDialogueId(250577));
840 			applyResponse();
841 		} else {
842 			setState(57);
843 		}
844 		break;
845 
846 	case 146:
847 		addResponse(getDialogueId(isState9() ? 250577 : 250574));
848 		break;
849 
850 	case 147:
851 		addResponse(getDialogueId(250579));
852 		break;
853 
854 	default:
855 		break;
856 	}
857 
858 	if (id >= 250000 && id <= 251900) {
859 		if (id > 250571) {
860 			if (id != 250575 && (id == 250586 || id == 251858 || !isState9())) {
861 				addResponse(getDialogueId(id));
862 				applyResponse();
863 			}
864 		} else if (id == 250571 || (id != 250244 && !isState9()) || isState9()) {
865 			addResponse(getDialogueId(id));
866 			applyResponse();
867 		} else {
868 			addResponse(getDialogueId(251018));
869 			applyResponse();
870 		}
871 	}
872 
873 	return SCR_2;
874 }
875 
handleQuote(const TTroomScript * roomScript,const TTsentence * sentence,uint tag1,uint tag2,uint remainder)876 int BarbotScript::handleQuote(const TTroomScript *roomScript, const TTsentence *sentence,
877 		uint tag1, uint tag2, uint remainder) {
878 	switch (tag2) {
879 	case MKTAG('A', 'D', 'V', 'T'):
880 	case MKTAG('A', 'R', 'T', 'I'):
881 	case MKTAG('A', 'R', 'T', 'Y'):
882 	case MKTAG('B', 'R', 'N', 'D'):
883 	case MKTAG('C', 'O', 'M', 'D'):
884 	case MKTAG('D', 'N', 'C', 'E'):
885 	case MKTAG('H', 'B', 'B', 'Y'):
886 	case MKTAG('M', 'A', 'G', 'S'):
887 	case MKTAG('L', 'I', 'T', 'R'):
888 	case MKTAG('M', 'C', 'P', 'Y'):
889 	case MKTAG('M', 'I', 'N', 'S'):
890 	case MKTAG('M', 'U', 'S', 'I'):
891 	case MKTAG('N', 'I', 'K', 'E'):
892 	case MKTAG('S', 'F', 'S', 'F'):
893 	case MKTAG('S', 'O', 'A', 'P'):
894 	case MKTAG('S', 'O', 'N', 'G'):
895 	case MKTAG('S', 'P', 'R', 'T'):
896 	case MKTAG('T', 'E', 'A', 'M'):
897 	case MKTAG('T', 'U', 'S', 'H'):
898 	case MKTAG('W', 'W', 'E', 'B'):
899 		tag2 = MKTAG('E', 'N', 'T', 'N');
900 		break;
901 	case MKTAG('A', 'U', 'T', 'H'):
902 	case MKTAG('B', 'A', 'R', 'K'):
903 	case MKTAG('B', 'L', 'R', '1'):
904 	case MKTAG('B', 'L', 'P', '1'):
905 	case MKTAG('B', 'L', 'P', '2'):
906 	case MKTAG('B', 'L', 'P', '3'):
907 	case MKTAG('B', 'L', 'P', '4'):
908 	case MKTAG('B', 'L', 'T', '1'):
909 	case MKTAG('B', 'L', 'T', '2'):
910 	case MKTAG('B', 'L', 'T', '3'):
911 	case MKTAG('B', 'L', 'T', '4'):
912 	case MKTAG('B', 'L', 'T', '5'):
913 	case MKTAG('B', 'O', 'Y', 'S'):
914 	case MKTAG('C', 'O', 'P', 'S'):
915 	case MKTAG('D', 'C', 'T', 'R'):
916 	case MKTAG('F', 'A', 'M', 'E'):
917 	case MKTAG('F', 'A', 'S', 'H'):
918 	case MKTAG('G', 'I', 'R', 'L'):
919 	case MKTAG('H', 'E', 'R', 'O'):
920 	case MKTAG('H', 'O', 'S', 'T'):
921 	case MKTAG('K', 'N', 'O', 'B'):
922 	case MKTAG('N', 'H', 'R', 'O'):
923 	case MKTAG('R', 'A', 'C', 'E'):
924 	case MKTAG('S', 'C', 'I', 'T'):
925 	case MKTAG('T', 'D', 'V', 'P'):
926 	case MKTAG('T', 'W', 'A', 'T'):
927 	case MKTAG('W', 'E', 'A', 'T'):
928 		tag2 = MKTAG('P', 'R', 'S', 'N');
929 		break;
930 	case MKTAG('C', 'H', 'S', 'E'):
931 	case MKTAG('C', 'M', 'N', 'T'):
932 	case MKTAG('F', 'I', 'L', 'M'):
933 	case MKTAG('J', 'F', 'O', 'D'):
934 	case MKTAG('L', 'I', 'Q', 'D'):
935 		tag2 = MKTAG('F', 'O', 'O', 'D');
936 		break;
937 	case MKTAG('C', 'R', 'M', 'N'):
938 	case MKTAG('C', 'S', 'P', 'Y'):
939 	case MKTAG('U', 'B', 'A', 'D'):
940 		tag2 = MKTAG('V', 'B', 'A', 'D');
941 		break;
942 	case MKTAG('E', 'A', 'R', 'T'):
943 	case MKTAG('H', 'O', 'M', 'E'):
944 	case MKTAG('N', 'P', 'L', 'C'):
945 	case MKTAG('P', 'L', 'A', 'C'):
946 	case MKTAG('P', 'L', 'A', 'N'):
947 		tag2 = MKTAG('P', 'L', 'A', 'C');
948 		break;
949 	case MKTAG('F', 'A', 'U', 'N'):
950 	case MKTAG('F', 'I', 'S', 'H'):
951 	case MKTAG('F', 'L', 'O', 'R'):
952 		tag2 = MKTAG('N', 'A', 'T', 'R');
953 		break;
954 	case MKTAG('H', 'H', 'L', 'D'):
955 	case MKTAG('T', 'O', 'Y', 'S'):
956 	case MKTAG('W', 'E', 'A', 'P'):
957 		tag2 = MKTAG('M', 'A', 'C', 'H');
958 			break;
959 	case MKTAG('M', 'L', 'T', 'Y'):
960 	case MKTAG('P', 'G', 'R', 'P'):
961 	case MKTAG('P', 'T', 'I', 'C'):
962 		tag2 = MKTAG('G', 'R', 'U', 'P');
963 		break;
964 	case MKTAG('P', 'K', 'U', 'P'):
965 	case MKTAG('S', 'E', 'X', '1'):
966 	case MKTAG('S', 'W', 'E', 'R'):
967 		tag2 = MKTAG('R', 'U', 'D', 'E');
968 		break;
969 	case MKTAG('P', 'H', 'I', 'L'):
970 	case MKTAG('R', 'C', 'K', 'T'):
971 	case MKTAG('S', 'C', 'I', 'E'):
972 		tag2 = MKTAG('S', 'C', 'I', 'E');
973 		break;
974 	case MKTAG('T', 'R', 'A', '2'):
975 	case MKTAG('T', 'R', 'A', '3'):
976 		tag2 = MKTAG('T', 'R', 'A', 'V');
977 		break;
978 	default:
979 		break;
980 	}
981 
982 	if (tag1 == 36) {
983 		switch (getValue(1)) {
984 		case 1:
985 			return setResponse(getDialogueId(220837), -1);
986 			break;
987 		case 2:
988 			return setResponse(getDialogueId(220849), -1);
989 		default:
990 			return setResponse(getDialogueId(220858), -1);
991 		}
992 	} else if (tag1 == 61 && getValue(1) > 2) {
993 		return setResponse(getDialogueId(222301), -1);
994 	}
995 
996 	return TTnpcScript::handleQuote(roomScript, sentence, tag1, tag2, remainder);
997 }
998 
updateState(uint oldId,uint newId,int index)999 int BarbotScript::updateState(uint oldId, uint newId, int index) {
1000 	if (newId == 250538) {
1001 		CTrueTalkManager::triggerAction(28, 0);
1002 		return 250538;
1003 	}
1004 	if (newId == 251704) {
1005 		return 251701 + (_field7C ? 3 : 0);
1006 	}
1007 
1008 	for (uint idx = 0; idx < _states.size(); ++idx) {
1009 		const TTupdateState &us = _states[idx];
1010 		if (us._newId == newId) {
1011 			if ((us._dialBits & 1) && !getDialRegion(0))
1012 				continue;
1013 			if ((us._dialBits & 2) && getDialRegion(0))
1014 				continue;
1015 			if ((us._dialBits & 4) && !getDialRegion(1))
1016 				continue;
1017 			if ((us._dialBits & 8) && getDialRegion(1))
1018 				continue;
1019 			if ((us._dialBits & 0x10) && !getDialRegion(2))
1020 				continue;
1021 			if ((us._dialBits & 0x20) && getDialRegion(2))
1022 				continue;
1023 
1024 			setState(us._newValue);
1025 			break;
1026 		}
1027 	}
1028 
1029 	return newId;
1030 }
1031 
preResponse(uint id)1032 int BarbotScript::preResponse(uint id) {
1033 	if (getDialRegion(0) == 0 && getRandomNumber(100) > 80)
1034 		return 251250;
1035 
1036 	return _preResponses.find(id);
1037 }
1038 
getDialsBitset() const1039 uint BarbotScript::getDialsBitset() const {
1040 	uint bits = 0;
1041 	if (!getDialRegion(0))
1042 		bits = 1;
1043 	if (!getDialRegion(1))
1044 		bits |= 2;
1045 	if (getDialRegion(2))
1046 		bits |= 4;
1047 
1048 	return bits;
1049 }
1050 
doSentenceEntry(int val1,const int * srcIdP,const TTroomScript * roomScript,const TTsentence * sentence)1051 int BarbotScript::doSentenceEntry(int val1, const int *srcIdP, const TTroomScript *roomScript, const TTsentence *sentence) {
1052 	uint id = 0;
1053 
1054 	int index = val1;
1055 	if (g_language == Common::DE_DEU && !(val1 >= 512 && val1 <= 515))
1056 		index -= 1000;
1057 
1058 	switch (index) {
1059 	case 2:
1060 		if (getValue(1) != 1)
1061 			return 1;
1062 		break;
1063 
1064 	case 3:
1065 		if (getValue(1) != 2)
1066 			return 1;
1067 		break;
1068 
1069 	case 4:
1070 		if (getValue(1) != 3)
1071 			return 1;
1072 		break;
1073 
1074 	case 5:
1075 		if (getValue(1) == 3)
1076 			return 1;
1077 		break;
1078 
1079 	case 6:
1080 		if (sentence->contains("do not") || sentence->contains("have no") ||
1081 			sentence->contains("got no"))
1082 			return 1;
1083 		break;
1084 
1085 	case 7:
1086 		if (!sentence->contains(TRANSLATE("do not", "idem")) && !sentence->contains(TRANSLATE("have no", "habe kein")) &&
1087 				!sentence->contains("got no"))
1088 			return 1;
1089 		break;
1090 
1091 	case 8:
1092 		if (sentence->_field38 == 2)
1093 			return 1;
1094 		break;
1095 
1096 	case 9: {
1097 		uint val = CTrueTalkManager::getStateValue(3);
1098 		bool lemonFlag = (val & 1) != 0;
1099 		bool puretFlag = (val & 4) != 0;
1100 		bool tvFlag = (val & 8) != 0;
1101 
1102 		if (puretFlag) {
1103 			if (!lemonFlag) {
1104 				id = tvFlag ? 50369 : 250085;
1105 				break;
1106 			} else if (!tvFlag) {
1107 				id = 250627;
1108 			}
1109 		} else {
1110 			if (lemonFlag) {
1111 				id = tvFlag ? 50367 : 50365;
1112 			} else if (tvFlag) {
1113 				id = 50370;
1114 			}
1115 		}
1116 		break;
1117 	}
1118 
1119 	case 10: {
1120 		uint val = CTrueTalkManager::getStateValue(3);
1121 		bool lemonFlag = (val & 1) != 0;
1122 		bool puretFlag = (val & 4) != 0;
1123 		bool tvFlag = (val & 8) != 0;
1124 
1125 		if (lemonFlag && puretFlag && tvFlag) {
1126 			addResponse(getDialogueId(251027));
1127 			applyResponse();
1128 			CTrueTalkManager::triggerAction(7, 0);
1129 			return 2;
1130 		} else {
1131 			if (getDialRegion(1) == 1) {
1132 				if (*srcIdP != 251650)
1133 					id = 251651;
1134 			} else {
1135 				addResponse(getDialRegion(0) != 0 ? 51444 : 51530);
1136 				applyResponse();
1137 				return 2;
1138 			}
1139 		}
1140 		break;
1141 	}
1142 
1143 	case 11:
1144 		if (CTrueTalkManager::getStateValue(2) != 0) {
1145 			CTrueTalkManager::triggerAction(6, 0);
1146 			id = 251003;
1147 		}
1148 		break;
1149 
1150 	case 12:
1151 		if (getDialRegion(1) == 0) {
1152 			addResponse(getDialogueId(251871));
1153 			applyResponse();
1154 			return 2;
1155 		} else if (getRandomNumber(100) > 25 && addRandomResponse(false)) {
1156 			return 2;
1157 		}
1158 		break;
1159 
1160 	case 512:
1161 		if (getValue(4) != 1)
1162 			id = 250738;
1163 		break;
1164 
1165 	case 513:
1166 		if (getValue(4) != 2)
1167 			id = 250738;
1168 		break;
1169 
1170 	case 514:
1171 		if (getValue(4) != 3)
1172 			id = 250738;
1173 		break;
1174 
1175 	case 515:
1176 		if (getValue(4) != 0)
1177 			id = 250738;
1178 		break;
1179 
1180 	default:
1181 		if (g_language == Common::DE_DEU)
1182 			return TTnpcScript::doSentenceEntry(val1, srcIdP, roomScript, sentence);
1183 		break;
1184 	}
1185 
1186 	if (id) {
1187 		addResponse(getDialogueId(id));
1188 		applyResponse();
1189 		return 2;
1190 	}
1191 
1192 	return 0;
1193 }
1194 
setDialRegion(int dialNum,int region)1195 void BarbotScript::setDialRegion(int dialNum, int region) {
1196 	TTnpcScript::setDialRegion(dialNum, region);
1197 	selectResponse(250365);
1198 	applyResponse();
1199 }
1200 
adjustDial(int dialNum,int amount)1201 void BarbotScript::adjustDial(int dialNum, int amount) {
1202 	int level = CLIP(getDialLevel(dialNum) + amount, 0, 100);
1203 	setDial(dialNum, level);
1204 }
1205 
isState9() const1206 bool BarbotScript::isState9() const {
1207 	return CTrueTalkManager::getStateValue(9) != 0;
1208 }
1209 
applySentenceIds(int dialogueId,int v34)1210 int BarbotScript::applySentenceIds(int dialogueId, int v34) {
1211 	addResponse(dialogueId);
1212 	applyResponse();
1213 
1214 	if (v34 != -1) {
1215 		setState(v34);
1216 	} else {
1217 		for (uint idx = 0; idx < _mappings.size(); ++idx) {
1218 			const TTscriptMapping &m = _mappings[idx];
1219 			for (int vidx = 0; vidx < _mappings._valuesPerMapping; ++vidx) {
1220 				if (m._values[vidx] == (uint)dialogueId) {
1221 					updateState(m._id, m._id, vidx);
1222 					break;
1223 				}
1224 			}
1225 		}
1226 	}
1227 
1228 	return -2;
1229 }
1230 
setResponse(int dialogueId,int state)1231 int BarbotScript::setResponse(int dialogueId, int state) {
1232 	addResponse(dialogueId);
1233 	applyResponse();
1234 
1235 	if (state != -1)
1236 		setState(state);
1237 	return 2;
1238 }
1239 
1240 } // End of namespace Titanic
1241