ColeSlaughter

LD 38

Orbitunes is DONE (...enough)!

screenshot2.png

It's not the prettiest thing, or the most interesting thing. Hell, it's not even the most functional thing! But it's done, and I'm fairly proud of it.

Maybe it was a little ambitious to make a music creation game with almost no musical expertise (and it definitely shows), but I'd say I've learned quite a bit! :)

Now if y'all will excuse me, I need to get some food in my stomach.

Game Page: https://ldjam.com/events/ludum-dare/38/$16622

Orbitunes Post-Mortem: Building a Toy

I've finally had some time to decompress after this Ludum Dare, and hoo boy, did I need it. This has been one of the toughest game jams for me yet, and for some really weird reasons.

So, without further ado, let's get into it!

Where I Started

I've been developing video games as a hobby for over 5 years now. I've done dozens of game jams (including my very first Ludum Dare a few years back!). I've worked on projects spanning development times from 24 hours to 6 months. I'm not exactly a professional, but I'm not exactly a first-timer either. I've been doing this for a while. However, during this jam, I was faced with a challenge I had never encountered before.

When the theme was announced, I was completely drawing a blank as to what I should make.

I seriously spent hours just sitting around with a notebook, trying desperately to come up with something creative. Anything. But nothing satisfying was coming up. "Oh god," I thought do myself, "Have I forgotten everything?" Although I develop a lot of personal projects in my free time, it's been a while since I've had to come up with an original concept from scratch. And with the pressure of the time limit, I was forcing myself to try to be creative. But that only made me worry about why I wasn't being creative enough, which prevented me from thinking about new game ideas. It was a vicious cycle, and I was REALLY close to just throwing in the towel, and opting to work on my current projects for the weekend instead.

But as I lay in bed on Friday night, about to fall asleep, I had a thought. I was obviously operating at a disadvantage at this point, because I sunk so many hours into brainstorming, with nothing to show for it, and the clock was still ticking. At this point, I don't have time to make a completely fleshed-out game. I needed to think simpler. As simple as I could possibly make it while still being entertaining.

I can't make a fun, unique game in this amount of time, but I could probably make a helluva toy.

No objectives, no lives, not even a player avatar. Just something fun for the player to mess around and engage with. Once I started down this path, I was reminded of another "game" I really enjoyed that was nothing more than a neat little toy: Electroplankton.

What I really admire about Electroplankton is how simple its concepts are to grasp, all while having a wide variety of different tools that you can mess around with to interact with it. I wanted to make something like that. As I mulled it over in my head and I fell asleep, there was one idea that managed to stick out in my mind.

title.png

The concept of little asteroids orbiting around a star was simple, and easy to understand. On top of that, it just has this natural sort of mesmerizing appeal watching them zoom around in waves around the center. I had different asteroid types to choose from, representing quarter notes, eighth notes, and sixteenth notes, giving the player the ability to make a simple beat. To give the concept a little more depth, the closer the asteroid got to the center, the higher pitched the notes would get, and vice versa.

I hoped that this would be enough for the player to experiment around and have fun with for at least a few minutes. With no end-goal or objective for the player to work towards, that's really all I had to try to keep them engaged. And while my compo submission is far from perfect, I'm actually really happy with how this project came out in terms of a jumping off point.

What Went Well

Thankfully orbiting physics was something I was able to finish and mess around with within the first hour or two of starting development on Saturday morning. Once you understand the physics at play, implementing it is only about a dozen lines of code. On top of that, it's not the most "unique" thing in the world to try to implement, so there are plenty of resources online of people trying to do the exact same thing.

I probably spent more time tweaking the values in order to make it really simple to successfully obtain orbit while launching asteroids, while at the same time having a little bit of a learning curve to it that would encourage players to try different launching techniques. I specifically wanted the game to have no tutorial, because like I said before, the only potential for "player engagement" I have is how long the player is willing to experiment with my toy before they exhaust everything that they're able to do with it. Once you feel like you can't do anything new with it, the boredom quickly sets in. A tutorial would have put them on the fast-track to boredom-ville had I taken away those precious few minutes of exploration.

Once I got orbiting down, I had a little bit of fun launching asteroids around and watching them spin about. The next task was to implement sound for the game, probably the most important component.

Oh, and would you look at that? We're on to our next section!

What Went Poorly

Everything having to do with audio was way more taxing than I expected it to be. I'm a software engineer through and through with cursory experience with musical theory at best (I played in middle school band, I guess?).

Challenge #1 was making everything sound "nice" when played together. Because this was intended to be a loosely structured music generation toy, and I wanted the player to feel rewarded for experimenting with it in as many creative ways as possible, I had to make sure that no matter what the player did, the game would produce a pleasant noise.

Challenge #2 came in the form of me not knowing of any high-quality audio sources for simple musical notes. Each asteroid in Orbitunes produces its own unique sound, and the difficulty came in not only finding those different sounds, but also making sure the sound was pitched to a middle C, so it could be easily pitched up and down within code. My solution ended up being this abomination:

20170502_234724.jpg

No mics, no audio jacks, just a 15+ year old keyboard with partially blown out speakers and a built-in microphone on a 4+ year old laptop. With their powers combined (along with some heavy mixing in Audacity) I was able to produce at least some semi-decent sounding notes in the pitch I wanted. But damn if that didn't take a while.

Challenge #3 was discovered a mere hour before submission. As it turns out, when you're trying to keep a beat, I would highly suggest NOT using a coroutine along with WaitForSeconds(), because it's actually not 100% accurate every time. To my dismay, I discovered that I made a rhythm-based toy that was frame dependent.

Joy of joys.

This resulted in the asteroids falling in and out of sync with each other the longer they stayed on the screen. Some beats would play faster sometimes, and slower other times, making it kinda hard to tap your foot along to anything that was going on. Of all the things wrong with my compo submission, this is the one thing I wish I had had time to fix...

But not all is dark and dreary, because moving onto the next segment, we have...

What I Learned

First of all, pentatonic scales are a thing of beauty, and they are the sole reason why my game sounds even remotely nice at all. Basically, a pentatonic scale is a normal scale with all of the half-steps taken out. The result is a set of notes that sound "pleasant" no matter what combination they're played in. These things are magical, to say the least.

Secondly, audio in Unity can be a pain in the butt to work with. I discovered quickly that as I added more and more notes to the scene, an ugly static noise would start to pierce over everything. Evidently, if you have too many noises playing at max volume at the same time, some massive clipping occurs. To resolve that, I had to normalize the volume for every sound playing in the scene, and recalculate it with each new additional asteroid. Because of this, some may notice the game get quieter as more and more asteroids are added...It was a pretty blunt fix, but a fix nonetheless.

Lastly, I found a way to fix the damn syncing issue in my game (unfortunately not in time for the Compo). It turns out that Unity actually has its own separate thread for audio alone, and it's tracked using the variable dspTime. dspTime is a sample-based time tracker that is frame independent, allowing me to accurately determine when the next beat is supposed to play at any given moment. Once I implemented this, it became WAY easier to create consistent melodies and semi-catchy rhythms, as evidenced in my post-compo build.

Oh if only I had known sooner...

But that's okay, because this segues perfectly into the next topic of...

Where I Plan to Go from Here

I would loooooooove to make this a casual little side-project of mine. I have quite a few ideas as to how I can add to it to give the player more ways to experiment and tinker with this thing. After all, the more a player has to tinker around with, the more opportunities there are to discover new things through experimentation. And as long as there are new things to discover, they won't get bored as quickly (assuming they find this silly little thing engaging to begin with). In my opinion, that is the essence of what it means to make a good toy.

In that regard, here are a few things I have on the list to add to this thing: - Remix sound volumes so the "most recent" few asteroids are slightly louder than the rest, instead of being drowned out by whatever cacophony is currently spinning about.

  • Different beat patterns that are more than just standard 4/4 beat notes. Perhaps some more percussion-like rhythms.

  • Different instruments to choose from for each of the different beat patterns

  • Allowing the player to change the mass of the star (affecting the pull of gravity), or the Beats Per Minute

  • Allowing the player to manually set the fields where the notes change pitch, so it's not just a linear progression from the lowest note to the highest note.

  • Get some damn high-quality audio to replace the crap I have right now.

My end goal is for this to be something that a person bookmarks to come back to later. Maybe to kill time for a few minutes here and there, as a peaceful little distraction. The important thing would be them coming back though, and that requires having enough neat things to tinker around with to warrant repeat visits. Currently I think everything in this toy can be "discovered" a little too quickly as it is, but hopefully someday in the future that might change. :)

I hope this was informative! If you have some time to kill, I'd really appreciate it if you tried Orbitunes out! You can find my Compo Submission here. And if you'd like to see what it looks like just a few days after submission (aka: WAY better) you can try out the Post-Compo Build here!

Thanks for reading!

Orbitunes Results!

fusqBgq.png

Wowza! I didn't expect to score even close to the top 100 ANYTHING, much less top 20! :D

Although, do folks happen to know how ratings are weighted, based on how many votes were counted for a particular game? I know there are games that have gotten twice my number of votes AT LEAST, and if it's just an average of (# stars / total votes), it seems like it would kind of disadvantage the more popular games...

Regardless, I'm SUPER happy that folks seemed to enjoy my silly little toy with terrible audio samples and beat synchronization...Thanks to everyone who took the time to play it! I really appreciated all of the honest feedback, and I plan to use it to improve on this project in the future (bookmark the link to the Web Build if you're interested!).

It's been real, guys! See ya next LD!

LD 43

Serial Dater Finished!

devilatyourtable.png

Hey Shugga'!

Come play our game about speed-dating with Satan and serial killers here. ;)

https://ldjam.com/events/ludum-dare/43/serial-dater

Did you know?

Our random character generator has the potential to create 8.4 MILLION unique-looking suitors, all of whom would just LOVE to take you out on a nice date.

...Or stab you in the face. It's up to you to figure out which.

character.png

Also, if you're super lucky, you might get a visit from Big Momma Devil himself, as he throws his hat in the ring to win your affection!

devil.png

Come try our game Serial Dater, where just like in real life, dating is HELL!

https://ldjam.com/events/ludum-dare/43/serial-dater

What is the most egregious thing in your game?

I'm sure we're all familiar with the fact that in a game jam setting, some corners just HAVE to be cut in order to make the deadline. This often results in some pretty hilarious shortcuts that are just plain horrifying to anyone trying to make something decent, extensible, and optimized.

So I figure I'd use this opportunity to air some dirty laundry and talk about my biggest shame in my team's game, Serial Dater

In Serial Dater, you use various powers to dig into a potential suitor's psyche and determine whether they are safe to date, or actually a serial killer. One of those powers is a supernatural seduction that tasks the player with typing various flirt words to get the date to confess their deepest, darkest secret.

seduction.png

As you type out a word, it highlights in green until the word is completed. If that word was the date's weakness, then they'll confess their secret.

How this was accomplished wounds me to my core.

First of all, recognizing the specific key stroke a player makes in Unity when ANY key is hit was not as easy as I thought. There is no "Get pressed key value" function that I was aware of. So instead, I had this pretty little list of valid keycodes: keyCodes.png

Then, every frame I looped through all of those keycodes to see if any of them were pressed.

update.png

As you can imagine, the most common case was that the player wasn't typing ANYTHING. And yet this loop STILL executed 26 time per frame. Not great.

But not the worst thing, I guess? I mean, at least the rest of the code looks fine. For example what about the code that determines if a correct character is pressed? Well...

forLoop.png

...Oh what the fresh hell is this.

This is game jam code if I've ever seen it. SUPER specific conditional statements that are easy to break if even the slightest thing is changes elsewhere in the game. Impossible to read or follow without focusing super hard just to figure out what one loop iteration does. This is the pile of vomit that is quietly concealed by a large, conspicuous rug with a sticky note that says "do not remove."

How about the text highlighting, you may ask? Surely that was simple. Perhaps some rich text tags or TextMeshPro functions?

A reasonable person would assume that.

In a game jam scenario, reason is sometimes thrown out the window.

Because I was string-parsing to determine if a correct word was being typed, any sort of rich text tag tomfoolery was thrown out the window. Also, while technically possible to accomplish per-character shading in TextMeshPro, the documentation for how to do so is downright abysmal to the point where I just came up with a faster solution:

flirtText.png

Just have a child TextMeshPro object with an empty string inside, and type green text on top of the word that the player is typing. Perfect. What could possibly go wrong? Except for maybe dynamic font sizes, variable movement speeds, auto-orientation issues, and unpredictable kerning?

This is EASILY the aspect of the game that ate up the most of my time, and the amount of corners I cut made it some of the ugliest stuff in the game's source code. But hey, it works, and that's all that matters!

(At least as long as I'm okay with rewriting everything if I want to expand anything in the future...)

How about y'all? What sorts of massive shortcuts did you have to take in order to make sure you had something shippable by the end of the weekend?

What are you most proud of about your game?

Let's get braggy!

Game Jams can always seem like an uphill battle, but sometimes there are the small victories that motivate us to push past the setbacks, and finally complete something despite seemingly insurmountable odds.

One such small victory for our game Serial Dater was our random character generator. Given the fact that our game revolved around the concept of speed-dating, and seeing as many suitors as possible, it was crucial for us to be able to provide a sense of variety between all of the characters. After all, if the same 5 models kept showing up, things would have gotten boring pretty fast. One important way that a game is able to pique someone's interest is through the element of surprise...

...And how could you NOT be surprised when being greeted by a face like this?

weird.png

Instead of making a bunch of unique character models, we drew up a handful of body features, organized them into folders, and randomly pulled from them every time we wanted to generate a new character. When all was said and done, this was all the code we needed to get it to work:

characterCreator.png

This tiny little script allowed us to create 8.4 MILLION UNIQUE CHARACTER MODELS!

And while actually drawing the assets took a pretty significant amount of time, coding it up took no more than an hour. We're pretty proud of the end result, because it pretty much means that whenever you see a date for the first time, that's likely the ONLY time anyone's EVER seen that specific character combination! Once you say DATE or PASS, that character model is gone forever...Pretty neat!

If you'd like to see the extent to which we get loony with our character creator, you can check out Serial Dater on our game page here! https://ldjam.com/events/ludum-dare/43/serial-dater

How about you guys? Is there anything in particular in your games that you're super proud of, or took a lot of work that might go unnoticed?

A wise man once said: "When you do things right, people won't be sure you've done anything at all."

So use this opportunity to brag about something specific that you worked really hard on! :)

Momma is pleased with her results...

1d3e2~2.png

"Well I'll be, shugga'! Looks like you found your honey-pie!"

We are all VERY pleased with our results for Serial Dater! After working our asses off and getting a late start, seeing numbers like this is super satisfying.

Screenshotem20190102-190808/emChrome.jpg

We're happy to see the areas we worked the hardest on got a lot of love. We tried hard to think of a unique concept given the theme, intentionally dismissing our first ideas in order to get to a concept that we felt was truly original.

Unfortunately that ended up biting us in the ass as we spent an entire day just brainstorming and didn't get to work on the game until late Saturday. As a result, we didn't get the time we wanted to polish and explain the mechanics, which I personally think is responsible for the dip in the Fun and Theme ratings. If we just had a liiiiiiiiiiiittle bit more time!...

Regardless, we are especially happy with all of our Top-100 Ratings! We're glad that people enjoyed our ridiculous dialogue that was written in it's entirety at 4am on the due date, and we're especially pleased that everyone seemed to enjoy how much work our artists put into making all of the character sprites and 3d environment! As the team's only programmer with no artistic talent whatsoever, I have to thank @ruddgasm and @ruddiculous who were my absolute saviors.

With a 4.4 average taking 57th place, I can only imagine the Graphics category was S T A C K E D with heavy-hitting entries. Some of my personal favorites from this jam were @jorgegamedev and co's Super Sellout, @theonethatneverwas with their entry The Cold Remains of Warmer Days, and @kloscunha with their entry Haeresis. Y'all made some bonkers pretty games with some dynamite moods! I look forward to seeing what you guys do in the future.

We're still recovering from the weekend of madness, but we plan to hit the ground running this time in April to hopefully throw our hat in the LD Ring once again!

See y'all in the next one!

LD 44

Whatever it takes to get in granny's will...

grannygif.gif

Gam Gam doesn't have much time left. Drastic measures must be taken to ensure she remembers only what you want her to remember...

HUGE thanks to everyone who has played our game and given feedback! It warms are cold, dusty hearts to see everyone enjoying our twisted sense of humor.

If you'd like to take a peek inside our minds, come try out our Jam entry: Knit Worth!

https://ldjam.com/events/ludum-dare/44/knit-worth

A Fruit, A Microphone, and a Dream

Did you know?

In Knit Worth, when you poke at Granny's synapses inside her head, they make a small squish! sound.

That sound was created by squirting mashed banana out of a small hole in a plastic bag!

gameplayGif.gif

Witness the fruits of our labor by prodding around Gam Gam's noggin yourself!

https://ldjam.com/events/ludum-dare/44/knit-worth

Making Organic Brain Chunks in Knit Worth Using Shaders

A lot of times in game dev, you put a lot of effort into a very specific thing that ultimately goes unnoticed by players.

Why?

Because if that thing is not there, then players will definitely notice its absence.

That very specific thing for us was the “blobby” effect of Granny's brain in Knit Worth.

In Knit Worth, you use crochet needles to poke and prod at a sweet old lady's brain chunks. Naturally, something like that should look soft and organic. Our solution was to use a simple vertex shader to manipulate the object on a sin() based rhythm. The result was something that looked like this:

blobbois.gif

For folks who don't exactly know how shaders work, essentially a shader file usually (though not always) contains two functions that manipulate whatever object it's attached to. The vertex shader function manipulates the position of a mesh's vertices, while a fragment shader manipulates the colors that are drawn to that object.

In the case of our blobby effect, we only needed to write a vertex shader. We weren't too concerned with changing the colors of the object fragments (a sacrifice that was made for the sake of time). Anyhoo, without further ado, here it is in all it's glory:

``` Shader "Custom/Pulsate" { Properties { _MainTex("Texture", 2D) = "white" {} _Color("Main Color", Color) = (1.0, 1.0, 1.0, 1.0) _Intensity("Intensity", Range(0, 0.1)) = 0.01 _Frequency("Frequency", Range(0, 100)) = 20 }

SubShader
{
    CGINCLUDE
    #include "UnityCG.cginc"

    struct appdata
    {
        float4 vertex : POSITION;
        float3 normal : NORMAL;
        float2 uv : TEXCOORD0;
    };

    struct v2f
    {
        float2 uv : TEXCOORD0;
        float4 vertex : SV_POSITION;
        float3 normal : NORMAL;
    };

    sampler2D _MainTex;
    float4 _MainTex_ST;
    float _Intensity;
    float _Frequency;

    v2f vert(appdata v)
    {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
        o.normal = normalize(mul(float4(v.normal, 0.0), unity_ObjectToWorld).xyz);
        o.uv = TRANSFORM_TEX(v.uv, _MainTex);

        float4 newVertex = mul(v.vertex, unity_ObjectToWorld) + _Intensity * ((float4(o.normal, 0.0) * sin(o.uv.x * _Frequency + _Time.w)) + (float4(o.normal, 0.0) * sin(o.uv.y * _Frequency + _Time.w)));

        o.vertex = UnityObjectToClipPos(newVertex);

        return o;
    }

    ENDCG

    Pass 
    {
        ZWrite On
        ZTest LEqual

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        half4 frag(v2f i) : COLOR 
        {
            return tex2D(_MainTex, i.uv);
        }
        ENDCG
    }
}

} ```

It's not the cleanest or most optimized thing in the world, but it is functional. The main bulk of the heavy lifting is done in the vert() function. Essentially what I'm doing is oscillating a vertex's position along its normal using a sin() function. The vertex's final adjusted position depends on its texture UV coordinates as well as the Intensity and Frequency properties. These last 2 values can be manipulated in code or in the inspector to customize the blobby effect.

unityDemonstrationSmaller.gif

So there are a couple of fairly problematic issues with this shader that prevent it from being super robust.

Firstly, it does not handle seams well. If you look at the object too closely, or set the Intensity to be too high, you can see a break in the mesh that immediately breaks the blobby illusion.

Secondly, this shader does not handle lighting or normal/bump mapping in any way. That would require a lot of extra work in the fragment shader that we unfortunately just did not have the time to implement.

Despite these problems, we were able to create a halfway decent “organic” effect for any arbitrary object, including the little synapse connectors that wire up the inside of granny's head!

webBois.gif

It's a small little detail that required a super non-trivial amount of work, but we like to think that it looks a lot better than if it wasn't there at all!

If you're interested to see how it works in action, check it out at our game page!

https://ldjam.com/events/ludum-dare/44/knit-worth

And as always, thanks so much to everyone who has left feedback for us! We're working hard to make sure to return the favor for everyone who comments on our game, but it may take some time, so we appreciate your patience!

Keyboard Cowboys Recommend...

keyboardcowboys.jpg

We as a team have been thrilled with the flood of positive reception we've been getting for our game, Knit Worth. Hearing about you guys enjoying our game is hands-down one of our favorite parts about participating in Ludum Dare.

We'd like to return the favor and spread the love for some of our favorite games we've played so far. So without further ado, here are some of the Keyboard Cowboys' "Top Picks":

The Ends

Made by @memory-of-god, "The Ends" is a brutal look into the cycle of trying to live two lives at once. One life is trying to achieve your dreams, while the other is trying to make enough money to keep you afloat at a brain-dead job (at least, that's how we interpreted it!). Sporting an art style reminiscent of PlayDead's "Inside", it executes a simple idea and manages to capture the struggle of making ends meet.

Play "The Ends" here! https://ldjam.com/events/ludum-dare/44/the-ends

Seize the Clay

Made by @failedstarfish, @adamd, and @seconddimension, "Seize the Clay" is one of those rare entries that lets you flex your creative muscles. In a world straight out of a children's storybook, you are tasked with creating pottery to sell and keep your business afloat. The game gives you pot designs to work from, but if you really wanted to, it also allows you to craft your own potted creations, mold them into any shape you want, and paint whatever design tickles your fancy! This is definitely one relaxing entry.

Play "Seize the Clay" here! https://ldjam.com/events/ludum-dare/44/seize-the-clay

InstaLifePlus

Made by @nox282, @neakiir, @skyllee, and @voidaerun "InstaLifePlus" is a neat rhythm-esque game that has a narrative unfold as you play it. It's a super ambitious game that features multiple endings, and a surprising amount of polish considering how much is going on. We'd recommend playing this on an Android device if you can, but if you can't you can still get a solid experience on their HTML5 version.

Play "InstaLifePlus" here! https://ldjam.com/events/ludum-dare/44/instalifeplus

That's all we have for now, but we'll likely be back with more soon! The Keyboard Cowboys are constantly wranglin' up new gems, and we're still trying to get through all of the games from everyone who's left feedback for us on Knit Worth.

In the meantime, give these games a look-see. They definitely deserve the attention!

Dynamic Difficulty Tuning in Knit Worth

When it comes to prioritizing aspects of a game during a time crunch like a game jam, playtesting and tuning is usually on the lower end of the list, right behind "make it work" and "oh god, why isn't it working?"

It's difficult to predict how well your players will be able to understand your game, and how challenging it might be to a person who didn't spend 72 straight hours staring at it with out some form of playtesting. Unfortunately, such opportunities are a luxury in such a short amount of time, so we decided to work with our constraints, and came up with a solution that we like to think works pretty well.

"Screw it, if we can't predict a player's skill level, we'll just let the player show us how skilled they are, and tune to that."

Now on the surface, that sounds like a LOT of work, but actually it took a lot less time to implement when compared to gathering data from strangers, tuning the difficulty, and iterating over and over. So here's how we did it!

Sequences

In Knit Worth, players are presented with 8 synapse nodes inside Granny's head that they can poke at with their crochet needles. These synapses can be in 4 different states: Light Blue (Hit me!), Red (Don't hit me!), Flashing Blue (Hit me a bunch!), and Neutral (Don't hit me, but it's not the worst thing in the world if you do, I guess...).

It would have been super easy to just randomly set a state for each synapse and call it a day, but that runs the risk of immediately confusing new players, and robs experienced players from a natural sense of progression and difficulty. So instead, we came up with the concept of Synapse Sequences.

Essentially, a Sequence is a ScriptableObject we made in Unity that contains the designated state for each synapse in a list, as well as a duration in seconds for how long that sequence should last.

sequenceObject.png

We made a BUNCH of these, and organized them into Easy/Medium/Hard folders in our Resources directory.

sequenceFolders.png

With this sort of structure, we were able to cover the entire spectrum of player skill levels. To give you an idea of what each Sequence difficulty level looked like, here are a few examples:

Easy Sequence

easy.png

This is a nice, easy sequence for the player to process. The synapses you want to hit and the synapses you want to avoid are clearly separated. Also, there are a lot of "neutral" synapses. Hitting these will break your combo, but they won't deduct your score and time like the red synapses, which makes them much less punishing to hit.

There's no trickery here. The only barrier to clear this sequence should be the player's understanding of the controls.

Medium Sequence

medium.png

A little trickier here. There quite a bit more going on, and the presence of more red synapses means there is a harsher punishment for messing up. However, it's not that insurmountable. Much like the easy sequences, the "good" and "bad" synapses are grouped up and clearly separated.

There are a few tricky patterns in the medium, but this difficulty level is mostly meant to test the player's ability to multitask and hit multiple synapses at once.

Hard Sequence

hard.png

This is where we get a little mean, for the sake of pushing the player to their limits. Flashing blue synapses demand a player's prolonged attention while light blue synapses draw their eyes for one-time extra points. "Safe" and "dangerous" synapses are intentionally mixed together to make things harder to process for the player. At this point, "neutral" synapses are almost exclusively used to add information noise to make the game state harder to parse.

The reward for making it to the hard difficulty is the potential for higher combos and points (given the abundance of flashing blue synapses), but the price is a much more challenging set of sequences that were designed to try and trip your brain up.

Adapting to Player Skill

Initially, when we implemented the Sequence loading system, we had the difficulty "level up" based on how much time was remaining in the round. 50% time remaining would bump you to medium, and 30% time remaining would bump you to hard. After some consideration, we decided that this was probably the wrong way to implement a difficulty curve for our game.

For one, if players struggled to learn the controls or mechanics, they would very quickly get overwhelmed as the game ramped up in difficulty before they were ready to tackle it. On the flip side, if players picked up on our mechanics quickly, they would be bored for 50% of our game before things maybe got challenging for them. We wanted to aim to have players having fun for 100% of the 90-second duration of our game.

In an attempt to achieve this, we implemented a behind-the-scenes "streak" system that counted how many consecutive sequences a player cleared (hit all the light blue ones) without making a mistake. If the player clears 10 in a row without messing up, they will automatically be bumped to the next difficulty level. This way, players who are still learning the mechanics can do so in a safe, non-punishing environment, and players who have maybe played before and thoroughly understand the mechanics can fly right to hard mode without wasting too much time being bored.

Obviously this wasn't an exact science, and it's still super tricky to predict what players will find easy, medium, or hard. But we believe we came up with a solution that at least feels semi-organic and friendly to both new players and veterans alike.

For those who have played Knit Worth already, did you notice the dynamic difficulty? ;)

For those who haven't played yet, check it out for yourself, and let us know how we did! https://ldjam.com/events/ludum-dare/44/knit-worth

THANK YOU for the 100+ Ratings on Knit Worth!

grannyscreenshot.png

It warms our hearts to see so many people scamming Gam Gam out of her money.

Thank you SO MUCH to everyone who took the time to play our ridiculous game and leave such wonderful feedback! We truly didn't expect this much attention.

We are currently going down the list of feedback on our game page and returning the favor as best we can.

In the meantime, feel free to try to beat the current Knit Worth reigning champion @tuhlienn, who currently holds the top score of an absolutely bonkers 7,326,550 points!! Mad props! :clap:

https://ldjam.com/events/ludum-dare/44/knit-worth

Knit Worth Devs have been officially bested!

highscore.png

The man, the myth, the legend (and good personal friend) @jenkinz94 has officially beaten the dev high score in Knit Worth!

Think you have what it takes to dethrone him?

Try it yourself at https://ldjam.com/events/ludum-dare/44/knit-worth!

...Now if you don't mind, I have a top spot to reclaim...

Keyboard Cowboys Recommend...(Part 2)

keyboardcowboys.jpg

The Keyboard Cowboys are comin' in again with a new haul of some of our favorite Ludum Dare entries so far!

Ghostly Tricks

Made by @nelson-william, Ghostly Tricks is a top-down puzzle game where you trade your soul to a vending machine for bombs that you use to find a way out of increasingly tricky rooms. The total premise is very simple and easy to pick up quickly, but the way the mechanic is stretched makes for some really interesting gameplay scenarios and "aha!" moments that are rare in jam games. Currently one of my personal favorites!

Play Ghostly Tricks Here! https://ldjam.com/events/ludum-dare/44/ghostly-tricks

BETRAYDED

Made by @barbiche, @drestin, @entropy, @acoussat, @roilbauk, and @karreg, BETRAYDED, on top of having a dynamite name, is a dynamite multiplayer game. The movement controls are as simple as they are silly. 2 players control their own restrained operative as they try to shimmy and hop their way back to their teammates in a hostage exchange. But the game doesn't end when one player reaches the other side of the screen! Art, audio, and gameplay are all on point with this one.

Play BETRAYDED Here! https://ldjam.com/events/ludum-dare/44/betrayded

Dirty Cash

Naturally The Cowboys are a sucker for ludicrous game concepts. Made by @robber, Dirty Cash has you controlling a coin on the street and mesmerizing greedy businessmen with your sheen. As you are chased around the street, your goal is to lure them to a pit of eternal suffering, where they will suffer for their vices. The art and animations are impressive, the premise and mechanics are unique, there's just a lot to like about this one!

Play Dirty Cash Here! https://ldjam.com/events/ludum-dare/44/dirty-cash

And that's all we have for now folks! Once again, a huge thanks to everyone who has taken the time to play our game, Knit Worth! The response has been overwhelming, and we're still in the process of returning the favor to everyone who was kind enough to leave a comment. Y'all's enthusiasm inspires us to spread the love as much as we can, so we hope to do another one of these soon!

'Til next time! :pointright: :cowboy: :pointright:

If you made your game using Unity, PORT IT TO WEBGL!

We've been looking over some of the numbers for our game Knit Worth on itch.io, and we've been seeing some genuinely surprising results.

TL;DR: our browser plays dwarfs our number of downloads by over 5x!!

While that seems like an absolutely insane disparity, if you think about it, it kind of makes sense. If you only have a Windows download build, here is some of the potential audience you will miss out on:

  • Mac Users

  • People playing games on their non-personal computers

  • People who can't be bothered to download a zip file, extract it, and open up an .exe

  • People who are (justifiably) weary of downloading and running .exe files off the Internet

These groups of people are not a small number. In fact, they likely outnumber your original audience by a lot. In the process of downloading and running your game, a potential player can have dozens of reasons or opportunities to stop what they're doing before they even hit your title screen. A WebGL build takes out almost all of those steps. All they have to do is click your game link, hit the "Run Game" button, and bing bang boom, you have a new player!

Don't underestimate the impact that user friction has when getting someone to check your game out!

Don't know how to port to WebGL?

It might be easier than you think! Here's a step-by-step guide:

  1. In Unity, go to File->Build Settings
  2. In the Platform section of the Build Settings window, select WebGL
  3. Go through the regular build process
  4. Zip dat stuff up into a .zip file (and only a .zip file!)
  5. Go to your itch.io page (or make an itch.io page) and change your Kind of Project to HTML.
  6. Upload your .zip file to the page, and specify that it is meant to be "Played in Browser"
  7. ...That's it! Now just make sure everything works. :) For a lot of games, it might just be that easy!

A couple of caveats

*Caveat 1: *

A WebGL build is unlikely to run as well as your download build. You can google around to find some quick optimizations you can do, but for the most part your download build will always be superior. However, as long as your WebGL is at least 75% as playable as your download build, the payoff for a larger audience and feedback quantity is absolutely worth it (in our opinion)!

Caveat 2:

We recommend porting to WebGL in order to reach a wider audience and get more feedback. However, the number of ratings you get and the amount of feedback you receive does not necessarily correlate to how good your final results will be! Every Ludum Dare, there are always some games that are just barely above the minimum rating threshold that sweep some of the top spots (often deservedly!).

If you can't port to WebGL for one reason or another, don't fret! You shouldn't be at any sort of disadvantage compared to other games because of it in terms of final results. Unfortunately, it does mean that, due to your game's availability, you likely won't get as much feedback simply due to the wide range of players we have around here.

Caveat 3

Once you put a WebGL build up, prepare for browser plays to start cannibalizing your download numbers. It seems that, even if a player has a compatible machine to download your game, they will more than likely default to the WebGL version to experience your game, even if you have a warning informing them that they may potentially be having an inferior experience (like we have in our game). As long as your okay with this, you will have a much easier time getting people to play your game.

We hope this helps some people out there who are looking to get more feedback for their hard work!

As a friendly note, we, the Keyboard Cowboys, are making a point to play, rate, and comment on every single game that was made by users who were kind enough to give us feedback on Knit Worth. We won't be deterred by a download process and promise to get back to you as soon as we can! We like to be thorough in our feedback giving though, so we appreciate your patience!

'Til next time! :pointright: :cowboy: :pointright:

Knit Worth Record Holder in Action

https://youtu.be/zGqD2T2XBt4

This is peak Knit Worth performance right here.

@Jenkinz94 shared with us a video of him getting the absolutely filthy score of 20,272,500 and a combo of over 900, absolutely destroying us at our own game!

(Unfortunately, audio not included...)

Think you have what it takes to dethrone him?

Try it yourself at https://ldjam.com/events/ludum-dare/44/knit-worth!

Knit Worth Time Lapse Documentary

https://www.youtube.com/watch?v=-n09a77RMqE

We as a team decided to film ourselves making Knit Worth during the entire weekend of Ludum Dare!

Join us as we note every single milestone and setback with quick notes and annotations throughout the video. From brainstorming, to development, to completion, it's all there and documented!

Making a game in a weekend is a lot of hard work, but that doesn't mean that it can't also be really, really silly.

We plan to make this a Keyboard Cowboys tradition for future jams. Hope y'all find it both entertaining and informative as a goofy documentary of sorts!

If you'd like to check out the final product, you can find it at our game page here: https://ldjam.com/events/ludum-dare/44/knit-worth

'Til next time! :pointright: :cowboy: :pointright: