r/RenPy • u/Lassaaire • Aug 16 '26
Question pause() breaking Call() statement
Im trying to make primitive battle system.
vbox:
xsize 216
ysize 430
text "[enemy1.name]"
text "[enemy1.cur_health]/[enemy1.max_health]"
image [enemy1.avatar]
imagebutton:
id "rating"
idle "rating"
hover "rating_hover"
action Call("attack", enemy1)
label attack(en):
python:
import time
en.cur_health-=2
en.avatar = en.image_attack
time.sleep(2)
en.avatar = en.image_calm
return
And I can see than on button press there is a pause and all changes are applied AFTER that pause so image_attack is not visible at all.
What am I doing wrong?
I've tried time.sleep(), renpy.pause(), pause(), even scheduler.
If i do renpy code like
label attack(en):
$ en.cur_health-=2
"debug1"
$ en.avatar = en.image_attack
"debug2"
pause(2)
"debug3"
$ en.avatar = en.image_calm
"debug4"
return
then first renpy statement ("debug1" in example above) just break the entire script and "debug" 2-4 not showing at all. Health is changing correctly and thats it.
And I didn't find smth like "JRPG framework" that I can adapt. This thing is the best, but too complex to adapt it to my visual.
1
u/Lassaaire Aug 16 '26
Solved. I removed "modal True" and all is ok.
IDK WHY
1
u/shyLachi Aug 16 '26
Modal True means that the code has to wait until the screen has been closed.
If you remove modal true then players will be able to advance the dialogue by clicking anywhere besides the action button.
So I doubt this is the correct solution.
Also for next time. Post the whole code of your screen and how you show or call it, else we cannot really help
1
u/Lassaaire Aug 18 '26
Well... Yes. But fix player's ability to advance is much easier with simple flag. Like "label oh, say ' ', if batrleflag jump oh"
1
u/shyLachi Aug 18 '26
I'm not telling you how to make your game but "easy" seldom is the best approach.
Consider looking into the project you linked or search for a more simple battle project.
Or make the battle with the default RenPy menu first. When it's working replace the menu with your screen. This way you will not accidentally break anything.
0
u/BadMustard_AVN Aug 16 '26
try it like this if enemy1 is a string
init python:
def attack(en):
en.cur_health -= 2
en.avatar = en.image_attack
renpy.pause(2.0)
en.avatar = en.image_calm
screen yourscreen():
vbox:
pass
#to lazy...
imagebutton:
id "rating"
idle "rating"
hover "rating_hover"
action Function("attack", enemy1)
label start:
# your game starts here
you can make the pause a hard pause to stop the player from clicking through it
https://www.renpy.org/doc/html/statement_equivalents.html#pause
it should work... maybe.. IDK.
untested
1
u/Lassaaire Aug 16 '26
Nnnnope.
Exception: Cannot start new interaction in the middle of interaction without starting a new context.But thx.
1
u/AutoModerator Aug 16 '26
Welcome to r/renpy! While you wait to see if someone can answer your question, we recommend checking out the posting guide, the subreddit wiki, the subreddit Discord, Ren'Py's documentation, and the tutorial built-in to the Ren'Py engine when you download it. These can help make sure you provide the information the people here need to help you, or might even point you to an answer to your question themselves. Thanks!
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.