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 supox_desc =
27 {
28 NULL, /* init_encounter_func */
29 NULL, /* post_encounter_func */
30 NULL, /* uninit_encounter_func */
31 SUPOX_PMAP_ANIM, /* AlienFrame */
32 SUPOX_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 SUPOX_COLOR_MAP, /* AlienColorMap */
40 SUPOX_MUSIC, /* AlienSong */
41 NULL_RESOURCE, /* AlienAltSong */
42 0, /* AlienSongFlags */
43 SUPOX_CONVERSATION_PHRASES, /* PlayerPhrases */
44 4, /* NumAnimations */
45 { /* AlienAmbientArray (ambient animations) */
46 {
47 4, /* StartIndex */
48 5, /* NumFrames */
49 YOYO_ANIM
50 | WAIT_TALKING, /* AnimFlags */
51 ONE_SECOND / 10, ONE_SECOND / 10, /* FrameRate */
52 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
53 0, /* BlockMask */
54 },
55 {
56 9, /* StartIndex */
57 10, /* NumFrames */
58 CIRCULAR_ANIM, /* AnimFlags */
59 ONE_SECOND / 15, 0, /* FrameRate */
60 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
61 0, /* BlockMask */
62 },
63 {
64 19, /* StartIndex */
65 10, /* NumFrames */
66 CIRCULAR_ANIM, /* AnimFlags */
67 ONE_SECOND / 15, 0, /* FrameRate */
68 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
69 0, /* BlockMask */
70 },
71 {
72 29, /* StartIndex */
73 13, /* NumFrames */
74 CIRCULAR_ANIM, /* AnimFlags */
75 ONE_SECOND / 15, 0, /* FrameRate */
76 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
77 0, /* BlockMask */
78 },
79 },
80 { /* AlienTransitionDesc */
81 0, /* StartIndex */
82 0, /* NumFrames */
83 0, /* AnimFlags */
84 0, 0, /* FrameRate */
85 0, 0, /* RestartRate */
86 0, /* BlockMask */
87 },
88 { /* AlienTalkDesc */
89 1, /* StartIndex */
90 3, /* NumFrames */
91 0, /* AnimFlags */
92 ONE_SECOND / 15, 0, /* FrameRate */
93 ONE_SECOND / 12, 0, /* RestartRate */
94 0, /* BlockMask */
95 },
96 NULL, /* AlienNumberSpeech - none */
97 /* Filler for loaded resources */
98 NULL, NULL, NULL,
99 NULL,
100 NULL,
101 };
102
103 static void
ExitConversation(RESPONSE_REF R)104 ExitConversation (RESPONSE_REF R)
105 {
106 setSegue (Segue_peace);
107
108 if (PLAYER_SAID (R, bye_neutral))
109 NPCPhrase (GOODBYE_NEUTRAL);
110 else if (PLAYER_SAID (R, what_do_i_do_now))
111 NPCPhrase (FIX_IT);
112 else if (PLAYER_SAID (R, thanks_now_we_eat_you))
113 {
114 NPCPhrase (HIDEOUS_MONSTERS);
115
116 SET_GAME_STATE (SUPOX_HOSTILE, 1);
117 SET_GAME_STATE (SUPOX_HOME_VISITS, 0);
118 SET_GAME_STATE (SUPOX_VISITS, 0);
119 }
120 else if (PLAYER_SAID (R, bye_after_space))
121 NPCPhrase (GOODBYE_AFTER_SPACE);
122 else if (PLAYER_SAID (R, bye_before_space))
123 NPCPhrase (GOODBYE_BEFORE_SPACE);
124 else if (PLAYER_SAID (R, bye_allied_homeworld))
125 NPCPhrase (GOODBYE_ALLIED_HOMEWORLD);
126 else if (PLAYER_SAID (R, can_you_help))
127 {
128 NPCPhrase (HOW_HELP);
129 if (EscortFeasibilityStudy (SUPOX_SHIP) == 0)
130 NPCPhrase (DONT_NEED);
131 else
132 {
133 NPCPhrase (HAVE_4_SHIPS);
134
135 AlienTalkSegue ((COUNT)~0);
136 AddEscortShips (SUPOX_SHIP, 4);
137 }
138 }
139 }
140
141 static void AlliedHome (RESPONSE_REF R);
142
143 static void
AlliedHome(RESPONSE_REF R)144 AlliedHome (RESPONSE_REF R)
145 {
146 BYTE NumVisits, News;
147
148 News = GET_GAME_STATE (SUPOX_WAR_NEWS);
149 NumVisits = GET_GAME_STATE (UTWIG_SUPOX_MISSION);
150 if (PLAYER_SAID (R, how_went_war))
151 {
152 NPCPhrase (ABOUT_BATTLE);
153
154 News |= (1 << 0);
155 }
156 else if (PLAYER_SAID (R, how_goes_war))
157 {
158 if (NumVisits == 1)
159 {
160 NPCPhrase (FLEET_ON_WAY);
161
162 SET_GAME_STATE (SUPOX_WAR_NEWS, 1);
163 }
164 else switch (GET_GAME_STATE (SUPOX_WAR_NEWS))
165 {
166 case 0:
167 NPCPhrase (BATTLE_HAPPENS_1);
168 News = 1;
169 break;
170 case 1:
171 NPCPhrase (BATTLE_HAPPENS_2);
172 News = 2;
173 break;
174 }
175
176 DISABLE_PHRASE (how_goes_war);
177 }
178 else if (PLAYER_SAID (R, learn_new_info))
179 {
180 if (NumVisits < 5)
181 NPCPhrase (NO_NEW_INFO);
182 else
183 {
184 NPCPhrase (SAMATRA);
185
186 News |= (1 << 1);
187 }
188
189 DISABLE_PHRASE (learn_new_info);
190 }
191 else if (PLAYER_SAID (R, what_now_homeworld))
192 {
193 if (NumVisits < 5)
194 NPCPhrase (UP_TO_YOU);
195 else
196 NPCPhrase (HOPE_KILL_EACH_OTHER);
197
198 DISABLE_PHRASE (what_now_homeworld);
199 }
200 else if (PLAYER_SAID (R, how_is_ultron))
201 {
202 NPCPhrase (ULTRON_IS_GREAT);
203
204 DISABLE_PHRASE (how_is_ultron);
205 }
206 SET_GAME_STATE (SUPOX_WAR_NEWS, News);
207
208 if (NumVisits >= 5)
209 {
210 if (!(News & (1 << 0)))
211 Response (how_went_war, AlliedHome);
212 }
213 else if (PHRASE_ENABLED (how_goes_war)
214 && ((NumVisits == 1 && News == 0)
215 || (NumVisits && News < 2)))
216 Response (how_goes_war, AlliedHome);
217 if (PHRASE_ENABLED (learn_new_info))
218 Response (learn_new_info, AlliedHome);
219 if (PHRASE_ENABLED (what_now_homeworld))
220 Response (what_now_homeworld, AlliedHome);
221 if (PHRASE_ENABLED (how_is_ultron))
222 Response (how_is_ultron, AlliedHome);
223 if (NumVisits == 0)
224 Response (can_you_help, ExitConversation);
225 Response (bye_allied_homeworld, ExitConversation);
226 }
227
228 static void
BeforeKohrAh(RESPONSE_REF R)229 BeforeKohrAh (RESPONSE_REF R)
230 {
231 BYTE NumVisits;
232
233 if (PLAYER_SAID (R, whats_up_before_space))
234 {
235 NumVisits = GET_GAME_STATE (SUPOX_INFO);
236 switch (NumVisits++)
237 {
238 case 0:
239 NPCPhrase (GENERAL_INFO_BEFORE_SPACE_1);
240 break;
241 case 1:
242 NPCPhrase (GENERAL_INFO_BEFORE_SPACE_2);
243 --NumVisits;
244 break;
245 }
246 SET_GAME_STATE (SUPOX_INFO, NumVisits);
247
248 DISABLE_PHRASE (whats_up_before_space);
249 }
250 else if (PLAYER_SAID (R, what_now_before_space))
251 {
252 NPCPhrase (DO_THIS_BEFORE_SPACE);
253
254 DISABLE_PHRASE (what_now_before_space);
255 }
256
257 if (PHRASE_ENABLED (whats_up_before_space))
258 Response (whats_up_before_space, BeforeKohrAh);
259 if (PHRASE_ENABLED (what_now_before_space))
260 Response (what_now_before_space, BeforeKohrAh);
261 Response (bye_before_space, ExitConversation);
262 }
263
264 static void
AfterKohrAh(RESPONSE_REF R)265 AfterKohrAh (RESPONSE_REF R)
266 {
267 BYTE NumVisits;
268
269 if (PLAYER_SAID (R, whats_up_after_space))
270 {
271 NumVisits = GET_GAME_STATE (SUPOX_INFO);
272 switch (NumVisits++)
273 {
274 case 0:
275 NPCPhrase (GENERAL_INFO_AFTER_SPACE_1);
276 break;
277 case 1:
278 NPCPhrase (GENERAL_INFO_AFTER_SPACE_2);
279 --NumVisits;
280 break;
281 }
282 SET_GAME_STATE (SUPOX_INFO, NumVisits);
283
284 DISABLE_PHRASE (whats_up_after_space);
285 }
286 else if (PLAYER_SAID (R, what_now_after_space))
287 {
288 NPCPhrase (DO_THIS_AFTER_SPACE);
289
290 DISABLE_PHRASE (what_now_after_space);
291 }
292
293 if (PHRASE_ENABLED (whats_up_after_space))
294 Response (whats_up_after_space, AfterKohrAh);
295 if (PHRASE_ENABLED (what_now_after_space))
296 Response (what_now_after_space, AfterKohrAh);
297 Response (bye_after_space, ExitConversation);
298 }
299
300 static void
NeutralSupox(RESPONSE_REF R)301 NeutralSupox (RESPONSE_REF R)
302 {
303 BYTE i, LastStack, NumVisits;
304 RESPONSE_REF pStr[3];
305
306 LastStack = 0;
307 pStr[0] = pStr[1] = pStr[2] = 0;
308 if (PLAYER_SAID (R, i_am0))
309 {
310 NPCPhrase (WE_ARE_SUPOX);
311
312 SET_GAME_STATE (SUPOX_STACK1, 1);
313 DISABLE_PHRASE (i_am0);
314 }
315 else if (PLAYER_SAID (R, my_ship0))
316 {
317 NPCPhrase (OUR_SHIP);
318
319 SET_GAME_STATE (SUPOX_STACK1, 2);
320 DISABLE_PHRASE (my_ship0);
321 }
322 else if (PLAYER_SAID (R, from_alliance0))
323 {
324 NPCPhrase (FROM_SUPOX);
325
326 SET_GAME_STATE (SUPOX_STACK1, 3);
327 DISABLE_PHRASE (from_alliance0);
328 }
329 else if (PLAYER_SAID (R, are_you_copying))
330 {
331 NPCPhrase (YEAH_SORRY);
332
333 SET_GAME_STATE (SUPOX_STACK1, 4);
334 }
335 else if (PLAYER_SAID (R, why_copy))
336 {
337 NPCPhrase (SYMBIOTS);
338
339 SET_GAME_STATE (SUPOX_STACK1, 5);
340 }
341 else if (PLAYER_SAID (R, tell_us_of_your_species))
342 {
343 NPCPhrase (OUR_SPECIES);
344
345 LastStack = 1;
346 SET_GAME_STATE (SUPOX_STACK2, 1);
347 }
348 else if (PLAYER_SAID (R, plants_arent_intelligent))
349 {
350 NPCPhrase (PROVES_WERE_SPECIAL);
351
352 SET_GAME_STATE (SUPOX_STACK2, 2);
353 }
354 else if (PLAYER_SAID (R, anyone_around_here))
355 {
356 NPCPhrase (UTWIG_NEARBY);
357
358 LastStack = 2;
359 SET_GAME_STATE (SUPOX_WAR_NEWS, 1);
360 StartSphereTracking (UTWIG_SHIP);
361 }
362 else if (PLAYER_SAID (R, what_relation_to_utwig))
363 {
364 NPCPhrase (UTWIG_ALLIES);
365
366 LastStack = 2;
367 SET_GAME_STATE (SUPOX_WAR_NEWS, 1);
368 }
369 else if (PLAYER_SAID (R, whats_wrong_with_utwig))
370 {
371 NPCPhrase (BROKE_ULTRON);
372
373 LastStack = 2;
374 SET_GAME_STATE (SUPOX_WAR_NEWS, 2);
375 }
376 else if (PLAYER_SAID (R, whats_ultron))
377 {
378 NPCPhrase (TAKE_ULTRON);
379
380 SET_GAME_STATE (SUPOX_WAR_NEWS, 0);
381 SET_GAME_STATE (ULTRON_CONDITION, 1);
382
383 Response (what_do_i_do_now, ExitConversation);
384 Response (thanks_now_we_eat_you, ExitConversation);
385
386 return;
387 }
388 else if (PLAYER_SAID (R, got_fixed_ultron))
389 {
390 NPCPhrase (GOOD_GIVE_TO_UTWIG);
391
392 SET_GAME_STATE (SUPOX_ULTRON_HELP, 1);
393 }
394 else if (PLAYER_SAID (R, look_i_repaired_lots))
395 {
396 NPCPhrase (ALMOST_THERE);
397
398 SET_GAME_STATE (SUPOX_ULTRON_HELP, 1);
399 }
400 else if (PLAYER_SAID (R, look_i_slightly_repaired))
401 {
402 NPCPhrase (GREAT_DO_MORE);
403
404 SET_GAME_STATE (SUPOX_ULTRON_HELP, 1);
405 }
406 else if (PLAYER_SAID (R, where_get_repairs))
407 {
408 NPCPhrase (ANCIENT_RHYME);
409
410 SET_GAME_STATE (SUPOX_ULTRON_HELP, 1);
411 }
412
413 switch (GET_GAME_STATE (SUPOX_STACK2))
414 {
415 case 0:
416 pStr[1] = tell_us_of_your_species;
417 break;
418 case 1:
419 pStr[1] = plants_arent_intelligent;
420 break;
421 }
422 switch (GET_GAME_STATE (SUPOX_STACK1))
423 {
424 case 0:
425 construct_response (shared_phrase_buf,
426 i_am0,
427 GLOBAL_SIS (CommanderName),
428 i_am1,
429 (UNICODE*)NULL);
430 pStr[0] = i_am0;
431 pStr[1] = 0;
432 break;
433 case 1:
434 construct_response (shared_phrase_buf,
435 my_ship0,
436 GLOBAL_SIS (ShipName),
437 my_ship1,
438 (UNICODE*)NULL);
439 pStr[0] = my_ship0;
440 pStr[1] = 0;
441 break;
442 case 2:
443 {
444 UNICODE buf[ALLIANCE_NAME_BUFSIZE];
445
446 GetAllianceName (buf, name_1);
447 construct_response (
448 shared_phrase_buf,
449 from_alliance0,
450 buf,
451 from_alliance1,
452 (UNICODE*)NULL);
453 }
454 pStr[0] = from_alliance0;
455 pStr[1] = 0;
456 break;
457 case 3:
458 pStr[0] = are_you_copying;
459 pStr[1] = 0;
460 break;
461 case 4:
462 pStr[0] = why_copy;
463 pStr[1] = 0;
464 break;
465 }
466 NumVisits = GET_GAME_STATE (ULTRON_CONDITION);
467 if (NumVisits == 0)
468 {
469 switch (GET_GAME_STATE (SUPOX_WAR_NEWS))
470 {
471 case 0:
472 if (GET_GAME_STATE (UTWIG_VISITS)
473 || GET_GAME_STATE (UTWIG_HOME_VISITS)
474 || GET_GAME_STATE (BOMB_VISITS))
475 pStr[2] = what_relation_to_utwig;
476 else
477 pStr[2] = anyone_around_here;
478 break;
479 case 1:
480 pStr[2] = whats_wrong_with_utwig;
481 break;
482 case 2:
483 pStr[2] = whats_ultron;
484 break;
485 }
486 }
487 if (pStr[LastStack])
488 {
489 if (LastStack != 0 || GET_GAME_STATE (SUPOX_STACK1) > 2)
490 Response (pStr[LastStack], NeutralSupox);
491 else
492 DoResponsePhrase (pStr[LastStack], NeutralSupox, shared_phrase_buf);
493 }
494 for (i = 0; i < 3; ++i)
495 {
496 if (i != LastStack && pStr[i])
497 {
498 if (i != 0 || GET_GAME_STATE (SUPOX_STACK1) > 2)
499 Response (pStr[i], NeutralSupox);
500 else
501 DoResponsePhrase (pStr[i], NeutralSupox, shared_phrase_buf);
502 }
503 }
504 if (!GET_GAME_STATE (SUPOX_ULTRON_HELP))
505 {
506 switch (NumVisits)
507 {
508 case 1:
509 Response (where_get_repairs, NeutralSupox);
510 break;
511 case 2:
512 Response (look_i_slightly_repaired, NeutralSupox);
513 break;
514 case 3:
515 Response (look_i_repaired_lots, NeutralSupox);
516 break;
517 case 4:
518 Response (got_fixed_ultron, NeutralSupox);
519 break;
520 }
521 }
522 Response (bye_neutral, ExitConversation);
523 }
524
525 static void
Intro(void)526 Intro (void)
527 {
528 BYTE NumVisits;
529
530 if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
531 {
532 NPCPhrase (OUT_TAKES);
533
534 setSegue (Segue_peace);
535 return;
536 }
537
538 if (GET_GAME_STATE (SUPOX_HOSTILE))
539 {
540 NumVisits = GET_GAME_STATE (SUPOX_VISITS);
541 switch (NumVisits++)
542 {
543 case 0:
544 NPCPhrase (HOSTILE_SPACE_HELLO_1);
545 break;
546 case 1:
547 NPCPhrase (HOSTILE_SPACE_HELLO_2);
548 --NumVisits;
549 break;
550 }
551 SET_GAME_STATE (SUPOX_VISITS, NumVisits);
552
553 setSegue (Segue_peace);
554 }
555 else if (CheckAlliance (SUPOX_SHIP) == GOOD_GUY)
556 {
557 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
558 {
559 NumVisits = GET_GAME_STATE (SUPOX_HOME_VISITS);
560 switch (NumVisits++)
561 {
562 case 0:
563 NPCPhrase (ALLIED_HOMEWORLD_HELLO_1);
564 break;
565 case 1:
566 NPCPhrase (ALLIED_HOMEWORLD_HELLO_2);
567 break;
568 case 2:
569 NPCPhrase (ALLIED_HOMEWORLD_HELLO_3);
570 break;
571 case 3:
572 NPCPhrase (ALLIED_HOMEWORLD_HELLO_4);
573 --NumVisits;
574 break;
575 }
576 SET_GAME_STATE (SUPOX_HOME_VISITS, NumVisits);
577
578 AlliedHome ((RESPONSE_REF)0);
579 }
580 else
581 {
582 NumVisits = GET_GAME_STATE (UTWIG_SUPOX_MISSION);
583 if (NumVisits == 1)
584 {
585 NumVisits = GET_GAME_STATE (SUPOX_VISITS);
586 switch (NumVisits++)
587 {
588 case 0:
589 NPCPhrase (HELLO_BEFORE_KOHRAH_SPACE_1);
590 break;
591 case 1:
592 NPCPhrase (HELLO_BEFORE_KOHRAH_SPACE_2);
593 --NumVisits;
594 break;
595 }
596 SET_GAME_STATE (SUPOX_VISITS, NumVisits);
597
598 BeforeKohrAh ((RESPONSE_REF)0);
599 }
600 else if (NumVisits < 5)
601 {
602 NumVisits = GET_GAME_STATE (SUPOX_VISITS);
603 switch (NumVisits++)
604 {
605 case 0:
606 NPCPhrase (HELLO_DURING_KOHRAH_SPACE_1);
607 break;
608 case 1:
609 NPCPhrase (HELLO_DURING_KOHRAH_SPACE_2);
610 --NumVisits;
611 break;
612 }
613 SET_GAME_STATE (SUPOX_VISITS, NumVisits);
614 }
615 else
616 {
617 NumVisits = GET_GAME_STATE (SUPOX_VISITS);
618 switch (NumVisits++)
619 {
620 case 0:
621 NPCPhrase (HELLO_AFTER_KOHRAH_SPACE_1);
622 break;
623 case 1:
624 NPCPhrase (HELLO_AFTER_KOHRAH_SPACE_2);
625 --NumVisits;
626 break;
627 }
628 SET_GAME_STATE (SUPOX_VISITS, NumVisits);
629
630 AfterKohrAh ((RESPONSE_REF)0);
631 }
632 }
633 }
634 else
635 {
636 if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
637 {
638 NumVisits = GET_GAME_STATE (SUPOX_HOME_VISITS);
639 switch (NumVisits++)
640 {
641 case 0:
642 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_1);
643 break;
644 case 1:
645 NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_2);
646 --NumVisits;
647 break;
648 }
649 SET_GAME_STATE (SUPOX_HOME_VISITS, NumVisits);
650 }
651 else
652 {
653 NumVisits = GET_GAME_STATE (SUPOX_VISITS);
654 switch (NumVisits++)
655 {
656 case 0:
657 NPCPhrase (NEUTRAL_SPACE_HELLO_1);
658 break;
659 case 1:
660 NPCPhrase (NEUTRAL_SPACE_HELLO_2);
661 --NumVisits;
662 break;
663 }
664 SET_GAME_STATE (SUPOX_VISITS, NumVisits);
665 }
666
667 NeutralSupox ((RESPONSE_REF)0);
668 }
669 }
670
671 static COUNT
uninit_supox(void)672 uninit_supox (void)
673 {
674 return (0);
675 }
676
677 static void
post_supox_enc(void)678 post_supox_enc (void)
679 {
680 // nothing defined so far
681 }
682
683 LOCDATA*
init_supox_comm(void)684 init_supox_comm (void)
685 {
686 LOCDATA *retval;
687
688 supox_desc.init_encounter_func = Intro;
689 supox_desc.post_encounter_func = post_supox_enc;
690 supox_desc.uninit_encounter_func = uninit_supox;
691
692 supox_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
693 supox_desc.AlienTextBaseline.y = 0;
694 supox_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
695
696 if (!GET_GAME_STATE (SUPOX_HOSTILE)
697 || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
698 {
699 setSegue (Segue_peace);
700 }
701 else
702 {
703 setSegue (Segue_hostile);
704 }
705 retval = &supox_desc;
706
707 return (retval);
708 }
709