RBF is strong with Red Embrace characters. Thumbnail is Discord member @mnky82’s Halloween Peep.


Red Embrace (for Google Play) is back in testing. We ended up converting all the sprites to layeredimages, which then required an update to how we manage expression changes. Previously, the same code would work for both on-screen and side portrait sprites. Now, they are invoked differently. Showing on-screen sprites with expression changes requires the show stack:

renpy.show(char + " brow_" + brow + " eyes_" + eyes + " mouth_" + mouth + " " + extra_args, at_list=at_list)

while changing expressions for side portraits only requires changing a global variable isaac_eyes = "neutral". Since we are still reusing our previous function for both of sprite versions, we had to add some extra conditions.

if not portrait and \
        not (char.split()[0] == "isaac" and isaac_portrait) and \
        not (char.split()[0] == "dom" and dom_portrait) and \
# call show char stack
And in-game, we have to make sure to set the flag for whether the character portrait is being used.

$ luka_portrait = True
lp '"I\'d better not get any weird calls from you…"'
$ luka_brow = "angry"
$ luka_eyes = "side"
$ luka_mouth = "shout"
lp '"I\'ll block you the second you start saying gross crap to me!"'
$ luka_portrait = False

The ability to change side portrait expressions without the show stack is due to not needing to use dissolve transitions between expression changes. We added callbacks to all our character definitions:

def _luka_callback(event, interact=True, **kwargs):
    if not interact:
    if event == "begin":
        store._side_image_attributes = ("side", "luka_p", "brow_" + globals()["luka_brow"], "eyes_" + globals()["luka_eyes"], "mouth_" + globals()["luka_mouth"])

define lp = Character("Luka", ctc="ctc_pic",  image="luka_p",  window_left_padding=340, window_right_padding=120, color="#ddd7d7", callback=_luka_callback)

The case of massive RBF comes from forgetting to reset the _portrait = False flag when switching from side portrait to on-screen sprite mode. If that switch is not turned off, then on-screen sprites will not have expression changes (as the game expects the expressions to update automatically).