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