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 thradd_desc =
28 {
29 	NULL, /* init_encounter_func */
30 	NULL, /* post_encounter_func */
31 	NULL, /* uninit_encounter_func */
32 	THRADD_PMAP_ANIM, /* AlienFrame */
33 	THRADD_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_TOP, /* AlienTextValign */
40 	THRADD_COLOR_MAP, /* AlienColorMap */
41 	THRADD_MUSIC, /* AlienSong */
42 	NULL_RESOURCE, /* AlienAltSong */
43 	0, /* AlienSongFlags */
44 	THRADD_CONVERSATION_PHRASES, /* PlayerPhrases */
45 	8, /* NumAnimations */
46 	{ /* AlienAmbientArray (ambient animations) */
47 		{
48 			8, /* StartIndex */
49 			4, /* NumFrames */
50 			RANDOM_ANIM, /* AnimFlags */
51 			ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
52 			ONE_SECOND / 15, ONE_SECOND / 15, /* RestartRate */
53 			(1 << 4), /* BlockMask */
54 		},
55 		{
56 			12, /* StartIndex */
57 			9, /* NumFrames */
58 			CIRCULAR_ANIM, /* AnimFlags */
59 			ONE_SECOND / 20, 0, /* FrameRate */
60 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
61 			0, /* BlockMask */
62 		},
63 		{
64 			21, /* StartIndex */
65 			6, /* NumFrames */
66 			RANDOM_ANIM, /* AnimFlags */
67 			ONE_SECOND / 20, 0, /* FrameRate */
68 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
69 			0, /* BlockMask */
70 		},
71 		{
72 			27, /* StartIndex */
73 			3, /* NumFrames */
74 			YOYO_ANIM, /* AnimFlags */
75 			ONE_SECOND / 20, 0, /* FrameRate */
76 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
77 			(1 << 4), /* BlockMask */
78 		},
79 		{
80 			30, /* StartIndex */
81 			12, /* NumFrames */
82 			CIRCULAR_ANIM
83 					| WAIT_TALKING, /* AnimFlags */
84 			ONE_SECOND / 12, 0, /* FrameRate */
85 			ONE_SECOND, ONE_SECOND, /* RestartRate */
86 			(1 << 0) | (1 << 3) | (1 << 5),
87 		},
88 		{
89 			42, /* StartIndex */
90 			5, /* NumFrames */
91 			YOYO_ANIM, /* AnimFlags */
92 			ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
93 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
94 			(1 << 4) | (1 << 6), /* BlockMask */
95 		},
96 		{
97 			47, /* StartIndex */
98 			5, /* NumFrames */
99 			YOYO_ANIM, /* AnimFlags */
100 			ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
101 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
102 			(1 << 5), /* BlockMask */
103 		},
104 		{
105 			52, /* StartIndex */
106 			4, /* NumFrames */
107 			RANDOM_ANIM, /* AnimFlags */
108 			ONE_SECOND / 20, 0, /* FrameRate */
109 			ONE_SECOND / 20, 0, /* RestartRate */
110 			0, /* BlockMask */
111 		},
112 	},
113 	{ /* AlienTransitionDesc */
114 		0, /* StartIndex */
115 		0, /* NumFrames */
116 		0, /* AnimFlags */
117 		0, 0, /* FrameRate */
118 		0, 0, /* RestartRate */
119 		0, /* BlockMask */
120 	},
121 	{ /* AlienTalkDesc */
122 		1, /* StartIndex */
123 		7, /* NumFrames */
124 		0, /* AnimFlags */
125 		ONE_SECOND / 15, 0, /* FrameRate */
126 		ONE_SECOND / 12, 0, /* RestartRate */
127 		0, /* BlockMask */
128 	},
129 	NULL, /* AlienNumberSpeech - none */
130 	/* Filler for loaded resources */
131 	NULL, NULL, NULL,
132 	NULL,
133 	NULL,
134 };
135 
136 static int
GetCultureName(void)137 GetCultureName (void)
138 {
139 	int culture = 0;
140 
141 	switch (GET_GAME_STATE (THRADD_CULTURE))
142 	{
143 		case 1:
144 			culture = CULTURE;
145 			break;
146 		case 2:
147 			culture = FAT_JERKS;
148 			break;
149 		case 3:
150 			culture = SLAVE_EMPIRE;
151 			break;
152 		default:
153 			assert (0 && "Unknown culture");
154 	}
155 
156 	return (culture);
157 }
158 
159 static void
PolitePhrase(BYTE which_phrase)160 PolitePhrase (BYTE which_phrase)
161 {
162 	switch (which_phrase)
163 	{
164 		case 0:
165 			NPCPhrase (HELLO_POLITE_1);
166 			break;
167 		case 1:
168 			NPCPhrase (HELLO_POLITE_2);
169 			break;
170 		case 2:
171 			NPCPhrase (HELLO_POLITE_3);
172 			break;
173 		case 3:
174 			NPCPhrase (HELLO_POLITE_4);
175 			break;
176 	}
177 }
178 
179 static void
RhymePhrase(BYTE which_phrase)180 RhymePhrase (BYTE which_phrase)
181 {
182 	switch (which_phrase)
183 	{
184 		case 0:
185 			NPCPhrase (HELLO_RHYME_1);
186 			break;
187 		case 1:
188 			NPCPhrase (HELLO_RHYME_2);
189 			break;
190 		case 2:
191 			NPCPhrase (HELLO_RHYME_3);
192 			break;
193 		case 3:
194 			NPCPhrase (HELLO_RHYME_4);
195 			break;
196 	}
197 }
198 
199 static void
PigLatinPhrase(BYTE which_phrase)200 PigLatinPhrase (BYTE which_phrase)
201 {
202 	switch (which_phrase)
203 	{
204 		case 0:
205 			NPCPhrase (HELLO_PIG_LATIN_1);
206 			break;
207 		case 1:
208 			NPCPhrase (HELLO_PIG_LATIN_2);
209 			break;
210 		case 2:
211 			NPCPhrase (HELLO_PIG_LATIN_3);
212 			break;
213 		case 3:
214 			NPCPhrase (HELLO_PIG_LATIN_4);
215 			break;
216 	}
217 }
218 
219 static void
LikeYouPhrase(BYTE which_phrase)220 LikeYouPhrase (BYTE which_phrase)
221 {
222 	switch (which_phrase)
223 	{
224 		case 0:
225 			NPCPhrase (HELLO_LIKE_YOU_1);
226 			break;
227 		case 1:
228 			NPCPhrase (HELLO_LIKE_YOU_2);
229 			break;
230 		case 2:
231 			NPCPhrase (HELLO_LIKE_YOU_3);
232 			break;
233 		case 3:
234 			NPCPhrase (HELLO_LIKE_YOU_4);
235 			break;
236 	}
237 }
238 
239 static void
ExitConversation(RESPONSE_REF R)240 ExitConversation (RESPONSE_REF R)
241 {
242 	setSegue (Segue_hostile);
243 
244 	if (PLAYER_SAID (R, bye_hostile_2))
245 		NPCPhrase (GOODBYE_HOSTILE_2);
246 	else if (PLAYER_SAID (R, bye_hostile_1))
247 	{
248 		NPCPhrase (GOODBYE_HOSTILE_1);
249 
250 		SET_GAME_STATE (THRADD_HOSTILE_STACK_5, 1);
251 	}
252 	else if (PLAYER_SAID (R, submit_1))
253 	{
254 		NPCPhrase (NO_SUBMIT_1);
255 
256 		SET_GAME_STATE (THRADD_HOSTILE_STACK_2, 1);
257 	}
258 	else if (PLAYER_SAID (R, submit_2))
259 		NPCPhrase (NO_SUBMIT_2);
260 	else if (PLAYER_SAID (R, got_idea))
261 	{
262 		NPCPhrase (GOOD_IDEA);
263 
264 		setSegue (Segue_peace);
265 		AddEvent (RELATIVE_EVENT, 0, 0, 0, ADVANCE_THRADD_MISSION);
266 		SET_GAME_STATE (THRADD_STACK_1, 5);
267 	}
268 	else if (PLAYER_SAID (R, bye_hostile_helix))
269 		NPCPhrase (GOODBYE_HOSTILE_HELIX);
270 	else if (PLAYER_SAID (R, bye_ally))
271 	{
272 		BYTE NumVisits;
273 
274 		NumVisits = GET_GAME_STATE (THRADD_STACK_1);
275 		switch (NumVisits++)
276 		{
277 			case 0:
278 				NPCPhrase (GOODBYE_ALLY_1);
279 				break;
280 			case 1:
281 				NPCPhrase (GOODBYE_ALLY_2);
282 				break;
283 			case 2:
284 				NPCPhrase (GOODBYE_ALLY_3);
285 				break;
286 			case 3:
287 				NPCPhrase (GOODBYE_ALLY_4);
288 				--NumVisits;
289 				break;
290 		}
291 		SET_GAME_STATE (THRADD_STACK_1, NumVisits);
292 		setSegue (Segue_peace);
293 	}
294 	else if (PLAYER_SAID (R, may_i_land))
295 	{
296 		NPCPhrase (SURE_LAND);
297 
298 		SET_GAME_STATE (HELIX_UNPROTECTED, 1);
299 		setSegue (Segue_peace);
300 	}
301 	else if (PLAYER_SAID (R, demand_to_land))
302 		NPCPhrase (NO_DEMAND);
303 	else if (PLAYER_SAID (R, i_need_to_land_lie))
304 		NPCPhrase (CAUGHT_LIE);
305 	else
306 	{
307 		if (PLAYER_SAID (R, contemplative))
308 		{
309 			NPCPhrase (OK_CONTEMPLATIVE);
310 
311 			SET_GAME_STATE (THRADD_DEMEANOR, 0);
312 		}
313 		else if (PLAYER_SAID (R, friendly))
314 		{
315 			NPCPhrase (OK_FRIENDLY);
316 
317 			SET_GAME_STATE (THRADD_DEMEANOR, 1);
318 		}
319 		else if (PLAYER_SAID (R, wacky))
320 		{
321 			NPCPhrase (OK_WACKY);
322 
323 			SET_GAME_STATE (THRADD_DEMEANOR, 2);
324 		}
325 		else if (PLAYER_SAID (R, just_like_us))
326 		{
327 			NPCPhrase (OK_JUST_LIKE_YOU);
328 
329 			SET_GAME_STATE (THRADD_DEMEANOR, 3);
330 		}
331 		NPCPhrase (WORK_TO_DO);
332 
333 		setSegue (Segue_peace);
334 	}
335 }
336 
337 static void
ThraddAllies(RESPONSE_REF R)338 ThraddAllies (RESPONSE_REF R)
339 {
340 	BYTE NumVisits;
341 
342 	if (PLAYER_SAID (R, why_you_here_ally))
343 	{
344 		NPCPhrase (GUARDING_HELIX_ALLY);
345 
346 		DISABLE_PHRASE (why_you_here_ally);
347 	}
348 	else if (PLAYER_SAID (R, whats_helix_ally))
349 	{
350 		NPCPhrase (HELIX_IS_ALLY);
351 
352 		DISABLE_PHRASE (whats_helix_ally);
353 	}
354 	else if (PLAYER_SAID (R, whats_up_ally))
355 	{
356 		NumVisits = GET_GAME_STATE (THRADD_INFO);
357 		switch (NumVisits++)
358 		{
359 			case 0:
360 				NPCPhrase (GENERAL_INFO_ALLY_1);
361 				break;
362 			case 1:
363 				NPCPhrase (GENERAL_INFO_ALLY_2);
364 				break;
365 			case 2:
366 				NPCPhrase (GENERAL_INFO_ALLY_3);
367 				break;
368 			case 3:
369 				NPCPhrase (GENERAL_INFO_ALLY_4);
370 				--NumVisits;
371 				break;
372 		}
373 		SET_GAME_STATE (THRADD_INFO, NumVisits);
374 
375 		DISABLE_PHRASE (whats_up_ally);
376 	}
377 	else if (PLAYER_SAID (R, how_goes_culture))
378 	{
379 		NumVisits = GET_GAME_STATE (THRADD_DEMEANOR);
380 		switch (NumVisits & ((1 << 2) - 1))
381 		{
382 			case 0:
383 				if (!(NumVisits & ~((1 << 2) - 1)))
384 					NPCPhrase (CONTEMP_GOES_1);
385 				else
386 					NPCPhrase (CONTEMP_GOES_2);
387 				break;
388 			case 1:
389 				if (!(NumVisits & ~((1 << 2) - 1)))
390 					NPCPhrase (FRIENDLY_GOES_1);
391 				else
392 					NPCPhrase (FRIENDLY_GOES_2);
393 				break;
394 			case 2:
395 				if (!(NumVisits & ~((1 << 2) - 1)))
396 					NPCPhrase (WACKY_GOES_1);
397 				else
398 					NPCPhrase (WACKY_GOES_2);
399 				break;
400 			case 3:
401 				if (!(NumVisits & ~((1 << 2) - 1)))
402 					NPCPhrase (LIKE_YOU_GOES_1);
403 				else
404 					NPCPhrase (LIKE_YOU_GOES_2);
405 				break;
406 		}
407 		NumVisits |= 1 << 2;
408 		SET_GAME_STATE (THRADD_DEMEANOR, NumVisits);
409 
410 		DISABLE_PHRASE (how_goes_culture);
411 	}
412 
413 	if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
414 	{
415 		if (PHRASE_ENABLED (why_you_here_ally))
416 			Response (why_you_here_ally, ThraddAllies);
417 		else
418 		{
419 			if (PHRASE_ENABLED (whats_helix_ally))
420 				Response (whats_helix_ally, ThraddAllies);
421 			Response (may_i_land, ExitConversation);
422 		}
423 	}
424 	if (PHRASE_ENABLED (whats_up_ally))
425 		Response (whats_up_ally, ThraddAllies);
426 	if (PHRASE_ENABLED (how_goes_culture))
427 		Response (how_goes_culture, ThraddAllies);
428 	Response (bye_ally, ExitConversation);
429 }
430 
431 static void
ThraddDemeanor(RESPONSE_REF R)432 ThraddDemeanor (RESPONSE_REF R)
433 {
434 	if (PLAYER_SAID (R, you_decide))
435 	{
436 		NPCPhrase (OK_CULTURE_20);
437 
438 		SET_GAME_STATE (THRADD_CULTURE, 1);
439 	}
440 	else if (PLAYER_SAID (R, fat))
441 	{
442 		NPCPhrase (OK_FAT);
443 
444 		SET_GAME_STATE (THRADD_CULTURE, 2);
445 	}
446 	else if (PLAYER_SAID (R, the_slave_empire0))
447 	{
448 		SET_GAME_STATE (THRADD_CULTURE, 3);
449 
450 		NPCPhrase (OK_SLAVE);
451 	}
452 
453 	NPCPhrase (HOW_SHOULD_WE_ACT);
454 	Response (contemplative, ExitConversation);
455 	Response (friendly, ExitConversation);
456 	Response (wacky, ExitConversation);
457 	Response (just_like_us, ExitConversation);
458 }
459 
460 static void
ThraddCulture(RESPONSE_REF R)461 ThraddCulture (RESPONSE_REF R)
462 {
463 	if (PLAYER_SAID (R, be_polite))
464 	{
465 		NPCPhrase (OK_POLITE);
466 
467 		SET_GAME_STATE (THRADD_INTRO, 0);
468 	}
469 	else if (PLAYER_SAID (R, use_rhymes))
470 	{
471 		NPCPhrase (OK_RHYMES);
472 
473 		SET_GAME_STATE (THRADD_INTRO, 1);
474 	}
475 	else if (PLAYER_SAID (R, speak_pig_latin))
476 	{
477 		NPCPhrase (OK_PIG_LATIN);
478 
479 		SET_GAME_STATE (THRADD_INTRO, 2);
480 	}
481 	else if (PLAYER_SAID (R, just_the_way_we_do))
482 	{
483 		NPCPhrase (OK_WAY_YOU_DO);
484 
485 		SET_GAME_STATE (THRADD_INTRO, 3);
486 	}
487 	NPCPhrase (WHAT_NAME_FOR_CULTURE);
488 
489 	construct_response (
490 			shared_phrase_buf,
491 			the_slave_empire0,
492 			GLOBAL_SIS (CommanderName),
493 			the_slave_empire1,
494 			(UNICODE*)NULL);
495 
496 	Response (you_decide, ThraddDemeanor);
497 	Response (fat, ThraddDemeanor);
498 	DoResponsePhrase (the_slave_empire0, ThraddDemeanor, shared_phrase_buf);
499 }
500 
501 static void
ThraddWorship(RESPONSE_REF R)502 ThraddWorship (RESPONSE_REF R)
503 {
504 	(void) R;  // ignored
505 	SET_GAME_STATE (THRADD_VISITS, 0);
506 	SET_GAME_STATE (THRADD_MANNER, 1);
507 	SET_GAME_STATE (THRADD_STACK_1, 0);
508 	SetRaceAllied (THRADDASH_SHIP, TRUE);
509 
510 	Response (be_polite, ThraddCulture);
511 	Response (speak_pig_latin, ThraddCulture);
512 	Response (use_rhymes, ThraddCulture);
513 	Response (just_the_way_we_do, ThraddCulture);
514 }
515 
516 static void
HelixWorld(RESPONSE_REF R)517 HelixWorld (RESPONSE_REF R)
518 {
519 	if (PLAYER_SAID (R, why_you_here_hostile))
520 	{
521 		NPCPhrase (NONE_OF_YOUR_CONCERN);
522 
523 		SET_GAME_STATE (THRADD_CULTURE, 1);
524 	}
525 	else if (PLAYER_SAID (R, what_about_this_world))
526 	{
527 		NPCPhrase (BLUE_HELIX);
528 
529 		SET_GAME_STATE (THRADD_INTRO, 1);
530 	}
531 	else if (PLAYER_SAID (R, whats_helix_hostile))
532 	{
533 		NPCPhrase (HELIX_IS_HOSTILE);
534 
535 		SET_GAME_STATE (THRADD_INTRO, 2);
536 	}
537 	else if (PLAYER_SAID (R, i_need_to_land_lie))
538 	{
539 		NPCPhrase (CAUGHT_LIE);
540 
541 		SET_GAME_STATE (THRADD_DEMEANOR, 1);
542 	}
543 
544 	if (!GET_GAME_STATE (THRADD_CULTURE))
545 		Response (why_you_here_hostile, HelixWorld);
546 	else
547 	{
548 		Response (demand_to_land, ExitConversation);
549 	}
550 	switch (GET_GAME_STATE (THRADD_INTRO))
551 	{
552 		case 0:
553 			Response (what_about_this_world, HelixWorld);
554 			break;
555 		case 1:
556 			Response (whats_helix_hostile, HelixWorld);
557 			break;
558 	}
559 	if (!GET_GAME_STATE (THRADD_DEMEANOR))
560 	{
561 		Response (i_need_to_land_lie, ExitConversation);
562 	}
563 	Response (bye_hostile_helix, ExitConversation);
564 }
565 
566 static void
ThraddHostile(RESPONSE_REF R)567 ThraddHostile (RESPONSE_REF R)
568 {
569 	if (PLAYER_SAID (R, whats_up_hostile_1))
570 	{
571 		NPCPhrase (GENERAL_INFO_HOSTILE_1);
572 
573 		SET_GAME_STATE (THRADD_INFO, 1);
574 		DISABLE_PHRASE (whats_up_hostile_2);
575 	}
576 	else if (PLAYER_SAID (R, whats_up_hostile_2))
577 	{
578 		BYTE NumVisits;
579 
580 		NumVisits = GET_GAME_STATE (THRADD_INFO);
581 		switch (NumVisits++)
582 		{
583 			case 1:
584 				NPCPhrase (GENERAL_INFO_HOSTILE_2);
585 				break;
586 			case 2:
587 				NPCPhrase (GENERAL_INFO_HOSTILE_3);
588 				break;
589 			case 3:
590 				NPCPhrase (GENERAL_INFO_HOSTILE_4);
591 				--NumVisits;
592 				break;
593 		}
594 		SET_GAME_STATE (THRADD_INFO, NumVisits);
595 
596 		DISABLE_PHRASE (whats_up_hostile_2);
597 	}
598 	else if (PLAYER_SAID (R, what_about_you_1))
599 	{
600 		NPCPhrase (ABOUT_US_1);
601 
602 		SET_GAME_STATE (THRADD_STACK_1, 1);
603 	}
604 	else if (PLAYER_SAID (R, what_about_you_2))
605 	{
606 		NPCPhrase (ABOUT_US_2);
607 
608 		SET_GAME_STATE (THRADD_STACK_1, 2);
609 	}
610 	else if (PLAYER_SAID (R, what_about_urquan_1))
611 	{
612 		NPCPhrase (ABOUT_URQUAN_1);
613 
614 		SET_GAME_STATE (THRADD_STACK_1, 3);
615 	}
616 	else if (PLAYER_SAID (R, what_about_urquan_2))
617 	{
618 		NPCPhrase (ABOUT_URQUAN_2);
619 
620 		SET_GAME_STATE (THRADD_STACK_1, 4);
621 	}
622 	else if (PLAYER_SAID (R, be_friends_1))
623 	{
624 		NPCPhrase (NO_FRIENDS_1);
625 
626 		SET_GAME_STATE (THRADD_HOSTILE_STACK_3, 1);
627 	}
628 	else if (PLAYER_SAID (R, be_friends_2))
629 	{
630 		NPCPhrase (NO_FRIENDS_2);
631 		DISABLE_PHRASE (be_friends_2);
632 	}
633 	else if (PLAYER_SAID (R, how_impressed_urquan_1))
634 	{
635 		NPCPhrase (IMPRESSED_LIKE_SO_1);
636 
637 		SET_GAME_STATE (THRADD_HOSTILE_STACK_4, 1);
638 	}
639 	else if (PLAYER_SAID (R, how_impressed_urquan_2))
640 	{
641 		NPCPhrase (IMPRESSED_LIKE_SO_2);
642 
643 		SET_GAME_STATE (THRADD_MISSION, 5);
644 	}
645 
646 	if (GET_GAME_STATE (THRADD_INFO) == 0)
647 		Response (whats_up_hostile_1, ThraddHostile);
648 	else if (PHRASE_ENABLED (whats_up_hostile_2))
649 		Response (whats_up_hostile_2, ThraddHostile);
650 	switch (GET_GAME_STATE (THRADD_STACK_1))
651 	{
652 		case 0:
653 			Response (what_about_you_1, ThraddHostile);
654 			break;
655 		case 1:
656 			Response (what_about_you_2, ThraddHostile);
657 			break;
658 		case 2:
659 			Response (what_about_urquan_1, ThraddHostile);
660 			break;
661 		case 3:
662 			Response (what_about_urquan_2, ThraddHostile);
663 			break;
664 		case 4:
665 			if (!GET_GAME_STATE (KOHR_AH_FRENZY))
666 				Response (got_idea, ExitConversation);
667 			else
668 			{
669 				SET_GAME_STATE (THRADD_STACK_1, 5);
670 			}
671 			break;
672 	}
673 	if (GET_GAME_STATE (THRADD_HOSTILE_STACK_2) == 0)
674 		Response (submit_1, ExitConversation);
675 	else
676 		Response (submit_2, ExitConversation);
677 	if (GET_GAME_STATE (THRADD_HOSTILE_STACK_3) == 0)
678 		Response (be_friends_1, ThraddHostile);
679 	else if (PHRASE_ENABLED (be_friends_2))
680 		Response (be_friends_2, ThraddHostile);
681 	if (GET_GAME_STATE (THRADD_MISSION) == 4)
682 	{
683 		if (GET_GAME_STATE (THRADD_HOSTILE_STACK_4) == 0)
684 			Response (how_impressed_urquan_1, ThraddHostile);
685 		else
686 			Response (how_impressed_urquan_2, ThraddHostile);
687 	}
688 	if (GET_GAME_STATE (THRADD_HOSTILE_STACK_5) == 0)
689 		Response (bye_hostile_1, ExitConversation);
690 	else
691 		Response (bye_hostile_2, ExitConversation);
692 }
693 
694 static void
Intro(void)695 Intro (void)
696 {
697 	BYTE NumVisits;
698 
699 	if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
700 	{
701 		NPCPhrase (OUT_TAKES);
702 
703 		setSegue (Segue_peace);
704 		return;
705 	}
706 
707 	if (GET_GAME_STATE (AQUA_HELIX))
708 	{
709 		NumVisits = GET_GAME_STATE (HELIX_VISITS);
710 		switch (NumVisits++)
711 		{
712 			case 0:
713 				NPCPhrase (DIE_THIEF_1);
714 				break;
715 			case 1:
716 				NPCPhrase (DIE_THIEF_2);
717 				--NumVisits;
718 				break;
719 		}
720 		SET_GAME_STATE (HELIX_VISITS, NumVisits);
721 
722 		setSegue (Segue_hostile);
723 	}
724 	else if (GET_GAME_STATE (ILWRATH_FIGHT_THRADDASH))
725 	{
726 		NumVisits = GET_GAME_STATE (THRADD_VISITS);
727 		if (GET_GAME_STATE (THRADD_MANNER))
728 		{
729 			switch (NumVisits++)
730 			{
731 				case 0:
732 					NPCPhrase (HAVING_FUN_WITH_ILWRATH_1);
733 					break;
734 				case 1:
735 					NPCPhrase (HAVING_FUN_WITH_ILWRATH_2);
736 					--NumVisits;
737 					break;
738 			}
739 		}
740 		else
741 		{
742 			switch (NumVisits++)
743 			{
744 				case 0:
745 					NPCPhrase (GO_AWAY_FIGHTING_ILWRATH_1);
746 					break;
747 				case 1:
748 					NPCPhrase (GO_AWAY_FIGHTING_ILWRATH_2);
749 					--NumVisits;
750 					break;
751 			}
752 		}
753 		SET_GAME_STATE (THRADD_VISITS, NumVisits);
754 
755 		setSegue (Segue_peace);
756 	}
757 	else if (GET_GAME_STATE (THRADD_MANNER))
758 	{
759 		RESPONSE_REF pStr0, pStr1;
760 
761 		NumVisits = GET_GAME_STATE (THRADD_VISITS);
762 		switch (GET_GAME_STATE (THRADD_INTRO))
763 		{
764 			case 0:
765 				PolitePhrase (NumVisits);
766 				break;
767 			case 1:
768 				RhymePhrase (NumVisits);
769 				break;
770 			case 2:
771 				PigLatinPhrase (NumVisits);
772 				break;
773 			case 3:
774 				LikeYouPhrase (NumVisits);
775 				break;
776 		}
777 		if (++NumVisits < 4)
778 		{
779 			SET_GAME_STATE (THRADD_VISITS, NumVisits);
780 		}
781 
782 		if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
783 		{
784 			pStr0 = WELCOME_HELIX0;
785 			pStr1 = WELCOME_HELIX1;
786 		}
787 		else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
788 		{
789 			pStr0 = WELCOME_HOMEWORLD0;
790 			pStr1 = WELCOME_HOMEWORLD1;
791 		}
792 		else
793 		{
794 			pStr0 = WELCOME_SPACE0;
795 			pStr1 = WELCOME_SPACE1;
796 		}
797 		NPCPhrase (pStr0);
798 		NPCPhrase (GetCultureName ());
799 		NPCPhrase (pStr1);
800 
801 		ThraddAllies ((RESPONSE_REF)0);
802 	}
803 	else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
804 	{
805 		NumVisits = GET_GAME_STATE (HELIX_VISITS);
806 		switch (NumVisits++)
807 		{
808 			case 0:
809 				NPCPhrase (HOSTILE_HELIX_HELLO_1);
810 				break;
811 			case 1:
812 				NPCPhrase (HOSTILE_HELIX_HELLO_2);
813 				--NumVisits;
814 				break;
815 		}
816 		SET_GAME_STATE (HELIX_VISITS, NumVisits);
817 
818 		HelixWorld ((RESPONSE_REF)0);
819 	}
820 	else if (GET_GAME_STATE (THRADDASH_BODY_COUNT) >= THRADDASH_BODY_THRESHOLD)
821 	{
822 		NPCPhrase (AMAZING_PERFORMANCE);
823 
824 		ThraddWorship ((RESPONSE_REF)0);
825 	}
826 	else
827 	{
828 		NumVisits = GET_GAME_STATE (THRADDASH_BODY_COUNT);
829 		if (NumVisits >= 16
830 				&& GET_GAME_STATE (THRADD_BODY_LEVEL) == 1)
831 		{
832 			SET_GAME_STATE (THRADD_BODY_LEVEL, 2);
833 			NPCPhrase (IMPRESSIVE_PERFORMANCE);
834 		}
835 		else if (NumVisits >= 8
836 				&& GET_GAME_STATE (THRADD_BODY_LEVEL) == 0)
837 		{
838 			SET_GAME_STATE (THRADD_BODY_LEVEL, 1);
839 			NPCPhrase (ADEQUATE_PERFORMANCE);
840 		}
841 
842 		{
843 			if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
844 			{
845 				NumVisits = GET_GAME_STATE (THRADD_HOME_VISITS);
846 				switch (NumVisits++)
847 				{
848 					case 0:
849 						NPCPhrase (HOSTILE_HOMEWORLD_HELLO_1);
850 						break;
851 					case 1:
852 						NPCPhrase (HOSTILE_HOMEWORLD_HELLO_2);
853 						break;
854 					case 2:
855 						NPCPhrase (HOSTILE_HOMEWORLD_HELLO_3);
856 						break;
857 					case 3:
858 						NPCPhrase (HOSTILE_HOMEWORLD_HELLO_4);
859 						--NumVisits;
860 						break;
861 				}
862 				SET_GAME_STATE (THRADD_HOME_VISITS, NumVisits);
863 			}
864 			else if ((NumVisits = GET_GAME_STATE (THRADD_MISSION)) == 0
865 					|| NumVisits > 3)
866 			{
867 				NumVisits = GET_GAME_STATE (THRADD_VISITS);
868 				switch (NumVisits++)
869 				{
870 					case 0:
871 						NPCPhrase (HOSTILE_SPACE_HELLO_1);
872 						break;
873 					case 1:
874 						NPCPhrase (HOSTILE_SPACE_HELLO_2);
875 						break;
876 					case 2:
877 						NPCPhrase (HOSTILE_SPACE_HELLO_3);
878 						break;
879 					case 3:
880 						NPCPhrase (HOSTILE_SPACE_HELLO_4);
881 						--NumVisits;
882 						break;
883 				}
884 				SET_GAME_STATE (THRADD_VISITS, NumVisits);
885 			}
886 			else
887 			{
888 				switch (NumVisits)
889 				{
890 					case 1:
891 						if (GET_GAME_STATE (THRADD_MISSION_VISITS) == 0)
892 							NPCPhrase (WE_GO_TO_IMPRESS_URQUAN_1);
893 						else
894 							NPCPhrase (WE_GO_TO_IMPRESS_URQUAN_2);
895 						break;
896 					case 2:
897 						if (GET_GAME_STATE (THRADD_MISSION_VISITS) == 0)
898 							NPCPhrase (WE_IMPRESSING_URQUAN_1);
899 						else
900 							NPCPhrase (WE_IMPRESSING_URQUAN_2);
901 						break;
902 					case 3:
903 						if (GET_GAME_STATE (THRADD_MISSION_VISITS) == 0)
904 							NPCPhrase (WE_IMPRESSED_URQUAN_1);
905 						else
906 							NPCPhrase (WE_IMPRESSED_URQUAN_2);
907 						break;
908 				}
909 				SET_GAME_STATE (THRADD_MISSION_VISITS, 1);
910 			}
911 
912 			ThraddHostile ((RESPONSE_REF)0);
913 		}
914 	}
915 }
916 
917 static COUNT
uninit_thradd(void)918 uninit_thradd (void)
919 {
920 	return (0);
921 }
922 
923 static void
post_thradd_enc(void)924 post_thradd_enc (void)
925 {
926 	// nothing defined so far
927 }
928 
929 LOCDATA*
init_thradd_comm(void)930 init_thradd_comm (void)
931 {
932 	LOCDATA *retval;
933 
934 	thradd_desc.init_encounter_func = Intro;
935 	thradd_desc.post_encounter_func = post_thradd_enc;
936 	thradd_desc.uninit_encounter_func = uninit_thradd;
937 
938 	thradd_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
939 	thradd_desc.AlienTextBaseline.y = 0;
940 	thradd_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
941 
942 	if (GET_GAME_STATE (THRADD_MANNER)
943 			|| LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
944 	{
945 		setSegue (Segue_peace);
946 	}
947 	else
948 	{
949 		setSegue (Segue_hostile);
950 	}
951 	retval = &thradd_desc;
952 
953 	return (retval);
954 }
955