Hello! I want to tell the story of the development of the game on Delphi from idea to release. The article is more of a history, without any understanding of implementation details. Frankly, I really want to write about how we build a picture in the game, or localize it, as we did the GUI, but I will highlight it in a separate article, more technical, with the code. Otherwise this one will be too big. The code will not be here, but details under a cat. I beg!
Application.Initialize;
So. Our game was invented long ago for the game development competition (jam) IGDC â„–77 - jumper This was the beginning of 2012. We did the game in a state of permanent crunch for two weeks. The code came out awful. Expanding was impossible, sometimes there were unexplained glitches, but in general the game worked and some comrades managed to spend days and weeks in it. A couple of people stuck for a month. It became clear that her replay value is good and it would be necessary to finish it. But, as I said above, the code was terrible because of the crumpled deadlines, so the finishing touches were not made very much and everything was safely forgotten. It looked like this then: ')
The benefit of such procrastination, however, was. Later, all these things helped to avoid a lot of problems, because they were implemented in the foundation. Localization, for example, was solved through XML files, right before the release an Italian knocked to us, Francesco, and offered to translate the game. I did everything myself, we drew the necessary characters in the font, and the game got Italian in a week. Simply and easily. From this at least one conclusion is worth it - do not hammer on the localization, make it early. And preferably not to the detriment of the gameplay.
For feature in coolthings do
When we started making the game, we looked at the best moments in different games, but we looked at Blizzard the most. Oh yes, this is a very cool office, they make cool games and every hit. And each worked out to the smallest detail. And it clung to us madly. So I, as a Diablo fan and my colleague as a WarCraft fan and StarCraft fan, looked at them often. So it was decided that, for example, achievements or friends should be able to view directly from the game, without overlays or exit. So there were such trifles as the clock in the corner, like fading music with alt + tab, the ability to listen to any track from the menu, connect the gamepad at any time and play without restarting, show achievements right in the game and much more.
We did the game almost all the time together. Two programmers. Graphics or drew himself, or generated sprites using FilterForge. At the end of development, we ordered graphics for the enemies, bought icons in the collector , sounds. We made music to order and music appeared a year ago. The music was not just written to us, it was also pitted on to prof. equipment in the studio. The tracks turned out great, and very into the mood of the game.
Small pieces of music
Case build of release
Code. We write the code in Delphi 10.1 at the moment, and the engine uses our Quad-engine , also written in open source Delphi. The development of the game, by the way, is insanely helping to make the engine really useful and convenient. We have been working in Delphies for a long time and this tool is convenient for us, but even here it was not without jambs. In one of the GUI modules, the build for release and debug worked in different ways. Suddenly it turned out that the “optimization” item in the release version for some reason makes one of the True variables in cases when it should be False. And the GUI starts to behave inadequately. Assembly code is different and the result too. The solution chosen was not the best, but we turned off the “optimization” item in the same way as with the debugging result.
During development, we were faced with the fact that we had to throw out almost all the gameplay developments in almost a year, and redo everything anew. We had to refuse Box2D, which makes it very difficult to solve our tasks. One of the problems was that Box2D considers everything in world coordinates, and we have speeds and vectors that can be very large. There was a problem with loss of accuracy. For example, the boss gun could lag behind the boss. His calculations were iterative, no matter how hard we tried (maybe we tried hard), but we didn’t manage to synchronize the picture with physics enough. Therefore, we took and used our physics from the prototype, of course, with modifications. For example, all calculations of physics in our country occur in screen coordinates, which solves the problem of tremendous speeds and values. Physics from the prototype was able to work only with a horizontal line and circles. Here, physics taught and other figures. compounds, layers, types of objects, etc.
We also made a good particle system, but it was not useful. Not useful and cool editor in the style of Warcraft3, allowing the mouse to do anything. To the best of its complexity and entanglement to associate it with achievements, for example, it turned out to be a living hell. So it was thrown out totally about a year of development of my colleague ZblCoder . And he started writing the whole gameplay again. But surprisingly, we made up in less than a month, and then went up.
As a result, in the dry residue, we can say that somewhere out of three years of development (there were quite long breaks, so 1.5-2 years of free evenings were really spent) it would be possible to make the game twice as fast, do not we do unnecessary things. But it is impossible to do without a rake, so much time was spent. The basis of the graphics engine by that time was no longer the basis. I implemented a huge amount of shader effects, and non-kernel tricks to achieve a juicy, dynamic image. Our game, by the way, is completely two-dimensional.
Game.Draw;
Normalmapping, volumetric lighting, space distortion, parallax mapping and a bunch of smaller, but equally important shaders. Shaders do almost everything. From color correction to transfusion shields. Many effects you may not notice, or think that they are drawn in advance, but no. They are made on the fly.
For example, a screenshot without color correction:
function IsThereTroubles: Boolean; abstract ;
Many of those who played, later claimed that the screenshots and the video do not convey the mood and fascination of the process in any way, albeit quite simple. And we could not solve this problem. How to show that it is more interesting than it looks?
The main problem still remains balance. For some, the game is quite simple, for others it is unimaginably complex. In most cases, it seems difficult because people begin to shoot indiscriminately at everything that moves, ignoring clues and trying to act intuitively but incorrectly. Some time later, awareness comes and a person begins to understand how to play, have fun and relieve stress.
To warm up the interest in the game, so that the player does not give up on himself and not quit right away, if things are not going very well, we added a competitive component to the game. Certain types of statistics are saved and friends can compare their results with you, and you with friends. In addition, the experience and discovery of new skills with each “levelap” also helps to sit in the game a little longer.
Target platforms (Win32)
After launching the game into early access, we encountered problems that we couldn’t even imagine at the time of development. The first streamer, which was going to stream the game could not do it, because it had a rather special configuration of the PC. He had 2 monitors with different resolutions and they were connected to different video cards. In discrete nVidia and integrated Intel. Our engine could not overpower such chaos and collapsed at the start. The problem, of course, was won, but time was lost.
Another interesting problem was the fall of the Steamworks API while trying to retrieve information about friends. On our accounts with 40-50 friends, everything was “OK”, but here in streamers and letsplers, where friends were for 500+, it was somewhere in the middle of the list for unexplained reasons. So we almost missed another couple of streamers, but we managed to fix it very quickly. On the same day a hotfix was made.
The further fate of the game - refinement, expansion. It is with great pleasure that we listen to any feedback, take actions that help to make everything better. Delphi will be great again!
I added a small poll at the end, I will be grateful for an honest answer.