Re: Inventory Screen
Posted: Sun Jul 26, 2015 10:32 pm
Okay, thanks!!!
Supporting creators of visual novels and story-based games since 2003.
https://lemmasoft.renai.us/forums/
Code: Select all
screen item_test1:
imagebutton auto "images/test_button_%s.png" action [ Hide("item_test1"), inventory.add(stone)] align (.52,.58)
Code: Select all
Function(inventory.add, stone)
Code: Select all
I'm sorry, but an uncaught exception occurred.
While running game code:
File "game/script.rpy", line 221, in script
s"O hello there"
File "renpy/common/00action_other.rpy", line 430, in __call__
rv = self.callable(*self.args, **self.kwargs)
File "game/script.rpy", line 168, in combine_items
if item in recipe and item.selected:
TypeError: argument of type 'Recipe' is not iterable
Code: Select all
init -1 python:
import copy
import renpy.store as store
import renpy.exports as renpy # we need this so Ren'Py properly handles rollback with classes
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("Derp", 100, 50)
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:
self.selected=not self.selected
if self.name=="Chocolate":
renpy.call_in_new_context("chocolate_event")
class Inventory(store.object):
def __init__(self, money=0):
self.money = money
self.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()
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)
#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.yminimum=52
style.button.xminimum=52
style.button_text.color="#1aff66"
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 (.5,.00)
screen inventory_screen:
add "gui/inventory.png" # the background
textbutton "Combine" action [Function(combine_items), Hide("inventory_screen"), Show("inventory_button")] align (.80,.80)
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 (.95,.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('element'), reverse=True) # we sort the items, so non-consumable items that change elemental damage (guns) are listed first
$ next_inv_page = inv_page + 1
if next_inv_page > int(len(inventory.items)/16):
$ next_inv_page = 0
for item in sorted_items:
if i+1 <= (inv_page+1)*16 and i+1>inv_page*16:
$ x += 150
if i%4==0:
$ y += 115
$ x = 500
$ 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), Hide("inventory_screen"), 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.selected:
add "gui/selected.png" xpos x ypos y anchor(.5,.5)
$ i += 1
if len(inventory.items)>9:
textbutton _("Next Page") action [SetVariable('inv_page', next_inv_page), Show("inventory_screen")] xpos .475 ypos .90
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: # too lazy to make another version of each item, we just use ATL to make hovered items super bright
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
image information = Text("INFORMATION", style="tips_top")
#Tooltips-inventory:
image tooltip_inventory_chocolate=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("A delicious bar of chocolate, it makes a great gift.", style="tips_bottom"))
image tooltip_inventory_banana=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("A healthy banana full of potassium! You can also use it as ammo for your guns! O.O Recharges 20 bullets.", style="tips_bottom"))
image tooltip_inventory_gun=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("An gun that looks like something a cop would\ncarry around. Most effective on humans.", style="tips_bottom"))
image tooltip_inventory_laser=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("An energy gun that shoots photon beams.\nMost effective on aliens.", style="tips_bottom"))
init python:
def combine_items():
for recipe in recipes:
recipe.combine_check()
inventory.selected_items = []
return
init python:
def combine_items():
for item in inventory.items:
for recipe in recipes:
recipe_tmp = recipe
if item in recipe and item.selected:
recipe_tmp.remove(item)
if len(recipe_tmp)==1:
for tmp_item in recipe:
pass
inventory.drop(item)
inventory.add(recipe[0])
return
# Declare images below this line, using the image statement.
# eg. image eileen happy = "eileen_happy.png
# Declare characters used by this game.
# The phrase in the brackets is the text that the game will display to prompt
# the player to enter the name they've chosen.
label start:
python:
player = Player("Derp", 100, 50)
player.hp = 50
player.mp = 10
chocolate = Item("Chocolate", 5, image="gui/inv_chocolate.png")
banana = Item("Banana", mp=20, image="gui/inv_banana.png", recipeItem=True)
gun = Item("Gun", element="bullets", image="gui/inv_gun.png", cost=7, recipeItem=True)
laser = Item("Laser Gun", element="laser", image="gui/inv_laser.png")
inventory = Inventory()
#add items to the initial inventory:
inventory.add(banana)
inventory.add(puffy)
recipes = [Recipe([banana, chocolate], laser)]
#recipes.append([laser, chocolate,banana])
Code: Select all
No code posted because I'm not sure if this is an inventory screen issue, or a Function thing or what! :(
Code: Select all
init -1 python:
inv_page = 0 # initial page of teh inventory screen
Code: Select all
$ next_inv_page = inv_page + 1
$ prev_inv_page = inv_page -1 #my code
if next_inv_page > int(len(inventory.items)/12):
$ next_inv_page = 0
if prev_inv_page < int(len(inventory.items)/12): #my code
$ prev_inv_page = 0
Code: Select all
if len(inventory.items)>12:
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
Code: Select all
if next_inv_page < int(len(inventory.items)/12):
$ next_inv_page = 1
Code: Select all
def use(self): #here we define what should happen when we use the item
if self.name=="Hammer":
renpy.call_in_new_context ('hammer_event')
## Seems that it hits this point, then calls back the inventory_button screen.
label hammer_event:
"You dance around with the hammer"
"Why?"
"Nobody knows!"
$ inventory.drop(hammer)
return