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
25
26 static LOCDATA orz_desc =
27 {
28 NULL, /* init_encounter_func */
29 NULL, /* post_encounter_func */
30 NULL, /* uninit_encounter_func */
31 ORZ_PMAP_ANIM, /* AlienFrame */
32 ORZ_FONT, /* AlienFont */
33 WHITE_COLOR_INIT, /* AlienTextFColor */
34 BLACK_COLOR_INIT, /* AlienTextBColor */
35 {0, 0}, /* AlienTextBaseline */
36 0, /* SIS_TEXT_WIDTH - 16, */ /* AlienTextWidth */
37 ALIGN_CENTER, /* AlienTextAlign */
38 VALIGN_TOP, /* AlienTextValign */
39 ORZ_COLOR_MAP, /* AlienColorMap */
40 ORZ_MUSIC, /* AlienSong */
41 NULL_RESOURCE, /* AlienAltSong */
42 0, /* AlienSongFlags */
43 ORZ_CONVERSATION_PHRASES, /* PlayerPhrases */
44 12 /* 13 */, /* NumAnimations */
45 { /* AlienAmbientArray (ambient animations) */
46 {
47 4, /* StartIndex */
48 6, /* NumFrames */
49 CIRCULAR_ANIM, /* AnimFlags */
50 ONE_SECOND / 10, 0, /* FrameRate */
51 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
52 0, /* BlockMask */
53 },
54 {
55 10, /* StartIndex */
56 5, /* NumFrames */
57 CIRCULAR_ANIM, /* AnimFlags */
58 ONE_SECOND / 10, 0, /* FrameRate */
59 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
60 0, /* BlockMask */
61 },
62 {
63 15, /* StartIndex */
64 2, /* NumFrames */
65 RANDOM_ANIM, /* AnimFlags */
66 ONE_SECOND / 10, ONE_SECOND / 10, /* FrameRate */
67 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
68 0, /* BlockMask */
69 },
70 {
71 17, /* StartIndex */
72 3, /* NumFrames */
73 YOYO_ANIM, /* AnimFlags */
74 ONE_SECOND / 10, ONE_SECOND / 10, /* FrameRate */
75 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
76 0, /* BlockMask */
77 },
78 {
79 20, /* StartIndex */
80 2, /* NumFrames */
81 YOYO_ANIM, /* AnimFlags */
82 ONE_SECOND / 10, 0, /* FrameRate */
83 ONE_SECOND / 10, ONE_SECOND * 3, /* RestartRate */
84 (1 << 7), /* BlockMask */
85 },
86 {
87 22, /* StartIndex */
88 8, /* NumFrames */
89 CIRCULAR_ANIM, /* AnimFlags */
90 ONE_SECOND / 10, 0, /* FrameRate */
91 ONE_SECOND / 10, ONE_SECOND * 3, /* RestartRate */
92 (1 << 6), /* BlockMask */
93 },
94 {
95 30, /* StartIndex */
96 3, /* NumFrames */
97 CIRCULAR_ANIM, /* AnimFlags */
98 ONE_SECOND / 10, 0, /* FrameRate */
99 ONE_SECOND / 10, ONE_SECOND * 3, /* RestartRate */
100 (1 << 5), /* BlockMask */
101 },
102 {
103 33, /* StartIndex */
104 3, /* NumFrames */
105 YOYO_ANIM, /* AnimFlags */
106 ONE_SECOND / 10, 0, /* FrameRate */
107 ONE_SECOND / 10, ONE_SECOND * 3, /* RestartRate */
108 (1 << 4), /* BlockMask */
109 },
110 {
111 36, /* StartIndex */
112 25, /* NumFrames */
113 CIRCULAR_ANIM, /* AnimFlags */
114 ONE_SECOND / 60, ONE_SECOND / 15, /* FrameRate */
115 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
116 0, /* BlockMask */
117 },
118 {
119 61, /* StartIndex */
120 15, /* NumFrames */
121 CIRCULAR_ANIM, /* AnimFlags */
122 ONE_SECOND / 60, ONE_SECOND / 15, /* FrameRate */
123 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
124 0, /* BlockMask */
125 },
126 {
127 76, /* StartIndex */
128 17, /* NumFrames */
129 CIRCULAR_ANIM, /* AnimFlags */
130 ONE_SECOND / 60, ONE_SECOND / 15, /* FrameRate */
131 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
132 (1 << 12), /* BlockMask */
133 },
134 {
135 93, /* StartIndex */
136 25, /* NumFrames */
137 CIRCULAR_ANIM, /* AnimFlags */
138 ONE_SECOND / 60, ONE_SECOND / 15, /* FrameRate */
139 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
140 0, /* BlockMask */
141 },
142 {
143 118, /* StartIndex */
144 11, /* NumFrames */
145 CIRCULAR_ANIM, /* AnimFlags */
146 ONE_SECOND / 60, ONE_SECOND / 15, /* FrameRate */
147 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
148 (1 << 10), /* BlockMask */
149 },
150 },
151 { /* AlienTransitionDesc */
152 0, /* StartIndex */
153 0, /* NumFrames */
154 0, /* AnimFlags */
155 0, 0, /* FrameRate */
156 0, 0, /* RestartRate */
157 0, /* BlockMask */
158 },
159 { /* AlienTalkDesc */
160 1, /* StartIndex */
161 3, /* NumFrames */
162 0, /* AnimFlags */
163 ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
164 ONE_SECOND / 12, ONE_SECOND * 3 / 8, /* RestartRate */
165 0, /* BlockMask */
166 },
167 NULL, /* AlienNumberSpeech - none */
168 /* Filler for loaded resources */
169 NULL, NULL, NULL,
170 NULL,
171 NULL,
172 };
173
174 static void
ExitConversation(RESPONSE_REF R)175 ExitConversation (RESPONSE_REF R)
176 {
177 setSegue (Segue_peace);
178
179 if (PLAYER_SAID (R, bye_ally))
180 NPCPhrase (GOODBYE_ALLY);
181 else if (PLAYER_SAID (R, bye_neutral))
182 NPCPhrase (GOODBYE_NEUTRAL);
183 else if (PLAYER_SAID (R, bye_angry))
184 NPCPhrase (GOODBYE_ANGRY);
185 else if (PLAYER_SAID (R, bye_taalo))
186 {
187 if (GET_GAME_STATE (ORZ_MANNER) == 1)
188 NPCPhrase (ANGRY_TAALO_GOODBYE);
189 else
190 NPCPhrase (FRIENDLY_TAALO_GOODBYE);
191 }
192 else if (PLAYER_SAID (R, hostile_2))
193 {
194 NPCPhrase (HOSTILITY_IS_BAD_2);
195
196 setSegue (Segue_hostile);
197 }
198 else if (PLAYER_SAID (R, may_we_land))
199 {
200 NPCPhrase (SURE_LAND);
201
202 SET_GAME_STATE (TAALO_UNPROTECTED, 1);
203 }
204 else if (PLAYER_SAID (R, yes_alliance)
205 || PLAYER_SAID (R, were_sorry))
206 {
207 if (PLAYER_SAID (R, yes_alliance))
208 NPCPhrase (GREAT);
209 else
210 NPCPhrase (APOLOGY_ACCEPTED);
211
212 SET_GAME_STATE (ORZ_ANDRO_STATE, 0);
213 SET_GAME_STATE (ORZ_GENERAL_INFO, 0);
214 SET_GAME_STATE (ORZ_PERSONAL_INFO, 0);
215 SET_GAME_STATE (ORZ_MANNER, 3);
216 SetRaceAllied (ORZ_SHIP, TRUE);
217 }
218 else if (PLAYER_SAID (R, demand_to_land))
219 {
220 NPCPhrase (NO_DEMAND);
221
222 setSegue (Segue_hostile);
223 }
224 else if (PLAYER_SAID (R, about_andro_3)
225 || PLAYER_SAID (R, must_know_about_androsyn))
226 {
227 if (PLAYER_SAID (R, about_andro_3))
228 NPCPhrase (BLEW_IT);
229 else
230 NPCPhrase (KNOW_TOO_MUCH);
231
232 SET_GAME_STATE (ORZ_VISITS, 0);
233 SET_GAME_STATE (ORZ_MANNER, 2);
234 setSegue (Segue_hostile);
235 if (PLAYER_SAID (R, about_andro_3))
236 {
237 SetRaceAllied (ORZ_SHIP, FALSE);
238 RemoveEscortShips (ORZ_SHIP);
239 }
240
241 XFormColorMap (GetColorMapAddress (
242 SetAbsColorMapIndex (CommData.AlienColorMap, 1)
243 ), ONE_SECOND / 2);
244 }
245 else /* insults */
246 {
247 BYTE NumVisits;
248
249 NumVisits = GET_GAME_STATE (ORZ_PERSONAL_INFO);
250 switch (NumVisits++)
251 {
252 case 0:
253 NPCPhrase (INSULTED_1);
254 break;
255 case 1:
256 NPCPhrase (INSULTED_2);
257 break;
258 case 2:
259 NPCPhrase (INSULTED_3);
260 setSegue (Segue_hostile);
261 break;
262 case 7:
263 --NumVisits;
264 default:
265 NPCPhrase (INSULTED_4);
266 setSegue (Segue_hostile);
267 break;
268 }
269 SET_GAME_STATE (ORZ_PERSONAL_INFO, NumVisits);
270 }
271 }
272
273 static void
TaaloWorld(RESPONSE_REF R)274 TaaloWorld (RESPONSE_REF R)
275 {
276 // We can only get here when ORZ_MANNER != HOSTILE (2)
277 BYTE Manner;
278
279 Manner = GET_GAME_STATE (ORZ_MANNER);
280 if (PLAYER_SAID (R, demand_to_land))
281 {
282 NPCPhrase (ASK_NICELY);
283
284 DISABLE_PHRASE (demand_to_land);
285 }
286 else if (PLAYER_SAID (R, why_you_here))
287 {
288 if (Manner != 1)
289 NPCPhrase (FRIENDLY_EXPLANATION);
290 else
291 NPCPhrase (ANGRY_EXPLANATION);
292
293 DISABLE_PHRASE (why_you_here);
294 }
295 else if (PLAYER_SAID (R, what_is_this_place))
296 {
297 if (Manner != 1)
298 NPCPhrase (FRIENDLY_PLACE);
299 else
300 NPCPhrase (ANGRY_PLACE);
301
302 DISABLE_PHRASE (what_is_this_place);
303 }
304 else if (PLAYER_SAID (R, may_we_land))
305 {
306 NPCPhrase (ALLIES_CAN_VISIT);
307
308 DISABLE_PHRASE (may_we_land);
309 }
310 else if (PLAYER_SAID (R, make_alliance))
311 {
312 NPCPhrase (CANT_ALLY_HERE);
313
314 DISABLE_PHRASE (make_alliance);
315 }
316 else if (PLAYER_SAID (R, why_busy))
317 {
318 NPCPhrase (BUSY_BECAUSE);
319
320 DISABLE_PHRASE (why_busy);
321 }
322
323 if (PHRASE_ENABLED (may_we_land))
324 {
325 if (Manner == 3 && CheckAlliance (ORZ_SHIP) == GOOD_GUY)
326 Response (may_we_land, ExitConversation);
327 else
328 Response (may_we_land, TaaloWorld);
329 }
330 else if (PHRASE_ENABLED (make_alliance))
331 Response (make_alliance, TaaloWorld);
332 else if (PHRASE_ENABLED (why_busy))
333 Response (why_busy, TaaloWorld);
334 if (PHRASE_ENABLED (demand_to_land))
335 {
336 if (Manner == 1)
337 Response (demand_to_land, ExitConversation);
338 else
339 Response (demand_to_land, TaaloWorld);
340 }
341 if (PHRASE_ENABLED (why_you_here))
342 Response (why_you_here, TaaloWorld);
343 if (PHRASE_ENABLED (what_is_this_place))
344 Response (what_is_this_place, TaaloWorld);
345 Response (bye_taalo, ExitConversation);
346 }
347
348 static void
OrzAllied(RESPONSE_REF R)349 OrzAllied (RESPONSE_REF R)
350 {
351 BYTE NumVisits;
352
353 if (PLAYER_SAID (R, whats_up_ally))
354 {
355 NumVisits = GET_GAME_STATE (ORZ_GENERAL_INFO);
356 switch (NumVisits++)
357 {
358 case 0:
359 NPCPhrase (GENERAL_INFO_ALLY_1);
360 break;
361 case 1:
362 NPCPhrase (GENERAL_INFO_ALLY_2);
363 break;
364 case 2:
365 NPCPhrase (GENERAL_INFO_ALLY_3);
366 break;
367 case 3:
368 NPCPhrase (GENERAL_INFO_ALLY_4);
369 --NumVisits;
370 break;
371 }
372 SET_GAME_STATE (ORZ_GENERAL_INFO, NumVisits);
373
374 DISABLE_PHRASE (whats_up_ally);
375 }
376 else if (PLAYER_SAID (R, more_about_you))
377 {
378 NumVisits = GET_GAME_STATE (ORZ_PERSONAL_INFO);
379 switch (NumVisits++)
380 {
381 case 0:
382 NPCPhrase (ABOUT_US_1);
383 break;
384 case 1:
385 NPCPhrase (ABOUT_US_2);
386 break;
387 case 2:
388 NPCPhrase (ABOUT_US_3);
389 break;
390 case 3:
391 NPCPhrase (ABOUT_US_4);
392 --NumVisits;
393 break;
394 }
395 SET_GAME_STATE (ORZ_PERSONAL_INFO, NumVisits);
396
397 DISABLE_PHRASE (more_about_you);
398 }
399 else if (PLAYER_SAID (R, about_andro_1))
400 {
401 NPCPhrase (FORGET_ANDRO_1);
402
403 SET_GAME_STATE (ORZ_ANDRO_STATE, 1);
404 }
405 else if (PLAYER_SAID (R, about_andro_2))
406 {
407 NPCPhrase (FORGET_ANDRO_2);
408
409 SET_GAME_STATE (ORZ_ANDRO_STATE, 2);
410 }
411
412 if (GET_GAME_STATE (ORZ_ANDRO_STATE) == 0)
413 Response (about_andro_1, OrzAllied);
414 else if (GET_GAME_STATE (ORZ_ANDRO_STATE) == 1)
415 Response (about_andro_2, OrzAllied);
416 else
417 {
418 Response (about_andro_3, ExitConversation);
419 }
420 if (PHRASE_ENABLED (whats_up_ally))
421 Response (whats_up_ally, OrzAllied);
422 if (PHRASE_ENABLED (more_about_you))
423 Response (more_about_you, OrzAllied);
424 Response (bye_ally, ExitConversation);
425 }
426
427 static void OrzNeutral (RESPONSE_REF R);
428
429 static void
WhereAndrosyn(RESPONSE_REF R)430 WhereAndrosyn (RESPONSE_REF R)
431 {
432 (void) R; // ignored
433 NPCPhrase (DISEMBLE_ABOUT_ANDROSYN);
434 DISABLE_PHRASE (where_androsyn);
435
436 Response (must_know_about_androsyn, ExitConversation);
437 Response (dont_really_care, OrzNeutral);
438 }
439
440 static void
OfferAlliance(RESPONSE_REF R)441 OfferAlliance (RESPONSE_REF R)
442 {
443 if (PLAYER_SAID (R, seem_like_nice_guys))
444 NPCPhrase (ARE_NICE_WANT_ALLY);
445 else if (PLAYER_SAID (R, talk_about_alliance))
446 NPCPhrase (OK_TALK_ALLIANCE);
447 else if (PLAYER_SAID (R, why_so_trusting))
448 {
449 NPCPhrase (TRUSTING_BECAUSE);
450
451 SET_GAME_STATE (ORZ_STACK1, 1);
452 }
453
454 Response (no_alliance, OrzNeutral);
455 Response (decide_later, OrzNeutral);
456 if (GET_GAME_STATE (ORZ_STACK1) == 0)
457 {
458 Response (why_so_trusting, OfferAlliance);
459 }
460 Response (yes_alliance, ExitConversation);
461 }
462
463 static void
OrzNeutral(RESPONSE_REF R)464 OrzNeutral (RESPONSE_REF R)
465 {
466 BYTE i, LastStack;
467 RESPONSE_REF pStr[3];
468
469 LastStack = 0;
470 pStr[0] = pStr[1] = pStr[2] = 0;
471 if (PLAYER_SAID (R, hostile_1))
472 {
473 NPCPhrase (HOSTILITY_IS_BAD_1);
474
475 DISABLE_PHRASE (hostile_1);
476 LastStack = 2;
477 }
478 else if (PLAYER_SAID (R, we_are_vindicator0))
479 {
480 NPCPhrase (NICE_TO_MEET_YOU);
481
482 SET_GAME_STATE (ORZ_STACK0, 1);
483 LastStack = 1;
484 }
485 else if (PLAYER_SAID (R, who_you))
486 {
487 NPCPhrase (WE_ARE_ORZ);
488
489 SET_GAME_STATE (ORZ_ANDRO_STATE, 1);
490 }
491 else if (PLAYER_SAID (R, why_here))
492 {
493 NPCPhrase (HERE_BECAUSE);
494
495 SET_GAME_STATE (ORZ_ANDRO_STATE, 2);
496 }
497 else if (PLAYER_SAID (R, no_alliance))
498 {
499 NPCPhrase (MAYBE_LATER);
500
501 DISABLE_PHRASE (talk_about_alliance);
502 SET_GAME_STATE (REFUSED_ORZ_ALLIANCE, 1);
503 }
504 else if (PLAYER_SAID (R, decide_later))
505 {
506 NPCPhrase (OK_LATER);
507
508 DISABLE_PHRASE (talk_about_alliance);
509 SET_GAME_STATE (REFUSED_ORZ_ALLIANCE, 1);
510 }
511 else if (PLAYER_SAID (R, dont_really_care))
512 NPCPhrase (YOU_ARE_OUR_FRIENDS);
513 else if (PLAYER_SAID (R, where_androsyn))
514 {
515 WhereAndrosyn (R);
516 return;
517 }
518 else if (PLAYER_SAID (R, talk_about_alliance)
519 || PLAYER_SAID (R, seem_like_nice_guys))
520 {
521 OfferAlliance (R);
522 return;
523 }
524 else if (PLAYER_SAID (R, hostile_2))
525 {
526 ExitConversation (R);
527 return;
528 }
529
530 if (GET_GAME_STATE (ORZ_ANDRO_STATE) == 0)
531 pStr[0] = who_you;
532 else if (GET_GAME_STATE (ORZ_ANDRO_STATE) == 1)
533 pStr[0] = why_here;
534 else if (PHRASE_ENABLED (where_androsyn) && GET_GAME_STATE (ORZ_ANDRO_STATE) == 2)
535 pStr[0] = where_androsyn;
536 if (GET_GAME_STATE (REFUSED_ORZ_ALLIANCE))
537 {
538 if (PHRASE_ENABLED (talk_about_alliance))
539 pStr[1] = talk_about_alliance;
540 }
541 else if (GET_GAME_STATE (ORZ_STACK0) == 0)
542 {
543 construct_response (shared_phrase_buf,
544 we_are_vindicator0,
545 GLOBAL_SIS (CommanderName),
546 we_are_vindicator1,
547 GLOBAL_SIS (ShipName),
548 we_are_vindicator2,
549 (UNICODE*)NULL);
550 pStr[1] = we_are_vindicator0;
551 }
552 else
553 pStr[1] = seem_like_nice_guys;
554 if (PHRASE_ENABLED (hostile_1))
555 pStr[2] = hostile_1;
556 else
557 pStr[2] = hostile_2;
558
559 if (pStr[LastStack])
560 {
561 if (pStr[LastStack] != we_are_vindicator0)
562 Response (pStr[LastStack], OrzNeutral);
563 else
564 DoResponsePhrase (pStr[LastStack], OrzNeutral, shared_phrase_buf);
565 }
566 for (i = 0; i < 3; ++i)
567 {
568 if (i != LastStack && pStr[i])
569 {
570 if (pStr[i] != we_are_vindicator0)
571 Response (pStr[i], OrzNeutral);
572 else
573 DoResponsePhrase (pStr[i], OrzNeutral, shared_phrase_buf);
574 }
575 }
576 Response (bye_neutral, ExitConversation);
577 }
578
579 static void
OrzAngry(RESPONSE_REF R)580 OrzAngry (RESPONSE_REF R)
581 {
582 if (PLAYER_SAID (R, whats_up_angry))
583 {
584 BYTE NumVisits;
585
586 NumVisits = GET_GAME_STATE (ORZ_GENERAL_INFO);
587 switch (NumVisits++)
588 {
589 case 0:
590 NPCPhrase (GENERAL_INFO_ANGRY_1);
591 break;
592 case 1:
593 NPCPhrase (GENERAL_INFO_ANGRY_2);
594 --NumVisits;
595 break;
596 }
597 SET_GAME_STATE (ORZ_GENERAL_INFO, NumVisits);
598
599 DISABLE_PHRASE (whats_up_angry);
600 }
601
602 if (PHRASE_ENABLED (whats_up_angry))
603 {
604 Response (whats_up_angry, OrzAngry);
605 }
606 Response (were_sorry, ExitConversation);
607 switch (GET_GAME_STATE (ORZ_PERSONAL_INFO))
608 {
609 case 0:
610 Response (insult_1, ExitConversation);
611 break;
612 case 1:
613 Response (insult_2, ExitConversation);
614 break;
615 case 2:
616 Response (insult_3, ExitConversation);
617 break;
618 case 3:
619 Response (insult_4, ExitConversation);
620 break;
621 case 4:
622 Response (insult_5, ExitConversation);
623 break;
624 case 5:
625 Response (insult_6, ExitConversation);
626 break;
627 case 6:
628 Response (insult_7, ExitConversation);
629 break;
630 case 7:
631 Response (insult_8, ExitConversation);
632 break;
633 }
634 Response (bye_angry, ExitConversation);
635 }
636
637 static void
Intro(void)638 Intro (void)
639 {
640 BYTE NumVisits, Manner;
641
642 if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
643 {
644 NPCPhrase (OUT_TAKES);
645
646 setSegue (Segue_peace);
647 return;
648 }
649
650 if (!GET_GAME_STATE (MET_ORZ_BEFORE))
651 NPCPhrase (INIT_HELLO);
652
653 Manner = GET_GAME_STATE (ORZ_MANNER);
654 if (Manner == 2)
655 {
656 CommData.AlienColorMap =
657 SetAbsColorMapIndex (CommData.AlienColorMap, 1);
658
659 NumVisits = GET_GAME_STATE (ORZ_VISITS);
660 switch (NumVisits++)
661 {
662 case 0:
663 NPCPhrase (HOSTILE_HELLO_1);
664 break;
665 case 1:
666 NPCPhrase (HOSTILE_HELLO_2);
667 --NumVisits;
668 break;
669 }
670 SET_GAME_STATE (ORZ_VISITS, NumVisits);
671
672 setSegue (Segue_hostile);
673 }
674 else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
675 {
676 NumVisits = GET_GAME_STATE (TAALO_VISITS);
677 if (Manner != 1)
678 {
679 switch (NumVisits++)
680 {
681 case 0:
682 NPCPhrase (FRIENDLY_ALLIED_TAALO_HELLO_1);
683 break;
684 case 1:
685 NPCPhrase (FRIENDLY_ALLIED_TAALO_HELLO_2);
686 --NumVisits;
687 break;
688 }
689 }
690 else
691 {
692 switch (NumVisits++)
693 {
694 case 0:
695 NPCPhrase (ANGRY_TAALO_HELLO_1);
696 break;
697 case 1:
698 NPCPhrase (ANGRY_TAALO_HELLO_2);
699 --NumVisits;
700 break;
701 }
702 }
703 SET_GAME_STATE (TAALO_VISITS, NumVisits);
704
705 TaaloWorld ((RESPONSE_REF)0);
706 }
707 else if (Manner == 3 && CheckAlliance (ORZ_SHIP) == GOOD_GUY)
708 {
709 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
710 {
711 NumVisits = GET_GAME_STATE (ORZ_HOME_VISITS);
712 switch (NumVisits++)
713 {
714 case 0:
715 NPCPhrase (ALLIED_HOMEWORLD_HELLO_1);
716 break;
717 case 1:
718 NPCPhrase (ALLIED_HOMEWORLD_HELLO_2);
719 break;
720 case 2:
721 NPCPhrase (ALLIED_HOMEWORLD_HELLO_3);
722 break;
723 case 3:
724 NPCPhrase (ALLIED_HOMEWORLD_HELLO_4);
725 --NumVisits;
726 break;
727 }
728 SET_GAME_STATE (ORZ_HOME_VISITS, NumVisits);
729 }
730 else
731 {
732 NumVisits = GET_GAME_STATE (ORZ_VISITS);
733 switch (NumVisits++)
734 {
735 case 0:
736 NPCPhrase (ALLIED_SPACE_HELLO_1);
737 break;
738 case 1:
739 NPCPhrase (ALLIED_SPACE_HELLO_2);
740 break;
741 case 2:
742 NPCPhrase (ALLIED_SPACE_HELLO_3);
743 break;
744 case 3:
745 NPCPhrase (ALLIED_SPACE_HELLO_4);
746 --NumVisits;
747 break;
748 }
749 SET_GAME_STATE (ORZ_VISITS, NumVisits);
750 }
751
752 OrzAllied ((RESPONSE_REF)0);
753 }
754 else if (Manner != 1)
755 {
756 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
757 {
758 NumVisits = GET_GAME_STATE (ORZ_HOME_VISITS);
759 switch (NumVisits++)
760 {
761 case 0:
762 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_1);
763 break;
764 case 1:
765 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_2);
766 break;
767 case 2:
768 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_3);
769 break;
770 case 3:
771 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_4);
772 --NumVisits;
773 break;
774 }
775 SET_GAME_STATE (ORZ_HOME_VISITS, NumVisits);
776 }
777 else
778 {
779 NumVisits = GET_GAME_STATE (ORZ_VISITS);
780 switch (NumVisits++)
781 {
782 case 0:
783 NPCPhrase (NEUTRAL_SPACE_HELLO_1);
784 break;
785 case 1:
786 NPCPhrase (NEUTRAL_SPACE_HELLO_2);
787 break;
788 case 2:
789 NPCPhrase (NEUTRAL_SPACE_HELLO_3);
790 break;
791 case 3:
792 NPCPhrase (NEUTRAL_SPACE_HELLO_4);
793 --NumVisits;
794 break;
795 }
796 SET_GAME_STATE (ORZ_VISITS, NumVisits);
797 }
798
799 OrzNeutral ((RESPONSE_REF)0);
800 }
801 else
802 {
803 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
804 {
805 NumVisits = GET_GAME_STATE (ORZ_HOME_VISITS);
806 switch (NumVisits++)
807 {
808 case 0:
809 NPCPhrase (ANGRY_HOMEWORLD_HELLO_1);
810 break;
811 case 1:
812 NPCPhrase (ANGRY_HOMEWORLD_HELLO_2);
813 --NumVisits;
814 break;
815 }
816 SET_GAME_STATE (ORZ_HOME_VISITS, NumVisits);
817 }
818 else
819 {
820 NumVisits = GET_GAME_STATE (ORZ_VISITS);
821 switch (NumVisits++)
822 {
823 case 0:
824 NPCPhrase (ANGRY_SPACE_HELLO_1);
825 break;
826 case 1:
827 NPCPhrase (ANGRY_SPACE_HELLO_2);
828 --NumVisits;
829 break;
830 }
831 SET_GAME_STATE (ORZ_VISITS, NumVisits);
832 }
833
834 OrzAngry ((RESPONSE_REF)0);
835 }
836
837 if (!GET_GAME_STATE (MET_ORZ_BEFORE))
838 {
839 SET_GAME_STATE (MET_ORZ_BEFORE, 1);
840
841 // Disable talking anim and run the computer report
842 EnableTalkingAnim (FALSE);
843 AlienTalkSegue (1);
844 // Run whatever is left with talking anim
845 EnableTalkingAnim (TRUE);
846 }
847 }
848
849 static COUNT
uninit_orz(void)850 uninit_orz (void)
851 {
852 return (0);
853 }
854
855 static void
post_orz_enc(void)856 post_orz_enc (void)
857 {
858 BYTE Manner;
859
860 if (getSegue () == Segue_hostile
861 && (Manner = GET_GAME_STATE (ORZ_MANNER)) != 2)
862 {
863 SET_GAME_STATE (ORZ_MANNER, 1);
864 if (Manner != 1)
865 {
866 SET_GAME_STATE (ORZ_VISITS, 0);
867 SET_GAME_STATE (ORZ_HOME_VISITS, 0);
868 SET_GAME_STATE (TAALO_VISITS, 0);
869 }
870 }
871 }
872
873 LOCDATA*
init_orz_comm(void)874 init_orz_comm (void)
875 {
876 LOCDATA *retval;
877
878 orz_desc.init_encounter_func = Intro;
879 orz_desc.post_encounter_func = post_orz_enc;
880 orz_desc.uninit_encounter_func = uninit_orz;
881
882 orz_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
883 orz_desc.AlienTextBaseline.y = 0;
884 orz_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
885
886 if (GET_GAME_STATE (ORZ_MANNER) == 3
887 || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
888 {
889 setSegue (Segue_peace);
890 }
891 else
892 {
893 setSegue (Segue_hostile);
894 }
895 retval = &orz_desc;
896
897 return (retval);
898 }
899