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 | * file.c |
17 | */ |
18 | |
19 | #include <ctype.h> |
20 | #include <stdio.h> |
21 | #include <stdlib.h> |
22 | #include <string.h> |
23 | |
24 | #include "elite.h" |
25 | #include "config.h" |
26 | #include "file.h" |
27 | |
28 | void write_config_file (void) |
29 | { |
30 | FILE *fp; |
31 | |
32 | fp = fopen ("newkind.cfg", "w"); |
33 | if (fp == NULL) |
34 | return; |
35 | |
36 | fprintf (fp, "%d\t\t# Game Speed, the lower the number the faster the game.\n", speed_cap); |
37 | |
38 | fprintf (fp, "%d\t\t# Graphics: 0 = Solid, 1 = Wireframe\n", wireframe); |
39 | |
40 | fprintf (fp, "%d\t\t# Anti-Alias Wireframe: 0 = Normal, 1 = Anti-Aliased\n", anti_alias_gfx); |
41 | |
42 | fprintf (fp, "%d\t\t# Planet style: 0 = Wireframe, 1 = Green, 2 = SNES, 3 = Fractal\n", planet_render_style); |
43 | |
44 | fprintf (fp, "%d\t\t# Planet Descriptions: 0 = Tree Grubs, 1 = Hoopy Casinos\n", hoopy_casinos); |
45 | |
46 | fprintf (fp, "%d\t\t# Instant dock: 0 = off, 1 = on\n", instant_dock); |
47 | |
48 | fprintf (fp, "newscan.cfg\t# Name of scanner config file to use.\n"); |
49 | |
50 | fclose (fp); |
51 | } |
52 | |
53 | |
54 | /* |
55 | * Read a line from a .cfg file. |
56 | * Ignore blanks, comments and strip white space. |
57 | */ |
58 | |
59 | void read_cfg_line (char *str, int max_size, FILE *fp) |
60 | { |
61 | char *s; |
62 | |
63 | do |
64 | { |
65 | fgets (str, max_size, fp); |
66 | |
67 | for (s = str; *s; s++) /* End of line at LF or # */ |
68 | { |
69 | if ((*s == '\n') || (*s == '#')) |
70 | { |
71 | *s = '\0'; |
72 | break; |
73 | } |
74 | } |
75 | |
76 | if (s != str) /* Trim any trailing white space */ |
77 | { |
78 | s--; |
79 | while (isspace(*s)) |
80 | { |
81 | *s = '\0'; |
82 | if (s == str) |
83 | break; |
84 | s--; |
85 | } |
86 | } |
87 | |
88 | } while (*str == '\0'); |
89 | } |
90 | |
91 | |
92 | /* |
93 | * Read in the scanner .cfg file. |
94 | */ |
95 | |
96 | void read_scanner_config_file (char *filename) |
97 | { |
98 | FILE *fp; |
99 | char str[256]; |
100 | |
101 | fp = fopen (filename, "r"); |
102 | if (fp == NULL) |
103 | return; |
104 | |
105 | read_cfg_line (str, sizeof(str), fp); |
106 | strcpy (scanner_filename, str); |
107 | |
108 | read_cfg_line (str, sizeof(str), fp); |
109 | sscanf (str, "%d,%d", &scanner_cx, &scanner_cy); |
110 | scanner_cy += 385; |
111 | |
112 | read_cfg_line (str, sizeof(str), fp); |
113 | sscanf (str, "%d,%d", &compass_centre_x, &compass_centre_y); |
114 | compass_centre_y += 385; |
115 | |
116 | fclose (fp); |
117 | } |
118 | |
119 | /* |
120 | * Read in the newkind.cfg file. |
121 | */ |
122 | |
123 | void read_config_file (void) |
124 | { |
125 | FILE *fp; |
126 | char str[256]; |
127 | |
128 | fp = fopen ("newkind.cfg", "r"); |
129 | if (fp == NULL) |
130 | return; |
131 | |
132 | read_cfg_line (str, sizeof(str), fp); |
133 | sscanf (str, "%d", &speed_cap); |
134 | |
135 | read_cfg_line (str, sizeof(str), fp); |
136 | sscanf (str, "%d", &wireframe); |
137 | |
138 | read_cfg_line (str, sizeof(str), fp); |
139 | sscanf (str, "%d", &anti_alias_gfx); |
140 | |
141 | read_cfg_line (str, sizeof(str), fp); |
142 | sscanf (str, "%d", &planet_render_style); |
143 | |
144 | read_cfg_line (str, sizeof(str), fp); |
145 | sscanf (str, "%d", &hoopy_casinos); |
146 | |
147 | read_cfg_line (str, sizeof(str), fp); |
148 | sscanf (str, "%d", &instant_dock); |
149 | |
150 | read_cfg_line (str, sizeof(str), fp); |
151 | read_scanner_config_file (str); |
152 | |
153 | fclose (fp); |
154 | } |
155 | |
156 | int checksum (unsigned char *block) |
157 | { |
158 | int acc,carry; |
159 | int i; |
160 | |
161 | acc = 0x49; |
162 | carry = 0; |
163 | for (i = 0x49; i > 0; i--) |
164 | { |
165 | acc += block[i-1] + carry; |
166 | carry = acc >> 8; |
167 | acc &= 255; |
168 | acc ^= block[i]; |
169 | } |
170 | |
171 | return acc; |
172 | } |
173 | |
174 | |
175 | int save_commander_file (char *path) |
176 | { |
177 | FILE *fp; |
178 | unsigned char block[256]; |
179 | int i; |
180 | int chk; |
181 | |
182 | fp = fopen (path, "wb"); |
183 | if (fp == NULL) |
184 | return 1; |
185 | |
186 | block[0] = cmdr.mission; |
187 | block[1] = docked_planet.d; |
188 | block[2] = docked_planet.b; |
189 | block[3] = cmdr.galaxy.a; |
190 | block[4] = cmdr.galaxy.b; |
191 | block[5] = cmdr.galaxy.c; |
192 | block[6] = cmdr.galaxy.d; |
193 | block[7] = cmdr.galaxy.e; |
194 | block[8] = cmdr.galaxy.f; |
195 | block[9] = (cmdr.credits >> 24) & 255; |
196 | block[10] = (cmdr.credits >> 16) & 255; |
197 | block[11] = (cmdr.credits >> 8) & 255; |
198 | block[12] = cmdr.credits & 255; |
199 | block[13] = cmdr.fuel; |
200 | block[14] = 4; |
201 | block[15] = cmdr.galaxy_number; |
202 | block[16] = cmdr.front_laser; |
203 | block[17] = cmdr.rear_laser; |
204 | block[18] = cmdr.left_laser; |
205 | block[19] = cmdr.right_laser; |
206 | block[20] = 0; |
207 | block[21] = 0; |
208 | block[22] = cmdr.cargo_capacity + 2; |
209 | |
210 | for (i = 0; i < NO_OF_STOCK_ITEMS; i++) |
211 | block[23+i] = cmdr.current_cargo[i]; |
212 | |
213 | block[40] = cmdr.ecm ? 255 : 0; |
214 | block[41] = cmdr.fuel_scoop ? 255 : 0; |
215 | block[42] = cmdr.energy_bomb ? 0x7F : 0; |
216 | block[43] = cmdr.energy_unit; |
217 | block[44] = cmdr.docking_computer ? 255 : 0; |
218 | block[45] = cmdr.galactic_hyperdrive ? 255 : 0; |
219 | block[46] = cmdr.escape_pod ? 255 : 0; |
220 | block[47] = 0; |
221 | block[48] = 0; |
222 | block[49] = 0; |
223 | block[50] = 0; |
224 | block[51] = cmdr.missiles; |
225 | block[52] = cmdr.legal_status; |
226 | |
227 | for (i = 0; i < NO_OF_STOCK_ITEMS; i++) |
228 | block[53+i] = stock_market[i].current_quantity; |
229 | |
230 | block[70] = cmdr.market_rnd; |
231 | block[71] = cmdr.score & 255; |
232 | block[72] = cmdr.score >> 8; |
233 | block[73] = 0x20; |
234 | |
235 | chk = checksum (block); |
236 | |
237 | block[74] = chk ^ 0xA9; |
238 | block[75] = chk; |
239 | |
240 | for (i = 76; i < 256; i++) |
241 | block[i] = 0; |
242 | |
243 | if (fwrite (block, 256, 1, fp) != 1) |
244 | return 1; |
245 | |
246 | if (fclose (fp) == EOF) |
247 | return 1; |
248 | |
249 | return 0; |
250 | } |
251 | |
252 | |
253 | int load_commander_file (char *path) |
254 | { |
255 | FILE *fp; |
256 | unsigned char block[256]; |
257 | int i; |
258 | int chk; |
259 | |
260 | fp = fopen (path, "rb"); |
261 | if (fp == NULL) |
262 | return 1; |
263 | |
264 | if (fread (block, 256, 1, fp) != 1) |
265 | return 1; |
266 | |
267 | chk = checksum (block); |
268 | |
269 | if ((block[74] != (chk ^ 0xA9)) || (block[75] != chk)) |
270 | return 1; |
271 | |
272 | saved_cmdr.mission = block[0]; |
273 | |
274 | saved_cmdr.ship_x = block[1]; |
275 | saved_cmdr.ship_y = block[2]; |
276 | |
277 | saved_cmdr.galaxy.a = block[3]; |
278 | saved_cmdr.galaxy.b = block[4]; |
279 | saved_cmdr.galaxy.c = block[5]; |
280 | saved_cmdr.galaxy.d = block[6]; |
281 | saved_cmdr.galaxy.e = block[7]; |
282 | saved_cmdr.galaxy.f = block[8];; |
283 | |
284 | saved_cmdr.credits = block[9] << 24; |
285 | saved_cmdr.credits += block[10] << 16; |
286 | saved_cmdr.credits += block[11] << 8; |
287 | saved_cmdr.credits += block[12]; |
288 | |
289 | saved_cmdr.fuel = block[13]; |
290 | |
291 | saved_cmdr.galaxy_number = block[15]; |
292 | saved_cmdr.front_laser = block[16]; |
293 | saved_cmdr.rear_laser = block[17]; |
294 | saved_cmdr.left_laser = block[18]; |
295 | saved_cmdr.right_laser = block[19]; |
296 | |
297 | saved_cmdr.cargo_capacity = block[22] - 2; |
298 | |
299 | for (i = 0; i < NO_OF_STOCK_ITEMS; i++) |
300 | saved_cmdr.current_cargo[i] = block[23+i]; |
301 | |
302 | saved_cmdr.ecm = block[40]; |
303 | saved_cmdr.fuel_scoop = block[41]; |
304 | saved_cmdr.energy_bomb = block[42]; |
305 | saved_cmdr.energy_unit = block[43]; |
306 | saved_cmdr.docking_computer = block[44]; |
307 | saved_cmdr.galactic_hyperdrive = block[45]; |
308 | saved_cmdr.escape_pod = block[46]; |
309 | saved_cmdr.missiles = block[51]; |
310 | saved_cmdr.legal_status = block[52]; |
311 | |
312 | for (i = 0; i < NO_OF_STOCK_ITEMS; i++) |
313 | saved_cmdr.station_stock[i] = block[53+i]; |
314 | |
315 | saved_cmdr.market_rnd = block[70]; |
316 | |
317 | saved_cmdr.score = block[71]; |
318 | saved_cmdr.score += block[72] << 8; |
319 | |
320 | if (fclose (fp) == EOF) |
321 | return 1; |
322 | |
323 | return 0; |
324 | } |
325 | |
326 | |
327 | |
328 | |