Repair costs scale based on how damaged the item is.

This commit is contained in:
Sam 2022-07-31 12:29:38 -04:00
parent 85ceae3354
commit 536d88a2c7
5 changed files with 33 additions and 31 deletions

View File

@ -186,7 +186,7 @@ recipes: {
// ARMOR/HIDE/CARAPACE
ItemDefId("common.items.armor.hide.carapace.back"): (
inputs: [
(Item("common.items.crafting_ing.lhide.carapace"), 1),
(Item("common.items.crafting_ing.hide.carapace"), 1),
(Item("common.items.mineral.ore.veloritefrag"), 2),
],
),
@ -832,20 +832,20 @@ recipes: {
ItemDefId("common.items.armor.misc.head.crown"): (
inputs: [
(Item("common.items.crafting_ing.cloth.linen_red"), 3),
(item("common.items.mineral.ingot.gold"), 1),
(Item("common.items.mineral.ingot.gold"), 1),
(Item("common.items.mineral.ore.veloritefrag"), 3),
],
),
ItemDefId("common.items.armor.pirate.hat"): (
inputs: [
(Item("common.items.crafting_ing.hide.rigid_leather"), 1),
(Item("common.items.crafting_ing.leather.rigid_leather"), 1),
(Item("common.items.mineral.ore.veloritefrag"), 3),
],
),
ItemDefId("common.items.armor.witch.hat"): (
inputs: [
(Item("common.items.crafting_ing.hide.rigid_leather"), 1),
(Item("common.items.crafting_ing.animal_misc.grim_eyeball"), 1)
(Item("common.items.crafting_ing.leather.rigid_leather"), 1),
(Item("common.items.crafting_ing.animal_misc.grim_eyeball"), 1),
(Item("common.items.mineral.ore.veloritefrag"), 3),
],
),
@ -859,7 +859,7 @@ recipes: {
},
fallback: (
inputs: [
(Item("common.items.utility.coins"), 1000),
(Item("common.items.mineral.ore.veloritefrag"), 25),
],
),
)

View File

@ -11,7 +11,8 @@
trait_alias,
type_alias_impl_trait,
extend_one,
arbitrary_self_types
arbitrary_self_types,
int_roundings
)]
#![feature(hash_drain_filter)]

View File

@ -14,7 +14,7 @@ use crate::{
};
use hashbrown::HashMap;
use serde::{Deserialize, Serialize};
use std::{borrow::Cow, sync::Arc};
use std::{borrow::Cow, ops::Mul, sync::Arc};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum RecipeInput {
@ -973,13 +973,18 @@ impl RepairRecipe {
/// are missing.
pub fn inventory_contains_ingredients(
&self,
item: &Item,
inv: &Inventory,
) -> Result<Vec<(u32, InvSlotId)>, Vec<(&RecipeInput, u32)>> {
inventory_contains_ingredients(self.inputs(), inv, 1)
inventory_contains_ingredients(self.inputs(item), inv, 1)
}
pub fn inputs(&self) -> impl ExactSizeIterator<Item = (&RecipeInput, u32)> {
self.inputs.iter().map(|(input, amount)| (input, *amount))
pub fn inputs(&self, item: &Item) -> impl ExactSizeIterator<Item = (&RecipeInput, u32)> {
let item_durability = item.durability().unwrap_or(0);
self.inputs.iter().map(move |(input, amount)| {
let amount = amount.mul(item_durability).div_ceil(Item::MAX_DURABILITY);
(input, amount)
})
}
}
@ -1014,8 +1019,7 @@ impl RepairRecipeBook {
} {
if let Some(repair_recipe) = self.repair_recipe(item) {
repair_recipe
.inputs
.iter()
.inputs(item)
.enumerate()
.for_each(|(i, (input, amount))| {
// Gets all slots provided for this input by the frontend
@ -1025,7 +1029,7 @@ impl RepairRecipeBook {
.copied();
// Checks if requirement is met, and if not marks it as unsatisfied
input.handle_requirement(
*amount,
amount,
&mut slot_claims,
&mut unsatisfied_requirements,
inv,

View File

@ -1788,7 +1788,9 @@ impl PlayState for SessionState {
}?;
let repair_recipe =
client.repair_recipe_book().repair_recipe(item)?;
repair_recipe.inventory_contains_ingredients(inventory).ok()
repair_recipe
.inventory_contains_ingredients(item, inventory)
.ok()
} else {
None
}

View File

@ -669,22 +669,17 @@ 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_msg("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 item.has_durability() {
let durability = Item::MAX_DURABILITY - item.durability().unwrap_or(0);
stat_text(
format!(
"{} : {}/{}",
i18n.get_msg("common-stats-durability"),
durability,
Item::MAX_DURABILITY
),
7,
)
}
if let Some(equipped_item) = equipped_item {