Login

Create Your Frisk

Create Your Frisk
is FOSS
inspired by Undertale. It's a continuation of Unitale.

These programs were created as engines to make Undertale fan games in, mainly battles.
Unitale was being developed by its author, lvk, while he was in college and working a job, so the project stalled development.
Create Your Frisk is a fork of Unitale that continued development under RhenaudTheLukark (or Rhen for short) for many years.

And I worked on it. I was a developer of Create Your Frisk, just as much as Rhen.
I'm writing this page to document all my contributions to CYF and its community.

My contributions

I started my work on Create Your Frisk in late 2017. Technically, this is not long after our personality split, so I, Eir, was the one involved.
My work went on from October of 2017 to July of 2020, during which time I helped release 6 versions of CYF.

My involvement with the engine started as a moderate interest, after seeing what Rhen had done to improve things, and wanting to help my friend. But over time, I became dedicated to developing CYF, obligated even.

I also have an older webpage with downloadable content I made for CYF. Mostly usable libraries, but also Just a Regular Poseur Encounter, the battle I made for a contest between me and some friends in the CYF circle.

In the community

Working on CYF wasn't just about the code. It also involved managing the community, something I did just as meticulously.
Throughout my time in Unitale/CYF, I answered every single question on the subreddit and the discord server. I made absolutely sure to be the first to answer to prevent misinformation from others trying to help. It was an obsession that absolutely exhausted me, but I did it at the same time as developing CYF, which was already a big undertaking.

 

At one point, I was made a moderator of the Unitale/CYF subreddit. I used my time to create many posts, resources, and wiki pages to guide new users. I also made the new look when reddit rolled out "new reddit".
Here is a stickied post I made as a kind of "landing page" for the subreddit, with quick links to helpful information and popular mods.
I wrote some extensive subreddit wiki pages, very detailed, but despite my efforts, people kept finding the outdated default wiki page instead.
One of the biggest obstacles was improving the onboarding process for new users. What I just shared above was really meant to help, but still, people came to the discord or subreddit with outdated versions they got from google, or asking where to download.
I also worked with others to make a new posting rule system for the subreddit, meant to clean up the clutter from 95% of posts being "how do I do x?". Whether it worked, and whether people found it fair, is subjective.

Toward the end of my time on CYF, the Discord server underwent some big changes. I and a few friends became moderators.
It goes without saying that moderating a discord server is an undertaking. You have to be able to handle a lot of people, and both enforce rules and be compassionate. It was a lot to deal with on top of working on CYF, helping all users I could, and other things in my life. At least this wasn't too bad, as most of the moderation was people posting in the wrong channel by mistake. There were a few bad actors, but they were rare.

About the process

Usually, Rhen would be the decision-maker on approving changes and deciding what needs fixing most. We both did a lot of in-depth programming work, though with all the extra free time I had compared to him, I poured hundreds of hours into playtesting before publishing a commit or release, and did many less-obvious changes and fixes, the biggest of which is upkeeping the documentation. I also added several big-name features, like the new mod selection UI, sprite masking, and shaders.
Rhen always preferred changes be put on the "feature" branch on GitHub. He would only make commits to "master" when they were for a full release of CYF.
I had my own fork of CYF, where I initially made my changes to be merged through pull requests. But later on, I was given write permission to the main CYF repo, and did my work there.

I would maintain a TODO file and a changelog text file, for each version. Sometimes it'd be on discord instead of a file. Rhen and I would sometimes swap the file back and forth, but I was the one to keep track of all the changes. In time, I became the one writing the changelogs - except the flavor text at the top, which is Rhen. We used to do voice calls and screen-sharing to work on CYF.

Also, the documentation really sucked. It worked well enough in Unitale when the project was still fairly small, but CYF ballooned to easily 3x as big as Unitale.
The documentation has always been raw HTML and CSS, written by hand, without the ability to reuse any content. Rhen understandably avoided the documentation, but it's extremely important it gets maintained.
So I maintained the documentation by hand the entire time, adding every new feature, documenting each change, and further improving the docs with type annotations, code examples and new feature indicators (which heavily relied on keeping track of the changes). Hell, I even wrote entirely new pages for some features, like an entire guide for shaders!

CYF has never had dedicated credits, so I was only credited via a single mention in each release change log. People in the community who knew me appreciated my work, but aside from that, Rhen took the credit as "the guy who made CYF".
Additionally, after CYF 0.6.3, Rhen used
squash commits
when merging CYF changes to the main branch, which hid most of my and others' work and attributed the changes to him.
As an example, here's Rhen's "CYF v0.6.4" commit, which only shows the changes, and not who made them. Here is the history leading up to the final commit of that version, hidden in another branch.

2017 is when I started work on CYF. I'd never used Unity, Git, or C# before, so I learned as I went.
My first pull request fixed a few camera-related bugs I noticed. I submitted a few more fullscreen-related pull requests. But behind the scenes, I was working hard on my own fork. These changes I made would later be included in version 0.6.2.

0.6.2 (2018)

Version 0.6.2 is the first version I worked on. It started my trend of adding a lot of features meant to make creating mods with CYF easier.
The biggest change I added to this version is the mod menu. I replaced the old scrollable list of text buttons, with a friendlier screen. Each mod has a title text and subtitle, Undertale font included, and each mod can provide a preview image, giving users some flair to use to decorate their creations.

I also put in some heavy work on the documentation. The documentation was built by hand, rather than generated, which caused huge issues. It meant someone had to upkeep the documentation manually. That someone was me. Every single variable and function in the documentation has a description, and now, they have color-coded type annotations. There aren't features like hyperlinking to different parts of the docs, but this was still a lot. Keep in mind that the docs have to be manually updated from now on, including all of my future versions.

All of the changes I made for CYF 0.6.2 were initially done on my own fork, and submitted with this pull request.

Complete patch notes + attribution

Who're you gonna QoL? CYF!

That's right, thanks to
@WD200019
and only a tiny bit to me, CYF is now cleaner than ever, with a brand new mod selection UI, and a TON of Quality of Life changes!
Because WD actually cares about making things easier while I don't! :D

Category Patch note Actual author Notes
Main changes and features
Important changes EXTREME performance increase!! CYF will no longer eat up all your memory when you play mods, and can run as smoothly as Unitale 0.2.1a!!! No more restarting CYF when it lags too much! Me
We've upgraded to Unity 2018.2.13f1, and with it comes better support for Mac and Linux!! Rhen
We have re-worked the main menu screens! The Mod Select screen now looks a lot nicer, it shows customizeable preview images of mods, it supports browsing with the keyboard, you can't accidentally wipe Real or AlMighty globals anymore, it remembers your most recently picked Mods and encounters...it's just so much nicer to work with! Me
This was one of my first real "big" changes to CYF. I remember being excited when Rhen told me he wanted my better mod menu in the project
Full-screen now works perfectly - it doesn't kick you out randomly anymore, F4 works for entering and exiting it, and on Windows, the game window no longer jumps around when you exit fullscreen! Me
Cleaned up the encounters included with the engine. Please copy the new Mods folder over your own if you're transferring mods from an older version, to replace the old engine-included mods. Then, you can proceed to delete the "Title" and "OverWorld Test" (not "@overworld Test") mods! Rhen
The documentation should now no longer have missing information or weird wording, and it now lists the Lua types for every variable and function! Me
Also, I made a font change button, but for some reason he's the one who committed it
New features

Animated sprites now support skipping forward or backward, speeding up or down, and pausing and resuming with sprite.currentframe, sprite.animationspeed and sprite.animationpaused

Me

New text command [alpha:xx] supports transparent text, and text objects can now be moved above or below each other with text.MoveAbove and text.MoveBelow

Me

The Inventory object now supports Inventory.AddItem, Inventory.RemoveItem and Inventory.GetType, allowing for very easy adding, removing, and even swapping of items

Me

Inventory.AddItem already existed, but was undocumented, so I added it to the docs

The Misc object now supports Misc.cameraX and cameraY, Misc.MoveCamera and MoveCameraTo and Misc.ResetCamera, which let you move the game camera outside of its normal 640x480 restraints!

Me
Major fixes and improvements
Engine Fixed enormous lag caused by old Mod scripts never being unloaded. Me
Same as the patch note in "Main changes and features"
Better support for Mac and Linux, including importing the Arial font, and upgrading to a better version of Unity. Both of us
Fixed F4 not exiting fullscreen mode, and fixed fullscreen mode exiting upon changing scenes. Me
Same as the patch note in "Main changes and features"
Fixed game window jumping to the top-left corner of the monitor when exiting fullscreen. (Unfortunately, this fix is Windows-only, as this is a workaround for a Unity bug) Me
Overworld Added support for slower framerates in the overworld. You should now move at the same speed no matter what! Also, the Player's walk animation and speed are now closer to Undertale's, so it won't feel really slow anymore.

Me

The framerate independent changes to the Overworld would later be reverted in CYF 0.6.4
Fixed a bug where dying in an encounter entered from the Overworld would crash your game with an error. Me
Bullets The pixel-perfect collision system has been MAJORLY optimized. It should now cause much less slowdown than it ever has before! Rhen
Minor fixes and improvements
Sprites Fixed a bug where using the ONESHOTEMPTY sprite animation mode created a 1x1 white pixel instead of an empty sprite, when an animation was done. Me
Text and Text Objects Fixed a bug where the second line of text and beyond would sometimes be positioned strangely. Text positioning is now 100% consistent! Me
Text objects should now properly allow using SetFont, color/color32, alpha/alpha32, SetEffect and SetVoice on the same frame the object is created. Me
Fixed a bug where [noskip] would not count on the very first frame a line of text was loaded, meaning that button mashing could skip text and potentially skip important text commands. Me
In fact, it was one of my first issues
Fixed [next] and [finished] not working in text objects. Rhen
Fixed Text.DestroyText not actually destroying text objects, instead leaving them lingering around infinitely. Me
The Misc Object Fixed the engine choosing the wrong window to act as the game window. You no longer have to restart your computer to fix this, only CYF!! Me
Misc.FullScreen is no longer read-only! Rhen
Lua Encounters Using State("NONE") now fully pauses the engine. Useful if you want to add a pause button, or just totally disable certain parts of the engine! It even works during waves! Me
This turned out to be a bad idea
For those who like to toy with the engine: encountertext can now be set without going through DEFENDING! Just use State("ACTIONSELECT"). Me
Replaced State's often-incorrect "The state X isn't a valid state" error message with a better, more descriptive one. Me
Fixed and cleaned the default encounters included with the engine, for good! Rhen
Same as the patch note in "Main changes and features"

0.6.2.1 (2018)

A week later, we put out version 0.6.2.1. It fixed a few bugs we accidentally introduced in 0.6.2, reverted a misguided change I'd made, and added a few new quality-of-life features.

Rhen and I worked together with Windblade-GR01, aka Gacel, through the CYF Discord server, to make the big feature of this version: "Blurless fullscreen". Some options and math were changed throughout CYF to improve the way the game looks on various monitor sizes and aspect ratios.

Complete patch notes + attribution

And another one! CYF is on fire recently with a lot of new versions!

Thanks to @WD200019 and @Windblade-GR01, we were able to stop CYF's bluriness when it's used on fullscreen! We continued adding more content to CYF to make it even easier to use for modders and players following the "Quality of Life" vibe of the last version, alongside some notable fixes.

But for now, drumroll, here's the new stuff:

Category Patch note Actual author Notes
Changes
Engine Added an option named "Blurless fullscreen"! It prevents CYF from displaying blurred sprites in fullscreen! (Done by @Windblade-GR01)
Windblade-GR01 on GitHub (10 commits + 2 merge commits)
Their own fork is now deleted.
You can now use both Alt+Enter and F4 for fullscreen! Me
Engine Added an Options sub-menu to replace the 4 buttons on the bottom of the mod select screen Me
All option preferences are now AlMighty Globals! Me
Player Player.Hurt(0, 0) can now stop the player's invincibility frames! Me
Sprite Objects

Sprite.SetAnimation now takes an optional third argument, that will let you avoid copying and pasting the same folder path for every sprite

Me

Sprite.currenttime and Sprite.totaltime have been added, and they function the same as NewAudio.GetPlayTime/NewAudio.SetPlayTime and NewAudio.GetTotalTime

Me
Mods arenasize can now be used to set the size of the arena during ENEMYDIALOGUE Me

NONE has become a state again. Now, to pause the engine, it's State("PAUSE")!

Me
Correcting my mistake from before
Fixes
Engine Fixed "Mods folder not found" for Mac! Me
Text Objects Fixed text object positions for good! No whammies this time! Me
Sprite Objects

Fixed Sprite.currentframe choosing the wrong frame index when being set

Me

Fixed using Sprite.animcomplete on an active sprite with the "ONESHOTEMPTY" loop mode causing the animation to advance twice in a frame

Me
Waves Fixed not being able to move the Player on the first frame of a wave Me
Overworld Fixed a major bug related to maps not being loaded properly Me

Create Your Kris (2019)

Toby Fox's other game Deltarune just released a chapter 1 demo in October of 2018. Rhen took the chance to recreate it in CYF, as a playable mod, called Create Your Kris, or CYK for short. (Get it?)

The idea is pretty simple. It's meant to be an editable engine "base", like Create Your Frisk is to Undertale, except with Deltarune. The fact it was made inside of CYF is pretty significant, as, although limitations breed creativity, it also led to a lot of hacks, workarounds, jank, and issues.

On top of handling CYF v0.6.2 and 0.6.2.1's releases and preparing for 0.6.2.2, I was helping Rhen create CYK. A large body of my work with CYK is the documentation, which is an edit of CYF's, and as I'd already been doing lots of heavy lifting on the docs, I had the right mindset and skills to do the same for CYK. Other than that, Rhen came to me a few times for code help, and used a few libraries I made. I'd contribute six pull requests to CYK (one, two, three, four, five, six), with the sixth one being this year.

Finally, there's a secret in CYK that replaces the characters, music and graphics with "shittier" versions as a joke. I had the idea that Kris's spare animation, where they point and hearts come out, should have them dress as Michael Jackson and play his "hoo!" sound effect. I made the sprite art for this animation, and it was included.

I didn't manage CYK like I did for CYF and its community, however. It had a unique position in the CYF circle, as something of a subcommunity. Not many used it, and Rhen rarely updated it, leaving it on its last version in a state with multiple bugs still open.

You might notice that on Create Your Kris's GitHub Page, there are credits, unlike CYF. When it first released, CYK's credits looked like this:

Create Your Kris would have never existed without the help of:

  • /u/DimitriB1 | DimitriB1#7677 for giving me some help with Kris' sprites and for giving me an arena library I was able to adapt to CYK!
  • /u/heartlessmushroom | heartlessmushroom#0194 for the Player name font, the magnificent Poseur animation and for the hours spent testing the engine!
  • /u/WD200019 | WD200019#8327 who helped me with the code when I needed help the most, for some scripts he gave me and Lua hacks we found together, and for the hours spent testing the engine!
  • Ally 🍦#1540 for the hours spent testing the engine!

In late 2021, Rhen expanded the credits. He had wanted to change the license used by CYK on its GitHub, and in order to do so, he needed permission from everyone who had worked on the project before. My condition was to be credited more accurately for everything I did. I still feel like if I hadn't done this, they wouldn't have been updated at all.

0.6.2.2 (2019)

Our next release was version 0.6.2.2, a few months later.

Version 0.6.2.2 focuses a lot on retrocompatibility mode, or retromode for short. It's a feature that's already existed in CYF for a long time, but I took the time to try to really make it work better. This option is meant to make mods playable in the original Unitale engine play the same in CYF. Ultimately, upkeeping retromode turned out to be a burden on CYF, and especially on me, and it contributed to the overall direction CYF headed in, being to always keep up support for older versions, and never make breaking changes. This severely limited CYF, and restricted it to an ever-growing list of things that can't be changed.

Complete patch notes + attribution

Happy 2019 everyone!

Today we're bringing you a late Christmas gift with a ton of bug fixes and some new features! Most of this release's work has been done by
@WD200019
, so please
don't forget to boop his nose to thank him for his devotion to the project!

Now comes the usual very long list of new features and bugfixes!
Sorry, we weren't able to fetch the list of bugs this time
, but we'll try again on the next release!

Category Patch note Actual author Notes
Bug Fixes
Engine Fixed fullscreen for Mac! Me
Fixed the Mods folder not working properly for Mac Me
Battle / Mods Fixed the hitbox debugger in fullscreen Me

Fixed SetButtonLayer not actually setting the layer of the buttons (lol)

Me

Fixed not being able to change the player's properties before EncounterStarting

Me
I'm not totally sure if this is the right commit, but I couldn't find any other commits that reference EncounterStarting
Moving Player.sprite will now update the Player's hitbox Me

Fixed an oddly specific error (from calling State("ITEMMENU") from a state in which the default text manager was inactive, like "DEFENDING" or "NONE")

Me
Text Commands Fixed a bug where having a "[" without a matching "]" would crash CYF Me

[w:#] no longer ignores [instant]

Me
Fixed a bug where setting
playerskipdocommmand
to true would completely disable text skipping
Me
Fixed an oversight involving strings such as "Hello [func:DEBUG,hi][noskip]" executing "[noskip]" instantly
Text Objects

Text.allLinesComplete no longer throws an error if the text object has been destroyed

Me
The Input Object

Fixed Input.MousePosX and Input.MousePosY being able to go past 640x480 in fullscreen

Me
Bullets Fixed projectile layers being almost completely broken (returning the wrong name for the default layer, "messing up" the names of projectile layers, not letting you move a bullet back to the default layer) Me

Fixed the player being able to call bullet.sprite.Remove() or bullet.sprite.Dust(..., true)

Rhen
Some optimizations to bullet hitboxes and calculations Rhen (one, two, three, four)
The Inventory Object

Fixed calling Inventory.AddCustomItems twice removing all items added the first time

Me

Fixed the error message for calling Inventory.SetInventory without calling Inventory.AddCustomItems first: it described the wrong problem

Me
Game Over screen Fixed the text in the Game Over screen being positioned incorrectly Me

Fixed a bug where using [func:x] in the Game Over screen would crash CYF

The Overworld Fixed some overworld functions crashing on call if used when entering a new map Rhen

Fixed General.GameOver crashing CYF instantly

Me

Fixed General.GameOver causing the player to mysteriously vanish

Fixed inconsistencies between the Overworld's playing music track and the game over track
Fixed a bug where pressing C to open the menu just before a map fades in will push you back to the previous map Me
Changes
Engine Added a "window scale" option for users with large monitors Me
Playing in Retrocompatibility mode will now enable the DOGTEST items for compatibility with Unitale mods Me
The Player's hp now acts like an integer in retromode,
so mods like Alphys NEO
don't set the player's HP to numbers like 16.00035
Me
Trying to move removed bullets in retromode no longer throws an error, as it "worked" in Unitale Me
Mod Select Screen You no longer have to restart CYF to update a mod's preview screen Me
The mod select screen now wraps going left and right Me
Rewrote some text in the options menu Me
Battles Fleeing now has a 50% chance to fail, as in Undertale Me

Added a new variable, fleesuccess, which allows you to force the player's attempts to flee to fail or succeed

Me
Arena

Added Arena.Hide() and Arena.Show(), which control the Arena's visibility, without actually removing it or its boundaries

Me
Text Commands

[speed:#] now works as intended, instead of typing N characters every 4 frames. See the documentation for details

Me

Made [instant] able to be stopped, at which point the text will continue typing

Me

Made [instant:allowcommand] work exactly the same as [instant], but without ignoring commands
(this is what the Docs have always said this should do, but it never has done this)

Made [instant:stop] cancel [instant] and [instant:allowcommand] and resume typing

Made [instant:stopall] cancel [instant], [instant:allowcommand] and Player skips, and resume typing

Text Objects

The first argument of Text.CreateText can now be a single string

Rhen

Removed Text.SetPivot, as it was found to not work

Me
The Overworld The UI will now automatically re-position itself to the top of the screen to avoid covering up the player (as it does in Undertale) Me

Added an optional argument to General.SetDialog and General.SetChoice, which lets you choose which side of the screen to have the text box on

Documentation

Fixed some misinformation about Player.Hurt, Audio.PlaySound, script.Call, the Game Events and Special Variables pages, and some of the Overworld pages

Me

That's it for now! See you in a few months! (lol)

0.6.3 (2019)

Version 0.6.3 was our next big release. This time, I wasn't credited by name at all, but Rhen uses the word "we" to refer to us as a team.

I should also clarify: by this time I was the one handling most of the patch notes. I kept meticulous track of every single addition, bug fix, and change, and organized the patch notes themselves. Rhen pretty much just wrote the little bit at the top of each release's notes, and copy-pasted the rest from me.

This version's big selling points were file I/O, written mostly by Rhen, and modifiable player stats and text object scaling, by me.

Complete patch notes + attribution

OwO What's this? A new CYF release? And it adds file manipulation?! Oh boy oh boy!

Yeah, basically we decided to trust the users a bit more and added a way for modders to manipulate files, as long as they are contained within your mod! Aren't we generous? :D

And that's not all we added! This release comes with a couple of changes that'll make everyone's life easier (or make some more stuff possible!), including text scaling, modifiable player stats or even...erm...I guess that's it for the VERY big changes!

As usual, we'll give you the full changelog since CYF v0.6.2.2 so you can see how much time and love we poured into this new version of Create Your Frisk! Cheers!

IMPORTANT NOTE: If you're upgrading from v0.6.2.2, please copy the new Default folder over your current one.

Scroll to the bottom for downloads.

Category Patch note Actual author
Major Changes
The Misc. Object

Added Misc.OSType to tell which OS the user is on

Rhen

Added Misc.OpenFile, which creates a new instance of The File Object (see below)

Rhen

Added Misc.FileExists to check if a file exists before reading from it

Me

Added Misc.ListDir which gives you the names of all files or folders in a given path

The File Object
Added the File object, which allows creating, reading from and writing to files!
Limited to ONLY your Mod folder
Can be found in "The Misc. Object" in the documentation
Rhen
Battles The hitbox debugger now only activates with "H" if the regular Debugger is already open (F9) Me

Added BattleDialogue as a shortcut to BattleDialog, so new users don't have to remember to use the "typo"

Me
The Overworld Added support for the Item Box menu from Undertale (see "Overworld - The Inventory Object") Rhen
Added this as an example event in the Overworld test map
Added Sprite Objects to the Overworld
Added Text Objects to the Overworld
The Player Object

Player.atk and Player.def can now be modified

Me

Player.ResetStats has been added, which resets the player's Max HP, ATK and/or DEF to their original values

Player.SetMaxHPShift now takes an optional argument to prevent any sound from playing

Me
The Sprite Object

Added sprite.xpivot and sprite.ypivot

Me
Text Objects

Added Text.Scale, xscale and yscale!

Me

Added 3 shortcut functions:

  • Text.SetTail --> Text.SetSpeechThingPositionAndSide
  • Text.SetWaitTime --> Text.SetAutoWaitTimeBetweenTexts
  • Text.Remove --> Text.DestroyText (we know you guys have been waiting for this one :P)

Me

Enemy Scripts

Added isactive to monster scripts, which tells you if a monster is active

Me

Removed the third argument in Move and MoveTo, as it was actually a leftover argument that did nothing

Me
Bug Fixes
Battles Fixed a memory leak related to waves. You should no longer have increased memory usage as more and more waves are played! Me
The debugger and bullet hitbox displays are now properly "attached" to the camera, and will always stay in the same place on-screen, even during screen shakes and when moving the camera manually Me ( one, two, three )
Added error messages for many operations that would normally give you a big scary "send this code to the developers" screen Me (one, two, three)

Fixed BattleDialog, encountertext, deathtext and Text Objects playing the text sound for the space character " "

Me
The Overworld

Fixed a bug where an encounter entered from the Overworld would always ignore unescape

Me
Enemies Fixed a totally-blank error message that showed when a monster script failed to load a sprite Me
Fixed enemy speech bubbles having incorrect sizes in their XML files, which broke automatic line breaks.
You can thank @CMD_God#0490 in the Discord server for this!

By elytrafae on GitHub, formerly known as CMD_God. Apparently done over the Discord server, then Rhen committed the files himself.

Here's the commit in question.

Fixed BindToArena doing nothing on encounter start

Me
The Bullet Object

Calling bullet.sprite.Remove will now call bullet.Remove instead of erroring

Me

Fixed being unable to call bullet.sprite.Dust

Fixed a bug where calling bullet.sprite.SetAnimation on a bullet might make it incorrectly scaled in future waves

Me

Bullet hitboxes now account for bullet.sprite.rotation and bullet.sprite.SetPivot properly, for both pixel-perfect and non-pixel-perfect bullets

Rhen
Fixed a pixel-perfect collision bug causing ppcollision hitboxes to be displaced on the first frame the bullet exists Me
Pixel-perfect collision detection no longer lags 1 frame behind where the bullet currently is
The Audio Object

Fixed the volume argument for Audio.PlaySound always being ignored

Me
The Player Object Fixed a bug where the player's hitbox would stay at the bottom-left corner of their image, when using an image bigger than 16x16 pixels Me

Fixed Player.SetMaxHPShift's third argument setting the player's max HP to weird values when Player.lv was > 1

I don't know. I can't find the change in question in the source code
The Inventory Object

Fixed a bug where calling Inventory.AddItem, rather than Inventory.SetInventory, would have the added items carry over to other mods

Me

Fixed Inventory.AddItem giving an incorrect error message if you haven't called Inventory.AddCustomItems first

Me
The Text Object

Fixed a major bug where [instant:stopall] and playerskipdocommand were completely ignored by text objects

Me
Fixed a rare bug where the auto-line breaking feature of text objects would start to chop off the last few characters of text Me
The Documentation Fixed some enormous misinformation about the pixel-perfect collision system, and re-wrote it to be understandable by everyone Me
Moonsharp

Made dofile give more precise errors

Rhen

0.6.4 (2019)

We released Version 0.6.4 at the end of the year. This is probably the biggest CYF update I've ever worked on. It had such a huge volume of improvements and changes that it took all year to make. It included a major revamp to the Overworld, with the goal being to make it finally, realistically usable for mod authors.
There were so many changes and additions this time, that we started separating them into collapsible lists on the github release notes.

The most important feature this update is sprite masks, essentially a tool mod authors can use to crop and "cut out" sprite images into the shapes of other images dynamically. Unitale/CYF and their implementation of "sprites" in the bigger context of Unity leave a lot to be desired, and offer very little control over things like this. This is normally something you'd do in Unity with a simple UI component or shader.

I went over CYF's Overworld with a fine-tooth comb, fixing and polishing everything I could. I changed an existing event, where an annoying dog from Undertale blocks your path, and players were meant to edit CYF's existing code to get around it, so it's now possible to pass the dog while playing casually.
Each of the 5 usable characters
has a unique interaction with the dog, the most elaborate of which is Frisk's, internally called the stare event, where they stare at the dog for a long time, and various cartoon-like skits play out to try to break the player's concentration. There's eight of these scenes in all, which we split between us. I made 5, and Rhen made 3.

Rhen did some important work on line breaking for CYF's text system. CYF doesn't use existing Unity text libraries. Instead, each letter is spawned as a game object that can be individually moved around (for text effects), but has to be placed programmatically. I did my best to start fixing letter placement for this version, but ultimately, Rhen did the rest.

Importantly, as of this version, my commits are extra-hidden on the CYF GitHub. They're only visible now on the "feature065" branch.
Rhen's "CYF v0.6.4" commit on the master branch appears as an independent commit with all our changes combined. This makes it unclear what commits are actually included and who made them.

Here's the first commit for this version, and here's the last one.

Complete patch notes + attribution

Hey, it's Christmas and I think y'all deserve a gift, so here it is!

You were waiting for masks and now they're IN! Have fun remaking your waves with them now lol

IMPORTANT NOTE: If you're upgrading from v0.6.3, please copy the new Default AND Mods folders over your current ones.

Also, text objects including the ones used by enemies when they speak may behave differently, so what used to fit on v0.6.3 may not in v0.6.4 because we fixed them a lot.

Scroll to the bottom for downloads.

The patch notes from here on out are very long, so I'll be using multiple tables. The Overworld gets its own entire table because it's so long.

Category Patch note Actual author Notes
Major Changes
The Sprite Object

Added a basic masking system through sprite.Mask, which forcefully masks or cookie-cuts a sprite's children based on one of 5 different modes

Me (one, two, three)
One of my additions I'm the most proud of

Added a third argument to CreateSprite for the purposes of choosing a sorted position in the given sprite layer

Me
This feature was already in the engine, but undocumented
The Player Object

Added the Game Event BeforeDeath(), which executes just as the Player is being killed, and allows you to execute code on the Player's death and even prevent the Game Over sequence from starting

Me (one, two, three)
This feature was already in the engine, but undocumented

Player.SetAttackAnim now can take a third argument, in the same manner as sprite.SetAnimation (contributed by @deonix37)

nanodesuologist on GitHub

Made Player.maxhp settable for ease of access compared to using Player.SetMaxHPShift

Me
The Input Object

Added Input.MouseScroll, which allows you to track the scroll wheel movement supplied by the user's mouse or trackpad

Me
The Text Object

Text.xscale/Text.yscale/Text.Scale now functions the same at ANY time, compared to v0.6.3!

Rhen

Text.SkipLine() now takes playerskipdocommand into account

Me
File Manipulation

Added Misc.DirExists, Misc.CreateDir, Misc.MoveDir and Misc.RemoveDir to the Misc object for folder manipulation

Me

Added function File.Move to the File object (contributed by @deonix37)

nanodesuologist on GitHub

Added File.Copy for copying files!

Me

Added File.filePath to get the full path to the opened file on the user's computer!

The File Object can now have the "b" attribute in its mode, which fetches a file's bytes rather than characters, and lets you read from and write to files with bytes and specific encodings Me

Added the property file.encoding, which lets you choose the file encoding method used to read from and write to files in byte mode

The Misc. Object

Added Misc.MonitorWidth and Misc.MonitorHeight, which always return the size of the user's monitor regardless of settings or fullscreen status

Me

Added Misc.SetWideFullscreen, which removes the left and right black pillars when in fullscreen if the player's aspect ratio is wider than 4:3. Can only be used in battles, and resolution resets on battle end.

Me
The Audio and NewAudio objects

Changed several Audio-related functions: they no longer display a warning if an audio file could not be loaded; instead, they return a boolean representing if the file was successfully loaded or not (meaning you can now test for if given audio files exist!)

  • Audio.LoadFile
  • Audio.PlaySound
  • NewAudio.PlayMusic
  • NewAudio.PlaySound
  • NewAudio.PlayVoice
Me
This turned out to be a bad idea

Added a second argument to NewAudio.GetAudioName which lets you get the actual name you'd enter into PlaySound/LoadFile and such, without the prefix

Me
The Script Object

Added Script.scriptname to the script object, for getting the name of a script object's source lua file

Me
This feature was already in the engine, but undocumented
Misc. Functions

SetAction now has an extra use while in the state ACTIONSELECT: manually moving the Player onto the 4 different buttons

Me
Monster Scripts

Added a special variable dialogueprefix to monster scripts, which can be used to prefix text to the beginning of all monster dialogue. Especially useful for text effects (contributed by @deonix37)

nanodesuologist on GitHub

Added defensemisstext and noattackmisstext, which when set, will change the damage text displayed when dealing no damage to the enemy and not pressing Z to attack the enemy, respectively (contributed by @Shiftenas)

Shiftenas on GitHub (6 commits)
Text Commands

Added [texteffect:x,intensity], which allows for multiple different text effects in the same line of text

Me
This feature was already in the engine, but undocumented

Added [mugshot:x] for use in the Overworld

Me
This feature was already in the engine, but undocumented

You may now use [charspacing:default] to reset a text manager's character spacing to its original value

Me
The Engine In the Lua folder, you now only require an "Encounters" folder to load your mod Me
Error messages are now automatically formatted to be more friendly to new users, pointing out which numbers are line numbers and which indicate characters on a line Me (one, two, three)
If your encounter text or battle dialog would go to 4 lines or longer, then the text will now move slightly upwards to compensate

Both of us

Rhen's initial commit, and my cleanup commit

The disclaimer screen will from now on always say the current version of CYF Me
The Documentation Added a new feature indicator that will appear when something has changed since the last version of CYF Me
Removed the "Create Your Frisk's new features" section and moved the items inside of it to more fitting sections Me
Replaced the "Wave scripts" page with "The Arena Object", and moved its singular function and variable to "Misc. Functions" and "Special Variables" where they belong
Removed Stinkies (bug fixes and minor improvements)
Engine Fix missing Lua folders causing the Error scene to be disabled completely Me (one, two, three, four)
Fixed a bug where entering fullscreen with a non-widescreen resolution (such as a square or portrait resolution) would incorrectly cut off the left and right sides of the screen Me
All textures now have mipmapping disabled. Up to now, sprites scaled down certain amounts would start to display with much less detail because of this Me (one, two)

Fixed the famous "fullscreen bug", where upon entering blurless fullscreen, the player was able to see past the intended 640x480 area if they entered fullscreen at the exact same time as loading a mod. This behavior got moved to the new function Misc.SetWideFullscreen

Me (one, two) (fixing the bug)
Me (moving it to a new feature)
Fixed the FPS counter becoming desynced from the debugger so at least one of the two would always be visible in some cases Me
Audio and Sounds Fixed a bug causing a + character anywhere in the full path to a mod's Audio or Sound files preventing said files from loading Me

Fixed a bug where loading a song using NewAudio.PlayMusic with loop as false would force the song to not loop whenever played with Audio.LoadFile

Me
Special Variables

Fixed a bug where the variable waves will be set to an empty table on encounter start and after a wave ends, and Wave is nil at encounter start. The intended behavior is that the variable Wave should be set to an empty table in these events, rather than waves.

Me
Sprites

Fixed sprite.Dust forcing sprite objects to move to (0.5, 0.5) pivot

Me
Bubbles

Changed the <wideness> tag in Speech Bubbles to <width> for clarity (but bubbles with only <wideness> set will still work the same)

Both of us

At first, I was making it
But then Rhen wanted to do it instead, so I prepared for him to take over
And here's his commit

Fixed Text Object speech bubbles having less width than the entered maximum text width Me
Fixed Text Object speech bubble tails having reversed directions when entering a number as opposed to a percentage
Fixed Text Object speech bubble tails having a 10-pixel offset on any given side

Both of us

Mine, and Rhen's

Fixed being unable to override the engine's dialogue bubbles in a mod in the same way you usually do for Default sprites Me
Functions & Events

OnHit and Update no longer execute in the reverse order as they did in v0.6.3

Me

No more error message when using CreateLayer if a sprite layer already exists

Me

Fixed calling State in DefenseEnding causing the new state to be entered twice

Me

Fix ability to enter "ACTMENU" with empty command list through State (contributed by @deonix37)

nanodesuologist on GitHub, then I cleaned it up later

Fixed errors in WaveEnding not providing a script name

Me (one, two, three)
The Player Object

Fixed Player.SetMaxHPShift behaving oddly towards the player's regular (yellow) hp

Me

Fixed a bug where reviving the player through BeforeDeath cancels invincibility frames they would have received

Me

Fixed a bug where setting the Player's hp to 0 or less in BeforeDeath would remove the player

Me
Text Managers (encounter text, battle dialogue, enemy speech bubbles, text objects and overworld dialogue) Fixed a bug where the second column of the ACT and ITEM menu had its x position altered by Misc object properties that move the camera Me (one, two)

Fixed using State with some states immediately in EncounterStarting sometimes leading to huge errors because the battle text manager didn't have a font set yet

Me

Fixed text effects in BattleDialog and encountertext persisting into other game states

Me

Fixed an infinite loop when placing a single [ at the end of any Text Object's text

Me
Text Managers ("autolinebreak" system) Text managers no longer allow 1 character past their width limit in certain conditions Me
Fixed an inconsistency where automatic line breaks would move an extra character down to the new line when it wasn't actually going past the width limit Me
Fixed multiple infinite loops possible through passing very long words or lines to various text managers

Both of us

Me (one, two) Rhen, then I cleaned up his (one, two)

Text Commands

Fixed a compatibility problem where [waitall:0] worked in Unitale but froze text completely in CYF

Me

Fixed a bug where using [health:kill] from BattleDialog would move the battle TextManager to a different scene entirely and have it be invisibly typing and producing sounds even in the mod selection screen

Me
Fixed an engine freeze when trying to skip text with certain arrangements of commands at the end Me

Fixed [lettereffect:shake] not returning letters to their starting positions after each frame, causing them to fly away infinitely

Me
Text Objects

Fixed a bug where giving a text object a sequence such as {"[instant]ONE", "[instant]TWO", "[instant]THREE"} would always instantly delete the text object when going to the next line

Me

Fixed a bug where using SetFont before SetText would ignore the SetFont call

Both of us

At first, I was making it: one, two
But then Rhen wanted to do it instead, so I undid my work
And here's his commit

Fixed a bug where using [func:x] to call SetPause on a text object would still show the next character, regardless of speed

Me

Text.SkipLine() now takes playerskipdocommand into account

Me
The Misc. Object Fixed a bug where, when ending a battle with a displaced camera, for 1 frame the camera will move back to (0, 0) which can cause unwanted graphical behavior Me
MoonSharp (Advanced Lua users only)

Fixed the second argument in error(message, level) being completely ignored. (ixjf on GitHub: One, Two, Three)

Merged by me (one, two, three) (original commits listed on the left)
I later updated it

Fixed a bug where using debug.getinfo(n, "l") - where n is any number - would still only return the line number as if n was 1

Me (one, two, three, four)

After 3 years, error messages now properly display the name of the erroring file instead of chunk_2

Me (one, two, three)

Fixed debug.getinfo(..., "S") not retrieving the name of the source. It can now properly retrieve the name of the current lua file

Me

Fixed a bug where some string library functions would match all characters that have the same lower byte as the character you are trying to match. (masaedw on GitHub)

Me

Category Patch note Actual author Notes
Major Changes (Overworld)
The Overworld Cleaned up and organized the Overworld. It's now in its best state ever since CYF's creation! Both of us, way too many commits

This description is pretty subjective, but it's true. Not only did we clean up all existing OW sprites and make them not blurry anymore, we rewrote the interactions with the existing testing dog, cleaned up some details and inconsistencies in other events, removed debug keys, added tons more functionality to the Overworld, added a way to see the template shop, and optimized everything.

I did most of the back-end work. Rhen did work on more front-end stuff like face sprites and their file paths, and adding several scenes to the "stare event", which was divided into 8 parts we split between us.

You no longer have to restart CYF completely when you get an error in the overworld! Pressing Escape will take you back to the initial disclaimer screen. Me
Changed the way you access a certain secret so you no longer have to edit code to reach it Me, but as part of something we were working on together

So, this was changed as part of our big redesign of the Overworld and its existing events.
We added a new secret involving interacting with the testing dog as different characters. One of them will cause the dog to disappear, opening the path.

This was my change, though, and I made the interaction that makes the dog disappear.

Added the utility functions Event.Exists, Event.GetSpeed, Event.isMoving and Event.isRotating

Both of us

Added General.EndDialog, which can be used from parallel process event functions to forcefully close the dialog box at any time

Me

Added Player.ResetMaxHP() which resets the player's max hp to what it would be based on their LV

Me

You can use a second argument in General.EnterShop() to skip the fading screen transition

Me

The second argument for General.SetBattle has been changed to a string. Use it to make the battle start animation play out normally, play out fast like Undyne's sequence in Undertale, or enter the battle instantly with no transition!

Me

You can use an argument in General.Save() to instantly save the game without the player's knowledge

Me
This feature was already in the engine, but undocumented

Added support for playerskipdocommand in both Event scripts and shop scripts

Me
Made CreateSprite, CreateText and CreateLayer all usable in the Overworld, exactly the same as in battles

Me

Misc.ResetCamera() resets the camera to the player's position in the Overworld instead of moving the camera to (0, 0)

Me
The game now keeps track of your play time in the overworld instead of always saying 0:00 Me (one, two, three)
Retrocompatibility mode now gets forcefully disabled whenever you enter the Overworld, to keep things compatible Me

Added a more descriptive and helpful save file tester for CYF:
If you have an incompatible Overworld save, you can now press "R" on the error screen to remove the save file without needing to remove it manually

Me (one, two)
Overworld Shops You can now set items to be marked as "SOLD OUT" after buying - there's an example of this in Examples 2/Lua/Shops/Dummy.lua. Rhen
You can now mark items as unsellable in the engine's internal item database by setting their sell price to 0.

Changed the way FailSell works, because it now has 2 error cases, not just one.

Both of us

Rhen's commit was first, then my commit followed

Made shops play the proper sound effects that play in Undertale for buying, selling, and failing to sell items. Rhen (one, two)
Bug Fixes (Overworld)
The Overworld Fixed error messages in the Overworld for good! Me (one, two, three, four)
Removed, edited and formatted some Overworld player names Me

Even though CreateSprite was said to be added to the Overworld in CYF v0.6.3, it actually wasn't. So it's been added. For real this time. ಠ_ಠ

Me
These relate to this commit made by Rhen in the previous version.

Even though CreateText was added to the Overworld, it created the text object in a completely different scene than it was supposed to, so it was never seen anyway. This has been fixed, too.

Me
Fixed the player's speed getting set to 2/3rds of the intended speed whenever using the character selector Me
Fixed the pivots of shared sprites between Overworld scenes and encounters being different depending on which occurence was seen first Me

Fixed General.Save()'s undocumented boolean argument freezing code execution if used

Me
Fixed auto-interacting with events on the same frame as closing a text box opened from the menu (such as the cell phone text) Me
Fixed SetDialog recognizing a Z press the same frame you start an event, which could combine with [instant] to skip a line immediately
Fixed being able to press Z to activate confirm events during map transitions and during the fade in while loading your save Me
Fixed a frame-perfect softlock if you open the menu the frame after closing it Me

Fixed the overworld text manager always keeping the last effect applied through [effect:x]. Now it resets automatically whenever using your menu, calling General.SetDialog, and calling General.SetChoice

Me

Fixed General.SetChoice changing the overworld text manager's character spacing even after the choice dialogue has ended

Me
Fixed soul in menu sometimes becoming black Me
Fixed invalid face sprites in SetDialog not showing an error
Fixed face sprites in the Overworld not resetting between lines of text Me
Fixed the Overworld camera always being 0.5 pixels off of where it should be vertically on big maps Me

Attached Debugger to Overworld camera when using Misc.cameraX, Misc.cameraY and related functions

Me
Fixed the Overworld game over text being at the wrong height Me

Fixed General.GameOver behaving strangely with no arguments

Fixed Player.SetHP(0) erroring instead of triggering game over

Fixed Player.GetMaxHP() returning only the max hp offset instead of the player's total max hp

Me

Fixed Player.SetMaxHP() being able to push the player into negative hp

Fixed the player's EXP resetting to their LV's minimum required EXP upon exiting a battle to the Overworld Me
Fixed the player's Max HP resetting to their LV's default Max HP when exiting a battle to the Overworld
Events can now only have one of each type of C# coroutine active, per type of coroutine. You can have both MoveToPoint and Rotate active at the same time, for instance, but only one of each at a time per event object that gets moved/rotated. Me

Fixed Event.Rotate always assuming its argument waitEnd was set to true, even if it was set to false

Me
Fixed events moving different distances based on your frame rate which could lead to them getting stuck in walls and the player. Me
Fixed Event objects only being able to execute one "auto" page per event Rhen
Fixed an invisible buildup of game objects every time you open the box UI Me
Un-blurred many things, including the item box menu background, most maps and overworld sprites, and "press z or enter" Me (one, two, three, four)
Fixed errors involving NewAudio channels in the overworld Me
Overworld Shops Fixed the Shop scene's music sometimes starting at the play time of the Overworld music Me
Fixed shops always displaying the Talk text for option 1, regardless of which option you pick Me

Fixed shops not having a debugger and, as such, making your FPS display stuck on screen if you press F9, and making DEBUG useless in Shops

Fixed Text Objects appearing in the wrong scene when created in Shops Me
Fixed being able to press C for an error message and weird behavior while exiting the shop
Fixed being able to mash Z during the fade-out transition to stack up lots of screen transition objects

0.6.5 (2020)

"Throwing off some shade" is the final version of CYF I worked on. I did most of the work in this release again. Rhen and I weren't talking during this time, so I implemented shaders and discord rich presence mostly alone, though two other users in the community (TheEternalShine and elytrafae) helped.
Because of the stress I was under during development, I made a mistake. One of the shader-related functions returns values in the wrong order.

Rhen's commits in this version include optimizing pixel-perfect bullet collision some more, organizing and adding comments to some engine code, writing the first version of the Discord object's documentation, fixing overworld events being intangible and not running their init functions first, and fixing some errors exclusive to standalone builds of CYF.

Here's the first commit for this version, and here's the last one.

Complete patch notes + attribution

So I heard people around these parts have been waiting to use shaders and stuff in CYF. It's a thing many people asked for for a very long time now, but it's something we can't really add easily in a Unity project... ...nah, just joking. Give a huge thanks to @TheEternalShine and @WD200019 for their hard work!

IMPORTANT NOTE: If you're upgrading from v0.6.4, please copy the new Default AND Mods folders over your current ones.

Scroll to the bottom for downloads.

Category Patch note Actual author Notes
Major Changes
Shaders The big new feature of this version is shaders! You can use shaders created in Unity ShaderLab and apply them to any sprite object in your mod, even the entire screen itself! Full details and explanation are in the documentation.
(thanks go to @TheEternalShine on GitHub/Discord for this feature!)

Me (one, two, three),

Rhen,

Me (one, two, three, four, five, six, seven)

TheEternalShine had helped over Discord, as a beta tester for shaders, and who helped write new ones and perfect the system. They didn't make any commits on the GitHub, but they were a big help.

The Discord Object Discord now has rich presence integration with CYF! This can be toggled in CYF's Options menu. It will display various things like what mod and encounter you are playing, how long you have been playing, as well as messages for in the Overworld. And the status properties can be modified with Lua!
(thanks go to CMD_God#0490 on Discord for this feature!)

elytrafae on GitHub (8 commits),

Rhen,

Me (one, two, three, four)

Engine All warning messages that you'd see in the debugger are now hidden by default in retrocompatibility mode, as they were in Unitale Me
Battle Scene Updated the calculation for if the player can successfully flee from battle. It now follows Undertale - 50% chance to flee on turn 1, + 10% for every turn spent in battle. This was verified accurate by decompiling Undertale's code Me
Misc. Functions

Added the new function EnableDebugger, which can be used to forcefully toggle the debugger's functionality, and force-hide it!

Me
The Player Object

Added a fourth argument to Player.Hurt, which can be used to disable sound created by the function. Useful for, say, starting the player's invincibility frames silently

Me (one, two)
The Text Object

Added Text.SetAnchor (NOT Pivot) for simpler use with parenting

Me

Added Text.GetLetters(), which generates a table full of sprite objects you can use to manipulate a text object's individual letters!

Me (one, two)

Text objects now call the new Game Event OnTextAdvance when advancing, if possible

Me
Game Events

The Game Event BeforeDamageValues now can have an argument which represents the amount of damage the enemy is about to take, but before the damage is applied, unlike in HandleAttack

Me

Added the Game Event OnTextAdvance, which is run whenever a text object advances its text, in whatever script it was created in

Me
Sprites & Layers

CreateLayer now returns a boolean representing whether the layer was created successfully, instead of erroring

Me
A previous commit of a similar description in 0.6.4 simply removed a specific error message in favor of CreateLayer failing silently, whereas this commit has it return a boolean representing if its use was successful
The Misc Object

Misc.WindowWidth and Misc.WindowHeight are no longer Windows-only! They can be used to calculate the amount of pixels that are shown inside CYF, including in wide fullscreen, as well as the level of scaling applied to CYF when being drawn to the window.

Me

The byte editing mode added in CYF v0.6.4 has been replaced with the most direct solution possible. File.encoding has been removed, as well as the "b" file opening mode. In its place are the new functions File.ReadBytes() and File.WriteBytes()!

Me
The Overworld

Added Map.GetName() to the Overworld, used for getting the name of the active map

Me This was actually a pretty important change for people who used the Overworld. It meant that multiple copies of an event could function differently when placed in different maps. Otherwise, there'd need to be a version of its script for each map.

Added Map.GetSaveName(mapName) to the Overworld, used for retrieving the save point text for a given map

Bug Fixes
Engine Fixed engine screen resolution being set to 1x1px fullscreen on first launch on Linux (#66) Me
Properly show an error screen for all XML errors while loading fonts. Up to now, if such an error were encountered, the engine would try to continue battle but with some assets mysteriously not loaded. Me
Fixed the EncounterStarting function still being called, even if an error occured in a monster script and the battle should have ended Me
Battle scene (tried to) Fix "FIGHT"/"ACT"/"ITEM"/"MERCY" buttons blurring on systems with older graphics cards Me

Fix object buildup when enemies die, or when calling sprite.Dust

Me
Fixed the chance for successfully fleeing a battle actually being 33% instead of 50% Me
Fixed bug: creating a projectile with the sprite name "Text" (case sensitive) would cause it to parent to the Debugger, and hide and show with it Me
Fixed dust particles (from sprite.Dust and killing enemies) staying on screen for 1 frame on battle end Me
Fixed the particles from sparing monsters not unloading Me
Monsters

If a monster's font variable points to an invalid font, the default monster font will now be used instead of erroring

Me
The Player Fixed the player being unable to level up naturally to LV 20 at a battle's end, even if they reached 99999 XP Me
You are now finally able to change the player's stats before EncounterStarting with no issues Me
Camera Movement Fixed the player being offset based on the camera's position whenever a game over screen starts (since CYF v0.6.2) Me

Fixed Misc.StopShake() having no effect (since CYF v0.6.4)

Me
Fixed the hitbox debugger displaying the player's hitbox in the wrong location if the camera is moved Me
Text Commands

Fixed the [health:x,y] text command not updating the health bar when used in battle

Me
Fix no error screen showing, leading to engine freezes and invisible monster text bubbles, when trying to load an invalid font in some cases Me

Fixed the [lettereffect] text command persisting after a line of text in the Overworld and in battle. It now resets to "none" after every line of text.

Me

Fixed [lettereffect] not applying to letters that get skipped over by the player, with the [instant] and [instant:allowcommand] commands, and text.SkipLine()

Me

Fixed [lettereffect]'s version of "twitch" taking an absurd 5 seconds (at minimum) for each letter to start twitching, per letter

Fixed [name] disappearing entirely instead of displaying the player's name as intended

Me
Text Objects

Fixed engine error when calling Text.SkipLine() if script did not contain playerskipdocommand = true (since CYF v0.6.4)

Me

Fixed engine error if using Text.GetTextWidth() while the text object is given characters not supported by the font file. Also applies to the automatic line break system in battles and in the Overworld (since CYF v0.6.4)

Me
Fixed 0.6.4's system of moving encountertext up 9 pixels continuing to apply in the states ENEMYSELECT, ITEMMENU and MERCYMENU (since CYF v0.6.4) Me

Fixed strange behavior involving Text.Remove() and a resulting engine error

Me

Fixed Text.layer throwing an engine error most of the time when read

The Inventory Object The Bisicle now properly gets replaced by a Unisicle on use (thanks go to @heartlessmushroom on Github/Discord for this fix!)

heartlessmushroom did write the fix. It was likely sent to me over Discord somewhere, then I committed it with credits to him, but I can't find the original message.

Here's the commit.

Fixed being able to exceed 8 items in the inventory if you actually give it 10 or more items, as opposed to just 9 Me
Sprite Masking

Fixed a bug where removing bullets could cause future bullets to be missing their mask components, and error when attempting to use bullet.sprite.Mask (since CYF v0.6.4)

Me

Fixed an error screen when trying to use Player.sprite.Mask (since CYF v0.6.4)

Me
The Overworld Fixed a 1-frame error that happens when an event stops moving during the same frame as the map changing (since CYF v0.6.4) Me

Fixed sprite.animationpaused, sprite.currentframe, sprite.currenttime, sprite.totaltime, and sprite.animationspeed being unusable on Overworld event sprites (since CYF v0.6.4)

Me
Fixed the player's saved play time carrying over to a new game when the player chooses "Reset" on the continue screen (since CYF v0.6.4) Me

Fixed the Overworld text box being potentially covered up by Screen.SetTone and similar functions, when selecting "Use" on an item in the inventory

Me
Fixed strange and buggy collision on the big snowy map in which the player could get stuck (demo) Me
Fixed a bug causing the Overworld's item box UI to display all of its sprites and text only within the 640x480 area at the bottom left corner of any map that has camera scrolling. Me

Fixed animated mugshots remaining active in future text boxes if they hadn't yet stopped their animation (such as by skipping the end of text with [next])

Me

Correctly reset [charspacing] and [linespacing] in the Overworld's text box after a sequence of dialogue/text boxes ends

Me
Fixed one empty game object at a time building up and staying active after every battle in the Overworld Me

Optimized the internal Lua code used by CYF events to remove a massive if/elseif block (99 conditions) scanned through EVERY time you run a function from a CYF overworld object (like General.Wait and Screen.DispImg)

Me

Quitting

As soon as CYF 0.6.5 was released, I quit.
I stepped down as moderator in all locations, left the discord server, and announced I'd stop helping Unitale/CYF users from then on.

It was a big move for me. I didn't give any indications leading up to my announcement. None of my friends knew either.
Why did I do it? It's multi-layered. The main reason cited in the post was my unhealthy addiction to proving code help to others. How I'd do it at the drop of a hat, neglecting myself.
But there's a bit more to it. I was under duress during the creation of CYF 0.6.5 specifically, and felt like I had no choice but to develop it. My announcement was me running as fast as I could once I was no longer needed. I won't elaborate on it here though - it's in the past.

The aftermath

Releasing myself from the obligations of developing CYF and helping all the users was a huge boon. I felt like I had so much more patience than before, and a lot more free time. By all accounts, CYF is an open-source project, and one could argue I could have left at any time, but it went deeper than that. There were social motivators involved - and now that I was free, it was like a big weight had been lifted from me.

The community continued to exist without me. I continued to receive reddit pms from strangers for years after, asking me for modding help in various contexts, or on one occassion, asking permission to release an edit of one of my libraries (my blue soul library, the most popular CYF thing I've made by far). Someone else did so without asking permission, and I commented that I wanted it removed. My days in CYF instilled a kind of protectiveness over my work, because of the endless theft that's taken place in this circle. And I'd been so burned out of offering modding help that I tried to push it all away, although I caved sometimes, or I'd still do it for discord friends.

I wasn't quite done with Undertale fan content, though. After CYF, I helped out some then-friends of mine on a project called Crossovertale. It had already been in loose development by one person for several years, using CYF as a base, but I took it the extra mile by making them their own engine based on CYF from almost the ground up. Go to the Crossovertale page for more.

5 votes
Have you ever moved?
60.0%
Yes