Now (not) playing: Dead Space (2023 remake)

Tags:

Dead Space (2023 remake)

[Dead Space logo]

I had played the original Dead Space (2008). The 2023 remake is a take-for-take remake. I felt it was too slow. The combination of slow gameplay and waiting through cutscenes again and again after dieing in combat, combined with the instability (3 crashes within 4 hours of play, on a Windows 10 machine) made me not want to slog through the game again.

The Game setup is always the same. You enter a dark room. Monsters spawn behind you. You kill them by cutting off their limbs. Sometimes you enter a lit room. But then the light goes out and monsters spawn behind you.

There is the occasional jump scare. The fates of the crew are told through text and audio logs. Sometimes there are cutscenes, which are OK, but sometimes there are cutscenes d or long dialogs uring missions, and ypu can't skip them.

I feel that Prey (2017) is more my avenue. It's not dark and there is far more game variety to the gameplay and the enemies.

Now playing: Little Nightmares 1,2 - Inside - Limbo

Tags:

During a dry spell of games, I found/rediscovered these.

I would name the game genre "slow puzzle side scroller", with dark "story" elements. The story is told purely by the environment, relying on the graphics artists and art direction. No dialogue happens.

The games are fairly short each, so I would not (and did not) buy them at full price. They are on sale for below 10€ , which is a. OK price for each. Little Nightmares III comes out in October 2025, and will start at a price of €30 . I think this is a bit much for expected 20 hours of entertainment.

Little Nightmares

Little Nightmares Logo

You move a fellow in a raincoat through parts of a ship, with monstrous sailors and passengers on it. Mostly the gameplay is jump-and-run.

Little Nightmares 2

Little Nightmares 2 Logo

You move another fellow through the country and through a city, and at the end fight a big bad end boss in three rounds. The gameplay is a bit more varied, with some lightbeam action to stop monsters from attacking you. I recommend playing the game with a controller, since I found it frustrating in parts with keyboard+mouse.

Limbo

Limbo Logo

Size-wise, the game is very small ( 300 MB ), but it is the first game of this kind that caught my eye. It follows a young person in their travel through a black and white wasteland/city/jump-and-run-scape with various puzzles and time challenges.

The last level is a jump and run level, while the levels before that are more like a walking game with some light jump and run parts.

The end (well, the two endings) is a bit unsatisfying as it shows no resolution to the story, but that doesn't detract from the game.

Inside

Inside Logo

The game is by the same studio as Limbo. You control a young boy on his way from a forest through a city, undersea and other scenes.

The gameplay is very varied, ranging from simple puzzles over interesting crowd mechanics to even complete changes in protagonists. The build-up for mechanics is more refined than in Limbo, which to me shows the experience gathered from the previous game.

The end is again without real resolution to the story, but that doesn't detract from the game.

SVG Animations and Live Reloading

Tags:

End result

Animated SVG

Why

For my video conference displays, I'd like to have a (subtly) animated background. Not too animated as to be distracting, but if you look close enough, you should be able to see that the background changes over time.

SVG animations

Instead of getting into Blender or ShaderToy, I decided to go with simple animated SVG. SVG has <animate> elements that allow me to specify how a single DOM node should animate over time.

In the end the background is just some Bezier curves morphing into another, and some CPU-gobbling filter effects for blur.

My goal is to create the illusion of waves travelling across the image by animating each path into the next one and having all these animations play in a loop. Here, only the second line is animated to animate into the third:

Static SVG

Workflow

I do the basic SVG editing in Inkscape, and luckily it keeps existing <animate> elements alive even if it does not know about them. Working in Inkscape makes it easy to get the layout of lines and trace existing images without having to guess the coordinates.

Inkscape does not display the animations, but that's fine, I add these later in a post-processing step.

<animate> tag

Static SVG

If all lines slowly animate into their next neighbour, this will create the intended illusion of lines flowing across the screen. The <animate> element is a good fit for my animation goal, with a small snag. There seems to be no easy way to tell SVG "animate from shape with id foo to id bar in 5 seconds". I can only describe "animate the shape of the element from this (explicit) path into another (explicit) path":

<path
 d="M 9.0454762,0 C -7.6337807,60.410349 -84.36489,310.51971 137.97241,386.67508..."
 id="line_009"
 ><animate
   attributeName="d"
   dur="20s"
   repeatCount="indefinite"
   keyTimes="0; 1"
   values="M 9.0454762,0 C -7.6337807,60.410349 -84.36489,310.51971 137.97241,386.67508...
           M parameters-of-next-line />
</path>

This animation between two paths is still workable, but I have to copy the path parameters into the animation parameters of each line and its preceding animation element whenever I change the shape of a line.

Perl

To update the paths in the animation elements, I wrote me a short Perl script that reads the XML, finds all lines that I want to animate, sorts them by X offset and adds an animation to them that animates the line into the next line:

my $dom = XML::LibXML->load_xml( location => 'lines.svg' );
my @lines = $dom->findnodes('//svg:*[@id="layer1"]//svg:path[@d]');

# Sort the lines
my %line_offset = map {
    0+$_ => $_->getAttribute( 'd' ) =~ /^\s*M\s*(-?[\d.]+),/i
} @lines;
@lines = sort {
    $line_offset{ 0+$a }
    <=>
    $line_offset{ 0+$b }
} @lines;

# Add animations
for my $i (0..$#lines-1) {
    my $line = $lines[ $i ];
    my $next = $lines[ $i+1 ];
    # Now, remove all animation nodes and other children:
    $line->removeChildNodes();

    my $ani = $dom->createElement('animate');
    $ani->setAttribute( 'attributeName' => 'd' );
    $ani->setAttribute( 'dur' => '20s' );
    $ani->setAttribute( 'repeatCount' => 'indefinite' );
    $ani->setAttribute( 'keyTimes' => '0; 1' );
    $ani->setAttribute( 'values' =>
        sprintf "%s; %s", $line->getAttribute('d'), $next->getAttribute('d') );
    $line->appendChild($ani);
}

open my $output, '>:raw', 'lines-animated.svg';
print $output $dom->toString;

Live reloading

I really prefer interactive tools when doing graphics, so to get away from manually reloading the SVG animation in the browser, I wanted live reloading of the browser tab whenever the file changed. Adding SVG support was a fairly simple addition to App::Mojo::AssetReloader, but work on that is not finished, as the animation resets on each reload. I need to think about how to preserve the current animation time. Likely this is "easily" done by saving the time from .getCurrentTime() and restoring it after reload via .setCurrentTime(). But then I also need to figure out how/when I want to reset the animation time to the start instead of keeping it.

Further ideas: WebMIDI integration / knob integration

Integrating the whole thing with WebMIDI would be fun for an all-in-one thing. Twisting a knob is so much more fun for adjusting animation parameters than manually editing a number via the keypad. I have MIDI and non-MIDI hardware though, so going a custom route is also interesting.

Review: Assassins Creed Origins

Tags:

Assassins Creed Origins

Assassins Creed Logo

I just finished playing Assassins Creed Origins ("the one in Egypt"). I've spent 40 hours on it, and the last 8 hours of that were a race to get the thing finished, because the story was Just Not Great.

The Good

The game looks gorgeous on an Nvidia 1080. It has great landscapes and the loading times are bearable. The in-game performance is great, and the sneaking/murdering gameplay is really fun. The other Assassins Creed game I played was Assassins Creed II, the one in Florence.

The Bad

The story. Oh god, it is bad. The story in the outer world is random filler, eating up loading time. The story in Egypt dredges on too long. It is about a failing marriage and two parents on a trip for revenge.

The gameplay in the open world is largely forgettable. There is little to discover and it is not fun to just ride around, discovering the landscape. The gameplay in fights is no fun either and most of the missions are not fun either. They take themselves mostly serious and there is no connection to the quest givers and their plight. Better writing could have helped there. The only good gameplay is the one you make for yourself by clearing out the military installations, sneaking around and killing people.

The world is large but boring. It is no fun to seek out (and potentially clear) all the question marks on the map.

The ugly

The game is connected to the UbiSoft launcher, even when you buy it through Steam. That launcher updates itself every time you launch it through Steam. It also requires a (burner) email address for launching the game.

The game is single-player but wants to be online all the time, to tell you about Assassins Creed Bucks and other microtransactions.

Now playing: Monster Train 2

Tags:

Monster Train 2

A fun strategic deck building game, Just like the first game. Different mechanics, different challenges. There is some kind of story.

The first Monster Train made me realize what people like about Magic the Gathering (the strategy and deck management) and does not have any of the downsides of Magic the Gathering (the lootbox money sink).

The story is nothing spectacular but has at least one good reveal.

On Monster Train I have 1.100 hours logged, so here's to another 1k hours .