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