View | Details | Raw Unified | Return to bug 198684 | Differences between
and this patch

Collapse All | Expand All

(-)naev/Makefile (-26 / +33 lines)
Lines 2-57 Link Here
2
# $FreeBSD: head/games/naev/Makefile 375598 2014-12-25 20:54:41Z bapt $
2
# $FreeBSD: head/games/naev/Makefile 375598 2014-12-25 20:54:41Z bapt $
3
3
4
PORTNAME=	naev
4
PORTNAME=	naev
5
PORTVERSION=	0.5.3
5
PORTVERSION=	0.6.0
6
PORTREVISION=	4
7
CATEGORIES=	games
6
CATEGORIES=	games
8
MASTER_SITES=	SF/${PORTNAME}/${PORTNAME}-${PORTVERSION} \
7
MASTER_SITES=	SF/${PORTNAME}/${PORTNAME}-${PORTVERSION}/
9
		${MASTER_SITE_GOOGLE_CODE}
10
DIST_SUBDIR=	${PORTNAME}
8
DIST_SUBDIR=	${PORTNAME}
11
9
12
MAINTAINER=	acm@FreeBSD.org
10
MAINTAINER=	acm@FreeBSD.org
13
COMMENT=	2D action/RPG space game
11
COMMENT=	2D action/RPG space game
14
12
13
LICENSE=	GPLv3
14
LICENSE_FILE=	${WRKSRC}/LICENSE
15
15
LIB_DEPENDS=	libpng.so:${PORTSDIR}/graphics/png \
16
LIB_DEPENDS=	libpng.so:${PORTSDIR}/graphics/png \
16
		libfreetype.so:${PORTSDIR}/print/freetype2 \
17
		libfreetype.so:${PORTSDIR}/print/freetype2 \
17
		libvorbisfile.so:${PORTSDIR}/audio/libvorbis
18
		libvorbisfile.so:${PORTSDIR}/audio/libvorbis \
18
RUN_DEPENDS=	${LOCALBASE}/share/${PORTNAME}/ndata-${PORTVERSION}:${PORTSDIR}/games/naev-data
19
		libzip.so:${PORTSDIR}/archivers/libzip \
20
		libcsparse.so:${PORTSDIR}/math/suitesparse
21
RUN_DEPENDS=	${DATADIR}/ndata-${PORTVERSION}.zip:${PORTSDIR}/games/naev-data
19
22
20
USES=		gmake pkgconfig tar:bzip2
23
USES=		gmake pkgconfig tar:bzip2
21
USE_AUTOTOOLS=	automake:env aclocal:env autoconf:env
24
USE_AUTOTOOLS=	automake:env aclocal:env autoconf:env
22
GNU_CONFIGURE=	yes
25
GNU_CONFIGURE=	yes
23
USE_GL=		glu
26
USE_GL=		glu
24
USE_GNOME=	libxml2
27
USE_GNOME=	libxml2
25
USE_SDL=	sdl image
26
28
27
CONFIGURE_ARGS=	--with-ndata-path=${DATADIR}/ndata-${PORTVERSION}
29
CONFIGURE_ARGS=	--with-ndata-path="${DATADIR}/ndata-${PORTVERSION}.zip" \
30
		--enable-debug=no
28
CPPFLAGS+=	-I${LOCALBASE}/include
31
CPPFLAGS+=	-I${LOCALBASE}/include
29
LIBS+=		-L${LOCALBASE}/lib -lm
32
LIBS+=		-L${LOCALBASE}/lib -lm
30
33
31
PLIST_FILES=	bin/${PORTNAME} man/man6/naev.6.gz
34
PORTDATA=	*
32
SUB_FILES=	pkg-message
35
PORTDOCS=	*
36
37
PLIST_FILES=	bin/${PORTNAME} man/man6/naev.6.gz \
38
		share/applications/${PORTNAME}.desktop \
39
		share/appdata/${PORTNAME}.appdata.xml \
40
		share/pixmaps/${PORTNAME}.png
41
42
OPTIONS_DEFINE=	DOCS OPENAL SDL2 SDL_MIXER
43
OPTIONS_DEFAULT=	OPENAL SDL2 SDL_MIXER
33
44
34
OPTIONS_DEFINE=	OPENAL SDL_MIXER
45
OPENAL_USES=	openal
46
OPENAL_CONFIGURE_WITH=	openal
35
SDL_MIXER_DESC=	SDL_mixer sound backend
47
SDL_MIXER_DESC=	SDL_mixer sound backend
48
SDL_MIXER_CONFIGURE_WITH=	sdlmixer
49
SDL2_DESC=	Use SDL2 instead of SDL
50
SDL2_CONFIGURE_WITH=	sdl2
51
SDL2_USE=	SDL=sdl2
52
SDL2_USE_OFF=	SDL=sdl
36
53
37
.include <bsd.port.options.mk>
54
.include <bsd.port.options.mk>
38
55
39
.if ${PORT_OPTIONS:MOPENAL}
40
USES+=			openal
41
CONFIGURE_ARGS+=	--with-openal=yes
42
.else
43
CONFIGURE_ARGS+=	--with-openal=no
44
.endif
45
46
.if ${PORT_OPTIONS:MSDL_MIXER}
56
.if ${PORT_OPTIONS:MSDL_MIXER}
47
USE_SDL+=		mixer
57
.	if ${PORT_OPTIONS:MSDL2}
48
CONFIGURE_ARGS+=	--with-sdlmixer=yes
58
USE_SDL+=	mixer2
49
.else
59
.	else
50
CONFIGURE_ARGS+=	--with-sdlmixer=no
60
USE_SDL+=	mixer
61
.	endif
51
.endif
62
.endif
52
63
53
do-install:
54
	${INSTALL_PROGRAM} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
55
	${INSTALL_MAN} ${WRKSRC}/${PORTNAME}.6 ${STAGEDIR}${MAN6PREFIX}/man/man6
56
57
.include <bsd.port.mk>
64
.include <bsd.port.mk>
(-)naev/distinfo (-2 / +2 lines)
Lines 1-2 Link Here
1
SHA256 (naev/naev-0.5.3.tar.bz2) = b2d026abb099bcb884e13a26b1bce4273f094830690340468f752a3b9b64c719
1
SHA256 (naev/naev-0.6.0.tar.bz2) = 0f0b498c7642e36dfaa15f284e13b9aa2d20e4aa01ed812fb7854583e7161cac
2
SIZE (naev/naev-0.5.3.tar.bz2) = 997522
2
SIZE (naev/naev-0.6.0.tar.bz2) = 1054649
(-)naev/files/patch-src.diff (+642 lines)
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
                   }
(-)naev/files/patch-src_board.c (+39 lines)
Line 0 Link Here
1
# Origin: https://github.com/naev/naev/commit/8b4ceb3c5db7171b65f918f278e2d3a0685bf0f2
2
# Subject: Correctly pass boarding ship to pilot board hook
3
# Origin: https://github.com/naev/naev/commit/0b545ee49f33632e892e242807543d6b386a02af
4
# Subject: Run pilot board hook for all pilot, not just player
5
6
diff --git src/board.c src/board.c
7
--- src/board.c
8
+++ src/board.c
9
@@ -143,7 +143,8 @@ void player_board (void)
10
    hparam[0].u.lp.pilot = p->id;
11
    hparam[1].type       = HOOK_PARAM_SENTINEL;
12
    hooks_runParam( "board", hparam );
13
-   pilot_runHook(p, PILOT_HOOK_BOARD);
14
+   hparam[0].u.lp.pilot = PLAYER_ID;
15
+   pilot_runHookParam(p, PILOT_HOOK_BOARD, hparam, 1);
16
 
17
    if (board_stopboard) {
18
       board_boarded = 0;
19
@@ -526,6 +527,7 @@ static void board_update( unsigned int wdw )
20
 int pilot_board( Pilot *p )
21
 {
22
    Pilot *target;
23
+   HookParam hparam[2];
24
 
25
    /* Make sure target is sane. */
26
    target = pilot_get(p->target);
27
@@ -554,6 +556,12 @@ int pilot_board( Pilot *p )
28
    /* Set time it takes to board. */
29
    p->ptimer = 3.;
30
 
31
+   /* Run pilot board hook. */
32
+   hparam[0].type       = HOOK_PARAM_PILOT;
33
+   hparam[0].u.lp.pilot = p->id;
34
+   hparam[1].type       = HOOK_PARAM_SENTINEL;
35
+   pilot_runHookParam(target, PILOT_HOOK_BOARD, hparam, 1);
36
+
37
    return 1;
38
 }
39
 
(-)naev/files/patch-src_pilot_hook.c (+45 lines)
Line 0 Link Here
1
# Origin: https://github.com/naev/naev/commit/6f4005f921650c1a8930721bbd1c0eab163673f8
2
# Subject: * Hook param off by one.
3
# Origin: https://github.com/naev/naev/commit/3ba9cafb369f94115c897717b6f38415348f4c8f
4
# Subject: * Too many bugs in the code, should fix bugs with pilot hooks when using >1 parameter.
5
6
diff --git src/pilot_hook.c src/pilot_hook.c
7
--- src/pilot_hook.c
8
+++ src/pilot_hook.c
9
@@ -39,26 +39,26 @@ static int pilot_hookCleanup = 0; /**< Are hooks being removed from a pilot? */
10
 int pilot_runHookParam( Pilot* p, int hook_type, HookParam* param, int nparam )
11
 {
12
    int n, i, run, ret;
13
-   HookParam hparam[3], *hdynparam;
14
+   HookParam hstaparam[5], *hdynparam, *hparam;
15
 
16
    /* Set up hook parameters. */
17
-   if (nparam <= 1) {
18
-      hparam[0].type       = HOOK_PARAM_PILOT;
19
-      hparam[0].u.lp.pilot = p->id;
20
+   if (nparam <= 3) {
21
+      hstaparam[0].type       = HOOK_PARAM_PILOT;
22
+      hstaparam[0].u.lp.pilot = p->id;
23
       n  = 1;
24
-      if (nparam == 1) {
25
-         memcpy( &hparam[n], param, sizeof(HookParam) );
26
-         n++;
27
-      }
28
-      hparam[n].type    = HOOK_PARAM_SENTINEL;
29
+      memcpy( &hstaparam[n], param, sizeof(HookParam)*nparam );
30
+      n += nparam;
31
+      hstaparam[n].type = HOOK_PARAM_SENTINEL;
32
       hdynparam         = NULL;
33
+      hparam            = hstaparam;
34
    }
35
    else {
36
       hdynparam   = malloc( sizeof(HookParam) * (nparam+2) );
37
       hdynparam[0].type       = HOOK_PARAM_PILOT;
38
       hdynparam[0].u.lp.pilot = p->id;
39
       memcpy( &hdynparam[1], param, sizeof(HookParam)*nparam );
40
-      hdynparam[nparam].type  = HOOK_PARAM_SENTINEL;
41
+      hdynparam[nparam+1].type  = HOOK_PARAM_SENTINEL;
42
+      hparam                  = hdynparam;
43
    }
44
 
45
    /* Run pilot specific hooks. */
(-)naev/files/patch-src_space.c (+14 lines)
Line 0 Link Here
1
# Origin: https://github.com/naev/naev/commit/173bad4a7bab85903575798a51259ff6f3dd42c8
2
# Subject: Memory leak fix
3
4
diff --git src/space.c src/space.c
5
--- src/space.c
6
+++ src/space.c
7
@@ -2978,6 +2978,7 @@ void space_exit (void)
8
       free(pnt->land_func);
9
       free(pnt->land_msg);
10
       free(pnt->bribe_msg);
11
+      free(pnt->bribe_ack_msg);
12
 
13
       /* tech */
14
       if (pnt->tech != NULL)
(-)naev/files/pkg-message.in (-9 lines)
Lines 1-9 Link Here
1
###############################################################################
2
3
The NAEV space game was installed
4
5
1) You can find the conf.lua config file into your ~/.config/naev/ directory
6
7
2) Enjoy it :)
8
9
###############################################################################
(-)naev/pkg-descr (-1 / +1 lines)
Lines 1-4 Link Here
1
NAEV is a 2D space game that combines elements from the action, RPG, and
1
NAEV is a 2D space game that combines elements from the action, RPG, and
2
simulation genres.
2
simulation genres.
3
3
4
WWW: http://code.google.com/p/naev/
4
WWW: http://sourceforge.net/projects/naev/

Return to bug 198684