displaying tooltips in inventory

Discuss how to use the Ren'Py engine to create visual novels and story-based games. New releases are announced in this section.
Forum rules
This is the right place for Ren'Py help. Please ask one question per thread, use a descriptive subject like 'NotFound error in option.rpy' , and include all the relevant information - especially any relevant code and traceback messages. Use the code tag to format scripts.
Post Reply
Message
Author
asylumsweetie
Regular
Posts: 31
Joined: Sun Mar 31, 2013 2:37 am
Contact:

displaying tooltips in inventory

#1 Post by asylumsweetie »

I'm using some code for an inventory system that I found in the cookbook I think and I don't understand the section on tooltips and it isn't working the way I'd expect it to.

here's the relevant sections

Code: Select all

   ######################################Inventory Stuff#################################
init -1 python:
    import copy
    from operator import attrgetter # we need this for sorting items

    inv_page = 0 # initial page of teh inventory screen
    item = None
    class Player(renpy.store.object):
        def __init__(self, name, max_hp=0, max_mp=0, element=None):
            self.name=name
            self.max_hp=max_hp
            self.hp=max_hp
            self.max_mp=max_mp
            self.mp=max_mp
            self.element=element
    player = Player("MSPAR", 100, 50)

    class Recipe(store.object):
        def __init__(self, items=[], item_created=None):
            self.items = items
            self.item_created = item_created
        def combine_check(self):
            too_many=False # too many items selected?
            correct_recipe_items = copy.copy(self.items) # make a copy of the list of recipe items
            for item in inventory.selected_items:
                if item.recipeItem: # and item in self.items:
                    if item in correct_recipe_items:
                        correct_recipe_items.remove(item) # remove the current item from the list of correct_recipe_items; if correct_recipe_items is empty at the end, we have created the recipe
                    if not (item in self.items): # current item is not in this recipe
                        too_many=True
            if len(correct_recipe_items) == 0 and not too_many: # correct_recipe_items is empty means we have selecte just the right items
                inventory.add(self.item_created) # add the newly created item
                for drop_item in self.items: # remove all the items in this recipe from inventory
                    inventory.drop(drop_item)

    class Item(store.object):
        def __init__(self, name, player=None, hp=0, mp=0, element="", image="", cost=0, recipeItem=False):
            self.selected=False
            self.recipeItem=recipeItem
            self.name = name
            self.player=player # which character can use this item?
            self.hp = hp # does this item restore hp?
            self.mp = mp # does this item restore mp?
            self.element=element # does this item change elemental damage?
            self.image=image # image file to use for this item
            self.cost=cost # how much does it cost in shops?
        def use(self): #here we define what should happen when we use the item
            if self.recipeItem:
                if self in inventory.selected_items:
                    inventory.selected_items.remove(self)
                else:
                    inventory.selected_items.append(self)
            if self.name=="Palmhusk":
                renpy.call_in_new_context("phonemenu")
            if self.name=="Trophy":
                renpy.call_in_new_context ("oldphoto")
            if self.name=="Complete Panel":
                renpy.call_in_new_context("roosterpuzzle")
            if self.hp>0: #healing item
                player.hp = player.hp+self.hp
                if player.hp > player.max_hp: # can't heal beyond max HP
                    player.hp = player.max_hp
                inventory.drop(self) # consumable item - drop after use
            elif self.mp>0: #mp restore item
                player.mp = player.mp+self.mp
                if player.mp > player.max_mp: # can't increase MP beyond max MP
                    player.mp = player.max_mp
                inventory.drop(self) # consumable item - drop after use
            else:
                player.element=self.element #item to change elemental damage; we don't drop it, since it's not a consumable item

    class Inventory(store.object):
        def __init__(self):
            self.items = []
            self.selected_items = []
        def add(self, item): # a simple method that adds an item; we could also add conditions here (like check if there is space in the inventory)
            self.items.append(item)
        def drop(self, item):
            self.items.remove(item)
        def buy(self, item):
            if self.money >= item.cost:
                self.items.append(item)
                self.money -= item.cost

    def item_use():
        item.use()

    #Tooltips:
    style.tips_top = Style(style.default)
    #style.title.font="gui/arial.ttf"
    style.tips_top.size=14
    style.tips_top.color="fff"
    style.tips_top.outlines=[(3, "6b7eef", 0,0)]
    style.tips_top.kerning = 5

    style.tips_bottom = Style(style.tips_top)
    style.tips_top.size=20
    style.tips_bottom.outlines=[(0, "6b7eef", 1, 1), (0, "6b7eef", 2, 2)]
    style.tips_bottom.kerning = 2

    style.button.background=Frame("gui/frame.png",25,25)
    style.button.yminimum=52
    style.button.xminimum=52
    style.button_text.color="000"


    showitems = True #turn True to debug the inventory
    # def display_items_overlay():
        # if showitems:
            # inventory_show = "Money:" + str(inventory.money) + " HP: " + str(player.hp) + " bullets: " + str(player.mp) + " element: " + str(player.element) + "\nInventory: "
            # for i in range(0, len(inventory.items)):
                # item_name = inventory.items[i].name
                # if i > 0:
                    # inventory_show += ", "
                # inventory_show += item_name

            # ui.frame()
            # ui.text(inventory_show, color="#000")
    # config.overlay_functions.append(display_items_overlay)


screen inventory_button:
    textbutton "Show Inventory" action [ Show("inventory_screen"), Hide("inventory_button")] align (.95,.04)

screen inventory_screen:
    add "gui/inventory.png" # the background
    modal True #prevent clicking on other stuff when inventory is shown
    #use battle_frame(char=player, position=(.97,.20)) # we show characters stats (mp, hp) on the inv. screen
    #use battle_frame(char=dog, position=(.97,.50))
    hbox align (.75,.04) spacing 20:
        textbutton "Close Inventory" action [ Hide("inventory_screen"), Show("inventory_button")]
    $ x = 515 # coordinates of the top left item position
    $ y = 25
    $ i = 0
    $ sorted_items = sorted(inventory.items, key=attrgetter('name')) #sort by name
    $ next_inv_page = inv_page + 1
    $ prev_inv_page = inv_page -1 #my code
    if next_inv_page > int(len(inventory.items)/9):
        $ next_inv_page = 0
    if prev_inv_page < int(len(inventory.items)/9): #my code
        $ prev_inv_page = 0
    if next_inv_page < int(len(inventory.items)/9):
        $ next_inv_page = 1

    $ tmp_inventory = []
    for item in sorted_items:
        $ tmp_inventory.append(item)
        if tmp_inventory.count(item) == 1:
            if i+1 <= (inv_page+1)*9 and i+1>inv_page*9:
                $ x += 190
                if i%3==0:
                    $ y += 170
                    $ x = 515
                $ pic = item.image
                $ my_tooltip = "tooltip_inventory_" + pic.replace("gui/inv_", "").replace(".png", "") # we use tooltips to describe what the item does.
                if item.recipeItem:
                    imagebutton idle pic hover pic xpos x ypos y action [Hide("gui_tooltip"), SetVariable("item", item), item_use] hovered [ Play ("sound", "sfx/click.wav"), Show("gui_tooltip", my_picture=my_tooltip, my_tt_ypos=693) ] unhovered [Hide("gui_tooltip")] at inv_eff
                else:
                    imagebutton idle pic hover pic xpos x ypos y action [Hide("gui_tooltip"), Show("inventory_button"), SetVariable("item", item), item_use] hovered [ Play ("sound", "sfx/click.wav"), Show("gui_tooltip", my_picture=my_tooltip, my_tt_ypos=693) ] unhovered [Hide("gui_tooltip")] at inv_eff
                if item in inventory.selected_items:
                    add "gui/selected.png" xpos x ypos y anchor(.5,.5)
                $ i += 1
            if sorted_items.count(item) > 1:
                text str(sorted_items.count(item)) xpos x+50 ypos y-50 anchor(.5,.5) color "#000" #align(.9,.1)    if item.recipeItem:
        if len(inventory.items)>9:
            textbutton _("Next Page") action [SetVariable('inv_page', next_inv_page), Show("inventory_screen")] xpos .475 ypos .83
            textbutton _("Prev Page") action [SetVariable('inv_page', prev_inv_page), Show("inventory_screen")] xpos .575 ypos .83
    textbutton "Combine" action [Function(combine_items)] align (.70,.89)
    if item.selected:
        add "gui/selected.png" xpos x ypos y anchor(.5,.5)

screen gui_tooltip (my_picture="", my_tt_xpos=58, my_tt_ypos=687):
    add my_picture xpos my_tt_xpos ypos my_tt_ypos

init -1:
    transform inv_eff:
        zoom 0.5 xanchor 0.5 yanchor 0.5
        on idle:
            linear 0.2 alpha 1.0
        on hover:
            linear 0.2 alpha 2.5
        on selected_idle:
            linear 0.2 alpha 1.0
        on selected_hover:
            linear 0.2 alpha 2.5

    image information = Text("INFORMATION", style="tips_top")
    #Tooltips-inventory:
    image tooltip_inventory_mushroom=LiveComposite((665, 73), (3,-30), ImageReference("information"), (3,0), Text("A small blue mushroom. Edible?", style="tips_bottom"))
    image tooltip_inventory_husky=LiveComposite((665, 73), (3,-30), ImageReference("information"), (3,0), Text("Your trusty palmhusk!", style="tips_bottom"))
    image tooltip_inventory_moss=LiveComposite((665, 73), (3,-30), ImageReference("information"), (3,0), Text("A clump of dry moss", style="tips_bottom"))
    image tooltip_inventory_knife=LiveComposite((665, 73), (3,-30), ImageReference("information"), (3,0), Text("A stone knife", style="tips_bottom"))
    image tooltip_inventory_fork=LiveComposite((665, 73), (3,-30), ImageReference("information"), (3,0), Text("A stone fork", style="tips_bottom"))
    image tooltip_inventory_spoon=LiveComposite((665, 73), (3,-30), ImageReference("information"), (3,0), Text("A stone spoon", style="tips_bottom"))
    image tooltip_inventory_bowl=LiveComposite((665, 73), (3,-30), ImageReference("information"), (3,0), Text("A stone bowl", style="tips_bottom"))

init python:
    def combine_items():
        for recipe in recipes:
            recipe.combine_check()
        inventory.selected_items = []
        return
######################################################################################
    
In game, when I hover over any item (for example the mushroom) in the inventory the message "Image 'tooltip_inventory_mushroom_idle' not found is displayed in red where the tooltip should appear. But it shouldn't be looking for an image should it, it should be displaying text? I don't understand why the code even has it making a live composite there. Anyway I tried making an image and naming it "tooltip_inventory_mushroom_idle" and putting that in the gui folder just to see what would happen and nothing changed. Can someone explain this to me in small words?
Last edited by asylumsweetie on Fri Jul 21, 2023 1:03 pm, edited 1 time in total.

Exiscoming
Regular
Posts: 132
Joined: Tue Apr 29, 2014 5:37 pm
Contact:

Re: displaying tooltips in inventory

#2 Post by Exiscoming »

So I'm just wondering if this will be of help. I use tooltips in my code like this.

Code: Select all

        if giftStickers >= 1:
            vbox xalign 0.39 yalign 0.3:
                imagebutton:
                    idle "gui/items/stickers.png"
                    hover "gui/items/stickers-hover.png" tooltip "stickersTooltip"
                    action Show("inventory")
            $ tooltip = GetTooltip()
            if tooltip == "stickersTooltip":
                text "These are stickers" xalign 0.52 yalign 0.9
Sorry if this isn't what you were looking for.

asylumsweetie
Regular
Posts: 31
Joined: Sun Mar 31, 2013 2:37 am
Contact:

Re: displaying tooltips in inventory

#3 Post by asylumsweetie »

Unfortunately I don't think I understand the inventory code well enough to remove the existing tool tips code to replace it without breaking everything...

Post Reply

Who is online

Users browsing this forum: Google [Bot]