naev 0.11.5
dev_system.c
Go to the documentation of this file.
1/*
2 * See Licensing and Copyright notice in naev.h
3 */
10#include <stdlib.h> /* qsort */
11
12#include "naev.h"
15#include "dev_system.h"
16
17#include "array.h"
18#include "conf.h"
19#include "dev_uniedit.h"
20#include "nstring.h"
21#include "nxml.h"
22#include "physics.h"
23#include "space.h"
24#include "nebula.h"
25
26/*
27 * Prototypes.
28 */
29static int dsys_compSpob( const void *spob1, const void *spob2 );
30static int dsys_compJump( const void *jmp1, const void *jmp2 );
31
39static int dsys_compSpob( const void *spob1, const void *spob2 )
40{
41 const Spob *p1, *p2;
42 p1 = * (const Spob**) spob1;
43 p2 = * (const Spob**) spob2;
44 return strcmp( p1->name, p2->name );
45}
46
54static int dsys_compVirtualSpob( const void *spob1, const void *spob2 )
55{
56 const VirtualSpob *va1, *va2;
57 va1 = *(const VirtualSpob**) spob1;
58 va2 = *(const VirtualSpob**) spob2;
59 return strcmp( va1->name, va2->name );
60}
61
69static int dsys_compJump( const void *jmp1, const void *jmp2 )
70{
71 const JumpPoint *jp1, *jp2;
72 jp1 = * (const JumpPoint**) jmp1;
73 jp2 = * (const JumpPoint**) jmp2;
74 return strcmp( jp1->target->name, jp2->target->name );
75}
76
83int dsys_saveSystem( StarSystem *sys )
84{
85 xmlDocPtr doc;
86 xmlTextWriterPtr writer;
87 const Spob **sorted_spobs;
88 const VirtualSpob **sorted_virtualspobs;
89 const JumpPoint **sorted_jumps;
90 char *file, *cleanName;
91
92 /* Reconstruct jumps so jump pos are updated. */
94
95 /* Create the writer. */
96 writer = xmlNewTextWriterDoc(&doc, 0);
97 if (writer == NULL) {
98 WARN(_("testXmlwriterDoc: Error creating the xml writer"));
99 return -1;
100 }
101
102 /* Set the writer parameters. */
103 xmlw_setParams( writer );
104
105 /* Start writer. */
106 xmlw_start(writer);
107 xmlw_startElem( writer, "ssys" );
108
109 /* Attributes. */
110 xmlw_attr( writer, "name", "%s", sys->name );
111
112 /* General. */
113 xmlw_startElem( writer, "general" );
114 if (sys->background != NULL)
115 xmlw_elem( writer, "background", "%s", sys->background );
116 if (sys->map_shader != NULL)
117 xmlw_elem( writer, "map_shader", "%s", sys->map_shader );
118 if (sys->features != NULL)
119 xmlw_elem( writer, "features", "%s", sys->features );
120 xmlw_elem( writer, "radius", "%f", sys->radius );
121 xmlw_elem( writer, "spacedust", "%d", sys->spacedust );
122 xmlw_elem( writer, "interference", "%f", sys->interference );
123 if (sys->nebu_density > 0.) {
124 xmlw_startElem( writer, "nebula" );
125 xmlw_attr( writer, "volatility", "%f", sys->nebu_volatility );
126 if (fabs(sys->nebu_hue*360.0 - NEBULA_DEFAULT_HUE) > 1e-5)
127 xmlw_attr( writer, "hue", "%f", sys->nebu_hue*360.0 );
128 xmlw_str( writer, "%f", sys->nebu_density );
129 xmlw_endElem( writer ); /* "nebula" */
130 }
131 if (sys_isFlag( sys, SYSTEM_NOLANES ))
132 xmlw_elemEmpty( writer, "nolanes" );
133 xmlw_endElem( writer ); /* "general" */
134
135 /* Position. */
136 xmlw_startElem( writer, "pos" );
137 xmlw_attr( writer, "x", "%f", sys->pos.x );
138 xmlw_attr( writer, "y", "%f", sys->pos.y );
139 xmlw_endElem( writer ); /* "pos" */
140
141 /* Sort spobs. */
142 sorted_spobs = malloc( sizeof(Spob*) * array_size(sys->spobs) );
143 memcpy( sorted_spobs, sys->spobs, sizeof(Spob*) * array_size(sys->spobs) );
144 qsort( sorted_spobs, array_size(sys->spobs), sizeof(Spob*), dsys_compSpob );
145
146 /* Sort virtual spobs. */
147 sorted_virtualspobs = malloc( sizeof(VirtualSpob*) * array_size(sys->spobs_virtual) );
148 memcpy( sorted_virtualspobs, sys->spobs_virtual, sizeof(VirtualSpob*) * array_size(sys->spobs_virtual) );
149 qsort( sorted_virtualspobs, array_size(sys->spobs_virtual), sizeof(VirtualSpob*), dsys_compVirtualSpob );
150
151 /* Write spobs and clean up. */
152 xmlw_startElem( writer, "spobs" );
153 for (int i=0; i<array_size(sys->spobs); i++)
154 xmlw_elem( writer, "spob", "%s", sorted_spobs[i]->name );
155 for (int i=0; i<array_size(sys->spobs_virtual); i++)
156 xmlw_elem( writer, "spob_virtual", "%s", sorted_virtualspobs[i]->name );
157 xmlw_endElem( writer ); /* "spobs" */
158 free(sorted_spobs);
159 free(sorted_virtualspobs);
160
161 /* Jumps. */
162 sorted_jumps = malloc( sizeof(JumpPoint*) * array_size(sys->jumps) );
163 for (int i=0; i<array_size(sys->jumps); i++)
164 sorted_jumps[i] = &sys->jumps[i];
165 qsort( sorted_jumps, array_size(sys->jumps), sizeof(JumpPoint*), dsys_compJump );
166 xmlw_startElem( writer, "jumps" );
167 for (int i=0; i<array_size(sys->jumps); i++) {
168 const JumpPoint *jp = sorted_jumps[i];
169 xmlw_startElem( writer, "jump" );
170 xmlw_attr( writer, "target", "%s", jp->target->name );
171 /* Position. */
172 if (!jp_isFlag( jp, JP_AUTOPOS )) {
173 xmlw_startElem( writer, "pos" );
174 xmlw_attr( writer, "x", "%f", jp->pos.x );
175 xmlw_attr( writer, "y", "%f", jp->pos.y );
176 xmlw_endElem( writer ); /* "pos" */
177 }
178 else
179 xmlw_elemEmpty( writer, "autopos" );
180 /* Radius and misc properties. */
181 if (jp->radius != 200.)
182 xmlw_elem( writer, "radius", "%f", jp->radius );
183 /* More flags. */
184 if (jp_isFlag( jp, JP_HIDDEN ))
185 xmlw_elemEmpty( writer, "hidden" );
186 if (jp_isFlag( jp, JP_EXITONLY ))
187 xmlw_elemEmpty( writer, "exitonly" );
188 if (jp_isFlag( jp, JP_NOLANES ))
189 xmlw_elemEmpty( writer, "nolanes" );
190 xmlw_elem( writer, "hide", "%f", jp->hide );
191 xmlw_endElem( writer ); /* "jump" */
192 }
193 xmlw_endElem( writer ); /* "jumps" */
194 free(sorted_jumps);
195
196 /* Asteroids. */
197 if (array_size(sys->asteroids) > 0 || array_size(sys->astexclude) > 0) {
198 xmlw_startElem( writer, "asteroids" );
199 for (int i=0; i<array_size(sys->asteroids); i++) {
200 const AsteroidAnchor *ast = &sys->asteroids[i];
201 xmlw_startElem( writer, "asteroid" );
202
203 /* Type Groups */
204 for (int j=0; j<array_size(ast->groups); j++)
205 xmlw_elem( writer, "group", "%s", ast->groups[j]->name );
206
207 /* Radius */
208 xmlw_elem( writer, "radius", "%f", ast->radius );
209
210 /* Position */
211 xmlw_startElem( writer, "pos" );
212 xmlw_attr( writer, "x", "%f", ast->pos.x );
213 xmlw_attr( writer, "y", "%f", ast->pos.y );
214 xmlw_endElem( writer ); /* "pos" */
215
216 /* Misc. properties. */
217 if (ast->density != ASTEROID_DEFAULT_DENSITY)
218 xmlw_elem( writer, "density", "%f", ast->density );
219 if (ast->maxspeed != ASTEROID_DEFAULT_MAXSPEED)
220 xmlw_elem( writer, "maxspeed", "%f", ast->maxspeed );
221 if (ast->accel != ASTEROID_DEFAULT_ACCEL)
222 xmlw_elem( writer, "accel", "%f", ast->accel );
223 xmlw_endElem( writer ); /* "asteroid" */
224 }
225 for (int i=0; i<array_size(sys->astexclude); i++) {
226 const AsteroidExclusion *aexcl = &sys->astexclude[i];
227 xmlw_startElem( writer, "exclusion" );
228
229 /* Radius */
230 xmlw_elem( writer, "radius", "%f", aexcl->radius );
231
232 /* Position */
233 xmlw_startElem( writer, "pos" );
234 xmlw_attr( writer, "x", "%f", aexcl->pos.x );
235 xmlw_attr( writer, "y", "%f", aexcl->pos.y );
236 xmlw_endElem( writer ); /* "pos" */
237 xmlw_endElem( writer ); /* "exclusion" */
238 }
239 xmlw_endElem( writer ); /* "asteroids" */
240 }
241
242 if (sys->stats != NULL) {
243 xmlw_startElem( writer, "stats" );
244 ss_listToXML( writer, sys->stats );
245 xmlw_endElem( writer ); /* "stats" */
246 }
247
248 if (array_size(sys->tags)>0) {
249 xmlw_startElem( writer, "tags" );
250 for (int i=0; i<array_size(sys->tags); i++)
251 xmlw_elem( writer, "tag", "%s", sys->tags[i] );
252 xmlw_endElem( writer ); /* "tags" */
253 }
254
255 xmlw_endElem( writer );
256 xmlw_done(writer);
257
258 /* No need for writer anymore. */
259 xmlFreeTextWriter(writer);
260
261 /* Write data. */
262 cleanName = uniedit_nameFilter( sys->name );
263 SDL_asprintf( &file, "%s/%s.xml", conf.dev_save_sys, cleanName );
264 if (xmlSaveFileEnc( file, doc, "UTF-8" ) < 0)
265 WARN("Failed writing '%s'!", file);
266
267 /* Clean up. */
268 xmlFreeDoc(doc);
269 free(cleanName);
270 free(file);
271
272 return 0;
273}
274
280int dsys_saveAll (void)
281{
282 StarSystem *sys = system_getAll();
283
284 /* Write systems. */
285 for (int i=0; i<array_size(sys); i++)
286 dsys_saveSystem( &sys[i] );
287
288 return 0;
289}
Provides macros to work with dynamic arrays.
static ALWAYS_INLINE int array_size(const void *array)
Returns number of elements in the array.
Definition array.h:168
static int dsys_compVirtualSpob(const void *spob1, const void *spob2)
Compare function for spob qsort.
Definition dev_system.c:54
int dsys_saveSystem(StarSystem *sys)
Saves a star system.
Definition dev_system.c:83
int dsys_saveAll(void)
Saves all the star systems.
Definition dev_system.c:280
static int dsys_compSpob(const void *spob1, const void *spob2)
Compare function for spob qsort.
Definition dev_system.c:39
static int dsys_compJump(const void *jmp1, const void *jmp2)
Function for qsorting jumppoints.
Definition dev_system.c:69
Header file with generic functions and naev-specifics.
void xmlw_setParams(xmlTextWriterPtr writer)
Sets up the standard xml write parameters.
Definition nxml.c:64
int ss_listToXML(xmlTextWriterPtr writer, const ShipStatList *ll)
Creatse a shipstat list element from an xml node.
Definition shipstats.c:343
StarSystem * system_getAll(void)
Gets an array (array.h) of all star systems.
Definition space.c:879
void system_reconstructJumps(StarSystem *sys)
Reconstructs the jumps for a single system.
Definition space.c:2707
Represents an asteroid field anchor.
Definition asteroid.h:100
double radius
Definition asteroid.h:107
double density
Definition asteroid.h:104
double maxspeed
Definition asteroid.h:112
Asteroid * asteroids
Definition asteroid.h:105
AsteroidTypeGroup ** groups
Definition asteroid.h:109
Represents an asteroid exclusion zone.
Definition asteroid.h:124
char * dev_save_sys
Definition conf.h:170
Represents a Space Object (SPOB), including and not limited to planets, stations, wormholes,...
Definition space.h:89
char * name
Definition space.h:91
Basically modifies system parameters without creating any real objects.
Definition space.h:78
char * name
Definition space.h:79
double y
Definition vec2.h:34
double x
Definition vec2.h:33