2 * Elite - The New Kind.
4 * Reverse engineered from the BBC disk version of Elite.
5 * Additional material by C.J.Pinder.
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.
10 * email: <christian@newkind.co.uk>
33 char *economy_type[] = {"Rich Industrial",
37 "Mainly Agricultural",
39 "Average Agricultural",
42 char *government_type[] = { "Anarchy",
65 void draw_fuel_limit_circle (int cx, int cy)
70 if (current_screen == SCR_GALACTIC_CHART)
72 radius = cmdr.fuel / 4 * GFX_SCALE;
73 cross_size = 7 * GFX_SCALE;
77 radius = cmdr.fuel * GFX_SCALE;
78 cross_size = 16 * GFX_SCALE;
81 gfx_draw_circle (cx, cy, radius, GFX_COL_GREEN_1);
83 gfx_draw_line (cx, cy - cross_size, cx, cy + cross_size);
84 gfx_draw_line (cx - cross_size, cy, cx + cross_size, cy);
91 int calc_distance_to_planet (struct galaxy_seed from_planet, struct galaxy_seed to_planet)
96 dx = abs(to_planet.d - from_planet.d);
97 dy = abs(to_planet.b - from_planet.b);
103 light_years = sqrt(dx + dy);
110 void show_distance (int ypos, struct galaxy_seed from_planet, struct galaxy_seed to_planet)
115 light_years = calc_distance_to_planet (from_planet, to_planet);
118 sprintf (str, "Distance: %2d.%d Light Years ", light_years / 10, light_years % 10);
122 gfx_display_text (16, ypos, str);
127 void show_distance_to_planet (void)
130 char planet_name[16];
133 if (current_screen == SCR_GALACTIC_CHART)
135 px = cross_x / GFX_SCALE;
136 py = (cross_y - ((18 * GFX_SCALE) + 1)) * (2 / GFX_SCALE);
140 px = ((cross_x - GFX_X_CENTRE) / (4 * GFX_SCALE)) + docked_planet.d;
141 py = ((cross_y - GFX_Y_CENTRE) / (2 * GFX_SCALE)) + docked_planet.b;
144 hyperspace_planet = find_planet (px, py);
146 name_planet (planet_name, hyperspace_planet);
148 gfx_clear_text_area();
149 sprintf (str, "%-18s", planet_name);
150 gfx_display_text (16, 340, str);
152 show_distance (356, docked_planet, hyperspace_planet);
154 if (current_screen == SCR_GALACTIC_CHART)
156 cross_x = hyperspace_planet.d * GFX_SCALE;
157 cross_y = hyperspace_planet.b / (2 / GFX_SCALE) + (18 * GFX_SCALE) + 1;
161 cross_x = ((hyperspace_planet.d - docked_planet.d) * (4 * GFX_SCALE)) + GFX_X_CENTRE;
162 cross_y = ((hyperspace_planet.b - docked_planet.b) * (2 * GFX_SCALE)) + GFX_Y_CENTRE;
167 void move_cursor_to_origin (void)
169 if (current_screen == SCR_GALACTIC_CHART)
171 cross_x = docked_planet.d * GFX_SCALE;
172 cross_y = docked_planet.b / (2 / GFX_SCALE) + (18 * GFX_SCALE) + 1;
176 cross_x = GFX_X_CENTRE;
177 cross_y = GFX_Y_CENTRE;
180 show_distance_to_planet();
184 void find_planet_by_name (char *find_name)
187 struct galaxy_seed glx;
188 char planet_name[16];
195 for (i = 0; i < 256; i++)
197 name_planet (planet_name, glx);
199 if (strcmp (planet_name, find_name) == 0)
205 waggle_galaxy (&glx);
206 waggle_galaxy (&glx);
207 waggle_galaxy (&glx);
208 waggle_galaxy (&glx);
213 gfx_clear_text_area();
214 gfx_display_text (16, 340, "Unknown Planet");
218 hyperspace_planet = glx;
220 gfx_clear_text_area ();
221 sprintf (str, "%-18s", planet_name);
222 gfx_display_text (16, 340, str);
224 show_distance (356, docked_planet, hyperspace_planet);
226 if (current_screen == SCR_GALACTIC_CHART)
228 cross_x = hyperspace_planet.d * GFX_SCALE;
229 cross_y = hyperspace_planet.b / (2 / GFX_SCALE) + (18 * GFX_SCALE) + 1;
233 cross_x = ((hyperspace_planet.d - docked_planet.d) * (4 * GFX_SCALE)) + GFX_X_CENTRE;
234 cross_y = ((hyperspace_planet.b - docked_planet.b) * (2 * GFX_SCALE)) + GFX_Y_CENTRE;
240 void display_short_range_chart (void)
243 struct galaxy_seed glx;
246 char planet_name[16];
251 current_screen = SCR_SHORT_RANGE;
255 gfx_display_centre_text (10, "SHORT RANGE CHART", 140, GFX_COL_GOLD);
257 gfx_draw_line (0, 36, 511, 36);
259 draw_fuel_limit_circle (GFX_X_CENTRE, GFX_Y_CENTRE);
261 for (i = 0; i < 64; i++)
266 for (i = 0; i < 256; i++)
269 dx = abs (glx.d - docked_planet.d);
270 dy = abs (glx.b - docked_planet.b);
272 if ((dx >= 20) || (dy >= 38))
274 waggle_galaxy (&glx);
275 waggle_galaxy (&glx);
276 waggle_galaxy (&glx);
277 waggle_galaxy (&glx);
282 px = (glx.d - docked_planet.d);
283 px = px * 4 * GFX_SCALE + GFX_X_CENTRE; /* Convert to screen co-ords */
285 py = (glx.b - docked_planet.b);
286 py = py * 2 * GFX_SCALE + GFX_Y_CENTRE; /* Convert to screen co-ords */
288 row = py / (8 * GFX_SCALE);
290 if (row_used[row] == 1)
293 if (row_used[row] == 1)
298 waggle_galaxy (&glx);
299 waggle_galaxy (&glx);
300 waggle_galaxy (&glx);
301 waggle_galaxy (&glx);
306 if (row_used[row] == 0)
310 name_planet (planet_name, glx);
311 capitalise_name (planet_name);
313 gfx_display_text (px + (4 * GFX_SCALE), (row * 8 - 5) * GFX_SCALE, planet_name);
317 /* The next bit calculates the size of the circle used to represent */
318 /* a planet. The carry_flag is left over from the name generation. */
319 /* Yes this was how it was done... don't ask :-( */
321 blob_size = (glx.f & 1) + 2 + carry_flag;
322 blob_size *= GFX_SCALE;
323 gfx_draw_filled_circle (px, py, blob_size, GFX_COL_GOLD);
325 waggle_galaxy (&glx);
326 waggle_galaxy (&glx);
327 waggle_galaxy (&glx);
328 waggle_galaxy (&glx);
331 cross_x = ((hyperspace_planet.d - docked_planet.d) * 4 * GFX_SCALE) + GFX_X_CENTRE;
332 cross_y = ((hyperspace_planet.b - docked_planet.b) * 2 * GFX_SCALE) + GFX_Y_CENTRE;
338 void display_galactic_chart (void)
341 struct galaxy_seed glx;
346 current_screen = SCR_GALACTIC_CHART;
350 sprintf (str, "GALACTIC CHART %d", cmdr.galaxy_number + 1);
352 gfx_display_centre_text (10, str, 140, GFX_COL_GOLD);
354 gfx_draw_line (0, 36, 511, 36);
355 gfx_draw_line (0, 36+258, 511, 36+258);
357 draw_fuel_limit_circle (docked_planet.d * GFX_SCALE,
358 (docked_planet.b / (2 / GFX_SCALE)) + (18 * GFX_SCALE) + 1);
362 for (i = 0; i < 256; i++)
364 px = glx.d * GFX_SCALE;
365 py = (glx.b / (2 / GFX_SCALE)) + (18 * GFX_SCALE) + 1;
367 gfx_plot_pixel (px, py, GFX_COL_WHITE);
369 if ((glx.e | 0x50) < 0x90)
370 gfx_plot_pixel (px + 1, py, GFX_COL_WHITE);
372 waggle_galaxy (&glx);
373 waggle_galaxy (&glx);
374 waggle_galaxy (&glx);
375 waggle_galaxy (&glx);
380 cross_x = hyperspace_planet.d * GFX_SCALE;
381 cross_y = (hyperspace_planet.b / (2 / GFX_SCALE)) + (18 * GFX_SCALE) + 1;
389 * Displays data on the currently selected Hyperspace Planet.
392 void display_data_on_planet (void)
394 char planet_name[16];
397 struct planet_data hyper_planet_data;
399 current_screen = SCR_PLANET_DATA;
403 name_planet (planet_name, hyperspace_planet);
404 sprintf (str, "DATA ON %s", planet_name);
406 gfx_display_centre_text (10, str, 140, GFX_COL_GOLD);
408 gfx_draw_line (0, 36, 511, 36);
411 generate_planet_data (&hyper_planet_data, hyperspace_planet);
413 show_distance (42, docked_planet, hyperspace_planet);
415 sprintf (str, "Economy:%s", economy_type[hyper_planet_data.economy]);
416 gfx_display_text (16, 74, str);
418 sprintf (str, "Government:%s", government_type[hyper_planet_data.government]);
419 gfx_display_text (16, 106, str);
421 sprintf (str, "Tech.Level:%3d", hyper_planet_data.techlevel + 1);
422 gfx_display_text (16, 138, str);
424 sprintf (str, "Population:%d.%d Billion", hyper_planet_data.population / 10, hyper_planet_data.population % 10);
425 gfx_display_text (16, 170, str);
427 describe_inhabitants (str, hyperspace_planet);
428 gfx_display_text (16, 202, str);
430 sprintf (str, "Gross Productivity:%5d M CR", hyper_planet_data.productivity);
431 gfx_display_text (16, 234, str);
433 sprintf (str, "Average Radius:%5d km", hyper_planet_data.radius);
434 gfx_display_text (16, 266, str);
436 description = describe_planet (hyperspace_planet);
437 gfx_display_pretty_text (16, 298, 400, 384, description);
448 #define NO_OF_RANKS 9
450 struct rank rating[NO_OF_RANKS] =
452 {0x0000, "Harmless"},
453 {0x0008, "Mostly Harmless"},
456 {0x0040, "Above Average"},
457 {0x0080, "Competent"},
458 {0x0200, "Dangerous"},
460 {0x1900, "---- E L I T E ---"}
463 char *laser_name[5] = {"Pulse", "Beam", "Military", "Mining", "Custom"};
467 char *laser_type (int strength)
472 return laser_name[0];
475 return laser_name[1];
478 return laser_name[2];
481 return laser_name[3];
484 return laser_name[4];
488 #define EQUIP_START_Y 202
489 #define EQUIP_START_X 50
490 #define EQUIP_MAX_Y 290
491 #define EQUIP_WIDTH 200
495 static char *condition_txt[] =
504 void display_commander_status (void)
506 char planet_name[16];
511 current_screen = SCR_CMDR_STATUS;
515 sprintf (str, "COMMANDER %s", cmdr.name);
517 gfx_display_centre_text (10, str, 140, GFX_COL_GOLD);
519 gfx_draw_line (0, 36, 511, 36);
522 gfx_display_colour_text (16, 58, "Present System:", GFX_COL_GREEN_1);
526 name_planet (planet_name, docked_planet);
527 capitalise_name (planet_name);
528 sprintf (str, "%s", planet_name);
529 gfx_display_text (190, 58, str);
532 gfx_display_colour_text (16, 74, "Hyperspace System:", GFX_COL_GREEN_1);
533 name_planet (planet_name, hyperspace_planet);
534 capitalise_name (planet_name);
535 sprintf (str, "%s", planet_name);
536 gfx_display_text (190, 74, str);
538 gfx_display_colour_text (16, 90, "Condition:", GFX_COL_GREEN_1);
539 gfx_display_text (190, 90, condition_txt[condition]);
541 sprintf (str, "%d.%d Light Years", cmdr.fuel / 10, cmdr.fuel % 10);
542 gfx_display_colour_text (16, 106, "Fuel:", GFX_COL_GREEN_1);
543 gfx_display_text (70, 106, str);
545 sprintf (str, "%d.%d Cr", cmdr.credits / 10, cmdr.credits % 10);
546 gfx_display_colour_text (16, 122, "Cash:", GFX_COL_GREEN_1);
547 gfx_display_text (70, 122, str);
549 if (cmdr.legal_status == 0)
550 strcpy (str, "Clean");
552 strcpy (str, cmdr.legal_status > 50 ? "Fugitive" : "Offender");
554 gfx_display_colour_text (16, 138, "Legal Status:", GFX_COL_GREEN_1);
555 gfx_display_text (128, 138, str);
557 for (i = 0; i < NO_OF_RANKS; i++)
558 if (cmdr.score >= rating[i].score)
559 strcpy (str, rating[i].title);
561 gfx_display_colour_text (16, 154, "Rating:", GFX_COL_GREEN_1);
562 gfx_display_text (80, 154, str);
564 gfx_display_colour_text (16, 186, "EQUIPMENT:", GFX_COL_GREEN_1);
569 if (cmdr.cargo_capacity > 20)
571 gfx_display_text (x, y, "Large Cargo Bay");
577 gfx_display_text (x, y, "Escape Pod");
583 gfx_display_text (x, y, "Fuel Scoops");
589 gfx_display_text (x, y, "E.C.M. System");
593 if (cmdr.energy_bomb)
595 gfx_display_text (x, y, "Energy Bomb");
599 if (cmdr.energy_unit)
601 gfx_display_text (x, y,
602 cmdr.energy_unit == 1 ? "Extra Energy Unit" :"Naval Energy Unit");
611 if (cmdr.docking_computer)
613 gfx_display_text (x, y, "Docking Computers");
623 if (cmdr.galactic_hyperdrive)
625 gfx_display_text (x, y, "Galactic Hyperspace");
634 if (cmdr.front_laser)
636 sprintf (str, "Front %s Laser", laser_type(cmdr.front_laser));
637 gfx_display_text (x, y, str);
648 sprintf (str, "Rear %s Laser", laser_type(cmdr.rear_laser));
649 gfx_display_text (x, y, str);
660 sprintf (str, "Left %s Laser", laser_type(cmdr.left_laser));
661 gfx_display_text (x, y, str);
670 if (cmdr.right_laser)
672 sprintf (str, "Right %s Laser", laser_type(cmdr.right_laser));
673 gfx_display_text (x, y, str);
679 /***********************************************************************************/
685 static int hilite_item;
686 static char *unit_name[] = {"t", "kg", "g"};
689 void display_stock_price (int i)
696 gfx_display_text (16, y, stock_market[i].name);
698 gfx_display_text (180, y, unit_name[stock_market[i].units]);
699 sprintf (str, "%d.%d", stock_market[i].current_price / 10,
700 stock_market[i].current_price % 10);
701 gfx_display_text (256, y, str);
703 if (stock_market[i].current_quantity > 0)
704 sprintf (str, "%d%s", stock_market[i].current_quantity,
705 unit_name[stock_market[i].units]);
709 gfx_display_text (338, y, str);
711 if (cmdr.current_cargo[i] > 0)
712 sprintf (str, "%d%s", cmdr.current_cargo[i],
713 unit_name[stock_market[i].units]);
717 gfx_display_text (444, y, str);
721 void highlight_stock (int i)
726 if ((hilite_item != -1) && (hilite_item != i))
728 y = hilite_item * 15 + 55;
729 gfx_clear_area (2, y, 510, y + 15);
730 display_stock_price (hilite_item);
735 gfx_draw_rectangle (2, y, 510, y + 15, GFX_COL_DARK_RED);
736 display_stock_price (i);
740 gfx_clear_text_area();
741 sprintf (str, "Cash: %d.%d", cmdr.credits / 10, cmdr.credits % 10);
742 gfx_display_text (16, 340, str);
745 void select_previous_stock (void)
747 if ((!docked) || (hilite_item == 0))
750 highlight_stock (hilite_item - 1);
753 void select_next_stock (void)
755 if ((!docked) || (hilite_item == 16))
758 highlight_stock (hilite_item + 1);
762 void buy_stock (void)
764 struct stock_item *item;
770 item = &stock_market[hilite_item];
773 if ((item->current_quantity == 0) ||
774 (cmdr.credits < item->current_price))
777 cargo_held = total_cargo();
779 if ((item->units == TONNES) &&
780 (cargo_held == cmdr.cargo_capacity))
783 cmdr.current_cargo[hilite_item]++;
784 item->current_quantity--;
785 cmdr.credits -= item->current_price;
787 highlight_stock (hilite_item);
788 } while (kbd_ctrl_pressed);
792 void sell_stock (void)
794 struct stock_item *item;
797 if ((!docked) || (cmdr.current_cargo[hilite_item] == 0))
800 item = &stock_market[hilite_item];
802 cmdr.current_cargo[hilite_item]--;
803 item->current_quantity++;
804 cmdr.credits += item->current_price;
806 highlight_stock (hilite_item);
807 } while (kbd_ctrl_pressed);
812 void display_market_prices (void)
815 char planet_name[16];
818 current_screen = SCR_MARKET_PRICES;
822 name_planet (planet_name, docked_planet);
823 sprintf (str, "%s MARKET PRICES", planet_name);
824 gfx_display_centre_text (10, str, 140, GFX_COL_GOLD);
826 gfx_draw_line (0, 36, 511, 36);
828 gfx_display_colour_text (16, 40, "PRODUCT", GFX_COL_GREEN_1);
829 gfx_display_colour_text (166, 40, "UNIT", GFX_COL_GREEN_1);
830 gfx_display_colour_text (246, 40, "PRICE", GFX_COL_GREEN_1);
831 gfx_display_colour_text (314, 40, "FOR SALE", GFX_COL_GREEN_1);
832 gfx_display_colour_text (420, 40, "IN HOLD", GFX_COL_GREEN_1);
834 for (i = 0; i < 17; i++)
836 display_stock_price (i);
847 void display_inventory (void)
853 current_screen = SCR_INVENTORY;
856 gfx_display_centre_text (10, "INVENTORY", 140, GFX_COL_GOLD);
857 gfx_draw_line (0, 36, 511, 36);
859 sprintf (str, "%d.%d Light Years", cmdr.fuel / 10, cmdr.fuel % 10);
860 gfx_display_colour_text (16, 50, "Fuel:", GFX_COL_GREEN_1);
861 gfx_display_text (70, 50, str);
863 sprintf (str, "%d.%d Cr", cmdr.credits / 10, cmdr.credits % 10);
864 gfx_display_colour_text (16, 66, "Cash:", GFX_COL_GREEN_1);
865 gfx_display_text (70, 66, str);
868 for (i = 0; i < 17; i++)
870 if (cmdr.current_cargo[i] > 0)
872 gfx_display_text (16, y, stock_market[i].name);
874 sprintf (str, "%d%s", cmdr.current_cargo[i],
875 unit_name[stock_market[i].units]);
877 gfx_display_text (180, y, str);
883 /***********************************************************************************/
887 EQ_FUEL, EQ_MISSILE, EQ_CARGO_BAY, EQ_ECM, EQ_FUEL_SCOOPS,
888 EQ_ESCAPE_POD, EQ_ENERGY_BOMB, EQ_ENERGY_UNIT, EQ_DOCK_COMP,
889 EQ_GAL_DRIVE, EQ_PULSE_LASER, EQ_FRONT_PULSE, EQ_REAR_PULSE,
890 EQ_LEFT_PULSE, EQ_RIGHT_PULSE, EQ_BEAM_LASER, EQ_FRONT_BEAM,
891 EQ_REAR_BEAM, EQ_LEFT_BEAM, EQ_RIGHT_BEAM, EQ_MINING_LASER,
892 EQ_FRONT_MINING, EQ_REAR_MINING, EQ_LEFT_MINING, EQ_RIGHT_MINING,
893 EQ_MILITARY_LASER, EQ_FRONT_MILITARY, EQ_REAR_MILITARY,
894 EQ_LEFT_MILITARY, EQ_RIGHT_MILITARY
899 #define NO_OF_EQUIP_ITEMS 34
912 struct equip_item equip_stock[NO_OF_EQUIP_ITEMS] =
914 {0, 0, 1, 1, 2, " Fuel", EQ_FUEL},
915 {0, 0, 1, 1, 300, " Missile", EQ_MISSILE},
916 {0, 0, 1, 1, 4000, " Large Cargo Bay", EQ_CARGO_BAY},
917 {0, 0, 1, 2, 6000, " E.C.M. System", EQ_ECM},
918 {0, 0, 1, 5, 5250, " Fuel Scoops", EQ_FUEL_SCOOPS},
919 {0, 0, 1, 6, 10000, " Escape Pod", EQ_ESCAPE_POD},
920 {0, 0, 1, 7, 9000, " Energy Bomb", EQ_ENERGY_BOMB},
921 {0, 0, 1, 8, 15000, " Extra Energy Unit", EQ_ENERGY_UNIT},
922 {0, 0, 1, 9, 15000, " Docking Computers", EQ_DOCK_COMP},
923 {0, 0, 1,10, 50000, " Galactic Hyperdrive", EQ_GAL_DRIVE},
924 {0, 0, 0, 3, 4000, "+Pulse Laser", EQ_PULSE_LASER},
925 {0, 0, 1, 3, 0, "-Pulse Laser", EQ_PULSE_LASER},
926 {0, 0, 1, 3, 4000, ">Front", EQ_FRONT_PULSE},
927 {0, 0, 1, 3, 4000, ">Rear", EQ_REAR_PULSE},
928 {0, 0, 1, 3, 4000, ">Left", EQ_LEFT_PULSE},
929 {0, 0, 1, 3, 4000, ">Right", EQ_RIGHT_PULSE},
930 {0, 0, 1, 4, 10000, "+Beam Laser", EQ_BEAM_LASER},
931 {0, 0, 0, 4, 0, "-Beam Laser", EQ_BEAM_LASER},
932 {0, 0, 0, 4, 10000, ">Front", EQ_FRONT_BEAM},
933 {0, 0, 0, 4, 10000, ">Rear", EQ_REAR_BEAM},
934 {0, 0, 0, 4, 10000, ">Left", EQ_LEFT_BEAM},
935 {0, 0, 0, 4, 10000, ">Right", EQ_RIGHT_BEAM},
936 {0, 0, 1,10, 8000, "+Mining Laser", EQ_MINING_LASER},
937 {0, 0, 0,10, 0, "-Mining Laser", EQ_MINING_LASER},
938 {0, 0, 0,10, 8000, ">Front", EQ_FRONT_MINING},
939 {0, 0, 0,10, 8000, ">Rear", EQ_REAR_MINING},
940 {0, 0, 0,10, 8000, ">Left", EQ_LEFT_MINING},
941 {0, 0, 0,10, 8000, ">Right", EQ_RIGHT_MINING},
942 {0, 0, 1,10, 60000, "+Military Laser", EQ_MILITARY_LASER},
943 {0, 0, 0,10, 0, "-Military Laser", EQ_MILITARY_LASER},
944 {0, 0, 0,10, 60000, ">Front", EQ_FRONT_MILITARY},
945 {0, 0, 0,10, 60000, ">Rear", EQ_REAR_MILITARY},
946 {0, 0, 0,10, 60000, ">Left", EQ_LEFT_MILITARY},
947 {0, 0, 0,10, 60000, ">Right", EQ_RIGHT_MILITARY}
951 int equip_present (int type)
956 return (cmdr.fuel >= 70);
959 return (cmdr.missiles >= 4);
962 return (cmdr.cargo_capacity > 20);
968 return cmdr.fuel_scoop;
971 return cmdr.escape_pod;
974 return cmdr.energy_bomb;
977 return cmdr.energy_unit;
980 return cmdr.docking_computer;
983 return cmdr.galactic_hyperdrive;
986 return (cmdr.front_laser == PULSE_LASER);
989 return (cmdr.rear_laser == PULSE_LASER);
992 return (cmdr.left_laser == PULSE_LASER);
995 return (cmdr.right_laser == PULSE_LASER);
998 return (cmdr.front_laser == BEAM_LASER);
1001 return (cmdr.rear_laser == BEAM_LASER);
1004 return (cmdr.left_laser == BEAM_LASER);
1007 return (cmdr.right_laser == BEAM_LASER);
1009 case EQ_FRONT_MINING:
1010 return (cmdr.front_laser == MINING_LASER);
1012 case EQ_REAR_MINING:
1013 return (cmdr.rear_laser == MINING_LASER);
1015 case EQ_LEFT_MINING:
1016 return (cmdr.left_laser == MINING_LASER);
1018 case EQ_RIGHT_MINING:
1019 return (cmdr.right_laser == MINING_LASER);
1021 case EQ_FRONT_MILITARY:
1022 return (cmdr.front_laser == MILITARY_LASER);
1024 case EQ_REAR_MILITARY:
1025 return (cmdr.rear_laser == MILITARY_LASER);
1027 case EQ_LEFT_MILITARY:
1028 return (cmdr.left_laser == MILITARY_LASER);
1030 case EQ_RIGHT_MILITARY:
1031 return (cmdr.right_laser == MILITARY_LASER);
1038 void display_equip_price (int i)
1044 y = equip_stock[i].y;
1048 col = equip_stock[i].canbuy ? GFX_COL_WHITE : GFX_COL_GREY_1;
1050 x = *(equip_stock[i].name) == '>' ? 50 : 16;
1052 gfx_display_colour_text (x, y, &equip_stock[i].name[1], col);
1054 if (equip_stock[i].price != 0)
1056 sprintf (str, "%d.%d", equip_stock[i].price / 10, equip_stock[i].price % 10);
1057 gfx_display_colour_text (338, y, str, col);
1062 void highlight_equip (int i)
1067 if ((hilite_item != -1) && (hilite_item != i))
1069 y = equip_stock[hilite_item].y;
1070 gfx_clear_area (2, y+1, 510, y + 15);
1071 display_equip_price (hilite_item);
1074 y = equip_stock[i].y;
1076 gfx_draw_rectangle (2, y+1, 510, y + 15, GFX_COL_DARK_RED);
1077 display_equip_price (i);
1081 gfx_clear_text_area();
1082 sprintf (str, "Cash: %d.%d", cmdr.credits / 10, cmdr.credits % 10);
1083 gfx_display_text (16, 340, str);
1087 void select_next_equip (void)
1092 if (hilite_item == (NO_OF_EQUIP_ITEMS - 1))
1096 for (i = hilite_item + 1; i < NO_OF_EQUIP_ITEMS; i++)
1098 if (equip_stock[i].y != 0)
1105 if (next != hilite_item)
1106 highlight_equip (next);
1109 void select_previous_equip (void)
1114 if (hilite_item == 0)
1118 for (i = hilite_item - 1; i >= 0; i--)
1120 if (equip_stock[i].y != 0)
1127 if (prev != hilite_item)
1128 highlight_equip (prev);
1132 void list_equip_prices (void)
1138 gfx_clear_area (2, 55, 510, 380);
1140 tech_level = current_planet_data.techlevel + 1;
1142 equip_stock[0].price = (70 - cmdr.fuel) * 2;
1145 for (i = 0; i < NO_OF_EQUIP_ITEMS; i++)
1147 equip_stock[i].canbuy = ((equip_present (equip_stock[i].type) == 0) &&
1148 (equip_stock[i].price <= cmdr.credits));
1150 if (equip_stock[i].show && (tech_level >= equip_stock[i].level))
1152 equip_stock[i].y = y;
1156 equip_stock[i].y = 0;
1158 display_equip_price (i);
1163 highlight_equip (i);
1167 void collapse_equip_list (void)
1172 for (i = 0; i < NO_OF_EQUIP_ITEMS; i++)
1174 ch = *(equip_stock[i].name);
1175 equip_stock[i].show = ((ch == ' ') || (ch == '+'));
1180 int laser_refund (int laser_type)
1190 case MILITARY_LASER:
1201 void buy_equip (void)
1205 if (equip_stock[hilite_item].name[0] == '+')
1207 collapse_equip_list();
1208 equip_stock[hilite_item].show = 0;
1210 for (i = 0; i < 5; i++)
1211 equip_stock[hilite_item + i].show = 1;
1213 list_equip_prices();
1217 if (equip_stock[hilite_item].canbuy == 0)
1220 switch (equip_stock[hilite_item].type)
1223 cmdr.fuel = myship.max_fuel;
1233 cmdr.cargo_capacity = 35;
1240 case EQ_FUEL_SCOOPS:
1241 cmdr.fuel_scoop = 1;
1245 cmdr.escape_pod = 1;
1248 case EQ_ENERGY_BOMB:
1249 cmdr.energy_bomb = 1;
1252 case EQ_ENERGY_UNIT:
1253 cmdr.energy_unit = 1;
1257 cmdr.docking_computer = 1;
1261 cmdr.galactic_hyperdrive = 1;
1264 case EQ_FRONT_PULSE:
1265 cmdr.credits += laser_refund (cmdr.front_laser);
1266 cmdr.front_laser = PULSE_LASER;
1270 cmdr.credits += laser_refund (cmdr.rear_laser);
1271 cmdr.rear_laser = PULSE_LASER;
1275 cmdr.credits += laser_refund (cmdr.left_laser);
1276 cmdr.left_laser = PULSE_LASER;
1279 case EQ_RIGHT_PULSE:
1280 cmdr.credits += laser_refund (cmdr.right_laser);
1281 cmdr.right_laser = PULSE_LASER;
1285 cmdr.credits += laser_refund (cmdr.front_laser);
1286 cmdr.front_laser = BEAM_LASER;
1290 cmdr.credits += laser_refund (cmdr.rear_laser);
1291 cmdr.rear_laser = BEAM_LASER;
1295 cmdr.credits += laser_refund (cmdr.left_laser);
1296 cmdr.left_laser = BEAM_LASER;
1300 cmdr.credits += laser_refund (cmdr.right_laser);
1301 cmdr.right_laser = BEAM_LASER;
1304 case EQ_FRONT_MINING:
1305 cmdr.credits += laser_refund (cmdr.front_laser);
1306 cmdr.front_laser = MINING_LASER;
1309 case EQ_REAR_MINING:
1310 cmdr.credits += laser_refund (cmdr.rear_laser);
1311 cmdr.rear_laser = MINING_LASER;
1314 case EQ_LEFT_MINING:
1315 cmdr.credits += laser_refund (cmdr.left_laser);
1316 cmdr.left_laser = MINING_LASER;
1319 case EQ_RIGHT_MINING:
1320 cmdr.credits += laser_refund (cmdr.right_laser);
1321 cmdr.right_laser = MINING_LASER;
1324 case EQ_FRONT_MILITARY:
1325 cmdr.credits += laser_refund (cmdr.front_laser);
1326 cmdr.front_laser = MILITARY_LASER;
1329 case EQ_REAR_MILITARY:
1330 cmdr.credits += laser_refund (cmdr.rear_laser);
1331 cmdr.rear_laser = MILITARY_LASER;
1334 case EQ_LEFT_MILITARY:
1335 cmdr.credits += laser_refund (cmdr.left_laser);
1336 cmdr.left_laser = MILITARY_LASER;
1339 case EQ_RIGHT_MILITARY:
1340 cmdr.credits += laser_refund (cmdr.right_laser);
1341 cmdr.right_laser = MILITARY_LASER;
1345 cmdr.credits -= equip_stock[hilite_item].price;
1346 list_equip_prices();
1350 void equip_ship (void)
1352 current_screen = SCR_EQUIP_SHIP;
1354 gfx_clear_display();
1355 gfx_display_centre_text (10, "EQUIP SHIP", 140, GFX_COL_GOLD);
1356 gfx_draw_line (0, 36, 511, 36);
1358 collapse_equip_list();
1362 list_equip_prices();