/** * @brief Gets the slot name and size of an outfit. * * @usage slot_name, slot_size = o:slot() -- Gets the slot information of an outfit * * @luaparam o Outfit to get information of. * @luareturn The name and the size in human readable strings. * @luafunc slot( o ) */ static int outfitL_slot( lua_State *L ) { Outfit *o = luaL_validoutfit(L,1); lua_pushstring(L, outfit_slotName(o)); lua_pushstring(L, outfit_slotSize(o)); return 2; }
/** * @brief Gets the slot name, size and property of an outfit. * * @usage slot_name, slot_size, slot_prop = o:slot() -- Gets an outfit's slot info * * @luaparam o Outfit to get information of. * @luareturn The name, size and property in human readable strings. * @luafunc slot( o ) */ static int outfitL_slot( lua_State *L ) { Outfit *o = luaL_validoutfit(L,1); lua_pushstring(L, outfit_slotName(o)); lua_pushstring(L, outfit_slotSize(o)); lua_pushstring(L, sp_display( o->slot.spid )); return 3; }
/** * @brief Dumps the bolt weapon data to csv. */ void dout_csvBolt( const char *path ) { Outfit *o, *o_all; int i, n, l; SDL_RWops *rw; char buf[ 1024 ]; Damage *dmg; /* File to output to. */ rw = SDL_RWFromFile( path, "w" ); if (rw == NULL) { WARN("Unable to open '%s' for writing: %s", path, SDL_GetError()); return; } /* Write "header" */ l = nsnprintf( buf, sizeof(buf), "name,type,slot,size," "license,mass,price,cpu," "delay,speed,range,falloff," "lockon,energy,heatup," "track,swivel," "penetrate,dtype,damage,disable\n" ); SDL_RWwrite( rw, buf, l, 1 ); o_all = outfit_getAll( &n ); for (i=0; i<n; i++) { o = &o_all[i]; /* Only handle bolt weapons. */ if (!outfit_isBolt(o)) continue; dmg = &o->u.blt.dmg; l = nsnprintf( buf, sizeof(buf), "%s,%s,%s,%s," "%s,%f,%"CREDITS_PRI",%f," "%f,%f,%f,%f," "%f,%f,%f," "%f,%f," "%f,%s,%f,%f\n", o->name, outfit_getType(o), outfit_slotName(o), outfit_slotSize(o), o->license, o->mass, o->price, o->cpu, o->u.blt.delay, o->u.blt.speed, o->u.blt.range, o->u.blt.falloff, o->u.blt.ew_lockon, o->u.blt.energy, o->u.blt.heatup, o->u.blt.track, o->u.blt.swivel * 180. / M_PI, dmg->penetration*100, dtype_damageTypeToStr(dmg->type), dmg->damage, dmg->disable ); SDL_RWwrite( rw, buf, l, 1 ); } /* Close file. */ SDL_RWclose( rw ); }
/** * @brief Dumps launcher data to CSV. */ void dout_csvLauncher( const char *path ) { Outfit *o, *o_all; int i, n, l; SDL_RWops *rw; char buf[ 1024 ]; /* File to output to. */ rw = SDL_RWFromFile( path, "w" ); if (rw == NULL) { WARN("Unable to open '%s' for writing: %s", path, SDL_GetError()); return; } /* Write "header" */ l = nsnprintf( buf, sizeof(buf), "name,type,slot,size," "license,mass,price,cpu," "delay,ammo_name,amount," "lockon,ew_target,arc\n" ); SDL_RWwrite( rw, buf, l, 1 ); o_all = outfit_getAll( &n ); for (i=0; i<n; i++) { o = &o_all[i]; /* Only handle launchers. */ if (!outfit_isLauncher(o)) continue; l = nsnprintf( buf, sizeof(buf), "%s,%s,%s,%s," "%s,%f,%"CREDITS_PRI",%f," "%f,%s,%d," "%f,%f,%f\n", o->name, outfit_getType(o), outfit_slotName(o), outfit_slotSize(o), o->license, o->mass, o->price, o->cpu, o->u.lau.delay, o->u.lau.ammo_name, o->u.lau.amount, o->u.lau.lockon, o->u.lau.ew_target, o->u.lau.arc * 180 / M_PI ); SDL_RWwrite( rw, buf, l, 1 ); } /* Close file. */ SDL_RWclose( rw ); }
/** * @brief Updates the outfits in the outfit window. * @param wid Window to update the outfits in. * @param str Unused. */ void outfits_update( unsigned int wid, char* str ) { (void)str; char *outfitname; Outfit* outfit; char buf[PATH_MAX], buf2[ECON_CRED_STRLEN], buf3[ECON_CRED_STRLEN]; double th; int iw, ih; int w, h; /* Get dimensions. */ outfits_getSize( wid, &w, &h, &iw, &ih, NULL, NULL ); /* Get and set parameters. */ outfitname = toolkit_getImageArray( wid, "iarOutfits" ); if (strcmp(outfitname,"None")==0) { /* No outfits */ window_modifyImage( wid, "imgOutfit", NULL, 0, 0 ); window_disableButton( wid, "btnBuyOutfit" ); window_disableButton( wid, "btnSellOutfit" ); snprintf( buf, PATH_MAX, "NA\n" "\n" "NA\n" "NA\n" "NA\n" "\n" "NA\n" "NA\n" "NA\n" ); window_modifyText( wid, "txtDDesc", buf ); window_modifyText( wid, "txtOutfitName", "None" ); window_modifyText( wid, "txtDescShort", NULL ); /* Reposition. */ window_moveWidget( wid, "txtSDesc", 20+iw+20, -60 ); window_moveWidget( wid, "txtDDesc", 20+iw+20+60, -60 ); window_moveWidget( wid, "txtDescription", 20+iw+40, -240 ); return; } outfit = outfit_get( outfitname ); /* new image */ window_modifyImage( wid, "imgOutfit", outfit->gfx_store, 0, 0 ); if (outfit_canBuy(outfit,1,0) > 0) window_enableButton( wid, "btnBuyOutfit" ); else window_disableButton( wid, "btnBuyOutfit" ); /* gray out sell button */ if (outfit_canSell(outfit,1,0) > 0) window_enableButton( wid, "btnSellOutfit" ); else window_disableButton( wid, "btnSellOutfit" ); /* new text */ window_modifyText( wid, "txtDescription", outfit->description ); credits2str( buf2, outfit->price, 2 ); credits2str( buf3, player.p->credits, 2 ); snprintf( buf, PATH_MAX, "%d\n" "\n" "%s\n" "%s\n" "%.0f tons\n" "\n" "%s credits\n" "%s credits\n" "%s\n", player_outfitOwned(outfit), outfit_slotName(outfit), outfit_slotSize(outfit), outfit->mass, buf2, buf3, (outfit->license != NULL) ? outfit->license : "None" ); window_modifyText( wid, "txtDDesc", buf ); window_modifyText( wid, "txtOutfitName", outfit->name ); window_modifyText( wid, "txtDescShort", outfit->desc_short ); th = MAX( 128, gl_printHeightRaw( &gl_smallFont, 320, outfit->desc_short ) ); window_moveWidget( wid, "txtSDesc", 40+iw+20, -60-th-20 ); window_moveWidget( wid, "txtDDesc", 40+iw+20+60, -60-th-20 ); th += gl_printHeightRaw( &gl_smallFont, 250, buf ); window_moveWidget( wid, "txtDescription", 20+iw+40, -60-th-20 ); }
/** * @brief Dumps the modification data to csv. * * Note that this function is primarily intended for balancing core outfits. * * To that end, it omits a number of seldom-used properties, and is primarily * concerned with those that are common to most types of modifications, or at * least one category of core outfit. */ void dout_csvMod( const char *path ) { Outfit *o, *o_all; int i, n, l; SDL_RWops *rw; char buf[ 1024 ]; ShipStats base, stats; /* File to output to. */ rw = SDL_RWFromFile( path, "w" ); if (rw == NULL) { WARN("Unable to open '%s' for writing: %s", path, SDL_GetError()); return; } /* Write "header" */ l = nsnprintf( buf, sizeof(buf), "name,type,slot,size," "license,mass,price,cpu," "thrust,turn,speed,fuel,energy_usage," "armour,armour_regen," "shield,shield_regen," "energy,energy_regen," "absorb,cargo,ew_hide\n" ); SDL_RWwrite( rw, buf, l, 1 ); ss_statsInit( &base ); o_all = outfit_getAll( &n ); for (i=0; i<n; i++) { o = &o_all[i]; /* Only handle modifications. */ if (!outfit_isMod(o)) continue; memcpy( &stats, &base, sizeof(ShipStats) ); ss_statsModFromList( &stats, o->u.mod.stats, NULL ); l = nsnprintf( buf, sizeof(buf), "%s,%s,%s,%s," "%s,%f,%"CREDITS_PRI",%f," "%f,%f,%f,%f,%f," "%f,%f," "%f,%f," "%f,%f," "%f,%f,%f\n", o->name, outfit_getType(o), outfit_slotName(o), outfit_slotSize(o), o->license, o->mass, o->price, o->cpu, o->u.mod.thrust, o->u.mod.turn * 180. / M_PI, o->u.mod.speed, o->u.mod.fuel, stats.energy_usage, o->u.mod.armour, o->u.mod.armour_regen, o->u.mod.shield, o->u.mod.shield_regen, o->u.mod.energy, o->u.mod.energy_regen, o->u.mod.absorb,o->u.mod.cargo, stats.ew_hide - 1. ); SDL_RWwrite( rw, buf, l, 1 ); } /* Close file. */ SDL_RWclose( rw ); }