This commit is contained in:
2024-07-29 19:30:36 -04:00
parent d526a95489
commit 00147a5e45

View File

@@ -110,6 +110,7 @@ struct Order {
commission_remain: FiNum, // Based on commission1
owner: usize,
rt_loc: usize, // Location in the Royalty Tree
id: usize,
}
struct RoyaltyTree {
@@ -268,6 +269,7 @@ struct Market {
orders: HashMap<(usize,usize),PQueue<Rc<RefCell<Order>>>>,
royalties: HashMap<usize,RoyaltyTree>, // Active orders that are accepting asset X. They receive royalties when someone makes an order to sell X
royalty_rate: HashMap<usize,FiNum>,
next_order_id: usize,
}
impl Market {
@@ -281,6 +283,7 @@ impl Market {
orders: HashMap::new(),
royalties: HashMap::new(),
royalty_rate: HashMap::new(),
next_order_id: 1,
};
rval.register_trader("*HOUSE*");
rval
@@ -397,6 +400,7 @@ impl Market {
let ap=(buy_type,sell_type);
let mut royalty_acc=FiNum::zero();
let mut commission_acc=FiNum::zero();
let new_order_id:usize;
while buy_qty>FiNum::new(0) && self.orders.contains_key(&ap) && self.orders.get(&ap).unwrap().v.len()>0 {
let mut elt=(*(self.orders.get(&ap).unwrap().v[0].borrow())).clone();
if sell_qty/buy_qty_initial>=elt.buy_qty/elt.sell_qty { // Transact at ask_rate
@@ -447,19 +451,21 @@ impl Market {
let rt=self.royalties.entry(buy_type).or_insert(RoyaltyTree::new());
rt.add_weight(rt.next_entry,buy_qty); // Weight should really be the quantity you would be able to immediately transact rather than how much you wish for.
let neworder=Rc::new(RefCell::new(
Order { owner:owner, sell_qty:sell_qty_remain, sell_remain:sell_qty_remain, buy_qty:buy_qty, rt_loc: rt.next_entry, royalty_remain:royalty1_qty, commission_remain:commission1_qty } ));
Order { owner:owner, sell_qty:sell_qty_remain, sell_remain:sell_qty_remain, buy_qty:buy_qty, rt_loc: rt.next_entry, royalty_remain:royalty1_qty, commission_remain:commission1_qty, id:self.next_order_id } ));
new_order_id=self.next_order_id;
self.next_order_id+=1;
rt.next_entry+=1;
bids.insert(neworder);
self.traders[owner].sub_balance(sell_type,sell_qty_remain);
self.traders[0].add_balance(sell_type,commission0_qty);
log.push(format!("Moved {} {} ({}) to market",sell_qty_remain,self.number_to_name(sell_type),self.traders[owner].name));
}
}
} else { new_order_id=0; }
} else { new_order_id=0; }
self.traders[0].add_balance(sell_type,commission_acc);
self.traders[owner].sub_balance(sell_type,royalty_acc+commission_acc);
log.push(format!("Paid {} {} in royalties and {} {} ({}) in commissions",royalty_acc ,self.number_to_name(sell_type),
commission_acc,self.number_to_name(sell_type),self.traders[owner].name));
Result::PlacedOrder(0,log)
Result::PlacedOrder(new_order_id,log)
}
}