135 lines
5.1 KiB
Diff
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
|
|
}
|