def use_recipe(self, inv_idx): recipe = self.inventory[inv_idx] ingredients = [ Stack(item_name, quantity) for item_name, quantity in recipe.recipe.items() ] craft = Stack(recipe.item.result, recipe.item.result_quantity) if not self.have_stacks(*ingredients): raise NotEnoughtResourcesException if not self.have_place_for(craft): have_place = False if recipe.quantity > 1: for stack in ingredients: for inv_stack in self.inventory: if stack.item == inv_stack.item: if inv_stack.quantity <= stack.quantity: have_place = True break if have_place: break if not have_place: raise InventoryFullException # remove recipe if self._inventory[str(inv_idx)]['quantity'] > 1: self._inventory[str(inv_idx)]['quantity'] -= 1 else: del self._inventory[str(inv_idx)] self.remove_stacks(*ingredients) self.add_stacks(craft)
def bank(self): """Return a list of stack which represent the bank ! this is only for display purpose, modifying stacks here don't affect the player bank""" bank = [] for bank_data in self._bank: stack = Stack.from_dict(bank_data) bank.append(stack) return bank
def claimed_loots(self): """Return a list of loot based on the rank of the player""" #TODO: prendre en compte le débordement d'inventaire avec courier recipes_1 = [tool.recipe for tool in self.rank.gain_tools] upgraders_1 = [ Item.by_name(f'upgrader_{min(self.rank.index,5)}'), ] recipes_2 = [tool.recipe for tool in self.rank.allowed_tools] upgraders_2 = [ Item.by_name(f'upgrader_{i}') for i in range(min(self.rank.index, 5) + 1) ] loots = {} for i in range(random.randint(3, 5)): # 1 + 2-4 recipe_list = recipes_1 if (i == 0) else recipes_2 upgrader_list = upgraders_1 if (i == 0) else upgraders_2 if (random.random() < 0.1): # 10% loot = Item.weighted_choice(recipe_list) else: loot = Item.weighted_choice(upgrader_list) if loot in loots: loots[loot] += 1 else: loots[loot] = 1 return Stack.to_stack_list(loots)
async def run(self): try: stack = Stack(self.args['item_name'], self.args['quantity']) except: await self.cant() else: await self.module.api.add_stacks(self.args['user'], stack) await self.can()
def inventory(self): """Return a dict of stack which represent the inventory ! this is only for display purpose, modifying stacks here don't affect the player inventory Exemple : {0:Stack,1:None,2:Stack} (None ==> empty stack) """ inv = {} for idx in range(self.inventory_size): dict_data = self._inventory.get(str(idx), None) stack = Stack.from_dict(dict_data) if dict_data else None inv[idx] = stack return inv
async def buy_base_tool(self, user): db_user = self.db_user(user) tool = db_user.rank.gain_tools[0] sub = db_user.money - int(tool.buy_price / 3) if sub >= 0: tool_stack = Stack(tool.name, 1) db_user.money = sub db_user.add_stacks(tool_stack) db_user.save() await self._user_change(db_user, 'money', 'inventory', 'bank', 'bank_tax') return tool_stack else: raise NotEnoughtMoneyException(-sub)
def random_loot(self): loot_weight = { item_name: Item.by_name(item_name).frequency for item_name in self.tool_used.item.loots } luck = self.get('stats')['luck'] apply_luck(loot_weight, luck) summ = sum([weight for weight in loot_weight.values()]) offset = random.random() * summ for item_name, weight in loot_weight.items(): if offset < weight: return Stack(item_name, 1) offset -= weight
def equipment(self): """ 0 - weapon 1 - shield 2 - book_1 3 - book_2 4 - book_3 5 - helmet 6 - chestplate 7 - gloves 8 - boots 9 - ring_1 10 - ring_2 11 - neckless 12 - tool """ equ = {} for idx in range(13): dict_data = self._equipment.get(str(idx), None) stack = Stack.from_dict(dict_data) if dict_data else None equ[idx] = stack return equ
def get_bank_stack(self, index): return Stack.from_dict(self._bank[index])
def remove_bank_stack(self, index): """Remove and return a stack from the bank by it index""" return Stack.from_dict(self._bank.pop(index))