diff --git a/src/misn_lua.c b/src/misn_lua.c index bbf2091..b4929eb 100644 --- a/src/misn_lua.c +++ b/src/misn_lua.c @@ -22,10 +22,12 @@ static Mission* cur_mission = NULL; static int misn_setTitle(lua_State* L); static int misn_setDesc(lua_State* L); static int misn_setReward(lua_State* L); +static int misn_factions(lua_State* L); static const luaL_Reg misn_methods[] = { { "setTitle", misn_setTitle }, { "setDesc", misn_setDesc }, { "setReward", misn_setReward }, + { "factions", misn_factions }, { 0, 0 } }; @@ -36,6 +38,19 @@ static const luaL_Reg space_methods[] = { { 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. static int rnd_int(lua_State*L); static const luaL_Reg rnd_methods[] = { @@ -53,6 +68,7 @@ static const luaL_Reg hook_methods[] = { int misn_loadLibs(lua_State* L) { luaL_register(L, "misn", misn_methods); luaL_register(L, "space", space_methods); + luaL_register(L, "player", player_methods); luaL_register(L, "rnd", rnd_methods); luaL_register(L, "hook", hook_methods); return 0; @@ -83,7 +99,7 @@ static int misn_setTitle(lua_State* L) { if(cur_mission->title) // Cleanup the old title. free(cur_mission->title); - cur_mission->title = strdup(lua_tostring(L, -1)); + cur_mission->title = strdup((char*)lua_tostring(L, -1)); } return 0; } @@ -94,7 +110,7 @@ static int misn_setDesc(lua_State* L) { if(cur_mission->title) // Cleanup the old description. free(cur_mission->desc); - cur_mission->desc = strdup(lua_tostring(L, -1)); + cur_mission->desc = strdup((char*)lua_tostring(L, -1)); } return 0; } @@ -105,13 +121,74 @@ static int misn_setReward(lua_State* L) { if(cur_mission->reward) // Cleanup the old reward. free(cur_mission->reward); - cur_mission->reward = strdup(lua_tostring(L, -1)); + cur_mission->reward = strdup((char*)lua_tostring(L, -1)); } 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) { (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; } diff --git a/src/mission.c b/src/mission.c index 0b0c3a5..c0e04e7 100644 --- a/src/mission.c +++ b/src/mission.c @@ -49,6 +49,11 @@ static int mission_init(Mission* mission, MissionData* misn) { mission->id = ++mission_id; mission->data = misn; + // Sane defaults. + mission->title = NULL; + mission->desc = NULL; + mission->reward = NULL; + // Init lua. mission->L = luaL_newstate(); if(mission->L == NULL) { @@ -169,6 +174,7 @@ Mission* missions_computer(int* n, int faction, char* planet, char* system) { Mission* tmp; MissionData* misn; + tmp = NULL; m = 0; for(i = 0; i < mission_nstack; i++) { misn = &mission_stack[i]; diff --git a/src/pilot.c b/src/pilot.c index e74f39a..fae7512 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -603,6 +603,11 @@ static void pilot_calcStats(Pilot* pilot) { 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. int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity) { int i, q; diff --git a/src/pilot.h b/src/pilot.h index 2aa8365..b745071 100644 --- a/src/pilot.h +++ b/src/pilot.h @@ -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_setAmmo(Pilot* p); 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_rmOutfit(Pilot* pilot, Outfit* outfit, int quantity); char* pilot_getOutfits(Pilot* pilot); +int pilot_freeCargo(Pilot* p); // Cargo space. int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity); int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity);