Line 0
Link Here
|
|
|
1 |
# Origin: https://github.com/naev/naev/commit/74b9a086a20f80f21ce2f3866b31318e651a6235 |
2 |
# Subject: Turn player_missions in an array of pointers |
3 |
# Origin: https://github.com/naev/naev/commit/155a7fdaf07e1b5549e6314a433425b4187bb33f |
4 |
# Subject: Don't use a pointer to a pointer |
5 |
# Origin: https://github.com/naev/naev/commit/9fd2a7dcb3690bc1befe7f9a05d02e204dcfe8a1 |
6 |
# Subject: Avoid regenerating the land tabs over top of themselves |
7 |
# Origin: https://github.com/naev/naev/commit/34651062f0f26b43489214137862148c7cf842c1 |
8 |
# Subject: Regenerate the player's ship list when removing a ship |
9 |
# Origin: https://github.com/naev/naev/commit/b9bad809027529c0b0e95d9b8a011cb880229a5d |
10 |
# Subject: Fixed "buy map" button not showing up until after land hooks. |
11 |
|
12 |
diff -ruN src/equipment.c src/equipment.c |
13 |
--- src/equipment.c |
14 |
+++ src/equipment.c |
15 |
@@ -234,6 +234,9 @@ |
16 |
GLfloat colour[4*4]; |
17 |
const char *buf; |
18 |
|
19 |
+ /* Mark as generated. */ |
20 |
+ land_tabGenerate(LAND_WINDOW_EQUIPMENT); |
21 |
+ |
22 |
/* Set global WID. */ |
23 |
equipment_wid = wid; |
24 |
|
25 |
diff -ruN src/hook.c src/hook.c |
26 |
--- src/hook.c |
27 |
+++ src/hook.c |
28 |
@@ -837,8 +837,8 @@ |
29 |
{ |
30 |
int i; |
31 |
for (i=0; i<MISSION_MAX; i++) |
32 |
- if (player_missions[i].id == hook->u.misn.parent) |
33 |
- return &player_missions[i]; |
34 |
+ if (player_missions[i]->id == hook->u.misn.parent) |
35 |
+ return player_missions[i]; |
36 |
|
37 |
return NULL; |
38 |
} |
39 |
diff -ruN src/info.c src/info.c |
40 |
--- src/info.c |
41 |
+++ src/info.c |
42 |
@@ -785,8 +785,8 @@ |
43 |
/* Get the mission. */ |
44 |
f = 0; |
45 |
for (i=0; i<MISSION_MAX; i++) { |
46 |
- for (j=0; j<player_missions[i].ncargo; j++) { |
47 |
- if (player_missions[i].cargo[j] == player.p->commodities[pos].id) { |
48 |
+ for (j=0; j<player_missions[i]->ncargo; j++) { |
49 |
+ if (player_missions[i]->cargo[j] == player.p->commodities[pos].id) { |
50 |
f = 1; |
51 |
break; |
52 |
} |
53 |
@@ -799,7 +799,7 @@ |
54 |
player.p->commodities[pos].id); |
55 |
return; |
56 |
} |
57 |
- misn = &player_missions[i]; |
58 |
+ misn = player_missions[i]; |
59 |
|
60 |
/* We run the "abort" function if it's found. */ |
61 |
ret = misn_tryRun( misn, "abort" ); |
62 |
@@ -807,9 +807,7 @@ |
63 |
/* Now clean up mission. */ |
64 |
if (ret != 2) { |
65 |
mission_cleanup( misn ); |
66 |
- memmove( misn, &player_missions[i+1], |
67 |
- sizeof(Mission) * (MISSION_MAX-i-1) ); |
68 |
- memset( &player_missions[MISSION_MAX-1], 0, sizeof(Mission) ); |
69 |
+ mission_shift(pos); |
70 |
} |
71 |
|
72 |
/* Reset markers. */ |
73 |
@@ -1005,8 +1003,10 @@ |
74 |
misn_names = malloc(sizeof(char*) * MISSION_MAX); |
75 |
j = 0; |
76 |
for (i=0; i<MISSION_MAX; i++) |
77 |
- if (player_missions[i].id != 0) |
78 |
- misn_names[j++] = (player_missions[i].title!=NULL) ? strdup(player_missions[i].title) : NULL; |
79 |
+ if (player_missions[i]->id != 0) |
80 |
+ misn_names[j++] = (player_missions[i]->title != NULL) ? |
81 |
+ strdup(player_missions[i]->title) : NULL; |
82 |
+ |
83 |
if (j==0) { /* no missions */ |
84 |
misn_names[0] = strdup("No Missions"); |
85 |
j = 1; |
86 |
@@ -1035,7 +1035,7 @@ |
87 |
} |
88 |
|
89 |
/* Modify the text. */ |
90 |
- misn = &player_missions[ toolkit_getListPos(wid, "lstMission" ) ]; |
91 |
+ misn = player_missions[ toolkit_getListPos(wid, "lstMission" ) ]; |
92 |
window_modifyText( wid, "txtReward", misn->reward ); |
93 |
window_modifyText( wid, "txtDesc", misn->desc ); |
94 |
window_enableButton( wid, "btnAbortMission" ); |
95 |
@@ -1052,7 +1052,7 @@ |
96 |
{ |
97 |
(void)str; |
98 |
int pos; |
99 |
- Mission* misn; |
100 |
+ Mission *misn; |
101 |
int ret; |
102 |
|
103 |
if (dialogue_YesNo( "Abort Mission", |
104 |
@@ -1060,7 +1060,7 @@ |
105 |
|
106 |
/* Get the mission. */ |
107 |
pos = toolkit_getListPos(wid, "lstMission" ); |
108 |
- misn = &player_missions[pos]; |
109 |
+ misn = player_missions[pos]; |
110 |
|
111 |
/* We run the "abort" function if it's found. */ |
112 |
ret = misn_tryRun( misn, "abort" ); |
113 |
@@ -1068,9 +1068,7 @@ |
114 |
/* Now clean up mission. */ |
115 |
if (ret != 2) { |
116 |
mission_cleanup( misn ); |
117 |
- memmove( misn, &player_missions[pos+1], |
118 |
- sizeof(Mission) * (MISSION_MAX-pos-1) ); |
119 |
- memset( &player_missions[MISSION_MAX-1], 0, sizeof(Mission) ); |
120 |
+ mission_shift(pos); |
121 |
} |
122 |
|
123 |
/* Reset markers. */ |
124 |
diff -ruN src/land.c src/land.c |
125 |
--- src/land.c |
126 |
+++ src/land.c |
127 |
@@ -69,6 +69,8 @@ |
128 |
#define has_visited(f) (land_visited & (f)) /**< Check if player has visited. */ |
129 |
static unsigned int land_visited = 0; /**< Contains what the player visited. */ |
130 |
|
131 |
+/* Which tabs have been generated by their respective open functions. */ |
132 |
+unsigned int land_generated = 0; |
133 |
|
134 |
/* |
135 |
* land variables |
136 |
@@ -187,6 +189,9 @@ |
137 |
char **goods; |
138 |
int w, h; |
139 |
|
140 |
+ /* Mark as generated. */ |
141 |
+ land_tabGenerate(LAND_WINDOW_COMMODITY); |
142 |
+ |
143 |
/* Get window dimensions. */ |
144 |
window_dimWindow( wid, &w, &h ); |
145 |
|
146 |
@@ -566,6 +571,9 @@ |
147 |
{ |
148 |
int w, h, iw, ih, bw, bh, dh, th; |
149 |
|
150 |
+ /* Mark as generated. */ |
151 |
+ land_tabGenerate(LAND_WINDOW_BAR); |
152 |
+ |
153 |
/* Set window functions. */ |
154 |
window_onClose( wid, bar_close ); |
155 |
|
156 |
@@ -822,6 +830,9 @@ |
157 |
int w, h; |
158 |
int y; |
159 |
|
160 |
+ /* Mark as generated. */ |
161 |
+ land_tabGenerate(LAND_WINDOW_MISSION); |
162 |
+ |
163 |
/* Get window dimensions. */ |
164 |
window_dimWindow( wid, &w, &h ); |
165 |
|
166 |
@@ -900,7 +911,7 @@ |
167 |
|
168 |
/* Make sure player can accept the mission. */ |
169 |
for (i=0; i<MISSION_MAX; i++) |
170 |
- if (player_missions[i].data == NULL) break; |
171 |
+ if (player_missions[i]->data == NULL) break; |
172 |
if (i >= MISSION_MAX) { |
173 |
dialogue_alert("You have too many active missions."); |
174 |
return; |
175 |
@@ -1180,6 +1191,9 @@ |
176 |
if (land_wid > 0) { |
177 |
land_regen = 2; /* Mark we're regenning. */ |
178 |
window_destroy(land_wid); |
179 |
+ |
180 |
+ /* Mark tabs as not generated. */ |
181 |
+ land_generated = 0; |
182 |
} |
183 |
land_loaded = 0; |
184 |
|
185 |
@@ -1255,6 +1269,9 @@ |
186 |
/* 1) Create main tab. */ |
187 |
land_createMainTab( land_getWid(LAND_WINDOW_MAIN) ); |
188 |
|
189 |
+ /* Add local system map button. */ |
190 |
+ land_checkAddMap(); |
191 |
+ |
192 |
/* 2) Set as landed and run hooks. */ |
193 |
if (!regen) { |
194 |
landed = 1; |
195 |
@@ -1274,24 +1291,34 @@ |
196 |
} |
197 |
|
198 |
/* 4) Create other tabs. */ |
199 |
+#define should_open(s, w) \ |
200 |
+ (planet_hasService(land_planet, s) && (!land_tabGenerated(w))) |
201 |
+ |
202 |
+ /* Things get a bit hairy here. Hooks may have triggered a GUI reload via |
203 |
+ * e.g. player.swapShip, so the land tabs may have been generated already |
204 |
+ * and we need to check that before regenerating them. |
205 |
+ */ |
206 |
+ |
207 |
/* Basic - bar + missions */ |
208 |
- if (planet_hasService(land_planet, PLANET_SERVICE_BAR)) |
209 |
+ if (should_open( PLANET_SERVICE_BAR, LAND_WINDOW_BAR )) |
210 |
bar_open( land_getWid(LAND_WINDOW_BAR) ); |
211 |
- if (planet_hasService(land_planet, PLANET_SERVICE_MISSIONS)) |
212 |
+ if (should_open( PLANET_SERVICE_MISSIONS, LAND_WINDOW_MISSION )) |
213 |
misn_open( land_getWid(LAND_WINDOW_MISSION) ); |
214 |
/* Outfits. */ |
215 |
- if (planet_hasService(land_planet, PLANET_SERVICE_OUTFITS)) |
216 |
+ if (should_open( PLANET_SERVICE_OUTFITS, LAND_WINDOW_OUTFITS )) |
217 |
outfits_open( land_getWid(LAND_WINDOW_OUTFITS) ); |
218 |
/* Shipyard. */ |
219 |
- if (planet_hasService(land_planet, PLANET_SERVICE_SHIPYARD)) |
220 |
+ if (should_open( PLANET_SERVICE_SHIPYARD, LAND_WINDOW_SHIPYARD )) |
221 |
shipyard_open( land_getWid(LAND_WINDOW_SHIPYARD) ); |
222 |
/* Equipment. */ |
223 |
- if (planet_hasService(land_planet, PLANET_SERVICE_OUTFITS) || |
224 |
- planet_hasService(land_planet, PLANET_SERVICE_SHIPYARD)) |
225 |
+ if ((planet_hasService(land_planet, PLANET_SERVICE_OUTFITS) || |
226 |
+ planet_hasService(land_planet, PLANET_SERVICE_SHIPYARD)) && |
227 |
+ !land_tabGenerated( LAND_WINDOW_EQUIPMENT )) |
228 |
equipment_open( land_getWid(LAND_WINDOW_EQUIPMENT) ); |
229 |
/* Commodity. */ |
230 |
- if (planet_hasService(land_planet, PLANET_SERVICE_COMMODITY)) |
231 |
+ if (should_open( PLANET_SERVICE_COMMODITY, LAND_WINDOW_COMMODITY )) |
232 |
commodity_exchange_open( land_getWid(LAND_WINDOW_COMMODITY) ); |
233 |
+#undef should_open |
234 |
|
235 |
if (!regen) { |
236 |
/* Reset markers if needed. */ |
237 |
@@ -1310,9 +1337,6 @@ |
238 |
if (changetab && land_windowsMap[ last_window ] != -1) |
239 |
window_tabWinSetActive( land_wid, "tabLand", land_windowsMap[ last_window ] ); |
240 |
|
241 |
- /* Add local system map button. */ |
242 |
- land_checkAddMap(); |
243 |
- |
244 |
/* Refuel if necessary. */ |
245 |
land_refuel(); |
246 |
|
247 |
@@ -1689,6 +1713,7 @@ |
248 |
land_planet = NULL; |
249 |
landed = 0; |
250 |
land_visited = 0; |
251 |
+ land_generated = 0; |
252 |
|
253 |
/* Destroy window. */ |
254 |
if (land_wid > 0) |
255 |
diff -ruN src/land.h src/land.h |
256 |
--- src/land.h |
257 |
+++ src/land.h |
258 |
@@ -46,6 +46,12 @@ |
259 |
extern Planet* land_planet; |
260 |
|
261 |
|
262 |
+/* Tracking for which tabs have been generated. */ |
263 |
+#define land_tabGenerate(w) (land_generated |= (1 << w)) /**< Mark tab generated. */ |
264 |
+#define land_tabGenerated(w) (land_generated & (1 << w)) /**< Check if tab has been generated. */ |
265 |
+extern unsigned int land_generated; |
266 |
+ |
267 |
+ |
268 |
/* |
269 |
* Main interface. |
270 |
*/ |
271 |
diff -ruN src/land_outfits.c src/land_outfits.c |
272 |
--- src/land_outfits.c |
273 |
+++ src/land_outfits.c |
274 |
@@ -95,6 +95,9 @@ |
275 |
{ |
276 |
int w, h, iw, ih, bw, bh, off; |
277 |
|
278 |
+ /* Mark as generated. */ |
279 |
+ land_tabGenerate(LAND_WINDOW_OUTFITS); |
280 |
+ |
281 |
/* Get dimensions. */ |
282 |
outfits_getSize( wid, &w, &h, &iw, &ih, &bw, &bh ); |
283 |
|
284 |
diff -ruN src/land_shipyard.c src/land_shipyard.c |
285 |
--- src/land_shipyard.c |
286 |
+++ src/land_shipyard.c |
287 |
@@ -61,6 +61,9 @@ |
288 |
int y; |
289 |
const char *buf; |
290 |
|
291 |
+ /* Mark as generated. */ |
292 |
+ land_tabGenerate(LAND_WINDOW_SHIPYARD); |
293 |
+ |
294 |
/* Init vars. */ |
295 |
shipyard_selected = NULL; |
296 |
|
297 |
diff -ruN src/mission.c src/mission.c |
298 |
--- src/mission.c |
299 |
+++ src/mission.c |
300 |
@@ -50,7 +50,7 @@ |
301 |
* current player missions |
302 |
*/ |
303 |
static unsigned int mission_id = 0; /**< Mission ID generator. */ |
304 |
-Mission player_missions[MISSION_MAX]; /**< Player's active missions. */ |
305 |
+Mission *player_missions[MISSION_MAX]; /**< Player's active missions. */ |
306 |
|
307 |
|
308 |
/* |
309 |
@@ -95,7 +95,7 @@ |
310 |
|
311 |
/* we save mission ids, so check for collisions with player's missions */ |
312 |
for (i=0; i<MISSION_MAX; i++) |
313 |
- if (id == player_missions[i].id) /* mission id was loaded from save */ |
314 |
+ if (id == player_missions[i]->id) /* mission id was loaded from save */ |
315 |
return mission_genID(); /* recursively try again */ |
316 |
return id; |
317 |
} |
318 |
@@ -240,7 +240,7 @@ |
319 |
{ |
320 |
int i; |
321 |
for (i=0; i<MISSION_MAX; i++) |
322 |
- if (player_missions[i].data==misn) |
323 |
+ if (player_missions[i]->data == misn) |
324 |
return 1; |
325 |
return 0; |
326 |
} |
327 |
@@ -416,15 +416,15 @@ |
328 |
|
329 |
for (i=0; i<MISSION_MAX; i++) { |
330 |
/* Must be a valid player mission. */ |
331 |
- if (player_missions[i].id == 0) |
332 |
+ if (player_missions[i]->id == 0) |
333 |
continue; |
334 |
/* Must have markers. */ |
335 |
- if (player_missions[i].markers == NULL) |
336 |
+ if (player_missions[i]->markers == NULL) |
337 |
continue; |
338 |
|
339 |
- n = array_size( player_missions[i].markers ); |
340 |
+ n = array_size( player_missions[i]->markers ); |
341 |
for (j=0; j<n; j++) { |
342 |
- m = &player_missions[i].markers[j]; |
343 |
+ m = &player_missions[i]->markers[j]; |
344 |
|
345 |
/* Add the individual markers. */ |
346 |
space_addMarker( m->sys, m->type ); |
347 |
@@ -562,6 +562,30 @@ |
348 |
|
349 |
|
350 |
/** |
351 |
+ * @brief Puts the specified mission at the end of the player_missions array. |
352 |
+ * |
353 |
+ * @param pos Mission's position within player_missions |
354 |
+ */ |
355 |
+void mission_shift( int pos ) |
356 |
+{ |
357 |
+ Mission *misn; |
358 |
+ |
359 |
+ if (pos >= (MISSION_MAX-1)) |
360 |
+ return; |
361 |
+ |
362 |
+ /* Store specified mission. */ |
363 |
+ misn = player_missions[pos]; |
364 |
+ |
365 |
+ /* Move other missions down. */ |
366 |
+ memmove( &player_missions[pos], &player_missions[pos+1], |
367 |
+ sizeof(Mission*) * (MISSION_MAX - pos - 1) ); |
368 |
+ |
369 |
+ /* Put the specified mission at the end of the array. */ |
370 |
+ player_missions[MISSION_MAX - 1] = misn; |
371 |
+} |
372 |
+ |
373 |
+ |
374 |
+/** |
375 |
* @brief Frees MissionData. |
376 |
* |
377 |
* @param mission MissionData to free. |
378 |
@@ -622,8 +646,8 @@ |
379 |
int i; |
380 |
|
381 |
for (i=0; i<MISSION_MAX; i++) |
382 |
- if (player_missions[i].claims != NULL) |
383 |
- claim_activate( player_missions[i].claims ); |
384 |
+ if (player_missions[i]->claims != NULL) |
385 |
+ claim_activate( player_missions[i]->claims ); |
386 |
} |
387 |
|
388 |
|
389 |
@@ -869,9 +893,14 @@ |
390 |
*/ |
391 |
int missions_load (void) |
392 |
{ |
393 |
- int m; |
394 |
+ int i, m; |
395 |
uint32_t bufsize; |
396 |
- char *buf = ndata_read( MISSION_DATA_PATH, &bufsize ); |
397 |
+ char *buf; |
398 |
+ |
399 |
+ for (i=0; i<MISSION_MAX; i++) |
400 |
+ player_missions[i] = calloc(1, sizeof(Mission)); |
401 |
+ |
402 |
+ buf = ndata_read( MISSION_DATA_PATH, &bufsize ); |
403 |
|
404 |
xmlNodePtr node; |
405 |
xmlDocPtr doc = xmlParseMemory( buf, bufsize ); |
406 |
@@ -933,6 +962,10 @@ |
407 |
free( mission_stack ); |
408 |
mission_stack = NULL; |
409 |
mission_nstack = 0; |
410 |
+ |
411 |
+ /* Free the player mission stack. */ |
412 |
+ for (i=0; i<MISSION_MAX; i++) |
413 |
+ free(player_missions[i]); |
414 |
} |
415 |
|
416 |
|
417 |
@@ -944,7 +977,7 @@ |
418 |
int i; |
419 |
|
420 |
for (i=0; i<MISSION_MAX; i++) |
421 |
- mission_cleanup( &player_missions[i] ); |
422 |
+ mission_cleanup( player_missions[i] ); |
423 |
} |
424 |
|
425 |
|
426 |
@@ -963,26 +996,26 @@ |
427 |
xmlw_startElem(writer,"missions"); |
428 |
|
429 |
for (i=0; i<MISSION_MAX; i++) { |
430 |
- if (player_missions[i].id != 0) { |
431 |
+ if (player_missions[i]->id != 0) { |
432 |
xmlw_startElem(writer,"mission"); |
433 |
|
434 |
/* data and id are attributes because they must be loaded first */ |
435 |
- xmlw_attr(writer,"data","%s",player_missions[i].data->name); |
436 |
- xmlw_attr(writer,"id","%u",player_missions[i].id); |
437 |
+ xmlw_attr(writer,"data","%s",player_missions[i]->data->name); |
438 |
+ xmlw_attr(writer,"id","%u",player_missions[i]->id); |
439 |
|
440 |
- xmlw_elem(writer,"title","%s",player_missions[i].title); |
441 |
- xmlw_elem(writer,"desc","%s",player_missions[i].desc); |
442 |
- xmlw_elem(writer,"reward","%s",player_missions[i].reward); |
443 |
+ xmlw_elem(writer,"title","%s",player_missions[i]->title); |
444 |
+ xmlw_elem(writer,"desc","%s",player_missions[i]->desc); |
445 |
+ xmlw_elem(writer,"reward","%s",player_missions[i]->reward); |
446 |
|
447 |
/* Markers. */ |
448 |
xmlw_startElem( writer, "markers" ); |
449 |
- if (player_missions[i].markers != NULL) { |
450 |
- n = array_size( player_missions[i].markers ); |
451 |
+ if (player_missions[i]->markers != NULL) { |
452 |
+ n = array_size( player_missions[i]->markers ); |
453 |
for (j=0; j<n; j++) { |
454 |
xmlw_startElem(writer,"marker"); |
455 |
- xmlw_attr(writer,"id","%d",player_missions[i].markers[j].id); |
456 |
- xmlw_attr(writer,"type","%d",player_missions[i].markers[j].type); |
457 |
- xmlw_str(writer,"%s", system_getIndex(player_missions[i].markers[j].sys)->name); |
458 |
+ xmlw_attr(writer,"id","%d",player_missions[i]->markers[j].id); |
459 |
+ xmlw_attr(writer,"type","%d",player_missions[i]->markers[j].type); |
460 |
+ xmlw_str(writer,"%s", system_getIndex(player_missions[i]->markers[j].sys)->name); |
461 |
xmlw_endElem(writer); /* "marker" */ |
462 |
} |
463 |
} |
464 |
@@ -990,19 +1023,19 @@ |
465 |
|
466 |
/* Cargo */ |
467 |
xmlw_startElem(writer,"cargos"); |
468 |
- for (j=0; j<player_missions[i].ncargo; j++) |
469 |
- xmlw_elem(writer,"cargo","%u", player_missions[i].cargo[j]); |
470 |
+ for (j=0; j<player_missions[i]->ncargo; j++) |
471 |
+ xmlw_elem(writer,"cargo","%u", player_missions[i]->cargo[j]); |
472 |
xmlw_endElem(writer); /* "cargos" */ |
473 |
|
474 |
/* OSD. */ |
475 |
- if (player_missions[i].osd > 0) { |
476 |
+ if (player_missions[i]->osd > 0) { |
477 |
xmlw_startElem(writer,"osd"); |
478 |
|
479 |
/* Save attributes. */ |
480 |
- items = osd_getItems(player_missions[i].osd, &nitems); |
481 |
- xmlw_attr(writer,"title","%s",osd_getTitle(player_missions[i].osd)); |
482 |
+ items = osd_getItems(player_missions[i]->osd, &nitems); |
483 |
+ xmlw_attr(writer,"title","%s",osd_getTitle(player_missions[i]->osd)); |
484 |
xmlw_attr(writer,"nitems","%d",nitems); |
485 |
- xmlw_attr(writer,"active","%d",osd_getActive(player_missions[i].osd)); |
486 |
+ xmlw_attr(writer,"active","%d",osd_getActive(player_missions[i]->osd)); |
487 |
|
488 |
/* Save messages. */ |
489 |
for (j=0; j<nitems; j++) |
490 |
@@ -1013,12 +1046,12 @@ |
491 |
|
492 |
/* Claims. */ |
493 |
xmlw_startElem(writer,"claims"); |
494 |
- claim_xmlSave( writer, player_missions[i].claims ); |
495 |
+ claim_xmlSave( writer, player_missions[i]->claims ); |
496 |
xmlw_endElem(writer); /* "claims" */ |
497 |
|
498 |
/* Write Lua magic */ |
499 |
xmlw_startElem(writer,"lua"); |
500 |
- nxml_persistLua( player_missions[i].L, writer ); |
501 |
+ nxml_persistLua( player_missions[i]->L, writer ); |
502 |
xmlw_endElem(writer); /* "lua" */ |
503 |
|
504 |
xmlw_endElem(writer); /* "mission" */ |
505 |
@@ -1078,7 +1111,7 @@ |
506 |
node = parent->xmlChildrenNode; |
507 |
do { |
508 |
if (xml_isNode(node,"mission")) { |
509 |
- misn = &player_missions[m]; |
510 |
+ misn = player_missions[m]; |
511 |
|
512 |
/* process the attributes to create the mission */ |
513 |
xmlr_attr(node,"data",buf); |
514 |
diff -ruN src/mission.h src/mission.h |
515 |
--- src/mission.h |
516 |
+++ src/mission.h |
517 |
@@ -129,7 +129,7 @@ |
518 |
* current player missions |
519 |
*/ |
520 |
#define MISSION_MAX 12 /**< No sense in allowing the player have infinite missions. */ |
521 |
-extern Mission player_missions[MISSION_MAX]; /**< Player's active missions. */ |
522 |
+extern Mission *player_missions[MISSION_MAX]; /**< Player's active missions. */ |
523 |
|
524 |
|
525 |
/* |
526 |
@@ -165,6 +165,7 @@ |
527 |
*/ |
528 |
int missions_load (void); |
529 |
void mission_cleanup( Mission* misn ); |
530 |
+void mission_shift( int pos ); |
531 |
void missions_free (void); |
532 |
void missions_cleanup (void); |
533 |
|
534 |
diff -ruN src/nlua_hook.c src/nlua_hook.c |
535 |
--- src/nlua_hook.c |
536 |
+++ src/nlua_hook.c |
537 |
@@ -246,7 +246,7 @@ |
538 |
if (running_mission != NULL) { |
539 |
/* make sure mission is a player mission */ |
540 |
for (i=0; i<MISSION_MAX; i++) |
541 |
- if (player_missions[i].id == running_mission->id) |
542 |
+ if (player_missions[i]->id == running_mission->id) |
543 |
break; |
544 |
if (i>=MISSION_MAX) { |
545 |
WARN("Mission not in stack trying to hook, forgot to run misn.accept()?"); |
546 |
diff -ruN src/nlua_misn.c src/nlua_misn.c |
547 |
--- src/nlua_misn.c |
548 |
+++ src/nlua_misn.c |
549 |
@@ -283,13 +283,13 @@ |
550 |
if (misn_delete) { |
551 |
ret = 2; |
552 |
mission_cleanup( cur_mission ); |
553 |
- for (i=0; i<MISSION_MAX; i++) |
554 |
- if (cur_mission == &player_missions[i]) { |
555 |
- memmove( &player_missions[i], &player_missions[i+1], |
556 |
- sizeof(Mission) * (MISSION_MAX-i-1) ); |
557 |
- memset( &player_missions[MISSION_MAX-1], 0, sizeof(Mission) ); |
558 |
- break; |
559 |
- } |
560 |
+ for (i=0; i<MISSION_MAX; i++) { |
561 |
+ if (cur_mission != player_missions[i]) |
562 |
+ continue; |
563 |
+ |
564 |
+ mission_shift(i); |
565 |
+ break; |
566 |
+ } |
567 |
} |
568 |
|
569 |
return ret; |
570 |
@@ -609,7 +609,7 @@ |
571 |
|
572 |
/* find last mission */ |
573 |
for (i=0; i<MISSION_MAX; i++) |
574 |
- if (player_missions[i].data == NULL) |
575 |
+ if (player_missions[i]->data == NULL) |
576 |
break; |
577 |
|
578 |
cur_mission = misn_getFromLua(L); |
579 |
@@ -620,7 +620,7 @@ |
580 |
else if (i>=MISSION_MAX) |
581 |
ret = 1; |
582 |
else { /* copy it over */ |
583 |
- memcpy( &player_missions[i], cur_mission, sizeof(Mission) ); |
584 |
+ memcpy( player_missions[i], cur_mission, sizeof(Mission) ); |
585 |
memset( cur_mission, 0, sizeof(Mission) ); |
586 |
- cur_mission = &player_missions[i]; |
587 |
+ cur_mission = player_missions[i]; |
588 |
cur_mission->accepted = 1; /* Mark as accepted. */ |
589 |
|
590 |
/* Need to change pointer. */ |
591 |
diff -ruN src/npc.c src/npc.c |
592 |
--- src/npc.c |
593 |
+++ src/npc.c |
594 |
@@ -559,7 +559,7 @@ |
595 |
|
596 |
/* Make sure player can accept the mission. */ |
597 |
for (i=0; i<MISSION_MAX; i++) |
598 |
- if (player_missions[i].data == NULL) |
599 |
+ if (player_missions[i]->data == NULL) |
600 |
break; |
601 |
if (i >= MISSION_MAX) { |
602 |
dialogue_alert("You have too many active missions."); |
603 |
diff -ruN src/player.c src/player.c |
604 |
--- src/player.c |
605 |
+++ src/player.c |
606 |
@@ -665,7 +665,7 @@ |
607 |
*/ |
608 |
void player_rmShip( char* shipname ) |
609 |
{ |
610 |
- int i; |
611 |
+ int i, w; |
612 |
|
613 |
for (i=0; i<player_nstack; i++) { |
614 |
/* Not the ship we are looking for. */ |
615 |
@@ -684,6 +684,12 @@ |
616 |
player_stack = realloc( player_stack, |
617 |
sizeof(PlayerShip_t) * (player_nstack) ); |
618 |
} |
619 |
+ |
620 |
+ /* Update ship list if landed. */ |
621 |
+ if (landed) { |
622 |
+ w = land_getWid( LAND_WINDOW_EQUIPMENT ); |
623 |
+ equipment_regenLists( w, 0, 1 ); |
624 |
+ } |
625 |
} |
626 |
|
627 |
|
628 |
@@ -3011,11 +3017,11 @@ |
629 |
found = 0; |
630 |
for (j=0; j<MISSION_MAX; j++) { |
631 |
/* Only check active missions. */ |
632 |
- if (player_missions[j].id > 0) { |
633 |
+ if (player_missions[j]->id > 0) { |
634 |
/* Now check if it's in the cargo list. */ |
635 |
- for (k=0; k<player_missions[j].ncargo; k++) { |
636 |
+ for (k=0; k<player_missions[j]->ncargo; k++) { |
637 |
/* See if it matches a cargo. */ |
638 |
- if (player_missions[j].cargo[k] == ship->commodities[i].id) { |
639 |
+ if (player_missions[j]->cargo[k] == ship->commodities[i].id) { |
640 |
found = 1; |
641 |
break; |
642 |
} |