86 xmlTextWriterPtr writer;
87 const Spob **sorted_spobs;
89 const JumpPoint **sorted_jumps;
90 char *file, *cleanName;
96 writer = xmlNewTextWriterDoc(&doc, 0);
98 WARN(_(
"testXmlwriterDoc: Error creating the xml writer"));
107 xmlw_startElem( writer,
"ssys" );
110 xmlw_attr( writer,
"name",
"%s", sys->name );
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 );
131 if (sys_isFlag( sys, SYSTEM_NOLANES ))
132 xmlw_elemEmpty( writer,
"nolanes" );
133 xmlw_endElem( writer );
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 );
143 memcpy( sorted_spobs, sys->spobs,
sizeof(
Spob*) *
array_size(sys->spobs) );
148 memcpy( sorted_virtualspobs, sys->spobs_virtual,
sizeof(
VirtualSpob*) *
array_size(sys->spobs_virtual) );
152 xmlw_startElem( writer,
"spobs" );
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 );
159 free(sorted_virtualspobs);
162 sorted_jumps = malloc(
sizeof(JumpPoint*) *
array_size(sys->jumps) );
164 sorted_jumps[i] = &sys->jumps[i];
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 );
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 );
179 xmlw_elemEmpty( writer,
"autopos" );
181 if (jp->radius != 200.)
182 xmlw_elem( writer,
"radius",
"%f", jp->radius );
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 );
193 xmlw_endElem( writer );
198 xmlw_startElem( writer,
"asteroids" );
199 for (
int i=0; i<
array_size(sys->asteroids); i++) {
201 xmlw_startElem( writer,
"asteroid" );
205 xmlw_elem( writer,
"group",
"%s", ast->
groups[j]->
name );
208 xmlw_elem( writer,
"radius",
"%f", ast->
radius );
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 );
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 );
225 for (
int i=0; i<
array_size(sys->astexclude); i++) {
227 xmlw_startElem( writer,
"exclusion" );
230 xmlw_elem( writer,
"radius",
"%f", aexcl->
radius );
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 );
237 xmlw_endElem( writer );
239 xmlw_endElem( writer );
242 if (sys->stats != NULL) {
243 xmlw_startElem( writer,
"stats" );
245 xmlw_endElem( writer );
249 xmlw_startElem( writer,
"tags" );
251 xmlw_elem( writer,
"tag",
"%s", sys->tags[i] );
252 xmlw_endElem( writer );
255 xmlw_endElem( writer );
259 xmlFreeTextWriter(writer);
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);
Represents a Space Object (SPOB), including and not limited to planets, stations, wormholes,...