23#include "map_overlay.h"
37typedef struct UniDiff_ {
64const char *
const hunk_attr_label[] = {
"label", NULL };
70 .reverse = HUNK_TYPE_NONE,
73 [HUNK_TYPE_SPOB_ADD] = { .name = N_(
"spob add" ),
75 .reverse = HUNK_TYPE_SPOB_REMOVE },
76 [HUNK_TYPE_SPOB_REMOVE] = { .name = N_(
"spob remove" ),
78 .reverse = HUNK_TYPE_SPOB_ADD },
79 [HUNK_TYPE_VSPOB_ADD] = { .name = N_(
"virtual spob add" ),
80 .tag =
"spob_virtual_add",
81 .reverse = HUNK_TYPE_VSPOB_REMOVE },
82 [HUNK_TYPE_VSPOB_REMOVE] = { .name = N_(
"virtual spob remove" ),
83 .tag =
"spob_virtual_remove",
84 .reverse = HUNK_TYPE_VSPOB_ADD },
85 [HUNK_TYPE_JUMP_ADD] = { .name = N_(
"jump add" ),
87 .reverse = HUNK_TYPE_JUMP_REMOVE },
88 [HUNK_TYPE_JUMP_REMOVE] = { .name = N_(
"jump remove" ),
90 .reverse = HUNK_TYPE_JUMP_ADD },
91 [HUNK_TYPE_SSYS_BACKGROUND] = { .name = N_(
"ssys background" ),
94 HUNK_TYPE_SSYS_BACKGROUND_REVERT },
95 [HUNK_TYPE_SSYS_BACKGROUND_REVERT] =
97 .name = N_(
"ssys background revert" ),
99 .reverse = HUNK_TYPE_NONE,
101 [HUNK_TYPE_SSYS_FEATURES] = { .name = N_(
"ssys features" ),
103 .reverse = HUNK_TYPE_SSYS_FEATURES_REVERT },
104 [HUNK_TYPE_SSYS_FEATURES_REVERT] = { .name = N_(
"ssys features revert" ),
106 .reverse = HUNK_TYPE_NONE },
107 [HUNK_TYPE_SSYS_POS_X] = { .name = N_(
"ssys pos x" ),
109 .reverse = HUNK_TYPE_SSYS_POS_X_REVERT },
110 [HUNK_TYPE_SSYS_POS_X_REVERT] = { .name = N_(
"ssys pos x revert" ),
112 .reverse = HUNK_TYPE_NONE },
113 [HUNK_TYPE_SSYS_POS_Y] = { .name = N_(
"ssys pos y" ),
115 .reverse = HUNK_TYPE_SSYS_POS_Y_REVERT },
116 [HUNK_TYPE_SSYS_POS_Y_REVERT] = { .name = N_(
"ssys pos x revert" ),
118 .reverse = HUNK_TYPE_NONE },
119 [HUNK_TYPE_SSYS_DISPLAYNAME] = { .name = N_(
"ssys displayname" ),
120 .tag =
"displayname",
122 HUNK_TYPE_SSYS_DISPLAYNAME_REVERT },
123 [HUNK_TYPE_SSYS_DISPLAYNAME_REVERT] = { .name =
124 N_(
"ssys displayname revert" ),
126 .reverse = HUNK_TYPE_NONE },
127 [HUNK_TYPE_SSYS_DUST] = { .name = N_(
"ssys dust" ),
129 .reverse = HUNK_TYPE_SSYS_DUST_REVERT },
130 [HUNK_TYPE_SSYS_DUST_REVERT] = { .name = N_(
"ssys dust revert" ),
132 .reverse = HUNK_TYPE_NONE },
133 [HUNK_TYPE_SSYS_INTERFERENCE] = { .name = N_(
"ssys interference" ),
134 .tag =
"interference",
136 HUNK_TYPE_SSYS_INTERFERENCE_REVERT },
137 [HUNK_TYPE_SSYS_INTERFERENCE_REVERT] = { .name =
138 N_(
"ssys interference revert" ),
140 .reverse = HUNK_TYPE_NONE },
141 [HUNK_TYPE_SSYS_NEBU_DENSITY] = { .name = N_(
"ssys nebula density" ),
142 .tag =
"nebu_density",
144 HUNK_TYPE_SSYS_NEBU_DENSITY_REVERT },
145 [HUNK_TYPE_SSYS_NEBU_DENSITY_REVERT] = { .name = N_(
146 "ssys nebula density revert" ),
148 .reverse = HUNK_TYPE_NONE },
149 [HUNK_TYPE_SSYS_NEBU_VOLATILITY] =
150 { .name = N_(
"ssys nebula volatility" ),
151 .tag =
"nebu_volatility",
152 .reverse = HUNK_TYPE_SSYS_NEBU_VOLATILITY_REVERT },
153 [HUNK_TYPE_SSYS_NEBU_VOLATILITY_REVERT] =
155 .name = N_(
"ssys nebula volatility revert" ),
157 .reverse = HUNK_TYPE_NONE,
159 [HUNK_TYPE_SSYS_NEBU_HUE] = { .name = N_(
"ssys nebula hue" ),
161 .reverse = HUNK_TYPE_SSYS_NEBU_HUE_REVERT },
162 [HUNK_TYPE_SSYS_NEBU_HUE_REVERT] = { .name = N_(
"ssys nebula hue revert" ),
164 .reverse = HUNK_TYPE_NONE },
165 [HUNK_TYPE_SSYS_NOLANES_ADD] = { .name = N_(
"ssys nolanes add" ),
166 .tag =
"nolanes_add",
167 .reverse = HUNK_TYPE_SSYS_NOLANES_REMOVE },
168 [HUNK_TYPE_SSYS_NOLANES_REMOVE] = { .name = N_(
"ssys nolanes remove" ),
169 .tag =
"nolanes_remove",
170 .reverse = HUNK_TYPE_SSYS_NOLANES_ADD },
171 [HUNK_TYPE_SSYS_TAG_ADD] = { .name = N_(
"ssys tag = NULL add" ),
173 .reverse = HUNK_TYPE_SSYS_TAG_REMOVE },
174 [HUNK_TYPE_SSYS_TAG_REMOVE] = { .name = N_(
"ssys tag = NULL remove" ),
176 .reverse = HUNK_TYPE_SSYS_TAG_ADD },
178 [HUNK_TYPE_SSYS_ASTEROIDS_ADD] = { .name = N_(
"ssys asteroids add" ),
179 .tag =
"asteroids_add",
181 HUNK_TYPE_SSYS_ASTEROIDS_ADD_REVERT },
182 [HUNK_TYPE_SSYS_ASTEROIDS_ADD_REVERT] = { .name = N_(
183 "ssys asteroids add revert" ),
185 .reverse = HUNK_TYPE_NONE },
186 [HUNK_TYPE_SSYS_ASTEROIDS_REMOVE] =
187 { .name = N_(
"ssys asteroids remove" ),
188 .tag =
"asteroids_remove",
189 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_REMOVE_REVERT },
190 [HUNK_TYPE_SSYS_ASTEROIDS_REMOVE_REVERT] =
191 { .name = N_(
"ssys asteroids remove revert" ),
193 .reverse = HUNK_TYPE_NONE },
194 [HUNK_TYPE_SSYS_ASTEROIDS_POS_X] =
195 { .name = N_(
"ssys asteroids pos x" ),
196 .tag =
"asteroids_pos_x",
197 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_POS_X_REVERT,
198 .attrs = hunk_attr_label },
199 [HUNK_TYPE_SSYS_ASTEROIDS_POS_X_REVERT] =
200 { .name = N_(
"ssys asteroids pos x revert" ),
202 .reverse = HUNK_TYPE_NONE },
203 [HUNK_TYPE_SSYS_ASTEROIDS_POS_Y] =
204 { .name = N_(
"ssys asteroids pos y" ),
205 .tag =
"asteroids_pos_y",
206 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_POS_Y_REVERT,
207 .attrs = hunk_attr_label },
208 [HUNK_TYPE_SSYS_ASTEROIDS_POS_Y_REVERT] =
209 { .name = N_(
"ssys asteroids pos y revert" ),
211 .reverse = HUNK_TYPE_NONE },
212 [HUNK_TYPE_SSYS_ASTEROIDS_DENSITY] =
213 { .name = N_(
"ssys asteroids density" ),
214 .tag =
"asteroids_density",
215 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_DENSITY_REVERT,
216 .attrs = hunk_attr_label },
217 [HUNK_TYPE_SSYS_ASTEROIDS_DENSITY_REVERT] =
218 { .name = N_(
"ssys asteroids density revert" ),
220 .reverse = HUNK_TYPE_NONE },
221 [HUNK_TYPE_SSYS_ASTEROIDS_RADIUS] =
222 { .name = N_(
"ssys asteroids radius" ),
223 .tag =
"asteroids_radius",
224 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_RADIUS_REVERT,
225 .attrs = hunk_attr_label },
226 [HUNK_TYPE_SSYS_ASTEROIDS_RADIUS_REVERT] =
227 { .name = N_(
"ssys asteroids radius revert" ),
229 .reverse = HUNK_TYPE_NONE },
230 [HUNK_TYPE_SSYS_ASTEROIDS_MAXSPEED] =
231 { .name = N_(
"ssys asteroids maxspeed" ),
232 .tag =
"asteroids_maxspeed",
233 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_MAXSPEED_REVERT,
234 .attrs = hunk_attr_label },
235 [HUNK_TYPE_SSYS_ASTEROIDS_MAXSPEED_REVERT] =
236 { .name = N_(
"ssys asteroids maxspeed revert" ),
238 .reverse = HUNK_TYPE_NONE },
239 [HUNK_TYPE_SSYS_ASTEROIDS_ACCEL] =
240 { .name = N_(
"ssys asteroids accel" ),
241 .tag =
"asteroids_accel",
242 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_ACCEL_REVERT,
243 .attrs = hunk_attr_label },
244 [HUNK_TYPE_SSYS_ASTEROIDS_ACCEL_REVERT] =
245 { .name = N_(
"ssys asteroids accel revert" ),
247 .reverse = HUNK_TYPE_NONE },
248 [HUNK_TYPE_SSYS_ASTEROIDS_ADD_TYPE] =
249 { .name = N_(
"ssys asteroids add type" ),
250 .tag =
"asteroids_add_type",
251 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_REMOVE_TYPE,
252 .attrs = hunk_attr_label },
253 [HUNK_TYPE_SSYS_ASTEROIDS_REMOVE_TYPE] =
254 { .name = N_(
"ssys asteroids remove type" ),
255 .tag =
"asteroids_remove_type",
256 .reverse = HUNK_TYPE_SSYS_ASTEROIDS_ADD_TYPE,
257 .attrs = hunk_attr_label },
259 [HUNK_TYPE_TECH_ADD] = { .name = N_(
"tech add" ),
261 .reverse = HUNK_TYPE_TECH_REMOVE },
262 [HUNK_TYPE_TECH_REMOVE] = { .name = N_(
"tech remove" ),
263 .tag =
"item_remove",
264 .reverse = HUNK_TYPE_TECH_ADD },
266 [HUNK_TYPE_SPOB_POS_X] = { .name = N_(
"spob pos x" ),
268 .reverse = HUNK_TYPE_SPOB_POS_X_REVERT },
269 [HUNK_TYPE_SPOB_POS_X_REVERT] = { .name = N_(
"spob pos x revert" ),
271 .reverse = HUNK_TYPE_NONE },
272 [HUNK_TYPE_SPOB_POS_Y] = { .name = N_(
"spob pos y" ),
274 .reverse = HUNK_TYPE_SPOB_POS_Y_REVERT },
275 [HUNK_TYPE_SPOB_POS_Y_REVERT] = { .name = N_(
"spob pos y revert" ),
277 .reverse = HUNK_TYPE_NONE },
278 [HUNK_TYPE_SPOB_CLASS] = { .name = N_(
"spob class" ),
280 .reverse = HUNK_TYPE_SPOB_CLASS_REVERT },
281 [HUNK_TYPE_SPOB_CLASS_REVERT] = { .name = N_(
"spob class revert" ),
283 .reverse = HUNK_TYPE_NONE },
284 [HUNK_TYPE_SPOB_FACTION] = { .name = N_(
"spob faction" ),
286 .reverse = HUNK_TYPE_SPOB_FACTION_REVERT },
287 [HUNK_TYPE_SPOB_FACTION_REVERT] = { .name = N_(
"spob faction revert" ),
289 .reverse = HUNK_TYPE_NONE },
290 [HUNK_TYPE_SPOB_PRESENCE_BASE] = { .name = N_(
"spob presence base" ),
291 .tag =
"presence_base",
293 HUNK_TYPE_SPOB_PRESENCE_BASE_REVERT },
294 [HUNK_TYPE_SPOB_PRESENCE_BASE_REVERT] = { .name = N_(
295 "spob presence base revert" ),
297 .reverse = HUNK_TYPE_NONE },
298 [HUNK_TYPE_SPOB_PRESENCE_BONUS] =
299 { .name = N_(
"spob presence bonus" ),
300 .tag =
"presence_bonus",
301 .reverse = HUNK_TYPE_SPOB_PRESENCE_BONUS_REVERT },
302 [HUNK_TYPE_SPOB_PRESENCE_BONUS_REVERT] = { .name = N_(
303 "spob presence bonus revert" ),
305 .reverse = HUNK_TYPE_NONE },
306 [HUNK_TYPE_SPOB_PRESENCE_RANGE] =
307 { .name = N_(
"spob presence range" ),
308 .tag =
"presence_range",
309 .reverse = HUNK_TYPE_SPOB_PRESENCE_RANGE_REVERT },
310 [HUNK_TYPE_SPOB_PRESENCE_RANGE_REVERT] = { .name = N_(
311 "spob presence range revert" ),
313 .reverse = HUNK_TYPE_NONE },
314 [HUNK_TYPE_SPOB_HIDE] = { .name = N_(
"spob hide" ),
316 .reverse = HUNK_TYPE_SPOB_HIDE_REVERT },
317 [HUNK_TYPE_SPOB_HIDE_REVERT] = { .name = N_(
"spob hide revert" ),
319 .reverse = HUNK_TYPE_NONE },
320 [HUNK_TYPE_SPOB_POPULATION] = { .name = N_(
"spob population" ),
323 HUNK_TYPE_SPOB_POPULATION_REVERT },
324 [HUNK_TYPE_SPOB_POPULATION_REVERT] = { .name =
325 N_(
"spob population revert" ),
327 .reverse = HUNK_TYPE_NONE },
328 [HUNK_TYPE_SPOB_DISPLAYNAME] = { .name = N_(
"spob displayname" ),
329 .tag =
"displayname",
331 HUNK_TYPE_SPOB_DISPLAYNAME_REVERT },
332 [HUNK_TYPE_SPOB_DISPLAYNAME_REVERT] = { .name =
333 N_(
"spob displayname revert" ),
335 .reverse = HUNK_TYPE_NONE },
336 [HUNK_TYPE_SPOB_DESCRIPTION] = { .name = N_(
"spob description" ),
337 .tag =
"description",
339 HUNK_TYPE_SPOB_DESCRIPTION_REVERT },
340 [HUNK_TYPE_SPOB_DESCRIPTION_REVERT] = { .name =
341 N_(
"spob description revert" ),
343 .reverse = HUNK_TYPE_NONE },
344 [HUNK_TYPE_SPOB_BAR] = { .name = N_(
"spob bar" ),
346 .reverse = HUNK_TYPE_SPOB_BAR_REVERT },
347 [HUNK_TYPE_SPOB_BAR_REVERT] = { .name = N_(
"spob bar revert" ),
349 .reverse = HUNK_TYPE_NONE },
350 [HUNK_TYPE_SPOB_SPACE] = { .name = N_(
"spob space" ),
352 .reverse = HUNK_TYPE_SPOB_SPACE_REVERT },
353 [HUNK_TYPE_SPOB_SPACE_REVERT] = { .name = N_(
"spob space revert" ),
355 .reverse = HUNK_TYPE_NONE },
356 [HUNK_TYPE_SPOB_EXTERIOR] = { .name = N_(
"spob exterior" ),
357 .tag =
"gfx_exterior",
358 .reverse = HUNK_TYPE_SPOB_EXTERIOR_REVERT },
359 [HUNK_TYPE_SPOB_EXTERIOR_REVERT] = { .name = N_(
"spob exterior revert" ),
361 .reverse = HUNK_TYPE_NONE },
362 [HUNK_TYPE_SPOB_LUA] = { .name = N_(
"spob lua" ),
364 .reverse = HUNK_TYPE_SPOB_LUA_REVERT },
365 [HUNK_TYPE_SPOB_LUA_REVERT] = { .name = N_(
"spob lua revert" ),
367 .reverse = HUNK_TYPE_NONE },
368 [HUNK_TYPE_SPOB_SERVICE_ADD] = { .name = N_(
"spob service add" ),
369 .tag =
"service_add",
370 .reverse = HUNK_TYPE_SPOB_SERVICE_REMOVE },
371 [HUNK_TYPE_SPOB_SERVICE_REMOVE] = { .name = N_(
"spob service remove" ),
372 .tag =
"service_remove",
373 .reverse = HUNK_TYPE_SPOB_SERVICE_ADD },
374 [HUNK_TYPE_SPOB_NOMISNSPAWN_ADD] = { .name = N_(
"spob nomissionspawn add" ),
375 .tag =
"nomissionspawn_add",
377 HUNK_TYPE_SPOB_NOMISNSPAWN_REMOVE },
378 [HUNK_TYPE_SPOB_NOMISNSPAWN_REMOVE] = { .name = N_(
379 "spob nomissionspawn remove" ),
380 .tag =
"nomissionspawn_remove",
382 HUNK_TYPE_SPOB_NOMISNSPAWN_ADD },
383 [HUNK_TYPE_SPOB_TECH_ADD] = { .name = N_(
"spob tech add" ),
385 .reverse = HUNK_TYPE_SPOB_TECH_REMOVE },
386 [HUNK_TYPE_SPOB_TECH_REMOVE] = { .name = N_(
"spob tech remove" ),
387 .tag =
"tech_remove",
388 .reverse = HUNK_TYPE_SPOB_TECH_ADD },
389 [HUNK_TYPE_SPOB_TAG_ADD] = { .name = N_(
"spob tag = NULL add" ),
391 .reverse = HUNK_TYPE_SPOB_TAG_REMOVE },
392 [HUNK_TYPE_SPOB_TAG_REMOVE] = { .name = N_(
"spob tag = NULL remove" ),
394 .reverse = HUNK_TYPE_SPOB_TAG_ADD },
396 [HUNK_TYPE_FACTION_VISIBLE] = { .name = N_(
"faction visible" ),
398 .reverse = HUNK_TYPE_FACTION_INVISIBLE },
399 [HUNK_TYPE_FACTION_INVISIBLE] = { .name = N_(
"faction invisible" ),
401 .reverse = HUNK_TYPE_FACTION_INVISIBLE },
402 [HUNK_TYPE_FACTION_ALLY] = { .name = N_(
"faction set ally" ),
404 .reverse = HUNK_TYPE_FACTION_REALIGN },
405 [HUNK_TYPE_FACTION_ENEMY] = { .name = N_(
"faction set enemy" ),
407 .reverse = HUNK_TYPE_FACTION_REALIGN },
408 [HUNK_TYPE_FACTION_NEUTRAL] = { .name = N_(
"faction set neutral" ),
410 .reverse = HUNK_TYPE_FACTION_REALIGN },
411 [HUNK_TYPE_FACTION_REALIGN] = { .name = N_(
"faction alignment reset" ),
413 .reverse = HUNK_TYPE_NONE },
414 [HUNK_TYPE_SENTINAL] = { .name = N_(
"sentinal" ),
416 .reverse = HUNK_TYPE_NONE },
419#define HUNK_CUST( TYPE, DTYPE, FUNC ) \
422 if ( xml_isNode( cur, hunk_prop[TYPE].tag ) ) { \
423 memset( &hunk, 0, sizeof( hunk ) ); \
424 hunk.target.type = base.target.type; \
425 hunk.target.u.name = strdup( base.target.u.name ); \
427 hunk.dtype = DTYPE; \
428 diff_parseAttr( &hunk, cur ); \
429 FUNC array_push_back( &diff->hunks, hunk ); \
432#define HUNK_NONE( TYPE ) \
433 HUNK_CUST( TYPE, HUNK_DATA_NONE, hunk.u.name = NULL; );
434#define HUNK_STRD( TYPE ) \
435 HUNK_CUST( TYPE, HUNK_DATA_STRING, hunk.u.name = xml_getStrd( cur ); );
436#define HUNK_INT( TYPE ) \
437 HUNK_CUST( TYPE, HUNK_DATA_INT, hunk.u.data = xml_getUInt( cur ); );
438#define HUNK_FLOAT( TYPE ) \
439 HUNK_CUST( TYPE, HUNK_DATA_FLOAT, hunk.u.fdata = xml_getFloat( cur ); );
448static const
char *diff_getAttr(
UniHunk_t *hunk, const
char *name );
450static
int diff_parseDoc(
UniDiffData_t *diff, xmlDocPtr doc );
467static
int diff_cmp( const
void *p1, const
void *p2 )
472 return strcmp( d1->
name, d2->
name );
483 Uint32 time = SDL_GetTicks();
485 for (
int i = 0; i < HUNK_TYPE_SENTINAL; i++ ) {
486 if ( hunk_prop[i].name == NULL )
487 WARN(
"HUNK_TYPE '%d' missing name!", i );
488 if ( hunk_prop[i].reverse == HUNK_TYPE_NONE ) {
492 for (
int j = 0; j < HUNK_TYPE_SENTINAL; j++ ) {
493 if ( hunk_prop[j].reverse == (UniHunkType_t)i ) {
501 if ( hunk_prop[i].name == NULL )
502 WARN(
"HUNK_TYPE '%d' missing reverse!", i );
504 WARN(
"HUNK_TYPE '%s' missing reverse!", hunk_prop[i].name );
513 for (
int i = 0; i <
array_size( diff_files ); i++ ) {
516 memset( &diff, 0,
sizeof( diff ) );
517 if ( diff_parsePhysFS( &diff, diff_files[i] ) == 0 )
530 if ( strcmp(
d->name, dn->
name ) == 0 )
531 WARN( _(
"Two unidiff have the same name '%s'!" ),
d->name );
535 if ( conf.devmode ) {
536 DEBUG( n_(
"Loaded %d UniDiff in %.3f s",
"Loaded %d UniDiffs in %.3f s",
540 DEBUG( n_(
"Loaded %d UniDiff",
"Loaded %d UniDiffs",
573 xmlDocPtr doc = xmlParseFile( filename );
578 return diff_parseDoc( diff, doc );
588 return diff_parseDoc( diff, doc );
591static int diff_parseDoc(
UniDiffData_t *diff, xmlDocPtr doc )
593 xmlNodePtr parent = doc->xmlChildrenNode;
595 if ( strcmp( (
char *)parent->name,
"unidiff" ) ) {
596 WARN( _(
"Malformed unidiff file: missing root element 'unidiff'" ) );
600 xmlr_attr_strd( parent,
"name", diff->
name );
604 node = parent->xmlChildrenNode;
606 xml_onlyNodes( node );
608 if ( xml_isNode( node,
"system" ) )
610 else if ( xml_isNode( node,
"tech" ) )
612 else if ( xml_isNode( node,
"spob" ) )
614 else if ( xml_isNode( node,
"faction" ) )
617 WARN( _(
"Unidiff '%s' has unknown node '%s'." ), diff->
name,
619 }
while ( xml_nextNode( node ) );
647 if ( strcmp(
diff_stack[i].data->name, name ) == 0 )
663 if (
player.p->nav_hyperspace >= 0 )
666 if (
player.p->nav_spob >= 0 )
698 WARN( _(
"UniDiff '%s' not found in %s!" ), name, UNIDIFF_DATA_PATH );
708 for (
int i = 0; i <
array_size(
d->hunks ); i++ ) {
714 if ( hi->
dtype == HUNK_DATA_STRING )
715 h.
u.name = strdup( hi->
u.name );
716 if ( h.
attr != NULL ) {
720 attr.name = strdup( hi->
attr[j].name );
721 attr.value = strdup( hi->
attr[j].value );
736 WARN( n_(
"Unidiff '%s' failed to apply %d hunk.",
737 "Unidiff '%s' failed to apply %d hunks.", nfailed ),
739 for (
int i = 0; i < nfailed; i++ ) {
743 if ( ( fail->
type < 0 ) || ( fail->
type >= HUNK_TYPE_SENTINAL ) ||
744 ( hunk_prop[fail->
type].name == NULL ) ) {
745 WARN( _(
"Unknown unidiff hunk '%d'!" ), fail->
type );
746 hname = N_(
"unknown hunk" );
748 hname = hunk_prop[fail->
type].name;
751 switch ( fail->
dtype ) {
753 WARN( p_(
"unidiff",
" [%s] %s" ), target, _( hname ) );
755 case HUNK_DATA_STRING:
756 WARN( p_(
"unidiff",
" [%s] %s: %s" ), target, _( hname ),
760 WARN( p_(
"unidiff",
" [%s] %s: %d" ), target, _( hname ),
763 case HUNK_DATA_FLOAT:
764 WARN( p_(
"unidiff",
" [%s] %s: %f" ), target, _( hname ),
769 WARN( p_(
"unidiff",
" [%s] %s: UNKNOWN DATA" ), target,
806 const char *
const *attrs = hunk_prop[hunk->
type].attrs;
807 xmlAttr *attribute = node->properties;
808 while ( attribute && attribute->name && attribute->children ) {
813 if ( attrs != NULL ) {
814 for (
int i = 0; attrs[i] != 0; i++ ) {
815 if ( strcmp( (
const char *)attribute->name, attrs[i] ) == 0 ) {
822 WARN( _(
"Unidiff hunk '%s' has unkown attribute '%s'" ),
823 hunk_prop[hunk->
type].name, attribute->name );
824 attribute = attribute->next;
828 attr.name = strdup( (
const char *)attribute->name );
830 (
char *)xmlNodeListGetString( node->doc, attribute->children, 1 );
831 if ( hunk->
attr == NULL )
834 attribute = attribute->next;
838static const char *diff_getAttr(
UniHunk_t *hunk,
const char *name )
841 if ( strcmp( hunk->
attr[i].name, name ) == 0 )
842 return hunk->
attr[i].value;
849 for (
int i = 0; i <
array_size( ssys->asteroids ); i++ ) {
851 if ( ast->
label && strcmp( ast->
label, label ) == 0 )
859 const char *label = diff_getAttr( hunk,
"label" );
860 if ( label == NULL ) {
861 WARN( _(
"Hunk '%s' does not have a label attribute!" ),
862 hunk_prop[hunk->
type].name );
868 WARN( _(
"Hunk '%s' can not find an asteroid field with label '%s' in "
870 hunk_prop[hunk->
type].name, label, ssys->name );
889 xmlr_attr_strd( node,
"name", base.
target.
u.
name );
891 WARN( _(
"Unidiff '%s' has a system node without a 'name' tag, not "
898 cur = node->xmlChildrenNode;
900 xml_onlyNodes( cur );
902 HUNK_STRD( HUNK_TYPE_SPOB_ADD );
903 HUNK_STRD( HUNK_TYPE_SPOB_REMOVE );
904 HUNK_STRD( HUNK_TYPE_VSPOB_ADD );
905 HUNK_STRD( HUNK_TYPE_VSPOB_REMOVE );
906 HUNK_STRD( HUNK_TYPE_JUMP_ADD );
907 HUNK_STRD( HUNK_TYPE_JUMP_REMOVE );
908 HUNK_STRD( HUNK_TYPE_SSYS_BACKGROUND );
909 HUNK_STRD( HUNK_TYPE_SSYS_FEATURES );
910 HUNK_FLOAT( HUNK_TYPE_SSYS_POS_X );
911 HUNK_FLOAT( HUNK_TYPE_SSYS_POS_Y );
912 HUNK_STRD( HUNK_TYPE_SSYS_DISPLAYNAME );
913 HUNK_INT( HUNK_TYPE_SSYS_DUST );
914 HUNK_FLOAT( HUNK_TYPE_SSYS_INTERFERENCE );
915 HUNK_FLOAT( HUNK_TYPE_SSYS_NEBU_DENSITY );
916 HUNK_FLOAT( HUNK_TYPE_SSYS_NEBU_VOLATILITY );
917 HUNK_FLOAT( HUNK_TYPE_SSYS_NEBU_HUE );
918 HUNK_NONE( HUNK_TYPE_SSYS_NOLANES_ADD );
919 HUNK_NONE( HUNK_TYPE_SSYS_NOLANES_REMOVE );
920 HUNK_STRD( HUNK_TYPE_SSYS_TAG_ADD );
921 HUNK_STRD( HUNK_TYPE_SSYS_TAG_REMOVE );
923 HUNK_STRD( HUNK_TYPE_SSYS_ASTEROIDS_ADD );
924 HUNK_STRD( HUNK_TYPE_SSYS_ASTEROIDS_REMOVE );
925 HUNK_FLOAT( HUNK_TYPE_SSYS_ASTEROIDS_POS_X );
926 HUNK_FLOAT( HUNK_TYPE_SSYS_ASTEROIDS_POS_Y );
927 HUNK_FLOAT( HUNK_TYPE_SSYS_ASTEROIDS_DENSITY );
928 HUNK_FLOAT( HUNK_TYPE_SSYS_ASTEROIDS_RADIUS );
929 HUNK_FLOAT( HUNK_TYPE_SSYS_ASTEROIDS_MAXSPEED );
930 HUNK_FLOAT( HUNK_TYPE_SSYS_ASTEROIDS_ACCEL );
931 HUNK_STRD( HUNK_TYPE_SSYS_ASTEROIDS_ADD_TYPE );
932 HUNK_STRD( HUNK_TYPE_SSYS_ASTEROIDS_REMOVE_TYPE );
934 WARN( _(
"Unidiff '%s' has unknown node '%s'." ), diff->
name, cur->name );
935 }
while ( xml_nextNode( cur ) );
959 xmlr_attr_strd( node,
"name", base.
target.
u.
name );
961 WARN( _(
"Unidiff '%s' has an target node without a 'name' tag" ),
967 cur = node->xmlChildrenNode;
969 xml_onlyNodes( cur );
971 HUNK_STRD( HUNK_TYPE_TECH_ADD );
972 HUNK_STRD( HUNK_TYPE_TECH_REMOVE );
974 WARN( _(
"Unidiff '%s' has unknown node '%s'." ), diff->
name, cur->name );
975 }
while ( xml_nextNode( cur ) );
999 xmlr_attr_strd( node,
"name", base.
target.
u.
name );
1001 WARN( _(
"Unidiff '%s' has an target node without a 'name' tag" ),
1007 cur = node->xmlChildrenNode;
1009 xml_onlyNodes( cur );
1011 HUNK_FLOAT( HUNK_TYPE_SPOB_POS_X );
1012 HUNK_FLOAT( HUNK_TYPE_SPOB_POS_Y );
1013 HUNK_STRD( HUNK_TYPE_SPOB_CLASS );
1014 HUNK_STRD( HUNK_TYPE_SPOB_FACTION );
1015 HUNK_FLOAT( HUNK_TYPE_SPOB_PRESENCE_BASE );
1016 HUNK_FLOAT( HUNK_TYPE_SPOB_PRESENCE_BONUS );
1017 HUNK_INT( HUNK_TYPE_SPOB_PRESENCE_RANGE );
1018 HUNK_FLOAT( HUNK_TYPE_SPOB_HIDE );
1019 HUNK_INT( HUNK_TYPE_SPOB_POPULATION );
1020 HUNK_STRD( HUNK_TYPE_SPOB_DISPLAYNAME );
1021 HUNK_STRD( HUNK_TYPE_SPOB_DESCRIPTION );
1022 HUNK_STRD( HUNK_TYPE_SPOB_BAR );
1023 HUNK_STRD( HUNK_TYPE_SPOB_SERVICE_ADD );
1024 HUNK_STRD( HUNK_TYPE_SPOB_SERVICE_REMOVE );
1025 HUNK_NONE( HUNK_TYPE_SPOB_NOMISNSPAWN_ADD );
1026 HUNK_NONE( HUNK_TYPE_SPOB_NOMISNSPAWN_REMOVE );
1027 HUNK_STRD( HUNK_TYPE_SPOB_TECH_ADD );
1028 HUNK_STRD( HUNK_TYPE_SPOB_TECH_REMOVE );
1029 HUNK_STRD( HUNK_TYPE_SPOB_TAG_ADD );
1030 HUNK_STRD( HUNK_TYPE_SPOB_TAG_REMOVE );
1031 HUNK_CUST( HUNK_TYPE_SPOB_SPACE, HUNK_DATA_STRING,
char str[
PATH_MAX];
1032 snprintf( str,
sizeof( str ), SPOB_GFX_SPACE_PATH
"%s",
1034 hunk.
u.name = strdup( str ); );
1035 HUNK_CUST( HUNK_TYPE_SPOB_EXTERIOR, HUNK_DATA_STRING,
char str[
PATH_MAX];
1036 snprintf( str,
sizeof( str ), SPOB_GFX_EXTERIOR_PATH
"%s",
1038 hunk.
u.name = strdup( str ); );
1039 HUNK_STRD( HUNK_TYPE_SPOB_LUA );
1042 WARN( _(
"Unidiff '%s' has unknown node '%s'." ), diff->
name, cur->name );
1043 }
while ( xml_nextNode( cur ) );
1065 memset( &base, 0,
sizeof(
UniHunk_t ) );
1067 xmlr_attr_strd( node,
"name", base.
target.
u.
name );
1069 WARN( _(
"Unidiff '%s' has an target node without a 'name' tag" ),
1075 cur = node->xmlChildrenNode;
1077 xml_onlyNodes( cur );
1079 HUNK_NONE( HUNK_TYPE_FACTION_VISIBLE );
1080 HUNK_NONE( HUNK_TYPE_FACTION_INVISIBLE );
1081 HUNK_STRD( HUNK_TYPE_FACTION_ALLY );
1082 HUNK_STRD( HUNK_TYPE_FACTION_ENEMY );
1083 HUNK_STRD( HUNK_TYPE_FACTION_NEUTRAL );
1085 WARN( _(
"Unidiff '%s' has unknown node '%s'." ), diff->
name, cur->name );
1086 }
while ( xml_nextNode( cur ) );
1104 rhunk.
type = hunk_prop[hunk->
type].reverse;
1117 StarSystem *ssys = NULL;
1118 StarSystem *ssys2 = NULL;
1124 case HUNK_TARGET_SYSTEM:
1129 case HUNK_TARGET_SPOB:
1134 case HUNK_TARGET_FACTION:
1139 case HUNK_TARGET_NONE:
1140 case HUNK_TARGET_TECH:
1144 switch ( hunk->
type ) {
1146 case HUNK_TYPE_SPOB_ADD:
1154 case HUNK_TYPE_SPOB_REMOVE:
1159 case HUNK_TYPE_VSPOB_ADD:
1163 case HUNK_TYPE_VSPOB_REMOVE:
1168 case HUNK_TYPE_JUMP_ADD:
1170 if ( ssys2 == NULL )
1179 case HUNK_TYPE_JUMP_REMOVE:
1181 if ( ssys2 == NULL )
1191 case HUNK_TYPE_SSYS_BACKGROUND:
1192 hunk->o.name = ssys->background;
1193 ssys->background = hunk->
u.name;
1195 case HUNK_TYPE_SSYS_BACKGROUND_REVERT:
1196 ssys->background = (
char *)hunk->o.name;
1200 case HUNK_TYPE_SSYS_FEATURES:
1201 hunk->o.name = ssys->features;
1202 ssys->features = hunk->
u.name;
1204 case HUNK_TYPE_SSYS_FEATURES_REVERT:
1205 ssys->features = (
char *)hunk->o.name;
1209 case HUNK_TYPE_SSYS_POS_X:
1210 hunk->o.fdata = ssys->pos.x;
1211 ssys->pos.x = hunk->
u.fdata;
1213 case HUNK_TYPE_SSYS_POS_X_REVERT:
1214 ssys->pos.x = hunk->o.fdata;
1216 case HUNK_TYPE_SSYS_POS_Y:
1217 hunk->o.fdata = ssys->pos.y;
1218 ssys->pos.y = hunk->
u.fdata;
1220 case HUNK_TYPE_SSYS_POS_Y_REVERT:
1221 ssys->pos.y = hunk->o.fdata;
1225 case HUNK_TYPE_SSYS_DISPLAYNAME:
1226 hunk->o.name = ssys->display;
1227 ssys->display = hunk->
u.name;
1229 case HUNK_TYPE_SSYS_DISPLAYNAME_REVERT:
1230 ssys->display = (
char *)hunk->o.name;
1234 case HUNK_TYPE_SSYS_DUST:
1235 hunk->o.data = ssys->spacedust;
1236 ssys->spacedust = hunk->
u.data;
1238 case HUNK_TYPE_SSYS_DUST_REVERT:
1239 ssys->spacedust = hunk->o.data;
1243 case HUNK_TYPE_SSYS_INTERFERENCE:
1244 hunk->o.data = ssys->interference;
1245 ssys->interference = hunk->
u.fdata;
1247 case HUNK_TYPE_SSYS_INTERFERENCE_REVERT:
1248 ssys->interference = hunk->o.fdata;
1252 case HUNK_TYPE_SSYS_NEBU_DENSITY:
1253 hunk->o.data = ssys->nebu_density;
1254 ssys->nebu_density = hunk->
u.fdata;
1256 case HUNK_TYPE_SSYS_NEBU_DENSITY_REVERT:
1257 ssys->nebu_density = hunk->o.fdata;
1261 case HUNK_TYPE_SSYS_NEBU_VOLATILITY:
1262 hunk->o.data = ssys->nebu_volatility;
1263 ssys->nebu_volatility = hunk->
u.fdata;
1265 case HUNK_TYPE_SSYS_NEBU_VOLATILITY_REVERT:
1266 ssys->nebu_volatility = hunk->o.fdata;
1270 case HUNK_TYPE_SSYS_NEBU_HUE:
1271 hunk->o.data = ssys->nebu_hue;
1272 ssys->nebu_hue = hunk->
u.fdata;
1274 case HUNK_TYPE_SSYS_NEBU_HUE_REVERT:
1275 ssys->nebu_hue = hunk->o.fdata;
1279 case HUNK_TYPE_SSYS_NOLANES_ADD:
1280 if ( sys_isFlag( ssys, SYSTEM_NOLANES ) )
1282 sys_setFlag( ssys, SYSTEM_NOLANES );
1284 case HUNK_TYPE_SSYS_NOLANES_REMOVE:
1285 if ( !sys_isFlag( ssys, SYSTEM_NOLANES ) )
1287 sys_rmFlag( ssys, SYSTEM_NOLANES );
1291 case HUNK_TYPE_SSYS_TAG_ADD:
1292 if ( ssys->tags == NULL )
1296 case HUNK_TYPE_SSYS_TAG_REMOVE:
1298 for (
int i = 0; i <
array_size( ssys->tags ); i++ ) {
1299 if ( strcmp( ssys->tags[i], hunk->
u.name ) == 0 ) {
1306 free( ssys->tags[a] );
1307 array_erase( &ssys->tags, &ssys->tags[a], &ssys->tags[a + 1] );
1311 case HUNK_TYPE_SSYS_ASTEROIDS_ADD: {
1314 ast.
label = strdup( hunk->
u.name );
1319 case HUNK_TYPE_SSYS_ASTEROIDS_ADD_REVERT: {
1321 if ( ast != NULL ) {
1326 WARN( _(
"Hunk '%s' can not find an asteroid field with label '%s' in "
1332 case HUNK_TYPE_SSYS_ASTEROIDS_REMOVE: {
1334 if ( ast != NULL ) {
1339 WARN( _(
"Hunk '%s' can not find an asteroid field with label '%s' in "
1344 case HUNK_TYPE_SSYS_ASTEROIDS_REMOVE_REVERT:
1345 if ( hunk->o.ptr != NULL ) {
1352 case HUNK_TYPE_SSYS_ASTEROIDS_POS_X: {
1354 if ( ast != NULL ) {
1355 hunk->o.fdata = ast->
pos.
x;
1356 ast->
pos.
x = hunk->
u.fdata;
1361 case HUNK_TYPE_SSYS_ASTEROIDS_POS_X_REVERT: {
1363 if ( ast != NULL ) {
1364 ast->
pos.
x = hunk->o.fdata;
1369 case HUNK_TYPE_SSYS_ASTEROIDS_POS_Y: {
1371 if ( ast != NULL ) {
1372 hunk->o.fdata = ast->
pos.
y;
1373 ast->
pos.
y = hunk->
u.fdata;
1378 case HUNK_TYPE_SSYS_ASTEROIDS_POS_Y_REVERT: {
1380 if ( ast != NULL ) {
1381 ast->
pos.
y = hunk->o.fdata;
1387 case HUNK_TYPE_SSYS_ASTEROIDS_DENSITY: {
1389 if ( ast != NULL ) {
1397 case HUNK_TYPE_SSYS_ASTEROIDS_DENSITY_REVERT: {
1399 if ( ast != NULL ) {
1406 case HUNK_TYPE_SSYS_ASTEROIDS_RADIUS: {
1408 if ( ast != NULL ) {
1409 hunk->o.fdata = ast->
radius;
1416 case HUNK_TYPE_SSYS_ASTEROIDS_RADIUS_REVERT: {
1418 if ( ast != NULL ) {
1419 ast->
radius = hunk->o.fdata;
1425 case HUNK_TYPE_SSYS_ASTEROIDS_MAXSPEED: {
1427 if ( ast != NULL ) {
1435 case HUNK_TYPE_SSYS_ASTEROIDS_MAXSPEED_REVERT: {
1437 if ( ast != NULL ) {
1444 case HUNK_TYPE_SSYS_ASTEROIDS_ACCEL: {
1446 if ( ast != NULL ) {
1447 hunk->o.fdata = ast->
accel;
1448 ast->
accel = hunk->
u.fdata;
1454 case HUNK_TYPE_SSYS_ASTEROIDS_ACCEL_REVERT: {
1456 if ( ast != NULL ) {
1457 ast->
accel = hunk->o.fdata;
1463 case HUNK_TYPE_SSYS_ASTEROIDS_ADD_TYPE: {
1465 if ( ast != NULL ) {
1471 WARN( _(
"Unidiff '%s' trying to add already existing asteroid "
1482 case HUNK_TYPE_SSYS_ASTEROIDS_REMOVE_TYPE: {
1484 if ( ast != NULL ) {
1496 _(
"Unidiff '%s' trying to remove inexistent asteroid type '%s'." ),
1503 case HUNK_TYPE_TECH_ADD:
1506 case HUNK_TYPE_TECH_REMOVE:
1510 case HUNK_TYPE_SPOB_POS_X:
1511 hunk->o.fdata = p->pos.x;
1512 p->pos.x = hunk->
u.fdata;
1514 case HUNK_TYPE_SPOB_POS_X_REVERT:
1515 p->pos.x = hunk->o.fdata;
1517 case HUNK_TYPE_SPOB_POS_Y:
1518 hunk->o.fdata = p->pos.y;
1519 p->pos.y = hunk->
u.fdata;
1521 case HUNK_TYPE_SPOB_POS_Y_REVERT:
1522 p->pos.y = hunk->o.fdata;
1526 case HUNK_TYPE_SPOB_CLASS:
1527 hunk->o.name = p->class;
1528 p->class = hunk->
u.name;
1530 case HUNK_TYPE_SPOB_CLASS_REVERT:
1531 p->class = (
char *)hunk->o.name;
1535 case HUNK_TYPE_SPOB_FACTION:
1536 if ( p->presence.faction < 0 )
1537 hunk->o.name = NULL;
1542 if ( strcasecmp( hunk->
u.name,
"None" ) == 0 )
1546 case HUNK_TYPE_SPOB_FACTION_REVERT:
1548 if ( hunk->o.name == NULL )
1554 case HUNK_TYPE_SPOB_PRESENCE_BASE:
1556 hunk->o.fdata = p->presence.base;
1557 p->presence.base = hunk->
u.fdata;
1559 case HUNK_TYPE_SPOB_PRESENCE_BASE_REVERT:
1561 p->presence.base = hunk->o.fdata;
1563 case HUNK_TYPE_SPOB_PRESENCE_BONUS:
1565 hunk->o.fdata = p->presence.bonus;
1566 p->presence.bonus = hunk->
u.fdata;
1568 case HUNK_TYPE_SPOB_PRESENCE_BONUS_REVERT:
1570 p->presence.bonus = hunk->o.fdata;
1572 case HUNK_TYPE_SPOB_PRESENCE_RANGE:
1574 hunk->o.data = p->presence.range;
1575 p->presence.range = hunk->
u.data;
1577 case HUNK_TYPE_SPOB_PRESENCE_RANGE_REVERT:
1579 p->presence.range = hunk->o.data;
1583 case HUNK_TYPE_SPOB_HIDE:
1584 hunk->o.fdata = p->hide;
1585 p->hide = hunk->
u.fdata;
1587 case HUNK_TYPE_SPOB_HIDE_REVERT:
1588 p->hide = hunk->o.fdata;
1592 case HUNK_TYPE_SPOB_POPULATION:
1593 hunk->o.fdata = p->population;
1594 p->population = hunk->
u.data;
1596 case HUNK_TYPE_SPOB_POPULATION_REVERT:
1597 p->population = hunk->o.fdata;
1601 case HUNK_TYPE_SPOB_DISPLAYNAME:
1602 hunk->o.name = p->display;
1603 p->display = hunk->
u.name;
1605 case HUNK_TYPE_SPOB_DISPLAYNAME_REVERT:
1606 p->display = (
char *)hunk->o.name;
1610 case HUNK_TYPE_SPOB_DESCRIPTION:
1611 hunk->o.name = p->description;
1612 p->description = hunk->
u.name;
1614 case HUNK_TYPE_SPOB_DESCRIPTION_REVERT:
1615 p->description = (
char *)hunk->o.name;
1619 case HUNK_TYPE_SPOB_BAR:
1620 hunk->o.name = p->bar_description;
1621 p->bar_description = hunk->
u.name;
1623 case HUNK_TYPE_SPOB_BAR_REVERT:
1624 p->bar_description = (
char *)hunk->o.name;
1628 case HUNK_TYPE_SPOB_SERVICE_ADD:
1632 if ( spob_hasService( p, a ) )
1637 case HUNK_TYPE_SPOB_SERVICE_REMOVE:
1641 if ( !spob_hasService( p, a ) )
1648 case HUNK_TYPE_SPOB_NOMISNSPAWN_ADD:
1649 if ( spob_isFlag( p, SPOB_NOMISNSPAWN ) )
1651 spob_setFlag( p, SPOB_NOMISNSPAWN );
1653 case HUNK_TYPE_SPOB_NOMISNSPAWN_REMOVE:
1654 if ( !spob_isFlag( p, SPOB_NOMISNSPAWN ) )
1656 spob_rmFlag( p, SPOB_NOMISNSPAWN );
1660 case HUNK_TYPE_SPOB_TECH_ADD:
1661 if ( p->tech == NULL )
1665 case HUNK_TYPE_SPOB_TECH_REMOVE:
1670 case HUNK_TYPE_SPOB_TAG_ADD:
1671 if ( p->tags == NULL )
1675 case HUNK_TYPE_SPOB_TAG_REMOVE:
1677 for (
int i = 0; i <
array_size( p->tags ); i++ ) {
1678 if ( strcmp( p->tags[i], hunk->
u.name ) == 0 ) {
1686 array_erase( &p->tags, &p->tags[a], &p->tags[a + 1] );
1690 case HUNK_TYPE_SPOB_SPACE:
1691 hunk->o.name = p->gfx_spaceName;
1692 p->gfx_spaceName = hunk->
u.name;
1695 case HUNK_TYPE_SPOB_SPACE_REVERT:
1696 p->gfx_spaceName = (
char *)hunk->o.name;
1701 case HUNK_TYPE_SPOB_EXTERIOR:
1702 hunk->o.name = p->gfx_exterior;
1703 p->gfx_exterior = hunk->
u.name;
1705 case HUNK_TYPE_SPOB_EXTERIOR_REVERT:
1706 p->gfx_exterior = (
char *)hunk->o.name;
1710 case HUNK_TYPE_SPOB_LUA:
1711 hunk->o.name = p->lua_file;
1712 p->lua_file = hunk->
u.name;
1716 case HUNK_TYPE_SPOB_LUA_REVERT:
1717 p->lua_file = (
char *)hunk->o.name;
1723 case HUNK_TYPE_FACTION_VISIBLE:
1726 case HUNK_TYPE_FACTION_INVISIBLE:
1729 case HUNK_TYPE_FACTION_ALLY:
1742 case HUNK_TYPE_FACTION_ENEMY:
1757 case HUNK_TYPE_FACTION_NEUTRAL:
1774 case HUNK_TYPE_FACTION_REALIGN:
1779 if ( hunk->o.data ==
'A' ) {
1784 }
else if ( hunk->o.data ==
'E' ) {
1797 case HUNK_TYPE_NONE:
1798 case HUNK_TYPE_SENTINAL:
1804 WARN( _(
"Unknown hunk type '%d'." ), hunk->
type );
1818 if ( diff->
failed == NULL )
1894 WARN( _(
"Failed to remove hunk type '%s'." ),
1895 hunk_prop[hunk.
type].name );
1924 return hunk_prop[t].name;
1932 return hunk_prop[t].tag;
1943 if ( hunk->
dtype == HUNK_DATA_STRING )
1944 free( hunk->
u.name );
1948 free( attr->value );
1962 xmlw_startElem( writer,
"diffs" );
1966 xmlw_elem( writer,
"diff",
"%s", diff->
data->
name );
1969 xmlw_endElem( writer );
1992 node = parent->xmlChildrenNode;
1994 if ( xml_isNode( node,
"diffs" ) ) {
1995 xmlNodePtr cur = node->xmlChildrenNode;
1997 if ( xml_isNode( cur,
"diff" ) ) {
1998 const char *diffName = xml_get( cur );
1999 if ( diffName == NULL ) {
2000 WARN( _(
"Expected node \"diff\" to contain the name of a "
2001 "unidiff. Was empty." ) );
2007 }
while ( xml_nextNode( cur ) );
2009 }
while ( xml_nextNode( node ) );
2022 Pilot *
const *pilots;
2045 for (
int i = 0; i <
array_size( pilots ); i++ ) {
2046 Pilot *p = pilots[i];
2048 p->nav_hyperspace = -1;
2053 if ( !pilot_isWithPlayer( p ) && pilot_isFlag( p, PILOT_HYPERSPACE ) )
2057 p, PILOT_HYPERSPACE );
2061 if ( pilot_isFlag( p, PILOT_HYP_BEGIN ) ||
2062 pilot_isFlag( p, PILOT_HYP_BRAKE ) ||
2063 pilot_isFlag( p, PILOT_HYP_PREP ) )
2085 if ( strcmp(
cur_system->jumps[i].target->name,
2088 player.p->nav_hyperspace = i;
2111 if ( defer && !enable )
Provides macros to work with dynamic arrays.
#define array_free(ptr_array)
Frees memory allocated and sets array to NULL.
#define array_create_size(basic_type, capacity)
Creates a new dynamic array of ‘basic_type’ with an initial capacity.
#define array_erase(ptr_array, first, last)
Erases elements in interval [first, last).
static ALWAYS_INLINE int array_size(const void *array)
Returns number of elements in the array.
#define array_grow(ptr_array)
Increases the number of elements by one and returns the last element.
#define array_shrink(ptr_array)
Shrinks memory to fit only ‘size’ elements.
#define array_push_back(ptr_array, element)
Adds a new element at the end of the array.
#define array_create(basic_type)
Creates a new dynamic array of ‘basic_type’.
void asteroids_computeInternals(AsteroidAnchor *a)
Updates internal alues of an asteroid field.
void asteroid_freeAnchor(AsteroidAnchor *ast)
Frees an asteroid anchor.
AsteroidTypeGroup * astgroup_getName(const char *name)
Gets an asteroid type group by name.
void asteroid_initAnchor(AsteroidAnchor *ast)
Initializes an asteroid anchor.
void economy_initialiseCommodityPrices(void)
Initialises commodity prices for the sinusoidal economy model.
int economy_execQueued(void)
Calls economy_refresh if an economy update is queued.
void faction_rmAlly(int f, int o)
Removes an ally from the faction's allies list.
void faction_rmEnemy(int f, int o)
Removes an enemy from the faction's enemies list.
int areEnemies(int a, int b)
Checks whether two factions are enemies.
const char * faction_name(int f)
Gets a factions "real" (internal) name.
int faction_setInvisible(int id, int state)
Sets the faction's invisible state.
void faction_addAlly(int f, int o)
Adds an ally to the faction's allies list.
void faction_addEnemy(int f, int o)
Adds an enemy to the faction's enemies list.
int faction_get(const char *name)
Gets a faction ID by name.
int areAllies(int a, int b)
Checks whether two factions are allies or not.
int diff_load(xmlNodePtr parent)
Loads the diffs.
char ** ndata_listRecursive(const char *path)
Lists all the visible files in a directory, at any depth.
xmlDocPtr xml_parsePhysFS(const char *filename)
Analogous to xmlParseMemory/xmlParseFile.
void pilot_hyperspaceAbort(Pilot *p)
Stops the pilot from hyperspacing.
Pilot *const * pilot_getAll(void)
Gets the pilot stack.
void pilot_delete(Pilot *p)
Deletes a pilot.
void player_targetHyperspaceSet(int id, int nomsg)
Sets the player's hyperspace target.
void player_targetSpobSet(int id)
Sets the player's target spob.
void safelanes_recalculate(void)
Update the safe lane locations in response to the universe changing (e.g., diff applied).
int diff_save(xmlTextWriterPtr writer)
Saves the active diffs.
void space_reconstructPresences(void)
Reset the presence of all systems.
void space_gfxUnload(StarSystem *sys)
Unloads all the graphics for a star system.
int spob_luaInit(Spob *spob)
Updatse the spob's internal Lua stuff.
void systems_reconstructJumps(void)
Reconstructs the jumps.
int system_addJump(StarSystem *sys, StarSystem *target)
Adds a jump point between two star systems.
int spob_getService(const char *name)
Converts name to spob service flag.
Spob * spob_get(const char *spobname)
Gets a spob based on its name.
int system_addVirtualSpob(StarSystem *sys, const char *spobname)
Adds a virtual spob to a system.
int spob_setFaction(Spob *p, int faction)
Changes the spobs faction.
StarSystem * system_get(const char *sysname)
Get the system from its name.
int spob_rmService(Spob *p, int service)
Removes a service from a spob.
int system_addSpob(StarSystem *sys, const char *spobname)
Adds a spob to a star system.
int system_rmVirtualSpob(StarSystem *sys, const char *spobname)
Removes a virtual spob from a system.
int spob_addService(Spob *p, int service)
Removes a service from a spob.
int system_rmJump(StarSystem *sys, StarSystem *target)
Removes a jump point from a star system.
void space_gfxLoad(StarSystem *sys)
Loads all the graphics for a star system.
int system_rmSpob(StarSystem *sys, const char *spobname)
Removes a spob from a star system.
Represents an asteroid field anchor.
AsteroidTypeGroup ** groups
Represents a group of asteroids.
const char *const * attrs
The representation of an in-game pilot.
Represents a Space Object (SPOB), including and not limited to planets, stations, wormholes,...
Universe diff filepath list.
Represents each Universe Diff.
union UniHunkTarget_t::@313272344000226026005312375073311105303321201365 u
Represents a single hunk in the diff.
union UniHunk_t::@304042144362124155373304222124203336037263233020 u
int tech_rmItemTech(tech_group_t *tech, const char *value)
Removes an item from a tech.
tech_group_t * tech_groupCreate(void)
Creates a tech group.
int tech_rmItem(const char *name, const char *value)
Removes a tech item.
int tech_addItemTech(tech_group_t *tech, const char *value)
Adds an item to a tech.
int tech_addItem(const char *name, const char *value)
Adds an item to a tech.
static UniDiffData_t * diff_available
static const char * diff_nav_hyperspace
static int diff_checkUpdateUniverse(void)
Checks and updates the universe if necessary.
static int diff_parseFaction(UniDiffData_t *diff, xmlNodePtr node)
Patches a faction.
int diff_init(void)
Loads available universe diffs.
void diff_exit(void)
Clean up after diffs.
static UniDiff_t * diff_get(const char *name)
Gets a diff by name.
static UniDiff_t * diff_stack
static int diff_parseTech(UniDiffData_t *diff, xmlNodePtr node)
Patches a tech.
int diff_load(xmlNodePtr parent)
Loads the diffs.
void unidiff_universeDefer(int enable)
Sets whether or not to defer universe change stuff.
static UniDiff_t * diff_newDiff(void)
Creates a new UniDiff_t for usage.
int diff_apply(const char *name)
Applies a diff to the universe.
static void diff_hunkSuccess(UniDiff_t *diff, const UniHunk_t *hunk)
Adds a hunk to the applied list.
static void diff_hunkFailed(UniDiff_t *diff, const UniHunk_t *hunk)
Adds a hunk to the failed list.
void diff_remove(const char *name)
Removes a diff from the universe.
void diff_end(void)
Cleans up after applying a set of diffs.
static void diff_cleanup(UniDiff_t *diff)
Cleans up a diff.
void diff_clear(void)
Removes all active diffs. (Call before economy_destroy().)
static int diff_applyInternal(const char *name, int oneshot)
Applies a diff to the universe.
int diff_revertHunk(const UniHunk_t *hunk)
Reverts a hunk.
void diff_cleanupHunk(UniHunk_t *hunk)
Cleans up a hunk.
static int diff_universe_changed
static void diff_parseAttr(UniHunk_t *hunk, xmlNodePtr node)
Parsess the attributes.
const char * diff_hunkTag(UniHunkType_t t)
Gets the XML tag of a hunk.
int diff_patchHunk(UniHunk_t *hunk)
Applies a hunk.
static int diff_universe_defer
static int diff_removeDiff(UniDiff_t *diff)
Removes a diff.
static int diff_parseSpob(UniDiffData_t *diff, xmlNodePtr node)
Patches a spob.
void diff_start(void)
Starts applying a set of diffs.
int diff_save(xmlTextWriterPtr writer)
Saves the active diffs.
int diff_isApplied(const char *name)
Checks if a diff is currently applied.
static int diff_parseSystem(UniDiffData_t *diff, xmlNodePtr node)
Patches a system.
const char * diff_hunkName(UniHunkType_t t)
Gets the human readable name of a hunk.
static const char * diff_nav_spob