Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
Tags

Feniks

80
Posts
25
Topics
873
Followers
62
Following
A member registered Sep 25, 2019 · View creator page →

Creator of

Recent community posts

If you're having trouble or run into any bugs with the code, post a comment here! I will try to get back to you within a few days.

Without further information it's hard to say, but nothing about the shader alters the base image dimensions so I think it's unlikely that the shader is doing any kind of squishing. It would be helpful to see how you put the actual button together in screen language besides just the transform, and what it looks like with/without the transform applied.

Hello! Thanks for the report. I believe I should have this fixed in an upcoming update I've been planning for this shader - if you don't mind waiting a week or so, I hope to have it released by then. This is an issue I've seen when using the ANGLE2 renderer instead of GL2; usually systems default to GL2 but some phones may not. I'll put out a devlog once the update is out, and then please let me know if it fixes your problem!

Thank you for the report! I can't say for sure what the issue is, though my understanding is that the web builds use a different version of Python and potentially a slightly different renderer. I did quite a lot of fiddling to get the shaders to work with both ANGLE2 and GL2, and it wouldn't really surprise me that if a slightly different renderer is used for web that it has its own idiosyncrasies. I will put it down on my list when I have a chance to look at it!

If you're having trouble or run into any bugs with the code, post a comment here! I will try to get back to you within a few days.

You're meant to change the sound with your own define statement, not in the backend file! For example,

define myconfig.ACHIEVEMENT_SOUND = "audio/interface/ach.ogg"

The achievements.rpy file has examples of that. If you're only changing it in the backend, then the redeclaration in achievements.rpy will be overwriting it with None. The backend file has an early initialization order so it can be set up early before it's used and modified with a regular define statement.

So, in short, change it in achievements.rpy not in the backend file :) Hope that helps!

You can look up regular screen language in Ren'Py for more information on how UI works in Ren'Py. I have some tutorials on my website also https://feniksdev.com/navigation/

It's not a requirement or anything! That's just an example of a button you can make so players can see your achievement gallery. In a standard Ren'Py project, that would go on screen navigation in the same pattern as all the other buttons there. But you can create whatever kind of button or method to access the achievement gallery that you want.

Yes, it's evaluated when the tracklist is checked (which basically means it'll be updated whenever the variable is). It's the same concept as the built-in gallery unlock conditions or how you write ConditionSwitch conditions.

Glad to hear you like it! For the unlocking condition, that's built in - there's an example in the code and the README also. It's the argument unlock_condition. You can set that to a string like unlock_condition="persistent.seen_chapter1" for example, and then set $ persistent.seen_chapter1 = True in your script when the song should be unlocked. A dictionary would work too, or a set; whatever you like! The condition just has to be in quotes and should be persistent (most likely) so players can see it on the main menu.

As for the second thing, you can add that to the add method in the music room backend. There's a line that looks like this:

super(ExtendedMusicRoom, self).add(track.path,

    always_unlocked=track.unlock_condition=="True",

    action=SetScreenVariable('current_track', track))

You can change it to:

super(ExtendedMusicRoom, self).add(track.path,

    always_unlocked=track.unlock_condition=="True",

    action=[SetScreenVariable('current_track', track),

        Notify("Now playing: {0}".format(track.name))])

You can update that Notify message however you like. That way it'll still update the current_track but will also have a notification show up!

Oh I think I understand what you mean now - yes order of operations matters. If you apply the shader to a zoomed image, the outline won't be zoomed. If you apply the shader and then zoom the image, the outline gets zoomed as well. You can see the property order here: https://www.renpy.org/doc/html/atl.html#property-order So if you want to go out of order, you'll have to make an image that's got the shader already applied and then zoom that, for example.

I am looking into the possibility of alternate blending methods, and if I land on something I like I'll update the listing with a devlog noting the changes  :)

I think there's perhaps a mismatching of expectations here - there's always going to be a visible seam where the gradient ends because it's a set size and at some points the step between "can make out the outline" and "outline is too transparent to reliably discern" will be visible simply because of how perception works. You can make glowing outlines in an editor like photoshop and you'll still see where the glow ends.

As for applying the outline to a character, you can use a LayeredImageProxy or just apply it right to the image declaration, depending on how you've set up things. For example, image eileen outline = LayeredImageProxy("eileen", outline_transform(...)) will automatically apply the transform to the layered image "eileen" for whatever attribute combinations you need just by show eileen outline, or if you don't want it toggleable then just add an at outline_transform(...) right at the top of the layeredimage declaration itself.

Hello! I'm afraid I don't quite understand what you're asking - can you elaborate on what difference you are seeing between the two methods? What are the two colours you want to transition between? If you prefer the look of one method, is there a reason you can't use that method for the effect you want?

Find and replace the variable time with some other name - it can be whatever you like. It's just a variable name, and it'll be better to change it to avoid conflicts with Python libraries.

If you're having trouble or run into any bugs with the code, post a comment here! I will try to get back to you within a few days.

Yes, time is a reserved name that refers to the Python library time. Call the variable something else and it should work.

Hello! As mentioned in the page the lowest version the shader has been tested on is 7.5; it seems like one of those properties is more recent - likely gl_drawable_resolution. You can comment out those properties until it works, or what I recommend, is updating your engine version (at least to 7.5). 7.4.11 came out in 2021 and we're currently on 7.7/8.2.

Thank you for the suggestions; I'll keep them in mind for future updates.

Ah it's because the variable you're substituting doesn't exist all the time! You can use `format` or fstrings to fix this, for example:

add AlphaMask("menu/memories_{}.png".format(replaydate[replayCurrent]),

The problem is that your `$ currentreplayDate = replaydate[replayCurrent]` line only runs when the screen is up, so most of the time that variable doesn't exist and Ren'Py doesn't know what to search for in the dynamic image. Using fstrings or format substitutes the variable right in the path instead, so it isn't trying to search for an incomplete image path.

If you're having trouble or run into any bugs with the code, post a comment here! I will try to get back to you within a few days.

Thanks for your kind words!

Can you share the code you're using to declare the AlphaMask? I ran a quick test with the following code:

image radial_mask = GradientDisplayable(["#fff", "#0000"], xysize=(800, 800), kind='radial')
image feniks_masked = AlphaMask("feniks", "radial_mask")
default who = "feniks"
image test_masked = AlphaMask("[who]", "radial_mask")

which I was able to get working in 8.1, so with luck it'll just be a declaration issue :)

If you're having trouble or run into any bugs with the code, post a comment here! I will try to get back to you within a few days.

No worries! I included an example in the devlog for the music room when I released the marquee - you can find it here: https://feniksdev.itch.io/extended-music-room-for-renpy/devlog/665746/new-featur...

Let me know if that answers your question!

I initially wondered if this was a compatibility issue with 8.2, but as I check for compatibility, I haven't had any issues running the Extended Music Room on 8.2. Can you try adding the music room to a fresh project to see if you get the same error? If not, try using Force Recompile for your current project to make sure you don't have any old files lying around, and perhaps double check that you don't have anything else named AudioBar in your project.

I'm happy to hear it helped! Credit as Inline Python tool by Feniks (feniksdev.com) is good by me. I'm not terribly picky on the wording; just something to acknowledge that the tool was originally by me so if someone thinks "that's a cool feature" they can find the tool and add it to their game too. Congrats on your game!

Hello! I don't plan on adding support for automatically grabbing metadata from files directly, as that would likely require a separate Python library as you've mentioned. That said, you can run this loop if you want to get all the files declared in a specific folder:

init python:
    for i in renpy.list_files():
        if i.startswith("audio/music/"):
            print("Audio file", i, "found.")

Instead of print, you can put whatever you like in that loop (e.g. registering it to an extended music room). You might also consider checking for endswith(".ogg") or similar to only get audio files. You can check for multiple subfolders within that same loop too by adding more if/elif/else clauses. Registering a track to the music room will look the same as in all the music room examples, it'd just be inside the loop. Don't forget to set the unlock_condition="True" or else it'll be locked (since the default condition requires players to hear the song in-game for it to unlock).

As for sorting tracks into categories, that's something that the extra description field of the music room files is for. It's flexible so you can, for example, use Python list filtering based on the description field. Alternatively, you could declare one ExtendedMusicRoom instance for each category, depending on your needs, so that music room will only play songs from that category.

Hope that helps!

It's not impossible! It's not a priority for me at the moment, but I'll keep that suggestion in mind :)

How are you testing if this works? I've noticed that 8.1.3 doesn't seem to refresh values declared with define on a shift+R refresh as it once did, so you may need to close the game and re-open it to see any changes. Be sure to search your project folder for music_room also to ensure you're not re-declaring the music room twice or anything!

There are a few problems I see - assuming the indentation is an issue with copy-pasting, you need to fix the following for the multi-bar to work:

  • You need 2 thumbs, not 3. Your bar has 3 sections, but there is one less thumb than the number of sections since the thumbs only go in the boundaries between sections. So you'd want multi_bar 2 not multi_bar 3
  • The bar range isn't a tuple, it's just a number. So for you, the range would be Chara.hp+Chara.max_hp+Chara.total_hp assuming your start values are correct
  • Remember that start values are the value of each individual bar section. So if you have a bar worth 100 and it's split into 5 parts, then the start values are [20, 20, 20, 20, 20] and NOT [20, 40, 60, 80, 100]. With your current start_values, you'll have one section with a value of Chara.hp, one section with a value of Chara.max_hp, and one section with a value of Chara.total_hp. You might not have to fix anything here, but I'm pointing it out because I wasn't 100% sure what your intentions were.

Otherwise, assuming those are fixed up and the indentation is normal, the code runs just fine for me! Let me know if you have any further issues.

Funny you should mention this, as I was planning on putting out an update today that will allow you to get the currently playing track! With this update, instead of default current_track = None in the music room, it'll be default current_track = mr.get_current_song() which will start the music room off with the currently playing track and allow you to easily switch songs etc. It should be out by the end of the day, and I'll put up a devlog about it!

If you're having trouble or run into any bugs with the code, post a comment here! I will try to get back to you within a few days.

Sure! You can change the text colour of any of the screens however you like by adjusting the styles; all of the existing styling is meant to be changed to suit your project. I suggest you hover over the text in question and hit shift+i to find which styles are affecting it, or you can find the lines in achievements.rpy and just add color "#fff" or similar to whichever line of text you need. For example, you can change the line text a.description size 25 to text a.description size 25 color "#fff" to make the text white. Hope that helps!

Congrats on the updated release! Happy to see my music room tool get some love, too ✨

You bring up a good point with other lint hook compatibility - I had overlooked that my lint features require a specific print function to work. I've made an update which will replace print with the custom lint version so that other lint hooks can also print to the final file. I'll update the itch with it sometime this weekend. 

As for closing the game - this is more out of caution than anything, as I do modify the internal AST nodes when running lint (the built-in linter does also; it runs a separate version of your game to lint). You're welcome to remove the line renpy.exports.quit(save=False) towards the end of the custom_lint file, but I make no guarantees on behaviour. I suggest instead that you just launch another window of your game to quickly run the lint, as it won't close or affect any previously-open windows of the game aside from the one which ran the lint operation.

Otherwise, the main feature offered in this linter which you won't get with the built-in linter is properly linted conditions. Turning off warnings for text tags will hide that particular warning about unknown or unclosed text tags, but the built-in linter doesn't know what inline conditions are and therefore can't properly evaluate that something like {if apples => 3} is malformed (it should be {if apples >= 3}). You would need to run through the game and get to that particular line (which would likely cause a crash) to find out that it's incorrect. There are different levels of strictness you can enforce through the custom linter which will do things like flag if you haven't properly defaulted a variable before you use it in an inline condition.

Hello! As mentioned in the compatibility section, shaders require GL2, which isn't present in versions before 7.4. If you can update your engine version to 7.4 or later, then you will be able to use the shader, but it is not compatible with earlier version like 7.3.2. It does work with `show`; you can use it as an ATL transform the same way as `show character at left`. 

You can search the achievement backend file for ??? and update it to whatever you wish, or add your own field to specify a title for when the achievement is hidden. It is in the backend file marked for translation. It is not a priority for me to add this functionality to the system, but I will keep it in mind for future updates.

This is what the extra lint file in this project does - it still runs the regular Ren'Py linter, just adds some extra functionality to properly lint conditions for correctness, and also doesn't flag the tags as being unknown. So if you are looking for a one-time patch script to do this and also lint the conditions for correctness, that is what the extra lint file does.

The extra file runs lint from in-game instead of from the launcher since the file is intended to be put into your project rather than replace Ren'Py engine files (which would then be reset or potentially cause issues if you ever updated the engine or made a mistake). The extra lint file passes the majority of the work off to the Ren'Py linter to ensure that engine updates do not interrupt its ability to lint the project, even if the engine linting changes.

Thank you for the donation! I hope you get good use out of the system :)

For your first question - you can provide the description to the hide_description property. See hidden_double_unlock for an example of this, though if you want the name to show, you won't also include hidden=True (which would show the name as ???). So it would probably look like hide_description=_("This achievement is hidden.") or similar.

Second question - if you hover over the text in question and hit shift+i, you'll see the styles applied to it. I don't use custom gui values for styling, so you can just directly specify the font on the screens themselves or in the styles the screens are using. By default it'll just use the font for your project.

Third question - you are welcome to adapt it to use that! You should keep the popup screen declaration provided in this code - i.e. the name of the screen + the arguments, and keep the timer at the bottom, but the styling itself can be copied over and the popup ATL transform adjusted to suit another popup animation. That's something that's out of the scope for me to help with here, though I may consider integrating the two better down the line.

Lastly - you can grab the system files from GitHub or itch.io; they both have the same code. I've updated both with a few fixes and updated features after release, with the last being about two months ago, so if you downloaded it earlier than that, you can check the devlog notes for what changed.

I hope you have a great new year also!

If you're having trouble or run into any bugs with the code, post a comment here! I will try to get back to you within a few days.