/** * @brief Creates a window with an embedded list of choices. * * @usage num, chosen = tk.list( "Title", "Foo or bar?", "Foo", "Bar" ) -- If "Bar" is clicked, it would return 2, "Bar" * * @luaparam title Title of the window. * @luaparam msg Message to display. * @luaparam choices Option choices. * @luareturn Returns the number of the choice and the name of the choice chosen. * @luafunc list( title, msg, ... ) */ static int tk_list( lua_State *L ) { int ret, opts, i; const char *title, *str; char **choices; NLUA_MIN_ARGS(3); /* Handle parameters. */ opts = lua_gettop(L) - 2; title = luaL_checkstring(L,1); str = luaL_checkstring(L,2); /* Do an initial scan for invalid arguments. */ for (i=0; i<opts; i++) luaL_checkstring(L, i+3); /* Will be freed by the toolkit. */ choices = malloc( sizeof(char*) * opts ); for (i=0; i<opts; i++) choices[i] = strdup( luaL_checkstring(L, i+3) ); ret = dialogue_listRaw( title, choices, opts, str ); /* Cancel returns -1, do nothing. */ if (ret == -1) return 0; /* Push index and choice string. */ lua_pushnumber(L, ret+1); lua_pushstring(L, choices[ret]); return 2; }
/** * @brief Creates a window with an ok button. * * @usage tk.msg( "Title", "This is a message." ) * * @luaparam title Title of the window. * @luaparam message Message to display in the window. * @luafunc msg( title, message ) */ static int tk_msg( lua_State *L ) { const char *title, *str; NLUA_MIN_ARGS(2); title = luaL_checkstring(L,1); str = luaL_checkstring(L,2); dialogue_msgRaw( title, str ); return 0; }
/** * @brief Gets the standing of the player with a certain faction. * * @luaparam faction Faction to get the standing of. * @luareturn The faction standing. * @luafunc getFaction( faction ) */ static int playerL_getFaction( lua_State *L ) { NLUA_MIN_ARGS(1); int f; if (lua_isstring(L,1)) f = faction_get( lua_tostring(L,1) ); else NLUA_INVALID_PARAMETER(); lua_pushnumber(L, faction_getPlayer(f)); return 1; }
/** * @brief Displays a window with Yes and No buttons. * * @usage if tk.yesno( "YesNo popup box", "Click yes to do something." ) then -- Clicked yes * * @luaparam title Title of the window. * @luaparam message Message to display in the window. * @luareturn true if yes was clicked, false if no was clicked. * @luafunc yesno( title, message ) */ static int tk_yesno( lua_State *L ) { int ret; const char *title, *str; NLUA_MIN_ARGS(2); title = luaL_checkstring(L,1); str = luaL_checkstring(L,2); ret = dialogue_YesNoRaw( title, str ); lua_pushboolean(L,ret); return 1; }
/** * @brief Increases the player's standing to a faction by a fixed amount without * touching other faction standings. * * @luaparam faction Name of the faction. * @luaparam mod Amount to modify standing by. * @luafunc modFactionRaw( faction, mod ) */ static int playerL_modFactionRaw( lua_State *L ) { NLUA_MIN_ARGS(2); int f; double mod; if (lua_isstring(L,1)) f = faction_get( lua_tostring(L,1) ); else NLUA_INVALID_PARAMETER(); mod = luaL_checknumber(L,2); faction_modPlayerRaw( f, mod ); return 0; }
/** * @ingroup META_VECTOR * * @brief Sets the vector by cartesian coordinates. * * @usage my_vec:set(5, 3) -- my_vec is now (5,3) * * @luaparam v Vector to set coordinates of. * @luaparam x X coordinate to set. * @luaparam y Y coordinate to set. * @luafunc set( v, x, y ) */ static int vectorL_set( lua_State *L ) { NLUA_MIN_ARGS(3); LuaVector *v1; double x, y; /* Get parameters. */ v1 = luaL_checkvector(L,1); x = luaL_checknumber(L,2); y = luaL_checknumber(L,3); vect_cset( &v1->vec, x, y ); return 0; }
/** * @brief Creates a window with an ok button, text and an image. * * @usage tk.msg( "Title", "This is a message.", "character.png" ) * * @luaparam title Title of the window. * @luaparam message Message to display in the window. * @luaparam image Image file (*.png) to display in the window. * @luaparam width (opt) width of the image to display; defaults to 256. * @luaparam height (opt) height of the image to display; defaults to 256. * @luafunc msg( title, message, image ) */ static int tk_msgImg( lua_State *L ) { const char *title, *str, *img; int width, height; NLUA_MIN_ARGS(3); // Get fixed arguments : title, string to display and image filename title = luaL_checkstring(L,1); str = luaL_checkstring(L,2); img = luaL_checkstring(L,3); // Get optional arguments : width and height width = 256; height = 256; dialogue_msgImgRaw( title, str, img, width, height ); return 0; }
/** * @brief Creates a window that allows player to write text input. * * @usage name = tk.input( "Name", 3, 20, "Enter your name:" ) * * @luaparam title Title of the window. * @luaparam min Minimum characters to accept (must be greater than 0). * @luaparam max Maximum characters to accept. * @luaparam str Text to display in the window. * @luareturn nil if input was canceled or a string with the text written. * @luafunc input( title, min, max, str ) */ static int tk_input( lua_State *L ) { const char *title, *str; char *ret; int min, max; NLUA_MIN_ARGS(4); title = luaL_checkstring(L,1); min = luaL_checkint(L,2); max = luaL_checkint(L,3); str = luaL_checkstring(L,4); ret = dialogue_inputRaw( title, min, max, str ); if (ret != NULL) { lua_pushstring(L, ret); free(ret); } else lua_pushnil(L); return 1; }
/** * @brief Creates a window with a number of selectable options * * @usage num, chosen = tk.choice( "Title", "Ready to go?", "Yes", "No" ) -- If "No" was clicked it would return 2, "No" * * @luaparam title Title of the window. * @luaparam msg Message to display. * @luaparam choices Option choices. * @luareturn Returns the number of the choice and the name of the choice chosen. * @luafunc choice( title, msg, ... ) */ static int tk_choice( lua_State *L ) { int ret, opts, i; const char *title, *str; char *result; NLUA_MIN_ARGS(3); /* Handle parameters. */ opts = lua_gettop(L) - 2; title = luaL_checkstring(L,1); str = luaL_checkstring(L,2); /* Do an initial scan for invalid arguments. */ for (i=0; i<opts; i++) luaL_checkstring(L, i+3); /* Create dialogue. */ dialogue_makeChoice( title, str, opts ); for (i=0; i<opts; i++) dialogue_addChoice( title, str, luaL_checkstring(L,i+3) ); result = dialogue_runChoice(); if (result == NULL) /* Something went wrong, return nil. */ return 0; /* Handle results. */ ret = -1; for (i=0; i<opts && ret==-1; i++) { if (strcmp(result, luaL_checkstring(L,i+3)) == 0) ret = i+1; /* Lua uses 1 as first index. */ } /* Push parameters. */ lua_pushnumber(L,ret); lua_pushstring(L,result); /* Clean up. */ free(result); return 2; }
/** * @brief Adds a fleet to the system. * * You can then iterate over the pilots to change parameters like so: * @code * p = pilot.add( "Sml Trader Convoy" ) * for k,v in pairs(p) do * v:setHostile() * end * @endcode * * @usage p = pilot.add( "Pirate Hyena" ) -- Just adds the pilot (will jump in). * @usage p = pilot.add( "Trader Llama", "dummy" ) -- Overrides AI with dummy ai. * @usage p = pilot.add( "Sml Trader Convoy", "def", vec2.new( 1000, 200 ) ) -- Pilot won't jump in, will just appear. * @usage p = pilot.add( "Empire Pacifier", "def", vec2.new( 1000, 1000 ), true ) -- Have the pilot jump in. * * @luaparam fleetname Name of the fleet to add. * @luaparam ai If set will override the standard fleet AI. "def" means use default. * @luaparam pos Position to create pilots around instead of choosing randomly. * @luaparam jump true if pilots should jump in, false by default if pos is defined. * @luareturn Table populated with all the pilots created. The keys are ordered numbers. * @luafunc add( fleetname, ai, pos, jump ) */ static int pilot_addFleet( lua_State *L ) { NLUA_MIN_ARGS(1); Fleet *flt; const char *fltname, *fltai; int i, j; unsigned int p; double a; double d; Vector2d vv,vp, vn; FleetPilot *plt; LuaPilot lp; LuaVector *lv; int jump; /* Parse first argument - Fleet Name */ fltname = luaL_checkstring(L,1); /* Parse second argument - Fleet AI Override */ if (lua_gettop(L) > 1) { fltai = luaL_checkstring(L,2); if (strcmp(fltai, "def")==0) /* Check if set to default */ fltai = NULL; } else fltai = NULL; /* Parse third argument - Position */ if (lua_gettop(L) > 2) { lv = luaL_checkvector(L,3); } else lv = NULL; if (lua_gettop(L) > 3) { jump = lua_toboolean(L,4); } else { /* Only jump by default if not position was passed. */ if (lv==NULL) jump = 1; else jump = 0; } /* Needed to determine angle. */ vectnull(&vn); /* pull the fleet */ flt = fleet_get( fltname ); if (flt == NULL) { NLUA_ERROR(L,"Fleet '%s' doesn't exist.", fltname); return 0; } /* Use position passed if possible. */ if (lv != NULL) { if (!jump) vectcpy( &vp, &lv->vec ); else { /* Pilot is jumping in, we'll only use the vector angle. */ d = RNGF()*(HYPERSPACE_ENTER_MAX-HYPERSPACE_ENTER_MIN) + HYPERSPACE_ENTER_MIN; vect_pset( &vp, d, VANGLE(lv->vec) ); } } else { d = RNGF()*(HYPERSPACE_ENTER_MAX-HYPERSPACE_ENTER_MIN) + HYPERSPACE_ENTER_MIN; vect_pset( &vp, d, RNGF() * 2.*M_PI); } /* now we start adding pilots and toss ids into the table we return */ j = 0; lua_newtable(L); for (i=0; i<flt->npilots; i++) { plt = &flt->pilots[i]; if (RNG(0,100) <= plt->chance) { /* fleet displacement */ vect_cadd(&vp, RNG(75,150) * (RNG(0,1) ? 1 : -1), RNG(75,150) * (RNG(0,1) ? 1 : -1)); /* Set velocity only if no position is set.. */ if (lv != NULL) { if (jump) { a = vect_angle(&vp,&vn); vect_pset( &vv, HYPERSPACE_VEL, a ); } else { a = RNGF() * 2.*M_PI; vectnull( &vv ); } } else { /* Entering via hyperspace. */ a = vect_angle(&vp,&vn); vect_pset( &vv, HYPERSPACE_VEL, a ); } /* Make sure angle is sane. */ if (a < 0.) a += 2.*M_PI; /* Create the pilot. */ p = fleet_createPilot( flt, plt, a, &vp, &vv, fltai, 0 ); /* we push each pilot created into a table and return it */ lua_pushnumber(L,++j); /* index, starts with 1 */ lp.pilot = p; lua_pushpilot(L,lp); /* value = LuaPilot */ lua_rawset(L,-3); /* store the value in the table */ } } return 1; }