Skip to content

Commit da80f4f

Browse files
GuardianDllBlueflowerss
authored andcommitted
Simplify gun stats in item info
1 parent dd68d4c commit da80f4f

File tree

3 files changed

+48
-121
lines changed

3 files changed

+48
-121
lines changed

src/item.cpp

Lines changed: 41 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -3196,51 +3196,39 @@ void item::gun_info( const item *mod, std::vector<iteminfo> &info, const iteminf
31963196

31973197
if( parts->test( iteminfo_parts::GUN_DAMAGE ) ) {
31983198
insert_separation_line( info );
3199-
info.emplace_back( "GUN", _( "<bold>Ranged damage</bold>: " ), "", iteminfo::no_newline,
3200-
mod->gun_damage( false ).total_damage() );
3199+
info.emplace_back( "GUN", colorize( _( "Ranged damage" ), c_bold ) + ": ", iteminfo::no_newline );
32013200
}
32023201

32033202
if( mod->ammo_required() ) {
3204-
// ammo_damage, sum_of_damage, and ammo_mult not shown so don't need to translate.
3205-
float dmg_mult = 1.0f;
3206-
for( const damage_unit &dmg : curammo->ammo->damage.damage_units ) {
3207-
dmg_mult *= dmg.unconditional_damage_mult;
3208-
}
3209-
if( dmg_mult != 1.0f ) {
3210-
if( parts->test( iteminfo_parts::GUN_DAMAGE_AMMOPROP ) ) {
3211-
info.emplace_back( "GUN", "ammo_mult", "*",
3212-
iteminfo::no_newline | iteminfo::no_name | iteminfo::is_decimal, dmg_mult );
3213-
}
3203+
// some names are not shown, so no need to translate them
3204+
3205+
const int gun_damage = loaded_mod->gun_damage( true, false ).total_damage();
3206+
int pellet_damage = 0;
3207+
const bool pellets = curammo->ammo->count > 1;
3208+
if( parts->test( iteminfo_parts::GUN_DAMAGE_PELLETS ) && pellets ) {
3209+
pellet_damage = loaded_mod->gun_damage( true, true ).total_damage();
3210+
3211+
// if shotgun, gun_damage is your point blank damage, and anything further is pellets x damage of a single pellet
3212+
info.emplace_back( "GUN", _( "<bold>Point blank damage:</bold> " ), "<num>", iteminfo::no_flags,
3213+
gun_damage );
3214+
info.emplace_back( "GUN", "damage_per_pellet", _( "<num> per pellet" ),
3215+
iteminfo::no_newline | iteminfo::no_name, pellet_damage );
3216+
info.emplace_back( "GUN", ", ", iteminfo::no_newline );
3217+
info.emplace_back( "GUN", "amount_of_pellets", _( "<num> pellets" ),
3218+
iteminfo::no_newline | iteminfo::no_name, curammo->ammo->count );
3219+
info.emplace_back( "GUN", " = ", iteminfo::no_newline );
32143220
} else {
3215-
if( parts->test( iteminfo_parts::GUN_DAMAGE_LOADEDAMMO ) ) {
3216-
damage_instance ammo_dam = curammo->ammo->damage;
3217-
int bullet_damage = ammo_dam.total_damage();
3218-
if( mod->barrel_length().value() > 0 ) {
3219-
bullet_damage = ammo_dam.di_considering_length( mod->barrel_length() ).total_damage();
3220-
}
3221-
info.emplace_back( "GUN", "ammo_damage", "",
3222-
iteminfo::no_newline | iteminfo::no_name |
3223-
iteminfo::show_plus, bullet_damage );
3224-
}
3225-
}
32263221

3227-
const int gun_damage = loaded_mod->gun_damage( true ).total_damage();
3228-
if( damage() > 0 ) {
3229-
item intact_mod( *loaded_mod );
3230-
intact_mod.set_degradation( 0 );
3231-
intact_mod.set_damage( 0 );
3232-
const int intact_damage = intact_mod.gun_damage( true ).total_damage();
3233-
if( intact_damage != gun_damage ) {
3234-
const int dmg_penalty = gun_damage - intact_damage;
3235-
info.emplace_back( "GUN", "damaged_weapon_penalty", "",
3236-
iteminfo::no_newline | iteminfo::no_name, dmg_penalty );
3237-
}
32383222
}
32393223

32403224
if( parts->test( iteminfo_parts::GUN_DAMAGE_TOTAL ) ) {
3241-
info.emplace_back( "GUN", "sum_of_damage", _( " = <num>" ),
3242-
iteminfo::no_newline | iteminfo::no_name, gun_damage );
3225+
info.emplace_back( "GUN", "final_damage", "<num>",
3226+
iteminfo::no_newline | iteminfo::no_name,
3227+
pellets ? pellet_damage * curammo->ammo->count : gun_damage );
32433228
}
3229+
} else {
3230+
info.emplace_back( "GUN", "final_damage", "<num>", iteminfo::no_newline | iteminfo::no_name,
3231+
mod->gun_damage( false ).total_damage() );
32443232
}
32453233
info.back().bNewLine = true;
32463234

@@ -3268,73 +3256,42 @@ void item::gun_info( const item *mod, std::vector<iteminfo> &info, const iteminf
32683256

32693257
// TODO: This doesn't cover multiple damage types
32703258

3259+
int ammo_pierce = 0;
3260+
if( mod->ammo_required() ) {
3261+
ammo_pierce = get_ranged_pierce( *curammo->ammo );
3262+
}
3263+
32713264
if( parts->test( iteminfo_parts::GUN_ARMORPIERCE ) ) {
32723265
info.emplace_back( "GUN", _( "Armor-pierce: " ), "",
3273-
iteminfo::no_newline, get_ranged_pierce( gun ) );
3274-
}
3275-
if( mod->ammo_required() ) {
3276-
int ammo_pierce = get_ranged_pierce( *curammo->ammo );
3277-
// ammo_armor_pierce and sum_of_armor_pierce don't need to translate.
3278-
if( parts->test( iteminfo_parts::GUN_ARMORPIERCE_LOADEDAMMO ) ) {
3279-
info.emplace_back( "GUN", "ammo_armor_pierce", "",
3280-
iteminfo::no_newline | iteminfo::no_name |
3281-
iteminfo::show_plus, ammo_pierce );
3282-
}
3283-
if( parts->test( iteminfo_parts::GUN_ARMORPIERCE_TOTAL ) ) {
3284-
info.emplace_back( "GUN", "sum_of_armor_pierce", _( " = <num>" ),
3285-
iteminfo::no_name,
3286-
get_ranged_pierce( gun ) + ammo_pierce );
3287-
}
3266+
iteminfo::no_newline, get_ranged_pierce( gun ) + ammo_pierce );
32883267
}
32893268
info.back().bNewLine = true;
32903269

3270+
double gun_dispersion = mod->gun_dispersion( false, false ) / 100.0;
3271+
if( mod->ammo_required() ) {
3272+
gun_dispersion = loaded_mod->gun_dispersion( true, false ) / 100.0;
3273+
}
32913274
if( parts->test( iteminfo_parts::GUN_DISPERSION ) ) {
3292-
info.emplace_back( "GUN", _( "Dispersion: " ), "",
3275+
info.emplace_back( "GUN", _( "Dispersion: " ), _( "<num> MOA" ),
32933276
iteminfo::is_decimal | iteminfo::lower_is_better | iteminfo::no_newline,
3294-
mod->gun_dispersion( false, false ) / 100.0 );
3295-
}
3296-
if( mod->ammo_required() ) {
3297-
int ammo_dispersion = curammo->ammo->dispersion_considering_length( barrel_length() );
3298-
// ammo_dispersion and sum_of_dispersion don't need to translate.
3299-
if( parts->test( iteminfo_parts::GUN_DISPERSION_LOADEDAMMO ) ) {
3300-
info.emplace_back( "GUN", "ammo_dispersion", "",
3301-
iteminfo::is_decimal | iteminfo::lower_is_better | iteminfo::no_name | iteminfo::no_newline |
3302-
iteminfo::show_plus,
3303-
ammo_dispersion / 100.0 );
3304-
}
3305-
if( parts->test( iteminfo_parts::GUN_DISPERSION_TOTAL ) ) {
3306-
info.emplace_back( "GUN", "sum_of_dispersion", _( " = <num> MOA" ),
3307-
iteminfo::is_decimal | iteminfo::lower_is_better | iteminfo::no_name,
3308-
loaded_mod->gun_dispersion( true, false ) / 100.0 );
3309-
}
3277+
gun_dispersion );
33103278
}
33113279
info.back().bNewLine = true;
33123280

33133281
// if effective sight dispersion differs from actual sight dispersion display both
33143282
std::pair<int, int> disp = mod->sight_dispersion( player_character );
3315-
int act_disp = disp.first;
3316-
int eff_disp = disp.second;
3317-
int adj_disp = eff_disp - act_disp;
3318-
int point_shooting_limit = player_character.point_shooting_limit( *mod );
3283+
const int eff_disp = disp.second;
3284+
const int point_shooting_limit = player_character.point_shooting_limit( *mod );
33193285

33203286
if( parts->test( iteminfo_parts::GUN_DISPERSION_SIGHT ) ) {
33213287
if( point_shooting_limit <= eff_disp ) {
3322-
info.emplace_back( "GUN", _( "Sight dispersion (point shooting): " ), "",
3288+
info.emplace_back( "GUN", _( "Sight dispersion (point shooting): " ), _( "<num> MOA" ),
33233289
iteminfo::is_decimal | iteminfo::no_newline | iteminfo::lower_is_better,
33243290
point_shooting_limit / 100.0 );
33253291
} else {
3326-
info.emplace_back( "GUN", _( "Sight dispersion: " ), "",
3292+
info.emplace_back( "GUN", _( "Sight dispersion: " ), _( "<num> MOA" ),
33273293
iteminfo::is_decimal | iteminfo::no_newline | iteminfo::lower_is_better,
3328-
act_disp / 100.0 );
3329-
3330-
if( adj_disp ) {
3331-
info.emplace_back( "GUN", "sight_adj_disp", "",
3332-
iteminfo::is_decimal | iteminfo::no_newline | iteminfo::lower_is_better |
3333-
iteminfo::no_name | iteminfo::show_plus, adj_disp / 100.0 );
3334-
info.emplace_back( "GUN", "sight_eff_disp", _( " = <num> MOA" ),
3335-
iteminfo::is_decimal | iteminfo::lower_is_better | iteminfo::no_name,
3336-
eff_disp / 100.0 );
3337-
}
3294+
eff_disp / 100.0 );
33383295
}
33393296
}
33403297

src/iteminfo_query.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,11 @@ enum class iteminfo_parts : size_t {
9191
GUN_MAX_RANGE,
9292
GUN_AIMING_STATS,
9393
GUN_DAMAGE,
94-
GUN_DAMAGE_LOADEDAMMO,
94+
GUN_DAMAGE_PELLETS,
9595
GUN_DAMAGE_TOTAL,
9696
GUN_DAMAGE_AMMOPROP,
9797
GUN_ARMORPIERCE,
98-
GUN_ARMORPIERCE_LOADEDAMMO,
99-
GUN_ARMORPIERCE_TOTAL,
10098
GUN_DISPERSION,
101-
GUN_DISPERSION_LOADEDAMMO,
102-
GUN_DISPERSION_TOTAL,
10399
GUN_DISPERSION_SIGHT,
104100
GUN_CURRENT_LOUDNESS,
105101

tests/iteminfo_test.cpp

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1729,22 +1729,16 @@ TEST_CASE( "gun_or_other_ranged_weapon_attributes", "[iteminfo][weapon][gun]" )
17291729
item glock( itype_test_glock );
17301730
item rag( itype_test_rag );
17311731

1732-
SECTION( "weapon damage including floating-point multiplier" ) {
1733-
// Ranged damage info is displayed on a single line, in three parts:
1734-
//
1735-
// - base ranged damage (GUN_DAMAGE)
1736-
// - floating-point multiplier (GUN_DAMAGE_AMMOPROP)
1737-
// - total damage calculation (GUN_DAMAGE_TOTAL)
1738-
//
1732+
SECTION( "weapon damage" ) {
17391733
std::vector<iteminfo_parts> damage = { iteminfo_parts::GUN_DAMAGE,
1740-
iteminfo_parts::GUN_DAMAGE_AMMOPROP,
1734+
iteminfo_parts::GUN_DAMAGE_PELLETS,
17411735
iteminfo_parts::GUN_DAMAGE_TOTAL
17421736
};
17431737

17441738
CHECK( item_info_str( compbow, damage ) ==
17451739
"--\n"
17461740
"<color_c_white>Ranged damage</color>:"
1747-
" <color_c_yellow>18</color>*<color_c_yellow>1.50</color> = <color_c_yellow>27</color>\n" );
1741+
" <color_c_yellow>27</color>\n" );
17481742
}
17491743
// TODO: Test glock damage with and without ammo (test_glock has -1 damage when unloaded)
17501744

@@ -1875,7 +1869,7 @@ TEST_CASE( "gun_or_other_ranged_weapon_attributes", "[iteminfo][weapon][gun]" )
18751869
SECTION( "armor piercing" ) {
18761870
CHECK( item_info_str( compbow, { iteminfo_parts::GUN_ARMORPIERCE } ) ==
18771871
"--\n"
1878-
"Armor-pierce: <color_c_yellow>0</color>\n" );
1872+
"Armor-pierce: <color_c_yellow>1</color>\n" );
18791873
}
18801874

18811875
SECTION( "time to reload weapon" ) {
@@ -1907,7 +1901,7 @@ TEST_CASE( "gun_or_other_ranged_weapon_attributes", "[iteminfo][weapon][gun]" )
19071901
SECTION( "weapon dispersion" ) {
19081902
CHECK( item_info_str( compbow, { iteminfo_parts::GUN_DISPERSION } ) ==
19091903
"--\n"
1910-
"Dispersion: <color_c_yellow>8.50</color>\n" );
1904+
"Dispersion: <color_c_yellow>9.60</color> MOA\n" );
19111905
}
19121906

19131907
SECTION( "needing two hands to fire" ) {
@@ -1925,11 +1919,6 @@ TEST_CASE( "gun_armor_piercing_dispersion_and_other_stats", "[iteminfo][gun][mis
19251919
{
19261920
clear_avatar();
19271921

1928-
std::vector<iteminfo_parts> dmg_loaded = { iteminfo_parts::GUN_DAMAGE_LOADEDAMMO };
1929-
std::vector<iteminfo_parts> ap_loaded = { iteminfo_parts::GUN_ARMORPIERCE_LOADEDAMMO };
1930-
std::vector<iteminfo_parts> ap_total = { iteminfo_parts::GUN_ARMORPIERCE_TOTAL };
1931-
std::vector<iteminfo_parts> disp_loaded = { iteminfo_parts::GUN_DISPERSION_LOADEDAMMO };
1932-
std::vector<iteminfo_parts> disp_total = { iteminfo_parts::GUN_DISPERSION_TOTAL };
19331922
std::vector<iteminfo_parts> disp_sight = { iteminfo_parts::GUN_DISPERSION_SIGHT };
19341923

19351924
// TODO: Test these
@@ -1940,24 +1929,9 @@ TEST_CASE( "gun_armor_piercing_dispersion_and_other_stats", "[iteminfo][gun][mis
19401929

19411930
item glock( itype_test_glock );
19421931

1943-
CHECK( item_info_str( glock, dmg_loaded ) ==
1944-
"--\n<color_c_yellow>+26</color>\n" );
1945-
1946-
CHECK( item_info_str( glock, ap_loaded ) ==
1947-
"--\n<color_c_yellow>+0</color>\n" );
1948-
CHECK( item_info_str( glock, ap_total ) ==
1949-
"--\n = <color_c_yellow>0</color>\n" );
1950-
1951-
CHECK( item_info_str( glock, disp_loaded ) ==
1952-
"--\n<color_c_yellow>+0.60</color>\n" );
1953-
CHECK( item_info_str( glock, disp_total ) ==
1954-
"--\n = <color_c_yellow>5.40</color> MOA\n" );
1955-
19561932
CHECK( item_info_str( glock, disp_sight ) ==
19571933
"--\n"
1958-
"Sight dispersion: <color_c_yellow>0.30</color>"
1959-
"<color_c_yellow>+0.14</color>"
1960-
" = <color_c_yellow>0.44</color> MOA\n" );
1934+
"Sight dispersion: <color_c_yellow>0.44</color> MOA\n" );
19611935

19621936
// TODO: Add a test gun with thest attributes
19631937
//CHECK( item_info_str( glock, recoil_bipod ).empty() );

0 commit comments

Comments
 (0)