Beispiel #1
0
    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)
Beispiel #2
0
 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
Beispiel #3
0
    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)
Beispiel #4
0
 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()
Beispiel #5
0
 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
Beispiel #6
0
 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)
Beispiel #7
0
    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
Beispiel #8
0
 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
Beispiel #9
0
 def get_bank_stack(self, index):
     return Stack.from_dict(self._bank[index])
Beispiel #10
0
 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))