Exemplo n.º 1
0
 def get_drops(self):
     drops = [
         ItemInfo(items.SHINY_STONE_1, randint(5, 15)),
         ItemInfo(items.SHINY_STONE_2, randint(5, 10))
     ]
     if randint(0, 5) == 1:
         drops.append([items.SHINY_STONE_3, randint(1, 5)])
     return drops
Exemplo n.º 2
0
 def get_drops(self):
     drops = []
     for drop in self.drops:
         amnt = randint(drop[1], drop[2])
         if amnt > 0:
             drops.append(ItemInfo(drop[0], amnt))
     return drops
Exemplo n.º 3
0
 def __init__(self, player):
     super().__init__(DIM)
     # Armor inventory
     self.armor = ArmorInventory(player)
     self.armor.draw_inventory()
     self.armor.rect.left = self.rect.right
     # Crafting ui toggle button
     button_w = INV_W // 2
     self.crafting_toggle = UIButton(
         "res/images/crafting_toggle.png",
         pg.Rect(self.armor.rect.bottomleft, (button_w, button_w)))
     # Defines current selected item
     self.selected_item = ItemInfo(-1, 0)
     # Defines current hotbar item
     self.hot_bar_item = -1
     # Checks if the inventory is open or not
     self.open = True
     self.toggle()
     # Player that this inventory belongs to
     self.player = player
Exemplo n.º 4
0
 def __init__(self, dim, whitelist=(), max_stack=999):
     self.dim = dim
     self.whitelist = whitelist
     self.max_stack = max_stack
     self.rect = Rect(0, 0, INV_W * self.dim[0], INV_W * self.dim[1])
     self.surface = pg.Surface((INV_W * self.dim[0], INV_W * self.dim[1]),
                               SRCALPHA)
     self.surface.fill(BKGROUND)
     # Contains all items in the inventory
     self.inv_items = [[ItemInfo(-1, 0) for i in range(dim[0])]
                       for j in range(dim[1])]
     # Inventory slots that need to be updated
     self.updates = []
     # How long we've been right clicking
     self.holding_r = 0
Exemplo n.º 5
0
 def craft(self, recipe):
     # Get result
     new_item = ItemInfo(*recipe[0])
     # First try to have the player hold the item
     if not self.selected_item.is_item:
         self.selected_item.set_info(new_item)
     # Then try to add it to whatever the player is holding
     elif self.selected_item.same_as(new_item):
         grab = min(new_item.amnt,
                    self.selected_item.max_stack - self.selected_item.amnt)
         self.selected_item.amnt += grab
         new_item.amnt -= grab
     else:
         # Finally try to put it into the inventory
         if not self.pick_up_item(new_item):
             # Drop whatever is left
             game_vars.drop_item(DroppedItem(new_item), True)
     # Get the amounts of ingredients that are required
     parts = [r.copy() for r in recipe[1:]]
     # Remove ingredients
     for y in range(self.dim[1]):
         for x in range(self.dim[0]):
             item = self.get_item(y, x)
             if item.is_item:
                 i = 0
                 while i < len(parts):
                     item_id, amnt = parts[i]
                     if item.item_id == item_id:
                         # Remove the item
                         transfer = min(item.amnt, amnt)
                         item.amnt -= transfer
                         parts[i][1] -= transfer
                         # Delete this item
                         if parts[i][1] <= 0:
                             del parts[i]
                             if len(parts) == 0:
                                 return
                             i -= 1
                     elif item_id > item.item_id:
                         break
                     i += 1
Exemplo n.º 6
0
 def load(self, data):
     if not data or len(data) < self.dim[0] * self.dim[1]:
         print("Missing item/amount data")
         return
     # Load items
     error = False
     for y in range(self.dim[1]):
         for x in range(self.dim[0]):
             if len(data) < 4:
                 print("Missing data at row {} / {}, col {} / {}".format(
                     y, self.dim[1], x, self.dim[0]))
                 error = True
                 break
             item = ItemInfo(-1, 0)
             self.inv_items[y][x] = item
             item.item_id = int.from_bytes(data[:2], byteorder)
             # Item defaults to nothing if it doesn't exist
             if item.item_id not in game_vars.items.keys():
                 item.amnt = 0
             else:
                 item.amnt = int.from_bytes(data[2:4], byteorder)
                 if item.is_item:
                     # Check for item data
                     if game_vars.items[item.item_id].has_data:
                         # Get length of data
                         if len(data) < 6:
                             print(
                                 "Missing bytes for item data as row {}, col {}"
                                 .format(y, x))
                             error = True
                             break
                         length = int.from_bytes(data[4:6], byteorder)
                         # Get data
                         if len(data) < length + 6:
                             print(
                                 "Missing bytes for item data as row {}, col {}"
                                 .format(y, x))
                             error = True
                             break
                         item.data = data[6:length + 6]
                         data = data[length + 2:]
             data = data[4:]
         if error:
             break
     self.draw_inventory()
     return data
Exemplo n.º 7
0
class PlayerInventory(Inventory):
    def __init__(self, player):
        super().__init__(DIM)
        # Armor inventory
        self.armor = ArmorInventory(player)
        self.armor.draw_inventory()
        self.armor.rect.left = self.rect.right
        # Crafting ui toggle button
        button_w = INV_W // 2
        self.crafting_toggle = UIButton(
            "res/images/crafting_toggle.png",
            pg.Rect(self.armor.rect.bottomleft, (button_w, button_w)))
        # Defines current selected item
        self.selected_item = ItemInfo(-1, 0)
        # Defines current hotbar item
        self.hot_bar_item = -1
        # Checks if the inventory is open or not
        self.open = True
        self.toggle()
        # Player that this inventory belongs to
        self.player = player

    def load(self, data):
        result = self.armor.load(super().load(data))
        self.select_hotbar(0)
        return result

    def write(self):
        return super().write() + self.armor.write()

    def draw(self, mouse_pos, parent_pos=(0, 0)):
        self.update()
        d = pg.display.get_surface()
        d.blit(self.surface, (0, 0), area=self.rect)
        if self.open:
            self.crafting_toggle.draw()
            self.armor.draw(mouse_pos)
            if self.rect.collidepoint(*mouse_pos):
                pos = [mouse_pos[0] - self.rect.x, mouse_pos[1] - self.rect.y]
                self.draw_hover_item(pos)

    # Gets the item currently in the player's hand
    def get_held_item(self):
        return self.selected_item

    # Gets the item currently ready to be used (in hand or hotbar)
    def get_current_item(self):
        if self.selected_item.is_item:
            return self.selected_item
        else:
            return self.get_item(0, self.hot_bar_item)

    def toggle(self):
        self.open = not self.open
        self.rect.h = INV_W * (self.dim[1] if self.open else 1)

    def draw_hover_item(self, pos):
        if self.open:
            super().draw_hover_item(pos)

    # Perform left click
    def left_click(self, pos):
        if self.rect.collidepoint(*pos):
            pos = [pos[0] - self.rect.x, pos[1] - self.rect.y]
            if self.open:
                super().left_click(pos)
            else:
                self.select_hotbar(int(pos[0] / INV_W))
            return True
        elif self.open:
            if self.armor.rect.collidepoint(*pos):
                pos = [pos[0] - self.armor.rect.x, pos[1] - self.armor.rect.y]
                self.armor.left_click(pos)
                return True
            elif self.crafting_toggle.rect.collidepoint(*pos):
                self.player.crafting_open = not self.player.crafting_open
                self.player.use_time = .3
                return True
        return False

    # Perform right click
    def right_click(self, pos):
        if self.open:
            if self.rect.collidepoint(*pos):
                pos = [pos[0] - self.rect.x, pos[1] - self.rect.y]
                x, y = pos[0] // INV_W, pos[1] // INV_W
                # Try to move the item to the armor inventory, if that fails, just right click
                item = self.get_item(y, x)
                if item.is_item:
                    if self.armor.pick_up_item(item):
                        return True
                Inventory.right_click(self, pos)
                return True
            elif self.armor.rect.collidepoint(*pos):
                pos = [pos[0] - self.armor.rect.x, pos[1] - self.armor.rect.y]
                self.armor.right_click(pos)
                return True
        return False

    # Auto moves item to all inventories in active ui
    def auto_move_item(self, row, col):
        # Make sure we are clicking an item and there is a ui up
        item = self.get_item(row, col)
        prev_amnt = item.amnt
        if item.is_item and self.player.active_ui:
            # Get ui inventories
            invs = self.player.active_ui.get_inventories()
            # Go through the inventories until we get rid of the item
            for inv in invs:
                inv.pick_up_item(item)
                if not item.is_item:
                    break
            # If some item moved, tell the current active ui
            if item.amnt != prev_amnt:
                self.player.active_ui.on_inv_pickup()
        return prev_amnt != item.amnt

    def select_hotbar(self, idx):
        if idx != self.hot_bar_item:
            if self.hot_bar_item != -1:
                pg.draw.rect(self.surface, BKGROUND,
                             (self.hot_bar_item * INV_W, 0, INV_W, INV_W), 2)
            self.hot_bar_item = idx
            pg.draw.rect(self.surface, (128, 128, 0),
                         (self.hot_bar_item * INV_W, 0, INV_W, INV_W), 2)
            self.on_change_held()

    # Runs when the current item is changed
    def on_change_held(self):
        # Update item stats
        self.player.item_stats.reset()
        if not self.selected_item.is_item:
            item = self.inv_items[0][self.hot_bar_item]
            if item.is_item:
                item_obj = game_vars.items[item.item_id]
                if isinstance(item_obj, Weapon):
                    item_obj.load_stats(self.player.item_stats, item.data)
        else:
            item_obj = game_vars.items[self.selected_item.item_id]
            if isinstance(item_obj, Weapon):
                item_obj.load_stats(self.player.item_stats,
                                    self.selected_item.data)

    # Use selected item
    def use_item(self):
        item = self.get_current_item()
        if item.is_item:
            # Reduce its amount and check if we have any left
            item.amnt -= 1
            if not item.is_item:
                self.on_change_held()

    # Pressed a certain key
    def key_pressed(self, key):
        if key == K_ESCAPE:
            self.toggle()
        elif key in hotbar_controls.keys():
            self.select_hotbar(hotbar_controls[key])

    # Scroll the hotbar
    def scroll(self, up):
        self.select_hotbar(
            min(max(0, self.hot_bar_item + (-1 if up else 1)), 9))

    # Drop the currently held item
    def drop_item(self):
        drop = None
        if self.selected_item.is_item:
            drop = DroppedItem(self.selected_item.copy())
            self.selected_item.amnt = 0
        return drop

    # Craft the given recipe
    def craft(self, recipe):
        # Get result
        new_item = ItemInfo(*recipe[0])
        # First try to have the player hold the item
        if not self.selected_item.is_item:
            self.selected_item.set_info(new_item)
        # Then try to add it to whatever the player is holding
        elif self.selected_item.same_as(new_item):
            grab = min(new_item.amnt,
                       self.selected_item.max_stack - self.selected_item.amnt)
            self.selected_item.amnt += grab
            new_item.amnt -= grab
        else:
            # Finally try to put it into the inventory
            if not self.pick_up_item(new_item):
                # Drop whatever is left
                game_vars.drop_item(DroppedItem(new_item), True)
        # Get the amounts of ingredients that are required
        parts = [r.copy() for r in recipe[1:]]
        # Remove ingredients
        for y in range(self.dim[1]):
            for x in range(self.dim[0]):
                item = self.get_item(y, x)
                if item.is_item:
                    i = 0
                    while i < len(parts):
                        item_id, amnt = parts[i]
                        if item.item_id == item_id:
                            # Remove the item
                            transfer = min(item.amnt, amnt)
                            item.amnt -= transfer
                            parts[i][1] -= transfer
                            # Delete this item
                            if parts[i][1] <= 0:
                                del parts[i]
                                if len(parts) == 0:
                                    return
                                i -= 1
                        elif item_id > item.item_id:
                            break
                        i += 1
Exemplo n.º 8
0
 def get_drops(self):
     drops = [ItemInfo(items.LEAVES, randint(1, 5))]
     if randint(1, 10) <= 7:
         drops.append(ItemInfo(items.WOOD, randint(1, 5)))
     return drops