Make traders (and particularly Anacondas) less hostile.
[newkind] / alg_main.c
CommitLineData
84bbd123 1/*
2 * Elite - The New Kind.
3 *
4 * Reverse engineered from the BBC disk version of Elite.
5 * Additional material by C.J.Pinder.
6 *
7 * The original Elite code is (C) I.Bell & D.Braben 1984.
8 * This version re-engineered in C by C.J.Pinder 1999-2001.
9 *
10 * email: <christian@newkind.co.uk>
11 *
12 *
13 */
14
15/*
16 * alg_main.c
17 *
18 * Allegro version of the main game handler.
19 */
20
21
22#include <stdio.h>
23#include <string.h>
24#include <math.h>
25#include <ctype.h>
26#include <time.h>
27#include <stdlib.h>
28
29#include "allegro.h"
30
31#include "config.h"
32#include "gfx.h"
33#include "main.h"
34#include "vector.h"
35#include "alg_data.h"
36#include "elite.h"
37#include "docked.h"
38#include "intro.h"
39#include "shipdata.h"
40#include "shipface.h"
41#include "space.h"
42#include "sound.h"
43#include "threed.h"
44#include "swat.h"
45#include "random.h"
46#include "options.h"
47#include "stars.h"
48#include "missions.h"
49#include "pilot.h"
50#include "file.h"
51#include "keyboard.h"
52
53
54
55int old_cross_x, old_cross_y;
56int cross_timer;
57
58int draw_lasers;
59int mcount;
60int message_count;
61char message_string[80];
62int rolling;
63int climbing;
64int game_paused;
65int have_joystick;
1a8abebd 66int identify;
67int scanner_zoom = 1;
84bbd123 68
69int find_input;
70char find_name[20];
71
72
73
74/*
75 * Initialise the game parameters.
76 */
77
78void initialise_game(void)
79{
80 set_rand_seed (time(NULL));
81 current_screen = SCR_INTRO_ONE;
82
83 restore_saved_commander();
84
85 flight_speed = 1;
86 flight_roll = 0;
87 flight_climb = 0;
88 docked = 1;
89 front_shield = 255;
90 aft_shield = 255;
91 energy = 255;
92 draw_lasers = 0;
93 mcount = 0;
94 hyper_ready = 0;
95 detonate_bomb = 0;
96 find_input = 0;
97 witchspace = 0;
98 game_paused = 0;
99 auto_pilot = 0;
100
101 create_new_stars();
102 clear_universe();
103
104 cross_x = -1;
105 cross_y = -1;
106 cross_timer = 0;
107
108
109 myship.max_speed = 40; /* 0.27 Light Mach */
110 myship.max_roll = 31;
111 myship.max_climb = 8; /* CF 8 */
112 myship.max_fuel = 70; /* 7.0 Light Years */
113}
114
115
116void finish_game (void)
117{
118 finish = 1;
119 game_over = 1;
120}
121
122
123
124
125
126
127
128/*
129 * Move the planet chart cross hairs to specified position.
130 */
131
132
133void move_cross (int dx, int dy)
134{
135 cross_timer = 5;
136
1a8abebd 137 if (kbd_ctrl_pressed) {
138 dx *= 4;
139 dy *= 4;
140 }
141
84bbd123 142 if (current_screen == SCR_SHORT_RANGE)
143 {
144 cross_x += (dx * 4);
145 cross_y += (dy * 4);
146 return;
147 }
148
149 if (current_screen == SCR_GALACTIC_CHART)
150 {
151 cross_x += (dx * 2);
152 cross_y += (dy * 2);
153
154 if (cross_x < 1)
155 cross_x = 1;
156
157 if (cross_x > 510)
158 cross_x = 510;
159
160 if (cross_y < 37)
161 cross_y = 37;
162
163 if (cross_y > 293)
164 cross_y = 293;
165 }
166}
167
168
169/*
170 * Draw the cross hairs at the specified position.
171 */
172
173void draw_cross (int cx, int cy)
174{
175 if (current_screen == SCR_SHORT_RANGE)
176 {
177 gfx_set_clip_region (1, 37, 510, 339);
178 xor_mode (TRUE);
179 gfx_draw_colour_line (cx - 16, cy, cx + 16, cy, GFX_COL_RED);
180 gfx_draw_colour_line (cx, cy - 16, cx, cy + 16, GFX_COL_RED);
181 xor_mode (FALSE);
182 gfx_set_clip_region (1, 1, 510, 383);
183 return;
184 }
185
186 if (current_screen == SCR_GALACTIC_CHART)
187 {
188 gfx_set_clip_region (1, 37, 510, 293);
189 xor_mode (TRUE);
190 gfx_draw_colour_line (cx - 8, cy, cx + 8, cy, GFX_COL_RED);
191 gfx_draw_colour_line (cx, cy - 8, cx, cy + 8, GFX_COL_RED);
192 xor_mode (FALSE);
193 gfx_set_clip_region (1, 1, 510, 383);
194 }
195}
196
197
198
199void draw_laser_sights(void)
200{
201 int laser = 0;
202 int x1,y1,x2,y2;
203
204 switch (current_screen)
205 {
206 case SCR_FRONT_VIEW:
207 gfx_display_centre_text (32, "Front View", 120, GFX_COL_WHITE);
208 laser = cmdr.front_laser;
209 break;
210
211 case SCR_REAR_VIEW:
212 gfx_display_centre_text (32, "Rear View", 120, GFX_COL_WHITE);
213 laser = cmdr.rear_laser;
214 break;
215
216 case SCR_LEFT_VIEW:
217 gfx_display_centre_text (32, "Left View", 120, GFX_COL_WHITE);
218 laser = cmdr.left_laser;
219 break;
220
221 case SCR_RIGHT_VIEW:
222 gfx_display_centre_text (32, "Right View", 120, GFX_COL_WHITE);
223 laser = cmdr.right_laser;
224 break;
225 }
226
227
228 if (laser)
229 {
230 x1 = 128 * GFX_SCALE;
231 y1 = (96-8) * GFX_SCALE;
232 y2 = (96-16) * GFX_SCALE;
233
234 gfx_draw_colour_line (x1-1, y1, x1-1, y2, GFX_COL_GREY_1);
235 gfx_draw_colour_line (x1, y1, x1, y2, GFX_COL_WHITE);
236 gfx_draw_colour_line (x1+1, y1, x1+1, y2, GFX_COL_GREY_1);
237
238 y1 = (96+8) * GFX_SCALE;
239 y2 = (96+16) * GFX_SCALE;
240
241 gfx_draw_colour_line (x1-1, y1, x1-1, y2, GFX_COL_GREY_1);
242 gfx_draw_colour_line (x1, y1, x1, y2, GFX_COL_WHITE);
243 gfx_draw_colour_line (x1+1, y1, x1+1, y2, GFX_COL_GREY_1);
244
245 x1 = (128-8) * GFX_SCALE;
246 y1 = 96 * GFX_SCALE;
247 x2 = (128-16) * GFX_SCALE;
248
249 gfx_draw_colour_line (x1, y1-1, x2, y1-1, GFX_COL_GREY_1);
250 gfx_draw_colour_line (x1, y1, x2, y1, GFX_COL_WHITE);
251 gfx_draw_colour_line (x1, y1+1, x2, y1+1, GFX_COL_GREY_1);
252
253 x1 = (128+8) * GFX_SCALE;
254 x2 = (128+16) * GFX_SCALE;
255
256 gfx_draw_colour_line (x1, y1-1, x2, y1-1, GFX_COL_GREY_1);
257 gfx_draw_colour_line (x1, y1, x2, y1, GFX_COL_WHITE);
258 gfx_draw_colour_line (x1, y1+1, x2, y1+1, GFX_COL_GREY_1);
259 }
260}
261
262
263void arrow_right (void)
264{
265 switch (current_screen)
266 {
267 case SCR_MARKET_PRICES:
268 buy_stock();
269 break;
270
271 case SCR_SETTINGS:
272 select_right_setting();
273 break;
274
275 case SCR_SHORT_RANGE:
276 case SCR_GALACTIC_CHART:
277 move_cross(1, 0);
278 break;
279
280 case SCR_FRONT_VIEW:
281 case SCR_REAR_VIEW:
282 case SCR_RIGHT_VIEW:
283 case SCR_LEFT_VIEW:
284 if (flight_roll > 0)
285 flight_roll = 0;
286 else
287 {
288 decrease_flight_roll();
289 decrease_flight_roll();
290 rolling = 1;
291 }
292 break;
293 }
294}
295
296
297void arrow_left (void)
298{
299 switch (current_screen)
300 {
301 case SCR_MARKET_PRICES:
302 sell_stock();
303 break;
304
305 case SCR_SETTINGS:
306 select_left_setting();
307 break;
308
309 case SCR_SHORT_RANGE:
310 case SCR_GALACTIC_CHART:
311 move_cross (-1, 0);
312 break;
313
314 case SCR_FRONT_VIEW:
315 case SCR_REAR_VIEW:
316 case SCR_RIGHT_VIEW:
317 case SCR_LEFT_VIEW:
318 if (flight_roll < 0)
319 flight_roll = 0;
320 else
321 {
322 increase_flight_roll();
323 increase_flight_roll();
324 rolling = 1;
325 }
326 break;
327 }
328}
329
330
331void arrow_up (void)
332{
333 switch (current_screen)
334 {
335 case SCR_MARKET_PRICES:
336 select_previous_stock();
337 break;
338
339 case SCR_EQUIP_SHIP:
340 select_previous_equip();
341 break;
342
343 case SCR_OPTIONS:
344 select_previous_option();
345 break;
346
347 case SCR_SETTINGS:
348 select_up_setting();
349 break;
350
351 case SCR_SHORT_RANGE:
352 case SCR_GALACTIC_CHART:
353 move_cross (0, -1);
354 break;
355
356 case SCR_FRONT_VIEW:
357 case SCR_REAR_VIEW:
358 case SCR_RIGHT_VIEW:
359 case SCR_LEFT_VIEW:
360 if (flight_climb > 0)
361 flight_climb = 0;
362 else
363 {
364 decrease_flight_climb();
365 }
366 climbing = 1;
367 break;
368 }
369}
370
371
372
373void arrow_down (void)
374{
375 switch (current_screen)
376 {
377 case SCR_MARKET_PRICES:
378 select_next_stock();
379 break;
380
381 case SCR_EQUIP_SHIP:
382 select_next_equip();
383 break;
384
385 case SCR_OPTIONS:
386 select_next_option();
387 break;
388
389 case SCR_SETTINGS:
390 select_down_setting();
391 break;
392
393 case SCR_SHORT_RANGE:
394 case SCR_GALACTIC_CHART:
395 move_cross (0, 1);
396 break;
397
398 case SCR_FRONT_VIEW:
399 case SCR_REAR_VIEW:
400 case SCR_RIGHT_VIEW:
401 case SCR_LEFT_VIEW:
402 if (flight_climb < 0)
403 flight_climb = 0;
404 else
405 {
406 increase_flight_climb();
407 }
408 climbing = 1;
409 break;
410
411 }
412}
413
414
415void return_pressed (void)
416{
417 switch (current_screen)
418 {
419 case SCR_EQUIP_SHIP:
420 buy_equip();
421 break;
422
423 case SCR_OPTIONS:
424 do_option();
425 break;
426
427 case SCR_SETTINGS:
428 toggle_setting();
429 break;
430 }
431}
432
433
434void y_pressed (void)
435{
436 switch (current_screen)
437 {
438 case SCR_QUIT:
439 finish_game();
440 break;
441 }
442}
443
444
445void n_pressed (void)
446{
447 switch (current_screen)
448 {
449 case SCR_QUIT:
450 if (docked)
451 display_commander_status();
452 else
453 current_screen = SCR_FRONT_VIEW;
454 break;
455 }
456}
457
458
459void d_pressed (void)
460{
461 switch (current_screen)
462 {
463 case SCR_GALACTIC_CHART:
464 case SCR_SHORT_RANGE:
465 show_distance_to_planet();
466 break;
467
468 case SCR_FRONT_VIEW:
469 case SCR_REAR_VIEW:
470 case SCR_RIGHT_VIEW:
471 case SCR_LEFT_VIEW:
472 if (auto_pilot)
473 disengage_auto_pilot();
474 break;
475 }
476}
477
478
479void f_pressed (void)
480{
481 if ((current_screen == SCR_GALACTIC_CHART) ||
482 (current_screen == SCR_SHORT_RANGE))
483 {
484 find_input = 1;
485 *find_name = '\0';
486 gfx_clear_text_area();
487 gfx_display_text (16, 340, "Planet Name?");
488 }
489}
490
491
492void add_find_char (int letter)
493{
494 char str[40];
495
496 if (strlen (find_name) == 16)
497 return;
498
499 str[0] = toupper (letter);
500 str[1] = '\0';
501 strcat (find_name, str);
502
503 sprintf (str, "Planet Name? %s", find_name);
504 gfx_clear_text_area ();
505 gfx_display_text(16, 340, str);
506}
507
508
509void delete_find_char (void)
510{
511 char str[40];
512 int len;
513
514 len = strlen (find_name);
515 if (len == 0)
516 return;
517
518 find_name[len - 1] = '\0';
519
520 sprintf (str, "Planet Name? %s", find_name);
521 gfx_clear_text_area();
522 gfx_display_text(16, 340, str);
523}
524
525void o_pressed()
526{
527 switch (current_screen)
528 {
529 case SCR_GALACTIC_CHART:
530 case SCR_SHORT_RANGE:
531 move_cursor_to_origin();
532 break;
533 }
534}
535
536
537void auto_dock (void)
538{
539 struct univ_object ship;
540
541 ship.location.x = 0;
542 ship.location.y = 0;
543 ship.location.z = 0;
544
545 set_init_matrix (ship.rotmat);
546 ship.rotmat[2].z = 1;
547 ship.rotmat[0].x = -1;
548 ship.type = -96;
549 ship.velocity = flight_speed;
550 ship.acceleration = 0;
551 ship.bravery = 0;
552 ship.rotz = 0;
553 ship.rotx = 0;
554
555 auto_pilot_ship (&ship);
556
557 if (ship.velocity > 22)
558 flight_speed = 22;
559 else
560 flight_speed = ship.velocity;
561
562 if (ship.acceleration > 0)
563 {
564 flight_speed++;
565 if (flight_speed > 22)
566 flight_speed = 22;
567 }
568
569 if (ship.acceleration < 0)
570 {
571 flight_speed--;
572 if (flight_speed < 1)
573 flight_speed = 1;
574 }
575
576 if (ship.rotx == 0)
577 flight_climb = 0;
578
579 if (ship.rotx < 0)
580 {
581 increase_flight_climb();
582
583 if (ship.rotx < -1)
584 increase_flight_climb();
585 }
586
587 if (ship.rotx > 0)
588 {
589 decrease_flight_climb();
590
591 if (ship.rotx > 1)
592 decrease_flight_climb();
593 }
594
595 if (ship.rotz == 127)
596 flight_roll = -14;
597 else
598 {
599 if (ship.rotz == 0)
600 flight_roll = 0;
601
602 if (ship.rotz > 0)
603 {
604 increase_flight_roll();
605
606 if (ship.rotz > 1)
607 increase_flight_roll();
608 }
609
610 if (ship.rotz < 0)
611 {
612 decrease_flight_roll();
613
614 if (ship.rotz < -1)
615 decrease_flight_roll();
616 }
617 }
618}
619
620
621void run_escape_sequence (void)
622{
623 int i;
624 int newship;
625 Matrix rotmat;
626
627 current_screen = SCR_ESCAPE_POD;
628
629 flight_speed = 1;
630 flight_roll = 0;
631 flight_climb = 0;
632
633 set_init_matrix (rotmat);
634 rotmat[2].z = 1.0;
635
636 newship = add_new_ship (SHIP_COBRA3, 0, 0, 200, rotmat, -127, -127);
637 universe[newship].velocity = 7;
638 snd_play_sample (SND_LAUNCH);
639
640 for (i = 0; i < 90; i++)
641 {
642 if (i == 40)
643 {
644 universe[newship].flags |= FLG_DEAD;
645 snd_play_sample (SND_EXPLODE);
646 }
647
648 gfx_set_clip_region (1, 1, 510, 383);
649 gfx_clear_display();
650 update_starfield();
651 update_universe();
652
653 universe[newship].location.x = 0;
654 universe[newship].location.y = 0;
655 universe[newship].location.z += 2;
656
657 gfx_display_centre_text (358, "Escape pod launched - Ship auto-destuct initiated.", 120, GFX_COL_WHITE);
658
659 update_console();
660 gfx_update_screen();
661 }
662
663
664 while ((ship_count[SHIP_CORIOLIS] == 0) &&
665 (ship_count[SHIP_DODEC] == 0))
666 {
667 auto_dock();
668
669 if ((abs(flight_roll) < 3) && (abs(flight_climb) < 3))
670 {
671 for (i = 0; i < MAX_UNIV_OBJECTS; i++)
672 {
673 if (universe[i].type != 0)
674 universe[i].location.z -= 1500;
675 }
676
677 }
678
679 warp_stars = 1;
680 gfx_set_clip_region (1, 1, 510, 383);
681 gfx_clear_display();
682 update_starfield();
683 update_universe();
684 update_console();
685 gfx_update_screen();
686 }
687
688 abandon_ship();
689}
690
691
692void handle_flight_keys (void)
693{
694 int keyasc;
695
696 if (docked &&
697 ((current_screen == SCR_MARKET_PRICES) ||
698 (current_screen == SCR_OPTIONS) ||
699 (current_screen == SCR_SETTINGS) ||
700 (current_screen == SCR_EQUIP_SHIP)))
701 kbd_read_key();
702
703 kbd_poll_keyboard();
704
705 if (have_joystick)
706 {
707 poll_joystick();
708
709 if (joy[0].stick[0].axis[1].d1)
710 arrow_up();
711
712 if (joy[0].stick[0].axis[1].d2)
713 arrow_down();
714
715 if (joy[0].stick[0].axis[0].d1)
716 arrow_left();
717
718 if (joy[0].stick[0].axis[0].d2)
719 arrow_right();
720
721 if (joy[0].button[0].b)
722 kbd_fire_pressed = 1;
723
724 if (joy[0].button[1].b)
725 kbd_inc_speed_pressed = 1;
726
727 if (joy[0].button[2].b)
728 kbd_dec_speed_pressed = 1;
729 }
730
731
732 if (game_paused)
733 {
734 if (kbd_resume_pressed)
735 game_paused = 0;
736 return;
737 }
738
739 if (kbd_F1_pressed)
740 {
741 find_input = 0;
742
743 if (docked)
744 launch_player();
745 else
746 {
747 if (current_screen != SCR_FRONT_VIEW)
748 {
749 current_screen = SCR_FRONT_VIEW;
750 flip_stars();
751 }
752 }
753 }
754
755 if (kbd_F2_pressed)
756 {
757 find_input = 0;
758
759 if (!docked)
760 {
761 if (current_screen != SCR_REAR_VIEW)
762 {
763 current_screen = SCR_REAR_VIEW;
764 flip_stars();
765 }
766 }
767 }
768
769 if (kbd_F3_pressed)
770 {
771 find_input = 0;
772
773 if (!docked)
774 {
775 if (current_screen != SCR_LEFT_VIEW)
776 {
777 current_screen = SCR_LEFT_VIEW;
778 flip_stars();
779 }
780 }
781 }
782
783 if (kbd_F4_pressed)
784 {
785 find_input = 0;
786
787 if (docked)
788 equip_ship();
789 else
790 {
791 if (current_screen != SCR_RIGHT_VIEW)
792 {
793 current_screen = SCR_RIGHT_VIEW;
794 flip_stars();
795 }
796 }
797 }
798
799
800 if (kbd_F5_pressed)
801 {
802 find_input = 0;
803 old_cross_x = -1;
804 display_galactic_chart();
805 }
806
807 if (kbd_F6_pressed)
808 {
809 find_input = 0;
810 old_cross_x = -1;
811 display_short_range_chart();
812 }
813
814 if (kbd_F7_pressed)
815 {
816 find_input = 0;
817 display_data_on_planet();
818 }
819
820 if (kbd_F8_pressed && (!witchspace))
821 {
822 find_input = 0;
823 display_market_prices();
824 }
825
826 if (kbd_F9_pressed)
827 {
828 find_input = 0;
829 display_commander_status();
830 }
831
832 if (kbd_F10_pressed)
833 {
834 find_input = 0;
835 display_inventory();
836 }
837
838 if (kbd_F11_pressed)
839 {
840 find_input = 0;
841 display_options();
842 }
843
844 if (find_input)
845 {
846 keyasc = kbd_read_key();
847
848 if (kbd_enter_pressed)
849 {
850 find_input = 0;
851 find_planet_by_name (find_name);
852 return;
853 }
854
855 if (kbd_backspace_pressed)
856 {
857 delete_find_char();
858 return;
859 }
860
861 if (isalpha(keyasc))
862 add_find_char (keyasc);
863
864 return;
865 }
866
867 if (kbd_y_pressed)
868 y_pressed();
869
870 if (kbd_n_pressed)
871 n_pressed();
872
1a8abebd 873 if (kbd_i_pressed == 1)
874 identify = !identify;
875 if (kbd_zoom_pressed == 1)
876 scanner_zoom ^= 3;
84bbd123 877
878 if (kbd_fire_pressed)
879 {
880 if ((!docked) && (draw_lasers == 0))
881 draw_lasers = fire_laser();
882 }
883
884 if (kbd_dock_pressed)
885 {
886 if (!docked && cmdr.docking_computer)
887 {
888 if (instant_dock)
889 engage_docking_computer();
890 else
891 engage_auto_pilot();
892 }
893 }
894
895 if (kbd_d_pressed)
896 d_pressed();
897
898 if (kbd_ecm_pressed)
899 {
900 if (!docked && cmdr.ecm)
901 activate_ecm(1);
902 }
903
904 if (kbd_find_pressed)
905 f_pressed ();
906
907 if (kbd_hyperspace_pressed && (!docked))
908 {
909 if (kbd_ctrl_pressed)
910 start_galactic_hyperspace();
911 else
912 start_hyperspace();
913 }
914
915 if (kbd_jump_pressed && (!docked) && (!witchspace))
916 {
917 jump_warp();
918 }
919
920 if (kbd_fire_missile_pressed)
921 {
922 if (!docked)
923 fire_missile();
924 }
925
926 if (kbd_origin_pressed)
927 o_pressed();
928
929 if (kbd_pause_pressed)
930 game_paused = 1;
931
932 if (kbd_target_missile_pressed)
933 {
934 if (!docked)
935 arm_missile();
936 }
937
938 if (kbd_unarm_missile_pressed)
939 {
940 if (!docked)
941 unarm_missile();
942 }
943
944 if (kbd_inc_speed_pressed)
945 {
946 if (!docked)
947 {
948 if (flight_speed < myship.max_speed)
949 flight_speed++;
950 }
951 }
952
953 if (kbd_dec_speed_pressed)
954 {
955 if (!docked)
956 {
957 if (flight_speed > 1)
958 flight_speed--;
959 }
960 }
961
962 if (kbd_up_pressed)
963 arrow_up();
964
965 if (kbd_down_pressed)
966 arrow_down();
967
968 if (kbd_left_pressed)
969 arrow_left();
970
971 if (kbd_right_pressed)
972 arrow_right();
973
974 if (kbd_enter_pressed)
975 return_pressed();
976
977 if (kbd_energy_bomb_pressed)
978 {
979 if ((!docked) && (cmdr.energy_bomb))
980 {
981 detonate_bomb = 1;
982 cmdr.energy_bomb = 0;
983 }
984 }
985
986 if (kbd_escape_pressed)
987 {
988 if ((!docked) && (cmdr.escape_pod) && (!witchspace))
989 run_escape_sequence();
990 }
991}
992
993
994
995void set_commander_name (char *path)
996{
997 char *fname, *cname;
998 int i;
999
1000 fname = get_filename (path);
1001 cname = cmdr.name;
1002
1003 for (i = 0; i < 31; i++)
1004 {
1005 if (!isalnum(*fname))
1006 break;
1007
1008 *cname++ = toupper(*fname++);
1009 }
1010
1011 *cname = '\0';
1012}
1013
1014
1015void save_commander_screen (void)
1016{
1017 char path[255];
1018 int okay;
1019 int rv;
1020
1021 current_screen = SCR_SAVE_CMDR;
1022
1023 gfx_clear_display();
1024 gfx_display_centre_text (10, "SAVE COMMANDER", 140, GFX_COL_GOLD);
1025 gfx_draw_line (0, 36, 511, 36);
1026 gfx_update_screen();
1027
1028 strcpy (path, cmdr.name);
1029 strcat (path, ".nkc");
1030
1031 okay = gfx_request_file ("Save Commander", path, "nkc");
1032
1033 if (!okay)
1034 {
1035 display_options();
1036 return;
1037 }
1038
1039 rv = save_commander_file (path);
1040
1041 if (rv)
1042 {
1043 gfx_display_centre_text (175, "Error Saving Commander!", 140, GFX_COL_GOLD);
1044 return;
1045 }
1046
1047 gfx_display_centre_text (175, "Commander Saved.", 140, GFX_COL_GOLD);
1048
1049 set_commander_name (path);
1050 saved_cmdr = cmdr;
1051 saved_cmdr.ship_x = docked_planet.d;
1052 saved_cmdr.ship_y = docked_planet.b;
1053}
1054
1055
1056void load_commander_screen (void)
1057{
1058 char path[255];
1059 int rv;
1060
1061 gfx_clear_display();
1062 gfx_display_centre_text (10, "LOAD COMMANDER", 140, GFX_COL_GOLD);
1063 gfx_draw_line (0, 36, 511, 36);
1064 gfx_update_screen();
1065
1066
1067 strcpy (path, "jameson.nkc");
1068
1069 rv = gfx_request_file ("Load Commander", path, "nkc");
1070
1071 if (rv == 0)
1072 return;
1073
1074 rv = load_commander_file (path);
1075
1076 if (rv)
1077 {
1078 saved_cmdr = cmdr;
1079 gfx_display_centre_text (175, "Error Loading Commander!", 140, GFX_COL_GOLD);
1080 gfx_display_centre_text (200, "Press any key to continue.", 140, GFX_COL_GOLD);
1081 gfx_update_screen();
1082 readkey();
1083 return;
1084 }
1085
1086 restore_saved_commander();
1087 set_commander_name (path);
1088 saved_cmdr = cmdr;
1089 update_console();
1090}
1091
1092
1093
1094void run_first_intro_screen (void)
1095{
1096 current_screen = SCR_INTRO_ONE;
1097
1098 snd_play_midi (SND_ELITE_THEME, TRUE);
1099
1100 initialise_intro1();
1a8abebd 1101 identify = 0;
84bbd123 1102
1103 for (;;)
1104 {
1105 update_intro1();
1106
1107 gfx_update_screen();
1108
1109 kbd_poll_keyboard();
1110
1111 if (kbd_y_pressed)
1112 {
1113 snd_stop_midi();
1114 load_commander_screen();
1115 break;
1116 }
1117
1118 if (kbd_n_pressed)
1119 {
1120 snd_stop_midi();
1121 break;
1122 }
1123 }
1124
1125}
1126
1127
1128
1129void run_second_intro_screen (void)
1130{
1131 current_screen = SCR_INTRO_TWO;
1132
1133 snd_play_midi (SND_BLUE_DANUBE, TRUE);
1134
1a8abebd 1135 identify = 0;
84bbd123 1136 initialise_intro2();
1137
1138 flight_speed = 3;
1139 flight_roll = 0;
1140 flight_climb = 0;
1141
1142 for (;;)
1143 {
1144 update_intro2();
1145
1146 gfx_update_screen();
1147
1148 kbd_poll_keyboard();
1149
1150 if (kbd_space_pressed)
1151 break;
1152 }
1153
1154 snd_stop_midi();
1155}
1156
1157
1158
1159/*
1160 * Draw the game over sequence.
1161 */
1162
1163void run_game_over_screen()
1164{
1165 int i;
1166 int newship;
1167 Matrix rotmat;
1168 int type;
1169
1170 current_screen = SCR_GAME_OVER;
1171 gfx_set_clip_region (1, 1, 510, 383);
1172
1173 flight_speed = 6;
1174 flight_roll = 0;
1175 flight_climb = 0;
1a8abebd 1176 identify = 0;
84bbd123 1177 clear_universe();
1178
1179 set_init_matrix (rotmat);
1180
1181 newship = add_new_ship (SHIP_COBRA3, 0, 0, -400, rotmat, 0, 0);
1182 universe[newship].flags |= FLG_DEAD;
1183
1184 for (i = 0; i < 5; i++)
1185 {
1186 type = (rand255() & 1) ? SHIP_CARGO : SHIP_ALLOY;
1187 newship = add_new_ship (type, (rand255() & 63) - 32,
1188 (rand255() & 63) - 32, -400, rotmat, 0, 0);
1189 universe[newship].rotz = ((rand255() * 2) & 255) - 128;
1190 universe[newship].rotx = ((rand255() * 2) & 255) - 128;
1191 universe[newship].velocity = rand255() & 15;
1192 }
1193
1194
1195 for (i = 0; i < 100; i++)
1196 {
1197 gfx_clear_display();
1198 update_starfield();
1199 update_universe();
1200 gfx_display_centre_text (190, "GAME OVER", 140, GFX_COL_GOLD);
1201 gfx_update_screen();
1202 }
1203}
1204
1205
1206
1207
1208/*
1209 * Draw a break pattern (for launching, docking and hyperspacing).
1210 * Just draw a very simple one for the moment.
1211 */
1212
1213void display_break_pattern (void)
1214{
1215 int i;
1216
1217 gfx_set_clip_region (1, 1, 510, 383);
1218 gfx_clear_display();
1219
1220 for (i = 0; i < 20; i++)
1221 {
1222 gfx_draw_circle (256, 192, 30 + i * 15, GFX_COL_WHITE);
1223 gfx_update_screen();
1224 }
1225
1226
1227 if (docked)
1228 {
1229 check_mission_brief();
1230 display_commander_status();
1231 update_console();
1232 }
1233 else
1234 current_screen = SCR_FRONT_VIEW;
1235}
1236
1237
1238void info_message (char *message)
1239{
1240 strcpy (message_string, message);
1241 message_count = 37;
1242// snd_play_sample (SND_BEEP);
1243}
1244
1245
1246
1247
1248
1249
1250void initialise_allegro (void)
1251{
1252 allegro_init();
1253 install_keyboard();
1254 install_timer();
1255 install_mouse();
1256
1257 have_joystick = 0;
1258
1259 if (install_joystick(JOY_TYPE_AUTODETECT) == 0)
1260 {
1261 have_joystick = (num_joysticks > 0);
1262 }
1263}
1264
1265
1266
1267int main()
1268{
1269 initialise_allegro();
1270 read_config_file();
1271
1272 if (gfx_graphics_startup() == 1)
1273 {
1274 return 1;
1275 }
1276
1277 /* Start the sound system... */
1278 snd_sound_startup();
1279
1280 /* Do any setup necessary for the keyboard... */
1281 kbd_keyboard_startup();
1282
1283 finish = 0;
1284 auto_pilot = 0;
1285
1286 while (!finish)
1287 {
1288 game_over = 0;
1289 initialise_game();
1290 dock_player();
1291
1292 update_console();
1293
1294 current_screen = SCR_FRONT_VIEW;
1295 run_first_intro_screen();
1296 run_second_intro_screen();
1297
1298 old_cross_x = -1;
1299 old_cross_y = -1;
1300
1301 dock_player ();
1302 display_commander_status ();
1303
1304 while (!game_over)
1305 {
1306 snd_update_sound();
1307 gfx_update_screen();
1308 gfx_set_clip_region (1, 1, 510, 383);
1309
1310 rolling = 0;
1311 climbing = 0;
1312
1313 handle_flight_keys ();
1314
1315 if (game_paused)
1316 continue;
1317
1318 if (message_count > 0)
1319 message_count--;
1320
1321 if (!rolling)
1322 {
1323 if (flight_roll > 0)
1324 decrease_flight_roll();
1325
1326 if (flight_roll < 0)
1327 increase_flight_roll();
1328 }
1329
1330 if (!climbing)
1331 {
1332 if (flight_climb > 0)
1333 decrease_flight_climb();
1334
1335 if (flight_climb < 0)
1336 increase_flight_climb();
1337 }
1338
1339
1340 if (!docked)
1341 {
1342 gfx_acquire_screen();
1343
1344 if ((current_screen == SCR_FRONT_VIEW) || (current_screen == SCR_REAR_VIEW) ||
1345 (current_screen == SCR_LEFT_VIEW) || (current_screen == SCR_RIGHT_VIEW) ||
1346 (current_screen == SCR_INTRO_ONE) || (current_screen == SCR_INTRO_TWO) ||
1347 (current_screen == SCR_GAME_OVER))
1348 {
1349 gfx_clear_display();
1350 update_starfield();
1351 }
1352
1353 if (auto_pilot)
1354 {
1355 auto_dock();
1356 if ((mcount & 127) == 0)
1357 info_message ("Docking Computers On");
1358 }
1359
1360 update_universe ();
1361
1362 if (docked)
1363 {
1364 update_console();
1365 gfx_release_screen();
1366 continue;
1367 }
1368
1369 if ((current_screen == SCR_FRONT_VIEW) || (current_screen == SCR_REAR_VIEW) ||
1370 (current_screen == SCR_LEFT_VIEW) || (current_screen == SCR_RIGHT_VIEW))
1371 {
1372 if (draw_lasers)
1373 {
1374 draw_laser_lines();
1375 draw_lasers--;
1376 }
1377
1378 draw_laser_sights();
1379 }
1380
1381 if (message_count > 0)
1382 gfx_display_centre_text (358, message_string, 120, GFX_COL_WHITE);
1383
1384 if (hyper_ready)
1385 {
1386 display_hyper_status();
1387 if ((mcount & 3) == 0)
1388 {
1389 countdown_hyperspace();
1390 }
1391 }
1392
1393 gfx_release_screen();
1394
1395 mcount--;
1396 if (mcount < 0)
1397 mcount = 255;
1398
1399 if ((mcount & 7) == 0)
1400 regenerate_shields();
1401
1402 if ((mcount & 31) == 10)
1403 {
1404 if (energy < 50)
1405 {
1406 info_message ("ENERGY LOW");
1407 snd_play_sample (SND_BEEP);
1408 }
1409
1410 update_altitude();
1411 }
1412
1413 if ((mcount & 31) == 20)
1414 update_cabin_temp();
1415
1416 if ((mcount == 0) && (!witchspace))
1417 random_encounter();
1418
1419 cool_laser();
1420 time_ecm();
1421
1422 update_console();
1423 }
1424
1425 if (current_screen == SCR_BREAK_PATTERN)
1426 display_break_pattern();
1427
1428 if (cross_timer > 0)
1429 {
1430 cross_timer--;
1431 if (cross_timer == 0)
1432 {
1433 show_distance_to_planet();
1434 }
1435 }
1436
1437 if ((cross_x != old_cross_x) ||
1438 (cross_y != old_cross_y))
1439 {
1440 if (old_cross_x != -1)
1441 draw_cross (old_cross_x, old_cross_y);
1442
1443 old_cross_x = cross_x;
1444 old_cross_y = cross_y;
1445
1446 draw_cross (old_cross_x, old_cross_y);
1447 }
1448 }
1449
1450 if (!finish)
1451 run_game_over_screen();
1452 }
1453
1454 snd_sound_shutdown();
1455
1456 gfx_graphics_shutdown ();
1457
1458 return 0;
1459}
1460
1461END_OF_MAIN();