85 xmlTextWriterPtr writer;
86 const Spob **sorted_spobs;
88 const JumpPoint **sorted_jumps;
92 if ( conf.dev_data_dir == NULL ) {
93 WARN( _(
"%s is not set!" ),
"conf.dev_data_dir" );
101 writer = xmlNewTextWriterDoc( &doc, 0 );
102 if ( writer == NULL ) {
103 WARN( _(
"testXmlwriterDoc: Error creating the xml writer" ) );
111 xmlw_start( writer );
112 xmlw_startElem( writer,
"ssys" );
115 xmlw_attr( writer,
"name",
"%s", sys->name );
118 xmlw_startElem( writer,
"general" );
119 if ( sys->background != NULL )
120 xmlw_elem( writer,
"background",
"%s", sys->background );
121 if ( sys->map_shader != NULL )
122 xmlw_elem( writer,
"map_shader",
"%s", sys->map_shader );
123 if ( sys->features != NULL )
124 xmlw_elem( writer,
"features",
"%s", sys->features );
125 xmlw_elem( writer,
"radius",
"%f", sys->radius );
126 xmlw_elem( writer,
"spacedust",
"%d", sys->spacedust );
127 xmlw_elem( writer,
"interference",
"%f", sys->interference );
128 if ( ( sys->nebu_density > 0. ) ||
129 ( sys_isFlag( sys, SYSTEM_NEBULATRAIL ) ) ) {
130 xmlw_startElem( writer,
"nebula" );
131 if ( sys->nebu_volatility > 0. )
132 xmlw_attr( writer,
"volatility",
"%f", sys->nebu_volatility );
133 if ( fabs( sys->nebu_hue * 360.0 - NEBULA_DEFAULT_HUE ) > DOUBLE_TOL )
134 xmlw_attr( writer,
"hue",
"%f", sys->nebu_hue * 360.0 );
135 if ( ( sys->nebu_density <= 0. ) &&
136 sys_isFlag( sys, SYSTEM_NEBULATRAIL ) )
137 xmlw_attr( writer,
"trails",
"%d", 1 );
138 if ( sys_isFlag( sys, SYSTEM_HIDENEBULADAMAGE ) )
139 xmlw_attr( writer,
"hidenebuladamage",
"%d", 1 );
140 xmlw_str( writer,
"%f", sys->nebu_density );
141 xmlw_endElem( writer );
143 if ( sys_isFlag( sys, SYSTEM_NOLANES ) )
144 xmlw_elemEmpty( writer,
"nolanes" );
145 xmlw_endElem( writer );
148 xmlw_startElem( writer,
"pos" );
149 xmlw_attr( writer,
"x",
"%f", sys->pos.x );
150 xmlw_attr( writer,
"y",
"%f", sys->pos.y );
151 xmlw_endElem( writer );
154 sorted_spobs = malloc(
sizeof(
Spob * ) *
array_size( sys->spobs ) );
155 memcpy( sorted_spobs, sys->spobs,
161 sorted_virtualspobs =
163 memcpy( sorted_virtualspobs, sys->spobs_virtual,
165 qsort( sorted_virtualspobs,
array_size( sys->spobs_virtual ),
169 xmlw_startElem( writer,
"spobs" );
170 for (
int i = 0; i <
array_size( sys->spobs ); i++ )
171 xmlw_elem( writer,
"spob",
"%s", sorted_spobs[i]->name );
172 for (
int i = 0; i <
array_size( sys->spobs_virtual ); i++ )
173 xmlw_elem( writer,
"spob_virtual",
"%s", sorted_virtualspobs[i]->name );
174 xmlw_endElem( writer );
175 free( sorted_spobs );
176 free( sorted_virtualspobs );
179 sorted_jumps = malloc(
sizeof( JumpPoint * ) *
array_size( sys->jumps ) );
180 for (
int i = 0; i <
array_size( sys->jumps ); i++ )
181 sorted_jumps[i] = &sys->jumps[i];
182 qsort( sorted_jumps,
array_size( sys->jumps ),
sizeof( JumpPoint * ),
184 xmlw_startElem( writer,
"jumps" );
185 for (
int i = 0; i <
array_size( sys->jumps ); i++ ) {
186 const JumpPoint *jp = sorted_jumps[i];
187 xmlw_startElem( writer,
"jump" );
188 xmlw_attr( writer,
"target",
"%s", jp->target->name );
190 if ( !jp_isFlag( jp, JP_AUTOPOS ) ) {
191 xmlw_startElem( writer,
"pos" );
192 xmlw_attr( writer,
"x",
"%f", jp->pos.x );
193 xmlw_attr( writer,
"y",
"%f", jp->pos.y );
194 xmlw_endElem( writer );
196 xmlw_elemEmpty( writer,
"autopos" );
198 if ( jp->radius != 200. )
199 xmlw_elem( writer,
"radius",
"%f", jp->radius );
201 if ( jp_isFlag( jp, JP_HIDDEN ) )
202 xmlw_elemEmpty( writer,
"hidden" );
203 if ( jp_isFlag( jp, JP_EXITONLY ) )
204 xmlw_elemEmpty( writer,
"exitonly" );
205 if ( jp_isFlag( jp, JP_NOLANES ) )
206 xmlw_elemEmpty( writer,
"nolanes" );
207 xmlw_elem( writer,
"hide",
"%f", jp->hide );
208 xmlw_endElem( writer );
210 xmlw_endElem( writer );
211 free( sorted_jumps );
216 xmlw_startElem( writer,
"asteroids" );
217 for (
int i = 0; i <
array_size( sys->asteroids ); i++ ) {
219 xmlw_startElem( writer,
"asteroid" );
220 if ( ast->
label != NULL )
221 xmlw_attr_raw( writer,
"label", ast->
label );
225 xmlw_elem( writer,
"group",
"%s", ast->
groups[j]->
name );
228 xmlw_elem( writer,
"radius",
"%f", ast->
radius );
231 xmlw_startElem( writer,
"pos" );
232 xmlw_attr( writer,
"x",
"%f", ast->
pos.
x );
233 xmlw_attr( writer,
"y",
"%f", ast->
pos.
y );
234 xmlw_endElem( writer );
237 if ( ast->
density != ASTEROID_DEFAULT_DENSITY )
238 xmlw_elem( writer,
"density",
"%f", ast->
density );
239 if ( ast->
maxspeed != ASTEROID_DEFAULT_MAXSPEED )
240 xmlw_elem( writer,
"maxspeed",
"%f", ast->
maxspeed );
241 if ( ast->
accel != ASTEROID_DEFAULT_ACCEL )
242 xmlw_elem( writer,
"accel",
"%f", ast->
accel );
243 xmlw_endElem( writer );
245 for (
int i = 0; i <
array_size( sys->astexclude ); i++ ) {
247 xmlw_startElem( writer,
"exclusion" );
248 if ( aexcl->
label != NULL )
249 xmlw_attr_raw( writer,
"label", aexcl->
label );
252 xmlw_elem( writer,
"radius",
"%f", aexcl->
radius );
255 xmlw_startElem( writer,
"pos" );
256 xmlw_attr( writer,
"x",
"%f", aexcl->
pos.
x );
257 xmlw_attr( writer,
"y",
"%f", aexcl->
pos.
y );
258 xmlw_endElem( writer );
259 xmlw_endElem( writer );
261 xmlw_endElem( writer );
264 if ( sys->stats != NULL ) {
265 xmlw_startElem( writer,
"stats" );
267 xmlw_endElem( writer );
271 xmlw_startElem( writer,
"tags" );
272 for (
int i = 0; i <
array_size( sys->tags ); i++ )
273 xmlw_elem( writer,
"tag",
"%s", sys->tags[i] );
274 xmlw_endElem( writer );
277 xmlw_endElem( writer );
281 xmlFreeTextWriter( writer );
285 snprintf( path,
sizeof( path ),
"%s", sys->filename );
286 const char *filename = basename( path );
287 SDL_asprintf( &file,
"%s/ssys/%s", conf.dev_data_dir, filename );
288 if ( xmlSaveFileEnc( file, doc,
"UTF-8" ) < 0 ) {
289 WARN(
"Failed writing '%s'!", file );