/** * @brief Sets active in mission OSD. * * @note Uses Lua indexes, so 1 is first member, 2 is second and so on. * * @luaparam n Element of the OSD to make active. * @luafunc osdActive( n ) */ static int misn_osdActive( lua_State *L ) { int n; Mission *cur_mission; n = luaL_checkint(L,1); n = n-1; /* Convert to C index. */ cur_mission = misn_getFromLua(L); if (cur_mission->osd != 0) osd_active( cur_mission->osd, n ); 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; }