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
elproxxgamer
Newbie
Posts: 10
Joined: Sun Aug 11, 2019 9:53 pm
itch: renpytom
Contact:

Inventory

#1 Post by elproxxgamer »

hello I have a problem with my inventory, I took an inventory from a tutorial I used it to my liking, but when using conditions it does not print them for me

Code: Select all

     $ cookbook = list() 
   
  
    $ mochila_inv = Inventory("Mochila") 
    $ tienda_inv = Inventory("tienda")

Code: Select all

label menu2:

    menu :

        "dar chocolate" if chocolate in mochila_inv.inv :
            $ mochila_inv.take(chocolate,+1)
        "quitar chocolate"if "chocolate" in mochila_inv.inv:
            $ mochila_inv.drop(chocolate,1)
        "otra opcion ":
            $ mochila_inv.drop(chocolate,1)

Code: Select all

init python: 
    import renpy.store as store    
    
    class Item(store.object):
        def __init__(self, name, desc, icon=False, value=0, act=Show("inventory_popup", message="No pasó nada!"), type="item", recipe=False):
            global cookbook
            self.name = name
            self.desc = desc
            self.icon = icon
            self.value = value               
            self.act = act # acción de pantalla
            self.type = type # tipo de artículo
            self.recipe = recipe # nested list of [ingredient, qty]   
            
            if recipe:
                cookbook.append(self)
                cookbook.sort(key=lambda i: i.name) #alpha order

        def change(self, name, desc=False, icon=False, value=False, act=False, recipe=False): 
            self.name = name
            if desc:
                self.desc = desc
            if icon:
                self.icon = icon
            if value:
                self.value = value   
            if act:
                self.act = act
            if recipe:
                self.recipe = recipe                
            
    class Inventory(store.object):
        def __init__(self, name, money=0, barter=100):
            self.name = name
            self.money = money
            self.barter = barter #porcentaje del valor pagado por los artículos         
            self.inv = []  # elementos almacenados en la lista anidada [item object, qty]
            self.sort_by = self.sort_name
            self.sort_order = True #Ascendiendo descendiendo
            self.grid_view = True
            
        def buy(self, item, price):            
            self.deposit(price)            
            self.take(item[0])                

        def check(self, item):
            if self.qty(item):
                for i in self.inv:
                    if i[0] == item:        
                        return self.inv.index(i) # returns item index (location)            
            
        def check_recipe(self, item): # Verifique que todos los ingredientes estén en inv
            checklist = list()
            for i in item.recipe:
                if self.qty(i[0]) >= i[1]:
                    checklist.append(True)
            if len(checklist) == len(item.recipe):
                return True
            else:
                return False        
                
        def craft(self, item):
            for line in item.recipe:
                self.drop(line[0], line[1])
            self.take(item)  
            message = "Crafted a %s!" % (item.name)
            renpy.show_screen("inventory_popup", message=message)   
                            
        def deposit(self, amount):
            self.money -= amount   
                            
        def drop(self, item, qty=1):
            if self.qty(item):
                item_location = self.check(item)
                if self.inv[item_location][1] > qty:
                    self.inv[item_location][1] -= qty
                else:
                    del self.inv[item_location]                      
                            
        def qty(self, item):
            for i in self.inv:
                if i[0] == item:   
                    return i[1] # returns quantity   
                    
        def sell(self, item, price):
            self.withdraw(price)
            self.drop(item[0])
            
        def sort_name(self):
            self.inv.sort(key=lambda i: i[0].name, reverse=self.sort_order)
            
        def sort_qty(self):
            self.inv.sort(key=lambda i: i[1], reverse=self.sort_order)
                      
        def sort_value(self):
            self.inv.sort(key=lambda i: i[0].value, reverse=self.sort_order)
           
        def take(self, item, qty=1):
            if self.qty(item):
                item_location = self.check(item)            
                self.inv[item_location][1] += qty                  
            else:
                self.inv.append([item,qty])  

        def withdraw(self, amount):
            self.money += amount
            
    def calculate_price(item, buyer):
        if buyer:
            price = item[0].value * (buyer.barter * 0.01)
            return int(price)
        
    def money_transfer(depositor, withdrawer, amount):
        if depositor.money >= amount:
            depositor.deposit(amount)
            withdrawer.withdraw(amount) 
        else:
            message = "Sorry, %s doesn't have %d!" % (buyer.name, amount) 
            renpy.show_screen("inventory_popup", message=message) 

    def trade(seller, buyer, item):
        seller.drop(item[0])
        buyer.take(item[0])              
        
    def transaction(seller, buyer, item):
        price = calculate_price(item, buyer)
        if buyer.money >= price:   
            seller.sell(item, price)
            buyer.buy(item, price)
        else:
            message = "Sorry, %s doesn't have enough money!" % (buyer.name)
            renpy.show_screen("inventory_popup", message=message)

    transfer_amount = 0
default self.inv = []  

screen tooltip(item=False,seller=false):      
    if item:
        hbox:
            xalign 0.5 yalign 1.0
            if seller:
                text ("[item[0].name] ")
            else:
                text "[item[0].name] " 

screen inventario_screen(first_inventory, second_inventory=False, trade_mode=False, bank_mode=False):
    default crafting_screen = False
    tag menu
    modal True        
    frame:
        add "inventory" align (0.48,0.23)
        style_group "invstyle"
        area (0.3, 0.092, 500, 500)        
        hbox:
            
            vbox:
                              
                if second_inventory:
                    use money(first_inventory, second_inventory, bank_mode) 
                use inventory_view(first_inventory, second_inventory, trade_mode)                          
      
             
                hbox align (0.5,0.85):
        
                    imagebutton:
                        idle "cruz_inventory"
                        hover "cruz_inventory2"
                        action Hide("inventario_screen")
            if second_inventory:
                vbox:
                    label second_inventory.name  
                                          
                    use inventory_view(second_inventory, first_inventory, trade_mode)
                
            if crafting_screen:
                use crafting(first_inventory)
                
screen inventory_view(inventory, second_inventory=False, trade_mode=False):     
    side "c r":
        style_group "invstyle"
        area (0.04, 0.04, 500, 600) 
        vpgrid id ("vp"+inventory.name):
            draggable True   
            mousewheel True
            xsize 500 ysize 450
            if inventory.grid_view:
                cols 3 spacing 50
            else:
                cols 1 spacing 50
            for item in inventory.inv:
                $ name = item[0].name
                $ desc = item[0].desc
                $ value = item[0].value
                $ qty = str(item[1])
                hbox:
                    if item[0].icon:
                        $ icon = item[0].icon
                        $ hover_icon = im.Sepia(icon)                              
                        imagebutton:
                            idle LiveComposite((100,100), (0,0), icon, (0,0), Text(qty))
                            hover LiveComposite((100,100), (0,0), hover_icon, (0,0), Text(qty))
                            action (If(not second_inventory, item[0].act, (If(trade_mode, Function(trade,inventory, second_inventory, item), Function(transaction,inventory, second_inventory, item)))))
                            hovered Show("tooltip",item=item,seller=second_inventory)
                            unhovered Hide("tooltip")
                  
                     
                                    
                    
                    else:                               
                        textbutton "[name] ([qty])" action (If(not second_inventory, item[0].act,(If(trade_mode, Function(trade,inventory, second_inventory, item), Function(transaction,inventory, second_inventory, item))))) hovered Show("tooltip",item=item,seller=second_inventory) unhovered Hide("tooltip")
                    
            
            ## maintains spacing in empty inventories.
            if len(inventory.inv) == 0:
                add Null(height=100,width=100)
                                    
        vbar value YScrollValue("vp"+inventory.name)

    
screen money(inventory, second_inventory, bank_mode=False):    
    hbox:
        style_group "invstyle"
        text "Money: [inventory.money]"
        if bank_mode and inventory.money:
            textbutton "Transfer" action Show("banking", depositor=inventory, withdrawer=second_inventory)
    
screen banking(depositor, withdrawer):    
    modal True
    frame:
        style_group "invstyle"        
        vbox:
            label "Money Transfer"
            text "Amount: [transfer_amount]"
            bar value VariableValue("transfer_amount", depositor.money, max_is_zero=False, style='scrollbar', offset=0, step=0.1) xmaximum 200
            
            hbox: #examples of the types of controls you can set up                
                for amount in [50,100,250,depositor.money]:
                    if depositor.money>=amount:
                        textbutton str(amount) action SetVariable("transfer_amount", amount)              
            hbox:
                textbutton "Transfer" action [Function(money_transfer, depositor, withdrawer, transfer_amount), SetVariable("transfer_amount", 0), Hide("banking")]
                textbutton "Cancel" action Hide("banking")

screen crafting(inventory):
    vbox:            
        label "Recipes"
        hbox:
            xmaximum 600 xminimum 600 xfill True         
            text "Name" xalign 0.5   
            text "Ingredients" xalign 0.5   
        side "c r":
            area (0,0,600,400)
            viewport id "cookbook":           
                draggable True
                mousewheel True
                vbox:
                    for item in cookbook:
                        hbox:                            
                            first_spacing 25 spacing 10
                            hbox:
                                xmaximum 250 xminimum 250 xfill True box_wrap True
                                if item.icon:
                                    add im.FactorScale(item.icon, 0.33)
                                if inventory.check_recipe(item):
                                    textbutton item.name action Function(inventory.craft,item)
                                else:                                                                   
                                    text item.name
                            for i in item.recipe: 
                                if i[0].icon:
                                    add im.FactorScale(i[0].icon, 0.33)
                                else:
                                    text i[0].name
                                if inventory.qty(i[0]) >= i[1]:
                                    text "x" + str(i[1]) bold True
                                else:
                                    text "x" + str(i[1])             
            vbar value YScrollValue("cookbook") 
        textbutton "Hide" action ToggleScreenVariable("crafting_screen") xalign 0.5
    



screen inventory_popup(message):
    zorder 100
    frame:
        add "mensaje" align (0.5,0.5)
        area (0.35,0.35,400,100)
        hbox:
            text message
    timer 1.5 action Hide("inventory_popup")
    
init -2: 

    ## STYLES ##
    style invstyle_frame:
        xalign 0.5
        yalign 0.5
        
    style invstyle_label_text:
        size 30
        
    style invstyle_label:
        xalign 0.5    
    

Post Reply

Who is online

Users browsing this forum: Google [Bot]