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 "../yehat/resinst.h"
21 #include "strings.h"
22
23 #include "uqm/build.h"
24
25
26 static LOCDATA yehat_desc =
27 {
28 NULL, /* init_encounter_func */
29 NULL, /* post_encounter_func */
30 NULL, /* uninit_encounter_func */
31 YEHAT_PMAP_ANIM, /* AlienFrame */
32 YEHAT_FONT, /* AlienFont */
33 WHITE_COLOR_INIT, /* AlienTextFColor */
34 BLACK_COLOR_INIT, /* AlienTextBColor */
35 {0, 0}, /* AlienTextBaseline */
36 0, /* (SIS_TEXT_WIDTH - 16) * 2 / 3, */ /* AlienTextWidth */
37 ALIGN_CENTER, /* AlienTextAlign */
38 VALIGN_MIDDLE, /* AlienTextValign */
39 YEHAT_COLOR_MAP, /* AlienColorMap */
40 YEHAT_MUSIC, /* AlienSong */
41 NULL_RESOURCE, /* AlienAltSong */
42 0, /* AlienSongFlags */
43 REBEL_CONVERSATION_PHRASES, /* PlayerPhrases */
44 15, /* NumAnimations */
45 { /* AlienAmbientArray (ambient animations) */
46 { /* right hand-wing tapping keyboard; front guy */
47 4, /* StartIndex */
48 3, /* NumFrames */
49 YOYO_ANIM
50 | WAIT_TALKING, /* AnimFlags */
51 ONE_SECOND / 10, ONE_SECOND / 10, /* FrameRate */
52 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
53 (1 << 6) | (1 << 7),
54 },
55 { /* left hand-wing tapping keyboard; front guy */
56 7, /* StartIndex */
57 3, /* NumFrames */
58 YOYO_ANIM
59 | WAIT_TALKING, /* AnimFlags */
60 ONE_SECOND / 10, ONE_SECOND / 10, /* FrameRate */
61 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
62 (1 << 6) | (1 << 7),
63 },
64 {
65 10, /* StartIndex */
66 3, /* NumFrames */
67 YOYO_ANIM, /* AnimFlags */
68 ONE_SECOND / 20, 0, /* FrameRate */
69 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
70 (1 << 4) | (1 << 14),
71 },
72 {
73 13, /* StartIndex */
74 3, /* NumFrames */
75 YOYO_ANIM, /* AnimFlags */
76 ONE_SECOND / 20, 0, /* FrameRate */
77 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
78 (1 << 5),
79 },
80 {
81 16, /* StartIndex */
82 5, /* NumFrames */
83 YOYO_ANIM, /* AnimFlags */
84 ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
85 ONE_SECOND * 10, ONE_SECOND * 3,/* RestartRate */
86 (1 << 2) | (1 << 14),
87 },
88 {
89 21, /* StartIndex */
90 5, /* NumFrames */
91 YOYO_ANIM, /* AnimFlags */
92 ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
93 ONE_SECOND * 10, ONE_SECOND * 3,/* RestartRate */
94 (1 << 3),
95 },
96 { /* right arm-wing rising; front guy */
97 26, /* StartIndex */
98 2, /* NumFrames */
99 YOYO_ANIM
100 | WAIT_TALKING, /* AnimFlags */
101 ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
102 ONE_SECOND * 10, ONE_SECOND * 3,/* RestartRate */
103 (1 << 0) | (1 << 1),
104 },
105 { /* left arm-wing rising; front guy */
106 28, /* StartIndex */
107 2, /* NumFrames */
108 YOYO_ANIM
109 | WAIT_TALKING, /* AnimFlags */
110 ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
111 ONE_SECOND * 10, ONE_SECOND * 3,/* RestartRate */
112 (1 << 0) | (1 << 1),
113 },
114 {
115 30, /* StartIndex */
116 3, /* NumFrames */
117 YOYO_ANIM, /* AnimFlags */
118 ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */
119 ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */
120 0, /* BlockMask */
121 },
122 {
123 33, /* StartIndex */
124 3, /* NumFrames */
125 YOYO_ANIM, /* AnimFlags */
126 ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */
127 ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */
128 0, /* BlockMask */
129 },
130 {
131 36, /* StartIndex */
132 3, /* NumFrames */
133 YOYO_ANIM, /* AnimFlags */
134 ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */
135 ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */
136 0, /* BlockMask */
137 },
138 {
139 39, /* StartIndex */
140 3, /* NumFrames */
141 YOYO_ANIM, /* AnimFlags */
142 ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */
143 ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */
144 0, /* BlockMask */
145 },
146 {
147 42, /* StartIndex */
148 3, /* NumFrames */
149 YOYO_ANIM, /* AnimFlags */
150 ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */
151 ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */
152 0, /* BlockMask */
153 },
154 {
155 45, /* StartIndex */
156 3, /* NumFrames */
157 YOYO_ANIM, /* AnimFlags */
158 ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */
159 ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */
160 0, /* BlockMask */
161 },
162 {
163 48, /* StartIndex */
164 4, /* NumFrames */
165 YOYO_ANIM
166 | WAIT_TALKING, /* AnimFlags */
167 ONE_SECOND / 30, 0, /* FrameRate */
168 ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
169 (1 << 2) | (1 << 4),
170 },
171 },
172 { /* AlienTransitionDesc - empty */
173 0, /* StartIndex */
174 0, /* NumFrames */
175 0, /* AnimFlags */
176 0, 0, /* FrameRate */
177 0, 0, /* RestartRate */
178 0, /* BlockMask */
179 },
180 { /* AlienTalkDesc */
181 1, /* StartIndex */
182 3, /* NumFrames */
183 0, /* AnimFlags */
184 ONE_SECOND / 15, 0, /* FrameRate */
185 ONE_SECOND / 12, 0, /* RestartRate */
186 0, /* BlockMask */
187 },
188 NULL, /* AlienNumberSpeech - none */
189 /* Filler for loaded resources */
190 NULL, NULL, NULL,
191 NULL,
192 NULL,
193 };
194
195 static void
PrepareShip(void)196 PrepareShip (void)
197 {
198 BYTE mi, di, yi;
199
200 mi = (GLOBAL (GameClock.month_index) % 12) + 1;
201 SET_GAME_STATE (YEHAT_SHIP_MONTH, mi);
202 if ((di = GLOBAL (GameClock.day_index)) > 28)
203 di = 28;
204 SET_GAME_STATE (YEHAT_SHIP_DAY, di);
205 yi = (BYTE)(GLOBAL (GameClock.year_index) - START_YEAR);
206 if (mi == 1)
207 ++yi;
208 SET_GAME_STATE (YEHAT_SHIP_YEAR, yi);
209 }
210
211 static void
ExitConversation(RESPONSE_REF R)212 ExitConversation (RESPONSE_REF R)
213 {
214 if (PLAYER_SAID (R, bye_rebel))
215 NPCPhrase (GOODBYE_REBEL);
216 }
217
218 static void Rebels (RESPONSE_REF R);
219
220 static void
RebelInfo(RESPONSE_REF R)221 RebelInfo (RESPONSE_REF R)
222 {
223 BYTE InfoLeft;
224
225 InfoLeft = FALSE;
226 if (PLAYER_SAID (R, give_info_rebels))
227 NPCPhrase (WHAT_INFO);
228 else if (PLAYER_SAID (R, what_about_urquan))
229 {
230 NPCPhrase (ABOUT_URQUAN);
231
232 DISABLE_PHRASE (what_about_urquan);
233 }
234 else if (PLAYER_SAID (R, what_about_royalty))
235 {
236 NPCPhrase (ABOUT_ROYALTY);
237
238 DISABLE_PHRASE (what_about_royalty);
239 }
240 else if (PLAYER_SAID (R, what_about_war))
241 {
242 NPCPhrase (ABOUT_WAR);
243
244 DISABLE_PHRASE (what_about_war);
245 }
246 else if (PLAYER_SAID (R, what_about_vux))
247 {
248 NPCPhrase (ABOUT_VUX);
249
250 DISABLE_PHRASE (what_about_vux);
251 }
252 else if (PLAYER_SAID (R, what_about_clue))
253 {
254 NPCPhrase (ABOUT_CLUE);
255
256 DISABLE_PHRASE (what_about_clue);
257 }
258
259 if (PHRASE_ENABLED (what_about_urquan))
260 {
261 Response (what_about_urquan, RebelInfo);
262 InfoLeft = TRUE;
263 }
264 if (PHRASE_ENABLED (what_about_royalty))
265 {
266 Response (what_about_royalty, RebelInfo);
267 InfoLeft = TRUE;
268 }
269 if (PHRASE_ENABLED (what_about_war))
270 {
271 Response (what_about_war, RebelInfo);
272 InfoLeft = TRUE;
273 }
274 if (PHRASE_ENABLED (what_about_vux))
275 {
276 Response (what_about_vux, RebelInfo);
277 InfoLeft = TRUE;
278 }
279 if (PHRASE_ENABLED (what_about_clue))
280 {
281 Response (what_about_clue, RebelInfo);
282 InfoLeft = TRUE;
283 }
284 Response (enough_info, Rebels);
285
286 if (!InfoLeft)
287 {
288 DISABLE_PHRASE (give_info_rebels);
289 }
290 }
291
292 static void
Rebels(RESPONSE_REF R)293 Rebels (RESPONSE_REF R)
294 {
295 SBYTE NumVisits;
296
297 if (PLAYER_SAID (R, how_goes_revolution))
298 {
299 NumVisits = GET_GAME_STATE (YEHAT_REBEL_INFO);
300 switch (NumVisits++)
301 {
302 case 0:
303 NPCPhrase (REBEL_REVOLUTION_1);
304 break;
305 case 1:
306 NPCPhrase (REBEL_REVOLUTION_2);
307 break;
308 case 2:
309 NPCPhrase (REBEL_REVOLUTION_3);
310 break;
311 case 3:
312 NPCPhrase (REBEL_REVOLUTION_4);
313 --NumVisits;
314 break;
315 }
316 SET_GAME_STATE (YEHAT_REBEL_INFO, NumVisits);
317
318 DISABLE_PHRASE (how_goes_revolution);
319 }
320 else if (PLAYER_SAID (R, any_ships))
321 {
322 if (GET_GAME_STATE (YEHAT_SHIP_MONTH)
323 && ((NumVisits = (GLOBAL (GameClock.year_index) - START_YEAR) - GET_GAME_STATE (YEHAT_SHIP_YEAR)) < 0
324 || ((NumVisits == 0 && (NumVisits = GLOBAL (GameClock.month_index) - GET_GAME_STATE (YEHAT_SHIP_MONTH)) < 0)
325 || (NumVisits == 0 && GLOBAL (GameClock.day_index) < GET_GAME_STATE (YEHAT_SHIP_DAY)))))
326 NPCPhrase (NO_SHIPS_YET);
327 else if ((NumVisits = EscortFeasibilityStudy (YEHAT_SHIP)) == 0)
328 NPCPhrase (NO_ROOM);
329 else
330 {
331 #define NUM_YEHAT_SHIPS 4
332 if (NumVisits < NUM_YEHAT_SHIPS)
333 NPCPhrase (HAVE_FEW_SHIPS);
334 else
335 {
336 NumVisits = NUM_YEHAT_SHIPS;
337 NPCPhrase (HAVE_ALL_SHIPS);
338 }
339
340 AlienTalkSegue ((COUNT)~0);
341 AddEscortShips (YEHAT_SHIP, NumVisits);
342 PrepareShip ();
343 }
344
345 DISABLE_PHRASE (any_ships);
346 }
347 else if (PLAYER_SAID (R, what_about_pkunk_rebel))
348 {
349 if (GET_GAME_STATE (YEHAT_ABSORBED_PKUNK))
350 NPCPhrase (PKUNK_ABSORBED_REBEL);
351 else
352 NPCPhrase (HATE_PKUNK_REBEL);
353
354 SET_GAME_STATE (YEHAT_REBEL_TOLD_PKUNK, 1);
355 }
356 else if (PLAYER_SAID (R, enough_info))
357 NPCPhrase (OK_ENOUGH_INFO);
358
359 if (PHRASE_ENABLED (how_goes_revolution))
360 Response (how_goes_revolution, Rebels);
361 if (!GET_GAME_STATE (YEHAT_REBEL_TOLD_PKUNK)
362 && GET_GAME_STATE (PKUNK_VISITS)
363 && GET_GAME_STATE (PKUNK_HOME_VISITS))
364 Response (what_about_pkunk_rebel, Rebels);
365 if (PHRASE_ENABLED (any_ships))
366 Response (any_ships, Rebels);
367 if (PHRASE_ENABLED (give_info_rebels))
368 {
369 Response (give_info_rebels, RebelInfo);
370 }
371 Response (bye_rebel, ExitConversation);
372 }
373
374 static void
Intro(void)375 Intro (void)
376 {
377 BYTE NumVisits;
378
379 setSegue (Segue_peace);
380 if (LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE)
381 {
382 NPCPhrase (YEHAT_CAVALRY);
383 AlienTalkSegue ((COUNT)~0);
384
385 NumVisits = (BYTE) EscortFeasibilityStudy (YEHAT_REBEL_SHIP);
386 if (NumVisits > 8)
387 NumVisits = 8;
388 AddEscortShips (YEHAT_REBEL_SHIP, NumVisits - (NumVisits >> 1));
389 AddEscortShips (PKUNK_SHIP, NumVisits >> 1);
390 }
391 else
392 {
393 NumVisits = GET_GAME_STATE (YEHAT_REBEL_VISITS);
394 switch (NumVisits++)
395 {
396 case 0:
397 NPCPhrase (REBEL_HELLO_1);
398 break;
399 case 1:
400 NPCPhrase (REBEL_HELLO_2);
401 break;
402 case 2:
403 NPCPhrase (REBEL_HELLO_3);
404 break;
405 case 3:
406 NPCPhrase (REBEL_HELLO_4);
407 --NumVisits;
408 break;
409 }
410 SET_GAME_STATE (YEHAT_REBEL_VISITS, NumVisits);
411
412 Rebels ((RESPONSE_REF)0);
413 }
414 }
415
416 static COUNT
uninit_yehat(void)417 uninit_yehat (void)
418 {
419 return (0);
420 }
421
422 static void
post_yehat_enc(void)423 post_yehat_enc (void)
424 {
425 // nothing defined so far
426 }
427
428 LOCDATA*
init_rebel_yehat_comm(void)429 init_rebel_yehat_comm (void)
430 {
431 LOCDATA *retval;
432
433 yehat_desc.init_encounter_func = Intro;
434 yehat_desc.post_encounter_func = post_yehat_enc;
435 yehat_desc.uninit_encounter_func = uninit_yehat;
436
437 yehat_desc.AlienTextBaseline.x = SIS_SCREEN_WIDTH * 2 / 3;
438 yehat_desc.AlienTextBaseline.y = 60;
439 yehat_desc.AlienTextWidth = (SIS_TEXT_WIDTH - 16) * 2 / 3;
440
441 // use alternate "Rebels" track if available
442 yehat_desc.AlienAltSongRes = REBEL_MUSIC;
443 yehat_desc.AlienSongFlags |= LDASF_USE_ALTERNATE;
444
445 setSegue (Segue_peace);
446 retval = &yehat_desc;
447
448 return (retval);
449 }
450