/** * @brief Parses the actual individual event nodes. * * @param parent Parent node to parse. * @return 0 on success. */ static int events_parseActive( xmlNodePtr parent ) { char *buf; unsigned int id; int data; xmlNodePtr node, cur; Event_t *ev; node = parent->xmlChildrenNode; do { if (!xml_isNode(node,"event")) continue; xmlr_attr(node,"name",buf); if (buf==NULL) { WARN("Event has missing 'name' attribute, skipping."); continue; } data = event_dataID( buf ); if (data < 0) { WARN("Event in save has name '%s' but event data not found matching name. Skipping.", buf); free(buf); continue; } free(buf); xmlr_attr(node,"id",buf); if (buf==NULL) { WARN("Event with data '%s' has missing 'id' attribute, skipping.", event_dataName(data)); continue; } id = atoi(buf); free(buf); if (id==0) { WARN("Event with data '%s' has invalid 'id' attribute, skipping.", event_dataName(data)); continue; } /* Create the event. */ event_create( data, &id ); ev = event_get( id ); if (ev == NULL) { WARN("Event with data '%s' was not created, skipping.", event_dataName(data)); continue; } ev->save = 1; /* Should save by default again. */ /* Get the data. */ cur = node->xmlChildrenNode; do { if (xml_isNode(cur,"lua")) nxml_unpersistLua( ev->L, cur ); } while (xml_nextNode(cur)); /* Claims. */ if (xml_isNode(node,"claims")) ev->claims = claim_xmlLoad( node ); } while (xml_nextNode(node)); return 0; }
/** * @brief Parses the actual individual mission nodes. * * @param parent Parent node to parse. * @return 0 on success. */ static int missions_parseActive( xmlNodePtr parent ) { Mission *misn; MissionData *data; int m, i; char *buf; char *title; const char **items; int nitems; int id, sys, type; StarSystem *ssys; xmlNodePtr node, cur, nest; m = 0; /* start with mission 0 */ node = parent->xmlChildrenNode; do { if (xml_isNode(node,"mission")) { misn = player_missions[m]; /* process the attributes to create the mission */ xmlr_attr(node,"data",buf); data = mission_get(mission_getID(buf)); if (data == NULL) { WARN("Mission '%s' from savegame not found in game - ignoring.", buf); free(buf); continue; } else { if (mission_init( misn, data, 0, 0, NULL )) { WARN("Mission '%s' from savegame failed to load properly - ignoring.", buf); free(buf); continue; } misn->accepted = 1; } free(buf); /* this will orphan an identifier */ xmlr_attr(node,"id",buf); misn->id = atol(buf); free(buf); cur = node->xmlChildrenNode; do { xmlr_strd(cur,"title",misn->title); xmlr_strd(cur,"desc",misn->desc); xmlr_strd(cur,"reward",misn->reward); /* Get the markers. */ if (xml_isNode(cur,"markers")) { nest = cur->xmlChildrenNode; do { if (xml_isNode(nest,"marker")) { /* Get ID. */ xmlr_attr(nest,"id",buf); id = (buf != NULL) ? atoi(buf) : -1; if (buf != NULL) free(buf); /* Get type. */ xmlr_attr(nest,"type",buf); type = (buf != NULL) ? atoi(buf) : -1; if (buf != NULL) free(buf); /* Get system. */ ssys = system_get( xml_get( nest )); if (ssys == NULL) { WARN( "System Marker to '%s' does not exist", xml_get( nest ) ); continue; } sys = system_index( ssys ); mission_addMarker( misn, id, sys, type ); } } while (xml_nextNode(nest)); } /* Cargo. */ if (xml_isNode(cur,"cargos")) { nest = cur->xmlChildrenNode; do { if (xml_isNode(nest,"cargo")) mission_linkCargo( misn, xml_getLong(nest) ); } while (xml_nextNode(nest)); } /* OSD. */ if (xml_isNode(cur,"osd")) { xmlr_attr(cur,"nitems",buf); if (buf != NULL) { nitems = atoi(buf); free(buf); } else continue; xmlr_attr(cur,"title",title); items = malloc( nitems * sizeof(char*) ); i = 0; nest = cur->xmlChildrenNode; do { if (xml_isNode(nest,"msg")) { if (i > nitems) { WARN("Inconsistency with 'nitems' in savefile."); break; } items[i] = xml_get(nest); i++; } } while (xml_nextNode(nest)); /* Create the osd. */ misn->osd = osd_create( title, nitems, items, data->avail.priority ); free(items); free(title); /* Set active. */ xmlr_attr(cur,"active",buf); if (buf != NULL) { osd_active( misn->osd, atoi(buf) ); free(buf); } } /* Claims. */ if (xml_isNode(cur,"claims")) misn->claims = claim_xmlLoad( cur ); if (xml_isNode(cur,"lua")) /* start the unpersist routine */ nxml_unpersistLua( misn->L, cur ); } while (xml_nextNode(cur)); m++; /* next mission */ if (m >= MISSION_MAX) break; /* full of missions, must be an error */ } } while (xml_nextNode(node)); return 0; }