2020 - A Retrospective

2020 was a difficult year for many and myself, but when it comes to gamedev, it was a fruitful one! Here's a look back at games and projects I worked on in 2020. 

2019 - January 2020: Prokuvo

Although not necessarily part of 2020, Prokuv'o was a part of my final months of 2019, and the first week of 2020. Prokuv'o is a totally realistic coop Serbian slava simulator, inspired by Overcooked. The title itself is a Serbian approximated-translation of overcooked, although "prokuvao" would actually more precisely be "overboiled". And the ' in Prokuv'o is just an elision of "a" to make it sound more spoken, like slang. The game was initially made for the 2019 Global Game Jam by Sava, Vukasin and me. We fixed a lot of issues, added a couple of new features (like beer!), added the main menu and key rebinding, and polished it up quite a bit. The cherry on top was original music by Slobodan.

 



January: Trails of Tenere

When mid January came, so did the 2020 edition of Dakar rally, which inspired me to work again on Trails of Tenere, my bike riding and trail-making experimental (in a way) game. At this point, the server that keeps the trails made by players was already down since I didn't maintain it, so the desert was, and is still, completely empty, unfortunately.

What I was working on is a major update. I've been adding a few items: the camera, the map and the compass, and I was improving the desert generator. Some new things came with the Unity updates, such as improved terrain shaders and DOTS updates. I converted all procedural generation to now work with Burst compiler, which made it large number crunching stuff up to a whopping 100x faster. 





I've noticed from the footage of sandy deserts, that there is always this thin layer of sand flowing just above the surface. So, naturally, I wanted to implement that. I've experimented with adding volumetric sand since I'm using Unity's HDRP. I hacked the volumetric fog compute shader to receive the heightmap from the terrain and match it with the desert with a little bit of offset. And it worked great! Although, I discovered the HDRP fog is not so great for far distances. The moment you increase the range you get lots of undersampling close to the camera, you can fake it a bit with adding some more noise to per-pixel sampling and hope TAA will blend it. I think HDRP fog looks great for close quarters, but once you go to massive terrains it isn't so great, hopefully they improve it in the future. Note that I am also working on older hardware, so I couldn't really turn up the quality up to 11. Sooo, maybe it's just my problem :D




But the biggest update was to the bike physics. I created a new "wheel collider" that simulates the full 3D tire with multiple raycasts, instead of using the Unity's WheelCollider as in the present alpha version. The tires themselves worked surprisingly well, and I then could make suspension work with physics joints. Applying steering forces was now directly via the fork joint torque, which is much more realistic than the previous hacky "just set WheelCollider steering and fake the fork rotation" system. The problem now was that this change actually made the whole bike much more unstable. While most of the time the bike would drive fine, there would be many moments where the bike would go into this unrecoverable wobbling state, after which you would either fall off the bike or need to slow down to calm it down. Tweaking values now became way more difficult and "explosive". Then I realized that the more realistic it becomes, the less player control there is. It became quite hard to steer and respond quickly from fear of falling or getting into the wobble state, which is not how bikes should feel. It literally feels like the bike is being driven by someone who has never driven a bicycle before, or has got the bike-balancing part of brain surgically removed.. So, I've put the project on hold until I could come back with a fresh mind to fix those issues.


End of January - February: Yugotrip

At the end of January, GGJ 2020 was on. The same team from last year's Prokuv'o has reassembled to make another game, with the addition of a first time jammer Dusan. We have once again had a great time making a game. With the theme of "Repair", this time we decided to go full Yugonostalgia and make a game about a couple taking a trip, in circa 1986, from Belgrade to Adriatic coast, a typical route that many Belgradians would make every summer. And, most importantly, you would travel in a Yugo, the traditional cheap Yugoslavian car that had questionable quality and would break down often on those long journeys. Not only are you trying to repair the Yugo all the time, but you're also trying to repair the couple's relationship. The game is played in two players, although only one is driving. We intended to have them change seating positions mandated by "driving fatigue", but never implemented that.

The game would pause from time to time to give you prompts about what the couple likes where both players need to chose an answer. If both players say the same thing, they successfully "repair" the relationship. After the jam, we realized that this wasn't a very good design decision because the questions were just too random, the only way to win was for the players to verbally agree on a choice.. Which, in a way is an OK strategy since you build a relationship in real life :D .. but not the kind we were trying to accomplish in the first place.


The world is generated procedurally, but from predesigned pieces that would stack on each other. We designed 3 levels: level 1 is start of the trip New Belgrade and the freeway of "Brotherhood and Unity" which ends close to the border to Bosnia; level 2 is the trip in Bosnia until Mostar, where you cross the famous bridge, and level 3 was Croatia ending on the coast.


After finishing the GGJ version, we continued on to improve it. I've added traffic, which was pretty fun to implement. I've used some of my previously made code for House of Flowers but now I improved it by a lot.



I've added Sarajevo, which now bisects level 2 into 2 new levels, level 2 ends in Sarajevo, and level 3 ends in Mostar. It was also nice to recreate the entry into the city and the city hall and center.

We've added loads of new traffic vehicles, helped by Vukasin and Jay, who loved our project so much he wanted to make a few!

 

The most fun was to implement the trams..

 

..and even a trolleybus!

 

The problem now was that the feature creep was coming and the game was becoming something much more different that the original, simple idea. It felt more like GTA game now, and we didn't know what to turn it into, should we expand or should we keep it simple? We had A LOT of ideas, but very little time. Anyway, I went on to do a job for a client, and everyone then became busy, so we decided to put a hold on it until we figure out what we want exactly to do with it. But we still definitely want to finish that update and publish it, hopefully as a paid game.

March: NEngine

Some time in March, I started working in a coworking space, which made my day cycle much more stable. Although.. That was just for a week, because a week later lockdown started and the place got closed! Around that time, I got into discussions with Shahriar about custom engines and C++ and he pointed me to OpenGL tutorials by The Cherno. And I thought, hey, I could try this, why not. After 2 days, I already had something to show.

 

It was my first serious time writing C++ and I frankly thought it would be much harder. But 7 years of C#, Unity and previous programming in various languages has kind of prepared me. Once the beginner C++ mistakes went by, and believe me, there's A LOT of those, it felt more comfortable. I finally figured out how libraries work and why the infamous LNK2019 happens. Once I've finished the whole OpenGL setup process, created Mesh, Shader, Texture etc. classes, it was actually pretty easy since it started to look more like Unity and I already knew how to write shaders, how meshes work, how matrices and 3D math works thanks to my Unity experience.


March: Betula

Two weeks later, the Haunted PlayStation 1 game jam was happening. I thought, this is the perfect opportunity to use my engine for a game! I had no idea what to make, so I just starting importing my old meshes from INFINLAND and other project. I called the game Betula because of the birch meshes in the little town. Then, I found out an HPS1like game called Fatum Betula already existed, which is a crazy coincidence, I had no idea about it :D I had to hack the engine a lot to make the game, but in just 2 weeks since I started to make my own, custom engine, I got a game! I really was amazed that it wasn't as difficult as I've previously believed.

 


 

After I published the game, Martin wanted to join to help to help with the soundscape of the game. But I was already burnt out on the next day and didn't have nerves to continue working on the hacky engine :D So, an update with the new soundscape will wait some other time..

April - May: Titan, OPSND

And just a few days later, Ludum Dare was happening. Although I was planning to skip it to work on my engine, my friend Dario asked me if we could make something together. And since I already wanted to collab with him previously, I accepted. With the theme of "Keep it alive" we thought of a Mars rover-like mission where you would need to keep the rover alive. But then we thought of an even better idea much more relatable to real life: instead of the rover, the goal is to keep the space program alive! Your program is running out of funds and you need to find something to excite the public that would prevent the program's shutdown. We moved from Mars to Titan, because we thought it would be a better atmosphere, although, a Curiosity/Perseverance-type rover is probably not going to be going to Titan realistically.
 

Dario really wanted to do an assembly code compiler and emulator, so we decided that you had to code the rover, and wait for the commands to play out. Although I thought it would be an impossible task, he created the emulator in about a day, spending the remaining 2 days on the rover moving on tiles logic, the code editor and syntax highlighting. Meanwhile, I thought it should be appropriate that the player works in an office, so I was making office models. On the last day, I made some tiles for the tile generator, and then we assembled the whole thing in literally last 2 hours and hoped it works. And, it surprisingly did!

 

We called the game TITAN, OPSND because of the most important "send operation" instruction which transmits the results back to Earth. To learn how to write in the special assembly-like language you need to read the manual! ..or print it if you are really hard core!


The next month I spent improving OPSND, implementing a better atmosphere, which took me around a week, compared to 2 days of making for the jam (ah the post-jam paradox!). I've added some more office models, and what I really wanted to add, the full blown computer system. You can view files, run applications, copy to diskettes etc. Even play "Sapper.exe" The reason for that is that we had a whole sub-system in mind where you'd need to copy files from the old computer to the new one (that's why there's a dead laptop on the table in case you were wondering) and analyse data, then "write" mails (that's also why the intro doc says you need to chose the right information to send). We never had time for any of that on the jam, of course.


 

Also made a fully procedural pizza texture in Substance Designer :D 


 

I've also been adding a view outside, where you could see the launches taking place from the pad.


June-July: Not much except pizzas

For June and July I was working for a client, so didn't do much personal project-wise

But going through old tweets I realized that was the time I was experimenting with REAL pizzas, so here's one for you:

 

August: Unannounced space game

During August, I collabed with Joram on a little top-down/3rd person sci-fi game. We threw together a little prototype where you could walk and jetpack around, pilot a spaceship, drive a little buggy. Mostly made of reused code. I also reused the atmospheric scattering I made for OPSND. The coolest thing I managed to implement is that you could drive a buggy into a spaceship cargo bay and fly away with it, then put spaceship into autopilot, hop out of pilot seat and hop into your buggy and drive it around your cargo bay.. or if you open the cargo bay door you could yeet out like James Bond :D

I added a few AI ships as well. In the mean time Joram was making all the cool art. It was first time in a long time I didn't work on art at all myself so could fully dedicate to code and it was fun. But tbh, we spent most of the time making it look cool.

We have some good ideas on what the game should be, but don't really want to talk any further. We both got busy in the mean time, but it was fine, we did intend to make a prototype anyway.

 

September: C++ racing game

I spent the mid of the year tidying up my engine, and making into a library that I can make multiple projects with. For a while I wanted to create this little rally-racing game with dynamic terrain, where every ground pixel would be simulated, kinda like Noita, but heightmap-based. Since there's a lot processing needed, performance testing was crucial, so I was comparing the difference between Unity DOTS and C++. Initially, C++ wasn't much faster, but when I built it with Clang and started to understand SIMD optimizations, it was typically around 2x faster, but can be up to 5x in some situations. But then, it doesn't look immediately as flashy as Unity :D In Unity I could just throw in art and effects, and scripts I made previously, and make it look good very fast. If I do decide to make it, will most likely continue in C++.

 

October - 2021: A return to an old project

In October, I started working on a procedural Serbian-like village generator. It took more time than I thought, but this is a longer term project and I'm focusing on building a solid foundation instead of rushing a prototype. The generator is "voxel" based where mesh pieces are then placed according to the neighbor rules.


Some people asked if it's WFC, but no, I simply hand-mark which voxels are which rooms and then the generator decides where to place walls, doors, etc.


 

Then I was thinking what's the next thing that would make the village feel authentic, and of course, it's the local bus and a grumpy driver. The important thing was getting the hands correct. Fully procedurally animated with IK. And of course, like the rest of "foundation" parts, this is another thing that could be applied to other characters in the game.

 

I've also been adding a lot of interactables lately, including the record player, for no particular reason but to provide some ambient noise.

 

A lot of people asked what this all is for, and I was trying not to give it away, but now I can say it's actually a return to an old project "House of Flowers", thanks to which I went to Stugan in 2016. Soon after Stugan, I've put the project on hold because I felt it was too big of a project, and back then I didn't know as much about programming as I do today. But some may still remember it from that era.

 

Anyway, another reason I didn't want to give it away is because I should actually change the name because, unfortunately, in the mean time, there's been a Mexican Netflix show "The House of Flowers"! Well, damn.. Thinking of a good name is the worst! And I really liked House of Flowers.

 

October: Superspreader

One more 0h jam was around, where the game needs to be made in 0 hours! How? Well, because it happens within the hour during the autumn summertime change, so that hour "never existed". I didn't think about a game idea at all before the jam started so after 20 minutes of thinking, I couldn't think about anything else apart from something to do with COVID. I thought about business owners building and protecting their visitors with plexiglass screens, and so I thought you could do that in game. You'd have to run around holding the plexiglass screen and protect the visitors from sneezing into each other. And voila, 40 minutes later I had something, with barely any testing and balancing..

I called it the Superspreader!

 

December: Procjam talk

Meanwhile, Procjam organizers "spotted" me making the village generator on Twitter and asked me to do a talk about something related to procedural generation. I decided to talk about creating infinity in games, because I thought it was a non-traditional topic most people would be interested in. And I also have lots of experience from Library of Blabber, INFINLAND, Norman's Sky, etc. The most difficult thing was fitting inside the 10 minute window :D There was a lot more I wanted to tell. You can watch the talk here:

 


 

December: Interminal

As Procjam and 7dfps were starting, this time I asked Ferran if he was interested in joining me to reinvigorate my 2019 procjam project that I didn't have time to finish. I told him about the idea of an infinite duty free shop where you could buy forever and never find your gate, and he loved it. This time, untraditionally for me, it was him who worked on most of the procedural generation stuff like generating the terminal, the elevated walkway floors and placing shelves in shops. In the mean time I was working on the airport simulation and making all the art. We actually didn't work that much all the days because we were both busy. That was actually fine because we didn't want to really be stressed and burnt out while working on a jam game in our free time. We just had to manage our scope smartly and effectively. I really didn't believe we were going to make it, but on the last day we connected all the things and everything worked! ..Well, with a few bugs we fixed a bit post-deadline. And one more time, I've reused my Atmospheric Scattering!

And so, we published Interminal!

 

In the following week we made a couple of updates, one that adds procedurally generated perfume smells, and another that adds the plane timetable as a split-flap display.

 

Ferran also wrote a really good article about how he made the procedural walkways that you can read here.

Conclusion

Needless to say, a lot of stuff happened in 2020, and I have to say that I probably haven't been more productive.  Although many of the projects I mentioned are not finished, as you can see, in 2020 I went back to Prokuv'o, my old airport simulator from 2019, and finished those. So, quite likely I'll finish some more old projects as well in 2021.

I dearly miss traveling to conferences, like Amaze and Indiecade Paris, which I visited so far every year. And there's been always a couple of new places I'd visit throughout a year. I miss hanging out with other devs from all around the world and meeting new ones. I hope for 2021 to be a much better year.

Thanks for reading!

Oh, and you can join my games discord server here to discuss my projects, and gamedev in general. Yes, it might be called INFINLAND at the time you join, but that's soon to change. And note that there will be some announcements soon!

Comments

Post a Comment