java-topology/defects/veloren-0001/patch/veloren-0001.patch

135 lines
5.1 KiB
Diff

# UNDF: UNDF-2026-000000954
--- a/common/src/comp/inventory/trade_pricing.rs
+++ b/common/src/comp/inventory/trade_pricing.rs
@@ -28,6 +28,7 @@ const PRICING_DEBUG: bool = false;
#[derive(Default, Debug)]
pub struct TradePricing {
items: PriceEntries,
+ items_index: HashMap<ItemDefinitionIdOwned, usize>,
equality_set: EqualitySet,
}
@@ -165,17 +166,21 @@ struct FreqEntry {
#[derive(Default, Debug)]
struct PriceEntries(Vec<PriceEntry>);
+#[derive(Default, Debug)]
+struct PriceIndex(HashMap<ItemDefinitionIdOwned, usize>);
#[derive(Default, Debug)]
struct FreqEntries(Vec<FreqEntry>);
+#[derive(Default, Debug)]
+struct FreqIndex(HashMap<ItemDefinitionIdOwned, usize>);
impl PriceEntries {
- fn add_alternative(&mut self, b: PriceEntry) {
+ fn add_alternative(&mut self, index: &mut PriceIndex, b: PriceEntry) {
// alternatives are added in frequency (gets more frequent)
- let already = self.0.iter_mut().find(|i| i.name == b.name);
- if let Some(entry) = already {
+ if let Some(&idx) = index.0.get(&b.name) {
+ let entry = &mut self.0[idx];
let entry_freq: MaterialFrequency = std::mem::take(&mut entry.price).into();
let b_freq: MaterialFrequency = b.price.into();
let result = entry_freq + b_freq;
entry.price = result.into();
} else {
+ index.0.insert(b.name.clone(), self.0.len());
self.0.push(b);
}
}
@@ -183,16 +188,14 @@ impl PriceEntries {
impl FreqEntries {
fn add(
&mut self,
+ index: &mut FreqIndex,
eqset: &EqualitySet,
item_name: &ItemDefinitionIdOwned,
good: Good,
probability: f32,
can_sell: bool,
) {
let canonical_itemname = eqset.canonical(item_name);
- let old = self
- .0
- .iter_mut()
- .find(|elem| elem.name == *canonical_itemname);
+ let old_idx = index.0.get(canonical_itemname).copied();
let new_freq = MaterialFrequency(vec![(probability, good)]);
// Increase probability if already in entries, or add new entry
- if let Some(FreqEntry {
+ if let Some(FreqEntry {
name: asset,
freq: old_probability,
sell: old_can_sell,
stackable: _,
- }) = old
+ }) = old_idx.map(|i| &mut self.0[i])
{
if PRICING_DEBUG {
info!("Update {:?} {:?}+{:?}", asset, old_probability, probability);
@@ -218,6 +221,7 @@ impl FreqEntries {
if PRICING_DEBUG {
info!("New {:?}", new_mat_prob);
}
+ index.0.insert(canonical_itemname.to_owned(), self.0.len());
self.0.push(new_mat_prob);
}
@@ -225,6 +229,7 @@ impl FreqEntries {
// It will have infinity as its price, but it's fine,
// because we determine all prices based on canonical value
if canonical_itemname != item_name && !self.0.iter().any(|elem| elem.name == *item_name) {
+ index.0.insert(item_name.to_owned(), self.0.len());
self.0.push(FreqEntry {
name: item_name.to_owned(),
freq: Default::default(),
@@ -674,10 +679,10 @@ impl TradePricing {
// look up price (inverse frequency) of an item
fn price_lookup(&self, requested_name: &ItemDefinitionIdOwned) -> Option<&MaterialUse> {
let canonical_name = self.equality_set.canonical(requested_name);
- self.items
- .0
- .iter()
- .find(|e| &e.name == canonical_name)
+ self.items_index
+ .get(canonical_name)
+ .and_then(|&idx| self.items.0.get(idx))
+ .filter(|e| &e.name == canonical_name)
.map(|e| &e.price)
}
@@ -740,8 +745,10 @@ impl TradePricing {
fn read() -> Self {
let mut result = Self::default();
let mut freq = FreqEntries::default();
+ let mut freq_index = FreqIndex::default();
let price_config =
Ron::<TradingPriceFile>::load_expect("common.trading.item_price_calculation").read();
+ let mut price_index = PriceIndex::default();
result.equality_set = EqualitySet::load_expect("common.trading.item_price_equality")
.read()
.clone();
@@ -757,6 +764,7 @@ impl TradePricing {
freq.add(
+ &mut freq_index,
&result.equality_set,
item_asset,
good,
@@ -766,6 +774,7 @@ impl TradePricing {
}
}
freq.add(
+ &mut freq_index,
&result.equality_set,
&ItemDefinitionIdOwned::Simple(Self::COIN_ITEM.into()),
Good::Coin,
@@ -937,7 +946,7 @@ impl TradePricing {
result.items.add_alternative(new_entry);
+ result.items.add_alternative(&mut price_index, new_entry);
} else {
error!("Recipe {:?} incomplete confusion", recipe);
}
+ result.items_index = price_index.0;
result
}