diff --git a/src/misn_lua.c b/src/misn_lua.c index 631a2fb..bc83eb4 100644 --- a/src/misn_lua.c +++ b/src/misn_lua.c @@ -157,6 +157,13 @@ static const luaL_reg hook_methods[] = { { 0, 0 } }; +// Pilots. +static int pilot_addFleet(lua_State* L); +static const luaL_reg pilot_methods[] = { + { "add", pilot_addFleet }, + { 0, 0 } +}; + // Register all the libaries. int misn_loadLibs(lua_State* L) { luaL_register(L, "lephisto", lephisto_methods); @@ -168,6 +175,7 @@ int misn_loadLibs(lua_State* L) { luaL_register(L, "rnd", rnd_methods); luaL_register(L, "tk", tk_methods); luaL_register(L, "hook", hook_methods); + luaL_register(L, "pilot", pilot_methods); return 0; } @@ -656,7 +664,7 @@ static int rnd_int(lua_State* L) { else if(o >= 2) { // Random int param 1 <= x <= param 2. if(lua_isnumber(L, -1) && lua_isnumber(L, -2)) - lua_pushnumber(L, RNG((int)lua_tonumber(L, -2), (int)lua_tonumber(L,-1))); + lua_pushnumber(L, RNG((int)lua_tonumber(L, -2), (int)lua_tonumber(L, -1))); else return 0; } else return 0; @@ -771,3 +779,59 @@ static int hook_pilotDeath(lua_State* L) { return 0; } +// -- Pilot. -- +static int pilot_addFleet(lua_State* L) { + MIN_ARGS(1); + Fleet* flt; + char* fltname; + int i, j; + unsigned int p; + double a; + Vec2 vv, vp, vn; + + if(lua_isstring(L, -1)) fltname = (char*) lua_tostring(L, -1); + else { + MISN_DEBUG("Invalid parameter"); + return 0; + } + + // Pull the fleet. + flt = fleet_get(fltname); + if(flt == NULL) { + MISN_DEBUG("Fleet not found!"); + return 0; + } + + // This should probably be done better.. + vect_pset(&vp, RNG(MIN_HYPERSPACE_DIST, MIN_HYPERSPACE_DIST*1.5), + RNG(0, 360)*M_PI/180.); + vectnull(&vn); + + // Now we start adding pilots and toss ids into the table we return. + j = 0; + for(i = 0; i < flt->npilots; i++) { + if(RNG(0, 100) <= flt->pilots[i].chance) { + // Fleet displacement. + vect_cadd(&vp, RNG(75, 150) & (RNG(0, 1) ? 1: -1), + RNG(75, 150) * (RNG(0, 1) ? 1 : -1)); + + a = vect_angle(&vp, &vn); + vectnull(&vv); + p = pilot_create(flt->pilots[i].ship, + flt->pilots[i].name, + flt->faction, + flt->ai, + a, + &vp, + &vv, + 0); + + // We push each pilot created into a table and return it. + lua_pushnumber(L, ++j); // Index start with 1. + lua_pushnumber(L, p); // value = pilot id. + lua_rawset(L, -3); // Store the value in the table. + } + } + return 1; +} + diff --git a/src/pilot.c b/src/pilot.c index 86e098d..d17f9ab 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -125,6 +125,17 @@ Pilot* pilot_get(const unsigned int id) { return NULL; } +// Grab a fleet out of the stack. +Fleet* fleet_get(const char* name) { + int i; + for(i = 0; i < nfleets; i++) + if(strcmp(fleet_stack[i].name, name)==0) + return &fleet_stack[i]; + + WARN("Fleet '%s' not found in stack", name); + return NULL; +} + // Attempt to turn the pilot to face dir. double pilot_face(Pilot* p, const float dir) { double diff, turn; @@ -957,16 +968,6 @@ void pilots_render(void) { pilot_stack[i]->render(pilot_stack[i]); } -// Return the fleet based on 'name' -Fleet* fleet_get(const char* name) { - int i; - for(i = 0; i < nfleets; i++) - if(strcmp(name, fleet_stack[i].name)==0) - return fleet_stack+i; - - return NULL; -} - // Parse the fleet node. static Fleet* fleet_parse(const xmlNodePtr parent) { xmlNodePtr cur, node;