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