21typedef enum StatDataType_ {
34typedef struct ShipStatsLookup_ {
49#define ELEM( t, n, dsp, d , i) \
50 { .type=t, .name=#n, .display=dsp, .data=d, .inverted=i, .offset=offsetof( ShipStats, n ) }
52#define D__ELEM( t, n, dsp ) \
53 ELEM( t, n, dsp, SS_DATA_TYPE_DOUBLE, 0 )
54#define A__ELEM( t, n, dsp ) \
55 ELEM( t, n, dsp, SS_DATA_TYPE_DOUBLE_ABSOLUTE, 0 )
56#define P__ELEM( t, n, dsp ) \
57 ELEM( t, n, dsp, SS_DATA_TYPE_DOUBLE_ABSOLUTE_PERCENT, 0 )
58#define I__ELEM( t, n, dsp ) \
59 ELEM( t, n, dsp, SS_DATA_TYPE_INTEGER, 0 )
60#define B__ELEM( t, n, dsp ) \
61 ELEM( t, n, dsp, SS_DATA_TYPE_BOOLEAN, 0 )
63#define DI_ELEM( t, n, dsp ) \
64 ELEM( t, n, dsp, SS_DATA_TYPE_DOUBLE, 1 )
65#define AI_ELEM( t, n, dsp ) \
66 ELEM( t, n, dsp, SS_DATA_TYPE_DOUBLE_ABSOLUTE, 1 )
67#define PI_ELEM( t, n, dsp ) \
68 ELEM( t, n, dsp, SS_DATA_TYPE_DOUBLE_ABSOLUTE_PERCENT, 1 )
69#define II_ELEM( t, n, dsp ) \
70 ELEM( t, n, dsp, SS_DATA_TYPE_INTEGER, 1 )
71#define BI_ELEM( t, n, dsp ) \
72 ELEM( t, n, dsp, SS_DATA_TYPE_BOOLEAN, 1 )
75 { .type=t, .name=NULL, .display=NULL, .inverted=0, .offset=0 }
84 D__ELEM( SS_TYPE_D_SPEED_MOD, speed_mod, N_(
"Speed") ),
85 D__ELEM( SS_TYPE_D_TURN_MOD, turn_mod, N_(
"Turn") ),
86 D__ELEM( SS_TYPE_D_THRUST_MOD, thrust_mod, N_(
"Thrust") ),
87 D__ELEM( SS_TYPE_D_CARGO_MOD, cargo_mod, N_(
"Cargo Space") ),
88 D__ELEM( SS_TYPE_D_FUEL_MOD, fuel_mod, N_(
"Fuel Cpacity") ),
89 D__ELEM( SS_TYPE_D_ARMOUR_MOD, armour_mod, N_(
"Armour Strength") ),
90 D__ELEM( SS_TYPE_D_ARMOUR_REGEN_MOD, armour_regen_mod, N_(
"Armour Regeneration") ),
91 D__ELEM( SS_TYPE_D_SHIELD_MOD, shield_mod, N_(
"Shield Strength") ),
92 D__ELEM( SS_TYPE_D_SHIELD_REGEN_MOD, shield_regen_mod, N_(
"Shield Regeneration") ),
93 D__ELEM( SS_TYPE_D_ENERGY_MOD, energy_mod, N_(
"Energy Capacity") ),
94 D__ELEM( SS_TYPE_D_ENERGY_REGEN_MOD, energy_regen_mod, N_(
"Energy Regeneration") ),
95 D__ELEM( SS_TYPE_D_CPU_MOD, cpu_mod, N_(
"CPU Capacity") ),
96 DI_ELEM( SS_TYPE_D_COOLDOWN_MOD, cooldown_mod, N_(
"Ability Cooldown") ),
98 DI_ELEM( SS_TYPE_D_JUMP_DELAY, jump_delay, N_(
"Jump Time") ),
99 DI_ELEM( SS_TYPE_D_LAND_DELAY, land_delay, N_(
"Landing Time") ),
100 DI_ELEM( SS_TYPE_D_CARGO_INERTIA, cargo_inertia, N_(
"Cargo Inertia") ),
102 D__ELEM( SS_TYPE_D_EW_HIDE, ew_hide, N_(
"Concealment") ),
103 D__ELEM( SS_TYPE_D_EW_EVADE, ew_evade, N_(
"Evasion") ),
104 D__ELEM( SS_TYPE_D_EW_STEALTH, ew_stealth, N_(
"Stealth") ),
105 D__ELEM( SS_TYPE_D_EW_DETECT, ew_detect, N_(
"Detection") ),
106 D__ELEM( SS_TYPE_D_EW_TRACK, ew_track, N_(
"Tracking") ),
107 D__ELEM( SS_TYPE_D_EW_JUMPDETECT, ew_jump_detect, N_(
"Jump Detection") ),
108 DI_ELEM( SS_TYPE_D_EW_STEALTH_TIMER, ew_stealth_timer, N_(
"Stealth Discovered Speed") ),
109 DI_ELEM( SS_TYPE_D_EW_SCANNED_TIME, ew_scanned_time, N_(
"Scanned Speed") ),
111 D__ELEM( SS_TYPE_D_LAUNCH_RATE, launch_rate, N_(
"Fire Rate (Launcher)") ),
112 D__ELEM( SS_TYPE_D_LAUNCH_RANGE, launch_range, N_(
"Launch Range") ),
113 D__ELEM( SS_TYPE_D_LAUNCH_DAMAGE, launch_damage, N_(
"Damage (Launcher)") ),
114 D__ELEM( SS_TYPE_D_AMMO_CAPACITY, ammo_capacity, N_(
"Ammo Capacity") ),
115 DI_ELEM( SS_TYPE_D_LAUNCH_LOCKON, launch_lockon, N_(
"Launch Lock-on") ),
116 DI_ELEM( SS_TYPE_D_LAUNCH_CALIBRATION, launch_calibration, N_(
"Launch Calibration") ),
117 D__ELEM( SS_TYPE_D_LAUNCH_RELOAD, launch_reload, N_(
"Ammo Reload Rate") ),
119 D__ELEM( SS_TYPE_D_FBAY_DAMAGE, fbay_damage, N_(
"Fighter Damage") ),
120 D__ELEM( SS_TYPE_D_FBAY_HEALTH, fbay_health, N_(
"Fighter Health") ),
121 D__ELEM( SS_TYPE_D_FBAY_MOVEMENT, fbay_movement, N_(
"Fighter Movement") ),
122 D__ELEM( SS_TYPE_D_FBAY_CAPACITY, fbay_capacity, N_(
"Fighter Bay Capacity") ),
123 D__ELEM( SS_TYPE_D_FBAY_RATE, fbay_rate, N_(
"Fighter Bay Launch Rate") ),
124 D__ELEM( SS_TYPE_D_FBAY_RELOAD, fbay_reload, N_(
"Fighter Reload Rate") ),
126 DI_ELEM( SS_TYPE_D_FORWARD_HEAT, fwd_heat, N_(
"Heat (Cannon)") ),
127 D__ELEM( SS_TYPE_D_FORWARD_DAMAGE, fwd_damage, N_(
"Damage (Cannon)") ),
128 D__ELEM( SS_TYPE_D_FORWARD_FIRERATE, fwd_firerate, N_(
"Fire Rate (Cannon)") ),
129 DI_ELEM( SS_TYPE_D_FORWARD_ENERGY, fwd_energy, N_(
"Energy Usage (Cannon)") ),
130 D__ELEM( SS_TYPE_D_FORWARD_DAMAGE_AS_DISABLE,fwd_dam_as_dis,N_(
"Damage as Disable (Cannon)") ),
132 DI_ELEM( SS_TYPE_D_TURRET_HEAT, tur_heat, N_(
"Heat (Turret)") ),
133 D__ELEM( SS_TYPE_D_TURRET_DAMAGE, tur_damage, N_(
"Damage (Turret)") ),
134 D__ELEM( SS_TYPE_D_TURRET_TRACKING, tur_tracking, N_(
"Tracking (Turret)") ),
135 D__ELEM( SS_TYPE_D_TURRET_FIRERATE, tur_firerate, N_(
"Fire Rate (Turret)") ),
136 DI_ELEM( SS_TYPE_D_TURRET_ENERGY, tur_energy, N_(
"Energy Usage (Turret)") ),
137 D__ELEM( SS_TYPE_D_TURRET_DAMAGE_AS_DISABLE, tur_dam_as_dis,N_(
"Damage as Disable (Turret)") ),
139 D__ELEM( SS_TYPE_D_HEAT_DISSIPATION, heat_dissipation, N_(
"Heat Dissipation") ),
140 D__ELEM( SS_TYPE_D_STRESS_DISSIPATION, stress_dissipation, N_(
"Stress Dissipation") ),
141 D__ELEM( SS_TYPE_D_CREW, crew_mod, N_(
"Crew") ),
142 DI_ELEM( SS_TYPE_D_MASS, mass_mod, N_(
"Ship Mass") ),
143 D__ELEM( SS_TYPE_D_ENGINE_LIMIT_REL, engine_limit_rel, N_(
"Engine Mass Limit") ),
144 D__ELEM( SS_TYPE_D_LOOT_MOD, loot_mod, N_(
"Boarding Bonus") ),
145 DI_ELEM( SS_TYPE_D_TIME_MOD, time_mod, N_(
"Time Constant") ),
146 D__ELEM( SS_TYPE_D_TIME_SPEEDUP, time_speedup, N_(
"Action Speed") ),
147 DI_ELEM( SS_TYPE_D_COOLDOWN_TIME, cooldown_time, N_(
"Ship Cooldown Time") ),
148 D__ELEM( SS_TYPE_D_JUMP_DISTANCE, jump_distance, N_(
"Jump Distance") ),
149 DI_ELEM( SS_TYPE_D_JUMP_WARMUP, jump_warmup, N_(
"Jump Warmup") ),
150 D__ELEM( SS_TYPE_D_MINING_BONUS, mining_bonus, N_(
"Mining Bonus") ),
152 A__ELEM( SS_TYPE_A_THRUST, thrust, N_(
"kN/tonne Thrust") ),
153 A__ELEM( SS_TYPE_A_TURN, turn, N_(
"deg/s Turn Rate") ),
154 A__ELEM( SS_TYPE_A_SPEED, speed, N_(
"m/s Maximum Speed") ),
155 A__ELEM( SS_TYPE_A_ENERGY, energy, N_(
"MJ Energy Capacity") ),
156 A__ELEM( SS_TYPE_A_ENERGY_REGEN, energy_regen, N_(
"MW Energy Regeneration") ),
157 AI_ELEM( SS_TYPE_A_ENERGY_REGEN_MALUS, energy_regen_malus, N_(
"MW Energy Usage") ),
158 AI_ELEM( SS_TYPE_A_ENERGY_LOSS, energy_loss, N_(
"MW Energy Usage") ),
159 A__ELEM( SS_TYPE_A_SHIELD, shield, N_(
"MJ Shield Capacity") ),
160 A__ELEM( SS_TYPE_A_SHIELD_REGEN, shield_regen, N_(
"MW Shield Regeneration") ),
161 AI_ELEM( SS_TYPE_A_SHIELD_REGEN_MALUS, shield_regen_malus, N_(
"MW Shield Usage") ),
162 A__ELEM( SS_TYPE_A_ARMOUR, armour, N_(
"MJ Armour") ),
163 A__ELEM( SS_TYPE_A_ARMOUR_REGEN, armour_regen, N_(
"MW Armour Regeneration") ),
164 AI_ELEM( SS_TYPE_A_ARMOUR_REGEN_MALUS, armour_regen_malus, N_(
"MW Armour Damage") ),
165 A__ELEM( SS_TYPE_A_DAMAGE, damage, N_(
"MW Damage") ),
166 A__ELEM( SS_TYPE_A_DISABLE, disable, N_(
"MW Disable") ),
168 A__ELEM( SS_TYPE_A_CPU_MAX, cpu_max, N_(
"CPU Capacity") ),
169 A__ELEM( SS_TYPE_A_ENGINE_LIMIT, engine_limit, N_(
"Engine Mass Limit") ),
170 A__ELEM( SS_TYPE_A_FUEL_REGEN, fuel_regen, N_(
"Fuel Regeneration") ),
171 A__ELEM( SS_TYPE_A_ASTEROID_SCAN, asteroid_scan, N_(
"Asteroid Scanner Range") ),
172 A__ELEM( SS_TYPE_A_NEBULA_VISIBILITY, nebu_visibility, N_(
"Nebula Visibility") ),
174 P__ELEM( SS_TYPE_P_ABSORB, absorb, N_(
"Damage Absorption") ),
176 P__ELEM( SS_TYPE_P_NEBULA_ABSORB, nebu_absorb, N_(
"Nebula Resistance") ),
177 P__ELEM( SS_TYPE_P_JAMMING_CHANCE, jam_chance, N_(
"Missile jamming chance") ),
179 I__ELEM( SS_TYPE_I_FUEL, fuel, N_(
"units Fuel") ),
180 I__ELEM( SS_TYPE_I_CARGO, cargo, N_(
"tonnes Cargo Space") ),
181 I__ELEM( SS_TYPE_I_CREW, crew, N_(
"crew") ),
183 B__ELEM( SS_TYPE_B_HIDDEN_JUMP_DETECT, misc_hidden_jump_detect, N_(
"Hidden Jump Detection") ),
184 B__ELEM( SS_TYPE_B_INSTANT_JUMP, misc_instant_jump, N_(
"Instant Jump") ),
185 B__ELEM( SS_TYPE_B_REVERSE_THRUST, misc_reverse_thrust, N_(
"Reverse Thrusters") ),
200static double ss_statsGetInternal(
const ShipStats *s, ShipStatsType type );
201static int ss_statsGetLuaInternal( lua_State *L,
const ShipStats *s, ShipStatsType type,
int internal );
217 if (type == SS_TYPE_NIL)
231 ll->
d.d = xml_getFloat(node) / 100.;
235 ll->
d.d = xml_getFloat(node);
239 ll->
d.i = !!xml_getInt(node);
243 ll->
d.i = xml_getInt(node);
267 xmlw_elem( writer, sl->
name,
"%f", l->d.d * 100 );
271 xmlw_elem( writer, sl->
name,
"%f", l->d.d );
276 xmlw_elem( writer, sl->
name,
"%d", l->d.i );
283static int shipstat_sort(
const void *a,
const void *b )
289 return strcmp( sla->
name, slb->
name );
321 arr[i-1]->next = arr[i];
322 arr[n-1]->
next = NULL;
333 for (ShipStatsType i=0; i<=SS_TYPE_SENTINEL; i++) {
335 WARN(_(
"ss_lookup: %s should have id %d but has %d"),
355 for (
int i=0; i<SS_TYPE_SENTINEL; i++) {
359 if (sl->
name == NULL)
367 char *fieldptr = &ptr[ sl->
offset ];
368 memcpy(&dbl, &fieldptr,
sizeof(
double*));
396 const double *srcdbl;
400 destptr = (
char*) dest;
401 srcptr = (
const char*) src;
402 for (
int i=0; i<SS_TYPE_SENTINEL; i++) {
406 if (sl->
name == NULL)
411 destdbl = (
double*) &destptr[ sl->
offset ];
412 srcdbl = (
const double*) &srcptr[ sl->
offset ];
413 *destdbl = (*destdbl) * (*srcdbl);
418 destdbl = (
double*) &destptr[ sl->
offset ];
419 srcdbl = (
const double*) &srcptr[ sl->
offset ];
420 *destdbl = (*destdbl) + (*srcdbl);
424 destint = (
int*) &destptr[ sl->
offset ];
425 srcint = (
const int*) &srcptr[ sl->
offset ];
426 *destint = (*destint) + (*srcint);
430 destint = (
int*) &destptr[ sl->
offset ];
431 srcint = (
const int*) &srcptr[ sl->
offset ];
432 *destint = !!((*destint) + (*srcint));
458 fieldptr = &ptr[ sl->
offset ];
459 memcpy(&dbl, &fieldptr,
sizeof(
double*));
460 *dbl *= 1.0+list->
d.d;
467 fieldptr = &ptr[ sl->
offset ];
468 memcpy(&dbl, &fieldptr,
sizeof(
double*));
473 fieldptr = &ptr[ sl->
offset ];
474 memcpy(&i, &fieldptr,
sizeof(
int*));
479 fieldptr = &ptr[ sl->
offset ];
480 memcpy(&i, &fieldptr,
sizeof(
int*));
507 fieldptr = &ptr[ sl->
offset ];
508 memcpy(&dbl, &fieldptr,
sizeof(
double*));
509 *dbl *= 1.0+list->
d.d * scale;
516 fieldptr = &ptr[ sl->
offset ];
517 memcpy(&dbl, &fieldptr,
sizeof(
double*));
518 *dbl += list->
d.d * scale;
522 fieldptr = &ptr[ sl->
offset ];
523 memcpy(&i, &fieldptr,
sizeof(
int*));
524 *i += list->
d.i * scale;
528 fieldptr = &ptr[ sl->
offset ];
529 memcpy(&i, &fieldptr,
sizeof(
int*));
598 for (
int i=0; i<SS_TYPE_SENTINEL; i++)
602 WARN(_(
"ss_typeFromName: No ship stat matching '%s'"), name);
645 return scnprintf( buf, len,
"%s#%s%+g%% %s#0",
646 (newline) ?
"\n" :
"",
658 return scnprintf( buf, len,
"%s#%s%+g %s#0",
659 (newline) ?
"\n" :
"",
671 return scnprintf( buf, len,
"%s#%s%+d %s#0",
672 (newline) ?
"\n" :
"",
685 (newline) ?
"\n" :
"",
705 for ( ; ll != NULL; ll=ll->
next) {
714 i +=
ss_printD( &buf[i], left, newl, ll->
d.d, sl );
718 i +=
ss_printA( &buf[i], left, newl, ll->
d.d, sl );
722 i +=
ss_printI( &buf[i], left, newl, ll->
d.i, sl );
726 i +=
ss_printB( &buf[i], left, newl, ll->
d.i, sl );
754 for (
int i=0; i<SS_TYPE_SENTINEL; i++) {
758 if (sl->
name == NULL)
768 fieldptr = &ptr[ sl->
offset ];
769 memcpy(&dbl, &fieldptr,
sizeof(
double*));
770 l +=
ss_printD( &buf[l], left, (newline||(l!=0)), ((*dbl)-1.), sl );
774 fieldptr = &ptr[ sl->
offset ];
775 memcpy(&dbl, &fieldptr,
sizeof(
double*));
776 l +=
ss_printD( &buf[l], left, (newline||(l!=0)), (*dbl), sl );
780 fieldptr = &ptr[ sl->
offset ];
781 memcpy(&dbl, &fieldptr,
sizeof(
double*));
782 l +=
ss_printA( &buf[l], left, (newline||(l!=0)), (*dbl), sl );
786 fieldptr = &ptr[ sl->
offset ];
787 memcpy(&num, &fieldptr,
sizeof(
int*));
788 l +=
ss_printI( &buf[l], left, (newline||(l!=0)), (*num), sl );
792 fieldptr = &ptr[ sl->
offset ];
793 memcpy(&num, &fieldptr,
sizeof(
int*));
794 l +=
ss_printB( &buf[l], left, (newline||(l!=0)), (*num), sl );
829 if (type == SS_TYPE_NIL) {
830 WARN(_(
"Unknown ship stat type '%s'!"), name );
838 destdbl = (
double*) &ptr[ sl->
offset ];
839 v = 1.0 + value / 100.;
848 destdbl = (
double*) &ptr[ sl->
offset ];
856 destint = (
int*) &ptr[ sl->
offset ];
858 *destint = (fabs(value) > 1e-5);
860 *destint |= (fabs(value) > 1e-5);
864 destint = (
int*) &ptr[ sl->
offset ];
866 *destint = round(value);
868 *destint += round(value);
875static double ss_statsGetInternal(
const ShipStats *s, ShipStatsType type )
879 const double *destdbl;
883 ptr = (
const char*) s;
886 destdbl = (
const double*) &ptr[ sl->
offset ];
887 return 100.*((*destdbl) - 1.0);
890 destdbl = (
const double*) &ptr[ sl->
offset ];
891 return 100.*(*destdbl);
894 destdbl = (
const double*) &ptr[ sl->
offset ];
899 destint = (
const int*) &ptr[ sl->
offset ];
905static int ss_statsGetLuaInternal( lua_State *L,
const ShipStats *s, ShipStatsType type,
int internal )
909 const double *destdbl;
913 ptr = (
const char*) s;
916 destdbl = (
const double*) &ptr[ sl->
offset ];
918 lua_pushnumber(L, *destdbl );
920 lua_pushnumber(L, 100.*((*destdbl) - 1.0) );
924 destdbl = (
const double*) &ptr[ sl->
offset ];
926 lua_pushnumber(L, *destdbl );
928 lua_pushnumber(L, 100.*(*destdbl));
932 destdbl = (
const double*) &ptr[ sl->
offset ];
933 lua_pushnumber(L, *destdbl);
937 destint = (
const int*) &ptr[ sl->
offset ];
938 lua_pushboolean(L, *destint);
942 destint = (
const int*) &ptr[ sl->
offset ];
943 lua_pushinteger(L, *destint);
956 if (type == SS_TYPE_NIL) {
957 WARN(_(
"Unknown ship stat type '%s'!"), name );
961 return ss_statsGetInternal( s, type );
975 if (type == SS_TYPE_NIL) {
976 WARN(_(
"Unknown ship stat type '%s'!"), name );
980 return ss_statsGetLuaInternal( L, s, type, internal );
989 for (
int i=0; i<SS_TYPE_SENTINEL; i++) {
993 if (sl->
name == NULL)
997 lua_pushstring(L, sl->
name);
998 ss_statsGetLuaInternal( L, s, i, internal );
Header file with generic functions and naev-specifics.
int scnprintf(char *text, size_t maxlen, const char *fmt,...)
Like snprintf(), but returns the number of characters ACTUALLY "printed" into the buffer....
int ss_statsListDesc(const ShipStatList *ll, char *buf, int len, int newline)
Writes the ship statistics description.
void ss_free(ShipStatList *ll)
Frees a list of ship stats.
static int ss_printD(char *buf, int len, int newline, double d, const ShipStatsLookup *sl)
Helper to print doubles.
int ss_statsMerge(ShipStats *dest, const ShipStats *src)
Merges two different ship stats.
int ss_statsModFromList(ShipStats *stats, const ShipStatList *list)
Updates a stat structure from a stat list.
StatDataType
The data type.
@ SS_DATA_TYPE_DOUBLE_ABSOLUTE_PERCENT
@ SS_DATA_TYPE_DOUBLE_ABSOLUTE
static int ss_printA(char *buf, int len, int newline, double d, const ShipStatsLookup *sl)
Helper to print absolute doubles.
int ss_statsGetLua(lua_State *L, const ShipStats *s, const char *name, int internal)
Gets a ship stat value by name and pushes it to Lua.
static const char * ss_printD_colour(double d, const ShipStatsLookup *sl)
Some colour coding for ship stats doubles.
const char * ss_nameFromType(ShipStatsType type)
Gets the name from type.
static int ss_printI(char *buf, int len, int newline, int i, const ShipStatsLookup *sl)
Helper to print integers.
int ss_statsModSingle(ShipStats *stats, const ShipStatList *list)
Modifies a stat structure using a single element.
int ss_statsModSingleScale(ShipStats *stats, const ShipStatList *list, double scale)
Modifies a stat structure using a single element.
int ss_statsDesc(const ShipStats *s, char *buf, int len, int newline)
Writes the ship statistics description.
size_t ss_offsetFromType(ShipStatsType type)
Gets the offset from type.
static const ShipStatsLookup ss_lookup[]
ShipStatsType ss_typeFromName(const char *name)
Gets the type from the name.
static int ss_printB(char *buf, int len, int newline, int b, const ShipStatsLookup *sl)
Helper to print booleans.
static const char * ss_printI_colour(int i, const ShipStatsLookup *sl)
Some colour coding for ship stats integers.
int ss_listToXML(xmlTextWriterPtr writer, const ShipStatList *ll)
Creatse a shipstat list element from an xml node.
double ss_statsGet(const ShipStats *s, const char *name)
Gets a ship stat value by name.
int ss_statsInit(ShipStats *stats)
Initializes a stat structure.
int ss_statsSet(ShipStats *s, const char *name, double value, int overwrite)
Sets a ship stat by name.
int ss_statsGetLuaTable(lua_State *L, const ShipStats *s, int internal)
Converts ship stats to a Lua table, which is pushed on the Lua stack.
int ss_statsModFromListScale(ShipStats *stats, const ShipStatList *list, double scale)
Updates a stat structure from a stat list.
int ss_check(void)
Checks for validity.
ShipStatList * ss_listFromXML(xmlNodePtr node)
Creates a shipstat list element from an xml node.
int ss_sort(ShipStatList **ll)
Sorts the ship stats, useful if doing saving stuff.
Represents relative ship statistics as a linked list.
struct ShipStatList_ * next
Internal look up table for ship stats.
Represents ship statistics, properties ship can use.