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
[] =
503 void display_commander_status (void)
505 char planet_name
[16];
512 current_screen
= SCR_CMDR_STATUS
;
516 sprintf (str
, "COMMANDER %s", cmdr
.name
);
518 gfx_display_centre_text (10, str
, 140, GFX_COL_GOLD
);
520 gfx_draw_line (0, 36, 511, 36);
523 gfx_display_colour_text (16, 58, "Present System:", GFX_COL_GREEN_1
);
527 name_planet (planet_name
, docked_planet
);
528 capitalise_name (planet_name
);
529 sprintf (str
, "%s", planet_name
);
530 gfx_display_text (190, 58, str
);
533 gfx_display_colour_text (16, 74, "Hyperspace System:", GFX_COL_GREEN_1
);
534 name_planet (planet_name
, hyperspace_planet
);
535 capitalise_name (planet_name
);
536 sprintf (str
, "%s", planet_name
);
537 gfx_display_text (190, 74, str
);
545 for (i
= 0; i
< MAX_UNIV_OBJECTS
; i
++)
547 type
= universe
[i
].type
;
549 if ((type
== SHIP_MISSILE
) ||
550 ((type
> SHIP_ROCK
) && (type
< SHIP_DODEC
)))
557 if ((condition
== 2) && (energy
< 128))
561 gfx_display_colour_text (16, 90, "Condition:", GFX_COL_GREEN_1
);
562 gfx_display_text (190, 90, condition_txt
[condition
]);
564 sprintf (str
, "%d.%d Light Years", cmdr
.fuel
/ 10, cmdr
.fuel
% 10);
565 gfx_display_colour_text (16, 106, "Fuel:", GFX_COL_GREEN_1
);
566 gfx_display_text (70, 106, str
);
568 sprintf (str
, "%d.%d Cr", cmdr
.credits
/ 10, cmdr
.credits
% 10);
569 gfx_display_colour_text (16, 122, "Cash:", GFX_COL_GREEN_1
);
570 gfx_display_text (70, 122, str
);
572 if (cmdr
.legal_status
== 0)
573 strcpy (str
, "Clean");
575 strcpy (str
, cmdr
.legal_status
> 50 ?
"Fugitive" : "Offender");
577 gfx_display_colour_text (16, 138, "Legal Status:", GFX_COL_GREEN_1
);
578 gfx_display_text (128, 138, str
);
580 for (i
= 0; i
< NO_OF_RANKS
; i
++)
581 if (cmdr
.score
>= rating
[i
].score
)
582 strcpy (str
, rating
[i
].title
);
584 gfx_display_colour_text (16, 154, "Rating:", GFX_COL_GREEN_1
);
585 gfx_display_text (80, 154, str
);
587 gfx_display_colour_text (16, 186, "EQUIPMENT:", GFX_COL_GREEN_1
);
592 if (cmdr
.cargo_capacity
> 20)
594 gfx_display_text (x
, y
, "Large Cargo Bay");
600 gfx_display_text (x
, y
, "Escape Pod");
606 gfx_display_text (x
, y
, "Fuel Scoops");
612 gfx_display_text (x
, y
, "E.C.M. System");
616 if (cmdr
.energy_bomb
)
618 gfx_display_text (x
, y
, "Energy Bomb");
622 if (cmdr
.energy_unit
)
624 gfx_display_text (x
, y
,
625 cmdr
.energy_unit
== 1 ?
"Extra Energy Unit" :"Naval Energy Unit");
634 if (cmdr
.docking_computer
)
636 gfx_display_text (x
, y
, "Docking Computers");
646 if (cmdr
.galactic_hyperdrive
)
648 gfx_display_text (x
, y
, "Galactic Hyperspace");
657 if (cmdr
.front_laser
)
659 sprintf (str
, "Front %s Laser", laser_type(cmdr
.front_laser
));
660 gfx_display_text (x
, y
, str
);
671 sprintf (str
, "Rear %s Laser", laser_type(cmdr
.rear_laser
));
672 gfx_display_text (x
, y
, str
);
683 sprintf (str
, "Left %s Laser", laser_type(cmdr
.left_laser
));
684 gfx_display_text (x
, y
, str
);
693 if (cmdr
.right_laser
)
695 sprintf (str
, "Right %s Laser", laser_type(cmdr
.right_laser
));
696 gfx_display_text (x
, y
, str
);
702 /***********************************************************************************/
708 static int hilite_item
;
709 static char *unit_name
[] = {"t", "kg", "g"};
712 void display_stock_price (int i
)
719 gfx_display_text (16, y
, stock_market
[i
].name
);
721 gfx_display_text (180, y
, unit_name
[stock_market
[i
].units
]);
722 sprintf (str
, "%d.%d", stock_market
[i
].current_price
/ 10,
723 stock_market
[i
].current_price
% 10);
724 gfx_display_text (256, y
, str
);
726 if (stock_market
[i
].current_quantity
> 0)
727 sprintf (str
, "%d%s", stock_market
[i
].current_quantity
,
728 unit_name
[stock_market
[i
].units
]);
732 gfx_display_text (338, y
, str
);
734 if (cmdr
.current_cargo
[i
] > 0)
735 sprintf (str
, "%d%s", cmdr
.current_cargo
[i
],
736 unit_name
[stock_market
[i
].units
]);
740 gfx_display_text (444, y
, str
);
744 void highlight_stock (int i
)
749 if ((hilite_item
!= -1) && (hilite_item
!= i
))
751 y
= hilite_item
* 15 + 55;
752 gfx_clear_area (2, y
, 510, y
+ 15);
753 display_stock_price (hilite_item
);
758 gfx_draw_rectangle (2, y
, 510, y
+ 15, GFX_COL_DARK_RED
);
759 display_stock_price (i
);
763 gfx_clear_text_area();
764 sprintf (str
, "Cash: %d.%d", cmdr
.credits
/ 10, cmdr
.credits
% 10);
765 gfx_display_text (16, 340, str
);
768 void select_previous_stock (void)
770 if ((!docked
) || (hilite_item
== 0))
773 highlight_stock (hilite_item
- 1);
776 void select_next_stock (void)
778 if ((!docked
) || (hilite_item
== 16))
781 highlight_stock (hilite_item
+ 1);
785 void buy_stock (void)
787 struct stock_item
*item
;
793 item
= &stock_market
[hilite_item
];
795 if ((item
->current_quantity
== 0) ||
796 (cmdr
.credits
< item
->current_price
))
799 cargo_held
= total_cargo();
801 if ((item
->units
== TONNES
) &&
802 (cargo_held
== cmdr
.cargo_capacity
))
805 cmdr
.current_cargo
[hilite_item
]++;
806 item
->current_quantity
--;
807 cmdr
.credits
-= item
->current_price
;
809 highlight_stock (hilite_item
);
813 void sell_stock (void)
815 struct stock_item
*item
;
817 if ((!docked
) || (cmdr
.current_cargo
[hilite_item
] == 0))
820 item
= &stock_market
[hilite_item
];
822 cmdr
.current_cargo
[hilite_item
]--;
823 item
->current_quantity
++;
824 cmdr
.credits
+= item
->current_price
;
826 highlight_stock (hilite_item
);
831 void display_market_prices (void)
834 char planet_name
[16];
837 current_screen
= SCR_MARKET_PRICES
;
841 name_planet (planet_name
, docked_planet
);
842 sprintf (str
, "%s MARKET PRICES", planet_name
);
843 gfx_display_centre_text (10, str
, 140, GFX_COL_GOLD
);
845 gfx_draw_line (0, 36, 511, 36);
847 gfx_display_colour_text (16, 40, "PRODUCT", GFX_COL_GREEN_1
);
848 gfx_display_colour_text (166, 40, "UNIT", GFX_COL_GREEN_1
);
849 gfx_display_colour_text (246, 40, "PRICE", GFX_COL_GREEN_1
);
850 gfx_display_colour_text (314, 40, "FOR SALE", GFX_COL_GREEN_1
);
851 gfx_display_colour_text (420, 40, "IN HOLD", GFX_COL_GREEN_1
);
853 for (i
= 0; i
< 17; i
++)
855 display_stock_price (i
);
866 void display_inventory (void)
872 current_screen
= SCR_INVENTORY
;
875 gfx_display_centre_text (10, "INVENTORY", 140, GFX_COL_GOLD
);
876 gfx_draw_line (0, 36, 511, 36);
878 sprintf (str
, "%d.%d Light Years", cmdr
.fuel
/ 10, cmdr
.fuel
% 10);
879 gfx_display_colour_text (16, 50, "Fuel:", GFX_COL_GREEN_1
);
880 gfx_display_text (70, 50, str
);
882 sprintf (str
, "%d.%d Cr", cmdr
.credits
/ 10, cmdr
.credits
% 10);
883 gfx_display_colour_text (16, 66, "Cash:", GFX_COL_GREEN_1
);
884 gfx_display_text (70, 66, str
);
887 for (i
= 0; i
< 17; i
++)
889 if (cmdr
.current_cargo
[i
] > 0)
891 gfx_display_text (16, y
, stock_market
[i
].name
);
893 sprintf (str
, "%d%s", cmdr
.current_cargo
[i
],
894 unit_name
[stock_market
[i
].units
]);
896 gfx_display_text (180, y
, str
);
902 /***********************************************************************************/
906 EQ_FUEL
, EQ_MISSILE
, EQ_CARGO_BAY
, EQ_ECM
, EQ_FUEL_SCOOPS
,
907 EQ_ESCAPE_POD
, EQ_ENERGY_BOMB
, EQ_ENERGY_UNIT
, EQ_DOCK_COMP
,
908 EQ_GAL_DRIVE
, EQ_PULSE_LASER
, EQ_FRONT_PULSE
, EQ_REAR_PULSE
,
909 EQ_LEFT_PULSE
, EQ_RIGHT_PULSE
, EQ_BEAM_LASER
, EQ_FRONT_BEAM
,
910 EQ_REAR_BEAM
, EQ_LEFT_BEAM
, EQ_RIGHT_BEAM
, EQ_MINING_LASER
,
911 EQ_FRONT_MINING
, EQ_REAR_MINING
, EQ_LEFT_MINING
, EQ_RIGHT_MINING
,
912 EQ_MILITARY_LASER
, EQ_FRONT_MILITARY
, EQ_REAR_MILITARY
,
913 EQ_LEFT_MILITARY
, EQ_RIGHT_MILITARY
918 #define NO_OF_EQUIP_ITEMS 34
931 struct equip_item equip_stock
[NO_OF_EQUIP_ITEMS
] =
933 {0, 0, 1, 1, 2, " Fuel", EQ_FUEL
},
934 {0, 0, 1, 1, 300, " Missile", EQ_MISSILE
},
935 {0, 0, 1, 1, 4000, " Large Cargo Bay", EQ_CARGO_BAY
},
936 {0, 0, 1, 2, 6000, " E.C.M. System", EQ_ECM
},
937 {0, 0, 1, 5, 5250, " Fuel Scoops", EQ_FUEL_SCOOPS
},
938 {0, 0, 1, 6, 10000, " Escape Pod", EQ_ESCAPE_POD
},
939 {0, 0, 1, 7, 9000, " Energy Bomb", EQ_ENERGY_BOMB
},
940 {0, 0, 1, 8, 15000, " Extra Energy Unit", EQ_ENERGY_UNIT
},
941 {0, 0, 1, 9, 15000, " Docking Computers", EQ_DOCK_COMP
},
942 {0, 0, 1,10, 50000, " Galactic Hyperdrive", EQ_GAL_DRIVE
},
943 {0, 0, 0, 3, 4000, "+Pulse Laser", EQ_PULSE_LASER
},
944 {0, 0, 1, 3, 0, "-Pulse Laser", EQ_PULSE_LASER
},
945 {0, 0, 1, 3, 4000, ">Front", EQ_FRONT_PULSE
},
946 {0, 0, 1, 3, 4000, ">Rear", EQ_REAR_PULSE
},
947 {0, 0, 1, 3, 4000, ">Left", EQ_LEFT_PULSE
},
948 {0, 0, 1, 3, 4000, ">Right", EQ_RIGHT_PULSE
},
949 {0, 0, 1, 4, 10000, "+Beam Laser", EQ_BEAM_LASER
},
950 {0, 0, 0, 4, 0, "-Beam Laser", EQ_BEAM_LASER
},
951 {0, 0, 0, 4, 10000, ">Front", EQ_FRONT_BEAM
},
952 {0, 0, 0, 4, 10000, ">Rear", EQ_REAR_BEAM
},
953 {0, 0, 0, 4, 10000, ">Left", EQ_LEFT_BEAM
},
954 {0, 0, 0, 4, 10000, ">Right", EQ_RIGHT_BEAM
},
955 {0, 0, 1,10, 8000, "+Mining Laser", EQ_MINING_LASER
},
956 {0, 0, 0,10, 0, "-Mining Laser", EQ_MINING_LASER
},
957 {0, 0, 0,10, 8000, ">Front", EQ_FRONT_MINING
},
958 {0, 0, 0,10, 8000, ">Rear", EQ_REAR_MINING
},
959 {0, 0, 0,10, 8000, ">Left", EQ_LEFT_MINING
},
960 {0, 0, 0,10, 8000, ">Right", EQ_RIGHT_MINING
},
961 {0, 0, 1,10, 60000, "+Military Laser", EQ_MILITARY_LASER
},
962 {0, 0, 0,10, 0, "-Military Laser", EQ_MILITARY_LASER
},
963 {0, 0, 0,10, 60000, ">Front", EQ_FRONT_MILITARY
},
964 {0, 0, 0,10, 60000, ">Rear", EQ_REAR_MILITARY
},
965 {0, 0, 0,10, 60000, ">Left", EQ_LEFT_MILITARY
},
966 {0, 0, 0,10, 60000, ">Right", EQ_RIGHT_MILITARY
}
970 int equip_present (int type
)
975 return (cmdr
.fuel
>= 70);
978 return (cmdr
.missiles
>= 4);
981 return (cmdr
.cargo_capacity
> 20);
987 return cmdr
.fuel_scoop
;
990 return cmdr
.escape_pod
;
993 return cmdr
.energy_bomb
;
996 return cmdr
.energy_unit
;
999 return cmdr
.docking_computer
;
1002 return cmdr
.galactic_hyperdrive
;
1004 case EQ_FRONT_PULSE
:
1005 return (cmdr
.front_laser
== PULSE_LASER
);
1008 return (cmdr
.rear_laser
== PULSE_LASER
);
1011 return (cmdr
.left_laser
== PULSE_LASER
);
1013 case EQ_RIGHT_PULSE
:
1014 return (cmdr
.right_laser
== PULSE_LASER
);
1017 return (cmdr
.front_laser
== BEAM_LASER
);
1020 return (cmdr
.rear_laser
== BEAM_LASER
);
1023 return (cmdr
.left_laser
== BEAM_LASER
);
1026 return (cmdr
.right_laser
== BEAM_LASER
);
1028 case EQ_FRONT_MINING
:
1029 return (cmdr
.front_laser
== MINING_LASER
);
1031 case EQ_REAR_MINING
:
1032 return (cmdr
.rear_laser
== MINING_LASER
);
1034 case EQ_LEFT_MINING
:
1035 return (cmdr
.left_laser
== MINING_LASER
);
1037 case EQ_RIGHT_MINING
:
1038 return (cmdr
.right_laser
== MINING_LASER
);
1040 case EQ_FRONT_MILITARY
:
1041 return (cmdr
.front_laser
== MILITARY_LASER
);
1043 case EQ_REAR_MILITARY
:
1044 return (cmdr
.rear_laser
== MILITARY_LASER
);
1046 case EQ_LEFT_MILITARY
:
1047 return (cmdr
.left_laser
== MILITARY_LASER
);
1049 case EQ_RIGHT_MILITARY
:
1050 return (cmdr
.right_laser
== MILITARY_LASER
);
1057 void display_equip_price (int i
)
1063 y
= equip_stock
[i
].y
;
1067 col
= equip_stock
[i
].canbuy ? GFX_COL_WHITE
: GFX_COL_GREY_1
;
1069 x
= *(equip_stock
[i
].name
) == '>' ?
50 : 16;
1071 gfx_display_colour_text (x
, y
, &equip_stock
[i
].name
[1], col
);
1073 if (equip_stock
[i
].price
!= 0)
1075 sprintf (str
, "%d.%d", equip_stock
[i
].price
/ 10, equip_stock
[i
].price
% 10);
1076 gfx_display_colour_text (338, y
, str
, col
);
1081 void highlight_equip (int i
)
1086 if ((hilite_item
!= -1) && (hilite_item
!= i
))
1088 y
= equip_stock
[hilite_item
].y
;
1089 gfx_clear_area (2, y
+1, 510, y
+ 15);
1090 display_equip_price (hilite_item
);
1093 y
= equip_stock
[i
].y
;
1095 gfx_draw_rectangle (2, y
+1, 510, y
+ 15, GFX_COL_DARK_RED
);
1096 display_equip_price (i
);
1100 gfx_clear_text_area();
1101 sprintf (str
, "Cash: %d.%d", cmdr
.credits
/ 10, cmdr
.credits
% 10);
1102 gfx_display_text (16, 340, str
);
1106 void select_next_equip (void)
1111 if (hilite_item
== (NO_OF_EQUIP_ITEMS
- 1))
1115 for (i
= hilite_item
+ 1; i
< NO_OF_EQUIP_ITEMS
; i
++)
1117 if (equip_stock
[i
].y
!= 0)
1124 if (next
!= hilite_item
)
1125 highlight_equip (next
);
1128 void select_previous_equip (void)
1133 if (hilite_item
== 0)
1137 for (i
= hilite_item
- 1; i
>= 0; i
--)
1139 if (equip_stock
[i
].y
!= 0)
1146 if (prev
!= hilite_item
)
1147 highlight_equip (prev
);
1151 void list_equip_prices (void)
1157 gfx_clear_area (2, 55, 510, 380);
1159 tech_level
= current_planet_data
.techlevel
+ 1;
1161 equip_stock
[0].price
= (70 - cmdr
.fuel
) * 2;
1164 for (i
= 0; i
< NO_OF_EQUIP_ITEMS
; i
++)
1166 equip_stock
[i
].canbuy
= ((equip_present (equip_stock
[i
].type
) == 0) &&
1167 (equip_stock
[i
].price
<= cmdr
.credits
));
1169 if (equip_stock
[i
].show
&& (tech_level
>= equip_stock
[i
].level
))
1171 equip_stock
[i
].y
= y
;
1175 equip_stock
[i
].y
= 0;
1177 display_equip_price (i
);
1182 highlight_equip (i
);
1186 void collapse_equip_list (void)
1191 for (i
= 0; i
< NO_OF_EQUIP_ITEMS
; i
++)
1193 ch
= *(equip_stock
[i
].name
);
1194 equip_stock
[i
].show
= ((ch
== ' ') || (ch
== '+'));
1199 int laser_refund (int laser_type
)
1209 case MILITARY_LASER
:
1220 void buy_equip (void)
1224 if (equip_stock
[hilite_item
].name
[0] == '+')
1226 collapse_equip_list();
1227 equip_stock
[hilite_item
].show
= 0;
1229 for (i
= 0; i
< 5; i
++)
1230 equip_stock
[hilite_item
+ i
].show
= 1;
1232 list_equip_prices();
1236 if (equip_stock
[hilite_item
].canbuy
== 0)
1239 switch (equip_stock
[hilite_item
].type
)
1242 cmdr
.fuel
= myship
.max_fuel
;
1252 cmdr
.cargo_capacity
= 35;
1259 case EQ_FUEL_SCOOPS
:
1260 cmdr
.fuel_scoop
= 1;
1264 cmdr
.escape_pod
= 1;
1267 case EQ_ENERGY_BOMB
:
1268 cmdr
.energy_bomb
= 1;
1271 case EQ_ENERGY_UNIT
:
1272 cmdr
.energy_unit
= 1;
1276 cmdr
.docking_computer
= 1;
1280 cmdr
.galactic_hyperdrive
= 1;
1283 case EQ_FRONT_PULSE
:
1284 cmdr
.credits
+= laser_refund (cmdr
.front_laser
);
1285 cmdr
.front_laser
= PULSE_LASER
;
1289 cmdr
.credits
+= laser_refund (cmdr
.rear_laser
);
1290 cmdr
.rear_laser
= PULSE_LASER
;
1294 cmdr
.credits
+= laser_refund (cmdr
.left_laser
);
1295 cmdr
.left_laser
= PULSE_LASER
;
1298 case EQ_RIGHT_PULSE
:
1299 cmdr
.credits
+= laser_refund (cmdr
.right_laser
);
1300 cmdr
.right_laser
= PULSE_LASER
;
1304 cmdr
.credits
+= laser_refund (cmdr
.front_laser
);
1305 cmdr
.front_laser
= BEAM_LASER
;
1309 cmdr
.credits
+= laser_refund (cmdr
.rear_laser
);
1310 cmdr
.rear_laser
= BEAM_LASER
;
1314 cmdr
.credits
+= laser_refund (cmdr
.left_laser
);
1315 cmdr
.left_laser
= BEAM_LASER
;
1319 cmdr
.credits
+= laser_refund (cmdr
.right_laser
);
1320 cmdr
.right_laser
= BEAM_LASER
;
1323 case EQ_FRONT_MINING
:
1324 cmdr
.credits
+= laser_refund (cmdr
.front_laser
);
1325 cmdr
.front_laser
= MINING_LASER
;
1328 case EQ_REAR_MINING
:
1329 cmdr
.credits
+= laser_refund (cmdr
.rear_laser
);
1330 cmdr
.rear_laser
= MINING_LASER
;
1333 case EQ_LEFT_MINING
:
1334 cmdr
.credits
+= laser_refund (cmdr
.left_laser
);
1335 cmdr
.left_laser
= MINING_LASER
;
1338 case EQ_RIGHT_MINING
:
1339 cmdr
.credits
+= laser_refund (cmdr
.right_laser
);
1340 cmdr
.right_laser
= MINING_LASER
;
1343 case EQ_FRONT_MILITARY
:
1344 cmdr
.credits
+= laser_refund (cmdr
.front_laser
);
1345 cmdr
.front_laser
= MILITARY_LASER
;
1348 case EQ_REAR_MILITARY
:
1349 cmdr
.credits
+= laser_refund (cmdr
.rear_laser
);
1350 cmdr
.rear_laser
= MILITARY_LASER
;
1353 case EQ_LEFT_MILITARY
:
1354 cmdr
.credits
+= laser_refund (cmdr
.left_laser
);
1355 cmdr
.left_laser
= MILITARY_LASER
;
1358 case EQ_RIGHT_MILITARY
:
1359 cmdr
.credits
+= laser_refund (cmdr
.right_laser
);
1360 cmdr
.right_laser
= MILITARY_LASER
;
1364 cmdr
.credits
-= equip_stock
[hilite_item
].price
;
1365 list_equip_prices();
1369 void equip_ship (void)
1371 current_screen
= SCR_EQUIP_SHIP
;
1373 gfx_clear_display();
1374 gfx_display_centre_text (10, "EQUIP SHIP", 140, GFX_COL_GOLD
);
1375 gfx_draw_line (0, 36, 511, 36);
1377 collapse_equip_list();
1381 list_equip_prices();