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