/** * @brief Gets a system. * * Behaves differently depending on what you pass as param: <br/> * - string : Gets the system by name. <br/> * - planet : Gets the system by planet. <br/> * * @usage sys = system.get( p ) -- Gets system where planet 'p' is located. * @usage sys = system.get( "Gamma Polaris" ) -- Gets the system by name. * * @luaparam param Read description for details. * @luareturn System metatable matching param. * @luafunc get( param ) */ static int systemL_get( lua_State *L ) { LuaSystem sys; StarSystem *ss; Planet *pnt; /* Invalid by default. */ sys.id = -1; /* Passing a string (systemname) */ if (lua_isstring(L,1)) { ss = system_get( lua_tostring(L,1) ); if (ss != NULL) sys.id = system_index( ss ); } /* Passing a planet */ else if (lua_isplanet(L,1)) { pnt = luaL_validplanet(L,1); ss = system_get( planet_getSystem( pnt->name ) ); if (ss != NULL) sys.id = system_index( ss ); } else NLUA_INVALID_PARAMETER(L); /* Error checking. */ if (sys.id < 0) { NLUA_ERROR(L, "No matching systems found."); return 0; } /* return the system */ lua_pushsystem(L,sys); return 1; }
/** * @brief Applies a hunk and adds it to the diff. * * @param diff Diff to which the hunk belongs. * @param hunk Hunk to apply. * @return 0 on success. */ static int diff_patchHunk( UniHunk_t *hunk ) { Planet *p; switch (hunk->type) { /* Adding an asset. */ case HUNK_TYPE_ASSET_ADD: planet_updateLand( planet_get(hunk->u.name) ); return system_addPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Removing an asset. */ case HUNK_TYPE_ASSET_REMOVE: return system_rmPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Making an asset a black market. */ case HUNK_TYPE_ASSET_BLACKMARKET: planet_setBlackMarket( planet_get(hunk->u.name) ); return 0; /* Making an asset a legal market. */ case HUNK_TYPE_ASSET_LEGALMARKET: planet_rmFlag( planet_get(hunk->u.name), PLANET_BLACKMARKET ); return 0; /* Adding a Jump. */ case HUNK_TYPE_JUMP_ADD: return system_addJumpDiff( system_get(hunk->target.u.name), hunk->node ); /* Removing a jump. */ case HUNK_TYPE_JUMP_REMOVE: return system_rmJump( system_get(hunk->target.u.name), hunk->u.name ); /* Adding a tech. */ case HUNK_TYPE_TECH_ADD: return tech_addItem( hunk->target.u.name, hunk->u.name ); /* Removing a tech. */ case HUNK_TYPE_TECH_REMOVE: return tech_rmItem( hunk->target.u.name, hunk->u.name ); /* Changing asset faction. */ case HUNK_TYPE_ASSET_FACTION: p = planet_get( hunk->target.u.name ); if (p==NULL) return -1; hunk->o.name = faction_name( p->faction ); return planet_setFaction( p, faction_get(hunk->u.name) ); case HUNK_TYPE_ASSET_FACTION_REMOVE: return planet_setFaction( planet_get(hunk->target.u.name), faction_get(hunk->o.name) ); default: WARN("Unknown hunk type '%d'.", hunk->type); break; } return -1; }
/** * @brief Loads a claim. * * @param parent Parent node containing the claim data. * @return The system claim. */ SysClaim_t *claim_xmlLoad( xmlNodePtr parent ) { SysClaim_t *claim; xmlNodePtr node; StarSystem *sys; /* Create the claim. */ claim = claim_create(); /* Load the nodes. */ node = parent->xmlChildrenNode; do { if (xml_isNode(node,"sys")) { sys = system_get( xml_get(node) ); if (sys != NULL) claim_add( claim, system_index(sys) ); else WARN("System Claim trying to load system '%s' which doesn't exist.", xml_get(node)); } } while (xml_nextNode(node)); /* Activate the claim. */ claim_activate( claim ); return claim; }
/** * @brief Back-end for luaL_validjump. * * @param L Lua state to get jump from. * @param ind Index to check. * @param[out] offset How many Lua arguments were passed. * @param[out] sys System the jump exists in. * @return Jump found at the index in the state. * * @sa luaL_validjump */ static JumpPoint* luaL_validjumpSystem( lua_State *L, int ind, int *offset, StarSystem **outsys ) { LuaJump *lj; JumpPoint *jp; StarSystem *a, *b; /* Defaults. */ jp = NULL; a = NULL; b = NULL; if (lua_isjump(L, ind)) { lj = luaL_checkjump(L, ind); a = system_getIndex( lj->srcid ); b = system_getIndex( lj->destid ); if (offset != NULL) *offset = 1; } else if (lua_gettop(L) > 1) { if (lua_isstring(L, ind)) a = system_get( lua_tostring( L, ind )); else if (lua_issystem(L, ind)) a = system_getIndex( lua_tosystem(L, ind) ); if (lua_isstring(L, ind+1)) b = system_get( lua_tostring( L, ind+1 )); else if (lua_issystem(L, ind+1)) b = system_getIndex( lua_tosystem(L, ind+1) ); if (offset != NULL) *offset = 2; } else { luaL_typerror(L, ind, JUMP_METATABLE); return NULL; } if (b != NULL && a != NULL) jp = jump_getTarget( b, a ); if (jp == NULL) NLUA_ERROR(L, "Jump is invalid"); if (outsys != NULL) *outsys = a; return jp; }
/** * @brief Gets a jump. * * Possible values of params: <br/> * - string : Gets the jump by system name. <br/> * - system : Gets the jump by system. <br/> * * @usage j,r = jump.get( "Ogat", "Goddard" ) -- Returns the Ogat to Goddard and Goddard to Ogat jumps. * @luaparam param See description. * @luareturn Returns the jump and the inverse (where it exits). * @luafunc get( param ) */ static int jumpL_get( lua_State *L ) { LuaJump lj; StarSystem *a, *b; /* Defaults. */ a = NULL; b = NULL; if (lua_gettop(L) > 1) { if (lua_isstring(L, 1)) a = system_get( lua_tostring(L, 1)); else if (lua_issystem(L, 1)) a = system_getIndex( lua_tosystem(L, 1) ); if (lua_isstring(L, 2)) b = system_get( lua_tostring(L, 2)); else if (lua_issystem(L, 2)) b = system_getIndex( lua_tosystem(L, 2) ); if ((a == NULL) || (b == NULL)) { NLUA_ERROR(L, "No matching jump points found."); return 0; } if (jump_getTarget(b, a) != NULL) { lj.srcid = a->id; lj.destid = b->id; lua_pushjump(L, lj); /* The inverse. If it doesn't exist, there are bigger problems. */ lj.srcid = b->id; lj.destid = a->id; lua_pushjump(L, lj); return 2; } } else NLUA_INVALID_PARAMETER(L); return 0; }
/** * @brief Check to see if radius is mapped (known). * * @param targ_sys Name of the system in the center of the "known" circle. * @param r Radius to check (in jumps) if is mapped. * @return 1 if circle was already mapped, 0 if it wasn't. */ int map_isMapped( const char* targ_sys, int r ) { int i, dep, ret; StarSystem *sys, *jsys; SysNode *closed, *open, *cur, *neighbour; A_gc = NULL; open = closed = NULL; if (targ_sys == NULL) sys = cur_system; else sys = system_get( targ_sys ); open = A_newNode( sys, NULL ); open->r = 0; ret = 1; while ((cur = A_lowest(open)) != NULL) { /* Check if system is known. */ sys = cur->sys; dep = cur->r; if (!sys_isFlag(sys,SYSTEM_KNOWN)) { ret = 0; break; } /* We close the current system. */ open = A_rm( open, sys ); closed = A_add( closed, cur ); /* System is past the limit. */ if (dep+1 > r) continue; /* check it's jumps */ for (i=0; i<sys->njumps; i++) { jsys = system_getIndex( sys->jumps[i] ); /* SYstem has already been parsed. */ if (A_in(closed,jsys) != NULL) continue; /* create new node and such */ neighbour = A_newNode( jsys, NULL ); neighbour->r = dep+1; open = A_add( open, neighbour ); } } A_freeList(A_gc); return ret; }
/** * @brief Gets the current planet - MUST BE LANDED. * * @usage p,s = planet.cur() -- Gets current planet (assuming landed) * * @luatreturn Planet The planet the player is landed on. * @luatreturn System The system it is in. * @luafunc cur() */ static int planetL_cur( lua_State *L ) { LuaSystem sys; if (land_planet == NULL) { NLUA_ERROR(L,_("Attempting to get landed planet when player not landed.")); return 0; /* Not landed. */ } lua_pushplanet(L,planet_index(land_planet)); sys = system_index( system_get( planet_getSystem(land_planet->name) ) ); lua_pushsystem(L,sys); return 2; }
/** * @brief Gets the current planet - MUST BE LANDED. * * @usage p,s = planet.cur() -- Gets current planet (assuming landed) * * @luareturn The planet and system in belongs to. * @luafunc cur() */ static int planetL_cur( lua_State *L ) { LuaPlanet planet; LuaSystem sys; if (land_planet != NULL) { planet.p = land_planet; lua_pushplanet(L,planet); sys.s = system_get( planet_getSystem(land_planet->name) ); lua_pushsystem(L,sys); return 2; } NLUA_ERROR(L,"Attempting to get landed planet when player not landed."); return 0; /* Not landed. */ }
/** * @brief Gets the system corresponding to a planet. * @luatparam Planet p Planet to get system of. * @luatreturn System|nil The system to which the planet belongs or nil if it has none. * @luafunc system( p ) */ static int planetL_system( lua_State *L ) { LuaSystem sys; Planet *p; const char *sysname; /* Arguments. */ p = luaL_validplanet(L,1); sysname = planet_getSystem( p->name ); if (sysname == NULL) return 0; sys = system_index( system_get( sysname ) ); lua_pushsystem( L, sys ); return 1; }
/** * @brief Centers the map on a planet. * * @param sys System to center the map on. * @return 0 on success. */ int map_center( const char *sys ) { StarSystem *ssys; /* Get the system. */ ssys = system_get( sys ); if (sys == NULL) return -1; /* Center on the system. */ map_xpos = ssys->pos.x * map_zoom; map_ypos = ssys->pos.y * map_zoom; return 0; }
/** * @brief Marks maps around a radius of currenty system as known. * * @param targ_sys System at center of the "known" circle. * @param r Radius (in jumps) to mark as known. * @return 0 on success. */ int map_map( const char* targ_sys, int r ) { int i, dep; StarSystem *sys, *jsys; SysNode *closed, *open, *cur, *neighbour; A_gc = NULL; open = closed = NULL; if (targ_sys == NULL) sys = cur_system; else sys = system_get( targ_sys ); sys_setFlag(sys,SYSTEM_KNOWN); open = A_newNode( sys, NULL ); open->r = 0; while ((cur = A_lowest(open)) != NULL) { /* mark system as known and go to next */ sys = cur->sys; dep = cur->r; sys_setFlag(sys,SYSTEM_KNOWN); open = A_rm( open, sys ); closed = A_add( closed, cur ); /* check it's jumps */ for (i=0; i<sys->njumps; i++) { jsys = system_getIndex( cur->sys->jumps[i] ); /* System has already been parsed or is too deep */ if ((A_in(closed,jsys) != NULL) || (dep+1 > r)) continue; /* create new node and such */ neighbour = A_newNode( jsys, NULL ); neighbour->r = dep+1; open = A_add( open, neighbour ); } } A_freeList(A_gc); return 0; }
/** * @brief Gets system (or system name) at index raising an error if type doesn't match. * * @param L Lua state to get system from. * @param ind Index position of system. * @return The System at ind. */ StarSystem* luaL_validsystem( lua_State *L, int ind ) { LuaSystem *ls; StarSystem *s; if (lua_issystem(L, ind)) { ls = luaL_checksystem(L, ind); s = system_getIndex( ls->id ); } else if (lua_isstring(L, ind)) s = system_get( lua_tostring(L, ind) ); else { luaL_typerror(L, ind, FACTION_METATABLE); return NULL; } if (s == NULL) NLUA_ERROR(L, "System is invalid"); return s; }
/** * @brief Gets the base price of an commodity at a certain planet. * * @usage if o:priceAt( planet.get("Polaris Prime") ) > 100 then -- Checks price of an outfit at polaris prime * * @luaparam o Commodity to get information of. * @luaparam p Planet to get price at. * @luareturn The price of the commodity at the planet. * @luafunc priceAt( o, p ) */ static int commodityL_priceAt( lua_State *L ) { Commodity *c; Planet *p; StarSystem *sys; char *sysname; c = luaL_validcommodity(L,1); p = luaL_validplanet(L,2); sysname = planet_getSystem( p->name ); if (sysname == NULL) { NLUA_ERROR( L, "Planet '%s' does not belong to a system", p->name ); return 0; } sys = system_get( sysname ); if (sys == NULL) { NLUA_ERROR( L, "Planet '%s' can not find its system '%s'", p->name, sysname ); return 0; } lua_pushnumber( L, planet_commodityPrice( p, c ) ); return 1; }
/** * @brief Gets a planet. * * Possible values of param: * - nil : Gets the current landed planet or nil if there is none. * - bool : Gets a random planet. * - faction : Gets random planet belonging to faction matching the number. * - string : Gets the planet by name. * - table : Gets random planet belonging to any of the factions in the * table. * * @usage p,s = planet.get( "Anecu" ) -- Gets planet by name * @usage p,s = planet.get( faction.get( "Empire" ) ) -- Gets random Empire planet * @usage p,s = planet.get(true) -- Gets completely random planet * @usage p,s = planet.get( { faction.get("Empire"), faction.get("Dvaered") } ) -- Random planet belonging to Empire or Dvaered * @luaparam param See description. * @luareturn Returns the planet and the system it belongs to. * @luafunc get( param ) */ static int planetL_get( lua_State *L ) { int i; int *factions; int nfactions; char **planets; int nplanets; const char *rndplanet; LuaPlanet planet; LuaSystem sys; LuaFaction *f; rndplanet = NULL; nplanets = 0; /* Get the landed planet */ if (lua_gettop(L) == 0) { if (land_planet != NULL) { planet.p = land_planet; lua_pushplanet(L,planet); sys.s = system_get( planet_getSystem(land_planet->name) ); lua_pushsystem(L,sys); return 2; } NLUA_ERROR(L,"Attempting to get landed planet when player not landed."); return 0; /* Not landed. */ } /* If boolean return random. */ else if (lua_isboolean(L,1)) { planet.p = planet_get( space_getRndPlanet() ); lua_pushplanet(L,planet); sys.s = system_get( planet_getSystem(land_planet->name) ); lua_pushsystem(L,sys); return 2; } /* Get a planet by faction */ else if (lua_isfaction(L,1)) { f = lua_tofaction(L,1); planets = space_getFactionPlanet( &nplanets, &f->f, 1 ); } /* Get a planet by name */ else if (lua_isstring(L,1)) { rndplanet = lua_tostring(L,1); } /* Get a planet from faction list */ else if (lua_istable(L,1)) { /* Get table length and preallocate. */ nfactions = (int) lua_objlen(L,1); factions = malloc( sizeof(int) * nfactions ); /* Load up the table. */ lua_pushnil(L); i = 0; while (lua_next(L, -2) != 0) { f = lua_tofaction(L, -1); factions[i++] = f->f; lua_pop(L,1); } /* get the planets */ planets = space_getFactionPlanet( &nplanets, factions, nfactions ); free(factions); } else NLUA_INVALID_PARAMETER(); /* Bad Parameter */ /* No suitable planet found */ if ((rndplanet == NULL) && (nplanets == 0)) { free(planets); return 0; } /* Pick random planet */ else if (rndplanet == NULL) { rndplanet = planets[RNG(0,nplanets-1)]; free(planets); } /* Push the planet */ planet.p = planet_get(rndplanet); /* The real planet */ lua_pushplanet(L,planet); sys.s = system_get( planet_getSystem(rndplanet) ); lua_pushsystem(L,sys); return 2; }
/** * @brief Unpersists Lua data. * * @param L State to unperisist data into. * @param parent Node containing all the Lua persisted data. * @return 0 on success. */ static int nxml_unpersistDataNode( lua_State *L, xmlNodePtr parent ) { LuaPlanet p; LuaSystem s; LuaFaction f; LuaShip sh; LuaTime lt; Planet *pnt; StarSystem *ss; xmlNodePtr node; char *name, *type, *buf, *num; int keynum; node = parent->xmlChildrenNode; do { if (xml_isNode(node,"data")) { /* Get general info. */ xmlr_attr(node,"name",name); xmlr_attr(node,"type",type); /* Check to see if key is a number. */ xmlr_attr(node,"keynum",num); if (num != NULL) { keynum = 1; lua_pushnumber(L, atof(name)); free(num); } else lua_pushstring(L, name); /* handle data types */ /* Recursive tables. */ if (strcmp(type,"table")==0) { xmlr_attr(node,"name",buf); /* Create new table. */ lua_newtable(L); /* Save data. */ nxml_unpersistDataNode(L,node); /* Set table. */ free(buf); } else if (strcmp(type,"number")==0) lua_pushnumber(L,xml_getFloat(node)); else if (strcmp(type,"bool")==0) lua_pushboolean(L,xml_getInt(node)); else if (strcmp(type,"string")==0) lua_pushstring(L,xml_get(node)); else if (strcmp(type,"planet")==0) { pnt = planet_get(xml_get(node)); if (pnt != NULL) { p.id = planet_index(pnt); lua_pushplanet(L,p); } else WARN("Failed to load unexistent planet '%s'", xml_get(node)); } else if (strcmp(type,"system")==0) { ss = system_get(xml_get(node)); if (ss != NULL) { s.id = system_index( ss ); lua_pushsystem(L,s); } else WARN("Failed to load unexistent system '%s'", xml_get(node)); } else if (strcmp(type,"faction")==0) { f.f = faction_get(xml_get(node)); lua_pushfaction(L,f); } else if (strcmp(type,"ship")==0) { sh.ship = ship_get(xml_get(node)); lua_pushship(L,sh); } else if (strcmp(type,"time")==0) { lt.t = xml_getLong(node); lua_pushtime(L,lt); } else { WARN("Unknown lua data type!"); lua_pop(L,1); return -1; } /* Set field. */ lua_settable(L, -3); /* cleanup */ free(type); free(name); } } while (xml_nextNode(node)); return 0; }
/** * @brief Applies a hunk and adds it to the diff. * * @param diff Diff to which the hunk belongs. * @param hunk Hunk to apply. * @return 0 on success. */ static int diff_patchHunk( UniHunk_t *hunk ) { Planet *p; int a, b; switch (hunk->type) { /* Adding an asset. */ case HUNK_TYPE_ASSET_ADD: planet_updateLand( planet_get(hunk->u.name) ); return system_addPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Removing an asset. */ case HUNK_TYPE_ASSET_REMOVE: return system_rmPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Making an asset a black market. */ case HUNK_TYPE_ASSET_BLACKMARKET: planet_addService( planet_get(hunk->u.name), PLANET_SERVICE_BLACKMARKET ); return 0; /* Making an asset a legal market. */ case HUNK_TYPE_ASSET_LEGALMARKET: planet_rmService( planet_get(hunk->u.name), PLANET_SERVICE_BLACKMARKET ); return 0; /* Adding a Jump. */ case HUNK_TYPE_JUMP_ADD: return system_addJumpDiff( system_get(hunk->target.u.name), hunk->node ); /* Removing a jump. */ case HUNK_TYPE_JUMP_REMOVE: return system_rmJump( system_get(hunk->target.u.name), hunk->u.name ); /* Adding a tech. */ case HUNK_TYPE_TECH_ADD: return tech_addItem( hunk->target.u.name, hunk->u.name ); /* Removing a tech. */ case HUNK_TYPE_TECH_REMOVE: return tech_rmItem( hunk->target.u.name, hunk->u.name ); /* Changing asset faction. */ case HUNK_TYPE_ASSET_FACTION: p = planet_get( hunk->target.u.name ); if (p==NULL) return -1; hunk->o.name = faction_name( p->faction ); return planet_setFaction( p, faction_get(hunk->u.name) ); case HUNK_TYPE_ASSET_FACTION_REMOVE: return planet_setFaction( planet_get(hunk->target.u.name), faction_get(hunk->o.name) ); /* Making a faction visible. */ case HUNK_TYPE_FACTION_VISIBLE: return faction_setInvisible( faction_get(hunk->target.u.name), 0 ); /* Making a faction invisible. */ case HUNK_TYPE_FACTION_INVISIBLE: return faction_setInvisible( faction_get(hunk->target.u.name), 1 ); /* Making two factions allies. */ case HUNK_TYPE_FACTION_ALLY: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_addAlly( a, b ); faction_addAlly( b, a ); return 0; /* Making two factions enemies. */ case HUNK_TYPE_FACTION_ENEMY: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_addEnemy( a, b ); faction_addEnemy( b, a ); return 0; /* Making two factions neutral (removing enemy/ally statuses). */ case HUNK_TYPE_FACTION_NEUTRAL: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_rmAlly( a, b ); faction_rmAlly( b, a ); faction_rmEnemy( a, b ); faction_rmEnemy( b, a ); return 0; /* Resetting the alignment state of two factions. */ case HUNK_TYPE_FACTION_REALIGN: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (hunk->o.data == 'A') { faction_rmEnemy(a, b); faction_rmEnemy(b, a); faction_addAlly(a, b); faction_addAlly(b, a); } else if (hunk->o.data == 'E') { faction_rmAlly(a, b); faction_rmAlly(b, a); faction_addEnemy(a, b); faction_addAlly(b, a); } else { faction_rmAlly( a, b ); faction_rmAlly( b, a ); faction_rmEnemy( a, b ); faction_rmEnemy( b, a ); } return 0; default: WARN(_("Unknown hunk type '%d'."), hunk->type); break; } return -1; }
/** * @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; }
static int planetL_getBackend( lua_State *L, int landable ) { int i; int *factions; int nfactions; char **planets; int nplanets; const char *rndplanet; LuaSystem luasys; LuaFaction f; Planet *pnt; StarSystem *sys; char *sysname; rndplanet = NULL; planets = NULL; nplanets = 0; /* If boolean return random. */ if (lua_isboolean(L,1)) { pnt = planet_get( space_getRndPlanet(landable, 0, NULL) ); lua_pushplanet(L,planet_index( pnt )); luasys = system_index( system_get( planet_getSystem(pnt->name) ) ); lua_pushsystem(L,luasys); return 2; } /* Get a planet by faction */ else if (lua_isfaction(L,1)) { f = lua_tofaction(L,1); planets = space_getFactionPlanet( &nplanets, &f, 1, landable ); } /* Get a planet by name */ else if (lua_isstring(L,1)) { rndplanet = lua_tostring(L,1); if (landable) { pnt = planet_get( rndplanet ); if (pnt == NULL) { NLUA_ERROR(L, _("Planet '%s' not found in stack"), rndplanet); return 0; } /* Check if can land. */ planet_updateLand( pnt ); if (!pnt->can_land) return 0; } } /* Get a planet from faction list */ else if (lua_istable(L,1)) { /* Get table length and preallocate. */ nfactions = (int) lua_objlen(L,1); factions = malloc( sizeof(int) * nfactions ); /* Load up the table. */ lua_pushnil(L); i = 0; while (lua_next(L, -2) != 0) { if (lua_isfaction(L, -1)) factions[i++] = lua_tofaction(L, -1); lua_pop(L,1); } /* get the planets */ planets = space_getFactionPlanet( &nplanets, factions, nfactions, landable ); free(factions); } else NLUA_INVALID_PARAMETER(L); /* Bad Parameter */ /* No suitable planet found */ if ((rndplanet == NULL) && ((planets == NULL) || nplanets == 0)) return 0; /* Pick random planet */ else if (rndplanet == NULL) { planets = (char**) arrayShuffle( (void**)planets, nplanets ); for (i=0; i<nplanets; i++) { if (landable) { /* Check landing. */ pnt = planet_get( planets[i] ); if (pnt == NULL) continue; planet_updateLand( pnt ); if (!pnt->can_land) continue; } rndplanet = planets[i]; break; } free(planets); } /* Push the planet */ pnt = planet_get(rndplanet); /* The real planet */ if (pnt == NULL) { NLUA_ERROR(L, _("Planet '%s' not found in stack"), rndplanet); return 0; } sysname = planet_getSystem(rndplanet); if (sysname == NULL) { NLUA_ERROR(L, _("Planet '%s' is not placed in a system"), rndplanet); return 0; } sys = system_get( sysname ); if (sys == NULL) { NLUA_ERROR(L, _("Planet '%s' can't find system '%s'"), rndplanet, sysname); return 0; } lua_pushplanet(L,planet_index( pnt )); luasys = system_index( sys ); lua_pushsystem(L,luasys); return 2; }