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