[Add] Added faction metatable to Lua API.
This commit is contained in:
		
							parent
							
								
									751bbbefe8
								
							
						
					
					
						commit
						571b801a49
					
				
							
								
								
									
										358
									
								
								src/llua_faction.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								src/llua_faction.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,358 @@ | ||||
| /**
 | ||||
|  * @file llua_faction.c | ||||
|  * | ||||
|  * @breif Handle the Lua faction bindings. | ||||
|  * | ||||
|  * These bindings control the faction. | ||||
|  */ | ||||
| 
 | ||||
| #include "lauxlib.h" | ||||
| 
 | ||||
| #include "log.h" | ||||
| #include "lephisto.h" | ||||
| #include "llua.h" | ||||
| #include "lluadef.h" | ||||
| #include "faction.h" | ||||
| #include "llua_faction.h" | ||||
| 
 | ||||
| static int factionL_createmetatable(lua_State* L, int readonly); | ||||
| 
 | ||||
| /* Faction metatable methods. */ | ||||
| static int factionL_eq(lua_State* L); | ||||
| static int factionL_name(lua_State* L); | ||||
| static int factionL_longname(lua_State* L); | ||||
| static int factionL_areenemies(lua_State* L); | ||||
| static int factionL_areallies(lua_State* L); | ||||
| static int factionL_modplayer(lua_State* L); | ||||
| static int factionL_modplayerraw(lua_State* L); | ||||
| static int factionL_playerstanding(lua_State* L); | ||||
| static const luaL_reg faction_methods[] = { | ||||
|   { "__eq",             factionL_eq             }, | ||||
|   { "name",             factionL_name           }, | ||||
|   { "longname",         factionL_longname       }, | ||||
|   { "areEnemeies",      factionL_areenemies     }, | ||||
|   { "areAllies",        factionL_areallies      }, | ||||
|   { "modPlayer",        factionL_modplayer      }, | ||||
|   { "modPlayerRaw",     factionL_modplayerraw   }, | ||||
|   { "playerStanding",   factionL_playerstanding }, | ||||
|   { 0, 0 } | ||||
| }; /**< Faction metatable methods. */ | ||||
| 
 | ||||
| static const luaL_reg faction_methods_cond[] = { | ||||
|   { "__eq",             factionL_eq             }, | ||||
|   { "name",             factionL_name           }, | ||||
|   { "longname",         factionL_longname       }, | ||||
|   { "areEnemeies",      factionL_areenemies     }, | ||||
|   { "areAllies",        factionL_areallies      }, | ||||
|   { "playerStanding",   factionL_playerstanding }, | ||||
|   { 0, 0 } | ||||
| }; | ||||
| 
 | ||||
| /* Global faction functions. */ | ||||
| static int factionL_get(lua_State* L); | ||||
| static const luaL_reg factionL_methods[] = { | ||||
|   { "get", faction_get }, | ||||
|   { 0, 0 } | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn int lua_loadFaction(lua_State* L, int readonly) | ||||
|  * | ||||
|  * @brief Load the faction library. | ||||
|  *    @param L State to load faction library into. | ||||
|  *    @return 0 on success. | ||||
|  */ | ||||
| int lua_loadFaction(lua_State* L, int readonly) { | ||||
|   /* Register the faction functions. */ | ||||
|   luaL_register(L, "faction", factionL_methods); | ||||
| 
 | ||||
|   /* Register the metatables. */ | ||||
|   factionL_createmetatable(L, readonly); | ||||
| 
 | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_createmetatable(lua_State* L, int readonly) | ||||
|  * | ||||
|  * @brief Register the faction metatable. | ||||
|  *    @param L Lua state to register metatable into. | ||||
|  *    @param readonly Whether table should be readonly. | ||||
|  *    @return 0 on success. | ||||
|  */ | ||||
| static int factionL_createmetatable(lua_State* L, int readonly) { | ||||
|   /* Create metatable. */ | ||||
|   luaL_newmetatable(L, FACTION_METATABLE); | ||||
| 
 | ||||
|   /* Create the access table. */ | ||||
|   lua_pushvalue(L, -1); | ||||
|   lua_setfield(L, -2, "__index"); | ||||
| 
 | ||||
|   /* Register the values. */ | ||||
|   luaL_register(L, NULL, (readonly) ? faction_methods_cond : faction_methods); | ||||
| 
 | ||||
|   return 0; /* No error. */ | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @defgroup FACTION Faction Lua bindings. | ||||
|  * | ||||
|  * @brief Lua bindings to deal with factions. | ||||
|  * | ||||
|  * Use with: | ||||
|  * @code | ||||
|  * faction.func(params) | ||||
|  * @endcode | ||||
|  * | ||||
|  * @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_get(lua_State* L) | ||||
|  * | ||||
|  * @brief faction get(string name) | ||||
|  * | ||||
|  * Get the faction based on its name. | ||||
|  *    @param name Name of the faction to get. | ||||
|  *    @return The faction matching name. | ||||
|  */ | ||||
| static int factionL_get(lua_State* L) { | ||||
|   LuaFaction f; | ||||
|   char* name; | ||||
| 
 | ||||
|   if(lua_isstring(L, 1)) name = (char*) lua_tostring(L, 1); | ||||
|   else LLUA_INVALID_PARAMETER(); | ||||
| 
 | ||||
|   f.f = faction_get(name); | ||||
|   lua_pushfaction(L, f); | ||||
|   return 1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  *  @defgroup META_FACTION Faction Metatable. | ||||
|  * | ||||
|  *  @brief The faction metatable is a way to represent a faction in Lua. | ||||
|  * | ||||
|  *  It allows all sorts of operators making it much more natural to use. | ||||
|  * | ||||
|  *  To call members of the metatable always use: | ||||
|  * | ||||
|  *  @code | ||||
|  *  faction:function(param) | ||||
|  *  @endcode | ||||
|  * | ||||
|  *  @{ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn LuaFaction* lua_tofaction(lua_State* L, int ind) | ||||
|  * | ||||
|  * @brief Get faction at index. | ||||
|  *    @param L Lua state to get faction from. | ||||
|  *    @param ind Index position to find the faction. | ||||
|  *    @return Faction found at the index in the state. | ||||
|  */ | ||||
| LuaFaction* lua_tofaction(lua_State* L, int ind) { | ||||
|   if(lua_isuserdata(L, ind)) { | ||||
|     return (LuaFaction*) lua_touserdata(L, ind); | ||||
|   } | ||||
| 
 | ||||
|   luaL_typerror(L, ind, FACTION_METATABLE); | ||||
|   return NULL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn LuaFaction* lua_pushfaction(lua_State* L, LuaFaction faction) | ||||
|  * | ||||
|  * @brief Pushes a faction on the stack. | ||||
|  *    @param L lua state to push faction into. | ||||
|  *    @param faction Faction to push. | ||||
|  *    @return Newly pushed faction. | ||||
|  */ | ||||
| LuaFaction* lua_pushfaction(lua_State* L, LuaFaction faction) { | ||||
|   LuaFaction* f; | ||||
|   f = (LuaFaction*) lua_newuserdata(L, sizeof(LuaFaction)); | ||||
|   *f = faction; | ||||
|   luaL_getmetatable(L, FACTION_METATABLE); | ||||
|   lua_setmetatable(L, -2); | ||||
|   return f; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn int lua_isfaction(lua_State* L, int ind) | ||||
|  * | ||||
|  * @brief Check to see if ind is a faction. | ||||
|  *    @param L Lua state to check. | ||||
|  *    @param ind Index position to check. | ||||
|  *    @return 1 if ind is a faction. | ||||
|  */ | ||||
| int lua_isfaction(lua_State* L, int ind) { | ||||
|   int ret; | ||||
| 
 | ||||
|   if(lua_getmetatable(L, ind)==0) | ||||
|     return 0; | ||||
|   lua_getfield(L, LUA_REGISTRYINDEX, FACTION_METATABLE); | ||||
| 
 | ||||
|   ret = 0; | ||||
|   if(lua_rawequal(L, -1, -2)) /* Does it have the correct mt? */ | ||||
|     ret = 1; | ||||
| 
 | ||||
|   lua_pop(L, 2); /* Remove both metatables. */ | ||||
|   return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_eq(lua_State* L) | ||||
|  * | ||||
|  * @brief bool __eq(faction comp) | ||||
|  * | ||||
|  * __eq (equality) metamethod for factions. | ||||
|  * | ||||
|  * You can use the '=' operator within Lua to compare factions with this. | ||||
|  *    @param comp faction to compare against. | ||||
|  *    @return true if both factions are the same. | ||||
|  */ | ||||
| static int factionL_eq(lua_State* L) { | ||||
|   LuaFaction* a, *b; | ||||
|   a = lua_tofaction(L, 1); | ||||
|   b = lua_tofaction(L, 2); | ||||
|   lua_pushboolean(L, a->f == b->f); | ||||
|   return 1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_name(lua_State* L) | ||||
|  * | ||||
|  * @brief string name(nil) | ||||
|  * | ||||
|  * Get the faction's name. | ||||
|  *    @return The name of the faction. | ||||
|  */ | ||||
| static int factionL_name(lua_State* L) { | ||||
|   LuaFaction* f; | ||||
|   f = lua_tofaction(L, 1); | ||||
|   lua_pushstring(L, faction_name(f->f)); | ||||
|   return 1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_longname(lua_State* L) | ||||
|  * | ||||
|  * @brief string longname(nil) | ||||
|  * | ||||
|  * Get the factions long name. | ||||
|  *    @return The long name of the faction. | ||||
|  */ | ||||
| static int factionL_longname(lua_State* L) { | ||||
|   LuaFaction* f; | ||||
|   f = lua_tofaction(L, 1); | ||||
|   lua_pushstring(L, faction_longname(f->f)); | ||||
|   return 1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_areenemeies(lua_State* L) | ||||
|  * | ||||
|  * @brief bool areenemies(faction f) | ||||
|  * | ||||
|  * Check to see if f is an enemy. | ||||
|  *    @param f Faction to check if is an enemy. | ||||
|  *    @return true if they are enemeies, false if they aren't. | ||||
|  */ | ||||
| static int factionL_areenemies(lua_State* L) { | ||||
|   LuaFaction* f, *ff; | ||||
|   f = lua_tofaction(L, 1); | ||||
|   if(lua_isfaction(L, 2)) ff = lua_tofaction(L, 2); | ||||
|   else LLUA_INVALID_PARAMETER(); | ||||
| 
 | ||||
|   lua_pushboolean(L, areEnemies(f->f, ff->f)); | ||||
|   return 1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_areallies(lua_State* L) | ||||
|  * | ||||
|  * @brief bool areEnemies(faction f) | ||||
|  * | ||||
|  * Check to see if f is an enemy. | ||||
|  *    @param f Faction to check if is an enemy. | ||||
|  *    @return true if they are enemies, false if they aren't. | ||||
|  */ | ||||
| static int factionL_areallies(lua_State* L) { | ||||
|   LuaFaction* f, *ff; | ||||
|   f = lua_tofaction(L, 1); | ||||
|   if(lua_isfaction(L, 2)) ff = lua_tofaction(L, 2); | ||||
|   else LLUA_INVALID_PARAMETER(); | ||||
| 
 | ||||
|   lua_pushboolean(L, areAllies(f->f, ff->f)); | ||||
|   return 1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_modplayer(lua_State* L) | ||||
|  * | ||||
|  * @brief modPlayer(number mod) | ||||
|  * | ||||
|  * Modifies the players standing with the faction. | ||||
|  *    @param mod The modifier to modify faction by. | ||||
|  */ | ||||
| static int factionL_modplayer(lua_State* L) { | ||||
|   LuaFaction* f; | ||||
|   int n; | ||||
|   f = lua_tofaction(L, 1); | ||||
| 
 | ||||
|   if(lua_isnumber(L, 2)) n = lua_tonumber(L, 2); | ||||
|   else LLUA_INVALID_PARAMETER(); | ||||
| 
 | ||||
|   faction_modPlayer(f->f, n); | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_modplayerraw(lua_State* L) | ||||
|  * | ||||
|  * @brief modPlayerRaw(number mod) | ||||
|  * | ||||
|  * Modifies the players standing with the faction. | ||||
|  * | ||||
|  * Does not affect other faction standings. | ||||
|  *    @param mod The modifier to modify faction by. | ||||
|  */ | ||||
| static int factionL_modplayerraw(lua_State* L) { | ||||
|   LuaFaction* f; | ||||
|   int n; | ||||
|   f = lua_tofaction(L, 1); | ||||
| 
 | ||||
|   if(lua_isnumber(L, 2)) n = lua_tonumber(L, 2); | ||||
|   else LLUA_INVALID_PARAMETER(); | ||||
| 
 | ||||
|   faction_modPlayerRaw(f->f, n); | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @fn static int factionL_playerstanding(lua_State* L) | ||||
|  * | ||||
|  * @brief number, string playerStanding(nil) | ||||
|  * | ||||
|  * Get the players standing with the faction. | ||||
|  *    @return The value of the standing and the human readable string. | ||||
|  */ | ||||
| static int factionL_playerstanding(lua_State* L) { | ||||
|   LuaFaction* f; | ||||
|   int n; | ||||
|   f = lua_tofaction(L, 1); | ||||
|   n = faction_getPlayer(f->f); | ||||
|   lua_pushnumber(L, n); | ||||
|   lua_pushstring(L, faction_getStanding(n)); | ||||
|   return 1; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @} | ||||
|  */ | ||||
| 
 | ||||
							
								
								
									
										17
									
								
								src/llua_faction.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/llua_faction.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #define FACTION_METATABLE "Faction" | ||||
| 
 | ||||
| /* Lua wrappers. */ | ||||
| typedef struct LuaFaction_s { | ||||
|   int f; | ||||
| } LuaFaction; | ||||
| 
 | ||||
| /* Load the space library. */ | ||||
| int lua_loadFaction(lua_State* L, int readonly); | ||||
| 
 | ||||
| /* Faction operations. */ | ||||
| LuaFaction* lua_tofaction(lua_State* L, int ind); | ||||
| LuaFaction* lua_pushfaction(lua_State* L, LuaFaction faction); | ||||
| int lua_isfaction(lua_State* L, int ind); | ||||
| 
 | ||||
| @ -8,8 +8,10 @@ | ||||
| 
 | ||||
| #include "lauxlib.h" | ||||
| #include "lephisto.h" | ||||
| #include "llua_space.h" | ||||
| #include "llua.h" | ||||
| #include "lluadef.h" | ||||
| #include "llua_space.h" | ||||
| #include "llua_faction.h" | ||||
| #include "rng.h" | ||||
| #include "pilot.h" | ||||
| #include "player.h" | ||||
| @ -518,19 +520,25 @@ static int pilotL_setFaction(lua_State* L) { | ||||
|   LLUA_MIN_ARGS(2); | ||||
|   Pilot* p; | ||||
|   LuaPilot* lp; | ||||
|   LuaFaction* f; | ||||
|   int fid; | ||||
|   char* faction; | ||||
| 
 | ||||
|   /* Parse parameters. */ | ||||
|   lp = lua_topilot(L, 1); | ||||
|   if(lua_isstring(L, 2)) | ||||
|   if(lua_isstring(L, 2)) { | ||||
|     faction = (char*)lua_tostring(L,2); | ||||
|     fid = faction_get(faction); | ||||
|   } | ||||
|   else if(lua_isfaction(L, 2)) { | ||||
|     f = lua_tofaction(L, 2); | ||||
|     fid = f->f; | ||||
|   } | ||||
|   else LLUA_INVALID_PARAMETER(); | ||||
| 
 | ||||
|   /* Get pilot/faction. */ | ||||
|   p = pilot_get(lp->pilot); | ||||
|   if(p == NULL) return 0; | ||||
|   fid = faction_get(faction); | ||||
| 
 | ||||
|   /* Set the new faction. */ | ||||
|   p->faction = fid; | ||||
|  | ||||
| @ -4,7 +4,9 @@ | ||||
| #include "lephisto.h" | ||||
| #include "rng.h" | ||||
| #include "land.h" | ||||
| #include "llua.h" | ||||
| #include "lluadef.h" | ||||
| #include "llua_faction.h" | ||||
| #include "map.h" | ||||
| #include "llua_space.h" | ||||
| 
 | ||||
| @ -203,6 +205,7 @@ static int planetL_get(lua_State* L) { | ||||
|   char*     rndplanet; | ||||
|   LuaPlanet planet; | ||||
|   LuaSystem sys; | ||||
|   LuaFaction* f; | ||||
| 
 | ||||
|   rndplanet = NULL; | ||||
|   nplanets = 0; | ||||
| @ -220,9 +223,9 @@ static int planetL_get(lua_State* L) { | ||||
|   } | ||||
| 
 | ||||
|   /* Get a planet by faction */ | ||||
|   else if(lua_isnumber(L, 1)) { | ||||
|     i = lua_tonumber(L, 1); | ||||
|     planets = space_getFactionPlanet(&nplanets, &i, 1); | ||||
|   else if(lua_isfaction(L, 1)) { | ||||
|     f = lua_tofaction(L, 1); | ||||
|     planets = space_getFactionPlanet(&nplanets, &f->f, 1); | ||||
|   } | ||||
| 
 | ||||
|   /* Get a planet by name. */ | ||||
| @ -237,9 +240,9 @@ static int planetL_get(lua_State* L) { | ||||
|     nfactions = (int)lua_gettop(L); | ||||
|     factions = malloc(sizeof(int) * nfactions); | ||||
|     i = 0; | ||||
|      | ||||
|     while(lua_next(L, -2) != 0) { | ||||
|       factions[i++] = (int)lua_tonumber(L, -1); | ||||
|       f = lua_tofaction(L, -1); | ||||
|       factions[i++] = f->f; | ||||
|       lua_pop(L,1); | ||||
|     } | ||||
| 
 | ||||
| @ -292,8 +295,10 @@ static int planetL_name(lua_State* L) { | ||||
| /* Get the planets faction. */ | ||||
| static int planetL_faction(lua_State* L) { | ||||
|   LuaPlanet* p; | ||||
|   LuaFaction f; | ||||
|   p = lua_toplanet(L, 1); | ||||
|   lua_pushstring(L, faction_name(p->p->faction)); | ||||
|   f.f = p->p->faction; | ||||
|   lua_pushfaction(L, f); | ||||
|   return 1; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -9,6 +9,7 @@ | ||||
| #include "llua.h" | ||||
| #include "llua_space.h" | ||||
| #include "llua_pilot.h" | ||||
| #include "llua_faction.h" | ||||
| #include "lluadef.h" | ||||
| #include "hook.h" | ||||
| #include "mission.h" | ||||
| @ -187,6 +188,7 @@ int misn_loadLibs(lua_State* L) { | ||||
|   lua_loadPilot(L, 0); | ||||
|   lua_loadMusic(L, 0); | ||||
|   lua_loadDiff(L, 0); | ||||
|   lua_loadFaction(L, 0); | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| @ -443,6 +445,7 @@ static int misn_setMarker(lua_State* L) { | ||||
| static int misn_factions(lua_State* L) { | ||||
|   int i; | ||||
|   MissionData* dat; | ||||
|   LuaFaction f; | ||||
| 
 | ||||
|   dat = cur_mission->data; | ||||
| 
 | ||||
| @ -450,7 +453,8 @@ static int misn_factions(lua_State* L) { | ||||
|   lua_newtable(L); | ||||
|   for(i = 0; i < dat->avail.nfactions; i++) { | ||||
|     lua_pushnumber(L, i+1);   /* Index, starts with 1. */ | ||||
|     lua_pushnumber(L, dat->avail.factions[i]); /* Value. */ | ||||
|     f.f = dat->avail.factions[i]; | ||||
|     lua_pushfaction(L, f); /* Value. */ | ||||
|     lua_rawset(L, -3);  /* Store the value in the table. */ | ||||
|   } | ||||
|   return 1; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Allanis
						Allanis