Feb 19 – March 31 2018
For the first time, I worked as a programmer on a professional game, which was released on steam. It was a very important experience for me.
Getting the Job
I was approached by a colleague from Uni with a Job offer. His company was looking for some help with finishing off their game, and as we had worked together before, Andreas approached me and told me about it. He told me the game was some sort of strategy game, and since I was just about done with Warriors and Serfs, and my Semesterbreak was coming up, I had time, and I wanted to earn some professional experience anyways.
I only wrote a little bit with Andreas, and then my future employer, Peter, until I decided to take the Job. From the start it was intended as a short-term job, which would end when my next semester started.
Working at a company
Working on Hanse was the first time in a while where I had to write code into a large, existing codebase. It was also my second time working with Git, after the Blue Byte Game Jam, but now I properly learned how to use Git effectively. There was also a larger focus on project management than I was used to from uni. With proper sprints, and feature and bug tickets, it was much easier to concentrate on the task at hand, without being distracted by other issues.
We had totally flexible work hours, and could work from home instead of coming into the office, and I tried out a few different things. I realised however that, for myself, I very much prefer set work hours or flextime. If everyone’s in the office at the same time, it is much easier to communicate and plan, even if Skype and the like make it possible to meet from home.
In conclusion I can definitely say that I learned a lot while working at Linked Dimensions, and I’m happy that I got the opportunity to work there.
What I did
While I was hired to help out with fixing bugs, I ended up doing a lot more than that. I play-tested a lot too, finding out some very critical bugs – such as the AI traders not ever carrying items – and fixed a bunch of those myself.
I started out with the Ship combat mini-game. I fixed some text that wasn’t displaying what it should, and I worked with Andreas to improve the feel of the mini-game. The mini-game was turn-based, and the player had a choice between 5 strategies (including “flee”) that their ships would execute. With Andreas, I improved the target selection of the ships, so they would no longer shoot ships that they didn’t deal any damage to. I also fixed some bugs where destroyed ships would not be destroyed properly.
During my play-testing, I realized at some point, that none of the AI Traders were ever selling or buying any wares, nor fixing ships, or buying provisions, causing their convoys to inevitable stop moving forever. I found it hard to believe that this fact was missed by everyone working on the game, but I tested it thoroughly, and definitely found it was happening.
There was code which was supposed to do this trading, but it was clearly not working as intended. Unfortunately, that code was written by someone who had already left the company, and no one there knew how it worked. So I wrote a completely new system for it.
I designed their AI with Andreas, making sure that they prioritized what they needed to keep moving, and allowed them to trade with negative profit, so that wares would keep moving around the world. We also implemented some fail-safes, giving them some money when they fell below a certain threshold, so they couldn’t mess up completely.
When I was done with this, I could let the simluation run for hours, without the world becoming completely still, due to the lack of resources, as before.
Another issue I noticed while play-testing the game, was that there were some trade-routes where you could earn ridiculous amounts of money very quickly, completely ruining the balance of the game.
The prices of resources in the cities changed every month, and were dependent mostly on how much a resource was available in that city. So for example in the city of Brussels, which created medicine, that medicine would be sold for 20 silver or so. When you bought it and shipped it over to literally the next city, you could sell it for 300 silver or more. You could repeat this over and over, and there were similarly unbalanced routes.
Here again, I worked closely with Andreas to make a completely new price simulation. The final price was calculated from the amount of resources that are in that city on average, how much of that resource has been bought and sold in that city, whether the population is in need of that resource or not, and some random factor, to occlude the algorithm a little.
Unfortunately, it appears as if the code I wrote for this was taken out after I left the company, as the prices were often the exact base-price of the resource, a case which would be incredibly rare to happen with my code.
The Family Gallery
The family Gallery is a nice feature, where the player and their family was displayed as portraits in a navigable gallery. There were however a bunch of problems with the gallery when I came. For example, only the player character and their children, but not their nephews or siblings were displayed, although you had some gameplay-control over those characters too.
I rewrote most of the code responsible for deciding what characters were displayed. Besides the above mentioned, I also allowed to display characters who were married away to other families, together with their spouses. I felt this was a nice way to “keep in touch” with the sisters and daughters that were sent away for political marriages.
I made the selection of portraits prioritized, so the gallery would always show the most important members of the family over, for example, the daughters who were married away.
I also wrote the code generic in way that the gallery could display the family tree of any character in the game, not just the player character’s, but my superiors didn’t like the feature, so it was left out.
I helped out with a few more things:
- Found source of some save-game issues
- Proof-read English localisation (from german)
- Calculating the “most needed good” for each city, which for some reason was almost always alcohol