FLUX has updated to v2.0.0! After all these years...

Some important notes:

Index

  1. Overview

  2. Translations

  3. Shell system

  4. Music player changes

  5. Musings

  6. Changelog

Overview

First of all, a brief overview of the most important points. A full changelog will be listed at the end of this blog post.

So, that's the big stuff. I'm sure there are some questions, which I'd like to answer, and also give some general thoughts about this update.

Translations

Firstly, a big thank you to the translators who worked on this for, quite frankly, putting up with the mess I made of it. I've been trying to get this update pulled together for a long time, there ended up being multiple revisions, I kept having big delays due to too many projects at once and/or life stuff going on, and I kept missing stuff that I just should not have missed. I think everything is settled now, but if there are any places where the translations are missing, I'll take responsibility for that. (Please do let us know if you find any issues so we can fix them!)

As for why the Polish and French translations are currently disabled, it's just because the music player has changed so much that they would be displaying half of the text in English. If and when they're able to be updated, they'll be enabled again!

I hope to never ever have to do an update this big again. I think the large size made the whole thing very difficult, and it would be better if I made changes in smaller increments. I also think in the future, provided the changes are smaller, that it will be ok if a few lines aren't immediately translated. Otherwise it creates pressure, which I don't want when people are volunteering their time and effort.

Shell system

Language aside, let's talk about the shell system. I suspect there will be people confused or upset by this change. But, I hope that my reasoning and the tools that I provide will help you understand why this was necessary.

First, for those unaware, FLUX has a shell customization system that allows shells to add in custom content such as dialogue responses to various events. I made this because people were distributing FLELE shells with custom .dic files, and I thought that there must be an easier way, and also it was annoying that the various versions of those custom .dic files were not compatible with one another.

So, I created a system where FLUX shells could add in a .dic file in their own files, and FLUX would read it as long as that shell was running. Neat, right? It solved the problem of having to patch .dic files, and there were no more file conflicts.

There are just a few problems with that approach. Here are some of them.

  1. It's extremely dangerous to let any shell execute custom code as a part of the ghost with NO separation between what is shell and what is ghost!! I should never ever have allowed this, and will likely take steps to reduce it further in the future.

  2. File conflicts might be gone, but now all shells are using shared save data. This means they can accidentally overwrite each other's variables.

  3. Shells have to be discouraged from adding in new SHIORI events, because if FLUX later adds them into the ghost's main code, then the shells will break.

  4. Because of the above, that means if shell developers want a particular event, they have to wait for me to add in the option for it. Sometimes for years.

  5. Shells can become very complex and developed! ... And then are stuck being just a FLUX shell unless they try to break away and become a fully fledged ghost, in which case it might be hard to get people to migrate to using the new version! What was intended to help developers ends up putting them in a bad position. Your creative works shouldn't be stuck under the shadow of my system.

Basically, I ended up realizing that what I had done was make FLUX act like a baseware, when it has no business being any such thing. In my head at the time, I regarded making FLUX shells as a sort of "ghost-lite" that could be an easier way to get into ghost development, because you didn't have to fill in all the numerous events. But as it turns out, you just don't need to fill in those events at all! You can have a fully fledged ghost that is as simple as or simpler than a FLUX shell!

For that reason, I ended up releasing my music player code separately, so that anyone can use it in their ghosts. Additionally, I also set up a bundle that integrates the music player code with a simple template. I strongly encourage anyone that wants to make a complicated FLUX shell to use this template instead. It's not any harder than making a FLUX shell is, in fact it might be easier! You don't have to learn my weird setup, you can just use all of the great documentation on Ukadoc, and learn foundational ghost making skills without any baggage! And best of all, the ghost you make is completely yours, and you can add new features and update stuff as you please without having to worry about whatever I'm doing or how long I might take to update.

For any existing shells, don't worry. Any shells that were made before this update will continue to have their current content supported.

However, any new content that is added after this update may not be fully supported, and any new shells made beyond this update that add deprecated functions may not be fully supported in the future. I am hoping to remove some of the deprecated functionality for security reasons down the line. While I am committed to preserving what folks have made before this point, guaranteeing the same preservation for new work would make it difficult to reduce/remove those features. I cannot emphasize enough that if you want to have a shell that is more complex than adding a handful of dialogues, you should really make it a ghost instead!

So in summary: it was a very bad idea to allow the level of customization that I did, I am taking steps to reduce the customization that is allowed, content that existed before FLUX v2.0.0 will be preserved, and I have provided tools to migrate away from using FLUX like a baseware.

Music player changes

Here's where it gets more fun! I've made SO many improvements to the music player. If you've used my music player code, you'll be familiar with the new setup. The new music player has been available for a long time, it's just taken this long to get FLUX up to speed!

FLUX is actually now downstream of the music player. Instead of FLUX being the source of updates, any changes to the music player will take place in the music player's code, and then from there I will integrate the changes into FLUX. That means I can get updates out sooner for folks that use the music player in their own ghosts!

The new features include all sorts of things. I'll describe a few that I'm really fond of here!

The settings menu has now been split into 4 tabs, because there are now a lot of settings you can adjust to dial it in specifically to your tastes! For example, you can now choose whether you prefer for your music to be seamless even if it has to interrupt a dialogue, or if you would prefer for dialogue to be uninterrupted even at the expense of waiting a few extra seconds for the next song to play. Different folks will have different preferences, so now you can pick whichever you like!

Another option is the new scroll wheel functionality. One of my favorite new things that I use all the time is that you can hover your mouse over the ghost and scroll up and down on the scroll wheel to adjust the volume. It's great for quickly adjusting the volume on the fly without needing to go into the menu! But I figured that some folks might find that annoying, or they might want to use it to control something other than volume. So, you can choose between letting the scroll wheel adjust volume, speed, balance, or disabling it entirely. It's pretty fun to play with, in my opinion! And it really shows how far things have come since the early days of FLUX, where adjustments to volume/speed/balance would only happen when the next song played. What a pain that was!

By the way, after writing the above, I've come to realize that the last release of FLUX didn't even have the "quick change" buttons in the menu for the volume/speed/balance. You had to use the slider and input box each time. Ouch! I used that version for a few minutes to do some update testing, and it was so clunky to set the volume to a comfortable level. v2.0.0 greatly improves how the volume and such are adjusted!

Another setting is for the behavior of the "previous song" button (and hotkey, hotspot, etc.). A lot of music players have it so that after a few seconds of playback, pressing "previous" will restart the current song. Some folks like that functionality, and some don't, so I've added it as a feature with the option to toggle it off!

Here's one that's a big win for performance, especially in long playlists. It used to be that all playlists were displayed as one long list that you had to scroll through. The problem was that if you had a very long playlist, hundreds of songs long, it would cause the music menu to run super slowly. It was really annoying! But now, the playlist is split into pages of 10 songs each, which means you can load in thousands of songs and the menu won't get bogged down! Well, currently it has a little hiccup if you select a new song in the list, but otherwise it operates smoothly as you navigate with the next and previous buttons, etc. And of course, pagination can be turned off if you have no need of it. For example, if you use short playlists that are more than 10 songs but fewer than 100, then turning off pagination might be the better option for you.

If there are any other areas that have a performance hit due to long playlists, do let me know, and I will try to improve it where I can! The one exception is the "move songs in playlist" option, which won't really work as a paginated menu, and so I moved it to the "advanced" tab and added a warning if you have a lot of songs. I don't think there's much I can do to improve it. If you have a very long playlist, I recommend using a text editor such as NotePad++ to open the .m3u files and move items around.

Speaking of playlists! There are a couple of huge changes here as well! Most notably, it now uses file explorer to open and save playlists! That means you can place playlists anywhere you want, and have a shared folder that any ghost using this music player can load and save playlists to, etc. It also now supports reading .m3u8 playlists, however, as it cannot make use of directives, some data is ignored, and will not be preserved if you save the playlist again from FLUX. If it isn't compatible with FLUX, FLUX cannot save it. Please keep this in mind before you overwrite any files made by other programs.

There are some other changes I would like to make to playlist saving/loading now that they make sense, so there may be more development here in the future! For now, it's still much improved from what it was.

Other fun stuff includes a total playtime display in the settings, a new "random" playmode, an option to stop playback at the end of the playlist, new hotkeys... the list goes on.

Musings

I cannot believe that it's been nearly 4 years since the last FLUX update. This really has taken so long to pull together, and the overhaul isn't even really done. There's so much code that I would like to clean up, but I'm just going to let it be for the moment because I need to get this pushed and rip the bandage off.

I'm very sorry that I've left it to collect dust all this time! I've wanted very badly to update it, but it's needed so much work to clean up the mistakes of the past, get all the new music player functionality added, etc., that it felt like this impossibly big task. It's taken multiple large pushes to finally get it to this point.

Now that it's finally out in the world (which really doesn't feel real, even as I'm writing this) I hope that I can push updates more quickly without having a ton of contingencies to worry about. I'm fairly happy with where the music player is, although I already have a few ideas for things I'd like to add/improve... That and I would like to go through all the old code and get it up to my current standards so that FLUX is a project I can be reasonably proud of. It's been weighing on me a lot all this time, because it's one of my most popular projects, and yet... I knew it had so many problems.

Hydrate had a similar problem and also went through an overhaul this year, and that ended up working out very well. I'm hoping that I have the chance to do that same sort of work on FLUX, although FLUX has always been more complicated.

That being said, I have a lot of deadlines to meet before the end of the year, so don't expect further updates at the moment other than bugfixes! (And please let me know if you find bugs, this is a really scary update to put out there because it changes so much, and FLUX is so large and complicated.)

If you've bothered to read this far, then thank you. I know this was a lot, and believe you me, the upcoming changelog is enormous. But a lot has happened, and I wanted to make sure I expressed all of my thoughts and feelings on this update and what it means to me.

Changelog

So, without further ado... here is the full changelog in all its glory. Bring a walking stick if you go wading through here, you'll need it. Good luck.