Wednesday, May 16, 2018


On Sunday morning, I woke up with a game idea stuck in my head; I spent a few hours with GameMaker over the course of the day, and by 9pm I had something I was happy enough with that I posted about it on Twitter. I'm never happy with my stuff enough to post about it on Twitter.

It's still full of other people's art assets and unlicensed fonts, and most of the code is borrowed from ShaunJS tutorials (but that's what they're for and anyway I used to work with him, so that's probably okay).

As I've worked on it over the last couple of days, and started thinking about how to make it a game rather than just a partially-implemented mechanic, I've come to realise that it's pretty much Nanaca Crash: the player has some limited control over the initial vector of their character's travel, and then it's basically just a case of seeing how far they can go.

I'd started to write about another GameMaker project I was working on earlier this year, but when it came to implementing the shooting mechanics I realised that I didn't want to make a game about shooting, so that's been canned until I figure out what the verb needs to be.

(This is still kind of violent, but it's very slapstick and only against your own character so I feel like that's okay.)

I'm close to getting all of the input mechanics finished - rather than Nanaca's single click-and-hold for both angle and power, I want to separate them into a hold for setting acceleration and some kind of Ouendan-type trigger for controlling angle (in progress). Initially these inputs were both controlled by the car object, but since I'm hoping to eventually have an upgrade system that would let you change the car, moving them into a separate launch controller took up most of today.

I'd dropped a basic sin() function in for setting the acceleration value - which worked for the proof of concept, but in practice the way it decelerated around the maximum value made it too easy to get the best distance reliably (in the absence of control over your launch angle).

acceleration_modifier = (1 + (sin(frames_held/period + 3*pi/2)))/2;

What I was after was a curve that would speed up as it got close to the maximum value, and bounced away just as quickly, making it much harder to hit the top every time. It was only when I drew out what I wanted that I realised that it's still basically just a sine wave, but with part of it inverted - which led me to

acceleration_modifier = 1 - abs(sin(frames_held/period + pi/2));

And now, onto the launch angle…

Friday, May 11, 2018

Where we were together

At first blush, there are not many obvious similarities between Say Sue Me's lazy winding surfgaze and Aimee Mann's more traditional indie pop, but listening to the Korean quartet's latest album, Where We Were Together, over the last few days, I can't help but feel like they're musical siblings, somehow.

When her most recent album, 2017's Mental Illness, was released I got quite annoyed by the reviews consistently describing Aimee Mann's output as "depressing". Although there's a deep melancholy to many of her songs (often disguised under a major key and an upbeat tempo), it's not accurate to say it's depressing; I've come to the conclusion that a more truthful description would be that it's depressed.

But at the same time, there's no sense of resignation or defeat - acceptance, maybe, but I've always found it somehow hopeful. It's the music of coping with your problems, of feeling sad or anxious or unloved but still picking yourself up and getting on with things - in a way I find helpful when my own subconscious threatens to overcrowd me.

I get that same sense from Where We Were Together: a reassurance that nothing is as insurmountable as our own demons would have us believe, that we're not as alone in our troubles as we often feel, and that there's light just around the corner.

Monday, April 02, 2018

Doki Doki Literature Club

Doki Doki Literature Club

Warning! Spoilers follow for Doki Doki Literature Club and The Beginner's Guide

There's a content warning at the start of Doki Doki Literature Club which is, on some level, a spoiler. It's not unusual for visual novels to touch on heavy subject matter, but to call attention to it before the title screen does stick out.

Up front, I feel like I need to say that this is a game worth playing, if you can get past the anime/VN presentation. I don't remember the last game that surprised me with its audacity this profoundly, let alone this often (and all in a package that I saw end-to-end in a little over four hours). Its density of ideas and the quality of its execution, within a medium that's uniquely suited to tell this story this way, is hugely impressive.

It will help if you have some familiarity with harem anime or other visual novels (both their general content and mechanics, even if you've not played any others; you've got to be willing to meet the genre halfway on its long periods of clicking through and reading dialogue). There are common tropes and archetypes it uses as shorthand - the childhood friend, the overly familiar upperclassman, the reluctant new club member - that not only make the opening 30 to 60 minutes much more efficient, but which set up expectations that can be exploited later.

I've been unpacking what the game means since I finished it earlier today, both its "message" and my interpretation of it, and the closest game I can think of, philosophically, is Davey Wreden's The Beginner's Guide - albeit coming from a radically different angle.

Last chance to turn back.

Wednesday, January 10, 2018

Isometrish: Automatic walls

Obviously, when you're building a game level (and especially if, like I hope to, you're building it procedurally), you can't spend ages making sure you've put the correct-facing wall object down at every part of the level, or fixing them every time you move a bit of floor around.

Well, you could, but wouldn't it be much better to just have a single wall object that could automatically detect which sides it needed to match to the neighbouring floor tiles?

Yes! And luckily, this is really easy to do!

There is some heavy lifting involved, though: you'll still need a sprite with a separate frame for each possible combination of walls - north on its own, east on its own, north and east together, south on its own, north and south together…

(If you want a shorter notation, you need 2n-1 sprites, where n is the number of sides you need to consider. For most cases, this'll be four, so you need 24-1, or 15 images - plus one with no walls.)

But how do you know which image to draw based on the combination of faces required? Binary!

Assign each face a binary number - for a square, this'll be 1 for North, 2 for East, 4 for South and 8 for West. The neat trick with binary numbers like this is, the sum of any subset of them is unique! Which means we just need to add up the numbers corresponding to each 'active' face, and that tells us which image to load.

In GameMaker Studio 2, sprites have subimages - this is most commonly used for animation frames, but we can also use it here to keep a collection of images together in a common object. You need to make sure the various subimages are added in the correct order (the easiest way to do this in GMS2, I found, was to save the images into a common folder numbered 1.png to 15.png, then use the 'Create sprite from image(s)' option).

A hideous example of a 16-frame wall sprite

Now that our sprite is set up, we can add the following to the object's create event:

iso_sprite = sWall;
var f = 0;
if (place_meeting(x, y - grid_size/2, oFloor)) f += 1;
if (place_meeting(x + grid_size/2, y, oFloor)) f += 2;
if (place_meeting(x, y + grid_size/2, oFloor)) f += 4;
if (place_meeting(x - grid_size/2, y, oFloor)) f += 8;
iso_subimg = f;

This checks the room for a floor on each side of our wall, and adds that face's value to the total, resulting in the correct subimage index that we need to draw, which is done in the draw event:

draw_sprite(iso_sprite, iso_subimg, screen_x, screen_y);

(In this example, screen_x and screen_y are the pre-converted grid-to-screen coordinates.)

And presto - a single wall object that you can drop into your room, which will automagically show the correct wall faces for any surrounding floor tiles!

Friday, January 05, 2018

Isometrish: Perspective

The top-down grid

Do you ever suddenly realise that you understand something that's been bugging you for days, and then find it impossible to see how you didn't get it in the first place?

GameMaker is great at 2D - side-scrolling and top-down games are a breeze to get working. There are dozens of video tutorials that can get you up and running with a platformer in fifteen minutes or less. But if you want to do anything slightly more complicated than that, well… time to do some maths.

Luckily for me - and you, if you're wanting to do this yourself - YellowAfterlife has a really good piece (aside from some confusing terminology) about translating grid coordinates to on-screen coordinates which, although it still took a lot of practical trial and error for me to really understand, gave me enough confidence to actually start trying things.

While drawing objects to the screen is the more technically challenging part of the process, it actually took me longer to understand moving around - even though it's really simple.

The short version is, I needed to realise that the character's not moving on the screen, but moving on a 2D plane (as if you're doing basic a top-down game); those 2D X and Y coordinates are then warped by a couple of simple functions to correspond to the on-screen, 'isometric' plane that's on the screen.

Basically, you don't need to care about the screen coordinates- the maths will take care of it for you! Just do your stuff as normal, and the maths around the drawing step takes care of the rest.

Mind: Blown

Which can use the exact same movement code I used in the top-down version, and results in this on the screen:

The screen

I had some other issues drawing things in the right place - like I said at the start, that's actually the technically complicated bit.

I'd assumed, incorrectly, that when you're drawing a sprite in code the X and Y coordinates you give it would be where it started drawing, with the top-left corner of the sprite. Turns out the origin you set in the Sprite window matters! For walls and floors to line up correctly, this means you need to set the origin in the same place on the 'floor', which took me some time to figure out (particularly since the sprites in the room editor aren't the same as the ones you'll see when playing).

I also hit some trouble with aspect ratios because my grid (and the isometric sprites) were larger than those used in YAL's example - and since I'm still not 100% on the maths involved it took a little bit of trial and error to iron that out. (Turns out you just need to calculate the ratio of the isometric tiles' dimensions to your grid squares'.)

The way GameMaker Studio 2 handles 'depth' for draw orders has changed slightly too, favouring its built-in layers which are, in practice, pretty incompatible with isometric drawing (but are still really handy for organising objects in the room editor). The documentation suggests you should still be able to arbitrarily assign depth to your objects, but in practice I found that doing so prevented them from rendering at all, until I added the following in an init script:

layer_force_draw_depth(true, 0);

So now I've got a map, and the ability to move around it! And, as it turns out, right through the walls…

Thursday, January 04, 2018


First rendering walls

Right, fuck it. I'm going to write about something that terrifies me: my own code projects.

About the only thing I've programmed 'publicly' is a 140-character random level generation script (in Ruby). I'd written it in JavaScript originally, but decided for no particular reason to try and shorten it until it fit in a tweet. (This was before tweet length got doubled.)

def l w,h;g=(1..h).map{[]};y=rand h;x=g[y][0]=0;(g[y][x]||=1;n=y+rand(-1..1);n>=0&&n<h&&g[n][x].nil?? y=n : x+=1)while x<w;g[y][x-1]=2;g;end

But I've started something a bit more ambitious: I'm trying to make a game. Or at least, most of a game's systems.

I worked at YoYo Games for over six years, and it's only since I left in November that I've really started to use the product, GameMaker. I've thrown together little proofs of concept - platformers, a tank driving thing, some experiments with shooters - but never really had a specific goal in mind.

Having something to aim for means having something to miss; it's easy to just try out hitscan shooting in a tiny demo level, but make a game?

I'm now a couple dozen man-hours into a clone of Crusader: No Remorse. I don't know how often, if ever, I'm going to write updates on my progress, but I want to try and get less defensive about my code, and exposing some of it to the air might help.

(It helps that I don't expect anyone to read this, though.)

I've been meaning to find something to make me blog more this year, and maybe this is it.

Sunday, December 17, 2017

Monday, December 11, 2017

Works Great

My game of the year for 2017, is a puzzle game which, on top of having no 'correct' solution at all to its puzzles, expects you to look at your own solution and say, "no - this still isn't good enough". Your first answer is almost always an inelegant, brute-force monster that gets the job done; over time - both looking at the field and in your moments away from it - you can tame it, turn the hammer into a scalpel by trimming its size, stripping its parts or reducing its movements to the bare minimum required to complete its very specific task.

My game of the year for 2017, surprising absolutely nobody who follows me on Twitter, is Opus Magnum.

Waterproof Sealant

There's a story to Opus Magnum, about a young alchemist working for a noble house, mostly insulated from its political troubles, but you don't need to click through its dialogues to start solving a puzzle - the conversations that tell the story are almost literally a sidebar next to the game interface. For most of the game I didn't realise there was a story; I was too busy jumping into the next challenge - or more often, back into the same challenge over and over again trying everything to shave a few precious cycles off my solution.

The game's presence on Twitter piqued my curiosity, as other players shared hypnotic, impenetrable gifs of machines whose inputs, operation and purpose were impossible to discern. I understood, at some level, that it was a programming game - the developer's pedigree includes SpaceChem and Infinifactory - but the brassy, steampunk aesthetic and the alchemical theme appealed to me immediately.

I'd also been playing around with code golf, an exercise in reducing an algorithm to the shortest number of characters necessary without inhibiting its function. (My favourite result is a random level generation script in 140 characters, which I'd been tweaking for nearly three months.) I didn't realise it until, out of curiosity - mostly about how these machines are made, and more importably controlled - I bought and loaded it up, but Opus Magnum is basically code golf the game.

When you've solved a puzzle, the game shows you three histograms, indicating where you sit on the bell curve in each of three metrics: the area required for your machine, the number of cycles it took to complete its goal, and the cost of the parts. None of this matters - there are usually several puzzles open at a time, completable in any order, and as soon as you've solved a challenge once it's checked off and you can move on.

Except, if you're the kind of person who'll finish one puzzle and move immediately on to the next, this might not be the game for you. Opus Magnum is about obsessively tweaking, refining, adjusting. My favourite times with the game have been rebuilding a machine from scratch because I'm convinced that I can improve it, only to discover that a minor miscalculation has made it three cycles worse.

What makes it work, as an experience, is its machines' predicability. Once I got to grips with the basics of the system, those gifs that had mesmerised me on social media took on a whole new meaning; I could appreciate the effort behind them, understand and adopt their ideas into my own efforts, transmuting strangers' engines and my own into something entirely new.

Alcohol Separation

Sunday, July 23, 2017

Take Your Heart

Take Your Heart

Persona 4 is, at its heart, a story about facing, coming to terms with and ultimately accepting the parts of yourself that you'd rather not, so that you can become a better person on the other side. Characters earning their persona is only the first step on that journey; they continue to work on accepting and overcoming their issues as the game progresses. Most of the character arcs in Persona 4 could be told without teenagers solving murders committed in an alternate dimension inside their televisions.

Persona 5 is about characters feeling like other people just don't "get" them. Also adults totally suck amirite? And in addition to being inextricably linked to the story, the cognitive "Palaces" aren't based on the psychology of your teammates (i.e., the people you should care about), but of your opponents.

I had to struggle to care about most of my confidants in P5; any S-Links I maxed out felt like obligations rather than relationships I wanted to pursue or that I just fell into. Persona 4 Golden's S-Links didn't universally have rewards - only your direct party members' links would benefit you outside of bonus fusion XP - but they were so natural and the characters interesting enough that I didn't need that carrot to drag me through.

This might be a function of where you start as P5's protagonist - a total outsider, even by "transfer student" standards, with rumours of a criminal record causing NPCs to hold you at arm's length (at least until you start building your party and the mumurings of anonymous classmates loses its impact). There aren't any club activities to draw you into social circles outside the party, at least until you start taking advantage of your teacher's part-time job or get involved in questionable medical experiments (for a reason I can no longer recall) - both of these older women are romanceable, though it's difficult to tell who's being exploited more in these troubling relationships.

Your progress with sidequests is constantly stymied by the game's refusal to let you just do things; there's a significant chunk in the middle of the game where it felt like Morgana wouldn't let me do anything with my evenings, leaving my S-Links and part-time jobs in limbo for no readily-apparent reason.

And the story employs an in media res device that is designed specifically to withhold information that your character knows from the player - all so that a plot twist, which didn't land anyway, can work on its most basic level. Which isn't even the only major disconnect between player and character knowledge - its obvious to the player from around the second dungeon who the big bad is, but your party continues to fumble their way towards their reveal frustratingly slowly over the next fifty hours of gameplay.

All of which is intensely frustrating because Persona 5 is, mechanically, light years ahead of its predecessor. While previous entries in the series used procedurally-generated dungeons, the Palaces in P5 are bespoke, crafted levels - which allows for more complicated puzzles and set-pieces that wouldn't have been possible in P4G's random mazes. (That these dungeons often outstay their welcome is another issue.) P5 has its cake and eats it, though, with the Mememtos labyrinth providing a randomized grinding playground as well - which also feeds into side-quests and the main plot at different points.

The battle system's been streamlined, they've added ranged weapons (and frankly, too many damage types), and allowed the chaining of attacks when you hit an enemy's weak point. If you Down all the enemies on the field, you can negotiate with one to get extra cash, take an item or add it to your Persona roster.

It's made me very excited to see where they evolve the series next (in about 2024, if there's a similar break as between 4 and 5), but as much as I'd like to see the end of some S-Links and subplots I didn't get to this time around (and want to date someone who's more interesting than Makoto turned out to be), I don't know if NG+ is all that tempting considering how tedious so much of the game can feel.

Friday, June 30, 2017

Tsuki ga Kirei

Image changed due to a DMCA takedown notice

Ten minutes and thirty-three seconds into Tsuki ga Kirei, I knew I was in love.

It was a wordless moment of such relatable teenage anxiety and bravado and posing. I felt my chest tighten for Koutarou as he switched his drink order from soda to coffee to impress a girl from school who happened to be at the same restaurant with her family. She probably didn't even notice, so absorbed in her own self-consciousness and terrified about what playground gossip would make of it if anyone found out they were there "together".

In its, at times naive, earnestness, Tsuki ga Kirei captures perfectly that sense of helplessness that floods your senses when you're thirteen and find yourself unexpectedly faced with the person you have a crush on.

It was a mild anxiety attack spread over twelve episodes, as I sat on the edge of my seat hoping that these two sweet, terrified and dumb-in-the-way-that-only-love-can-make-you kids would navigate through this emotional minefield to something like happiness on the other side.

Wednesday, June 28, 2017

Baby Driver, after

I can't believe it lived up to the hype.

Baby Driver opens with a car chase you've already seen most of in the trailers, but it's still glorious when viewed all in a single sequence. That 180-in-180-out - one of my two favorite stunts in the whole film (the other is the tire shredder) - is cut a fraction shorter than I'd have liked but there's probably a technical reason for that.

Edgar Wright gets a lot of credit - deservedly - for his rapid editing and propulsive montages, but Baby Driver also has some great long single-take(?) sequences. The action-packed opening chase is followed by a multi-minute shot tracking Baby as he buys coffee for his accomplices (I'm 99% sure I spotted a Pierce Brosnan cameo), and there are a couple of others that are just as confidently executed.

And Baby Driver also takes Wright well outside of his established comedy wheelhouse - there's palpable danger hanging in the air between Baby and [spoiler] late in the film. Shaun's finale had dramatic weight, but this is a whole other level. Which isn't to say that Baby Driver isn't funny in places, but you might be disappointed if you're expecting a Hot Fuzz-style comedy.

My pre-movie concerns about the employment of women in the film stand validated, though - they just don't have any real agency and in this day and age that's a poor state of affairs. Reviews have called Baby Driver a love letter to cinema and music but I'm a little frustrated Wright doesn't get as inventive narratively as he does visually. Enough remixes - give us an original composition!

Baby Driver is the best there is at what it does, but what it doesn't is impossible for me to ignore completely.

Baby Driver, before

Baby Driver

I'm writing this before I go to see Baby Driver (this should be posted just as it starts) because I want to get these ideas down before watching the film changes how I think about them.

I've rewatched all of Edgar Wright's feature output in the last fortnight, and even if I hadn't I'd be an easy target for Baby Driver. There's little doubt in my mind that he's the best action director working today (in the West certainly), and I've been on the edge of my seat for Baby Driver ever since the synopsis dropped.

But I'm very aware of my own hype for this film. I'm so caught up in the positive reviews - which I've not even read any of in detail, the buzz just feels inescapable - that I'm half waiting for the sword to fall and half imagining how and how much I'm going to be enthusing about after I've seen it. Hype is giving way to a cold animal fear that it can't live up to the rumbling positivity, and my brain is stuck on one particular angle.

All of Wright's films suffer from a dearth of strong women. The women in his films are almost all (or are they all?) sidekicks, or girlfriends, or girlfriends' mates, or maybe antagonists (but not the Big Bad). Baby Driver looks set to continue this trend, with the female lead both the protagonist's girlfriend and very probably a damsel in distress. She's even a waitress, for God's sake - basically movie shorthand for "I need a man to save me from my own existence".

Wright excels at employing tropes, but rarely subverts them (beyond transplanting American clichés to unprepared English idylls).

Is there a reason Baby has to be a guy? Couldn't Mozart in a gokart be a woman? I'm trying to think of something in the plot that would prevent a gender swap, but all I'm coming up with is that this is what the genre demands and that's just… not good enough.

Tuesday, June 20, 2017

Re:Creators - more complaints about 7/10 anime

In the first episode of Re:Creators, there's a great scene where Selesia, a light novel heroine from a fantasy/scifi world, fights teenage magical girl Mamika. Selesia challenges Mamika to consider how her claims of fighting for justice can sit next to the collateral damage (mostly caused by Mamika) that resulted from their battle. Coming from a kids' show, Mamika's fights have never endangered bystanders before - she's horrified. But the show doesn't go into the moral quandaries or ideological differences between the characters, and its disinterest in the inner lives of its cast ultimately damages the macro plot as well.

Re:Creator's fundamental flaw is that none of its characters seem to have any problem accepting the situation they've found themselves in.

But despite being pulled suddenly from her fictional reality into our world, Selesia never struggles to come to terms with the fact that her entire existence - every moment of joy or pain, every defeat and victory she's ever lived through - is an invention purely for entertainment. I need her to react to this somehow, but her unflappable heroism in the face of this revelation blows a hole in any believability her character could otherwise have had.

It's not that every character needs to have an existential crisis - Meteora's ability to absorb information almost by osmosis from the world around her means she's going to process the situation faster than others - but no matter how unflappable their fictional character bio says they are (there's a recurring excuse about "that's how I wrote her! ¯\_(ツ)_/¯"), there should be some stumbles. Only one member of the cast has a bone to pick with her creator, and even that's all but an afterthought.

In the most recent episode, Selesia has a conversation with the author of her novels about whether she would want to go back to her fictional world, but there's an unanswered - actually, unasked - question of whether she can, and what that could mean for the story. She's found out that she's a literal fantasy and it doesn't occur to the show that this proactive, brave warrior might want answers from the person who put her entire world in harms' way for his own interest.

At every turn, Re:Creators shies away from digging into any of the interesting questions that its own premise raises, and as a result the things that it does bother to put the effort in for - highly-dramatic battle sequences, mostly - are airless, rote affairs between characters I just can't find a way to care about.

Saturday, June 03, 2017

Love Tyrant and fanservice

Love Tyrant

Love Tyrant is a pretty generic, fundamentally unremarkable harem rom-com. Even its supernatural twist feels familiar, cribbing equally from Ah! My Goddess and (admittedly somewhat bizarrely) Death Note. I've given it a shot because a friend of mine wrote the dub script and on that front at least it does actually succeed at the comedy elements1.

I'd be enjoying it a lot more without the requisite fanservice, though.

It's not that I particularly mind fanservice - Lord knows you can't watch much anime if you have any serious aversion to rampant overuse of the male gaze, or improbably elastic breast physics (Love Tyrant makes the Gainax bounce look subtle). It's getting easier to avoid (in some genres more than others), but it still feels like there's a base level of objectification that these shows expect of themselves, that a viewer has to accept at the door.

What bothers me about Love Tyrant is that it acts like its fanservice is edgy and transgressive when really, fanservice is never either of those things. It's hard to be shocked or even surprised by this stuff - it's so… routine. Even the main character's over-the-top reactions are perfunctory, and not just in this show - it's a staple of the genre. It's tough to know who these guys are supposed to be a stand-in for, since it can be assumed that the intended audience is here for this stuff; their reaction isn't going to be one of panic.

It's minimally titillating, I suppose - in much the same way as nudity in 80s action movies. But at least there's an acknowledgement that Robocop and Total Recall's topless hookers are a relic of the past, and it's not deemed necessary to include similar "characters" in modern films the way anime continues to shove fanservice in.

Of course at some point I've got to accept that I'm not - and never was, and never will be - the target audience for this stuff. I'm not going to buy character goods, I'm not going to buy the DVD release - hell, I'm probably never going to learn any of the characters' names.

But there's still a gnawing disappointment that anime hasn't moved on from this, that the industry seemingly can't make a genuinely funny romantic comedy without stooping to raunchy tactics barely a level of respectability above a Carry On installment2.

1. Mild gay panic plot points aside, which can't really be the fault of any localisation effort unless they're willing to edit out entire shots from the visual part of the show. A complete remake could be condemned for retaining this stuff, but I've got a hard time criticising anime translators.

2. I'd maybe argue that B-gata H-kei is the exception that proves this rule, even though it still has its fair share of innuendo and bare skin. I'd give it a pass on that because it's a show about teenagers' obsessions with physical intimacy; fanservice is relevant not just to its characters, but to its point.

Sunday, May 28, 2017

Saga of Tanya the Evil


Tanya follows the wartime exploits of a nine-year-old military savant, rising through the ranks of a German-analogue Imperial army. Using her knowledge of our world history (Tanya is a salaryman, reincarnated as a girl in this alternate reality by a "god" when (s)he questioned this "Being X"'s divinity), our anti-heroine maneuvers her way to the rank of Major, commanding her own elite battalion of combat mages (yeah…).

But for all its window-dressing of trench warfare, there's little actual engagement with the grim reality of war. Tanya's sociopathy is a central part of her character, but it's rarely given a real-world display. She and her mages sit literally above the regular infantry, invulnerable to regular arms and detached from much of the day-to-day hardship. It could be a side-effect of the 12-episode run time, but there's very little down-time in which to show off just how detached Tanya is from the average soldier.

Her entire battalion, in fact, quickly adopts her gung-ho attitude and they offer slim opportunities to highlight how "evil" Tanya supposedly is. Second Lieutenant Serebryakov has a sunny, positive disposition that remains unchanged by Tanya's brutal training regime and psychopathic dedication to the extermination of her enemies. If there was ever the intent to make a point about how war changes people, the opportunity appears to have sailed past the writers, unnoticed. And her battalion makes it through every fight largely unscathed, when the occasional sudden fatality could drive a wedge between the indifferent commander and her troops.

Another recurring theme is Tanya's atheism - in the face of an entity which has proven itself to be omnipotent - versus her magic's reliance on prayer to a higher power. There's potential here for deeper character work, but it's never delivered. Every few episodes it comes up, in many cases unremarked upon, but is quickly forgotten until the next reminder.

Which is all a bit disappointing - Tanya is a great character. Self-reliant, unnaturally clever and utterly devious, with the dangerous addition of a short temper and unreasonably high standards. Her quick-wittedness is a hindrance as much as it's a benefit - her need to demonstrate her high intellect to a superior officer leads directly to her appointment at the head of a front-line battalion, in direct opposition to her goal of remaining as far from the war as possible. She's a lethal fighter and superior tactician, with a confidence bordering on recklessness in battle.

If it wasn't for the dub, I doubt I'd have finished this show. I've always found it easier to watch a show without also having to read it, so the various shortcomings of a given series are less of a hurdle in English. It's a solid if largely by-the-numbers effort, as is the series as a whole, but Monica Rial's performance as the eponymous lead is about as fun as an alternate-reality First World War could ever reasonably expect.

It's just such a shame the rest of the show never really does her justice.