Transform doesn't change according to persistent

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
User avatar
Mole-chan
Veteran
Posts: 333
Joined: Thu Aug 27, 2009 12:46 am
Completed: DUAEL, Escape from Puzzlegate
Projects: A Bird with Gold-Mended Wings
Deviantart: mole-chan
Skype: mole-chan
itch: moleworks
Contact:

Transform doesn't change according to persistent

#1 Post by Mole-chan »

Pardon the probably not so clear title with this one. There's probably some background required.

Basically, what I am attempting to do is have varying levels of animation for this game, determined by a persistent value. In order to avoid having to load the large animated base, which negates the point of lowering the settings, these are handled by "if else" clauses in an init block. This does mean the game has to be reset to see the changes, but it's a fair tradeoff I think.

An example of the code:

Code: Select all

    transform cad_still_default:
        xpos 201 ypos 77
    
    if persistent.charAnims < 2:
        $cad_anim_default = cad_still_default
    else:
        transform cad_anim_default:
                #animation
                subpixel True
                xpos 201 ypos 77
                linear 0.362 ypos 79
                linear 0.707 ypos 76
                0.531
                repeat

    if persistent.charAnims < 2:
        image cadfael_base normal:
            "gfx/cadfael/base/default/cad_default_base_0000.png"
    else:
        $renpy.image("cadfael_base normal", DynamicDisplayable(draw_animation, "gfx/cadfael/base/default/cad_default_base.png",452, 720,  16,  0.1))
        
            
In any case, this works fine for images. They update properly, even when loaded from a save.

The transforms that determine how the face follows the base however.....don't.

They remain the same until a new expression is loaded. This behavior is the same whether I use "choice" in ATL, or "if else".

It's a little off putting, to say the least. And I'd really like to keep this feature! I just don't know what is causing this behavior or how to fix it. So any help would be appreciated. Hopefully it doesn't end up being something too obvious.

Thank you!

User avatar
nyaatrap
Crawling Chaos
Posts: 1824
Joined: Mon Feb 13, 2012 5:37 am
Location: Kimashi Tower, Japan
Contact:

Re: Transform doesn't change according to persistent

#2 Post by nyaatrap »

I'm surprised init can have if clause directly :o
Anyway, if you want to use real-time condition transform, you can use either:
1. DynamicDisplayable
2. Python function that returns transform Displayable http://www.renpy.org/doc/html/trans_tra ... -in-python
Example would be something like this

Code: Select all

def functionX(st,at,d=displayable):
  if conditionA:
    return transformA(d), time #transforms are defined in ATL beforehand
  else:
    return transformB(d), time

image X = DynamicDisplayable(functionX, displayable)

User avatar
Mole-chan
Veteran
Posts: 333
Joined: Thu Aug 27, 2009 12:46 am
Completed: DUAEL, Escape from Puzzlegate
Projects: A Bird with Gold-Mended Wings
Deviantart: mole-chan
Skype: mole-chan
itch: moleworks
Contact:

Re: Transform doesn't change according to persistent

#3 Post by Mole-chan »

Color us both surprised! I was just seeing if it even would work to avoid extra loading. Looks like it did.

And while the DynamicDisplayable makes sense, I got an error during implementation. This is most likely my mistake.

Code: Select all

I'm sorry, but an uncaught exception occurred.

While running game code:
  File "game/chap_2.rpy", line 737, in script
TypeError: unsupported operand type(s) for +: 'module' and 'float'

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

Full traceback:
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\execution.py", line 288, in run
    node.execute()
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\ast.py", line 1110, in execute
    renpy.exports.with_statement(trans, paired)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\exports.py", line 946, in with_statement
    return renpy.game.interface.do_with(trans, paired, clear=clear)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\core.py", line 1531, in do_with
    clear=clear)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\core.py", line 1853, in interact
    repeat, rv = self.interact_core(preloads=preloads, **kwargs)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\core.py", line 2165, in interact_core
    self.draw_screen(root_widget, fullscreen_video, (not fullscreen_video) or video_frame_drawn)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\core.py", line 1420, in draw_screen
    renpy.config.screen_height,
  File "render.pyx", line 365, in renpy.display.render.render_screen (gen\renpy.display.render.c:4568)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\layout.py", line 521, in render
    surf = render(child, width, height, cst, cat)
  File "render.pyx", line 95, in renpy.display.render.render (gen\renpy.display.render.c:2291)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\transition.py", line 362, in render
    top = render(self.new_widget, width, height, st, at)
  File "render.pyx", line 95, in renpy.display.render.render (gen\renpy.display.render.c:2291)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\layout.py", line 521, in render
    surf = render(child, width, height, cst, cat)
  File "render.pyx", line 95, in renpy.display.render.render (gen\renpy.display.render.c:2291)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\layout.py", line 521, in render
    surf = render(child, width, height, cst, cat)
  File "render.pyx", line 95, in renpy.display.render.render (gen\renpy.display.render.c:2291)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "accelerator.pyx", line 109, in renpy.display.accelerator.transform_render (gen\renpy.display.accelerator.c:1298)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\image.py", line 164, in render
    return wrap_render(self.target, width, height, st, at)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\image.py", line 54, in wrap_render
    rend = render(child, w, h, st, at)
  File "render.pyx", line 95, in renpy.display.render.render (gen\renpy.display.render.c:2291)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "accelerator.pyx", line 109, in renpy.display.accelerator.transform_render (gen\renpy.display.accelerator.c:1298)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\layout.py", line 521, in render
    surf = render(child, width, height, cst, cat)
  File "render.pyx", line 95, in renpy.display.render.render (gen\renpy.display.render.c:2291)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "accelerator.pyx", line 109, in renpy.display.accelerator.transform_render (gen\renpy.display.accelerator.c:1298)
  File "render.pyx", line 166, in renpy.display.render.render (gen\renpy.display.render.c:2033)
  File "C:\Users\mole\Documents\renpy-6.15.5-sdk\renpy\display\layout.py", line 1029, in render
    renpy.display.render.redraw(self, redraw)
  File "render.pyx", line 269, in renpy.display.render.redraw (gen\renpy.display.render.c:3077)
TypeError: unsupported operand type(s) for +: 'module' and 'float'

Windows-post2008Server-6.2.9200
Ren'Py 6.15.5.354
The line in question refers to a character being shown, where the code looks like this.

Code: Select all

    image cadfael:
        #animation
        contains:
            #animation
            "cadfael_base normal"
        contains:
            animation
            DynamicDisplayable(chooseTrans, cad_anim_default, cad_still_default, "cadfael_eyes normal")

        contains:
            animation
            DynamicDisplayable(chooseTrans, cad_anim_default, cad_still_default, "cadfael_mouth normal")
        
The adapted method looks like this.

Code: Select all

    def chooseTrans(st,at,transformA, transformB, d):
      if persistent.charAnims == 2:
        return transformA(d), time #transforms are defined in ATL beforehand
      else:
        return transformB(d), time
Looking at the documentation for Transform, that seemed right? But maybe not.

User avatar
Mole-chan
Veteran
Posts: 333
Joined: Thu Aug 27, 2009 12:46 am
Completed: DUAEL, Escape from Puzzlegate
Projects: A Bird with Gold-Mended Wings
Deviantart: mole-chan
Skype: mole-chan
itch: moleworks
Contact:

Re: Transform doesn't change according to persistent

#4 Post by Mole-chan »

Hello? ^^;; um, any clues?

Post Reply

Who is online

Users browsing this forum: Google [Bot], Silac