/** * @brief Persists Lua data. * * @param writer XML Writer to use to persist stuff. * @param type Type of the data to save. * @param name Name of the data to save. * @param value Value of the data to save. * @return 0 on success. */ static int nxml_saveData( xmlTextWriterPtr writer, const char *type, const char *name, const char *value, int keynum ) { xmlw_startElem(writer,"data"); xmlw_attr(writer,"type","%s",type); xmlw_attr(writer,"name","%s",name); if (keynum) xmlw_attr(writer,"keynum","1"); xmlw_str(writer,"%s",value); xmlw_endElem(writer); /* "data" */ return 0; }
/** * @brief Saves player's standings with the factions. * * @param writer The xml writer to use. * @return 0 on success. */ int pfaction_save( xmlTextWriterPtr writer ) { int i; xmlw_startElem(writer,"factions"); for (i=1; i<faction_nstack; i++) { /* player is faction 0 */ xmlw_startElem(writer,"faction"); xmlw_attr(writer,"name","%s",faction_stack[i].name); xmlw_str(writer, "%f", faction_stack[i].player); xmlw_endElem(writer); /* "faction" */ } xmlw_endElem(writer); /* "factions" */ return 0; }
/** * @brief Saves player's standings with the factions. * * @param writer The xml writer to use. * @return 0 on success. */ int pfaction_save( xmlTextWriterPtr writer ) { int i; xmlw_startElem(writer,"factions"); for (i=1; i<faction_nstack; i++) { /* player is faction 0 */ /* Must not be static. */ if (faction_isFlag( &faction_stack[i], FACTION_STATIC )) continue; xmlw_startElem(writer,"faction"); xmlw_attr(writer,"name","%s",faction_stack[i].name); xmlw_str(writer, "%f", faction_stack[i].player); xmlw_endElem(writer); /* "faction" */ } xmlw_endElem(writer); /* "factions" */ return 0; }
/** * @brief Saves a star system. * * @param writer Write to use for saving the star system. * @param sys Star system to save. * @return 0 on success. */ int dsys_saveSystem( StarSystem *sys ) { int i; xmlDocPtr doc; xmlTextWriterPtr writer; const Planet **sorted_planets; const JumpPoint **sorted_jumps, *jp; char file[PATH_MAX], *cleanName; /* Reconstruct jumps so jump pos are updated. */ system_reconstructJumps(sys); /* Create the writer. */ writer = xmlNewTextWriterDoc(&doc, 0); if (writer == NULL) { WARN("testXmlwriterDoc: Error creating the xml writer"); return -1; } /* Set the writer parameters. */ xmlw_setParams( writer ); /* Start writer. */ xmlw_start(writer); xmlw_startElem( writer, "ssys" ); /* Attributes. */ xmlw_attr( writer, "name", "%s", sys->name ); /* General. */ xmlw_startElem( writer, "general" ); if (sys->background != NULL) xmlw_elem( writer, "background", "%s", sys->background ); xmlw_elem( writer, "radius", "%f", sys->radius ); xmlw_elem( writer, "stars", "%d", sys->stars ); xmlw_elem( writer, "interference", "%f", sys->interference ); xmlw_startElem( writer, "nebula" ); xmlw_attr( writer, "volatility", "%f", sys->nebu_volatility ); xmlw_str( writer, "%f", sys->nebu_density ); xmlw_endElem( writer ); /* "nebula" */ xmlw_endElem( writer ); /* "general" */ /* Position. */ xmlw_startElem( writer, "pos" ); xmlw_elem( writer, "x", "%f", sys->pos.x ); xmlw_elem( writer, "y", "%f", sys->pos.y ); xmlw_endElem( writer ); /* "pos" */ /* Planets. */ sorted_planets = malloc( sizeof(Planet*) * sys->nplanets); memcpy( sorted_planets, sys->planets, sizeof(Planet*) * sys->nplanets ); qsort( sorted_planets, sys->nplanets, sizeof(Planet*), dsys_compPlanet ); xmlw_startElem( writer, "assets" ); for (i=0; i<sys->nplanets; i++) xmlw_elem( writer, "asset", "%s", sorted_planets[i]->name ); xmlw_endElem( writer ); /* "assets" */ free(sorted_planets); /* Jumps. */ sorted_jumps = malloc( sizeof(JumpPoint*) * sys->njumps ); for (i=0; i<sys->njumps; i++) sorted_jumps[i] = &sys->jumps[i]; qsort( sorted_jumps, sys->njumps, sizeof(JumpPoint*), dsys_compJump ); xmlw_startElem( writer, "jumps" ); for (i=0; i<sys->njumps; i++) { jp = sorted_jumps[i]; xmlw_startElem( writer, "jump" ); xmlw_attr( writer, "target", "%s", jp->target->name ); /* Position. */ if (!jp_isFlag( jp, JP_AUTOPOS )) { xmlw_startElem( writer, "pos" ); xmlw_attr( writer, "x", "%f", jp->pos.x ); xmlw_attr( writer, "y", "%f", jp->pos.y ); xmlw_endElem( writer ); /* "pos" */ } else xmlw_elemEmpty( writer, "autopos" ); /* Radius and misc properties. */ if (jp->radius != 200.) xmlw_elem( writer, "radius", "%f", jp->radius ); /* More flags. */ if (jp_isFlag( jp, JP_HIDDEN )) xmlw_elemEmpty( writer, "hidden" ); if (jp_isFlag( jp, JP_EXITONLY )) xmlw_elemEmpty( writer, "exitonly" ); xmlw_elem( writer, "hide", "%f", sqrt(jp->hide) ); xmlw_endElem( writer ); /* "jump" */ } xmlw_endElem( writer ); /* "jumps" */ free(sorted_jumps); xmlw_endElem( writer ); /** "ssys" */ xmlw_done(writer); /* No need for writer anymore. */ xmlFreeTextWriter(writer); /* Write data. */ cleanName = uniedit_nameFilter( sys->name ); nsnprintf( file, sizeof(file), "%s/%s.xml", conf.dev_save_sys, cleanName ); xmlSaveFileEnc( file, doc, "UTF-8" ); /* Clean up. */ xmlFreeDoc(doc); free(cleanName); return 0; }
/** * @brief Saves the player's active missions. * * @param writer XML Write to use to save missions. * @return 0 on success. */ int missions_saveActive( xmlTextWriterPtr writer ) { int i,j,n; int nitems; char **items; xmlw_startElem(writer,"missions"); for (i=0; i<MISSION_MAX; i++) { if (player_missions[i]->id != 0) { xmlw_startElem(writer,"mission"); /* data and id are attributes because they must be loaded first */ xmlw_attr(writer,"data","%s",player_missions[i]->data->name); xmlw_attr(writer,"id","%u",player_missions[i]->id); xmlw_elem(writer,"title","%s",player_missions[i]->title); xmlw_elem(writer,"desc","%s",player_missions[i]->desc); xmlw_elem(writer,"reward","%s",player_missions[i]->reward); /* Markers. */ xmlw_startElem( writer, "markers" ); if (player_missions[i]->markers != NULL) { n = array_size( player_missions[i]->markers ); for (j=0; j<n; j++) { xmlw_startElem(writer,"marker"); xmlw_attr(writer,"id","%d",player_missions[i]->markers[j].id); xmlw_attr(writer,"type","%d",player_missions[i]->markers[j].type); xmlw_str(writer,"%s", system_getIndex(player_missions[i]->markers[j].sys)->name); xmlw_endElem(writer); /* "marker" */ } } xmlw_endElem( writer ); /* "markers" */ /* Cargo */ xmlw_startElem(writer,"cargos"); for (j=0; j<player_missions[i]->ncargo; j++) xmlw_elem(writer,"cargo","%u", player_missions[i]->cargo[j]); xmlw_endElem(writer); /* "cargos" */ /* OSD. */ if (player_missions[i]->osd > 0) { xmlw_startElem(writer,"osd"); /* Save attributes. */ items = osd_getItems(player_missions[i]->osd, &nitems); xmlw_attr(writer,"title","%s",osd_getTitle(player_missions[i]->osd)); xmlw_attr(writer,"nitems","%d",nitems); xmlw_attr(writer,"active","%d",osd_getActive(player_missions[i]->osd)); /* Save messages. */ for (j=0; j<nitems; j++) xmlw_elem(writer,"msg","%s",items[j]); xmlw_endElem(writer); /* "osd" */ } /* Claims. */ xmlw_startElem(writer,"claims"); claim_xmlSave( writer, player_missions[i]->claims ); xmlw_endElem(writer); /* "claims" */ /* Write Lua magic */ xmlw_startElem(writer,"lua"); nxml_persistLua( player_missions[i]->L, writer ); xmlw_endElem(writer); /* "lua" */ xmlw_endElem(writer); /* "mission" */ } } xmlw_endElem(writer); /* "missions" */ return 0; }