Jump to content
  • Reborn Development Blog

    Hello! My name is Ame and I sometimes get ahead of myself. ^~^
    The others and I may occasionally post updates about how progress on the game is going here!
    enu

    Accessibility

    By enu, in Records,

    The idea of adding some accessibility features for players with sight handicap has been briefly discussed a few times but there was always one main blocker. There is not much point in that unless there is a TTS (text-to-speech) functionality to let blind players hear the dialogues and menus. Ame linked a library that could be used to send a text to a screen reader called NVDA to read the text out loud. But since it wasn’t a Ruby library, just a DLL, we had no way to actually use it.
     
    Encoding the Endians!
     
    However during my previous tweaks of mkxp-z I randomly stumbled upon FFI bindings. I had no clue mkxp-z even had this feature but I immediately knew this might become useful. FFI means Foreign Function Interface. It lets you call functions from shared libraries, even if they were written in a completely different programming language than what you’re working with. So I made a note that FFI exists in mkxp-z but didn’t investigate further at the time as I had other priorities like actually fixing the game or onboarding the new team members. Also I just roughly knew what FFI was but never actually used it myself so I didn’t have practical experience with it.
     
    Few months later a blind player joined Ame’s Patreon so the topic of accessibility was discussed once more. But once again I thought there is no point without TTS but since I had that hunch that it might be possible with FFI, I went ahead and tried it. And it didn’t work. So I did more research and tried various tweaks but still nothing. Only suddenly, after an hour or so, the library started talking. Except not really. Instead of the text I was feeding it it only read the last letter. Ehm what ???
     
    Of course I had no clue what was going on but thought that the mkxp-z community might have some idea so I asked them. We were brainstorming the issue for a while before the mkxp-z maintainer Splendide Imaginarius had the correct idea that it’s an encoding issue. Here I should make a short note of what an encoding is. Basically an encoding determines how letters and other text symbols are represented in memory and are often language-specific. Ruby comes from linux so it is generally using UTF-8. He had a theory that the library was instead expecting UTF-16. It didn’t work either but after some more trial and error I finally stumbled on a trick that actually fixed it. The library didn’t want just UTF-16 but specifically UTF-16LE where LE stands for Little Endian. See the issue was not just encoding but also endianness. Endianness affects the internal order of bytes in memory. This is an oversimplification but basically Windows is using the reverse order (Little Endian) than most other systems (Big Endian). And since Ruby originates from the Linux world, it is using Big Endian internally. So with explicit UTF-16LE encoding TTS using NVDA finally worked.
     

    [image description for blind players: It's a Discord screenshot with AiedailEclipsed saying: "enumag once again destroying everything in his path. great job!"]
     
    Of course all of this is windows-only since we didn’t find any equivalents for other platforms but Windows is the most important in this case anyway.
     
    The roadmap

    With that proof of concept, accessibility suddenly became a realistic topic so we started working on it. Accessibility ofc isn’t just about TTS. We also integrated an existing mod from Torre which adds some ambient sounds to help the blind players know the distance from the closest obstacle in each direction.
     
    That was still just the first step though. I might have kickstarted it but from here on it was a team work where everyone contributed some parts. For TTS I pretty much just figured out the proof of concept. It was Cad48 who did the heavy lifting to add the TTS calls throughout most of the codebase.
     
    And there was a lot more than that. Some of the features we implemented because of accessibility made sense for all players - for instance puzzle skipping because even with TTS and other improvements there is no way blind players will be able to solve the puzzles.
     
    Text-to-speech
     
    Hi! Cad here. I don’t have a whole lot to say– a lot of what’s happened so far has been fairly simple. Did you know there’s a lot of text in this game, displayed in a lot of different ways? There is! Messages, choices, battle, shop screen, town map, dex, field notes, gear apps, jukebox, tile puzzles… Most of what I’ve done for accessibility has been TTS calls on various pieces of this text– but there’s still a lot to be done. I also implemented a few other accessibility features for blind folks, such as Itemfinder now giving a message, but there’s still a lot to be done in that regard as well.
     
    enu’s note: Cad really spent a lot of time on adding TTS calls to all the core parts of the game like dialogue, choices, battle, bag, move learning and so on. Later on both Lucent Flash and Stardust also made significant contributions for adding TTS support to various menus. If I remember correctly I think Stardust handled the Time & Weather app + Jukebox while Lucent took the most complicated part which was the field notes.

    Puzzle skips
     
    This is a project I (hi, stardust here!) have been working on for quite a while, but became more relevant with the push towards making the game more accessible.
     
    If you’re not aware, Reborn has a new game plus (NG+) feature that keeps track of whether you’ve done some specific puzzles/sidequests on previous saves so that you can skip them on future playthroughs. A couple months after Reborn e19 came out, I started work on an NG++ mod that added more puzzle skips, and this mod will be integrated into the base game in 19.5 Reborn. 
     
    One of the big limitations of this feature is that it only applies to repeat playthroughs: first-timers are out of luck. And while I may consider Reborn’s puzzles a core part of the experience, I (and the rest of the dev team) am aware that not everyone shares that opinion. Especially blind players, for whom many of the puzzles are much more difficult or near-impossible without someone else helping them through.
     

    [image description for blind players: Just showing off the "Do you want to skip this tile puzzle?" option you get in Agate Circus with blindstep password]
     
    Recently, I went through (hopefully) all of Reborn’s various puzzles, looking at which could and should be skippable to help improve player experiences. The result: as of v19.5, there will be a new password to add to your games: “nopuzzles”, which activates nearly all the NG+ skips (old and new) without needing save data, in addition to a couple minor skips not covered by the NG+ feature. This feature is also activated with the blindstep accessibility password mentioned later.
     

    [image description for blind players: Showing passwords menu with active nopuzzles password]
     
    There’s also a few additional NG+ puzzle skips that you’ll be able to find scattered around the game. In total, between the existing, new, and password-specific ones, there’s over 40 such skips in the new version. 
     
    blindstep password
     
    Next we needed a way for the blind players to activate the improvements we added for them specifically such as the mod from Torre. This is what the blindstep password is for. It also enables several other things we implemented such as custom item finder by Cad, separate fly menu because the map was a bit difficult for them and some other things. Then there is the F9 key to get the current map and coordinates read to them for navigation… And of course the password also activates stardust’s puzzle skips. 
     

    [image description for blind players: Showing the custom fly menu for blindstep password]
     
    TTS actually isn’t locked behind this password. It’s enabled by default but for most players it has no effect because they don’t have a screen reader such as NVDA running on their PC.
     
    Contextual sounds
     
    Enu again although this isn’t just my work. Next we needed to improve the sound effects. For example the bump sounds needed to be different based on what you bump into. So stardust implemented a feature where if you bump into an obstacle the game can detect what you bump into and use a different sound based on if it was an NPC, a strength boulder, an item or like 10 other different things we accounted for. This is an improvement for all players so it’s not restricted to the blindstep password.
     
    Next we also needed a way for blind players to know when they’re on a diving spot so the game is now able to play a background sound while you’re in a place where you can dive or resurface. Again no need to restrict this for blindstep password.

    Then there are sound effects when you jump over the jumping stones - along with a dust animation for sighted players. There is also new debris animation for rock climbs. Both of these improvements were only possible thanks to eevee because doing it all manually would be madness.
     
    Also fishing has some sound effects now so that blind players can actually catch their Lanturns.
     
    In all cases Amethyst is providing the actual sound effects!
     
    Tolk
     
    During testing one of the blind players also recommended a library to support more screen readers than just NVDA. There are actually two libraries - Tolk and Universal Speech. I went with Tolk for now but there doesn’t seem to be much difference between them. What it does is that it detects the screen reader you’re using and sends the line to it for TTS.
     
    There are still a lot more improvements we can do. Certain menus still don’t have full TTS support, minigames such as game corner or mining need a skip, we should have a way to detect doors, itemfinder should detect non-hidden items, maybe a key to replay the last line, sound effect when activating or deactivating turbo mode… the list goes on. Let us know if you’d like to help with this effort. We’re slowly working on these tasks but we have other features to work on as well so this isn’t our only focus. Any such improvement means a lot to these players.
     

    enu
    Alright, enough of the boring dev-ops things. I needed to get it out of the way first because all that setup was a pre-requisite for the changes I’ll talk about today. The dev-ops features were already used in Rejuvenation 13.5. On the other hand these improvements are brand new in Reborn 19.5. Rejuvenation and Desolation will of course get them as well when they make their next releases.
     
    That said, some of these features would not have been possible without all the dev-ops work.
     
    JoiPlay

    One thing we noticed when Rejuvenation 13.5 came out was that quite a few people tried to play on Android using JoiPlay. This was on my radar for a while, but I didn’t know there were so many people who wanted to play on their phone so it didn’t seem important. Well, I clearly underestimated the demand. Several times a day someone asked on either Rejuv’s or JoiPlay’s Discord about how to make it work. I reached out to the person who prepared the fixing patch who is quite knowledgeable regarding JoiPlay and got a lot of useful info about how I can make the games run better on JoiPlay and how to set up default controls. Because of this, the next major releases of all three games will come out with an experimental JoiPlay version, set up with good default controls and a few other tweaks.
     

     
    For instance, JoiPlay has a feature where it can optimize the tilesets to be smaller to fix some problems. I took the script they’re using, added it into eevee (also fixed three minor bugs I found in the script) and made our workflows automatically prepare these optimized tilesets when building a release. This involved some more technicalities such as building a Docker image for eevee where I had to compile a library which has been unmaintained for 11 years but let’s skip these dev-ops details.
     
    I also tried to set up good default controls while using JoiPlay with a gamepad. Here I’m not actually sure if and how well it works because JoiPlay can only recognize around half of the buttons of my Dual Sense. With a different gamepad it might work better but I can’t test it myself. Feedback will be appreciated when this comes out.
     
    Improved controls
     
    The nice thing about the new mkxp-z setup is that it’s now much easier for us to update it to a newer version and to make occasional custom tweaks when needed. For instance I wanted to tweak the default controls because it always bugged me that the Previous Page and Next Page (for pokedex, bag etc.) were only bound to Q and W but not to Page Up and Page Down by default. These defaults are baked in mkxp-z’s source code. Yes, players can add them through the F1 menu but I wanted to improve the defaults. Also not all things can be changed through the F1 menu because for instance the F12 soft reset is an internal function of mkxp-z which you can’t rebind. This meant there was no way to soft reset while using a gamepad except for some clunky external programs where you would make a gamepad button trigger F12. I tweaked our mkxp-z fork so that a gamepad guide button triggers soft-reset. Then I went through the default controls for both keyboard and gamepad, discussed it with the team a little and changed a few default keybinds to make more sense. Keyboard only got small changes while the gamepad controls were tweaked quite a bit.
     
    Also after some research I found out that I can actually detect the strength of the press on a gamepad L2 and R2 buttons. This is a bit of an experiment but I made turbo speed dynamic depending how strong you hold L2. This might be a subject to change depending on player feedback but we can adjust it quite easily. There is another button to make turbo permanent without holding anything if you prefer that.
     
    During the game intro there is this screen with the default controls, right? Except it was a bit outdated because it was an image which was difficult to edit. And there was no such screen for gamepad controls. So I scrapped that and made a new screen which is up to date and actually generated by code so it’s easy to edit later. Then a second one for gamepads. And you can access them any time, not just during the game intro. There are a few conditions in there to account for game differences because Reborn has rotating tile puzzles while the other two don't.
     
    Old screen from Rejuv (quite a few keys are incorrect here):

     
    New screens:
     

    (note: small mistake there, first line should be C / Enter / Space instead)
     

     
    One new thing you can notice among keyboard controls is that you can now quickly go through long menus such as pokedex or debug menus using Ctrl+Q/W (or R2+L1/R1 on gamepad) to skip 10 pages at once. 
     
    Another nice change is that some minigames such as rotation puzzles and mining have their special actions like tile rotation or mining tool switch bound to several buttons at once so that you don’t need to think too hard about which button to use.
     
    Sorry for those blacked out parts. Those are some new features Lucent implemented recently. They’ll be revealed in another post!
     
    Built-in updater
     
    Reborn e19 came with an updater (shout out to Aie who wrote this) which you could use to get patches. It did its job well but had some issues such as mac support. Later on when Desolation 6 was about to come out I whipped up my own updater called gogoat. (It’s written in Golang so why not continue the Pokemon naming convention, right?) After some tweaks, this worked on mac as well by the time Rejuvenation 13.5 entered testing. However the problem was that even this would be clunky on Android even if I could compile it to run there. If we were to make a release for JoiPlay I wanted the patches to be easily available there as well. So back to the drawing board.
     
    The JoiPlay community member I mentioned earlier came up with an idea to download and apply a patch from a preload script. This was a cool proof of concept, but if we can make the game update itself, it should work that way on all platforms. It sounds very cool and user-friendly so I wanted to see if it was feasible.
     
    To achieve this I basically needed two things: To download a patch and to unzip it, meaning an HTTP client and a zip library. An HTTP client is like a web browser for programs. It makes a request to a server and gets a response back– in our case, the patch zip. Sounds pretty easy, but it turned out to be around 100 times more complicated than it has any right to be. Why? Because the Ruby instance which mkxp-z and JoiPlay are running internally is severely restricted. Neither an HTTP client nor an unzipping library is available in mkxp-z. Well, technically, mkxp-z has HTTPLite, but you can’t really use that for file downloads. So I reached out to the mkxp-z community and, after some trial and error, we managed to get Ruby’s standard library working in mkxp-z on all three platforms. This contains an HTTP client. The rubyzip gem is written purely in ruby so we could just copy its source code and get it working as well. However, this didn’t support HTTPS. (a security layer for web browsing that's very important.) After a while, and some more help from the mkxp-z maintainer, I managed to patch it to make openssl available, and HTTPS was working correctly. It didn’t have root certificates, but I can get those elsewhere. (These are needed for openssl to decide if the server can be trusted.) So, in the next release you might see directories called stdlib and gems, two new dlls for openssl and crypto and a cacert file. All of that is purely for the built-in updater to work. But, even if it’s quite a few extra files, it’s only around 15 MBs total so it's not a big deal.
     
    Alright, now that mkxp-z is done, let’s get back to JoiPlay. While there is no way to get Ruby’s entire standard library running on JoiPlay, it actually comes with an additional method called HTTPLite.download built-in. So it should be easier to download the patch there, right? Wrong. For one, while it does make HTTPS requests, I suspect it doesn’t actually check whether the certificate is valid. However, I can neither verify that nor do anything about it. At least it works, except for one important detail. In some cases (patreon-only builds) we also need to send an additional authorization header to the server with an access password. The download method does have a headers argument, but it’s broken and the headers are not actually sent. So I had to implement some server-side band-aid to accept the authorization in the url instead of a header. As for unzipping it, while the rubyzip gem doesn’t fully work on JoiPlay because some dependencies are missing and impossible to add, the important part– unzipping– does actually work, after a few tweaks in the code to suppress unrelated errors.
     
    Finally, after all of this, the new built-in updater seems to work correctly on all four platforms.
     

     
    JoiPlay still had several nasty issues during the beta - optimized tilesets were not updating meaning the game essentially never got any map updates. Then a new JoiPlay built completely broke loading of Ruby libraries. I fixed that and a week later it broke again. Luckily, we had a JoiPlay player in the beta (ty reispher!) who helped me with testing all of it. This is where Ame’s quote at the top came from. I really really hope this won’t fall apart due to some unforeseen and unfixable problem. Fingers crossed!
     
    To clarify, this updater is intended only for bugfix patches as it cannot update the Game.exe itself or its equivalents on other platforms. Updating from 19.5.0-rc.0 community release to 19.5.0 stable release will still require manual installation. Same for updating to 19.6.0 or 20.0.0 later on.
     
    Favorite Items
     
    For a long time, I didn’t like the fact that the first bag pocket is used for way too many items, some of which are mostly useless, while others are often the best in the game. I often had trouble finding the useful ones among the rest.
     
    On the other hand, the X-Items pocket only had a very few items. It felt like they didn't even deserve their own pocket. Most challenge runners don’t even use these items to begin with, making the pocket utterly useless for some.
     
    So, in this update, X-Items are moved into the Medicine pocket. The Battle Items pocket has been repurposed for a new Favorite Items pocket. You now have the option to mark any item in any pocket as Favorite which will make it show up in the Favorite Items pocket in addition to its normal location.
     

     
    Discord integration
     
    Another project I was working on was Discord integration. Discord has a feature called “Rich Presence”. A game can use this to tell Discord some details of what you’re doing in the game and have the details shown as your status. With this Discord can show which area of Reborn you’re currently exploring or which trainer you’re fighting.
     
    As usual, we had some complications while setting this up. Aie did all the hard work around what the game will actually report. My part was making sure the integration works on all platforms where Discord’s SDK is available. I cooperated with rainefall, the author of the extension which sits between our scripts and Discord’s SDK. Our scripts are written in Ruby programming language and this extension is a Ruby gem (library) written in the C programming language. Compiling this extension for Windows, Linux and MacOS in a way that actually worked required some adjustments for each platform. Admittedly, rainefall was the one making the breakthrough in all three cases as I know next to nothing about C. Still, I did plenty of work on testing it, setting up the automated compilation and researching possible causes for the issues we saw. For Windows, it actually needs to be done as part of the mkxp-z compilation pipeline or at least using mkxp-z’s fork of Ruby. Linux required some special flags for the C compiler. MacOS was, as usual, the most problematic because not only did we have to make sure it works on both AMD and ARM processors, but the compiler somehow insisted on linking some required libraries using an absolute path rather than relative, which makes no sense. Still no clue if there is a way to tell the compiler to not do that but after more research I found a tool capable of fixing the link.
     
    It was quite a relief when we actually had a setup working for all three desktop platforms. So, Reborn 19.5 will come with this feature included. There is an option to disable it of course. The leaders of the Rejuvenation and Desolation teams also seemed interested so there is a good chance for this to eventually drop in those games as well.
     

     
    Hopefully you’ll enjoy the improvements! We still have quite a bit more to show you so keep an eye on this blog for more posts!
     

    enu
    In my first post I mentioned that I’m the dev-ops guy. But what does that even mean? Most of the playerbase likely won’t be familiar with it or only have a vague idea. So in this post I’d like to give you some insight into what I’m doing for the team.
     
    Part of it is, of course, Eevee which I introduced last time. Another part of my work is about automating boring repetitive stuff like releases which need to be done very carefully and are very easy to mess up. Aside from actual game scripts, maps and graphics there are a lot of other parts that need to work correctly. Typically, compilation for all four platforms including all the libraries and binaries the game is using internally. The requirements have increased dramatically because of some of our new features and it would be next to impossible to maintain all of that manually across three games and four platforms.
     
    Disclaimer: Some of this will be very technical but if you’re curious what developing these games involves behind the scenes it can be interesting nonetheless. It could also be good for other game authors and modders to see how automation can help them.
     
    Patches
     
    After the initial version of eevee, the next thing on my hit list was the release process. I wanted to automate the process of detecting all files that were changed, zip it and upload the zip somewhere for the players to download. The first part was this Git command:
     
    git diff --name-only --diff-filter=ACMRTUX <commit>..HEAD
     
    Git knows the entire history of the codebase so you can get some interesting data from it. In this case the command above gives you a list of all the files that were changed since the given commit. Normally I’d feed the result to another command that would zip all those files– however, with eevee involved it’s not as easy because Git would give you the yaml / ruby files instead of the rxdata files that the players need. So, I wrote the logic to generate a patch into eevee directly. It uses this command internally but then detects which files need to be replaced by rxdata files in the patch.
     
    GitHub Actions
     
    Even when you have the patch zip you still need to upload it somewhere. And while we’re at it why would you even make the zip yourself even when it’s faster using the command? Software developers automate all of it these days. GitHub Actions can do exactly that so I wrote a simple workflow that would trigger any time Ame tagged a new release in Git, use eevee to generate a patch and immediately upload it to her server where the players can get it. With that making a new patch was just a few clicks, Ame could focus more on e19 development and easily release several patches per hour if she felt like it. I think we first used this for Reborn’s e19 public release. Since then the workflow has evolved a lot. Desolation e6 and Rejuvenation v13.5 were also using some newer versions of this and I made even more changes for the upcoming version of Reborn. Of course, now it’s mostly me and the new team actually triggering the workflow.
     
    mkxp-z
     
    With eevee and my release workflow being adopted by Rejuv and Deso I suddenly had Git access to not just Reborn but all three games. So… time for more fun, right?
     
    The workflow I mentioned above could only handle the small incremental patches; the main releases of Reborn e19 and Desolation e6 were still handled manually. Changing that would be a much bigger fish to catch– more like a whale, in fact. The main complication is that the games are not Windows-only but also have macOS and Linux releases. It wasn’t enough to just remove the dev-specific files and zip the rest because the repository didn’t contain the runtimes for the other platforms.
     
    The engine the games are using for runtime is called mkxp-z. It can be built for all three platforms and compiling it is not an easy process. Particularly because to compile it for a particular platform you need to compile it on that platform. And I don’t have a mac. There are pre-compiled versions of it available but to complicate things further the games are using a modified version of mkxp-z so that they could have a custom game icon and increased frame rate cap. If only there was a way to compile this automatically with our modifications, right? Well, guess what, there is. The maintainers of mkxp-z have their own GitHub Actions workflows to compile that thing for all platforms, so I didn’t need my own mac. I just forked it, applied the tweaks we needed and soon I was able to get a compiled version for Rejuv. It took several tries and each compilation takes over an hour because mkxp-z is a beast, but it worked. Afterwards I could set up another workflow to combine the compiled mkxp-z with the game files. A couple test versions later and we could fully automate Rejuvenation’s main release 13.5.0 for all platforms; no need for Jan, Cass or anyone else to painstakingly prepare it on their own.
     

     
    I won’t share the workflows here as I’m still working on some details for the community release. But there is no harm in sharing these so in case you want to set up some automation like this for your own mods or games and you feel getting your hand on our workflows would help, hit me on Discord.
     
    Engine tweaks

    This ended up opening several more possibilities in the future. For instance, I was able to adjust the default controls of the game which are baked into mkxp-z’s source code itself. Next I was able to make it so that the engine contained some extra libraries which we needed for some other new features– more on those in the next post!
     
    Then there was the very controversial topic of input repeat– how often an action is repeated while holding down a key. This has a big impact on how fast you can scroll through Bag and debug menus. The mkxp-z defaults (which were used in Rejuvenation 13.5) are too slow, while Reborn e19 had it adjusted for debug convenience which was slightly too fast. In our mkxp-z fork I was able to change these settings to be configurable in the mkxp.json file. So, while the default input repeat is ultimately set somewhere in between the normal defaults and Reborn e19 speed, you can now adjust it to your liking.
     
    And finally it means we can fix some bugs in the engine. It’s written in C++ which I’m not familiar with so my options are limited but I can tweak a line or two when we find a problem.
     
    Segmentation Fault hunt
     
    First I should clarify what a segmentation fault even is. I’m no expert on this topic, but from my understanding a segfault happens when a program tries to access an area of memory it doesn't have access to, causing the operating system to kill the program. In general, there is next to no way to recover from these errors because the system just kills the program with no chance to react. In general, these happen only when incorrectly using some low-level things such as pointers in C. Higher level programming languages such as Ruby, Javascript, PHP, Go and so on generally won’t let you mess up like that, and if it does happen anyway it usually means there is a bug in the language itself.
     
    Well guess what? We had a segmentation fault in Reborn during 19.5 alpha. You know how the game sometimes shows a popup with an error message? Those are our errors in the Ruby code and generally not a big issue. Segfaults instead just end the game: no popup, no message in the log, nothing. This signifies a bug in the game engine itself - mkxp-z. To make things worse, we didn’t have a reliable way to reproduce the error, it just sometimes happened during or after a battle with no consistency. Sometimes you could play for a week without getting a crash, other times you could get it three times in a day. (Like I did! -editor Cad)
     
    There are, of course, some ways to debug these cases. I consulted the mkxp-z devs about this issue and was able to make a mkxp-z build with debug symbols. Debug symbols are basically a mapping between the compiled program and the original source code, so if a segfault happens the GNU Debugger (gdb) can be used to process the core dump and find the lines in the original code where the problem occurred. It took a few more hours but I did manage to get a gdb backtrace of the issue.
     

     
    With that additional info we eventually discovered that someone else from the mkxp-z community already had a fix for the problem (which had to do with certain move animations accessing invalid files). Without the backtrace, there was no way to know what to look for, so we wouldn’t have found the connection between the issue and the available patch. The game has been stable ever since, so it was well worth it. And, because I already had all the infrastructure around our own mkxp-z fork already developed, I was able to simply merge the patch into the fork and use the fixed mkxp-z in the 19.5 beta release for Ame’s patrons.
     
    That’s all for today! Sorry if my posts are more technically oriented. Next time I’ll finally get into some improvements for the players! If you have some questions feel free to ask in the comments or Discord DMs.
     

    enu

    Introducing Eevee

    By enu, in Records,

    “The dev blog was a bit desolate, but now we've rejuvenated it to let y'all know about reborn Reborn.” ~ Stardust
     
    Time for another blog post! Today I’d like to introduce a development tool which we have been using internally for almost two years. Reborn was my guinea pig here but both Rejuvenation and Desolation are using it as well these days. Big thanks to Ame that she was willing to try this out on her game even though I was just an alpha tester at the time and the e19 release period was very busy!
     
    This one is meant especially for those of you who maintain large mods that include map changes and creators of their own games. Several features we’ll be introducing in the 19.5 update and more features that we’re planning for later would not have been possible without this tool.

    The problem

    In my previous post I mentioned that the team is using a version control system called Git. It’s an essential tool for any kind of software development. It lets you keep track of every change that was ever done to the game with the possibility to go back and see the changes, merge together the work of several teammates, and so on.
     
    One notable thing about Git is that it works well with text files but not with binary files. Such files are basically computer gibberish which can mean anything and therefore is unreadable for Git. Think images, audio, video, executable and so on. The issue with RPG Maker XP (the editor which is used to create these games) is that it stores maps and some other things in a binary format. You know, the .rxdata files in the Data directory of the game? Yeah, those. I didn’t like that so after some research I found a super old tool capable of decoding them. So I forked that, made it more useful for actual development and called it the Easy Essentials VErsioning Engine, aka Eevee.

    Eevee basics
     
    Now what can this little fella do for you? Well it can transform .rxdata files to a text format and vice-versa. Git is very good at versioning text: it can track when each line was changed, who did it, let you merge changes from two people even in a single file and so on. So for Git to be able to work with maps it was very important to have the maps in a text format.
     
    For the team this is very important as it allows us to have several long-term projects that need a lot of map changes in separate git branches and we can easily sync them with whatever changes we make in the main branch. Synchronizing that without Eevee would be a nightmare and very prone to accidentally undoing someone’s work. But this way we can easily keep everything up to date internally as a part of our routine and those long-term projects can spend as much time in the oven as they need without causing any problems.
     

     
    Another no less important advantage is that text files are human-readable and search-able.  Wanna know all the places where you can obtain a particular item? Find all events where a mon is removed because all of those were bugged? (Yes they are all bugged in Reborn 19.0.16.) We can do that!

    The format
     
    Now originally the format eevee produced was simply YAML. Which was okay but I didn’t have full control over the output so it still contained a lot of extra gibberish. However, near the end of last year I finally sat down and implemented a custom format for Eevee which makes it even more useful.
     
    It allowed me to make many custom improvements to the format for easier usage - making sure that important data is there in a readable form while useless and redundant data from the old yamls is simply cut. For example all the options that can have one of a limited number of options in RPG maker are transformed from their internal number representation into text here for much better readability.
     
    To give you an idea what a map looks like in this format, here is Lapis Gym in the new format (scroll down a bit, the events at the top aren’t very interesting). You can see all the dialogue and all other data the map contains. We can also easily find all the places where a particular switch or variable is used or where a particular audio track is played. And finally, it allows doing some bulk changes by simply string replacing across the entire project. For instance, some typos were in many places all throughout the game.
     
    There are three other things worth pointing out in the example file. Firstly, the comment at the top of the file shows you where to find the map in question in RPG Maker. Secondly, unlike the rxdata files, the filename also contains the name of the map.

    Other features
     
    Eevee is also able to run in the background while you’re working in RPG Maker and output your changes to ruby files on the fly.
     
    There are more features which you can read about in Eevee’s documentation if the tool looks useful to you! We use it to generate patches and validate our maps so that they don’t contain common errors. There is also a guide to help update your modded maps to the new version of the game. It’s not an easy process but for large mods it should be a lot faster and cause less issues than redoing all the work manually.
     
    The source-code is entirely open on GitHub so you can see how it works internally and help improve it if you find a problem.

    enu

    Still Alive!

    By enu, in Records,

    Hi, Community!
     
    This might come as a bit of a surprise. Almost two years since e19, is it? Can't blame you if you thought the game was done. Admittedly there was a hiatus for a while and we have been a bit quiet about the recent revival, but the game is very much alive now. In fact, we're planning a new release in the not too distant future.

    Wait, who is this random person?
     
    Right, I never wrote here before... Well, hi! Enu here. I'm the dev-ops guy. While my main focus is Reborn, most of my work benefits Rejuvenation and Desolation as well. I created some tools that make the development and release process easier for the teams and later I also worked on improving some aspects of the player experience.
     
    I first found Reborn around episode 14 and it quickly became my favorite Poké game. Occasionally I tried to look into some bugs that were really annoying - the veterans among you might remember them. The long text lines where the first part disappeared before you could read it? Or funky NPC follower movement, especially around ledges? I helped out with those. Also I know Git quite well (it’s a version control system, a great thing for software development) so when Ame's team started to use it I gave her an introduction about what it can do. Later when she started talking about episode 19 alpha on Patreon I half jokingly asked where to apply. I didn’t really expect to get in but thanks to those past involvements Ame actually did invite me into the alpha testing group.
     
    What happened afterwards was that I stayed active even after alpha testing concluded, wrote some tools for the team and kept working on fixing bugs even after the e19 release cycle finished. In the meantime most of the original Reborn team moved on to other projects though a few of them still make a change or two occasionally. Desolation and Rejuvenation teams were working hard on their respective updates. I helped with updating the games to take advantage of the new tools we had available. And eventually after these updates were released I ended up building a new team for Reborn together with Ame.

    So what is this update about?

    First to avoid too-high expectations, this is not a story update. There are only a few dialogue changes overall - such as new NPCs mentioning new passwords. There is no big graphical overhaul, no new gen or something either. The game still looks and plays the same.
     
    Our main focus was the engine. Modders might have noticed that latest versions of Desolation and Rejuvenation have a very different code base than Reborn e19 had. It was mostly Cass and the Reju / Deso teams who did the engine overhaul. This update gets Reborn running on this new engine as well. The main benefit is that the engine is shared between the three games which means that future bug fixes and even some features can easily be applied to all three games. In fact many of the new features coming to Reborn will appear in the other games as well in their next update! This way we'll all have a good base for future updates and benefit from the hard work of the other teams. The new engine should also make the creation of new mods easier than ever.
     
    For players, this update brings many long-requested QoL features, a couple of new passwords, improved controller support, accessibility improvements and an official (if experimental) JoiPlay version to be played on Android among other things. More about these in upcoming blog posts! We also fixed hundreds of bugs - both in overworld and in battle.
     
    Small clarification about version numbers. Reborn e19 had versions 19.00 to 19.16. However, they should have been 19.0.0 to 19.0.16. The convention was just incorrect back then. The new update will be version 19.5.0.

    Introducing new team
     
    Amethyst
    No introduction needed! As you all know Amethyst mostly moved on to work on Starlight. So while setting up the new team my main goal was to do it in a way that the team is capable of working without Amethyst keeping an eye on all the details. She makes some changes herself every now and then and we make sure to ask her about priorities, what features she wants included and other decision making. This way we can keep making the game better but still very much in line with her vision and wishes. Other than that her hands are free to work on what she wants and not lose time on minor details that don't necessarily need her attention.

    Crim
    A veteran from the original team! Many things from e19 and before are their handiwork and we’re very lucky to still have them on the team. Crim has the skills to do just about anything the game needs - graphics, animations, mapping, story writing and scripting. They’re looking into tweaking many of these aspects in the future and we’re very excited to see it.

    stardust
    A very experienced Reborn challenge runner! She’ll often take note of random battle bugs either from her own runs or community conversations, then go and fix them before we knew the bug even existed! Other than that she's also the author of the NG++ mod for e19. This mod will not be updated for 19.5.0 as it was merged into the main game, along with a number of new skips and improvements.

    Lucent Flash
    Lucent is constantly proving his expertise at analyzing... well frankly anything I throw at him. He fixed many random issues and we can rely on him for some larger projects as well. For instance the new engine completely broke many Reborn-specific features such as all Online stuff. Lucent fixed all of that and additionally made it possible for these features to work with the other games and even with large mods that add newer generations or fakemons.

    Cad48
    I'm always amazed about the amount of random trivia that Cad knows about the franchise. It often helps to have him validate how things should work. A large part of the upcoming accessibility improvements are his work, not to mention many other random fixes. Together with Lucent he also added Battle Pavilion bosses for double battles. He’s also been putting a lot of work into ████████████.
     
    Haru
    They're the person behind Randomizer which is also greatly improved in this upcoming release. I don't know all the details but the Randomizer improvements will be revealed when the time comes! Haru also did the hard work of updating the Battle Pavillion and Battle Factory in the Nightclub to the new version of the engine. This alone was a LOT of work. And last but not least, several important engine refactorings are Haru's work as well.

    Pyrolusite
    Errr... this is probably a dead give away to what we're planning, isn't it? Can we announce this one early, Ame? Yes, Pyro is the author of the very popular UI mod Pyrolusitium. Yes, he's on the team to improve the UI and we’re very much looking forward to it. Unfortunately, no, it isn't ready just yet and won't be included in this update. It will become part of the game later.
     
    ...Oh and myself. I maintain the dev tools, and introduce various initiatives to improve our work. You'll hear more about some of my work in upcoming posts!
     
    Some of the old devs also occasionally float in and out to help out with something and we can consult with them when we need to.
     
    I don't have an exact date for when this release will go public. There will be a community testing version first because we're still running into random quests being broken because of the engine update every now and then. But overall the game is quite stable now.
     
    Thanks for reading and stay tuned for more updates!
     

    andracass

    shameless self-promotion

    By andracass, in Records,

    hi people who still check the dev blog!
    this has nothing to do with development and more to do with things related to the game but aren't actually the game.
     
    starlight exists
    first off, did you know that there's a devblog for starlight that will actually get updates? and they're updates from ame???
    crazy right
    if you're interested in the game you can go check out that blog by either clicking the link above or the link below! whichever one floats your boat.
    https://www.rebornevo.com/sd/devblog/
     
    put reborn on your wall
    i don't know if i've mentioned this someplace non-ethereal, but we have a poster store for the reborn map! 
    it's here: https://www.etsy.com/shop/ChasingSelene
    there are also a few select character desktops.
     
    give ame money if you want
    you can also support ame on her patreon!
    https://www.patreon.com/amethystvl
    you can toss some money her way if you think the game is neat.
     
    that's it. i am still Dying ™️ as per last post, but ame has made a post on the starlight side and i thought it would be a good idea to say that over here.
     
    also, here, have a neat meme i saw.


    andracass

    hey, what's going on?

    By andracass, in Records,

    hi!!!!
    oh man. remember dev blogs?
    i don't.
    in fact, when choosing a title for this one, i had to stumble over all of the other related "i've forgotten what a dev blog is" titles.
    this is how we got to where we are today.
     
    so i'm sure that all 5 of you who regularly visit this devblog (hi! thanks for checking and i'm so sorry we haven't done more of these!) are wondering:
    what's going on?
    i am dying, squirtle. oh man am i dying.
    i gotta finish grad school, i gotta find a job, i'm trying to do this whole "coding" thing on the side, and my fun field trip to europe got hit by the Rona (i'm okay! it just sucked!).
    life is big stresso. too big stresso. i work great under a nice stable level of stress. i genuinely find cleaning up the code to be stress-relieving (stress cleaning, but for nerds!) but that's only if i'm not already super stressed out.
    and oh man am i super stressed out. so i haven't been getting nearly as much done as i would like to. that includes blogging! even though the blog's in a weird state right now.
     
    what's going on? (devblog edition)
    reborn's in a weird place rn since it is, as you may have heard, finished!
    upon finishing, the team basically split into three directions:
    - some people went straight with ame over to starlight
    - some people hung around with me for additional game fixes
    - some people stayed right where they were! they were on multiple games to begin with and this has really changed a whole lot of nothing for them.
    regardless of where people are, the situation is simple: reborn's done and everyone's off doing better things. fangames devs require two things: time and motivation. no one has time, and the motivation is on other projects.
    but this is a reborn dev blog! and the only way for there to still be work on it is through the scripts.
     
    what's going on? (scripts edition)
    sooo stop me if you've heard this one before....
    i really wanted to get reborn/rejuv/deso all on the same scripts.
    that basically kicked off the moment that the last version of reborn was out.
    it is, uh, very hard.
    there's two main components of the script work:
    - data structure redevelopment so everyone can share scripts
    - everything else
    there's a lot of work! tinkering with the scripts is complicated! these changes are very sweeping and require a lot of bugfixing to make sure everything works correctly with the new system. and i swear to god, every time anyone looks at the scripts we run into like five other things that we'd like to fix. i'd like rewrite the battle system!
    but, alas. no time.
    so: where are the scripts at?
    well, we redid the data structures and battles almost work!
    this is a pretty significant distance from the original state of the scripts, which was "everything is crashing everywhere all the time". stuff actually tends to work now!
    this statement will, of course, come back to bite me very soon. but there's hope for progress!
    i also want to take a moment to shout out the whole scripter squad who's been helping out with everything. i have primarily been directing stuff off in the distance (with some brief bursts of my own work) while the individual games' scripters have been cranking away at the myriad things we want to do with the code.
    big things we've got coming (that i would expect the average player to care about):
    - new pbs! we now use ruby hashes instead of the standard text files for compiling game data. it's internally simpler at the expense of requiring a touch bit more coding knowledge to use.
    - new save files! don't freak out, we have a converter. new save files are going to be a little bit smaller than they used to be and will hopefully be a little less prone to corruption!
    - quicker animation loading! and data loading in general. i mentioned this before, but i'll mention it again because i really like my optimizations. game go zoom!!
    so hopefully one day this'll come to a game near you!
     
    what's going on? (games edition)
    oooookay, so, development's a little weird for everything these days.
    basically, the script development now occurs in tandem with the development of the individual games but isn't actually directly tied to the games themselves. the scripts are their own thing. legally the game (say, reborn) is separate from the scripts. everyone does their own work and then the scripts are shared between everyone. rejuv/deso will release a new version with whatever scripts we've got, and those scripts will just get progressively better over time. theoretically we'll reach a point where other hot new community games can just take the same scripts and run with them. who knows! 
    ideally it'll be really easy to pick up and use, kind of like a reborn-based essentials. (one day i'll get a name for it!) the primary focus of the scripts will be the core community games, but if you're making one and you wanna use what we've got, more power to ya.
    this is also why i'm hoping i'll be able to sneak an engine update to reborn someday! that'd be cool. 
     
    i feel like i'm starting to get rambly, so i'm cutting the post here. hopefully this explains some of the stuff that's been going on, and hopefully the other games will start showing off some of the work soon!

    Dreamy
    Right, so what the heck is this? Well, let's start with a little story about that funny sidebar on the right of your screen over there (or wherever it is for you mobile lot). Early in E19's development process back in..... christ, 2019, there was a truly inspiring, miraculous comment in that sidebar.
     
    And that comment was "boobs."     

    Upon seeing this, I had a thought. that thought that went something along the lines of "huh this sure is some interesting insight into the minds of the developers as they work and also my friends are pretty funny sometimes so it's a shame that these are lost to time after each update. I check this page pretty often by habit anyway, maybe I could record them somewhere!"
    This was my first mistake.

    And then, as time marched ever onwards for far longer than anyone predicted, I continued to repeatedly make mistakes with each passing update because sunk cost fallacy is a bitch, and now I have a word document that's almost 30 pages long and ~25000 characters containing basically 3 full years of updates! haha oops.

    Now that E19 is out It's finally time to share this mess, so hopefully at least one of you gets something out of this...

    (as some extra notes: for a fair amount of these there were also various progress bars up that're referenced but not recorded because this document would be far more insane if I had, but occasionally I tried to include some extra notes to try provide a bit of context about bars/posts. I'll put these in *green*, like this message, assuming I can remember which parts were actually my notes)
    ....also, as I write this bit, I hope I have enough image upload storage to handle this whole post...

    oh also dates will be in a nice sensible Day/Month format for all us non-americans.
     
    And now, without further ado, a very tired Dream presents:
    The Great and Foolish E19 Dev Blog Log
     
    The dark times before history
    (I don't have dates for these ones but somehow recovered them after starting the log. I don't remember how):

    “so it is going to be my earnest goal to start updating this daily for real now even if there's no progress to speak of. and that's probably not going to happen right away so like please nag me if i go a couple days without or something, ok? Ty”

    “tbph figuring out how to divvy up the eventing and story for victory road for this scoreboard is almost not worth the time it would take to math it out because it's very wimey-wibbly-wobby, so numerically the next month or two or howeverlong is just going to be a big bag of questionmarks and it's up to you all to deal with it.
    but i'll chat here, so don't worry. won't be totally in the dark.  “

    “eventually this will just be one big trail of quote blocks.”


    Recorded History:
    ##2019##

    29/3: “boobs.”

    30/3: 


    1/4: “today has been a mess.  update post when i wake up-ish though”
    (Later the terra tournament post came up)

    2/4: “ finally finished puzzles for room... 1.
    ...sigh.
    it's fine. it's big. it's really. just. fine.
    everything is fine.
    nothing is not fine.”
     
    6/4: “had a small break for a couple days to chill but the most time consuming parts are done now
    probably”
     
    7/4: “suddenly the strong majority of what needs to be done is story
    funny how things speed along when you don't have to deal with a bunch of tedious mi-- oh oops we're not saying that  “

    8/4: “story creep forwry
    someday the scoreboard shall update again
    but today is not that day “

    11/4: “(several shining moments of emotional stability later)
    3 pozzle left “

    12/4: “victory road act 2/3 done
    3 take a bit tho “
     
    14/4: “story the bulk left; six scenes remain”  
     
    19/4: “geez, three in a row for characters not making it through their scene
    oh well. “
     
    20/4: “remaining: 1 scene, 2 pozzle”  
     
    22/4: “remaining: 1 scene, 0 pozzle”
     
    23/4: “encounters done
    and lamps
    dont forget lamps “
     
    24/4: “Falconn......................................................”  
    (scoreboard is at 58% total, hasn’t moved in a while)  

    25/4: “...PAAAWWWWNCH!”  
    (total jumps to 87%)

    29/4: “8 maps remain.”

    Also 29/4: “E4 map 1/4 complete.”

    1/5: “E4 map 2/4 complete.”

    4/5: “E4 map 3/4 complete. “
     
    9/5: “ended up doing an early/impromptu test session for the existing part of E19, hence gap for a couple days
    mapping reacts only now tho”
     
    11/5: “elite 4 room 4/4 done”

    13/5: “champion room done, hall of fame done “

    14/5: “one map remains”

    17/5: “ah..” (mapping at 100%)

    18/5 “next time sir fucking isaac newton decides he wants to go and invent some bullshit-ass thing like gravity i propose we go toss him over a fucking cliff and ask him how he feels about gravity then”

    21/5 “well, took a couple days to update some old graphics and such...
    god i still feel like there's so much to do though “

    22/5 “elite 4 2/4 done story “

    23/5 [blank update]

    25/5 “Elite 4 complete” (eventing at 100%)

    26/5 “no e19 is not going to be released any time soon please hold all of your horses
    gently” (E19 content progress at 99%)
     
    28/5 – [E19 BOARD 100%, Postgame Boards Revealed, Postgame announcement] – Bugs:250   
    Cass: “no
    no readability
    only bar

    29/5: “🐛🐞🐝🐜🦋 “, Bugs = 350

    31/5: “mix and match = general nightclub stuff now
    misc can have five points for the mining updates too. “
    (Scoreboard compression/simplification) Bugs = 350

    1/6: “oh my god the AI is killing me make it stop” Bugs = 300

    2/6: “testing may now continue
    if it must. “ Bugs = 300

    8/6: “you ever just fall through a portal and wake up six days later
    anyway, about 2/3 through e19 second supervised test right now
    previous bug score didn't include AI bugs
    we are now on the warpath “ Bugs = 360

    9/6: Bugs = 315

    10/6: “supervised playthrough #2 of 3 complete” Bugs = 240

    13/6: “oh my god
    i cant with the AI 
    pleeze....... “ Bugs = 400000000000000

    14/6: “the AI has gotten back in its cage where it belongs.” Bugs = 445  
    AI- ######################################################################################################################################################AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH | 0%
    (Many #s and Hs cut to decrease doc lag, seriously, copying the original message fully almost crashed it)
    (AHHHHHHPDATED 15/6)

    16/6: ‘it's  not  fine.’ Bugs=650  (not was same colour as background, hiding)

     ‘the fight continues.’
    (Updated 6/18 [until possibly forever]) Bugs = 650
     
    22/6: “hi there devving is on a brief hiatus because there is party and we wouldn't want to miss the party.” Bugs = 650

    26/6: ’ the AI is so broken i'm surprised it ever functioned’ Bugs = 650

    1/7: “mid internal, we full steam now party over. so far, not too bad.” Bugs = 315

     3/7: “nightclub interior mostly mapped, battle arenas yet withstanding” Bugs = 315

    6/7: “it is time for the never-ending legendary list to slowly begin to begin.......” Bugs = 315  

    9/7: “welcome to Progress Bars v19.1p
    now slightly more accurate!
    also probably overweights the nightclub in terms of work done.
    but who cares! bars! numbers!” Bugs = 315  

    10/7: “the battle tower functions and i'm no longer concerned about overweighting the nightclub.:  Bugs = still 315  

    11/7: “it has been a big day for Features here at Definitely GameFreak™
    also, nightclub general was a little low. it's better now.” Bugs = 315  

    12/7: “it continues” Bugs = yup, 315

    15/7: “it continues to continue.” Bugs = 315

    22/7: “hi we're not dead except me for like a week but the misc bar can have a % “

    24/7: “hi work is go
    more features
    more battle tower
    the classic
    finished nightclub mapping tho!”
    Bugs = 315 still

    26/7: “so. much. Tower”
    Bugs = 645

    28/7: almost done with movesets for the battle tower.
    there are currently 1425 of them.
    why are there so many pokemon”

    31/7: “getting some low-hanging fruit out of the way
    (also it's ame's birfday happ birf)”
     
    3/8: “three houses is ruining productivity.”  

    4/8: “doing some lag reduction / event cleanup”

    6/8: “we're almost done with the overall planning for postgame!
    and since i can't think of anywhere to put it....
    it's going in the spirits/birds bars
    that way i don't have to make more bars.
    so we're in Bars v19.1.1p now.”

    15/8: “how did this game ever function”

    17/8: “the game occasionally functions very well on accident
    ame was proud of the AI”

    20/8: “sometimes gamefreak is wrong”

    23/8: “we officially technically have a functioning boss rush”

    29/8: “hi yes we're alive”

    31/8: questselia is questplete!
    (also, if you're wondering why the spirits/birds are hanging at 95%- they're basically done, but they're not hooked into the overal story yet since the overall story isn't quite there.)

    4/9: “nothing happened i'm just giving the misc bar a point”

    “minor additions: people swim in the lake now
    why were there no people swimming in the lake
    it's a lake “

    14/9: “[angry emoji]

    22/9: “i, for one, am proud of what i've accomplished today”

    30/9: “hey kids 
    sorry for the lack of updates lately, but unfortunately that's not likely to change much soon. we've been prepping for me to go under the knife tomorrow (this was planned, nothing bad's happened so don't worry). i'll be in the hospital for several days and then likely recovering for most of october. currently unsure how functional i'll be at all.
    apologies for the delays-- thanks for hanging in there with us.
    ~ ame “
     
    3/10: “back at home. i still won't be able to work properly for a while, but in the meantime at least know that everything went more or less smoothly. 
    ~ ame “
     
    14/10: “ame's not functional, and i've mostly forgotten how to teambuild.
    but we out here!
    kinda! “
     
    25/10: “some stuff got did and imma write a thing on it”

    31/10: “GUYS I DID IT I MADE A BATTLE TOWER TRAINER” (FITE is currently 100000134180340126349612534% complete)
     
    1/11: “we are defining the fuck out of trainers up in here”
     
    5/11: “i hope y'all really like water trainers”

    7/11: “almost done. post soon.”
    [battle tower 1.0 post]
     
    26/11: “it is Map o' Clock”

    28/11: ‘very very important sidequest finished. added 500% to the misc bar. bar has been colorshifted to purple to compensate.”  

    29/11: “quick psa: if your game is lagging, you can reduce that lag by shifting your screen size from L to M.
    essentials is the worst.”
     
    6/12: “non-update update update: meant to also actually update the bars, too
    been a long week. “

    21/12: “it has been brought to the attention of Management that there is a new bar.
    while this is, of course, strange, it doesn't seem to be hurting anyone
    so we're just gonna leave it there.” (mysterious secret bar added)

    24/12: “hello class
    it is Secret Time
    the downloads page has been updated with a small non-content 18.2 update
    please check this completely inconsequential post for more info!”
    (E18.2 the aipdatetm is released)


    ##2020##


    16/1: “progress is fake” (current estimated release date: not June)

    18/1: “today's dev bars feature a quick psa about a release date
    many people from around the world frequently ask "when is e19 gonna come out?!?!?!??!?!?!?!?!!/1/11?!?@!?#?!??@!?@?!?#!?$?!@$!$@!???%!??!!??!?!?!?"
    actual quote.
    while i really can't give you an actual estimate as to when the release date will be (who knows if ame and i will suddenly achieve Go Mode and finish every quest in a week or smth)
    what i can tell you is that regardless of how fast we move, testing will still easily take two months. minimum.  
    like, even if there wasn't, like, two and a half episodes of content- and there is
    there's still all the new modes, new features, a whole bunch of other things that i can't even remember off the top of my head
    but, like, what i'm trying to say is that even if we were suddenly done tomorrow, you would absolutely hear about testing in advance.
    i'll even make some new bars for it. “ (current estimated release date: cyberpunk 2077)
     
     
    22/1: “there might be a battle factory.
    maybe.
    possibly.
    we're working on it.
    but like
    probably.
    also the bug score is dropped but it's a lie anyway so it'll get big again soon don't you worry “
    (current estimated release date: reborn is cancelled oops)
     
    26/1: “it continues” (current estimated release date: uhhhhhhhhhhh eventually?)
     
    29/1: “that awkward moment when you forgot keldeo”
     
    1/2: “so nothing's changing in the bars
    i just want y'all to know that in the e19 trainers text
    ~30% of the content is new to e19
    that means that you're getting roughly 50% more battles in e19 than in e18
    and we're still only halfway done. “
    (current estimated release date: fuck january's already over someone needs to recalibrate the flow of time)
     
    8/2: “this is really a lot of work that i gave myself.” (current estimated release date: what's a pokman)
     
    11/2: “maybe going through the entire list of trainers twice wasn't the best idea” (current estimated release date: probably someday?)
     
    14/2: “maybe going through the entire list of trainers was a good idea.
    there are some embarrassing mistakes in here.
    (difficulties now have some ?'s in them because they're probably smaller now- i just don't know by how much)
    edit:
    dark: 25% complete after 1 week
    lite: done in 3 hours
     
    19/2: “dark is, like, half  60% done” (current estimated release date: ask ur mom lol)
     
    22/2: “dark is almost done kids
    we be branching out in here” (current estimated release date: we don't know either ok)

    25/2: “dark is done and the misc bar is slightly happier now” (misc at 653%)

    29/2: “genies quest died a little but should be back shortly”

    2/3: “there's a chance that difficulty modes will be released post-e19 to streamline development a little. misc bar loses a few points.”

    15/3: “hi! haven't updated for a little bit. ame's been working on starlight and grad school decided to kick my ass for a little bit.
    but, y'know, we here, we in it
    just a little less right now.”
     
    20/3: “we have a battle factory.
    the shit works.
    the shit works good.
    i hereby dub toothpastefairy honorary dev “
     
    21/3: “every battle tower boss has a team!”

    12/4: “we're taking a bit of a break due to..........circumstances 😕 ”

    24/4: “things have been a little quiet on the episode progress side of things, but we're working on a new engine that will hopefully be out in the reasonably near future!”

    25/4: “i sped up animations a lot with five lines of code. i am a lot of indescribable feelings right now. “

    1/5: “if your computer is a fruit you should check the devblog” (mac native release)
     
    4/5: “the 18.3 etc. to-do list:  fix mac/linux online”

    5/5: “all you kids have some brand new toys (18.3) available on the downloads page! i am super done with these 18.x versions, though. managing several different releases is a pain.”

    22/5: “life has been busy as of late. but we've compiled a list of bugs. so that's something?

    24/5: “hey remember when we made this game? good times.
    the bug score is now officially a progress bar
    a score of 0 means the bar is 100% complete and progress will be determines out of a total of 500.
     so it's at 7% rn “

    1/6: “progress continues”

    4/6: “bugz go SMACK”

    7/6: “ok! all done! quest ez. pokemon dum.”
     
    10/6: “we've made some really dramatic strides in script optimization. misc bar gets 10 points to commemorate the occation.”

    13/6: “i released another version because you can't stop me i can't stop me NO ONE CAN STO- (you should go download 18.4) “

    16/6: “i've been basically at this optimization shit non-stop for like a week
    e19's gonna be like a whole new game “
     
    23/6: “i think the optimization train is coming to a stop. until we get more lag reports when testing finally rolls around. “

    26/6: “bugz b smack’d”

    5/7: “hope you kids like puzzles”

    15/7: “local memer releases update that literally doesn't matter” (18.4.2, no word on changes)

    17/7:

     
     
    18/7: (exclusive staff sneak peak version representing the actual state of the AI right now)
     
     

    20/7:

     

    21/7: “i made the ai 10,000 lines shorter by just deleting all the code that does stuff and replacing it with low quality jpegs of donkey kong
    youre welcome”

     23/7:

     
     
    24/7:

     

    26/7:
     
    (cass is going through it right now with the scripts)
    (also fun fact added now in 2022 variations of this image still take up 9 emote slots in the dev server)
     

    27/7:

     

    30/7: “e19 scripts now feature Stuff”

     

    1/8: “I redid the compiler”

     

    4/8: “ok meme stream is over now
    back to normal”

    7/8: “thinking about final releases...
    i think i get why "finished games" are rare
    it's hard to look at the thing you spent [x] time on and be like
    "yup. this is good. i'm done."

    10/8: “ame is going to pull me over to starlight so your regularly scheduled script blogs are going to be a little sparse.
    but we still here. still doin. “
    (current estimated release date: if anyone has an estimate as to when this game is going to come out, they are lying to you. do not trust them or anything that they say. best case scenario is that they're a time traveler who has come back from the future with information of the release date. they must be removed before causing a paradox that ends reality.)

    14/8: “ran a check for AI processing time.
    in 18.4.3, the AI phase took 0.37s to process
    in e19 it took 0.03s
    zoom “
     
    17/8: “really think i'm starting to reach the point where i can sit down, take a look at the scripts, and think "yeah, sure, they're fine, I guess."”
     
    25/8: “hello. the progress bars are in storage. you can read about why here.
    and, no, the game is not cancelled. it's okay. “
     
    26/10: “you hear a lot of power tool sounds coming from the shed that the progress bars are stored in.”  
     
    8/11: “the shed that the progress bars are stored in has mysteriously disappeared. “

    12/11: “soon™”

    17/11: “there's a starlight demo out! the beta is currently only open to forum members, but the public demo should be coming out soon!”

    22/11: “current state of the AI code:”

     
     
    25/11: “AI is now slightly less spaghetti but still pretty spaghetti [same picture]”
     
    1/12: “ok. the game is officially being worked on.
    you don't have to sit through my endless code posts anymore.
    you are free.” (hi again post made)

    2/12: “IM BACK IN BIZNIS “


     
    4/12:
    “landous
    what bwings us
    togedder
    today.

    ps. you get 1 progress bar. it's the length of the AI code.
    e18.4.1 length: 42,005 lines
    current e19 length: 24,113 lines “
     
    5/12: “i think i hit the AI code really hard and accidentally created a field effect mod”
    current e19 length: 24,080 lines
     
    6/12: “here i wanted to make a nice devblog post about the AI, or this new field effect mod i ended up making on accident
    but then my dumbass girlfriend goes and deletes e19

    it hasn't even been a week yet

    (like it's been recovered and stuff but jesus) “
    current e19 length: 24,060 lines
     
     
    14/12: “hi exams happened and i forgot this bar existed for a few days
    here's some updates:
    we've been bugfixing and testing a lot
    i took the field effects and shoved them in an array so that they behave themselves better. devblog post for this will come when i think it's done
    i patched onlinebattle by yeeting out 90% of the code
    same for z-moves
    i learned that apparently "razor wind" refers to a slashy weasel that spins very quickly and that move will never be the same again “
     
    20/12: “i am very tired in my soul. nightclub battlestations are currently in development! field effect re-coding is also still happening.”

    30/12: “still re-coding the entire field effects things and the nightclub!”
     
    ##2021##

    2/1: “we out here. we coding.”

    7/1: “the nightclub battle content is almost done!!! then we get back to all that questing.”

    13/1: “:                        )”

    21/1: “oh my look at the time, it's legendary-quest o'clock. ~a” (+New Devs, New Nightclub! Post)

     29/1:

     

    3/2: “hey do you know what heals you at the end of each turn
    the ai sure doesn't
    i sure don't
    and that's because someone made this field system that just fucks with everything straight to hell”
     
    15/2: “why do moonlight and morning sun work exactly the same”

    24/2: “anyone else feel like everything kiiiiiinda sucks rn?
    devving is going a little slowly.”
     
    28/2: “proper update soon, ok? ~a”

     
    7/3: “Legendaries Accounted For: 32/65” (‘you get one(1) progress bar’ devblog post)


    11/3:
    (Legendaries up to 33/65)

    15/3: “the ai code is coming along nicely!”  

    16/3: “so we shaved off 28.5k lines of code from the ai so far.
    we don't know if it works yet!
    but we hope it does. “

    23/3: “took a break from the AI to casually solve the RMXP map limit issue that has plagued game developers for years
    took like 5 minutes
    ez”  (34/65 legends)
     
    4/4: ferris wheel devblog post

    21/4: “did you know that cresselia can't learn cosmic power?
    did you know that buneary, instead, can?
    taken a brief respite from the quests to go back and tune up some earlier content. that'll be ongoing. “ (39/65 legends, has been steadily increasing)

    22/4: Anomaly Battle devblog post

    24/4:

     
     
    8/5: yummy low-hanging fruit (44/65 legends)


     
    14/5: “credit to Loretze for the improved artistic rendition of The Big Ferngus ” (45/65)

     
       
    22/5: “https://www.youtube.com/watch?v=hBonWdqOT6Y”

    23/5: “hi minor changes
    meloetta changes form by using relic song in the field instead of in battle
    also i apologize in advance- i seem to have forgotten how to make single battles “

    30/5: “small break while we're taking a bit of a road trip~
    but really, we were already gone in our hearts all along
    back in a few?”

    11/6: “blehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh”

    12/6: “haaaaaaaaaaaaaaaaaaaaaaa *dies” (legendaries 47/65)

    (for context I think the image is related to adding the “open saves folder” button)
     
    27/6: “hi again! back from trip #2, summer party over with, no further distractions planned. full steam ahead perhaps."

    12/7: “did you know that you can pronounce "gracidea" the same way as "quesadilla"?
    you shouldn't
    but you can.
    one more done but primarily focusing on early game again for a bit. maybe a teaser for early updates soon? maybe.” (legendaries 49/65)
    “update: apparently this is how canon pronounces it. i hate this. it's so cursed. stop. stop. stop. why? why? why?”
    this is also how I've always pronounced it.....
     
    21/7: “so apparently the new ai is finished???
    there might be a post soon???????????????????? “
     
    28/7: “memes are cancelled actually.
    early game updates are also cancelled actually
    only quests now
    another milestone hit but i can't update the counter :\\\
     
    edit: okay no they're not actually cancelled, i just reached a good pausing point so i'm going back to postgame content, funny phrasings only, there is no need to do a worry”
     
    29/7: hi i made a twitter
    i don't know what twitter is
    click this to go to the twitter (because the embeds on this sidebar are dUM) “
     
    11/8: “previous week or so also featured updating some past quests with a little extra...” (Legendaries: 50/65)
     
    14/8: “10 quests remain” (Legendaries: 53/65)

    ??/8: “9 quests remain”

    4/9: “7 quests remain.  
    don't get used to the double, it's just a fluke “(legendaries 55/65)

    9/9: “6 quests remain” (56/65 legendaries)

    15/9: “5 quests remain.” (58/65)
    Camerupt Nutritional Information*:
    ⦁    Total Fat                    0.2 g       0%
    ⦁    Saturated fat           0.1 g         0%
    ⦁    Cholesterol              0 mg        0%
    ⦁    Sodium                    13 mg      0%
    ⦁    Potassium                897 mg    25%
    ⦁    Total Carbohydrate  37 g         12%
    ⦁    Dietary fiber            4.7 g        18%
    ⦁    Sugar                      1.7 g    
    ⦁    Protein                     4.3 g        8%
    ⦁    Vitamin C                                70%    
    ⦁    Calcium                                   2%
    ⦁    Iron                                         9%    
    ⦁    Vitamin D                               0%
    ⦁    Vitamin B-6                            30%    
    ⦁    Cobalamin                              0%
    ⦁    Magnesium                            12%        
    *Percent Daily Values are based on a 2,000 camerupt diet. Your daily values may be higher or lower depending on your camerupt needs.
     
    20/9: “4 quests remain.” (60/65)

    25/9: “3 quests remain.”(61/65)

    28/9: “2 quests remain.”(62/65)
    (Camerupt Nutrition renamed to potato nutrition)
     
    15/10: “2 quests still remain.”
    “to expect perfection is to invite disappointment.
    this is true of all routes of life.  “
     
    18/10:   mysql exception at /var/www/html/forums/core/datastore/d4224989543895843f4b22d2a1112a_page_builder.7769ea1b77.php: line 238: 2013 Connection to the server was lost
    encountered at /var/www/html/pr/development/
    Please contact the site administrator to report this problem.
    (turns out this was not an intentional update, the forums actually just broke a bit. I think ame broke a bit when I asked her about it too)

    19/10: “0 quests still remain.
    Expect a post by the end of the week about what's left to do.
    (updated 10/19)
    --
    man i hope you kids like double battles
    (updated 10/19 but it's cass) “

    21/10: there's 360 new teams in e19
    i counted
     
    22/10: "guys ame won't let me use my physical xerneas set on big top :C"
     
    23/10: “devblog post here.
    dev stream for the decibel resprite scheduled for 3p MDT here. “

    30/10: “when u try 2 make gaem but there r only bug
    lyk if u cry errytime”

    1/11: “we made a script to stress-test the ai and it found a bug in sucker punch that must've been there for like 5 years”
     
    5/11: “we made a script to stress-test the ai and it found a bug in sky drop that only exists because metronome rolled it
    when attempting to test and fix the above sky drop bug, another one another two sky drop bugs were discovered.
    i hate this game”
     
    6/11: “ 🅱️indra”

    12/11: “shuffled the move tutor moves a lil. should be appreciated.”

    14/11: “a Handy info graphic about our bug fixing process “

     

    15/11:  

     

    20/11: “testing:”

     
     
    4/12: “we're gonna go ahead and shut off bug reports from e18. not that we're quite done yet, but like...
    it's just not very helpful anymore with how much has changed.”
     
    14/12: “loose ends are like hydras, you tie one up and then there's two more.”
     
    17/12: “hi its cass sneaking into ame's sidebar
    so you know that giant animation file that we have
    i made it smaller
    it's going to break for everyone who tries to borrow our anims....... so expect a post about how to fix that after e19's out
    but it means the game loads a lot faster now!
    uses a lot less ram too.
    we love to see it. “

    21/12:

    “if anyone finds a ridiculous EXP Candy in very early game it's because i keep forgetting that "XL" doesn't stand for "Extra Little"
     

    ##2022##
     
     
    1/1: “#################### (100%)
    happy new year everyone!!!!”
     
    3/1: testing has begun
     
     

    9/1: “i hope everyone appreciates the 1000 new switches that we've added this episode”

    14/1:


     
    16/1: “

    now kiss  

    bonus joke
     
    e19 features evil character:

     
     
    19/1: “i've decided to overhaul the field effect code and lemme tell you it's beautiful”

    20/1: “yo i'm gonna unbackwards my hashes”

    22/1: “so i unbackwards'd my hashes
    but i have since learned that there is, sometimes, a time for a backwards hash.
    we consider this character development.
    (this is cass btw i realize that both ame and i talk here and it's sometimes unclear who's who)

    23/1: “work up OP”

    27/1: “for the record i do not support this but i am being held at gun point
    please send help
    my captors have a hydreigon”


     
    30/1: "about 8 million of the 11.5 million battles for the ai fights post are done!"

    6/2: "oh btw alpha started like four days ago"

    9/2: "haha fernip send tweet"


     
    20/2: "multi-supervised testing (part 2 of 3 for alpha) has begun"

    20/2 again: "🅱️indra, my 🅱️eloved"
     
    2/3: "cass's development cycle:
    "fuck i hate this"
    *furious coding
    *sees other part of the code
    "fuck i hate this"
    *abandons previous project
    *furious coding
    repeat"
     
    2/3: kenan kill count: 18

    11/3: kenan kill count: 19

    14/3: kenan kill count: 21

    17/3: zoroark gottem count: infinity
     

     
     
    31/3: "Online play will be temporarily disabled in the near future while we update the version and workshop some components of it. Thanks for understanding. "
     
    15/4: "clear up your weekend"
     
    (18/4 I joined the team to fix like 5 bugs woo)
     
    24/4: "long live sidebar"


     
    10/5: "long live sidebar"
    says sidebar, having received no attention in two weeks
     
    30/5: filing for divorce with essentials but it's amicable.

    ##Present Day##
     
    And at last.... I am finally free from this prison of my own creation. Hey fun fact, did you know that when copying from word into the site editor, it apparently eats all text formatting like bold/italics or hyperlinks so you have to manually re-add them, seemingly yeets some linebreaks randomly, and won't copy&paste Emoji or Images so the former has to be added one by one with the editers searchbox for them, and the latter had to be re-screenshotted with snipping tool to upload? At least there apparently isn't a character limit here, or it's unreasonably large enough to handle this. Ame I'm sorry for any time I made fun of you for accidentally posting a half-finished devblog post and then hiding it and suggested copying from another document... I didn't know..... though I still didn't accidentally post this til done
    (also I considered linking all the actual big devblog posts that came out in their appropriate timeline positions here, but you can just go look at all those yourself)

    In all seriousness though I did actually get a fair amount of enjoyment from creating this and looking back on @Amethyst&@andracass's stream of consciousness, I hope some of you did too. 
    What a journey this has all been - I'm glad I got to share it with you. ily!
     
    (bonus pic is my upload section for this post after the almost two hours putting this all together. I think the very first image may have been directed at me across time and space all along)
     

    andracass
    hi kids!
    so after talking about things last night, i realized that there were some changes that i could make to the anim file easily that will make things slightly better for everyone while we work on the Way Better stuff. it cuts half a second off the load time! so that's pretty neat.
     
    but also
    yo what the FUCK was that post yesterday????
    🤮
    who reads this shit???
     
    there's a distinct lack of quality here and someone's got to do something about it.
    so without further ado, welcome to today's episode of 
    how not to write a devblog post
    now, out of respect for their privacy, i will not refer to the offending poster by name. they might not even be real. you never know.
     
    exhibit A:

    so right off the bat, i don't know who the fuck this person thinks they are, but what kind of asshole just refuses to use capital letters???
    do you have an allergy????
    are so you full of shit that it's interfering with your optical nerves and you are unable to see the shift key?
    while we're here, this paragraph (if you can call it that) is entirely incoherent. "blowing up bullshit"? the fuck does that even mean?
    if you have a backlog of bullshit, find a bathroom.
     
    exhibit B:

    this is actually entirely accurate. no problems here. post was shit.
     
    exhibit C:
    let's talk about that first section.
    there's a severely unhealthy mixture of technical explanation mixed in with meaningless bullshit. how is this supposed to mean anything for anyone?
    now, to be fair, the subject matter itself is about borderline meaningful bullshit. perhaps the post composition is actually an artistic reference to this, in which: kudos.
    but i don't think so.
    what the fuck does that even mean???
     
    exhibit D:

    bro what
    sometimes people are just pointless assholes in the internet! get over yourself! in what world does this wind up in a devblog post?
     
    exhibit E:

    this paragraph false starts twice and fails to even explain anything when it finally settles on a subject. what's a symbol? what's a hash? how does this even pertain to the screenshot you just posted? these are basic questions!

    you're not going to be making shit easier for anyone if you explain it like this.
     
    now the next bit of this post is actually fine. it's probably the most coherent part of the whole thing. this bit feels like i'm not actively losing brain cells while reading it.
     
    but, uh oh!
    exhibit F:

    grammar fail!!!!! can i get an XD in the comments???? SO embarrassing. frankly i should probably dm the author to inform them that they don't know what words are.
     
    the rest of the post is honestly a lot cleaner. it's practically like it was written by an entirely different person!
    it's just too bad that person didn't write the whole thing to begin with.
     
    so today we're going to have a REAL devblog post. a good one. strong. professional. informative.
    today i'm going to tell you about ✨data structures✨
    this is a tale of Ruby and Marshal.
    obviously ruby is the programming language. marshal is the method of loading/saving ruby objects. 
    the animations file is 14.1 11.3MB. it consists of 1400 PBAnimation objects (as of right now). there are a lot of attributes that belong to each object, but if we're talking about data size, the attributes account for ~750KB of the file size.
    the true villains of this story are the cell arrays.
     
    so, it's hard to precisely gauge exactly how "large" a specific value is in ruby. data types have specific sizes: in, say, c++ a number between 0-255 is a byte, 256-65535 is two bytes, and those sizes are specifically defined.
    with ruby it's harder to know exactly what data type a number is, or how large an object is. so you just kind of have to guess.
     
    which brings me to bullshit.

    let's talk hawt features. hitting f6 lets us run arbitrary code. it's great for running little snippets of code like this. we can print out data to the console, rescue people out of emergencies, run single functions from the scripts...
    and, in this case, dump bullshit.
    this line of code has Ruby tell Marshal to make a file that just has a zero in it.
    so if i want to see how large something is, i can just dump it and take a look!

    that 0 is four bytes.
    neat!
    if you're a compy nerd, you can literally just use the f6 menu to see how big...anything is.
    how big's a pokemon? just save it and find out. how big's a battle? you can just save that too! the possibilities are endless.
    so i did some experimenting. the bulk of the animation file is nested arrays filled with nils and numbers, with some other objects strewn throughout. 
    one such object is the animation timing:


    so a raw timing is 257 bytes.
    i mentioned earlier that you don't necessarily know how large an object really is on observation in ruby. the 0 that i dumped earlier isn't actually four bytes itself- the file that gets dumped includes some overhead that ruby uses to process the object. since the animation timing is a non-standard object, the information about what that object is has to be marshaled out with the object itself.
    so let's say i marshal out five of them.

    the know-it-alls in the peanut gallery are screaming out to their monitors that this is NOT 5*257. and that's true. ruby lied to us :(
    so in reality a raw timing object is 100 bytes.
    now, 100 bytes is nothing. it takes 100 bytes to display a line of text. it probably takes 100 bytes to eat a pizza. 
    100 bytes matters here because we have 1400 animations with (a rough estimate of), say, 5 timings each.
    that's 750KB.
    (i'm actually researching this stuff as i write this post- i hadn't tried dumping multiple objects to find the size of a single one until just now.
    but it turns out this accounts for almost all of the overhead i mentioned a little bit ago!
    so that's kind of weird.)
     
    now, the main reason i care about this is because of how it affects performance. (i'm sure the people with shit internet connections wouldn't mind some size reductions either.) i have to open and close this game a lot and it has to reload everything in the cache each time you do that. that 14MB animation file takes 3 seconds to load on my computer.
    that's a really long time. ...granted, i'm horribly impatient- the last thing that i want to do while i'm testing something is sit and wait.
    but i also have a beefy compy.
    my processor, according to an arbitrary benchmark, gets a score of about 3200.
    let's take a shit computer.
    like this guy:

    this is probably the minimum spec computer you'd need in order to run the game. coincidentally, it's also one of the most common desktop computers, so it's more likely that at some point you've seen or used one of these.
    this compy, according to that same arbitrary benchmark, gets a score of about 700.
    i'm ~4.5x faster than it is.
    so if it takes me 3 seconds to load the animation file, it takes this computer almost fourteen to load it.
    it'd be worse if you're still using the rxmp engine! 
    (again, dear god, if you are a fan game and you're using our animations via the old method, my sense of justice compels me to fix that. god, imagine spending one minute each turn of a battle loading the animation file.)
    coincidentally the math on this works out great: it takes that poor crap computer about 1 second to marshal 1MB of data. cutting the size of a timing in half would mean cutting load times by half a second. that's not bad! 
     
    but the timings aren't the biggest contributor to the filesize.
    that honor goes to the cel arrays.
    every cel, every frame, has an array of data associated with it. that array has 27 elements, each containing a number between 0 and 255. i'm pretty sure that, if you count every cel-frame, you'll have a total number of arrays around 240,000.
    so let's call up marshal.

    marshal is screaming.

    yikes!
    so the current system, by necessity, has this ridiculously large file size associated with it.
    what can we do about that?
     
    1. get rid of the garbage values
    someone (not me, ofc) mentioned last post that 7 of the values in each of the 240,000 arrays are completely unused. that knocks us down from 6.5 million array entries to 5 million. that shaves almost 25% of the filesize right off the bat. it's also practically free- and by practically free, i mean that this change will be out next patch and it cuts 2.8MB off the file. that's three seconds of life that the person with the shitty shitty computer gets back!
    2. maybe don't use numbers for everything
    every parameter in the array is defined as a number, even if it's just to indicate whether a value is true or false. sure, a number is only a few bytes, but a few bytes millions of times matters!

    so let's try this out.

    that's half the size! crazy.
    ...now obviously i can't just do this. most of the parameters need to be more than just a boolean. 
    but the parameters that this can be done for get half their filesize shaved off! it's like shaving another 1.5 values from that array.
    3. symbols are literally magic...
    now, ordinarily, i would try and explain symbols to you right now.
    but that's actually really difficult. integers are easy to understand. strings are concrete.
    symbols are abstract. they're borderline magic. when you use a symbol, you are willing something into existence. want something to be a :THING? just call it a :THING! that :THING will always be the exact same :THING across anything that you do in ruby. let's say that later you need some :STUFF. just call it some :STUFF! again, anything you describe as :STUFF will always be the same :STUFF no matter where in the scripts you talk about :STUFF.
    so let's slap some in that array.


    for the size cost of a number, you can save a :THING!
    and unlike strings, the length of the :THING doesn't matter.
    *googles for good copypasta

    why not?

    same size.
    so symbols are great for defining :THINGs.
    hashes are where they really shine.
    you can think of a hash like an array that can use anything as an index. like, say, a symbol!
    take, for example, this bit of code:

    celhash is my hash, :FOCUS/:PRIORITY is my index (the technical term is "key"), and then :BACK/:FRONT/:BEHIND/etc.... are my symbols. instead of using a number to define a state, i just.... define the state. (this is done a LOT in the PBS rewrites. it's basically the foundational idea behind them. the rewrite just has a ton of symbols that point at each other.)
    now, turning everything into a hash isn't just what makes things smaller.
    hashing an array will have the opposite effect:

    (yikes!)
    the advantage of a hash is that i get to leave a ton of things blank.
    3.5 ...and hashes let you do sorcery
    you can search for anything in a hash.
    so what happens if you search for something that isn't there?
    the hash will return a default value.
    default values are just
    *chef's kiss
    most of those array elements in each cel-frame are unused. we're not using every parameter at the same time, so those unused parameters just have useless garbage data sitting in them.
    hashes let me ignore those.
    so let's say that i set a default value of 100 for my zoom. any time that my zoom value on a cel-frame is 100, i don't have to record it.
    and that means that i don't have to record... well, most of the array values.
    and that's the secret of how i pulled off doing this:

    *chef's kiss
    delicioso.
     
    4. what does the future hold?
    i've mentioned that every cel-frame has those same 27 parameters regardless of what the cel is actually doing, but one other major disadvantage of the current system is it has the same parameters regardless of what the cell is doing.
    if a cell is sitting still and doing nothing for 60 frames, that nothing will be copied over to each one of the 60 frames.
    also, the user and target both count as cels.
    i had originally made an edit to the file that would use the previous cel as a reference under certain circumstances, but we ran into some problems with partner animations not working and it had to be scrapped. since we're making larger backend changes to the system, i'm inclined to revisit it- it cut a solid third off the animation file when i had tried it before.
    if we managed to squish this file down to 5MB, i could sleep well at night knowing that shitty compy guy gets a whole 9 seconds of his life back each time he opens the game.
     
    5. hi cass i'm one of the people who uses your animations. is this going to break everything for me?
    wow look at me breaking structural rules to turn this into a Q&A! so meta.
    so, yes.
    right now we're only planning to release bullet point 1. that'll cause some crashes if you don't do anything else and just drop the animation file in.
    there'll be some code that you can copy in to fix everything, though. replace class AnimFrame with this:
    class AnimFrame     X          = 0     Y          = 1     ZOOMX      = 2     ANGLE      = 3     MIRROR     = 4      BLENDTYPE  = 5     PATTERN    = 6     OPACITY    = 7     ZOOMY      = 8     COLORRED   = 9     COLORGREEN = 10     COLORBLUE  = 11     COLORALPHA = 12     TONERED    = 13     TONEGREEN  = 14     TONEBLUE   = 15     TONEGRAY   = 16     LOCKED     = 17     PRIORITY   = 18     FOCUS      = 19 end  
    and then delete these lines:

    bam! your animation loading will suck slightly less ass.
     
    once we keep going, though, i have no idea what will happen. i'm hoping it'll still be pretty easy to change things- the animation code is almost entirely unchanged between essentials versions, so you might be able to drag and drop our code into your game and it'll just work.
    hard to know for sure.
     
     
    see, now this was a post. that fucker from yesterday is so getting fired.

    andracass
    hi! i bet some of you were expecting this dev blog to never get used again.
    and that's fair.
    we're, like, half a step away from the "final" release. community beta has gone shockingly well. it has blown everyone's expectations out of the water devside. gamebreaking bugs have been few and far between. the site didn't crash (though it came close!). the discord server somehow managed to stay fairly tame despite the massive amounts of hype. (which, if you want to drop some nice words to the devs, check out this thread!)
    we're all like what????
    so the next step between now and the actual release is to just, like, say that one of the patches is the final release.
    there's not really a big process that determines when we're there- eventually we'll hit a patch that seems stable and be like "yeah, okay, i think we can be done with this."
     
    and that means i can get back to work
    one of the downsides of needing to release something stable is that i can't just run around and break whatever shit i want. so over the past few months i've built up a backlog of bullshit that i'm just absolutely sick of, and now i get to blow all of it up!
     
    hype.
     
    so who wants a coding post.
    (quick disclaimer: this post is kind of a disjointed mess- i got interrupted by some moderation stuff and it definitely threw me off a bit. sorry!)
     
    the pbs is garbage and i hate it
    90% of people who know what a pbs is only know because they're asking for debug.
    but did you know that the pbs actually does something?
    the pbs is where all of the game-related data is held. it's basically a bunch of text files that have information that, say, defines what a move is, or what a pokemon is, or what teams different trainers have.
    it is organized like actual ass garbage.
    here's what the moves list looks like:

    the fuck are any of those numbers. you need a manual for this shit.
    tm learnsets are in here too! and they look like this:

    ughhhhhhh it's so gross. good luck finding out if someone's missing from that.
    the pbs is a horrible mess to work with.
     
    - legally required disclosure notice -
    my lawyers have advised me to throw in this disclaimer because otherwise i risk being cancelled by relic castle again.
    this is not what the updated version of essentials uses. it's laid out a little bit more nicely. it's not what we work with because we can't get the newer version.
    all characters in this post are fictional. any relation to persons, living, dead, or not yet in existence, is entirely coincidental.
    - legally required disclosure notice -
     
    so i have made some ✨changes✨ and i think they're pretty neat so i'm going to tell you about them.
    here's what the moves pbs looks like now:

    omg check that hawt code out.
    i feel like every once in a while i find out some cool new coding trick and feel the need to use it everywhere. today that cool trick is a symbol! and also hashes.
    obviously the primary advantage of this layout is that it's way easier to understand and edit. the additional bonus is that i can change anything about this move whenever i want, however i want.
    all i have to do is, say, add this:

    bam. all i gotta do is slip a line into the code that checks if the move i'm using instantly wins the game, and it just works.
    i can do that with anything!
    anywhere!
    it's easy. simple. clean.
    even better: i don't have to compile this shit! ever! i can just load it in the game straight from the text file and the shit just works. it's beautiful.
     
    it's also not quite ready for primetime yet. i'm mentioning it now because i'm hyped about it and i think it's going to make things a lot easier for future devs.
     
    the main reason for this post is:
    the animation editor is garbage and i hate it
    right off the bat, let's state some facts.
    the reborn animations are the best in the business.
    the animation squad has put a stupid amount of effort into making some high-quality animations for every move in the game and mon transformations and field changes and probably even more shit than that??? if you even do a cursory skimming of other fangames, you'll see the phrase "uses the reborn battle animations" all over the place.
    go appreciate your friendly local animator. i'll even call them in here to make it easy: @smeargletail, @Voctrode, @VulpesDraconis, @crimsoncrim (on occasion!)
     
    and if you're not appreciating them for the visual quality, appreciate them for suffering through the animation editor.
    the animation editor is ass.
     
    the animation editor is ass
    this gets two headings because i really can't overstate what a horrible experience using the animation editor is. longtime readers of my posts will recall that i originally started as an animator!
    i made one animation.
    before mkxp the animation editor was, in my opinion, borderline unusable. people with more patience than me may disagree. i think they're wrong. basic changes took forever to do because you had to click and hold an arrow to make them happen and the rmxp engine stuttered between every single increment.
    the people who got pinged a little earlier have suffered immensely for their art.
     
    in particular, this is a callout post for vulpes.
    one day, back in--
    holy shit this only happened in january what the actual fuck
    one day, back in january, i had made some changes to try and reduce the file size of the animations. (more on this in a bit!) vulpes popped in one day and was like "hey! this thing isn't working right. i took a look at the code and think this might be the problem."
    she nailed the problem in one try. perry and i immediately indicted her into the script team. since then she's been doing a shitload of work to make the animation editor less ass.
     
    there's third reasons for this callout post.
    first, vulpes is doing some great work and we are very proud.
    second, the animation editor is so ass that it literally led two people to become scripters.
    third, this incident happened in the first place because i desperate to do something about the giant-ass animation file.
     
    the animation data structure is ass
    reborn first started the project to redo all of the animations in e16. the base essentials animations were ass and we* wanted them to be better.
    *we is ame- i didn't exist at this point, and one of the animators on the team, MDE, has since left the community
    the base essentials animation file supplied in v17 was about 1MB.
    our animation file in e16 was almost 6MB.
     
    as of right now, in e19, it is 14.1MB.
     
    one of my original optimizations was that i set the game up to only load the animation file once at the start of the game. prior to that, it loaded the animation file every time you needed an animation. the game would hang for a second every time you used a move. it was a bad system back in e18. it would be crippling in e19. i have a top of the line computer, and it still takes 3 seconds to load the animation file.
    i shudder to think about whether or not other fangames still use our animations with the old system.
     
    i posted a disclaimer earlier absolving essentials of responsibility for the PBS edits. there is no disclaimer here. the base system still works like this. if i don't get cancelled before i finish my modifications, i'm going to push for this to get put into the base engine. we're kind of doing our own thing nowadays, but this is self contained enough that i think it can still be passed off to other people easily.
     
    make your animations file half the size with one easy trick! (relic castle admins HATE this)
    imagine 1400 boxes. they each have their own labels and information written on them.
    imagine that inside each of those boxes are another 15 boxes. and then, finally, inside each of those boxes are another 20 boxes.
    that's the animation data structure.
    at its core, the animation file is a triple nested array. you have the individual animations. then you have the individual frames of the animations. then you have the individual cells.
    there's something like 140,000 of them.
    each of those arrays has a specific prescribed layout. it looks something like this:
    this is everything you can do a sprite in the animation editor. all the effects, colors, blending, etc. 
    the first thing you will notice, if you are able to count, is that slots 9 and 10 are just straight up missing. that's wasted space. not good.
    a number of these parameters are never used. FLASH in particular uses four slots in this array. all of those slots are wasted. VISIBLE isn't used. that's a wasted slot.
    you have a 27 element array and 7 of those elements are wasted.
    of the remaining 20, not every element is used on every sprite. most sprites just need to exist in a place with no special effects. those sprites will use the same amount of space as a stretched sprite that's tinted blue and zoomed in.
    the fundamental cell data structure is very ineffecient.
    so i ripped it out and replaced it with a hash.

    here's a nice before/after of my lazy implementation of it. i cut out the 7 unused elements. i set some default values for every parameter and excluded things that matched the default. i changed some values to more efficient data types.
    it's almost half the size it used to be.
     
     
    okay, so this post was a minor disaster.
    if people are really really curious about how big of a deal each of these changes are, i can make a follow up post!
    but if nothing else, now you know the posts aren't over. ame's moving on to starlight, but a lot of the squad is still involved with rejuv and/or deso.
    and i've still got plenty of shit in the scripts to be mad at.

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • i know i'm, like, criminally bad at updating the sidebar

    but it's just the scripts!

    i never know what's worth mentioning.

    anyway we might redo the battle system.

    (6/15)

     

     

    SPOILER_shaving_luna_head.png

  • 16-4.png
    16-5.png
    16-6.png
    16-7.png
    16-8.png
    16-11.png
    16-12.png

×
×
  • Create New...