Out Of Insight
Jam: Siberian Game Jam at October 5, 2019 / Ludum Dare 45
Theme: „Start with nothing”.
Game page on the itch.io ← play in the browser (desktop with the keyboard only)
The void. The darkness. Can't remember anything. But I must, because the void is unbearable. Do it, do it! Something is sparkling at the edge of the consciousness. Must grab it, gather it, gather the meaning, the memory, the color. Have to remember. What happened? No, first things first. Now need to gather myself, to get the insight. Need to gather the right color.
The player controls a colorless, shapeless being flying through the passages of the subconscious gathering a color shards. To get to the next level the player have to mix colors into the needed one and to avoid walls and obstacles. Control is keyboard only, touch devices are not supported, sorry.
The Development Process
At this jam Scoba, a skilled VFX programmer, has joined our team. At the other hand, Meven and Nika were very busy and could not attend the event. We decided to take a risk and create a 3D game. Nobody of us done that before (and yes, life teaches us nothing).
Once, several weeks before the jam, Dina found this thing over the internet. It's a puzzle: all you need is to mix base colors and get the target one. We thought that this color mixing mechanics is interesting. After several days of discussions we combined it with a horizontal scroll-shooter mechanics (later the „shooter” component was eliminated). So, the concept was born: fly, gather needed colors, avoid unneeded ones, avoid obstacles, get to the next level, repeat.
Ivy was our only artist on this jam, that's why we invited Oksana to join the team, and we planned to look for 3D modellers on the jam. Arthur and Anhel did not agree on the game engine to use, and Arthur joined another team for this jam (they created a cool game about wending machine fighting other wending machines).
That was easy to fit the concept into the theme. Dina wrote a heartbreaking story about a man who fell into a coma, lost all of himself and now trying to gather himself back and to get back to the real world from the deeps of his subconscious.
Sophia and Oda were looking for a team to join, and we sat them at our table. Then we started. At the beginning the process was pretty hard: many of the present team members have met a hour ago and known nothing about each other. Fortunately, Oksana as a most experienced artist quickly took the leadership and started to coordinate artists' work. As an art lead, she sketched, painted, gave tasks and helped to other artists.
Anhel and Scoba were dealing with the code. Scoba was writing shaders, making lighting and 3D-effects, and the other shader magic. Anhel, as usual, was making a game logic with GDScript. There were no signs of an accident.
The prototype was ready pretty quickly. The character was flying controlled by the keyaboard, gathered the color bubbles, and died touching the obstacles. Main things are done, we thought. All that left is to mix gathered colors, set the mixed color to the character, and compare mixed color with the target one. Anhel was thinking: „All right, it's 2019. There must be a well-known color mixing algorithm on the internet. I'll just read and quickly implement it, and it's done. There can't be any difficulties.”
The. Big. Mistake.
There is no such alhorithm. All right, there is, and more than one, but all that algorithms has a limited scope. Neither additive nor subtractive algorithms suited our task. See, we needed something that works like „green + yellow = blue, red + blue = violet, etc”. So-called natural mixing. Like with real-life paints. Anhel found that there is the only perfect solution. It's called „the Kubelka-Munk theory”. It is used by the Krita and the last versions of Adobe Photoshop. It's complex. It's origins lays in the theory of spectroscopy and it explains the physical model of light reflection and refraction. If you're interested, here is a whitepaper on the application of this theory to the color mixing problem.
Certainly we needed a simpler solution. We abandoned this idea and started to experiment with limited algorithms and models. No one can trick the math and the physics, and results often was not as good as we wanted. Finally we stopped at the RYB color model (Red-Yellow-Blue) and additive color synthesis. It's not perfect either, but it gave us „green + blue = yellow” stuff.
We waste a huge amount of time on that color mixing investigations. But there was another problem. A color difference. The game calculates a trivial Cartesian distance between two points in the color cube. But human vision is non-linear. For example, two shades of green can be quite far away from each other, but looks very similar for the human eye, and two very close (in terms of the distance in the color cube) shades of blue are clearly distinguishable. Take a look at this wiki article. But we already were running out if time, so this mechanism was left as-is. It leads to strange behavior sometimes, when you can bet that you already got needed color, but the game says „Nope, it's only 70% match”. But… Whatever, that will do.
The time was over, and some goodies were not included into the game, like the storyline and cut scenes. Level generation itself is messy, camera movement is rough. Nevertheless, the game is pretty atmospheric and playable.
Want to see the art from missing cut scenes? Here it is! This pictures were made by Oksana Rar.
The Moral
- If you think that the idea is very simple and easily implementable – double-check that. You can be wrong.
- Don't do the procedural generation unless you have a fully working solution for it. It's harder than it seems to be. Much, much harder. Trust me.
- Don't get stuck with a tought task. Look for more simple workaround. What's the point of implementing beautiful and accurate algorithm in the game if you don't have a playable game?
- Godot Engine isn't a good choice for 3D games with highly customised lighting. It's lighting system is very inflexible, and if you need to customize it you'll finish up writing a custom lighting system from the scratch with a totally disabled built-in lighting. Most likely it's not what you should do on the game jam.
- Color mixing is hard.
Summary
We've got a lot of fun. We met very good people, performed tons of interesting experiments, and now we know our mistakes. We liked this jam and our unfinished game.
The Team
- Dina Griko
- game design, management, narrative, sound design
- Oksana Rar
- graphics, art lead
- Anastasiya „Oda” Kuptsova
- 3D modelling
- Evelina „Ivy” Mayer
- graphics
- Sophia Egorova
- graphics
- Anatoly „Anhel” Griko
- game logic programming
- Antoine „Scoba” Anger
- VFX programming, 3D programming
- Dmitry „Blazze Di” Aldagarov
- music, sound effects, sound design