forge/blade/lib/stattrak.py (65 lines of code) (raw):
from collections import deque
import numpy as np
from queue import PriorityQueue
from forge.blade.systems import combat
class ExchangeEntry:
def __init__(self, item, numBuy, numSell, maxBuyPrice, maxSellPrice):
self.item = item
self.numBuy = numBuy
self.numSell = numSell
self.maxBuyPrice = maxBuyPrice
self.maxSellPrice = maxSellPrice
#Hackey str get. Only for printing
@property
def itemName(self):
return str(self.item)[17:-2]
@property
def worth(self):
return (self.numBuy + self.numSell)*self.maxBuyPrice
def __lt__(self, other):
return True
def __eq__(self, other):
return False
class StatTraker:
def __init__(self, maxLen=2048):
self.lenTrak = deque(maxlen=maxLen)
def update(self, pcs, npcs, exchange):
self.pcs = pcs
self.npcs = npcs
self.lenTrak.append(len(pcs))
#Update exchange
self.updateExchange(exchange)
def updateExchange(self, exchange):
self.exchange = PriorityQueue()
buyOffers = exchange.buyOffers
sellOffers = exchange.sellOffers
buyKeys, sellKeys = buyOffers.keys(), sellOffers.keys()
exchangeKeys = list(set(list(buyKeys) + list(sellKeys)))
for key in exchangeKeys:
keyBuys, keySells = buyOffers[key], sellOffers[key]
topBuy = keyBuys.peek()
topSell = keySells.peek()
if topBuy is not None:
numBuy, maxBuyPrice = topBuy.quantLeft, topBuy.itemPrice
item = topBuy.item
else:
numBuy, maxBuyPrice = 0, 0
if topSell is not None:
numSell, minSellPrice = topSell.quantLeft, topSell.itemPrice
item = topSell.item
else:
numSell, minSellPrice = 0, 0
#Compute total buy value
totalBuy = 0
for e in keyBuys.queue:
totalBuy += e.coffer
entry = ExchangeEntry(item, numBuy, numSell,
maxBuyPrice, minSellPrice)
self.exchange.put(entry, totalBuy)
@property
def numEntities(self):
return np.asarray(list(self.lenTrak))
class StatBlock:
def __init__(self, entity):
self.timeAlive = entity.timeAlive
self.level = combat.combatLevel(entity.skills)
self.defense = entity.skills.defense.level
self.melee = entity.skills.melee.level
self.ranged = entity.skills.ranged.level