repr — function for printing Lua tables

Hey all!

I wrote a function that will come in handy when printing tables in Lua. Normally, when you call print on a table, it is first tostring-ed into a memory address and looks something like table: 000002074CD2C070. How unhelpful! If only there was a better way…

I’ve created a function, repr, that works like Python’s repr. It returns a nice, printable representation of Lua values (strings, numbers, bools, and of course tables). It is designed with two goals in mind: (1) be as close as possible to a literal code representation and (2) be as useful as possible during debugging. Check it out at this GitHub repository, or keep reading this post!

Continue reading “repr — function for printing Lua tables”

Spell Slingers Character and Ability Previews

Hey everyone! I took some time today to record some previews for a few characters/abilities in Spell Slingers. These are all works-in-progress with placeholder character names, models and kits. Everything’s subject to change, but in the meantime I want your feedback! So, what do you think?

I’m open to feedback on Twitter or via the game’s Discord server; this invite link still has more than 50 uses left from last week’s announcement – check the Spell Slingers splash page and Twitter in case this invite expires!

Announcing: Spell Slingers

Aww yes! It’s time. I’m officially announcing my next title on Roblox…. Spell Slingers! Click here to visit the splash page for the game.

Spell Slingers is the name of the MOBA game I have been working on since December 2017. I briefly mentioned it in my graph theory series and on my personal Twitter feed. I’ve poured my heart and soul into developing the game and its engine, so I’m hoping this will be my best game yet. Open beta has not started yet, but I will make announcements (here, Twitter, Discord, Roblox…everywhere) when it does.

Please follow the official Twitter @Spell_Slingers! If a group on Roblox is more your speed, you can join it here. Finally, I’ve set up a Discord server for the game, but be warned: that invite link only has 100 uses on it! If you’re from the future, check the Twitter for an up-to-date link).

I’m excited to share more information with you soon. Thank-you for your unending support, and I’ll see you soon in-game.

Mirror Muse is now Free-to-Play!

Hello everyone! This is a quick blog post to announce that my 2015 game Mirror Muse is now free on Roblox.com! Click the game icon below to play it now:
Game Icon of Mirror MuseI made this game in Fall 2015 during my internship at Roblox Corp under the Accelerator Program. My goal was to create a compelling mobile puzzle game. While I feel that I mostly succeeded, single-player games don’t exactly thrive on Roblox, especially not ones designed for mobile play.

So, to help drive players to at least try out the game and blow the dust off, the game is now free-to-play. You can still unlock more puzzles with the variety of modules available for only 10 Robux each. The level editor is also still available for only 40 Robux.

If you’ve never tried the game out, now’s your chance! Thanks for your support.

Graph Theory in Roblox (Part 2 – A Problem)

In the previous article, I went over basic graph theory terms and concepts. Click here to read that article. In this one, I’m going to describe a game design problem I found while working on my project.

First, some background information on my project. Without going into too much detail, it involves two teams roaming a map killing neutral monsters as an objective. One of these neutral monsters I’m calling creeps or minions, similar to those in Defense of the Ancients 2 and League of Legends. In those games, minions align with a team and march  down set paths and assault enemy structures on those paths. However, in my game, minions aren’t on a team, don’t attack structures, and have no set path. Here’s an early draft of the map I’m using:

An early draft of the map (not final). Notice the navigable paths through the map. Click to view the full image.

Minions roam this map freely, and one challenge I’m facing is programming the minion roaming behavior.  I came up with a number of ideas immediately. Here’s some of them:

  • Just walk in some random navigable direction, changing direction if they run into a wall
  • Create a bunch of paths and pick one to follow
  • Pick a random target on the map and use Roblox’s pathfinding to do the hard work for me in finding a path to the point

Well, there’s going to be a lot of minions around this map. Maybe they’ll even travel in packs, who knows! I can’t have the minions raycasting for walls, and I can’t use expensive pathfinding for them to navigate. I also don’t want them switching directions a lot; I’d rather they travel a long path instead of small segments.

How did I apply graph theory to this problem? Find out in the next article.

Kicksticuffs: April Fools’ Day Review

thumbnail_kickHello! I wanted to give a brief review on the update to Fisticuffs! I made last Friday in celebration of April Fools’ Day. The update changed the entire theme of the game from punching to kicking – Kicksticuffs! Overall, the update was pretty well-received and visits increased the three days the update was live and I got some interesting feedback in the process.

The update was done a bit quickly as I thought of this on April Fools’ Day. I created a kicking animation and swapped out the animations in the punching scripts. I changed the hitbox from the punch tool’s invisible handle to the character’s right leg, and presto, I now have a kicking tool. All the punch types (er, kick types) maintained their same mechanics. I also redid all the strings and logos to use “kick” instead of “punch”.

The hitbox turned out to be a bit wonky. It wasn’t as consistent as the punch due to the fact the punch tool’s handle extends farther out than the ROBLOX’s character’s arm and is also thicker. Reducing that to just the leg made dealing damage a lot less consistent.

I also got lazy and didn’t realize the Super Punches didn’t override the animations properly and ended up still doing punches. I received a couple complaints that people were still punching and that they were performing better than those who were relegated to kicking. Unfortunately, I did not collect any data with regards to punch type performance during the Kicksticuffs period.

Speaking of data, the weekend of kicking brought 60% more game play sessions. Sweet! Unfortunately, the average play time took a dip of about 35% because players were only showing up to do a bit of kicking, then leaving for the regularly scheduled April Fools’ hijinks elsewhere. I was surprised to see that Friday (a weekday) beat out the Saturday and Sunday in max visits in one hour. It’s rare to see that happen, but not as rare as an update like kicking in a punching game.

Screenshot_91For those who really liked the kicking, I will be creating a cheap game pass that will turn kicking on for the buyer. Before that pass is released, the kicking hitbox issues will be fixed to give the consistency of punching. I don’t foresee any balancing issues with kick types, with the exception of Super Punches: kicking will be disabled for them due to animation replacement code being spaghetti necessary readability for that specific punch type.

All in all, the short-lived update went well, but I regret not doing some more preplanning to get the game a larger burst in popularity. It could have been much bigger. I wasn’t able to advertise the game using the doomed tickets currency, for some odd reason (my bids weren’t going through).

That’s all for now!
– Ozzy

Juggernaut 2: Jump Limits

Jumping around in the redone lobby of Juggernaut 2.
Jumping around in the recently redone lobby of Juggernaut 2.

Jumping. It’s an intrinsic mechanic to ROBLOX games that involve the default character figure. Unfortunately, jumping is one of the most unhealthy mechanics to have in a game like Juggernaut 2 that involves projectile shooting. In this post, I discuss how I take control of this mechanic and make it healthy for Juggernaut 2.

Continue reading “Juggernaut 2: Jump Limits”