Re: Inventory Screen
Posted: Sun Dec 11, 2016 7:34 pm
I had thought for sure I had posted directly in this thread, but I must be remembering a different one or a pm! Commenting to be sure I get updates, this is great code leon. :3
Supporting creators of visual novels and story-based games since 2003.
https://lemmasoft.renai.us/forums/
Code: Select all
init -1 python:
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 Item(store.object):
def __init__(self, name, keyitem="", image=""):
self.name = name
self.keyitem=keyitem
self.image=image # image file to use for this item
def use(self): #here we define what should happen when we use the item
if self.name=="Treasure Map":
renpy.jump("items_event5")
if self.name=="Guidebook":
renpy.jump("items_event5")
if self.name=="Sneakers":
renpy.jump("items_event4")
class Inventory(store.object):
def __init__(self):
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)
if item in self.items: # this if/else statement places a limit of one of each item in the inventory
return True
else:
self.items.append(item)
def drop(self, item):
self.items.remove(item)
def item_use():
item.use()
[style.tips and style.buttons are unchanged]
[screen inventory_button is unchanged]
screen inventory_screen:
add "gui/inventory.png" # the background
modal True # prevent clicking on other stuff when inventory is shown
zorder 1
hbox align (.95,.04) spacing 20:
textbutton "Close Inventory" action [ Hide("inventory_screen"), Show("inventory_button")]
$ x = 20 # coordinates of the top left item position
$ y = 26
$ i = 0
$ sorted_items = sorted(inventory.items, key=attrgetter('keyitem'), reverse=True)
$ next_inv_page = inv_page + 1
if next_inv_page > int(len(inventory.items)/9):
$ next_inv_page = 0
for item in sorted_items:
if i+1 <= (inv_page+1)*9 and i+1>inv_page*9:
$ x += 100 # coordinates of additional items in first row
if i%9==0:
$ y += 72 # initial coordinates of first item - vert.
$ x = 92 # initial coordinates of first item - horiz.
$ pic = item.image
$ my_tooltip = "tooltip_inventory_" + pic.replace("images/other/item_", "").replace(".png", "")
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", "sound/sfx/click.wav"), Show("gui_tooltip", my_picture=my_tooltip, my_tt_ypos=693) ] unhovered [Hide("gui_tooltip")] at inv_eff
$ i += 1
if len(inventory.items)>9:
textbutton _("Next Page") action [SetVariable('inv_page', next_inv_page), Show("inventory_screen")] xpos .475 ypos .83
[rest is largely unchanged]
Code: Select all
scene bg beach
show ps neu
show screen inventory_button
ps "Click on the inventory button. The inventory should be empty."
ps "Are you done?"
ps "Click on the sneakers on the next screen to add it to your inventory."
hide ps neu
label items_event:
window hide None
call screen beachsearch
window show None
if _return == "gettreasuremap":
menu:
"Do you want to pick up the treasure map?"
"Yes":
$inventory.add(treasuremap)
jump items_event
"No, I want to pick something else":
jump items_event
"No, I'm done":
jump items_event2
if _return == "getguidebook":
menu:
"Do you want to pick up the guide book?"
"Yes":
$inventory.add(guidebook)
jump items_event
"No, I want to pick something else":
jump items_event
"No, I'm done":
jump items_event2
if _return == "getsneakers":
menu:
"Do you want to pick up the sneakers?"
"Yes":
$inventory.add(sneakers)
jump items_event
"No, I want to pick something else":
jump items_event
"No, I'm done":
jump items_event2
label items_event2:
hide screen beachsearch
show ps gri
ps "Well, is it there? Check the inventory and see!"
show ps grisne
ps "Great! Now, can you give me the sneakers?"
label items_event3:
window hide None
call screen inventory_screen
if Item.use(sneakers):
jump items_event4
elif Item.use(treasuremap):
jump items_event5
elif item.use(guidebook):
jump items_event5
else:
jump items_event5
label items_event4:
if renpy.showing("ps grisne"):
window show None
$inventory.drop(sneakers)
"You gave the sneakers to [ps]."
ps "Great, thank you!"
jump wrapitup
else:
"You can't use that here."
$renpy.rollback(force=True, checkpoints=1, defer=False, greedy=True, label=None, abnormal=True)
label items_event5:
if renpy.showing("ps grisne"):
ps "This... isn't what I wanted..."
ps "Can you please give me the sneakers?"
jump items_event3
else:
"You can't use that here."
$renpy.rollback(force=True, checkpoints=1, defer=False, greedy=True, label=None, abnormal=True)
# This ends the game.
label wrapitup:
show ps gri
ps "You will now return to the main menu. The end!"
return
Code: Select all
## ----- ITEMS -----
define inventory = Inventory()
define startingitem = Item("Starter", keyitem="starter", image="images/other/item_startingitem.png")
define treasuremap = Item("Treasure Map", image="images/other/item_map.png")
define guidebook = Item("Guidebook", image="images/other/item_guide.png")
define sneakers = Item("Sneakers", image="images/other/item_sneakers.png")
## The game starts here.
label start:
$inventory.add(startingitem)
scene bg beach
show ps neu
show screen inventory_button
ps "Click on the inventory button. The inventory should be empty."
ps "Are you done?"
ps "Click on the sneakers on the next screen to add it to your inventory."
hide ps neu
Code: Select all
## ----- ITEMS -----
#define inventory = Inventory()
#define startingitem = Item("Starter", keyitem="starter", image="images/other/item_startingitem.png")
#define treasuremap = Item("Treasure Map", image="images/other/item_map.png")
#define guidebook = Item("Guidebook", image="images/other/item_guide.png")
#define sneakers = Item("Sneakers", image="images/other/item_sneakers.png")
## The game starts here.
label start:
python:
inventory = Inventory()
startingitem = Item("Starter", keyitem="starter", image="images/other/item_startingitem.png")
treasuremap = Item("Treasure Map", image="images/other/item_map.png")
guidebook = Item("Guidebook", image="images/other/item_guide.png")
sneakers = Item("Sneakers", image="images/other/item_sneakers.png")
inventory.add(startingitem)
scene bg beach
show ps neu
show screen inventory_button
ps "Click on the inventory button. The inventory should be empty."
ps "Are you done?"
ps "Click on the sneakers on the next screen to add it to your inventory."
hide ps neu
Code: Select all
inv_page = 0 # initial page of the inventory screen
item = None
class Player(renpy.store.object):
def __init__(self, name, max_hp=0, max_mp=0, element=None, armor=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
self.armor=armor
Happy I could help!chrysagon wrote:Thanks for the great job ! That was what I was loking for.
Hm, I'm not totally sure I understand the problem... Could you perhaps post some screenshots showing what you mean? (Ex. a screenshot of what the inventory looks like, along with code showing what items should be in the inventory, and the 'selected' word thing. Do you mean the tooltip?)chrysagon wrote:I am trying to add another type of item into the inventory : different types of armor that the player will find during the game. It is also a not a consumable item. I also dupplicated code everywhere, matching the settings of the 'element' parameter. And it almost works.
But I have a few problems : it seems I can't have at the same time some information into 'element' and into 'armor'. Each time the player chooses one into the inventory, it seems to empty the other. Plus, I can't make the 'selected' word appear on a weapon (element) and an armor (armor), probably for the same reasons.
Could you please help me ?
Code: Select all
init -1 python:
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 the inventory screen
item = None
class Player(renpy.store.object):
def __init__(self, name, max_hp=0, max_mp=0, element=None, armure=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
self.armure=armure
player = Player("Derp", 100, 50)
class Item(store.object):
def __init__(self, name, player=None, hp=0, mp=0, element="", armure="", image="", cost=0):
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.armure=armure # classe d'armure
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.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
player.armure=self.armure #item to change armor; we don't drop it, since it's not a consumable item
class Inventory(store.object):
def __init__(self, money=10):
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()
#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 (.55,.05) spacing 40: #position du bouton "FERMER" Text("Épée courte.", style="tips_top")) style style.button["Foo"]
textbutton "FERMER" action [ Hide("inventory_screen")]
$ x = 515 # coordinates of the top left item position (515 et 25)
$ 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)/9):
$ next_inv_page = 0
for item in sorted_items:
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.
imagebutton idle pic hover pic xpos x ypos y action [Hide("gui_tooltip"), SetVariable("item", item), Hide("inventory_screen"), item_use] hovered [ Play ("sound", "audio/click.wav"), Show("gui_tooltip", my_picture=my_tooltip, my_tt_ypos=693) ] unhovered [Hide("gui_tooltip")] at inv_eff
if player.element and (player.element==item.element): #indicate the selected gun
add "gui/selected.png" xpos x ypos y anchor(.5,.5)
if player.armure and (player.armure==item.armure): #indicate the selected armor
add "gui/selected.png" xpos x ypos y anchor(.5,.5)
$ i += 1
if len(inventory.items)>9:
textbutton _("SUITE") action [SetVariable('inv_page', next_inv_page), Show("inventory_screen")] xpos .475 ypos .83
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(" ", style="tips_top")
#Tooltips-inventory:
#image tooltip_inventory_chocolate=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("Generic chocolate to heal\n40 points of health.", 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"))
image tooltip_inventory_epee=LiveComposite((665, 73), (3,0), ImageReference("information"), (0,-25), Text("Épée courte", style="tips_top"))
image tooltip_inventory_acuir=LiveComposite((665, 73), (3,0), ImageReference("information"), (0,-25), Text("Armure de Cuir", style="tips_top"))
image tooltip_inventory_clout=LiveComposite((665, 73), (3,0), ImageReference("information"), (0,-25), Text("Armure de Cuir Clouté", style="tips_top"))
image tooltip_inventory_potion=LiveComposite((665, 73), (3,0), ImageReference("information"), (0,-25), Text("Potion de guérison, restaure jusqu'à 10 pv.", style="tips_top"))
Code: Select all
potion = Item("Potion", hp=10, image="gui/inv_potion.png")
epee = Item("Épée", element="epee", image="gui/inv_epee.png")
acuir = Item("Armure Cuir", armure="acuir", image="gui/inv_acuir.png")
clout = Item("Armure de Cuir Clouté", armure="clout", image="gui/inv_clout.png")
Code: Select all
else:
player.element=self.element #item to change elemental damage; we don't drop it, since it's not a consumable item
player.armure=self.armure #item to change armor; we don't drop it, since it's not a consumable item
Code: Select all
label start:
python:
box = Item("box", image="img/items/box.png")
$ inventory.add(box)
Code: Select all
While running game code:
File "game/script.rpy", line 231, in script
$ inventory.add(box)
File "game/script.rpy", line 231, in <module>
$ inventory.add(box)
NameError: name 'box' is not defined
Code: Select all
image tooltip_inventory_dark_side_letter = LiveComposite((700, 73), (3,0), ImageReference("information"),
(3,30), Text(__("Это первое, что я нашел у себя в карманах. Вы не поверите, но это - письмо!"), style="tips_bottom"))
Code: Select all
# items.rpy:58
old "Это первое, что я нашел у себя в карманах. Вы не поверите, но это - письмо!"
new "This was the first thing I found in my pockets. You could not believe but it's a latter!
Code: Select all
init python:
class Item(store.object):
def __init__(self, name, image="", cost=0):
self.name = name
self.image=image # image file to use for this item
self.cost=cost # how much does it cost in shops?
class Inventory(store.object):
def __init__(self, money=50):
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 sell(self, item):
self.money += item.cost
self.items.remove(item)
def buy(self, item):
if self.money >= item.cost:
self.items.append(item)
self.money -= item
return True
else:
return False
#message = "Item added to inventory"
#renpy.show_screen("purchase_done", message=message)
#else:
#message = "You don't have enough money to buy this item"
#renpy.show_screen("inventory_popup", message=message)
def earn(self, amount):
self.money += amount
def has_item(self, item):
if item in self.items:
return True
else:
return False
###############
## Items
fbpwmag1 = Item("Magazine", image="images/inv_fbpwmag1.png")
chocolate = Item("Chocolate", image="images/inv_chocolate.png")
banana = Item("Banana", image="images/inv_banana.png")
gun = Item("Gun", image="images/inv_gun.png", cost=60)
laser = Item("Laser Gun", image="images/inv_laser.png")
dirt = Item("Dirt", image="images/inv_dirt.png")
inventory = Inventory()
Code: Select all
init -1 python:
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 the inventory screen
item = None
#def item_use():
# item.use()
#Tooltips:
style.tips_top = Style(style.default)
style.tips_top.size=30
style.tips_top.color="fff"
style.tips_top.outlines=[(1, "6b7eef", 0,0)]
style.tips_top.kerning = 5
style.tips_bottom = Style(style.tips_top)
style.tips_top.size=40
style.tips_bottom.outlines=[(0, "6b7eef", 1, 1), (0, "6b7eef", 2, 2)]
style.tips_bottom.kerning = 2
style.button.background=Frame("images/inv_frame.png",25,25)
style.button.yminimum=102
style.button.xminimum=102
style.button_text.color="000"
screen scr_gui_bag:
add "images/bg_bag.jpg" # the background
tag menu
## Money Value
hbox align (0.53,0.12) spacing 20:
text "$"+str(inventory.money) size 60
## Exit
imagebutton auto "bg_bag_exit_%s.png" xpos 0 ypos 0 focus_mask True action Return("scr_gui_bag")
## Inventory Slots
$ x = 350 # coordinates of the top left item position
$ y = 150
$ i = 0
$ sorted_items = sorted(inventory.items, 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)/12):
$ next_inv_page = 0
for item in sorted_items:
if i+1 <= (inv_page+1)*12 and i+1>inv_page*12:
$ x += 245
if i%6==0:
$ y += 240
$ x = 350
$ pic = item.image
$ my_tooltip = "tooltip_inventory_" + pic.replace("images/inv_", "").replace(".png", "") # we use tooltips to describe what the item does.
#imagebutton idle pic hover pic xpos x ypos y action [Hide("gui_tooltip"), SetVariable("item", item), Hide("inventory_screen"), item_use] hovered [Show("gui_tooltip", my_picture=my_tooltip, my_tt_ypos=693) ] unhovered [Hide("gui_tooltip")] at inv_eff
imagebutton idle pic hover pic xpos x ypos y action [Hide("gui_tooltip"), SetVariable("item", item), Hide("inventory_screen")] hovered [Show("gui_tooltip", my_picture=my_tooltip, my_tt_ypos=693) ] unhovered [Hide("gui_tooltip")] at inv_eff
$ i += 1
if len(inventory.items)>12:
textbutton _("Next Page") action [SetVariable('inv_page', next_inv_page), Show("scr_gui_bag")] xpos 0.455 ypos 0.68
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:", size=40)#, style="tips_top")
#Tooltips-inventory:
image tooltip_inventory_fbpwmag1=LiveComposite((1300, 80), (225,110), ImageReference("information"), (250,175), Text("{i}Magazine, Issue no. 147.{/i}.", size=40))
#image tooltip_inventory_chocolate=LiveComposite((1300, 80), (225,110), ImageReference("information"), (250,175), Text("Generic chocolate to heal 40 points of health.", size=40))
#image tooltip_inventory_banana=LiveComposite((1300, 80), (225,110), ImageReference("information"), (250,175), Text("A healthy banana full of potassium! Ironically, hard to use as a dildo!", size=40))
#image tooltip_inventory_gun=LiveComposite((1300, 80), (225,110), ImageReference("information"), (250,175), Text("An gun that looks like something a cop would carry around. Most effective on humans.", size=40))
#image tooltip_inventory_laser=LiveComposite((1300, 80), (225,110), ImageReference("information"), (250,175), Text("An energy gun that shoots photon beams.\nMost effective on aliens.", size=40))
Hey first of all, thanks for providing the inventory code! I've tried using your code for my own inventory system, but I've ran into a few problems that I can't seem to solve. Here's my code:leon wrote: ↑Sat Jul 12, 2014 12:31 pm You probably forgot to create the inventory object:You need to create an inventory object after "label start:" and before using it. Check out the code in script.rpy just after label start.Code: Select all
inventory = Inventory()
Code: Select all
init -1 python:
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("default", 100, 50)
class Item(store.object):
def __init__(self, name, player=None, hp=0, mp=0, element="", image="", cost=0):
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.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, money=10):
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()
#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_screen:
tag menu
imagemap:
ground "gui/inventory_background.png"
hover "gui/inventory_background.png"
selected_idle "gui/inventory_background.png"
selected_hover "gui/inventory_background.png"
alpha False
hotspot (1170, 0, 110, 140) action [Return(), Hide("itemmenu")]
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))
$ 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)/9):
$ next_inv_page = 0
for item in sorted_items:
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.
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 player.element and (player.element==item.element): #indicate the selected gun
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 .83
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_gemblue=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("A blue gem.", style="tips_bottom"))
image tooltip_inventory_gemred=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("A red gem.", style="tips_bottom"))
image tooltip_inventory_gemgreen=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("A green gem.", style="tips_bottom"))
image tooltip_inventory_book1=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("A pretty looking book.", style="tips_bottom"))
image tooltip_inventory_book2=LiveComposite((665, 73), (3,0), ImageReference("information"), (3,30), Text("A pretty looking book.", style="tips_bottom"))
# The script of the game goes in this file.
# Declare characters used by this game. The color argument colorizes the
# name of the character.
define e = Character("Eileen")
# The game starts here.
label start:
python:
player = Player("default", 100, 50)
player.hp = 50
player.mp = 10
gemblue = Item("Blue Gem", hp=40, image="images/inventory/gem_blue.png")
gemgreen = Item("Green Gem", mp=20, image="images/inventory/gem_green.png")
gemred = Item("Red Gem", element="bullets", image="images/inventory/gem_red.png", cost=7)
book1 = Item("Book 1", element="laser", image="images/inventory/book1.png")
book2 = Item("Book 2", element="laser", image="images/inventory/book2.png")
inventory = Inventory()
#add items to the initial inventory:
inventory.add(gemblue)
inventory.add(gemgreen)
inventory.add(gemred)
# Show a background. This uses a placeholder by default, but you can
# add a file (named either "bg room.png" or "bg room.jpg") to the
# images directory to show it.
scene bg room
# This shows a character sprite. A placeholder is used, but you can
# replace it by adding a file named "eileen happy.png" to the images
# directory.
show eileen happy
# These display lines of dialogue.
"Hello, world."
e "You've created a new Ren'Py game."
e "Once you add a story, pictures, and music, you can release it to the world!"
menu:
"Add book1":
$inventory.add(book1)
e "Add a book!"
jump label1
"Add book2":
$ inventory.append(["images/inventory/book2.png", "images/inventory/book2.png", "images/inventory/book2_selected.png", "Book 2", "A book 2"])
e "Add a book!"
jump label1
label label1:
e "Added a book!"
# This ends the game.
return
Code: Select all
I'm sorry, but an uncaught exception occurred.
While running game code:
File "game/script.rpy", line 90, in execute
screen inventory_screen:
File "game/script.rpy", line 90, in execute
screen inventory_screen:
File "game/script.rpy", line 109, in execute
$ 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
File "game/script.rpy", line 109, in <module>
$ 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
NameError: name 'inventory' is not defined
-- Full Traceback ------------------------------------------------------------
Full traceback:
File "renpy/common/_layout/screen_main_menu.rpym", line 28, in script
python hide:
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/ast.py", line 814, in execute
renpy.python.py_exec_bytecode(self.code.bytecode, self.hide, store=self.store)
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/python.py", line 1719, in py_exec_bytecode
exec bytecode in globals, locals
File "renpy/common/_layout/screen_main_menu.rpym", line 30, in <module>
ui.interact()
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/ui.py", line 285, in interact
rv = renpy.game.interface.interact(roll_forward=roll_forward, **kwargs)
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/display/core.py", line 2538, in interact
scene_lists.replace_transient()
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/display/core.py", line 822, in replace_transient
self.remove(layer, tag)
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/display/core.py", line 1107, in remove
self.hide_or_replace(layer, remove_index, "hide")
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/display/core.py", line 1031, in hide_or_replace
d = oldsle.displayable._hide(now - st, now - at, prefix)
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/display/screen.py", line 443, in _hide
self.update()
File "/Volumes/OTHERS/VN/RenPy/renpy-6.99.11-sdk/renpy/display/screen.py", line 578, in update
self.screen.function(**self.scope)
File "game/script.rpy", line 90, in execute
screen inventory_screen:
File "game/script.rpy", line 90, in execute
screen inventory_screen:
File "game/script.rpy", line 109, in execute
$ 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
File "game/script.rpy", line 109, in <module>
$ 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
NameError: name 'inventory' is not defined
Darwin-17.4.0-x86_64-i386-64bit
Ren'Py 6.99.12.4.2187
Code: Select all
#Inventory Icon screen display a backpack icon on mid right screen, linked to an working inventory code
screen inv_box1():
imagebutton:
idle "HUDINV_idle001.png"
hover "HUDINV_hover001.png"
xpos 0.933 ypos 0.417
focus_mask True
action [Hide("inventory_screen"), Show("inventory_screen")]
Code: Select all
#+++++++++++++++++++++++++++INVENTORY pop up screen is here:
init -1 python:
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):
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.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, money=10):
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()
#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/frameInv.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 (.95,.04) spacing 20:
#textbutton "Close Inventory"
#action [ Hide("inventory_screen")]
#Imagebutton for hide inventory:
imagebutton idle "HUDINV_idle001.png" hover "HUDINV_hover001.png" xpos 0.933 ypos 0.417 action [Hide("inventory_screen")]
$ 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)/9):
$ next_inv_page = 0
for item in sorted_items:
if i+1 <= (inv_page+1)*9 and i+1>inv_page*9:
$ x += 190
if i%3==0:
$ y += 209
$ x = 607
$ pic = item.image
$ my_tooltip = "tooltip_inventory_" + pic.replace("gui/inv_", "").replace(".png", "") # we use tooltips to describe what the item does.
imagebutton idle pic hover pic xpos x ypos y action [Hide("gui_tooltip"), Show("inventory_screen"), SetVariable("item", item), Hide("inventory_screen"), item_use] hovered [ Play ("sound", "sound/klick002.ogg"), Show("gui_tooltip", my_picture=my_tooltip, my_tt_ypos=693) ] unhovered [Hide("gui_tooltip")] at inv_eff
if player.element and (player.element==item.element): #indicate the selected gun
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 .83
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("Generic chocolate to heal\n40 points of health.", 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"))
Code: Select all
label start:
init -1 python:
player = Player("Derp", 100, 50)
player.hp = 50
player.mp = 10
chocolate = Item("Chocolate", hp=40, image="gui/inv_chocolate.png")
banana = Item("Banana", mp=20, image="gui/inv_banana.png")
gun = Item("Gun", element="bullets", image="gui/inv_gun.png", cost=7)
laser = Item("Laser Gun", element="laser", image="gui/inv_laser.png")
inventory = Inventory()
#add items to the initial inventory:
inventory.add(chocolate)
inventory.add(chocolate)
inventory.add(banana)