Added durability to item tooltips

This commit is contained in:
Sam 2022-06-07 16:05:56 -04:00
parent c586db8feb
commit a555e08d0b
4 changed files with 60 additions and 4 deletions

View File

@ -103,6 +103,7 @@ common-stats-energy_reward = Energy Reward
common-stats-crit_power = Crit Power
common-stats-stealth = Stealth
common-stats-slots = Slots
common-stats-durability = Durability
common-material-metal = Metal
common-material-wood = Wood
common-material-stone = Stone

View File

@ -772,6 +772,8 @@ impl assets::Asset for RawItemDef {
pub struct OperationFailure;
impl Item {
pub const MAX_DURABILITY: u32 = 8;
// TODO: consider alternatives such as default abilities that can be added to a
// loadout when no weapon is present
pub fn empty() -> Self { Item::new_from_asset_expect("common.items.weapons.empty.empty") }
@ -1196,14 +1198,17 @@ impl Item {
}
}
pub fn durability(&self) -> Option<u32> { self.durability.map(|x| x.min(Self::MAX_DURABILITY)) }
pub fn stats_durability_multiplier(&self) -> DurabilityMultiplier {
const MAX_DURABILITY: u32 = 8;
let durability = self.durability.map_or(0, |x| x.clamp(0, MAX_DURABILITY));
let durability = self
.durability
.map_or(0, |x| x.clamp(0, Self::MAX_DURABILITY));
const DURABILITY_THRESHOLD: u32 = 4;
const MIN_FRAC: f32 = 0.2;
let mult = (1.0
- durability.saturating_sub(DURABILITY_THRESHOLD) as f32
/ (MAX_DURABILITY - DURABILITY_THRESHOLD) as f32)
/ (Self::MAX_DURABILITY - DURABILITY_THRESHOLD) as f32)
* (1.0 - MIN_FRAC)
+ MIN_FRAC;
DurabilityMultiplier(mult)
@ -1264,6 +1269,8 @@ pub trait ItemDesc {
fn tags(&self) -> Vec<ItemTag>;
fn is_modular(&self) -> bool;
fn components(&self) -> &[Item];
fn has_durability(&self) -> bool;
fn durability(&self) -> Option<u32>;
fn stats_durability_multiplier(&self) -> DurabilityMultiplier;
fn tool_info(&self) -> Option<ToolKind> {
@ -1294,6 +1301,10 @@ impl ItemDesc for Item {
fn components(&self) -> &[Item] { self.components() }
fn has_durability(&self) -> bool { self.has_durability() }
fn durability(&self) -> Option<u32> { self.durability() }
fn stats_durability_multiplier(&self) -> DurabilityMultiplier {
self.stats_durability_multiplier()
}
@ -1320,6 +1331,10 @@ impl ItemDesc for ItemDef {
fn components(&self) -> &[Item] { &[] }
fn has_durability(&self) -> bool { false }
fn durability(&self) -> Option<u32> { None }
fn stats_durability_multiplier(&self) -> DurabilityMultiplier { DurabilityMultiplier(1.0) }
}
@ -1356,6 +1371,10 @@ impl<'a, T: ItemDesc + ?Sized> ItemDesc for &'a T {
fn components(&self) -> &[Item] { (*self).components() }
fn has_durability(&self) -> bool { (*self).has_durability() }
fn durability(&self) -> Option<u32> { (*self).durability() }
fn stats_durability_multiplier(&self) -> DurabilityMultiplier {
(*self).stats_durability_multiplier()
}

View File

@ -100,7 +100,7 @@ pub fn material_kind_text<'a>(kind: &MaterialKind, i18n: &'a Localization) -> Co
}
pub fn stats_count(item: &dyn ItemDesc, msm: &MaterialStatManifest) -> usize {
match &*item.kind() {
let mut count = match &*item.kind() {
ItemKind::Armor(armor) => {
let armor_stats = armor.stats(msm, item.stats_durability_multiplier());
armor_stats.energy_reward.is_some() as usize
@ -118,7 +118,11 @@ pub fn stats_count(item: &dyn ItemDesc, msm: &MaterialStatManifest) -> usize {
},
ItemKind::ModularComponent { .. } => 7,
_ => 0,
};
if item.has_durability() {
count += 1;
}
count
}
pub fn line_count(item: &dyn ItemDesc, msm: &MaterialStatManifest, i18n: &Localization) -> usize {

View File

@ -669,6 +669,24 @@ impl<'a> Widget for ItemTooltip<'a> {
6,
);
// Durability
if let Some(durability) = item.durability() {
const MAX_DURABILITY: u32 = 8;
let durability = MAX_DURABILITY - durability.min(MAX_DURABILITY);
widget::Text::new(&format!(
"{} : {}/{}",
i18n.get("common.stats.durability"),
durability,
MAX_DURABILITY
))
.graphics_for(id)
.parent(id)
.with_style(self.style.desc)
.color(text_color)
.down_from(state.ids.stats[6], V_PAD_STATS)
.set(state.ids.stats[7], ui);
}
if let Some(equipped_item) = equipped_item {
if let ItemKind::Tool(equipped_tool) = &*equipped_item.kind() {
let tool_stats = tool.stats(item.stats_durability_multiplier());
@ -874,6 +892,20 @@ impl<'a> Widget for ItemTooltip<'a> {
),
index,
);
index += 1;
}
if item.has_durability() {
let durability = Item::MAX_DURABILITY - item.durability().unwrap_or(0);
stat_text(
format!(
"{} : {}/{}",
i18n.get("common.stats.durability"),
durability,
Item::MAX_DURABILITY
),
index,
);
}
if let Some(equipped_item) = equipped_item {