Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

Feniks

242
Posts
29
Topics
2,071
Followers
88
Following
A member registered Sep 25, 2019 · View creator page →

Creator of

Recent community posts

I haven't downloaded that extension to check, but you should be able to make an ATL transform that handles it. For example, the following code will apply the highlighting to the layered image:

transform highlight_mask(child, crop=(0.0, 0.0, 1.0, 1.0), zoom=1.0, who='eileen'):
    crop crop zoom zoom
    function SpriteFocus(who)
image fen mask_highlight = LayeredImageMask("feniks", highlight_mask(crop=(0.2, 0.2, 0.5, 0.5), zoom=0.7, who="fen"), mask=..., foreground=...)

If you want the highlighting to apply to the background/foreground too, then you should be able to use At(), so like, background=At("whatsit.png", highlight_mask(who="fen")) and that in theory should highlight the background too.

Hope that works!

Yes I'm aware. They're stacking because there isn't a vbox. The original screen has a vbox. It looks like when you pasted the code I provided earlier, you got rid of it. Don't do that.

You still need the has vbox line and below - don't remove those.

Looking closer, this code relies on the default layout of the history screen and the provided styles. The template styles use an hbox rather than a window + name label positioned individually. It'll be easier if you just adjust the existing code and modify it how you like. For example, you can modify the first few lines of the history screen:

screen history():
    tag menu
    ## Avoid predicting this screen, as it can be very large.
    predict False
    # add HBox(Transform("#292835", xsize=350), "#21212db2") # The background; can be whatever
    # use game_menu(_("History"))
    frame:
        align (0.5, 0.5) xysize (1450, 900)
        textbutton _("Return") align (1.0, 1.0) action Return()
        viewport:
            mousewheel True draggable True pagekeys True
            scrollbars "vertical" yinitial 1.0
            has vbox
            style_prefix "history"
Make whatever adjustments you like to the sizes of everything.

You'll replace it with actual numbers. You can make a new project with the default Ren'Py template and copy over the actual values of any gui value that shows up if you aren't sure. Something like

background Frame(["gui/frame.png"], gui.history_frame_borders, tile=True)

can just be

background Frame(["gui/frame.png"], 5, 5, 5, 5, tile=True)

There isn't really much use of the gui values in that code so you should be mostly fine to copy it over.

Hey there! You probably still have a button or similar that's trying to go to screen music_room. You can search your code for it, or just rename the second music room screen to screen music_room if you want.

Hey there! Yeah it's set up so you can do whatever you want with the screens. In particular, you can just delete the line `use game_menu(_("History"))` from the history screen (+ remove the background if you want) and move the viewport over to style it however you like. Or copy that code in if you want, so long as it doesn't reference gui values that aren't present in the template.

Looks like this is a quirk of how LayeredImageProxy handles transforms with arguments - you get a similar error if you try to use a transform like

transform test(a=0.5):
    alpha a

and use the test transform for LayeredImageProxy. It's expecting to receive the child as the first argument, which you can get around via

transform outline_test(child=None, width=1, color="#fff", smoothing=1.0, end_color=None,
        num_passes=1, gradient_smoothing=None, is_mesh=True, mesh_pad=False,
        drawable_res=False, offset=(0, 0), smoothstep=True, power=None):
    outline_transform(width, color, smoothing, end_color, num_passes,
        gradient_smoothing, is_mesh, mesh_pad, drawable_res, offset, smoothstep, power)(child)

and then use outline_test instead of outline_transform for your proxy. Hope that helps! Might be worth reporting to Ren'Py honestly since it seems unintuitive that it causes this issue.

If you declared your achievement with a line like `define wrath_ending = Achievement(...) ` then yes, to grant it in script you'll use `wrath_ending.grant()`. If this is in a label and not a Python block you'll need to prefix it with $ i.e. `$ wrath_ending.grant()`

Feel free to look over the example label to see how it grants the example achievements. 

Check your script for other places where you might be setting `person`. You can also check its current value by pressing shift+o in gameplay and typing `person` then hitting enter, to see what it's set to. If it's anything other than a Term object, you have a problem. You can check if person and partner point to the same object also by seeing what happens when you type in `partner` and hit enter. Make sure you don't have rpyc files in your project that don't also have an rpy file named the same thing.

Essentially, there's no way for Ren'Py to "mix up" the two arbitrarily, so there will be code somewhere that's setting them equal, overwriting the value for person, or some other factor.

Heya! The code should run as-is. What sort of error are you getting? You might want to try hitting Force Recompile from the launcher also, in case you have extra rpyc files lying around. If the error is that you already have a variable named "pronoun" or "terms", make sure you only have one declaration for those, also.

The music room tool is largely intended as an out-of-game gallery of sorts for players to listen to music. I have experimented with a playlist/queue feature myself, but I don't have anything working to the point where I would include it in this tool. You're welcome to modify it to suit your needs, but I don't have a timeline at this moment or advice on how to get a queuing system working with the tool. I also have not tested this tool in 7.4.11, and I would not be surprised if there are problems running it there as such an old version is not currently supported. I recommend you update to a more modern engine version if you can.

Glad you found a fix! Thanks for leaving the solution here :)

It's as simple as making another variable. The default example shows music_room = ExtendedMusicRoom(...) -- all you need to do to make another one is music_room2 = ExtendedMusicRoom(...) and use music_room2.add to add songs to it. The default music_room screens all get passed in an ExtendedMusicRoom, so instead of an action like ShowMenu("music_room", mr=music_room) then it's ShowMenu("music_room", mr=music_room2). Or make your own unique screens that directly refer to music_room2 instead of the passed in mr argument so you can style them differently.

I don't really understand what you mean by disabling the music room. Ren'Py's music room base is meant more as an out-of-gameplay unlockable gallery than it is an in-game playback machine, so if you're using it in another way, I'm afraid that's out of the scope of what I can assist with. Basic screen language rules apply here where you can show/hide screens, use variables to enable/disable buttons, and you can always have regular play music/stop music commands in your script.

Hope that helps!

Hey there! Looks like this was an oversight on my end, with a fix intended to fix something Ren'Py bungled in v8.4. You can make the following change in the common file, to new_renpy_loadable:

if renpy.version_tuple >= (8, 4, 0) and renpy.version_tuple < (8, 4, 2):
     ## There's a problem with how renpy.loadable works with empty strings
     old_renpy_loadable = renpy.loadable
     def new_renpy_loadable(s, **kwargs):
         if s == "":
             return False
         return old_renpy_loadable(s, **kwargs)
     renpy.loadable = new_renpy_loadable

Hope that helps!

Hey there! I'm not really clear on what you mean by "code to implement the code without the test" - the required files are pronoun_setup.rpy and pronoun_backend.rpy, and you can do whatever you like with pronoun_labels.rpy and pronoun_screens.rpy. They are there for demonstration purposes, and the screens in particular you can get rid of if you don't want them or customize them to look however you like. If you're new to Ren'Py, I suggest you read through pronoun_labels.rpy in particular and copy over the code in whichever label that does what you need for your game to your usual script.

Hope that helps!

The problem is just that Ren'Py only has one variable for say_menu_text_filter as opposed to a list of them, so you can only have one function at a time. That said, the function you use is free to call other functions. That's how I handle adding the inline text filter. For a very basic example of how to chain multiple text filters:

init python:
    def big_text_filter(s):
        s = some_other_filter(s)
        s = yet_another_filter_function(s)
        s = some_third_filter_function(s)
        return s
define config.say_menu_text_filter = big_text_filter

Hope that helps!

Sure! It's a bit of a weird setup, but you can use a regular function as the Transform argument to LayeredImageMask. Here's an example:

image fen_masked = LayeredImageMask("feniks", lambda x : At(x, adjust_crop), mask="mask2", background="bg2")
transform adjust_crop:
    animation
    crop (0, 0, 637, 431)
    linear 2.0 crop (1171-637, 950-431, 637, 431)
    linear 2.0 crop (0, 0, 637, 431)
    repeat
label start:
    "Start"
    show fen_masked at truecenter
    "Tada"
    show fen_masked sparkle animated right2
    "Sparkle"


The important part is the lambda - that's a function. You could also make a regular function that returns At(<img>, <transform>) yourself and set that as the second argument to LayeredImageMask. The `animation` property in the transform is also important so that the transform doesn't reset for every new expression change. Hope that helps!

Are you putting the actual Achievement objects into your list? The error sounds like you're just putting strings in instead. If you have a line like define abc_achievement = Achievement(...) then you need to put abc_achievement in the list. No quotes.

Hey there, glad to hear the tool has been helpful! For making your own lists - you won't be able to use the built in Achievement.all_achievements list since that includes all the achievements (it's in the achievement_gallery screen in the line for a in Achievement.all_achievements:). But you're welcome to make your own list! For example, after the achievement declarations in the example, you could do

define chapter1_achievements = [ sample_achievement, progress_achievement, set_progress_achievement ]

and then you can copy the achievement_gallery screen and replace for a in Achievement.all_achievements: with for a in chapter1_achievements: and similar. If you're screen-savvy, you can reuse the achievement_gallery screen and simply pass in the list you want to loop over as well, though copypasta works just as well if you're not familiar with those! Hope that helps ✨

Hey there, feel free to use the zoom_curve or zoom_speed properties to adjust the zoom warper and speed however you like. This is more of a personal preference thing on your end, and you're welcome to modify the code to suit your needs.

Moreso they made some changes to lint that are a bit overzealous here; it's just a local parameter so it shouldn't cause issues. Feel free to rename it to `color_` as it suggests if you'd like the lint warning to go away.

Hey there again, I've put out an update to the common image tools file which you can find here: https://feniksdev.itch.io/image-tools-for-renpy/devlog/1015768/84-engine-bug-fix which should fix your problem. Thanks for your patience!

I investigated a bit and specifically Ren'Py now returns `True` for `renpy.loadable("")` in v8.4, which appears to be an engine bug. I have reported it in the Ren'Py GitHub, and in the meantime you can change the line elif renpy.loadable(s): in the function check_bg around line 124 in image_tint_tool.rpy to elif s and renpy.loadable(s): and this should fix the problem. I will be putting out this fix as an update soon.

Hey there! My apologies for the error - it looks like an engine update has changed how Ren'Py handles empty strings for displayables. To temporarily fix this, open the game and then open the console with shift+o and type in `persistent.sprt_bg = "black"` and hit Enter. Close the console and the tool should be possible to open. Clearing the background image will cause the error to appear again unfortunately, so I'll be putting out a fix for this as soon as I'm able. Thanks for the report!

Hey there! No problem, I'm still very active in the Ren'Py community and so long as I'm here I'll be replying to tool questions haha. The Return text in question will be inside whichever screen you're using - the examples go in the order the screens are declared in the code. So, the first one shown is screen color_picker for example, which has a textbutton with "Return". You can modify those screens however you want; they're just made to be examples.

If you're ever not sure what piece of code is showing a particular element on your screen, you can nearly always hover over it with your mouse and hit shift+i to get a lot of information on it. It'll show you styles and such that apply and has links to where that code is in your project. 

Hope that helps! 

Is it possible that your attributes do not have `default` attributes set up, such that `show tau` with no additional attributes would show nothing at all? That's an issue with the crop tool, as it only uses the provided image tag (e.g. `tau`) for cropping purposes. Your layered images should always have sensible `default` attributes set if they're required (e.g. a default mouth attribute because the character should always have a mouth). It looks to me in the screenshot like if you don't have a `tbase` attribute set, the sprite simply doesn't have a base at all and is made up of the hair/arms/expression parts, which supports this. You can set up attributes with the `default` keyword e.g.

group tbase auto:
    attribute casual default

Did you set up a layered image in the main page of the layered image visualizer by typing in its name? This generally only happens if there isn't a valid image for the tool to use, so it's empty.

Hey there! Did you also download the required color picker tool? It is necessary for this one to work.

Small update to let you know I modified the v1.2 files to put the code in its own namespace! Hopefully that will help someone avoid a similar problem. Thanks for pointing it out!

Not directly, though that's something I've considered for a future update. You can, however, use the zoom_callback feature to update displayables - for example, if the provided current zoom is 2.0, then you'd know you should zoom your image by 1/2.0 = 0.5 so that it stays the same size visually. This will also likely mean you need to make sure your anchor points are set correctly so the image doesn't also look like it's wandering around the viewport. Hope that helps you get started! I'll try to remember to reply here if I do add a simpler/built-in way of having displayables update their size when the viewport is being zoomed.

Thank you for this addition!

I suggest you hover over the dialogue and hit shift+i to see the styles applied to it. In particular, you're looking for anything that sets the ysize or yminimum. The ysize 150 in your nvl_dialogue style stands out to me in that respect. 

Hey there! Are you familiar with config.adjust_attributes? That's what I'm referring to with short forms. My EasyRenPyGUI template comes with an optional file that has some sample code which you might find helpful, and links to one of Tom's articles on the topic: https://github.com/shawna-p/EasyRenPyGui/blob/main/game/optional%20files/adjust_...

Basically you'd use that to set up your short forms like

define config.adjust_attributes["luke"] = Aliases(
    scared_e="auto_mouth_scared brows_scared eyes_scared"
)

Then you can use the Short Forms tab in the image attributes tool to enter "scared_e" to make it available to the tool, and/or add it to the SHORT_FORMS set at the start of image_tool_common.rpy and reset persistent.

Hope that helps!

Unfortunately I can't replicate the behaviour you're seeing on my own device; I tested with the transform in your screenshot with a loop over 25 imagebuttons.

That said, what I do suspect - are you using imagebuttons that are the size of the full screen + focus_mask True to have only the hover area be the opaque part of the image? This is known to cause a lot of performance issues (independent of the outline shader) due to the cost of the calculations Ren'Py runs to test for pixel transparency when hovering over an imagebutton. If you have several full-size images on top of each other, Ren'Py is running calculations on the transparency of the pixels of all of them. To avoid this, I suggest you cut down the transparency to only be a little larger than the button image itself (the padding is so that the outlines will still work nicely) and position it in-game with xpos/ypos.

Happy to hear it! Thanks for the lovely comment ✨

Hey there! The code you posted there is a textbutton like any other, so it can go in any screen. The most common place to put it in a default project would be inside screens.rpy, in the navigation screen (where other buttons like Start and Load are). I have a couple tutorials on my website here if you want to get more familiar with screen language: https://feniksdev.com/navigation/ 

You only need to put it inside your Ren'Py project folder. Then, when you create a new project, the launcher will ask if you want to use a template or not. https://www.renpy.org/doc/html/template_projects.html

All the functionality is already included so it works as a template; all you have to do is unzip it in your projects folder such that it looks like any other project.

This template is not a tutorial - it's for people who want to try their hand at customizing their projects beyond the reskinning the default project offers. I do have a website for tutorials if that's what you're looking for: https://feniksdev.com/navigation/ 

Actually I think this is a very funny one - do you have a character named re? That's the name I imported the regex library under. I should probably put this in a separate namespace to avoid this kind of issue lol. If that's the case,  then you can update `import re` to `import re as regex` and change all the `re.` method calls to `regex.` method calls.

Remember Ren'Py loads files in ASCII order - so, if you've got 01_truncate_text.rpy inside a folder, it'll run based on the folder name.

Aka something like game/backend/01_truncate_text.rpy runs AFTER game/accessibility.rpy (so you couldn't use truncate_text inside accessibility.rpy).

I did request a special lib folder for the next version of Ren'Py, but at the moment your best bet is putting external libraries that need to run first inside a folder called something like 01_libraries/ so they run before your other files.