summaryrefslogtreecommitdiff
path: root/src/exchange.rs
blob: 5e87ef273dbdcee78c42d63531c09ad886f1a265 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

use crate::{
	components::Inventory,
	ItemId,
	Encyclopedia
};

#[derive(Debug, Clone, PartialEq)]
pub struct Exchange {
	pub cost: Vec<ItemId>,
	pub offer: Vec<ItemId>
}

impl Exchange {
	pub fn show(&self) -> String {
		format!(
			"offer: [{}], price: [{}]",
			self.offer.iter().map(|i| i.0.clone()).collect::<Vec<String>>().join(", "),
			self.cost.iter().map(|i| i.0.clone()).collect::<Vec<String>>().join(", ")
		)
	}
	
	pub fn can_trade(&self, inventory: &Inventory) -> bool {
		if self.offer.len() as isize - self.cost.len() as isize > inventory.capacity as isize - inventory.items.len() as isize{
			return false;
		}
		let mut costs = self.cost.clone();
		for entry in inventory.items.iter() {
			if let Some(pos) = costs.iter().position(|x| *x == entry.itemid){
				costs.remove(pos);
			}
		}
		costs.is_empty()
	}
	
	pub fn trade(&self, inventory: &mut Inventory, enc: &Encyclopedia) {
		for item in self.cost.iter() {
			let pos = inventory.items.iter().position(|entry| entry.itemid == item.clone()).unwrap();
			inventory.items.remove(pos);
		}
		for item in self.offer.iter() {
			inventory.add_item(item.clone(), enc);
		}
	}
}