Adding Stats to Characters ... easily

A place for Ren'Py tutorials and reusable Ren'Py code.
Forum rules
Do not post questions here!

This forum is for example code you want to show other people. Ren'Py questions should be asked in the Ren'Py Questions and Announcements forum.
Message
Author
nextgen
Newbie
Posts: 6
Joined: Sat Jan 13, 2018 7:28 pm
Projects: Forgotten Legacy
Organization: Gemini Productions
Contact:

Re: Adding Stats to Characters ... easily

#16 Post by nextgen »

Friends i am very new to Ren'py, what would i need to add to my script.rpy to include the separate stats file above in 1st post

User avatar
Remix
Eileen-Class Veteran
Posts: 1628
Joined: Tue May 30, 2017 6:10 am
Completed: None... yet (as I'm still looking for an artist)
Projects: An un-named anime based trainer game
Contact:

Re: Adding Stats to Characters ... easily

#17 Post by Remix »

Ren'Py does not need to expressly "include" other files into the script, anything named with a .rpy extension is automatically read at start up.

So, just create a new rpy file and put the bits you want in there.
Frameworks & Scriptlets:

User avatar
isak grozny
Regular
Posts: 46
Joined: Mon Apr 11, 2016 10:17 am
Projects: The Bitter Drop [Modern Fantasy][Gay Romance][BxB]
itch: grrozny
Location: Edinburgh, UK
Contact:

Re: Adding Stats to Characters ... easily

#18 Post by isak grozny »

Okay, I've got one more request: could you possibly make the Inventory object iterable, please? I'm not entirely sure how to do it. I need it so this will work:

Code: Select all

for item in char.bag:
            label ImageReference(char.bag.item.image)

User avatar
Remix
Eileen-Class Veteran
Posts: 1628
Joined: Tue May 30, 2017 6:10 am
Completed: None... yet (as I'm still looking for an artist)
Projects: An un-named anime based trainer game
Contact:

Re: Adding Stats to Characters ... easily

#19 Post by Remix »

isak grozny wrote: Tue Nov 20, 2018 7:40 am Okay, I've got one more request: could you possibly make the Inventory object iterable, please? I'm not entirely sure how to do it. I need it so this will work:

Code: Select all

for item in char.bag:
            label ImageReference(char.bag.item.image)
The most versatile approach is probably to add a @property to the Inventory class:

Code: Select all

        @property
        def items(self):

            return [ self.__dict__[k] for k in self.__dict__ 
                     if isinstance(self.__dict__[k], BaseItem) ]
then access the property list through char.bag.items (note it returns the objects, not the name, so just ImageReference(item.image) would do)
Frameworks & Scriptlets:

User avatar
isak grozny
Regular
Posts: 46
Joined: Mon Apr 11, 2016 10:17 am
Projects: The Bitter Drop [Modern Fantasy][Gay Romance][BxB]
itch: grrozny
Location: Edinburgh, UK
Contact:

Re: Adding Stats to Characters ... easily

#20 Post by isak grozny »

Okay, adding that to the Iventory object and using this code:

Code: Select all

for item in char.bag.items:
        vbox:
            label ImageReference(item.image)
... produces this error:

Code: Select all

I'm sorry, but an uncaught exception occurred.

While running game code:
  File "game/old_script/test_inventory_character.rpy", line 16, in script
    "Start Inventory Test"
AttributeError: 'NoneType' object has no attribute 'split'

-- Full Traceback ------------------------------------------------------------

Full traceback:
  File "game/old_script/test_inventory_character.rpy", line 16, in script
    "Start Inventory Test"
  File "/Applications/renpy-7.1.1-sdk/renpy/ast.py", line 678, in execute
    renpy.exports.say(who, what, interact=self.interact, *args, **kwargs)
  File "/Applications/renpy-7.1.1-sdk/renpy/exports.py", line 1204, in say
    who(what, *args, **kwargs)
  File "/Applications/renpy-7.1.1-sdk/renpy/character.py", line 1031, in __call__
    self.do_display(who, what, cb_args=self.cb_args, **display_args)
  File "/Applications/renpy-7.1.1-sdk/renpy/character.py", line 823, in do_display
    **display_args)
  File "/Applications/renpy-7.1.1-sdk/renpy/character.py", line 572, in display_say
    rv = renpy.ui.interact(mouse='say', type=type, roll_forward=roll_forward)
  File "/Applications/renpy-7.1.1-sdk/renpy/ui.py", line 289, in interact
    rv = renpy.game.interface.interact(roll_forward=roll_forward, **kwargs)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 2662, in interact
    repeat, rv = self.interact_core(preloads=preloads, trans_pause=trans_pause, **kwargs)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 3049, in interact_core
    root_widget.visit_all(lambda i : i.per_interact())
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/screen.py", line 428, in visit_all
    self.child.visit_all(callback, seen=None)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 521, in visit_all
    d.visit_all(callback, seen)
  File "/Applications/renpy-7.1.1-sdk/renpy/display/core.py", line 511, in visit_all
    for d in self.visit():
  File "/Applications/renpy-7.1.1-sdk/renpy/display/image.py", line 524, in visit
    self.find_target()
  File "/Applications/renpy-7.1.1-sdk/renpy/display/image.py", line 376, in find_target
    name = tuple(name.split())
AttributeError: 'NoneType' object has no attribute 'split'

Darwin-18.2.0-x86_64-i386-64bit
Ren'Py 7.1.1.929
The Bitter Drop: 1. Sparrows 003
Sat Nov 24 06:46:21 2018
What am I doing wrong?

User avatar
Remix
Eileen-Class Veteran
Posts: 1628
Joined: Tue May 30, 2017 6:10 am
Completed: None... yet (as I'm still looking for an artist)
Projects: An un-named anime based trainer game
Contact:

Re: Adding Stats to Characters ... easily

#21 Post by Remix »

I'd need to see your code... The error is because item.image resolves to None, not because of the inventory bits.

Maybe try

$ item_info = ",".join( [ "{}={}".format(k, item[k]) for k in item.__dict__ if k not in object.__dict__ ] )
text "[item_info!q]"

in your vbox (rather than the error creating label) to help debug
Frameworks & Scriptlets:

User avatar
isak grozny
Regular
Posts: 46
Joined: Mon Apr 11, 2016 10:17 am
Projects: The Bitter Drop [Modern Fantasy][Gay Romance][BxB]
itch: grrozny
Location: Edinburgh, UK
Contact:

Re: Adding Stats to Characters ... easily

#22 Post by isak grozny »

I am actually a huge idiot, I forgot to add an image to the image field. Going to re-test now.

User avatar
isak grozny
Regular
Posts: 46
Joined: Mon Apr 11, 2016 10:17 am
Projects: The Bitter Drop [Modern Fantasy][Gay Romance][BxB]
itch: grrozny
Location: Edinburgh, UK
Contact:

Re: Adding Stats to Characters ... easily

#23 Post by isak grozny »

Okay, I still can't figure out how to display the images associated with each item, in a list and/or grid. Could you please spell it out for the terminally dense?

User avatar
Racheal-Moon
Newbie
Posts: 13
Joined: Wed Apr 01, 2015 4:43 pm
Contact:

Re: Adding Stats to Characters ... easily

#24 Post by Racheal-Moon »

Thank you for this. I don't have a ton of experience with Python, but I do with other languages, so this gave me a solid base to work off to created a tiered friendship stat (as well as convenient storage for the other important stats).

Did you have a preference in how you would like to be credited?

User avatar
Remix
Eileen-Class Veteran
Posts: 1628
Joined: Tue May 30, 2017 6:10 am
Completed: None... yet (as I'm still looking for an artist)
Projects: An un-named anime based trainer game
Contact:

Re: Adding Stats to Characters ... easily

#25 Post by Remix »

isak grozny wrote: Thu Dec 13, 2018 9:16 am Okay, I still can't figure out how to display the images associated with each item, in a list and/or grid. Could you please spell it out for the terminally dense?
I would suggest just starting off with building a screen with some non inventory images in it. Then, depending on how you referenced those images in the screen (personally I'd just use ` add "images/some_icon.png" ` in the screen rather than using ImageReference lookups) just take that part (the "images/some_icon.png" bit if just using add) and include that as an attribute of each item. Then when iterating through the items, you'd just use something like ` add item.image ` ...

Racheal-Moon wrote: Sun Dec 23, 2018 4:42 pm Thank you for this. I don't have a ton of experience with Python, but I do with other languages, so this gave me a solid base to work off to created a tiered friendship stat (as well as convenient storage for the other important stats).

Did you have a preference in how you would like to be credited?
Maybe just a "thanks to Remix for some code snippets on which to build parts of the game from" ... or no mention. No need to give credit, just knowing you found it useful is enough.
Frameworks & Scriptlets:

JustaHelpfulLurker
Newbie
Posts: 6
Joined: Sun Jan 14, 2018 8:42 pm
Contact:

Re: Adding Stats to Characters ... easily

#26 Post by JustaHelpfulLurker »

Would it be possible to show a character's name with their color/who_affixes included? (i.e. The way they would be styled in a say statement.)

For example:

Code: Select all

define character.a = Character("Amber", color="#F9A", who_prefix="Miss ")
default a = CharData("a")

label test:

    "Expected: {color=#F9A}Miss Amber{/color}
    \nReceived: [a.title]"

User avatar
Remix
Eileen-Class Veteran
Posts: 1628
Joined: Tue May 30, 2017 6:10 am
Completed: None... yet (as I'm still looking for an artist)
Projects: An un-named anime based trainer game
Contact:

Re: Adding Stats to Characters ... easily

#27 Post by Remix »

You'd likely want to write a method in the stats class for that, perhaps:

Code: Select all

init python:

    class CharacterStats(BaseStatsObject):

        # Set the store.{prefix}.character_id value
        # STORE_PREFIX = "character_stats"

        # Boolean toggle for validation - defaults both True
        # VALIDATE_VALUES = False
        # COERCE_VALUES = False

        STAT_DEFAULTS = {
            'gender' : 'f',
            'age' : 22,
            'location' : 'school',
            'affection' : 1,
            'obedience' : 0.01,
        }

        @property # we use it as a property so we can easily put it in [interpolation]
        def colour_name(self):
            return "{{color={colour}}}{name}{{/color}}".format(
                name=str(getattr( character, self._id )), # this gets the name by calling the __str__ method of the Character class
                colour=self.who_args.get('color') ) # this gets the colour by exploring who_args (which is in the character instance)


default test_name = "Amber"
define character.a = Character("[test_name]", who_color="#F9A")
default a = CharacterStats("a", location='lounge', affection=15, age=21)


label start:

    a "my name is [a.colour_name]"
Frameworks & Scriptlets:

JustaHelpfulLurker
Newbie
Posts: 6
Joined: Sun Jan 14, 2018 8:42 pm
Contact:

Re: Adding Stats to Characters ... easily

#28 Post by JustaHelpfulLurker »

Okay, so after some tinkering, would this code still work? (Sorry, I'd test it myself, but don't own a computer anymore. All I have left is a tablet.)

Code: Select all

init python:

    class CharacterStats(BaseStatsObject):

        STAT_DEFAULTS = {
            'gender' : 'f',
            'age' : 22,
            'affection' : 1
        }

        @property

        def color(self):
            return self.who_args.get('color')

        def color_name(self):
            return "{{color={}}}{}{{/color}}".format(
                self.who_args.get('color'),
                str(getattr( character, self._id ))
            )

        def title(self):
            return "{}{}{}".format(
                self.who_args.get('prefix'),
                str(getattr( character, self._id) ),
                self.who_args.get('suffix')
            )

        def color_title(self):
            return "{{color={}}}{}{}{}{{/color}}".format(
                self.who_args.get('color'),
                self.who_args.get('prefix'),
                str(getattr( character, self._id )),
                self.who_args.get('suffix')
            )


define character.a = Character("Amber", who_color="#F9A", who_prefix="Miss ")
default a = CharacterStats("a", age=21, affection=15)


label start:

    a "Hi, my name is [a.color_title]!"

User avatar
badanni
Newbie
Posts: 9
Joined: Fri Jan 24, 2020 11:57 am
itch: badanni
Location: Quito, Ecuador
Contact:

Re: Adding Stats to Characters ... easily

#29 Post by badanni »

Another way to add only variables to "Character" is like this

Code: Select all

init python:
    class Avatar(renpy.character.ADVCharacter):
        '''Avatar (character under player\'s control), with stats and inventory'''

        def __init__(self, name,kind=None,**kargs):
            renpy.character.ADVCharacter.__init__(self,name.capitalize(),kind,**kargs)
            
            self._equip=False
            self._equiplist={"head":None,"body":None,"weapon":None,"shield":None,"feet":None}
            
            self.name = name.capitalize()
            self.title = " "
            self.position=(0,0)
            self.level=1
            self.exp=0
            self.exp_accumulated=0
            self.HP=100
            self.MP=30
            self.base_HP=100
        def add_stat(self, name="prueba", value=0):
            setattr(self, name, value)
            #msgs.show('==={} created variable {}==='.format(self.name,name))
            return 0
to define "Avatar (Character)", it is like this

Code: Select all

define a=Avatar('Danny', color="#ff0000" , what_color="#ffffff")

a "bla bla bla"
to add more stats is

Code: Select all

a.add_stats("skills",["skill1","skill2"])

Tesspolar
Newbie
Posts: 21
Joined: Fri Mar 20, 2020 11:37 am
Contact:

Re: Adding Stats to Characters ... easily

#30 Post by Tesspolar »

hi trying to implement this into my character stats page. is there anyway to add character side image to this code? like in stats page characters has their picture and if you click on the image at left side of the page shows character side image at the top and a list of stats under the image.

I did figure all out but i have no idea how to add side image of character to show up there with other variables.

Thanks

Post Reply

Who is online

Users browsing this forum: No registered users