/** * @brief Gets the planet's faction. * * @usage f = p:faction() * @luatparam Planet p Planet to get the faction of. * @luatreturn Faction The planet's faction. * @luafunc faction( p ) */ static int planetL_faction( lua_State *L ) { Planet *p; p = luaL_validplanet(L,1); if (p->faction < 0) return 0; lua_pushfaction(L, p->faction); return 1; }
/** * @brief Gets the planet's faction. * * @usage f = p:faction() * @luaparam p Planet to get the faction of. * @luareturn The planet's faction. * @luafunc faction( p ) */ static int planetL_faction( lua_State *L ) { LuaPlanet *p; LuaFaction f; p = luaL_checkplanet(L,1); if (p->p->faction < 0) return 0; f.f = p->p->faction; lua_pushfaction(L, f); return 1; }
/** * @brief Gets system faction. * * @luatparam System s System to get the faction of. * @luatreturn Faction The dominant faction in the system. * @luafunc faction( s ) */ static int systemL_faction( lua_State *L ) { StarSystem *s; s = luaL_validsystem(L,1); if (s->faction == -1) return 0; lua_pushfaction(L,s->faction); return 1; }
/** * @brief Gets the faction based on its name. * * @usage f = faction.get( "Empire" ) * * @luaparam name Name of the faction to get. * @luareturn The faction matching name. * @luafunc get( name ) */ static int factionL_get( lua_State *L ) { LuaFaction f; const char *name; name = luaL_checkstring(L,1); f.f = faction_get(name); if (f.f < 0) { NLUA_ERROR(L,"Faction '%s' not found in stack.", name ); return 0; } lua_pushfaction(L,f); return 1; }
/** * @brief Gets system faction. * * @luaparam s System to get the faction of. * @luareturn The dominant faction in the system. * @luafunc faction( s ) */ static int systemL_faction( lua_State *L ) { LuaFaction lf; StarSystem *s; s = luaL_validsystem(L,1); if (s->faction == -1) return 0; else lf.f = s->faction; lua_pushfaction(L,lf); return 1; }
/** * @brief Gets the allies of the faction. * * @usage for k,v in pairs(f:allies()) do -- Iterate over faction allies * * @luatparam Faction f Faction to get allies of. * @luatreturn {Faction,...} A table containing the allies of the faction. * @luafunc allies( f ) */ static int factionL_allies( lua_State *L ) { int i, n, f; int *factions; f = luaL_validfaction(L,1); /* Push the enemies in a table. */ lua_newtable(L); factions = faction_getAllies( f, &n ); for (i=0; i<n; i++) { lua_pushnumber(L, i+1); /* key */ lua_pushfaction(L, factions[i]); /* value */ lua_rawset(L, -3); } return 1; }
/** * @brief Gets the factions the mission is available for. * * @usage f = misn.factions() * @luareturn A containing the factions for whom the mission is available. * @luafunc factions() */ static int misn_factions( lua_State *L ) { int i; MissionData *dat; LuaFaction f; dat = cur_mission->data; /* we'll push all the factions in table form */ lua_newtable(L); for (i=0; i<dat->avail.nfactions; i++) { lua_pushnumber(L,i+1); /* index, starts with 1 */ f.f = dat->avail.factions[i]; lua_pushfaction(L, f); /* value */ lua_rawset(L,-3); /* store the value in the table */ } return 1; }
/** * @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; }