Jimmy Breck-McKye

Developing opinions

The PSOne Crash Bandicoot games are beautiful in 4K

Modern emulator cores like BeetleHW allow you to play old-school PSOne games in new-school high resolution. Games that rely heavily on polygonal graphics, rather than textured graphics, benefit the most. And as a fan of the original Crash Bandicoot games my eyes just popped to see them brought to vivid life on a 4k, widescreen display.

Right click any image + open in new tab for a full sized view. Or view the gallery on imgur.

The real villain of Final Fantasy VIII is History Itself

Final Fantasy VIII is a curious one.

You play a group of teens at a high-school-cum-military academy who spend their days planning prom dates, riding hoverboards and munching hot dogs at the school cafeteria. They’re training to become elite special forces, but have no idea their school is really a front for a millennia-long war against a time-travelling sorceress who wants to destroy all existence.

It gets… strange. You are mortally wounded and impaled in the chest at the end of Disc 1, then awake apparently unharmed. Everyone grew up together in an orphanage but forgot due to Plot Convenient Amnesia (discussed once and then forgotten). You fight a T-Rex in the school gym.

VIII can be maddeningly vague. Just who is Ultimecia, the sorceress from the future, and what does she really want? It’s never satisfyingly explained, nor how the sorceresses came about. There seems to be a link between her and your love interest Rinoa - with tantalising clues and strange allusions - but it’s a lacuna, an absence, like so many elements of FFVIII’s lore.

But a recent replay changed my mind. In fact: I now think VIII is the smartest and most self aware of the whole series. It has its faults and some bad writing in parts, but I think there’s a way of looking at FFVIII that makes sense out of the game’s weirdness.

I think that if you look at FF8 as a story about stories - a metastory - a structure falls into place. Like the game’s own time travel loop, this structure is a paradox, collapsing and uncollapsing on itself indefinintely. VIII tells a story about stories so dangerous, it has to abandon its own story in disgust.

I want to show you the real strangeness of Final Fantasy VIII.

TypeScript: accessing members of a union type

If you write TypeScript day to day you probably use unions quite a bit. But have you ever found yourself writing a type and wanting to access the members of a union, be that one passed in as a type parameter, or defined elsewhere?

It’s not something that comes up a lot, but every so often it’s sorely missed. Like when you want two function parameters to follow the same ‘branch’ of a union.

Well, there’s a neat ‘trick’ involving conditional types that makes this easy.

Playing TimeSplitters: Future Perfect on PC

Like the TimeSplitters series? What if I told you it’s possible to play TimeSplitters 2 and Future Perfect on PC with mouse and keyboard support to boot? All you need is the Dolphin Gamecube emulator and a helpful controller plugin.

Modern JavaScript features you may have missed

Despite writing JavaScript almost every working day for the past seven years, I have to admit I don’t actually pay that much attention to ES language announcements. Major features like async/await and Proxies are one thing, but every year there’s a steady stream of small, incremental improvements that go under the radar for me, as there’s always something bigger to learn.

So in this post, I’ve collected some modern JS features that didn’t get much airtime when they first came out. Some of these are just quality of life improvements, but others are genuinely handy and can save whole swathes of code. Here are a few you might have missed:

Safer client-server interop with isomorphic TypeScript

One of the most common points of failures in web applications is client-server interop. A simple change in an upsteam API - renaming a field, changing its type, altering the way non-values are represented - can have catastrophic effects when the user renders the right UI component at exactly the wrong time.

Traditionally, web teams have tried to mitigate these risks with extensive inter-process integration tests. Termed ‘functional’ or ‘end to end’ tests, these automated checks usually spin up entire web browsers, databases and servers just to perform simple validations, provide feedback that is both slow and imprecise, are prone to false positives and have maintenance burdens of their own.

In my recent projects, however, I’ve found that isomorphic TypeScript types and interfaces, used with modern TypeScript features like type guards and predicates, can go a long way to providing much more lightweight validation that’s nearly as robust.