Uncharted – The Nathan Drake Collection Review (PS4 Pro)

If I were to explain to someone how Uncharted plays, I would say that it is like Tomb Raider, only with more shooting, more linear, and a lot more character-building and interaction.

I guess I’m done here. See ya next time. Thank you for reading.

Yeah, no. I am incapable of being that brief. It is 2022, and I am enjoying a game franchise developed initially for the PlayStation 3. The first entry in the series was released fifteen (15!) years ago by Naughty Dog, nowadays of The Last of Us fame. Uncharted 1 Drake’s Fortune debuted in 2007, was followed up in 2009 with Among Thieves, and the trilogy (yes, I am aware there is a part four) was completed in 2011 with Drake’s Deception. I am not really one for nostalgic trips, so I picked up the remastered version instead of the originals (and I do not have a PS3). Bluepoint, now a part of PlayStation Studios, enhanced these three games for the PlayStation 4 and splashed out 60 fps gameplay. Note, though, that the remaster itself is also already seven years old. It was released in 2015.

Read More »

Kena Bridge of Spirits Review (PC)

I do not recall when I first became aware of Kena Bridge of Spirits. According to this announcement trailer, it must have been sometime in 2020. I was immediately hooked, but I did not jump in right away when it launched in 2021. I do not even remember why. It was a tough year for me personally, so maybe that was one of the reasons. Whatever it was, I am rarely on time with game releases, so why would Kena Bridge of Spirits be any different?

It is a different game, though (horrible segue *cough*), and one that I think stands out among all the others I have played in the past decade. Kena Bridge of Spirits is a PlayStation and PC exclusive, and it is the first title I played after building a gaming PC after just one year of abstinence. I haven’t heard much of this game after its release. Still, it apparently did well enough for Ember Lab to warrant a free anniversary upgrade at the end of September 2022.

Close combat games aren’t usually my jam. That is not because I do not like them. It has more to do with my inability to master the combat for an enjoyable experience. I must often resort to the Easy difficulty to complete challenging sections or bosses, and in the majority of times, the Easy mode is so accessible that it is borderline boring. Despite that, I went into the game with an open mind, and I am glad I did. I still had trouble with some of the bosses, but for the most part, I fought my way through the game on the normal difficulty. Let me tell you about it.

As always, I begin by discussing the game’s technology.

Read More »

I Bestow Upon Thee “HotkeyAutoExecute”, My Game Screenshot Automator

HotkeyAutoExecute is a simple single-window tool that lets you manage a list of frequently used hotkeys, of which one is repeatedly executed in configurable intervals.

That was the TLDR blurp, and now let’s get into the details. This tool scratches an itch I had in 2020 when I wanted to simplify the process of taking game screenshots for my reviews. During intense gameplay moments, it is difficult to focus on the game and press a keyboard shortcut to take an image of on-screen action. Therefore, I hacked something that would do the job but was not quite baked to be open-sourced as an application. I have changed that now, and boy, was it more complicated than I would have liked.

Read More »

Convert QKeySequence of QKeySequenceEdit to Native Windows Virtual Key Codes VK_*

In a blog post in 2020, I described how to utilize the WinAPI SendInput() function to emulate hotkey presses to automatically take game screenshots for my video game reviews. While I intended to create a simple GUI application to do the task, I ended up with only a hack because of a massive boulder that Windows threw in my way. Or after me, chasing me down a narrow path.

Forget the boulder.

(Although it would be a fitting metaphor to describe Windows: tall, fat, and destructive to user privacy.)

I wanted a simple input field where the user can press a key sequence that will be executed repeatedly at an interval. Qt conveniently provides QKeySequenceEdit for this purpose, and when I tried to insert the Xbox Game Bar hotkey, it did not register. Well, it did, in that Windows took a screenshot. But it was not recorded by the widget. Windows seems to intercept and eat the key presses. That was when I decided to just hard-code my needs and call it a day.

Two years later, I figured that it was about damn time to fix this, and this is where I ran into issues with the translation of key codes from QKeySequenceEdit and QKeySequence to native Windows virtual key codes.

This is where our adventure begins.

Read More »

Spring Boot @RestController Action Returning java.util.Optional

Recently, I wondered what would happen if a Spring Boot RestController returned a java.util.Optional instead of a regular POJO.

I invested 30 minutes of my life to find out, and created an over-engineered example on GitHub.

Here is the controller.

@Slf4j
@RestController
@RequiredArgsConstructor
public class MusicController {

    private final MusicService musicService;

    @GetMapping(path = "/value")
    Album getValue(@RequestParam("isNull") boolean isNull) {
        log.info("Request album value (is null: {})", isNull);
        return musicService.getAlbumAsValue(isNull);
    }

    @GetMapping(path = "/optional")
    Optional<Album> getOptional(@RequestParam("isNull") boolean isNull) {
        log.info("Request album optional (is null: {})", isNull);
        return musicService.getAlbumAsOptional(isNull);
    }
}

The first question I had was if Spring Boot would even start up. You never know. It does, and with this hurdle out of the way, here’s the output of a couple of curl commands.

~ % curl -i 'http://localhost:8080/value?isNull=false'   
HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sun, 24 Jul 2022 08:24:50 GMT

{"artist":"Insomnium","title":"Winter's Gate","genre":"Melodic Death Metal","year":2016} 

~ % curl -i 'http://localhost:8080/value?isNull=true'    
HTTP/1.1 200 
Content-Length: 0
Date: Sun, 24 Jul 2022 08:24:55 GMT
 
~ % curl -i 'http://localhost:8080/optional?isNull=false'
HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sun, 24 Jul 2022 08:25:00 GMT

{"artist":"Insomnium","title":"Winter's Gate","genre":"Melodic Death Metal","year":2016} 

~ % curl -i 'http://localhost:8080/optional?isNull=true' 
HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sun, 24 Jul 2022 08:25:06 GMT

null

Everything works as expected except for the null-case with the Optional. It returns the string “null” instead of nothing.

The moral of the story: Do not return java.util.Optional from a @RestController, or you need to do more work to unpack it.

Thank you for reading.

MacBook Air M1 Apple Silicon Sleep High Power Consumption?

When I first got the MacBook and put it to sleep on battery, as one does, I wondered why the energy store had lost a surprisingly high amount of charge after just a couple of days of sitting on a shelf untouched, lid closed. Now that I have a power meter (almost a year later), I was curious and hooked up the plugged-in computer to it. As you can see from the title image, the result was 2.3 frigging watts. But why?

Given this number, I wanted to open this blog post with the following statements.

Here is an interesting fact for you. The most power-efficient computer of the past decade allows itself over 2W of power while it sleeps. Yes, two frigging watts. Sleeping.

Being a curious nut, I did some more digging and then overhauled this blog post accordingly. But first, let me continue with my original vision of this little rant.

This is time travel, my friends.

Read More »

The Effects of Burnout – Personal Report About Navigating a Crisis

If you are one of the few followers of my blog, then, first of all, thank you. Secondly, maybe you are wondering why I have not been writing about any programming topics lately, given the name of this blog. Perhaps you only started following recently and like the gaming content. Whatever your reason, my main focus has always been on software development topics of any kind, and this element has been lacking for quite some time.

Out of the 11 posts this year (at the time of writing), only five fall into the programming category. And if I’m being honest, I have spread two more extensive topics across those five blog posts to potentially get more clicks – although the separation also makes sense. Before I digress too much, the short version is this: I am actively neglecting the original premise of my blog, yet I still want to produce content. There is a reason, and despite that somewhat lighthearted title, it is a serious topic.

Note: Before I changed the title to what it is now, it was “Yo, CODE-Slinger! You Now a GAME-Slinger? No, I’m Having a Dance With Burnout“

Although this report is based on my personal experience with the subject, it is not about me. Nobody on the Internet is interested in me, and I am not delusional enough to think otherwise. Treat it as a biased case study that I sincerely hope can be a motivation for other people going through a similar thing. The light at the end of the tunnel can be an exit.

The following two sections elaborate a little on The Codeslinger origin story. If you are only interested in the meat, skip to “Dance With the Burnout”.

Read More »

Cyberpunk 2077 Ending Review

When I published my Cyberpunk 2077 review last month, I had not yet finished the game. Based on what I had played until that point, I still felt confident in my opinion – hence the review. I beat the game a couple of weeks later and have watched all possible endings on YouTube (no, I did not play them all myself). My general stance on the game has not changed, but I am even more convinced that Cyberpunk is a character and narrative-driven game, first and foremost.

Before I go on, beware that I use this blog post to talk freely, something I avoid in my usual reviews. I will drop a few spoilers, and although I try to stay as vague as possible, there will be a few hints here and there. With a little more knowledge and research under my belt, I will also briefly return to gameplay and the technical aspects of CD Projekt Red’s ambitious creation.

Read More »

Cyberpunk 2077 Review (Xbox Series X Next-Gen Update)

To continue, press “B”.

To continue, press ”=”.

I hate when games do this, and Cyberpunk 2077 does it twice when starting for the first time. It greets you with two screens that you must dismiss with the push of a button before you get into the menu. Why, CD Projekt Red? Why? That is not the kind of a first impression you want. It makes for good variety in the introduction segment of my reviews, though 🤷.

(I later discovered that the first “screen” is an intro video. It just does not appear to be one in the first seconds. I am so used to games starting with a pointless screen to dismiss that I immediately canceled the video without knowing and landed on the actual screen to click away.)

Cyberpunk 2077 is coming to its second birthday, and the hype surrounding it and CD Projekt Red came crashing down hard on last generation’s Xbox One and PS4 consoles.

(Like the meteor wiping out all dinosaurs about 66 million years ago.)

CDPR has been very busy since then, and in February 2022, they finally released the next-gen update for current-gen (🙄) consoles. This finally incentivized me to purchase a copy for myself and see if this game is as good as it could have been without its many issues at launch. According to recent reports, I am not the only one doing so.

Unlike the Witcher games, CDPR decided to go with a first-person experience for a deeper immersion into the colorful yet dark and gritty world of Night City. The game’s art style is reminiscent of The Ascent, a twin-stick shooter I played last year. In contrast, Night City is a vast Open-World metropolis with a few rural places surrounding it. Geralt’s companion Roach has morphed into a car, and dirt roads and farm tracks have been paved over and are now asphalt. You can walk, drive, or use fast-travel stations spread across town to get around.

In its simplest form, you can reduce the combat system to be just a Shooter. Cyberpunk 2077 adds a couple more mechanics on top of that for more variety if you choose so. You can go the stealthy and non-lethal route or become a proficient hacker (aka Net-Runner). I am a simpleton, so my character is a tank that sh*ts bullets (although I also like to sneak when I can). Despite the options, from what I have seen, there is no way to play the game without ever firing a gun. Hacking is more than manipulating computers. It seems like everybody is somehow connected over an unprotected Wi-Fi, and you can utilize a person’s cyber implants against them. Ever heard of 2FA 😉?

CDPR has shown in The Witcher games that they are masters in storytelling. You can find the same mastery in Cyberpunk, which I was most interested in. You will meet many different characters with their own traits and agenda. There is a lot of action RPG stuff to do, a skill tree, an inventory – the typical Open-World role-playing experience, if you will.

Let’s get into the details, shall we?

Read More »

Why are Some Console Game Controls so Terrible?

One of the “PC Master Race” issues with console gaming is the controls. I certainly was among them, and the more I play on a console, the more I keep coming back to this topic. 2021 was the first year where I spent the majority of my time playing on an Xbox Series console. Everything I tried during that year was okay, or it was still new enough to me that I could not differentiate between good and bad controls. On the PlayStation, I only played Horizon Zero Dawn, and I found it to be one of the best controller input implementations out there. In 2022, I have played fewer games in total in about the same period. Still, a higher percentage of them frustrated me with their implementation of analog-stick movement to the point where I was about to give up or actually gave up playing the game.

Why is it so hard for some developers to figure out an enjoyable controller feeling? Am I the only one noticing this, or are long-time console players just used to it? Let me take a step back and explain.

Read More »

Horizon Forbidden West Review (PS4 Pro)

After a bit of “Bla Bla”, I opened my Horizon Zero Dawn review with the following statement.

Best. End-of-the-World Story. Ever.

In the later parts of the review, I summarized the overall experience like this.

Horizon Zero Dawn feels excellent. It is one of those games that makes you feel empty once you beat it and put down the controller.

Both quotes express an extremely high bar of quality that Forbidden West is going up against. I am delighted that Guerrilla Games did not disappoint and delivered an incredible sequel that improves the experience in almost every aspect. Aloy’s second adventure has a couple of downsides resulting from modern Open World side activity design. However, compared to the exceptional setpieces you encounter during the main missions and the core gameplay, these are minor gripes you might choose just to ignore.

Forbidden West ups the ante further regarding the elements that matter to me in a modern (action) adventure game. It will be a benchmark in storytelling, character, and mission design. Zero Dawn was already excellent when it came to cutscenes. Lacking were only the dialogue sequences with other characters. Forbidden West changes this dramatically, and it looks and feels so much more organic now. Other key gameplay elements have also improved, like overriding Tallnecks or exploring Cauldrons. But more on that later.

Lucky me, I did not have to wait five years to enjoy this game as I did with Zero Dawn. However, were I inclined to get the absolute best experience, I probably would still have to hold out that long. A PlayStation 5 continues to be unbelievably hard to come by in Germany. But not to worry, there was no need for me to get into a crouching position again and hide in the shadows while I watched somebody play on YouTube. Horizon Forbidden West still looks and plays great on the PS4 Pro. Keeping in tradition with my first Horizon review, I wrote the first words on April 23, 2022. I might actually get this review done before the year ends 😅.

Read More »

Horizon Zero Dawn Review (PS4 Pro)

Let me start this review with a big fat spoiler: Horizon Zero Dawn has one of the most beautiful worlds and world-lore ever conceived. The period that the authors cover is mind-blowing. Never has an apocalypse, the events that lead up to it, and what happened afterward been stretched so far apart as in Horizon Zero Dawn. It is called a post-post-apocalypse scenario for a reason.

Best. End-of-the-World Story. Ever.

There, I said it. Feels good. I had this one on my chest for a very long time while I was procrastinating instead of crafting this review as promised in My Year in Video Gaming 2021 story.

(Takes a deep breath <inhales> … <exhales> and starts from the beginning.)

As I start writing this review, February the 6th, 2022, Horizon Forbidden West is just around the corner. Five years earlier, also in February, Guerilla Games released a completely new franchise that became an immediate success. It was one of those games that are said to exist only on PlayStation – a narrative-driven single-player adventure with an incredible focus on detail, quality, and polish. My kind of jam. But there was a slight wrinkle, though. As a PC player that had no intention of purchasing any type of console, and Sony not yet being in the business of also releasing their flagship titles on PC meant there was no point in waiting for a port. What does a ravenous gamer do in such a situation? He carefully presses CTRL and sneaks into a dark corner, hiding and unable to be seen by other PC players. He then shamefully turns to a trusted YouTuber and watches the spectacle in absolute awe and with envious contempt for himself.

About five years later, the former greedy PC gamer has now turned to consoles for his fix. Consequently, it was about time to experience Horizon Zero Dawn for myself. I have raved about this masterpiece to my sister, and she ended up buying it but then sat on the PlayStation while it gathered dust. To satiate my hunger, one day, I grabbed my PS4 Pro in one hand, my sister in the other, tossed both in the trunk of my car, drove home, and we ended up enjoying the game together. Good things come to those who wait, and I have waited long.

(No PlayStations have been hurt in this depiction of events.)

Let me dive into the details in my usual manner and tell you what I liked about Horizon Zero Dawn and what elements were not so optimal.

Enter the review
Read More »

Simplify Spring Boot Access to Kubernetes Secrets Using Environment Variables

This blog post is a follow-up to a previous blog post titled “Simplify Spring Boot Access to Secrets Using Spring Cloud Kubernetes“. Despite the downsides I mentioned, I already hinted at a more straightforward solution that utilizes environment variables. The plan is to get everything into the Pod with as little configuration effort as possible.

So, I promised a twist, and here it is, thanks to one of my colleagues who pushed me in this direction. Kubernetes gives you yet another tool to handle Secrets in environment variables. This time, it is more convenient since you only point it to the complete Secret, not just a single value. Kubernetes will then make all key-value pairs available as individual environment variables.

Read More »

Simplify Spring Boot Access to Secrets Using Spring Cloud Kubernetes

This topic has its origin in how we manage Kubernetes Secrets at my workplace. We use Helm for deployments, and we must support several environments with their connection strings, passwords, and other settings. As a result, some things are a bit more complicated, and one of them is the access to Kubernetes Secrets from a Spring Boot application running in a Pod.

This blog post covers the following:

  1. How do you generally get Secrets into a Pod?
  2. How do we currently do it using Helm?
  3. How can it be improved with less configuration?
  4. Any gotchas? Of course, it is software.

I will explain a lot of rationales, so expect a substantial amount of prose between the (code) snippets.

Read More »

Apache Commons CLI Handling of –help

An odd thing about Commons CLI is that it has no built-in concept of a “–help” option. Other libraries, like JCommander do (which had other problems, or I would not have bothered with Commons CLI). As a result, you have to build it on your own. It is not enough to include it with all the other application options, especially if you use required arguments. Then it is impossible to only set the Help option.

You must implement a two-step process. See this demo application on GitHub that I created for another blog post. It shows this in action.

First, only parse for the Help option, and if it is present, print the help text and exit the application. To print the complete help text, you must add the other parameters first, though. Otherwise there would be only “–help”.

final var applicationOptions = example_2_Options();

final var options = example_2_Help();
final var cli = parser.parse(options, args, true);

if (cli.hasOption(help)) {
    // Append the actual options for printing to the command-line.
    applicationOptions.getOptions().forEach(options::addOption);
    new HelpFormatter().printHelp("external-config-commons-cli", options);
    return;
}

Second, if no help is requested, parse for the application options.

final var cli = parser.parse(applicationOptions, args, true);

applicationOptions.getOptions().forEach(opt -> {
    if (cli.hasOption(opt)) {
        System.out.printf("Found option %s with value %s%n",
                opt.getOpt(), cli.getOptionValue(opt));
    }
});

Thank you very much for reading. I hope this was helpful.