1 //Copyright Paul Reiche, Fred Ford. 1992-2002
2
3 /*
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19 #include "../commall.h"
20 #include "resinst.h"
21 #include "strings.h"
22
23 #include "uqm/build.h"
24 #include "uqm/gameev.h"
25
26
27 static LOCDATA utwig_desc =
28 {
29 NULL, /* init_encounter_func */
30 NULL, /* post_encounter_func */
31 NULL, /* uninit_encounter_func */
32 UTWIG_PMAP_ANIM, /* AlienFrame */
33 UTWIG_FONT, /* AlienFont */
34 WHITE_COLOR_INIT, /* AlienTextFColor */
35 BLACK_COLOR_INIT, /* AlienTextBColor */
36 {0, 0}, /* AlienTextBaseline */
37 0, /* SIS_TEXT_WIDTH - 16, */ /* AlienTextWidth */
38 ALIGN_CENTER, /* AlienTextAlign */
39 VALIGN_MIDDLE, /* AlienTextValign */
40 UTWIG_COLOR_MAP, /* AlienColorMap */
41 UTWIG_MUSIC, /* AlienSong */
42 NULL_RESOURCE, /* AlienAltSong */
43 0, /* AlienSongFlags */
44 UTWIG_CONVERSATION_PHRASES, /* PlayerPhrases */
45 16, /* NumAnimations */
46 { /* AlienAmbientArray (ambient animations) */
47 {
48 4, /* StartIndex */
49 3, /* NumFrames */
50 YOYO_ANIM, /* AnimFlags */
51 ONE_SECOND / 15, ONE_SECOND / 30, /* FrameRate */
52 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
53 0, /* BlockMask */
54 },
55 {
56 7, /* StartIndex */
57 4, /* NumFrames */
58 YOYO_ANIM, /* AnimFlags */
59 ONE_SECOND / 15, ONE_SECOND / 30, /* FrameRate */
60 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
61 (1 << 2), /* BlockMask */
62 },
63 {
64 11, /* StartIndex */
65 2, /* NumFrames */
66 YOYO_ANIM
67 | WAIT_TALKING, /* AnimFlags */
68 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
69 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
70 (1 << 1), /* BlockMask */
71 },
72 {
73 13, /* StartIndex */
74 5, /* NumFrames */
75 CIRCULAR_ANIM, /* AnimFlags */
76 ONE_SECOND / 12, 0, /* FrameRate */
77 ONE_SECOND / 12, 0, /* RestartRate */
78 0, /* BlockMask */
79 },
80 {
81 18, /* StartIndex */
82 2, /* NumFrames */
83 RANDOM_ANIM, /* AnimFlags */
84 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
85 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
86 0, /* BlockMask */
87 },
88 {
89 20, /* StartIndex */
90 2, /* NumFrames */
91 RANDOM_ANIM, /* AnimFlags */
92 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
93 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
94 0, /* BlockMask */
95 },
96 {
97 22, /* StartIndex */
98 3, /* NumFrames */
99 RANDOM_ANIM, /* AnimFlags */
100 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
101 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
102 0, /* BlockMask */
103 },
104 {
105 25, /* StartIndex */
106 2, /* NumFrames */
107 RANDOM_ANIM, /* AnimFlags */
108 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
109 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
110 0, /* BlockMask */
111 },
112 {
113 27, /* StartIndex */
114 3, /* NumFrames */
115 YOYO_ANIM, /* AnimFlags */
116 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
117 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
118 0, /* BlockMask */
119 },
120 {
121 30, /* StartIndex */
122 2, /* NumFrames */
123 RANDOM_ANIM, /* AnimFlags */
124 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
125 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
126 0, /* BlockMask */
127 },
128 {
129 32, /* StartIndex */
130 2, /* NumFrames */
131 RANDOM_ANIM, /* AnimFlags */
132 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
133 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
134 0, /* BlockMask */
135 },
136 {
137 34, /* StartIndex */
138 2, /* NumFrames */
139 RANDOM_ANIM, /* AnimFlags */
140 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
141 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
142 0, /* BlockMask */
143 },
144 {
145 36, /* StartIndex */
146 2, /* NumFrames */
147 RANDOM_ANIM, /* AnimFlags */
148 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
149 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
150 0, /* BlockMask */
151 },
152 {
153 38, /* StartIndex */
154 2, /* NumFrames */
155 RANDOM_ANIM, /* AnimFlags */
156 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
157 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
158 0, /* BlockMask */
159 },
160 {
161 40, /* StartIndex */
162 2, /* NumFrames */
163 RANDOM_ANIM, /* AnimFlags */
164 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
165 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
166 0, /* BlockMask */
167 },
168 {
169 42, /* StartIndex */
170 3, /* NumFrames */
171 YOYO_ANIM, /* AnimFlags */
172 ONE_SECOND * 2 / 15, ONE_SECOND / 30, /* FrameRate */
173 ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
174 0, /* BlockMask */
175 },
176 },
177 { /* AlienTransitionDesc */
178 0, /* StartIndex */
179 0, /* NumFrames */
180 0, /* AnimFlags */
181 0, 0, /* FrameRate */
182 0, 0, /* RestartRate */
183 0, /* BlockMask */
184 },
185 { /* AlienTalkDesc */
186 1, /* StartIndex */
187 3, /* NumFrames */
188 0, /* AnimFlags */
189 ONE_SECOND / 20, ONE_SECOND / 20, /* FrameRate */
190 ONE_SECOND * 7 / 60, ONE_SECOND / 2, /* RestartRate */
191 0, /* BlockMask */
192 },
193 NULL, /* AlienNumberSpeech - none */
194 /* Filler for loaded resources */
195 NULL, NULL, NULL,
196 NULL,
197 NULL,
198 };
199
200 static void
ExitConversation(RESPONSE_REF R)201 ExitConversation (RESPONSE_REF R)
202 {
203 setSegue (Segue_peace);
204
205 if (PLAYER_SAID (R, bye_neutral))
206 NPCPhrase (GOODBYE_NEUTRAL);
207 else if (PLAYER_SAID (R, bye_after_space))
208 NPCPhrase (GOODBYE_AFTER_SPACE);
209 else if (PLAYER_SAID (R, bye_before_space))
210 NPCPhrase (GOODBYE_BEFORE_SPACE);
211 else if (PLAYER_SAID (R, bye_allied_homeworld))
212 NPCPhrase (GOODBYE_ALLIED_HOMEWORLD);
213 else if (PLAYER_SAID (R, bye_bomb))
214 NPCPhrase (GOODBYE_BOMB);
215 else if (PLAYER_SAID (R, demand_bomb))
216 {
217 NPCPhrase (GUARDS_FIGHT);
218
219 setSegue (Segue_hostile);
220 }
221 else if (PLAYER_SAID (R, got_ultron)
222 || PLAYER_SAID (R, hey_wait_got_ultron))
223 {
224 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
225 {
226 NPCPhrase (NO_ULTRON_AT_BOMB);
227
228 SET_GAME_STATE (REFUSED_ULTRON_AT_BOMB, 1);
229 }
230 else
231 {
232 if (PLAYER_SAID (R, got_ultron))
233 NPCPhrase (DONT_WANT_TO_LOOK);
234 else
235 NPCPhrase (TAUNT_US_BUT_WE_LOOK);
236 if (GET_GAME_STATE (ULTRON_CONDITION) < 4)
237 {
238 switch (GET_GAME_STATE (UTWIG_INFO))
239 {
240 case 0:
241 if (PLAYER_SAID (R, got_ultron))
242 NPCPhrase (SICK_TRICK_1);
243 else
244 {
245 NPCPhrase (TRICKED_US_1);
246
247 setSegue (Segue_hostile);
248 }
249 break;
250 case 1:
251 if (PLAYER_SAID (R, got_ultron))
252 NPCPhrase (SICK_TRICK_2);
253 else
254 {
255 NPCPhrase (TRICKED_US_2);
256
257 setSegue (Segue_hostile);
258 }
259 break;
260 }
261 SET_GAME_STATE (UTWIG_INFO, 1);
262 }
263 else
264 {
265 NPCPhrase (HAPPY_DAYS);
266 if (GET_GAME_STATE (KOHR_AH_FRENZY))
267 NPCPhrase (TOO_LATE);
268 else
269 {
270 NPCPhrase (OK_ATTACK_KOHRAH);
271
272 AddEvent (RELATIVE_EVENT, 0, 0, 0, ADVANCE_UTWIG_SUPOX_MISSION);
273 }
274
275 SET_GAME_STATE (UTWIG_HAVE_ULTRON, 1);
276 SET_GAME_STATE (ULTRON_CONDITION, 5);
277
278 SET_GAME_STATE (UTWIG_VISITS, 0);
279 SET_GAME_STATE (SUPOX_VISITS, 0);
280 SET_GAME_STATE (UTWIG_HOME_VISITS, 0);
281 SET_GAME_STATE (SUPOX_HOME_VISITS, 0);
282 SET_GAME_STATE (BOMB_VISITS, 0);
283
284 SET_GAME_STATE (SUPOX_INFO, 0);
285 SET_GAME_STATE (UTWIG_INFO, 0);
286 SET_GAME_STATE (SUPOX_WAR_NEWS, 0);
287 SET_GAME_STATE (UTWIG_WAR_NEWS, 0);
288 SET_GAME_STATE (SUPOX_HOSTILE, 0);
289 SET_GAME_STATE (UTWIG_HOSTILE, 0);
290
291 SetRaceAllied (UTWIG_SHIP, TRUE);
292 SetRaceAllied (SUPOX_SHIP, TRUE);
293 }
294 }
295 }
296 else if (PLAYER_SAID (R, can_you_help))
297 {
298 NPCPhrase (HOW_HELP);
299 if (EscortFeasibilityStudy (UTWIG_SHIP) == 0)
300 NPCPhrase (DONT_NEED);
301 else
302 {
303 NPCPhrase (HAVE_4_SHIPS);
304
305 AlienTalkSegue ((COUNT)~0);
306 AddEscortShips (UTWIG_SHIP, 4);
307 }
308 }
309 }
310
311 static void AlliedHome (RESPONSE_REF R);
312
313 static void
AlliedHome(RESPONSE_REF R)314 AlliedHome (RESPONSE_REF R)
315 {
316 BYTE NumVisits, News;
317
318 News = GET_GAME_STATE (UTWIG_WAR_NEWS);
319 NumVisits = GET_GAME_STATE (UTWIG_SUPOX_MISSION);
320 if (PLAYER_SAID (R, how_went_war))
321 {
322 NPCPhrase (ABOUT_BATTLE);
323
324 News |= (1 << 0);
325 }
326 else if (PLAYER_SAID (R, how_goes_war))
327 {
328 if (NumVisits == 1)
329 {
330 NPCPhrase (FLEET_ON_WAY);
331
332 SET_GAME_STATE (UTWIG_WAR_NEWS, 1);
333 }
334 else switch (GET_GAME_STATE (UTWIG_WAR_NEWS))
335 {
336 case 0:
337 NPCPhrase (BATTLE_HAPPENS_1);
338 News = 1;
339 break;
340 case 1:
341 NPCPhrase (BATTLE_HAPPENS_2);
342 News = 2;
343 break;
344 }
345
346 DISABLE_PHRASE (how_goes_war);
347 }
348 else if (PLAYER_SAID (R, learn_new_info))
349 {
350 if (NumVisits < 5)
351 NPCPhrase (NO_NEW_INFO);
352 else
353 {
354 NPCPhrase (SAMATRA);
355
356 News |= (1 << 1);
357 }
358
359 DISABLE_PHRASE (learn_new_info);
360 }
361 else if (PLAYER_SAID (R, what_now_homeworld))
362 {
363 if (NumVisits < 5)
364 NPCPhrase (UP_TO_YOU);
365 else
366 NPCPhrase (HOPE_KILL_EACH_OTHER);
367
368 DISABLE_PHRASE (what_now_homeworld);
369 }
370 else if (PLAYER_SAID (R, how_is_ultron))
371 {
372 NPCPhrase (ULTRON_IS_GREAT);
373
374 DISABLE_PHRASE (how_is_ultron);
375 }
376 SET_GAME_STATE (UTWIG_WAR_NEWS, News);
377
378 if (NumVisits >= 5)
379 {
380 if (!(News & (1 << 0)))
381 Response (how_went_war, AlliedHome);
382 }
383 else if (PHRASE_ENABLED (how_goes_war)
384 && ((NumVisits == 1 && News == 0)
385 || (NumVisits && News < 2)))
386 Response (how_goes_war, AlliedHome);
387 if (PHRASE_ENABLED (learn_new_info))
388 Response (learn_new_info, AlliedHome);
389 if (PHRASE_ENABLED (what_now_homeworld))
390 Response (what_now_homeworld, AlliedHome);
391 if (PHRASE_ENABLED (how_is_ultron))
392 Response (how_is_ultron, AlliedHome);
393 if (NumVisits == 0 && EscortFeasibilityStudy (UTWIG_SHIP) != 0)
394 Response (can_you_help, ExitConversation);
395 Response (bye_allied_homeworld, ExitConversation);
396 }
397
398 static void
BeforeKohrAh(RESPONSE_REF R)399 BeforeKohrAh (RESPONSE_REF R)
400 {
401 BYTE NumVisits;
402
403 if (PLAYER_SAID (R, whats_up_before_space))
404 {
405 NumVisits = GET_GAME_STATE (UTWIG_INFO);
406 switch (NumVisits++)
407 {
408 case 0:
409 NPCPhrase (GENERAL_INFO_BEFORE_SPACE_1);
410 break;
411 case 1:
412 NPCPhrase (GENERAL_INFO_BEFORE_SPACE_2);
413 --NumVisits;
414 break;
415 }
416 SET_GAME_STATE (UTWIG_INFO, NumVisits);
417
418 DISABLE_PHRASE (whats_up_before_space);
419 }
420 else if (PLAYER_SAID (R, what_now_before_space))
421 {
422 NPCPhrase (DO_THIS_BEFORE_SPACE);
423
424 DISABLE_PHRASE (what_now_before_space);
425 }
426
427 if (PHRASE_ENABLED (whats_up_before_space))
428 Response (whats_up_before_space, BeforeKohrAh);
429 if (PHRASE_ENABLED (what_now_before_space))
430 Response (what_now_before_space, BeforeKohrAh);
431 Response (bye_before_space, ExitConversation);
432 }
433
434 static void
AfterKohrAh(RESPONSE_REF R)435 AfterKohrAh (RESPONSE_REF R)
436 {
437 BYTE NumVisits;
438
439 if (PLAYER_SAID (R, whats_up_after_space))
440 {
441 NumVisits = GET_GAME_STATE (UTWIG_INFO);
442 switch (NumVisits++)
443 {
444 case 0:
445 NPCPhrase (GENERAL_INFO_AFTER_SPACE_1);
446 break;
447 case 1:
448 NPCPhrase (GENERAL_INFO_AFTER_SPACE_2);
449 --NumVisits;
450 break;
451 }
452 SET_GAME_STATE (UTWIG_INFO, NumVisits);
453
454 DISABLE_PHRASE (whats_up_after_space);
455 }
456 else if (PLAYER_SAID (R, what_now_after_space))
457 {
458 NPCPhrase (DO_THIS_AFTER_SPACE);
459
460 DISABLE_PHRASE (what_now_after_space);
461 }
462
463 if (PHRASE_ENABLED (whats_up_after_space))
464 Response (whats_up_after_space, AfterKohrAh);
465 if (PHRASE_ENABLED (what_now_after_space))
466 Response (what_now_after_space, AfterKohrAh);
467 Response (bye_after_space, ExitConversation);
468 }
469
470 static void
NeutralUtwig(RESPONSE_REF R)471 NeutralUtwig (RESPONSE_REF R)
472 {
473 BYTE i, LastStack;
474 RESPONSE_REF pStr[4];
475
476 LastStack = 0;
477 pStr[0] = pStr[1] = pStr[2] = pStr[3] = 0;
478 if (PLAYER_SAID (R, we_are_vindicator0))
479 {
480 NPCPhrase (WOULD_BE_HAPPY_BUT);
481
482 SET_GAME_STATE (UTWIG_STACK1, 1);
483 }
484 else if (PLAYER_SAID (R, why_sad))
485 {
486 NPCPhrase (ULTRON_BROKE);
487
488 SET_GAME_STATE (UTWIG_STACK1, 2);
489 }
490 else if (PLAYER_SAID (R, what_ultron))
491 {
492 NPCPhrase (GLORIOUS_ULTRON);
493
494 SET_GAME_STATE (UTWIG_STACK1, 3);
495 }
496 else if (PLAYER_SAID (R, dont_be_babies))
497 {
498 NPCPhrase (MOCK_OUR_PAIN);
499
500 setSegue (Segue_hostile);
501 SET_GAME_STATE (UTWIG_STACK1, 4);
502 SET_GAME_STATE (UTWIG_HOSTILE, 1);
503 SET_GAME_STATE (UTWIG_INFO, 0);
504 SET_GAME_STATE (UTWIG_HOME_VISITS, 0);
505 SET_GAME_STATE (UTWIG_VISITS, 0);
506 SET_GAME_STATE (BOMB_VISITS, 0);
507 return;
508 }
509 else if (PLAYER_SAID (R, real_sorry_about_ultron))
510 {
511 NPCPhrase (APPRECIATE_SYMPATHY);
512
513 SET_GAME_STATE (UTWIG_STACK1, 4);
514 return;
515 }
516 else if (PLAYER_SAID (R, what_about_you_1))
517 {
518 NPCPhrase (ABOUT_US_1);
519
520 LastStack = 2;
521 SET_GAME_STATE (UTWIG_WAR_NEWS, 1);
522 }
523 else if (PLAYER_SAID (R, what_about_you_2))
524 {
525 NPCPhrase (ABOUT_US_2);
526
527 LastStack = 2;
528 StartSphereTracking (SUPOX_SHIP);
529 SET_GAME_STATE (UTWIG_WAR_NEWS, 2);
530 }
531 else if (PLAYER_SAID (R, what_about_you_3))
532 {
533 NPCPhrase (ABOUT_US_3);
534
535 SET_GAME_STATE (UTWIG_WAR_NEWS, 3);
536 }
537 else if (PLAYER_SAID (R, what_about_urquan_1))
538 {
539 NPCPhrase (ABOUT_URQUAN_1);
540
541 LastStack = 3;
542 SET_GAME_STATE (UTWIG_STACK2, 1);
543 }
544 else if (PLAYER_SAID (R, what_about_urquan_2))
545 {
546 NPCPhrase (ABOUT_URQUAN_2);
547
548 SET_GAME_STATE (UTWIG_STACK2, 2);
549 }
550
551 switch (GET_GAME_STATE (UTWIG_STACK1))
552 {
553 case 0:
554 {
555 UNICODE buf[ALLIANCE_NAME_BUFSIZE];
556
557 GetAllianceName (buf, name_1);
558 construct_response (
559 shared_phrase_buf,
560 we_are_vindicator0,
561 GLOBAL_SIS (CommanderName),
562 we_are_vindicator1,
563 buf,
564 we_are_vindicator2,
565 (UNICODE*)NULL);
566 }
567 pStr[0] = we_are_vindicator0;
568 break;
569 case 1:
570 pStr[0] = why_sad;
571 break;
572 case 2:
573 pStr[0] = what_ultron;
574 break;
575 case 3:
576 pStr[0] = dont_be_babies;
577 pStr[1] = real_sorry_about_ultron;
578 break;
579 }
580 switch (GET_GAME_STATE (UTWIG_WAR_NEWS))
581 {
582 case 0:
583 pStr[2] = what_about_you_1;
584 break;
585 case 1:
586 pStr[2] = what_about_you_2;
587 break;
588 case 2:
589 pStr[2] = what_about_you_3;
590 break;
591 }
592 switch (GET_GAME_STATE (UTWIG_STACK2))
593 {
594 case 0:
595 pStr[2] = what_about_urquan_1;
596 break;
597 case 1:
598 pStr[2] = what_about_urquan_2;
599 break;
600 }
601
602 if (pStr[LastStack])
603 {
604 if (pStr[LastStack] != we_are_vindicator0)
605 Response (pStr[LastStack], NeutralUtwig);
606 else
607 DoResponsePhrase (pStr[LastStack], NeutralUtwig, shared_phrase_buf);
608 }
609 for (i = 0; i < 4; ++i)
610 {
611 if (i != LastStack && pStr[i])
612 {
613 if (pStr[i] != we_are_vindicator0)
614 Response (pStr[i], NeutralUtwig);
615 else
616 DoResponsePhrase (pStr[i], NeutralUtwig, shared_phrase_buf);
617 }
618 }
619 if (GET_GAME_STATE (ULTRON_CONDITION))
620 Response (got_ultron, ExitConversation);
621 Response (bye_neutral, ExitConversation);
622 }
623
624 static void
BombWorld(RESPONSE_REF R)625 BombWorld (RESPONSE_REF R)
626 {
627 BYTE LastStack;
628 RESPONSE_REF pStr[2];
629
630 LastStack = 0;
631 pStr[0] = pStr[1] = 0;
632 if (PLAYER_SAID (R, why_you_here))
633 {
634 NPCPhrase (WE_GUARD_BOMB);
635
636 SET_GAME_STATE (BOMB_STACK1, 1);
637 }
638 else if (PLAYER_SAID (R, what_about_bomb))
639 {
640 NPCPhrase (ABOUT_BOMB);
641
642 SET_GAME_STATE (BOMB_STACK1, 2);
643 }
644 else if (PLAYER_SAID (R, give_us_bomb_or_die))
645 {
646 NPCPhrase (GUARDS_WARN);
647
648 SET_GAME_STATE (BOMB_STACK1, 3);
649 }
650 else if (PLAYER_SAID (R, demand_bomb))
651 {
652 NPCPhrase (GUARDS_FIGHT);
653
654 setSegue (Segue_hostile);
655 SET_GAME_STATE (UTWIG_HOSTILE, 1);
656 SET_GAME_STATE (UTWIG_INFO, 0);
657 SET_GAME_STATE (UTWIG_HOME_VISITS, 0);
658 SET_GAME_STATE (UTWIG_VISITS, 0);
659 SET_GAME_STATE (BOMB_VISITS, 0);
660 return;
661 }
662 else if (PLAYER_SAID (R, may_we_have_bomb))
663 {
664 NPCPhrase (NO_BOMB);
665
666 LastStack = 1;
667 SET_GAME_STATE (BOMB_STACK2, 1);
668 }
669 else if (PLAYER_SAID (R, please))
670 {
671 NPCPhrase (SORRY_NO_BOMB);
672
673 SET_GAME_STATE (BOMB_STACK2, 2);
674 }
675 else if (PLAYER_SAID (R, whats_up_bomb))
676 {
677 if (GET_GAME_STATE (BOMB_INFO))
678 NPCPhrase (GENERAL_INFO_BOMB_2);
679 else
680 {
681 NPCPhrase (GENERAL_INFO_BOMB_1);
682
683 SET_GAME_STATE (BOMB_INFO, 1);
684 }
685
686 DISABLE_PHRASE (whats_up_bomb);
687 }
688
689 switch (GET_GAME_STATE (BOMB_STACK2))
690 {
691 case 0:
692 pStr[1] = may_we_have_bomb;
693 break;
694 case 1:
695 pStr[1] = please;
696 break;
697 }
698 switch (GET_GAME_STATE (BOMB_STACK1))
699 {
700 case 0:
701 pStr[0] = why_you_here;
702 pStr[1] = 0;
703 break;
704 case 1:
705 pStr[0] = what_about_bomb;
706 pStr[1] = 0;
707 break;
708 case 2:
709 pStr[0] = give_us_bomb_or_die;
710 break;
711 case 3:
712 pStr[0] = demand_bomb;
713 break;
714 }
715
716 if (pStr[LastStack])
717 Response (pStr[LastStack], BombWorld);
718 LastStack ^= 1;
719 if (pStr[LastStack])
720 Response (pStr[LastStack], BombWorld);
721
722 if (PHRASE_ENABLED (whats_up_bomb) && (GET_GAME_STATE (BOMB_STACK1) > 1))
723 Response (whats_up_bomb, BombWorld);
724
725 if (GET_GAME_STATE (ULTRON_CONDITION)
726 && !GET_GAME_STATE (REFUSED_ULTRON_AT_BOMB))
727 Response (got_ultron, ExitConversation);
728
729 if (GET_GAME_STATE (BOMB_INFO))
730 {
731 Response (bye_bomb, ExitConversation);
732 }
733 else
734 {
735 Response (bye_neutral, ExitConversation);
736 }
737 }
738
739 static void
Intro(void)740 Intro (void)
741 {
742 BYTE NumVisits;
743
744 if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
745 {
746 NPCPhrase (OUT_TAKES);
747
748 setSegue (Segue_peace);
749 return;
750 }
751
752 if (GET_GAME_STATE (UTWIG_HOSTILE))
753 {
754 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
755 {
756 NumVisits = GET_GAME_STATE (BOMB_VISITS);
757 switch (NumVisits++)
758 {
759 case 0:
760 NPCPhrase (HOSTILE_BOMB_HELLO_1);
761 break;
762 case 1:
763 NPCPhrase (HOSTILE_BOMB_HELLO_2);
764 --NumVisits;
765 break;
766 }
767 SET_GAME_STATE (BOMB_VISITS, NumVisits);
768 }
769 else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
770 {
771 NumVisits = GET_GAME_STATE (UTWIG_HOME_VISITS);
772 switch (NumVisits++)
773 {
774 case 0:
775 NPCPhrase (HOSTILE_HOMEWORLD_HELLO_1);
776 break;
777 case 1:
778 NPCPhrase (HOSTILE_HOMEWORLD_HELLO_2);
779 --NumVisits;
780 break;
781 }
782 SET_GAME_STATE (UTWIG_HOME_VISITS, NumVisits);
783 }
784 else
785 {
786 NumVisits = GET_GAME_STATE (UTWIG_VISITS);
787 switch (NumVisits++)
788 {
789 case 0:
790 NPCPhrase (HOSTILE_SPACE_HELLO_1);
791 break;
792 case 1:
793 NPCPhrase (HOSTILE_SPACE_HELLO_2);
794 --NumVisits;
795 break;
796 }
797 SET_GAME_STATE (UTWIG_VISITS, NumVisits);
798 }
799
800 if (!GET_GAME_STATE (ULTRON_CONDITION)
801 || (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6)))
802 {
803 setSegue (Segue_hostile);
804 }
805 else
806 {
807 Response (hey_wait_got_ultron, ExitConversation);
808 }
809 }
810 else if (CheckAlliance (UTWIG_SHIP) == GOOD_GUY)
811 {
812 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
813 {
814 NumVisits = GET_GAME_STATE (UTWIG_HOME_VISITS);
815 switch (NumVisits++)
816 {
817 case 0:
818 NPCPhrase (ALLIED_HOMEWORLD_HELLO_1);
819 break;
820 case 1:
821 NPCPhrase (ALLIED_HOMEWORLD_HELLO_2);
822 break;
823 case 2:
824 NPCPhrase (ALLIED_HOMEWORLD_HELLO_3);
825 break;
826 case 3:
827 NPCPhrase (ALLIED_HOMEWORLD_HELLO_4);
828 --NumVisits;
829 break;
830 }
831 SET_GAME_STATE (UTWIG_HOME_VISITS, NumVisits);
832
833 AlliedHome ((RESPONSE_REF)0);
834 }
835 else
836 {
837 NumVisits = GET_GAME_STATE (UTWIG_SUPOX_MISSION);
838 if (NumVisits == 1)
839 {
840 NumVisits = GET_GAME_STATE (UTWIG_VISITS);
841 switch (NumVisits++)
842 {
843 case 0:
844 NPCPhrase (HELLO_BEFORE_KOHRAH_SPACE_1);
845 break;
846 case 1:
847 NPCPhrase (HELLO_BEFORE_KOHRAH_SPACE_2);
848 --NumVisits;
849 break;
850 }
851 SET_GAME_STATE (UTWIG_VISITS, NumVisits);
852
853 BeforeKohrAh ((RESPONSE_REF)0);
854 }
855 else if (NumVisits < 5)
856 {
857 NumVisits = GET_GAME_STATE (UTWIG_VISITS);
858 switch (NumVisits++)
859 {
860 case 0:
861 NPCPhrase (HELLO_DURING_KOHRAH_SPACE_1);
862 break;
863 case 1:
864 NPCPhrase (HELLO_DURING_KOHRAH_SPACE_2);
865 --NumVisits;
866 break;
867 }
868 SET_GAME_STATE (UTWIG_VISITS, NumVisits);
869 }
870 else
871 {
872 NumVisits = GET_GAME_STATE (UTWIG_VISITS);
873 switch (NumVisits++)
874 {
875 case 0:
876 NPCPhrase (HELLO_AFTER_KOHRAH_SPACE_1);
877 break;
878 case 1:
879 NPCPhrase (HELLO_AFTER_KOHRAH_SPACE_2);
880 --NumVisits;
881 break;
882 }
883 SET_GAME_STATE (UTWIG_VISITS, NumVisits);
884
885 AfterKohrAh ((RESPONSE_REF)0);
886 }
887 }
888 }
889 else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
890 {
891 NumVisits = GET_GAME_STATE (BOMB_VISITS);
892 switch (NumVisits++)
893 {
894 case 0:
895 NPCPhrase (BOMB_WORLD_HELLO_1);
896 break;
897 case 1:
898 NPCPhrase (BOMB_WORLD_HELLO_2);
899 --NumVisits;
900 break;
901 }
902 SET_GAME_STATE (BOMB_VISITS, NumVisits);
903
904 BombWorld ((RESPONSE_REF)0);
905 }
906 else
907 {
908 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
909 {
910 NumVisits = GET_GAME_STATE (UTWIG_HOME_VISITS);
911 switch (NumVisits++)
912 {
913 case 0:
914 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_1);
915 break;
916 case 1:
917 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_2);
918 break;
919 case 2:
920 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_3);
921 break;
922 case 3:
923 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_4);
924 --NumVisits;
925 break;
926 }
927 SET_GAME_STATE (UTWIG_HOME_VISITS, NumVisits);
928 }
929 else
930 {
931 NumVisits = GET_GAME_STATE (UTWIG_VISITS);
932 switch (NumVisits++)
933 {
934 case 0:
935 NPCPhrase (NEUTRAL_SPACE_HELLO_1);
936 break;
937 case 1:
938 NPCPhrase (NEUTRAL_SPACE_HELLO_2);
939 --NumVisits;
940 break;
941 }
942 SET_GAME_STATE (UTWIG_VISITS, NumVisits);
943 }
944
945 NeutralUtwig ((RESPONSE_REF)0);
946 }
947 }
948
949 static COUNT
uninit_utwig(void)950 uninit_utwig (void)
951 {
952 return (0);
953 }
954
955 static void
post_utwig_enc(void)956 post_utwig_enc (void)
957 {
958 // nothing defined so far
959 }
960
961 LOCDATA*
init_utwig_comm(void)962 init_utwig_comm (void)
963 {
964 LOCDATA *retval;
965
966 utwig_desc.init_encounter_func = Intro;
967 utwig_desc.post_encounter_func = post_utwig_enc;
968 utwig_desc.uninit_encounter_func = uninit_utwig;
969
970 utwig_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
971 utwig_desc.AlienTextBaseline.y = 70;
972 utwig_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
973
974 if (GET_GAME_STATE (UTWIG_HAVE_ULTRON))
975 { // use alternate 'Happy Utwig!' track
976 utwig_desc.AlienAltSongRes = UTWIG_ULTRON_MUSIC;
977 utwig_desc.AlienSongFlags |= LDASF_USE_ALTERNATE;
978 }
979 else
980 { // regular track -- let's make sure
981 utwig_desc.AlienSongFlags &= ~LDASF_USE_ALTERNATE;
982 }
983
984 if (GET_GAME_STATE (UTWIG_HAVE_ULTRON)
985 || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
986 {
987 setSegue (Segue_peace);
988 }
989 else
990 {
991 setSegue (Segue_hostile);
992 }
993 retval = &utwig_desc;
994
995 return (retval);
996 }
997