[Add] Few more mission functions. Also fixed invalid memory free.

This commit is contained in:
Allanis 2013-03-31 23:34:06 +01:00
parent 6fc39a69e0
commit faff7b2193
4 changed files with 93 additions and 4 deletions

View File

@ -22,10 +22,12 @@ static Mission* cur_mission = NULL;
static int misn_setTitle(lua_State* L); static int misn_setTitle(lua_State* L);
static int misn_setDesc(lua_State* L); static int misn_setDesc(lua_State* L);
static int misn_setReward(lua_State* L); static int misn_setReward(lua_State* L);
static int misn_factions(lua_State* L);
static const luaL_Reg misn_methods[] = { static const luaL_Reg misn_methods[] = {
{ "setTitle", misn_setTitle }, { "setTitle", misn_setTitle },
{ "setDesc", misn_setDesc }, { "setDesc", misn_setDesc },
{ "setReward", misn_setReward }, { "setReward", misn_setReward },
{ "factions", misn_factions },
{ 0, 0 } { 0, 0 }
}; };
@ -36,6 +38,19 @@ static const luaL_Reg space_methods[] = {
{ 0, 0 } { 0, 0 }
}; };
// Player.
static int player_freeSpace(lua_State* L);
static int player_addCargo(lua_State* L);
static int player_rmCargo(lua_State* L);
static int player_pay(lua_State* L);
static const luaL_Reg player_methods[] = {
{ "freeCargo", player_freeSpace },
{ "addCargo", player_addCargo },
{ "rmCargo", player_rmCargo },
{ "pay", player_pay },
{ 0, 0 }
};
// RNG. // RNG.
static int rnd_int(lua_State*L); static int rnd_int(lua_State*L);
static const luaL_Reg rnd_methods[] = { static const luaL_Reg rnd_methods[] = {
@ -53,6 +68,7 @@ static const luaL_Reg hook_methods[] = {
int misn_loadLibs(lua_State* L) { int misn_loadLibs(lua_State* L) {
luaL_register(L, "misn", misn_methods); luaL_register(L, "misn", misn_methods);
luaL_register(L, "space", space_methods); luaL_register(L, "space", space_methods);
luaL_register(L, "player", player_methods);
luaL_register(L, "rnd", rnd_methods); luaL_register(L, "rnd", rnd_methods);
luaL_register(L, "hook", hook_methods); luaL_register(L, "hook", hook_methods);
return 0; return 0;
@ -83,7 +99,7 @@ static int misn_setTitle(lua_State* L) {
if(cur_mission->title) if(cur_mission->title)
// Cleanup the old title. // Cleanup the old title.
free(cur_mission->title); free(cur_mission->title);
cur_mission->title = strdup(lua_tostring(L, -1)); cur_mission->title = strdup((char*)lua_tostring(L, -1));
} }
return 0; return 0;
} }
@ -94,7 +110,7 @@ static int misn_setDesc(lua_State* L) {
if(cur_mission->title) if(cur_mission->title)
// Cleanup the old description. // Cleanup the old description.
free(cur_mission->desc); free(cur_mission->desc);
cur_mission->desc = strdup(lua_tostring(L, -1)); cur_mission->desc = strdup((char*)lua_tostring(L, -1));
} }
return 0; return 0;
} }
@ -105,13 +121,74 @@ static int misn_setReward(lua_State* L) {
if(cur_mission->reward) if(cur_mission->reward)
// Cleanup the old reward. // Cleanup the old reward.
free(cur_mission->reward); free(cur_mission->reward);
cur_mission->reward = strdup(lua_tostring(L, -1)); cur_mission->reward = strdup((char*)lua_tostring(L, -1));
} }
return 0; return 0;
} }
static int misn_factions(lua_State* L) {
(void) L;
// TODO: proper misn.factions() implementation.
return 0;
}
static int space_getPlanet(lua_State* L) { static int space_getPlanet(lua_State* L) {
(void)L; (void)L;
// TODO: Proper getPlanet implementation.
lua_pushstring(L, "Arrakis");
return 1;
}
// -- Player. --
static int player_freeSpace(lua_State* L) {
lua_pushnumber(L, pilot_freeCargo(player));
return 1;
}
static int player_addCargo(lua_State* L) {
Commodity* cargo;
int quantity, ret;
MIN_ARGS(2);
if(lua_isstring(L, -1)) cargo = commodity_get((char*) lua_tostring(L, -1));
else return 0;
if(lua_isnumber(L, -2)) quantity = (int)lua_tonumber(L, -2);
else return 0;
ret = pilot_addCargo(player, cargo, quantity);
lua_pushnumber(L, ret);
return 1;
}
static int player_rmCargo(lua_State* L) {
Commodity* cargo;
int quantity, ret;
MIN_ARGS(2);
if(lua_isstring(L, -1)) cargo = commodity_get((char*) lua_tostring(L, -1));
else return 0;
if(lua_isnumber(L, -2)) quantity = (int) lua_tonumber(L, -2);
else return 0;
ret = pilot_rmCargo(player, cargo, quantity);
lua_pushnumber(L, ret);
return 1;
}
static int player_pay(lua_State* L) {
int money;
MIN_ARGS(1);
if(lua_isnumber(L, -1)) money = (int) lua_tonumber(L, -1);
else return 0;
player->credits += money;
return 0; return 0;
} }

View File

@ -49,6 +49,11 @@ static int mission_init(Mission* mission, MissionData* misn) {
mission->id = ++mission_id; mission->id = ++mission_id;
mission->data = misn; mission->data = misn;
// Sane defaults.
mission->title = NULL;
mission->desc = NULL;
mission->reward = NULL;
// Init lua. // Init lua.
mission->L = luaL_newstate(); mission->L = luaL_newstate();
if(mission->L == NULL) { if(mission->L == NULL) {
@ -169,6 +174,7 @@ Mission* missions_computer(int* n, int faction, char* planet, char* system) {
Mission* tmp; Mission* tmp;
MissionData* misn; MissionData* misn;
tmp = NULL;
m = 0; m = 0;
for(i = 0; i < mission_nstack; i++) { for(i = 0; i < mission_nstack; i++) {
misn = &mission_stack[i]; misn = &mission_stack[i];

View File

@ -603,6 +603,11 @@ static void pilot_calcStats(Pilot* pilot) {
pilot->energy = ec * pilot->energy_max; pilot->energy = ec * pilot->energy_max;
} }
// Pilot free cargo space.
int pilot_freeCargo(Pilot* p) {
return p->cargo_free;
}
// Try to add quantity of cargo to pilot, return quantity actually added. // Try to add quantity of cargo to pilot, return quantity actually added.
int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity) { int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity) {
int i, q; int i, q;

View File

@ -135,10 +135,11 @@ void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter,
void pilot_setSecondary(Pilot* p, const char* secondary); void pilot_setSecondary(Pilot* p, const char* secondary);
void pilot_setAmmo(Pilot* p); void pilot_setAmmo(Pilot* p);
double pilot_face(Pilot* p, const float dir); double pilot_face(Pilot* p, const float dir);
int pilot_freeSpace(Pilot* p); int pilot_freeSpace(Pilot* p); // Pilot space.
int pilot_addOutfit(Pilot* pilot, Outfit* outfit, int quantity); int pilot_addOutfit(Pilot* pilot, Outfit* outfit, int quantity);
int pilot_rmOutfit(Pilot* pilot, Outfit* outfit, int quantity); int pilot_rmOutfit(Pilot* pilot, Outfit* outfit, int quantity);
char* pilot_getOutfits(Pilot* pilot); char* pilot_getOutfits(Pilot* pilot);
int pilot_freeCargo(Pilot* p); // Cargo space.
int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity); int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity);
int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity); int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity);