
FRAYMAKERS ASSIST MODS
February 2023 | Independent Project
Mods​ made for the 2D platform fighter game Fraymakers. These add Sora from Kingdom Hearts and Classic Guy from Spelunky into the game as assists using Fraymaker's custom content engine Fraytools.
​
I was the sole developer for this project. This involved both game design and programming.

Background
Fraymakers is a 2D platform fighter in which characters from different indie games compete to win. Assists are a major part of the game, these are very similar to in nature to the assist mechanic from the Marvel vs Capcom series, in which you can summon a character of your choice to perform an attack at the press of a button.


GAME DESIGN
After playing Fraymakers for a while I realized that the assists which I enjoyed using the most were the ones that had simple, quick, and predictable attacks. This is due to the fact that I can very easily come up with different setups to deal big damage or even K.O. my opponents. I decided that these were the kinds of assists that I wanted to create for the rest of the community.
​
Translating Game Mechanics
One of the most interesting challenges I faced while creating these assists was the idea of faithfully translating these characters into a genre that they didn't belong to.
Take Classic Guy for example, for his attack I decided to use the bomb from Spelunky. This is an limited resource which the player can use to detonate the environment or deal with tough enemies. It works like any other item in that game, you can pick it up, throw it, and drop it at your feet. The bomb also has a set timer before detonation, taking into account everything else we know about the bomb, you can strategically hold onto a bomb for a short period of time and throw it right before it goes off to detonate hit specific areas of the map like so:

The thing that makes this mechanic interesting to me is the precise timing needed to pull it off, and the risk of holding the bomb like this since it could blow up in your hands and deal massive damage to your health. Some keywords I would assign to this mechanic would be precise, risky, and powerful. We can see those elements translated into the assist here:

Precise

Risky

Powerful
Balancing
Balancing is naturally very important for a competitive game like this one, with this in mind let's turn our attention to Sora. When designing his attack I knew that I wanted it to mostly be used as a combo starter, or to combo into a kill move, this is why the attack only deals 10% damage with 10 base damage, a relatively low amount especially compared to other assists. Even though it is a weak attack on its own, the big advantage to using this assist is its high hitstun, meaning the enemy is stuck in place for a while, specially if the opponent gets hit by the returning projectile. This is because most of the damage is meant to come from the player's follow up attack, which then skyrockets the kill potential of this move.

Additional Polish
To make sure these characters felt truly complete I made sure to add some special interactions under certain circumstances. For example, when Sora's keyblade is coming back it is possible that an opponent might deflect it, meaning it'll never return to him. In this scenario, Sora will have a unique animation and voiceline.

Similarly, for Classic Guy I made sure to add a special animation if you make him hold the bomb until it explodes. He will get sent flying across the map, then recover and leave.

Reception
As far as I can tell the community really likes both of the projects I made for this game. To this day the Sora assist remains one of the most downloaded items in the Fraymakers workshop with more than 2000 unique subscribers. The Classic Guy assist isn't sitting too far behind with 1000 unique subscribers. Overall, I would say the project was quite successful, and I had tons of fun designing for these characters.
PROGRAMMING
As mentioned previously, this mod was made using Fraymakers custom content editor called Fraytools. This is an independent piece of software specifically built for this game. Scripting for this software is done using hscript, a language I was unfamiliar with before working on this project. What I'm interested in documenting here is the process I went through to learning this new language.
​
Learning Hscript
At the time of working on these projects I was unaware of what programming language Fraytools even used. Some syntax was similar enough to languages I'm familiar with for me to not be completely lost, but it was still a daunting journey. Not knowing which language I was programming in, I was unable to make quick google searches regarding syntax and code structure, this made even the most basic of tasks quite difficult.
​
Learning From Documentation
Due to the fact that I worked on this project soon after launch, and that this game is somewhat niche, there weren't many online resources I could lean on to help me. Thankfully, Team Fray (the developers of Fraymakers) wrote some decently thorough documentation on how their software works, taking you through the basics of how to start a project, all the way to publishing a finished product. This was an indispensable resource during development.
​​
I believe that the fact that I managed to develop 2 mods for this game, in a programming language I didn't know, using only written documentation is a testament to my willingness to learn, and my ability to understand written documentation when coming into a new project, something that I think is quite crucial to game development in general.

Learning From Example
Another resource which was crucial during development was the assist template provided by Team Fray. This is a sample project which contains all the content and logic for this character:

I would often times look at this template before coding a feature to get a better idea on how I might implement it within this specific game environment. Whenever I had questions about hscript syntax, this was also a good place to look for some reference. For example, I learned how to write events, and which kinds of game events were already set up within the project from the assist template; I then took this knowledge and used it to set up the physics for Classic Guy's bomb.
//Assist template code
function initialize()
{
// Set up wall hit event
self.addEventListener(EntityEvent.COLLIDE_WALL, onWallHit, { persistent: true });
}
function onWallHit(event)
{
//Destroy bomb on wall hit
self.destroy();
}
//Classic Guy bomb physiscs
function initialize()
{
//Set up events for hitting different surfaces
self.addEventListener(EntityEvent.COLLIDE_FLOOR, floorBounce, {persistent: true});
self.addEventListener(EntityEvent.COLLIDE_CEILING, ceilingBounce, {persistent: true});
self.addEventListener(EntityEvent.COLLIDE_WALL, wallBounce, {persistent: true});
}
function ceilingBounce(event)
{
//Reflect vertical speed
self.setYSpeed(_maxYSpeed * -1);
}
function floorBounce(event)
{
//Reflect with lower speed
self.setYSpeed((_maxYSpeed * -1)/1.5);
_maxYSpeed = -100;
}
The ability be able to analyze code and then create something new out of it is crucial in my opinion, especially when joining a team mid production. This is why I work hard to strengthen this skill whenever possible.