oneiromancer

Ludum Dare 47

Just finished!

Literally me right now, walking in circles and trying to calm my nerves:

promo.gif

Skycrawler, a puzzle-platformer that defies gravity

"Remember, the ~~enemy gate~~ next platform is down!"

I had so much fun during this jam. Coming up with gravitational puzzles proven to be just as hard and exciting as solving them would.

Check out my defying gravity puzzle platformer: https://ldjam.com/events/ludum-dare/47/skycrawler

promo_post.gif

How did you handle sounds in your game?

For me, doing sounds in jam submissions were an issue for a long time. I made do with some guitar melody here, some BFXR generated sounds there, but I never really put much effort into it.

That changed when I watched a certain streamer record all the game sounds with his mouth for his LD submission. Suddenly sound design became an exciting topic that I wanted to puzzle out, same as art or level design. And gradually, one jam after another, I became fond of it.

And for this jam, in addition to all the sounds I recorded using various things in my room, I also managed to write an actual, although quite short, song. Check out my game here: https://ldjam.com/events/ludum-dare/47/skycrawler .

(Yes, this is secretely a promotion post.)

So, how did you do your sound design?

Did you have a dedicated musician? Did you get various tableware from your kitchen to smack it until it makes a pretty sound? Or maybe you went cyberpunk and used those fancy sound generators?

A little picture to grab attention. I call it "Ascending to your doom". promo3.gif

Some thoughts on a game design

... Or a sad story of surprise enemy spider

This won't be a classic post-mortem, because this jam everything worked for me pretty much like I wanted it to. Well, I did push the first three hours of development on a sheer stubborness, not really believing in the idea I chose. But then it clicked, and stayed that way pretty much all the time. Almost...

When I was designing puzzles, I tried to keep the player in a simple gameplay loop: get to the level, locate objectives, plot your path, execute it. I tried to gradually introduce new ideas, new ways of using the core mechanic, always leaving enough breadcrumbs for player not to fall out of the loop.

promo_post.gif

And then I thought, "what if there was another entity, that abides the same rules, but whose objective is the player?" Thats when I understood that this idea can be something more than just another puzzle platformer with a gimmick.

This entity should have been the force that breakes the loop inside player's head, making it something that the player must pay as much attention as to the gravity during the puzzles.

enemy_promo.gif

Unfortunatelly, jam time constraint had something to say about that. Adding such an enemy as a regular encounter would either mean much more levels, which for me was infeasible, or breaking the flow of the levels, possibly introducing too much of new elements on the level to quickly get it. So, into a trash bin we go :(

...Well, not really. I thought it was too good of an encounter to remove completely. Instead, I design one level specifically to showcase this encounter, and possibly give a taste of what the game would become if I ever continue working on it.

If you want to try out my game, and tell me how well I did on managing gameplay flow, here you go: https://ldjam.com/events/ludum-dare/47/skycrawler

Don't mind me...

...just flying through to tell you to check out my defying gravity puzzle-platformer: https://ldjam.com/events/ludum-dare/47/skycrawler

art_promo2.gif

First Post-Jam update!

I've been postponing touching my game for a little bit too long, since I'm still not sure where I can go with this game. But at least some sort of post-jam update is long overdue.

So, this update includes some bug-fixes, some graphics improvements (not all of which I'm sure about, need some feedback there).

But more importantly, this update adds controller support, and speedrun mode with in-game timer. So now we can see how fast you can beat my game.

Check it out here: https://ldjam.com/events/ludum-dare/47/skycrawler

screen_timer1.png

graphics_showcase.gif

One note though: until LD rate period is over, the post-jam version will only be available as a downloadable for Windows, so that people can experience the game in it’s original jam form using web player.

SkyCrawler, now with the speedrun potential

How quickly can you beat all the gravitational platforming puzzles I've designed?

Find out in a post-jam version of SkyCrawler: https://ldjam.com/events/ludum-dare/47/skycrawler

(My best time is 02:31.2 btw)

postjam_promo.gif

art_promo2.gif

The inspiration behind SkyCrawler's core mechanics

Just a little story of how I came up with the whole gravity mechanics.

Thinking that time loops will be prevailing on this jam, I've decided to go with a spatial loop. At first I remembered this film/cartoon cliche, a forest where if you go in some direction, you always return to where you've started. But this gravitated me towards the whole rougelike/timeloop thing, plus I couldn't come up with some interesting mechanics.

And so, I had a vision in my mind. This vision:

promo2.gif

After that, things went smoothly.

Because I've read Orson Scott Card's "Ender's Game" a while back, I immediately knew this will be a game about breaking your stereotypical concept of gravity, thinking of gravity outside the box and using that to solve platforming puzzles.

With that in mind, I started desinging my levels, trying bit by bit to push out of player's head the notion of gravity as the thing pointing down. And that led me to making SkyCrawler: https://ldjam.com/events/ludum-dare/47/skycrawler

* Good luck, jammers, and remember, the ~~enemy's gate~~ next platform is down. *

promo_post.gif

A technical rundown of how level transitions work in SkyCrawler

It's a little sad that there aren't many technical posts here...

When I was designing the levels, I tried to make them flow one into the other and feel like a unified whole. My thinking was: "if you have some parts of your level that don't change between levels, and if you never take away the control over the player character, then the level structure will be intuitive for the player from the first look". And the feedback I had makes me think that this thinking was on point.

lvl_stillcase2.gif

To do that, I chose a hacky solution of keeping each level in a separate scene, and making the player character persist between scenes (DontDestroyOnLoad in Unity). That was a familiar solution and it generally worked. It also could naturally feed into the gameplay - once the level is finished, the gravity is set towards the central platform, while all other platforms play vanishing animation and then are destroyed. And once you touch the central platform, a new scene is loaded, and all the platforms play their appearing animation.

promo_post.gif

That would mean that I need some elements to be in exactly the same positions in all scenes, but it wasn't the problem since I made all the levels by copying the previous one and then modifying it. More annoying was the fact that it resulted in little but noticeable stutters when a new scene was loaded into memory. Plus, scene transition would eat all the sounds and particle effects that were playing (but it only occurs in first level because level transition there is instant).

Still, it worked good enough for the jam, and I didn't want to risk breaking it. And now I have plenty of time to implement it properly in post-jam updates.

Stay tuned for the part 2 of this rundown, in which I'll tell how I reimplemented level transitions in an upcoming post-jam update. Also, check out my game, SkyCrawler: https://ldjam.com/events/ludum-dare/47/skycrawler

art_promo2.gif

A technical rundown of level transitions in SkyCrawler (part 2)

In part 1 I said that I try to make my levels flow one into the other. During the jam I chose to do it by keeping each level in a separate scene. It was easy to set up, but the solution was quite hacky and full of little annoyances.

For a post-jam update, I chose to reimplement this. Since I treat my levels as one continuous whole, the obvious solution would be to keep the geometry of each level in a separate "frame" on one scene.

lvl_showcase.gif

This made switching from one level to the next a lot more intuitive, plus, relieved me of all the hacks I used for playing platform's appearing animation.

But it came with it's own set of problems - I would now need to set up events for all the resetting that previously came naturally with reloading the scene.

Check out my game, SkyCrawler, and it's post-jam update, here: https://ldjam.com/events/ludum-dare/47/skycrawler

art_promo2.gif

A technical rundown of gravity in SkyCrawler

Since gravity is a main feature and a core mechanics of my game, I wanted to write a post about it for quite some time.

The idea behind my gravity implimentation is surprisingly easy: find a collision point with a platform, get a normal in this point, use the tangent and the normal in this point as x and y axis. So, basically, multiply horizontal input by tangent vector, multiply vertical input (or gravity) by normal vector.

gravity_arrows.gif

It isn't really that simple, but having circle collider for character and capsule colliders for platforms helps a lot.

For jumping I would just fix normal vector until I collided with a platform. I also smooth "horizontal" movement in air, and to get horizontal velocity in local space I project character velocity on the tangent vector using dot product.

gravity_arrows2.gif

But that's a jam, so of course there are a lot of hacks. I actually have two implimentations of gravity: first uses default Unity physics simulation, and it is used for player character only. But because in the last day of the jam I added an enemy, that needed it's own gravity separate from player, I have a second one, which is a hardcoded gravity specifically for this enemy.

To see all this stuff in action, try out my game, SkyCrawler: https://ldjam.com/events/ludum-dare/47/skycrawler

art_promo2.gif

Pushing for 100 ratings

Honestly, I you want to rate some games, go search Danger zone. It's 10 days left and there still are some games below 20 ratings.

But if you want to help me achieve this incredible milestone (which is actually a first time in my Ludum Dare experience, or any gamejam for that matter, when I get more then ~30 ratings) you are welcome to check out my game, SkyCrawler: https://ldjam.com/events/ludum-dare/47/skycrawler

art_promo2.gif

Results of SkyCrawler

..are pretty much what I expected them to be ¯\(ツ)/¯ .

Ok, maybe I didn't expect them to be this good, but still, I worked really really hard focusing on Fun and Innovation aspect of the game, and ratings prove that I did a good job.

Thanks to everyone who played and rated my game!

Ratings.png

Love you all!

art_promo2.gif

Another big post-jam update for SkyCrawler!

I've dedicated past couple of weeks to polishing and expanding the game. And so now it has twice as many levels. Which means more challenges, more puzzles, and more cool gravity mechanics!

Check it out here: https://oneir0mancer.itch.io/skycrawler

promo_4.gif

art_promo2.gif

Ludum Dare 49

How I used an AI to generate in-game portraits for my game

umgs.png

Pretty clickbaity title for something that can be summarized as "I downloaded official StyleGAN model from Github and run a couple of lines of Python code". But lets start from the beginning.

First of all, what is this AI that I used

I used a neural network (specifically, generative adversarial network) called StyleGAN2. It is basically a really complicated function, that takes a random vector as an input, and outputs some generated image.

Latent-optim.drawio.png

While the function itself is complicated, it consists of a lot of simple matrix additions, multiplications, and a couple of other special functions, applied one after another. The coefficients of those additions and multiplications are called parameters (or weights) of the model, and they are the thing that determines what kind of image will this function output. And to get it to output meaningful images of human faces, some clever people at NVIDIA took a dataset of 70,000 high-res photos and ran a trainig process on a cluster of GPUs for about a week. And then uploaded the weights they got on Github, so that people like me could play around with them.

How does it work

While training, this neural network compresses and memorizes the dataset of images it is trained on. Then, when you input some random vector, it outputs a blend of those images. But it blends them not based on, say, transparency, like in alpha blending, but based on facial features it learned during training.

blend.png (It's actually a lot more complicated than that, but whatever)

And so, if I take a neural network with the weights that were trained on a dataset of oil portraits, I can use it to generate a set of unique, but still similarly looking portraits.

Of course, the results aren't ideal. Sometimes they look too similar, and sometimes they are just ugly. Out of 100 images I generated only 20 were used.

But the really cool thing about all this is that YOU can do the same thing yourself, and all you need for that is your browser. Both the code of neural network and pretained weights are available, and Google has this thing called Colab that lets you run Python code on cloud using their GPUs.

The code I used to generate images is available here. In the meantime, you can check out and rate my game, Unstable Empire.

How YOU can use an AI to generate in-game portraits for your game

umgs.png

In previous post I explained how I used a neural network to generate a set for random portraits to use in my game, Unstable Empire. The really cool thing about it is that I didn't really need anything in terms of hardware or software to do that, just my browser. Well, that and 4 years worth of university studying the topic.

I uploaded the code here, so that anyone can play around with it and maybe come up with a new intereting idea about how AI can be used in gamedev. All you need is a google account, and you can run it yourself and get some cool stuff like this:

showcase_portraits2.gif