Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

Hi! This tool seems like it would be extremely helpful! But for some reason, when I put it in my script, I get this error when starting up the game.

I'm sorry, but an uncaught exception occurred.
While running game code:
  File "game/Script/technical/screens.rpy", line 503, in execute
    screen main_menu():
  File "game/Script/technical/screens.rpy", line 503, in execute
    screen main_menu():
  File "game/Script/technical/screens.rpy", line 518, in execute
    use navigation
  File "game/Script/technical/screens.rpy", line 305, in execute
    screen navigation():
  File "game/Script/technical/screens.rpy", line 305, in execute
    screen navigation():
  File "game/Script/technical/screens.rpy", line 307, in execute
    fixed:
  File "game/Script/technical/screens.rpy", line 313, in execute
    imagebutton auto "gui/mainmenu/start_%s.webp" xpos 1553 ypos 432 focus_mask True action [Start(), Play("sound", "audio/sounds/buttonstart.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:
TypeError: new_renpy_loadable() got an unexpected keyword argument 'directory'
-- Full Traceback ------------------------------------------------------------
Traceback (most recent call last):
  File "renpy/common/_layout/screen_main_menu.rpym", line 28, in script
    python hide:
  File "renpy/ast.py", line 1187, in execute
    renpy.python.py_exec_bytecode(self.code.bytecode, self.hide, store=self.store)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/python.py", line 1260, in py_exec_bytecode
    exec(bytecode, globals, locals)
    ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/common/_layout/screen_main_menu.rpym", line 28, in <module>
    python hide:
  File "renpy/common/_layout/screen_main_menu.rpym", line 35, in _execute_python_hide
    ui.interact()
    ~~~~~~~~~~~^^
  File "renpy/ui.py", line 304, in interact
    rv = renpy.game.interface.interact(roll_forward=roll_forward, **kwargs)
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/core.py", line 2219, in interact
    repeat, rv = self.interact_core(
                 ~~~~~~~~~~~~~~~~~~^
        preloads=preloads,
        ^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
        **kwargs,
        ^^^^^^^^^
    )  # type: ignore
    ^                
  File "renpy/display/core.py", line 2757, in interact_core
    root_widget.visit_all(lambda d: d.per_interact())
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/displayable.py", line 432, in visit_all
    d.visit_all(callback, seen)
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "renpy/display/displayable.py", line 432, in visit_all
    d.visit_all(callback, seen)
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "renpy/display/displayable.py", line 432, in visit_all
    d.visit_all(callback, seen)
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "renpy/display/screen.py", line 503, in visit_all
    callback(self)
    ~~~~~~~~^^^^^^
  File "renpy/display/core.py", line 2757, in <lambda>
    root_widget.visit_all(lambda d: d.per_interact())
                                    ~~~~~~~~~~~~~~^^ 
  File "renpy/display/screen.py", line 514, in per_interact
    self.update()
    ~~~~~~~~~~~^^
  File "renpy/display/screen.py", line 715, in update
    self.screen.function(**self.scope)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "game/Script/technical/screens.rpy", line 503, in execute
    screen main_menu():
  File "game/Script/technical/screens.rpy", line 503, in execute
    screen main_menu():
  File "game/Script/technical/screens.rpy", line 518, in execute
    use navigation
  File "game/Script/technical/screens.rpy", line 305, in execute
    screen navigation():
  File "game/Script/technical/screens.rpy", line 305, in execute
    screen navigation():
  File "game/Script/technical/screens.rpy", line 307, in execute
    fixed:
  File "game/Script/technical/screens.rpy", line 313, in execute
    imagebutton auto "gui/mainmenu/start_%s.webp" xpos 1553 ypos 432 focus_mask True action [Start(), Play("sound", "audio/sounds/buttonstart.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:
  File "renpy/ui.py", line 961, in _imagebutton
    idle = choice(idle, idle_image, "idle", required=True)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/ui.py", line 949, in choice
    rv = renpy.config.imagemap_auto_function(auto, name)
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "renpy/common/00defaults.rpy", line 168, in _imagemap_auto_function
    elif renpy.loadable(rv, directory="images"):
         ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^ 
TypeError: new_renpy_loadable() got an unexpected keyword argument 'directory'
Windows-11-10.0.26200-SP0 AMD64
Ren'Py 8.4.1.25072401
Painkiller: Arachnophobia 2.0
Fri Dec 26 00:11:16 2025

It seems as if its interacting with my main menu code for some reason? For reference, this only happens when I put in the files for this plugin and the image tools plug in.

If it helps, this is my main menu screen. Not sure what the problem is!

screen navigation():
    fixed:
        style_prefix "navigation"
        spacing gui.navigation_spacing
    
        imagebutton auto "gui/mainmenu/start_%s.webp" xpos 1553 ypos 432 focus_mask True action [Start(), Play("sound", "audio/sounds/buttonstart.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:             at enterone         imagebutton auto "gui/mainmenu/load_%s.webp" xpos 1586 ypos 496 focus_mask True action [ShowMenu("load"), Play("sound", "audio/sounds/buttonclick.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:             at entertwo         imagebutton auto "gui/mainmenu/chap_%s.webp" xpos 1377 ypos 563 focus_mask True action [ShowMenu("chapterselect"), Play("sound", "audio/sounds/buttonclick.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:             at enterthree         imagebutton auto "gui/mainmenu/pref_%s.webp" xpos 1420 ypos 632 focus_mask True action [ShowMenu("preferences"), Play("sound", "audio/sounds/buttonclick.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:             at enterfour         imagebutton auto "gui/mainmenu/warn_%s.webp" xpos 1486 ypos 691 focus_mask True action [ShowMenu("warnings"), Play("sound", "audio/sounds/buttonclick.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:             at enterfive         imagebutton auto "gui/mainmenu/about_%s.webp" xpos 1550 ypos 764 focus_mask True action [ShowMenu("about"), Play("sound", "audio/sounds/buttonclick.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:             at entersix         imagebutton auto "gui/mainmenu/help_%s.webp"  xpos 1583 ypos 830 focus_mask True action [ShowMenu("help"), Play("sound", "audio/sounds/buttonclick.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:             at enterseven         if renpy.variant("pc"):             imagebutton auto "gui/mainmenu/quit_%s.webp" xpos 1593 ypos 900 focus_mask True action [Quit(confirm=not main_menu), Play("sound", "audio/sounds/buttonclick.mp3")] hovered [Play("sound", "audio/sounds/click.mp3")]:                 at entereight
(1 edit) (+1)

Oh, wait, sorry, I think someone posted about this issue before me haha. I'll try the solution you gave them :)


Edit: Okay yep that worked! Sorry about the repeat question! 

I do have a follow up question now that I've played around with it.

Is there a way that this tool works when using "if_all", "if_any", and so on?  When I add those to my layeredimage definitions, in the tool they just come out blank.


Not sure what the problem is here.

I'm not sure I understand what you're asking - I think perhaps your expectations are incorrect? This tool will handle if_all/if_any/if_not and the newer when equivalent, but I don't eliminate attributes you've chosen from the grid just because adding that attribute means it's no longer a valid combo. As this is a dev tool, it's expected that you're picking attributes that make sense to combine. But, for example, if you had two "hair_front" attributes, one that only shows up if the character is in a work outfit (if_all "work_outfit") and one that shows up if the character is not in a work outfit (if_not "work_outfit"), then the correct hair_front will be shown based on whether the work outfit attribute is present or not. If I've misunderstood and you have a compelling use case + example of what your expectations are, I can add a feature request to my to-do, however!

That does make sense! Perhaps its only doing that because I havent set up all my if_alls, if_any, etc, I only have it tested on the mouths right now (since I'm very new to using layeredimages and am still figuring out how it works) and noticed it wasnt showing in the tool anymore. Thanks and sorry for the silly question! 😆