Fanfiction – Rosemary, for Remembrance

Continuing with my efforts to keep things high-quality and varied, this week’s choice is a Stargate: Atlantis fic with a frustratingly rare degree of emotional depth:

Rosemary, for Remembrance by Mhalachai

This completed story starts out with a light, amusing “crisis of the episode” feel to it, then develops into a full-blown mystery, finally adding in a thread of romance with a bittersweet undertone to it, and then ends with, quite literally, “Something like a happy ending”… all in only 21,900-words and without allowing the new threads to push out the old ones. I only wish more fanfiction had this kind of ambition.

I forget how many times I’ve said this but, for anyone new to my blog: I’m quite picky. If I give something a high rating, give it a chance before you judge it on its keywords. (Most of the time, I find attempts at romance in fanfiction to be annoying distractions from the stuff that actually works… it works here. Normally, I find slashy stuff to be immersion-breaking masturbation fodder written by teen girls… the “sort of Sheppard/McKay” pairing works here.)

The summary does a pretty good job of explaining the starting situation, so I’ll just quote it.

And then there was the time John Sheppard turned into a girl and no one thought it was strange but Rodney McKay.

It sounds like the intro to so many of the cheaper, junkier entries which are sitting in the “once I implement filtering” queue for my gender-bending fiction index… but introductions can be deceiving. Just as the summary is overly simplistic, so too is McKay’s first impression of the situation.

As you might suspect, the first aspect  introduced is the mystery: “What the heck is going on?”

However, this is another one of those stories where it’s hard to go into detail without spoiling how the mystery unfolds. Aside from what the mystery is, and who the romance is between, all I really feel safe revealing is the theme hinted at by the title itself:

What would you give to bring back a lost loved one?

Apart from the emotional nuance surrounding that, I love the witty interactions between McKay and Sheppard and the way Mhalachai makes good use of time-skips and well-chosen pacing to keep things fast moving without feeling rushed.

Relatively short but no less sweet for it, I’m very surprised to see that this fic never placed in the “non-Buffy fic” category for the Twisting the Hellmouth community awards. It’s a beautiful example of novella-length fanfiction better than some published works I’ve read.

This was my third time re-reading it and I give it a solid 5.0 out of 5. Even if you don’t watch Stargate: Atlantis, I still recommend giving this a read.

Posted in Fanfiction | Leave a comment

Tip: Removing Stickers (And Marker) From A Book

Updated 2017-12-22: Added mention of lighter fluid’s use in lifting marker ink that doesn’t respond to isopropyl alcohol.

Here’s a little trick I picked up after watching a store clerk do it.

Step 1: Removing the Label (or Marker)

The secret to removing a label from a book without damaging the book or tearing the label is… lighter fluid.

Put few drops on the label and spread it around. Don’t worry if a little gets on the book itself. I’ve tried this even with non-glossy covers and it caused no permanent harm.

Give it a couple of seconds to soak in, then carefully pick at a corner of the label and slowly peel it up.

The lighter fluid attacks the adhesive without significantly weakening the paper, allowing you to peel up the sticker in one piece, and the discoloration you might see on the book itself will go away completely as the highly volatile lighter fluid evaporates.

(On a non-glossy book, where the entire surface of the “stain” is exposed to the air, it should be gone in under 5 minutes. On a glossy book where some got in through a nick in the gloss or at the edge of the cover, it’ll take significantly longer.)

Also, the label on my can of lighter fluid does mention that it will lift “solvent-based inks” and I recently received a glossy book where the silver permanent marker on the cover wouldn’t lift under the influence of rubbing alcohol.  A couple of drops of lighter fluid and a piece of tissue could buff it right off.

Step 2: Removing the Residue

Now, you’re left with sticker residue on your book and, since it might not be a glossy book, you don’t want to use a gunk remover which could stain the book.

You can carefully roll most if it up into a ball and then pull it off, but that’s not going to get your book clean in any reasonable amount of time.

For a glossy book, you can gently rub the lighter fluid on the residue until it’s all released, but I’ve never tried using it on a non-glossy book. Either way, here’s an alternative:

Secret ingredient #2: “Invisible Tape” (ie. Frosted Scotch/Sellotape)

If you’ve ever experimented with the different kinds of clear plastic tape, you might have noticed that the adhesive on the frosted tape meant to blend in on paper is significantly weaker than on the crystal clear “Transparent” stuff.

It’s actually so weak that it’s easy to peel off paper without harming it if you can get a peel started without damaging the edge of the paper and that’s the trick: Contact adhesives love to bond to other contact adhesives.

Wrap a loop of the frosted stuff around your finger and repeatedly press-and-pull on the sticker residue until the tape gets exhausted. Depending on how large the sticker was, you may need to switch to a new piece of tape one or more times to get all of the residue up.

As an alternative, if your book cover is glossy and the coating is unbroken, you can also use one of the “home-made Goo Gone™” recipes floating around the ‘net, made from baking soda (as a gentle abrasive) and vegetable oil (to keep the gunk from re-adhering as it lifts). I haven’t tried it yet, but I’m told that Goo Gone’s active ingredient is one of the components of orange oil, so it may be possible to make the homemade stuff with that to rely less on the “scrub with baking soda” aspect.

Verdict

I’ve tried both approaches to step 2 and was perfectly satisfied with each.

A week or two ago, I used lighter fluid and home-made Goo Gone to remove a strongly-adhered barcode sticker from a copy of Programming Windows 3.1 by Charles Petzold, which has a pure white, glossy cover and it now looks brand new. (I just had to wait longer for the lighter fluid to evaporate after I accidentally let some reach the edge of the gloss and soak in under it.)

Today, I used lighter fluid and invisible tape to remove another barcode sticker from a copy of Microsoft Windows Resource Kit for Operating System Version 3.1, which has a pure white, matte cover that could have been torn by the adhesive if I removed it dry. It also looks brand new despite the lighter fluid initially producing a “big beautiful stain” around the sticker. (Though I did choose to roll up and lift the lion’s share of the adhesive residue with my fingers to reduce the amount of tape I needed to use to lift it all.)

UPDATE: If you’ve got something more stubborn, like a security sticker, and it’s on something more robust, like a glossy-finished video game box, check out the techniques used by Clint from Lazy Game Reviews. (Also includes instructions for building replacement structural support for flimsy game boxes.)

Posted in Geek Stuff | Leave a comment

USB RFID Reader on Linux: Proof of Concept

This morning, I realized that I’d never really done anything with the cheap Chinese USB RFID reader I picked up ages ago, so I decided to whip up a little proof of concept for practice: A mock timeclock for tracking worker presence.

To accomplish this, I’ll need several tweaks to how it functions:

  1. Working around the fact that all of my demonstration RFID tokens have their values printed on them for all to see.
  2. Ignoring incomplete input on the virtual keyboard it exposes
  3. Debouncing input, since the reader isn’t good enough at that
  4. Preventing it from typing junk into arbitrary applications in my GUI
  5. Some way to distingush check-in from check-out

1. Obscuring RFID IDs

In order to make it more difficult for a casual exploiter to just manually enter the ID somewhere, I found that one of the DIP switches on the back of my reader changes the interpretation of the token’s ID into something not visibly related to what was printed on it. Not perfect, but definitely good enough to prevent casual meddling.

(I have no idea what the actual difference is, since I can’t read Chinese.)

2. Guarding Against Incomplete Data

There are two ways in which one of these RFID readers can produce bad data:

The reader can misread the token

This isn’t a huge problem, since I’ve only managed to trigger it as the first scan after I’ve fiddled with the DIP switches while it’s powered… but it’s easy to guard against:

Just check that the received token ID is the expected length.

Something can go wrong between the reader and the software

To guard against this, I fiddled with the DIP switches further and found a mode which inserts a semicolon before the token ID and a question mark after.

This allows me to set up the following mappings for raw keypress events:

  • KEY_SEMICOLON: Clear the buffer
  • KEY_#: Add the typed character to the buffer
  • KEY_SLASH: Process the buffer’s contents and then clear it
  • Everything else: Ignore it

Thus, any incomplete read will be prevented from polluting a future swipe and causing it to fail the length check.

3. Debouncing Input

Anyone who’s played around with an Arduino will be familiar with the need to debounce the signal from a pushbutton, but cheap Chinese RFID readers occasionally suffer from this too.

If you swipe the card in just the wrong way, it’ll register twice in rapid succession.

The simple solution is to store the timestamp of the last registered event for a given ID  and require that a grace period have passed before any new scans will register.

(I chose 3 seconds since that seems like a nice balance between allowing quick testing and preventing the reader from getting confused by any especially sloppy token-waving a novice user might do.)

4. Claiming the Device Exclusively

This was actually the simplest part. All I had to do was add a udev rule to allow unprivileged users to open the evdev node for the reader and then use python-evdev to interface with the device. The InputDevice.grab() method will send EVIOCGRAB to exclusively claim it.

(If you’re familiar with X11 development, think XGrabKeyboard, but for only one device.)

5. Indicator Tones

Given that this is intended to run in the background and be as effortless as possible, tones to distinguish “check in” from “check out” seem the most unobtrusive solution.

I googled up some of the simplest possible example code for generating tones on Linux without additional dependencies and put together a couple of two-tone sequences using the same low-high and high-low patterns everyone is familiar with from the Windows “device inserted” and “device removed” notifications.

Putting It All Together

So, with all that said, let me show you some code.

The following GitHub Gist has been tested under Python 2.7 and 3.4 and requires the evdev package (available as python-evdev or python3-evdev on Debian-family distros).

Posted in Geek Stuff | Leave a comment

Another Tangent: Degrees of Connectedness

NOTE: Given the amount of time and effort I’ve put into finding good example links for this, I decided it would be acceptable to let it double as this week’s fanfic roundup.

While I was reading The Futile Facade (the sequel to The Pureblood Pretense, which I’ve reviewed), I started thinking about how murkybluematter handles making references to Tamora Pierce’s The Lioness Quartet.

In doing so, I realized that there exist four basic ways in which two stories can be connected. From strongest to weakest, those are:

  1. Crossover
  2. Fusion
  3. Abstract/Meta-Narrative Reference
  4. Direct Reference

NOTE: As with pretty much anything involving classifying fiction, the boundaries between these categories and subcategories can get pretty blurry.

Crossover

Anyone with more than a passing interest in fanfiction or comic books will be familiar with this technique. In essence, a story is written where two universes, formerly considered separate, are brought into contact.

As I’ve read a lot of Ranma ½ crossover fanfiction, I’ll use it for most of my examples here.

The key to this approach is that your readers must feel as if these are the canon characters rather than alternative versions. (ie. That the only alternate universe in play is the one the fanfic itself unavoidably creates and its characters were canonical up to that point.)

That said, some fudging of the dates is generally allowed as long as it doesn’t have a significant effect on the story. For example, it’s not uncommon to nudge the Ranma ½ series forward a decade or two in order to make it match up with a series where technology is more important. (Aside from the occasional brief glimpse of a TV or other electronic gizmo and one episode where a Super Famicom is seen, Ranma ½ does a very good job of making itself fairly timeless by making the technology level irrelevant to the story.)

Common ways to bridge series together include:

“Never Separate To Begin With”

This technique involves revealing that stories were in the same setting to begin with by answering the question “If they were the same setting all along, why did the two casts or rule sets never bump into each other?”

This is a popular technique for crossing together anime/manga series because of several facets foreigners see in Japan: Tokyo is huge, Japanese culture is quite reserved in person, and their TV shows tend to be very… not reserved. This disconnect makes it easy for westerners to imagine all contemporary anime and manga take place in the same “anime Japan” universe, ignorant of each other as each part of Tokyo tries desperately to pretend they’re “as normal as” the other parts. (It also helps that Japanese culture tends to impart shared tonal and stylistic elements to their stories which make them seem much more similar to each other than to foreign works in the same genres.)

There are too many examples of doing this without fudged dates for me to just pick one off the top of my head, but an example of doing this with fudged dates would be the Ranma ½ – Sword Art Online crossover Saotome Art Online by Ozzallos where the Ranma ½ timeline is bumped forward to match SAO. With that done, Ranma “gets caught up in a mess, as usual” as a result of doing motion capture and testing to pay off some money he owes to Nabiki Tendo.

This doesn’t include stories where technological hand-waving is necessary to bridge some kind of gulf of time or space. That’s covered further down.

“Never Separate To Begin With” by way of Unreliable Narrator

This trick merits its own category because of how it doesn’t really fit with either of its neighbouring classes and typically involves having two Earths in the same setting without resorting to alternate universes.

In my experience, it most commonly crops up in Star Trek because it’s canonical that an advanced species known as the Preservers are responsible for all the human populations on terraformed worlds that Kirk and his crew encountered and it boils down to making the “Earth” with a more provincial view of the universe into an unknowing copy of the original Earth.

Examples of this include:

  • Depending on how you look at it, pretty much every Battlestar Galactica crossover I’ve reviewed could fit this category. It just doesn’t feel like a full-on fusion to replace the unsatisfying “we are descendants of the Galactica fleet” ending with the Lords of Kobol (be they Alteran, Preserver, or something else), as having established Kobol by taking humans from the original Earth. (The Phoenix and the Wolverine even casts the Cylon Earth as being a world near the real Earth which was too irradiated for Kirk-era technology to allow an investigative team.)
  • Reaper’s Origin by prometheus55 initially gets the SSV Normandy into the Stargate universe via “glitches in poorly understood high technology are magic” but eventually retroactively bridges the gap in a technological way fitting for Stargate canon. Specifically, by revealing that the Furlings were refugees of the civilization that built the Reapers who fled interdimensionally rather than intergalactically like the Ancients. (This story was written before Mass Effect 3 and, to be honest, I think I prefer this Reaper backstory.)
  • A Thin Veneer by AlbertG has the Federation discover the Babylon 5 setting (and its anomalously accurate copy of Earth) when some politicking among the more advanced species of Trek and B5 canon allows a Federation ship to access one of the Preservers’ “warp superhighways”.
  • Someone Just Like Me by IdiAmeanDada introduces Data from Star Trek: The Next Generation to Chi from Chobits by casting the latter as taking place among a near-human-looking species which actually does have anime-style “rainbow hair”. For better or for worse, it chooses to simplify the task of making things believable by having them wipe themselves out with neutron bombs only a few years before the Enterprise comes to evaluate their suitability for contact. (Though, it does foreshadow a “not as thoroughly extinct as initially believed” situation, should the author ever come back to it.)
  • The Dresden Fillies: Strange Friends by psychicscubadiver is a My Little Pony crossover where canon Equestria is reachable from the Nevernever and manages to survive within the Dresdenverse because Celestia and Luna are beings on par with the Fae queens and put a lot of time and effort into wards in the Nevernever to keep it safe and hidden.
  • Mercury’s World by Fire places the Sailor Moon setting inside The Matrix, with Sailor Mercury being the first successful result of a program to breed humans who can act as living magical reactors in the real world.

I’ve also seen it done in Stargate: A New Era by DN7 and Stargate Mass Effect by InHuman Englishman, where it’s discovered that, while the Stargate Network and the Mass Relay network appear to overlap in a typical 2D projection of the galaxy, they actually exist in separate slices of the galaxy when viewed edge-on, with the stargates and the mass relays occupying separate layers of the galaxy.

First contact then occurs when the SG-1 cast find the time and resources to investigate gateless regions.

Advanced Technology or Magic

If your two source settings are unequivocally separate, then the next choice is to find some way to bridge the distance. Examples of this include:

  • A character has cancer and is placed in experimental cryo-stasis until he can be cured… a clerical error leads to him waking up much later than necessary and on another planet. (This is actually the solution a friend and I chose for a fic we still hope to complete and release some day.)
  • An accident with some kind of time-travel or faster-than-light travel technology (or a run-in with a spatial anomaly in an unmapped region) allows two groups to come into contact who normally wouldn’t. (This is andrewjameswilliams‘s favourite method for crossing together different sci-fi settings.)
  • Like the previous example, but with wild magic. (This is the road taken to make it plausible for two very insular settings on opposite sides of the world to come into contact in The Girl Who Loved, by Darth Drafter. Harry feels such shock and revulsion at Dumbledore telling him that the solution to defeating Voldemort is mpreg with Snape, that a burst of accidental magic sends him Jusenkyo, China… speaking of which, it’s a good fic if you ignore the sort of “successful parody of bad fanfiction… but by accident” feel to Dumbledore at first.)
  • Characters could be reincarnated, cloned from a recorded memory, or otherwise mentally transferred into another setting. For example:

Note that none of this automatically resolves the need to reconcile differences in mood/atmosphere/tone between very different settings. (such as western fiction and Japanese fiction.) This is why it’s so rare to see, for example, a good story that crosses Harry Potter with anime.

Fusion

When you have to “nudge things” too far for a setting to be believable canon, you’ve moved into the realm of “fusions”. A fusion is a “same setting all along” story which uses canon characters or settings in recognizable forms, but rewrites their backstories enough to remove the disconnect.

A mild example of this which a skilled author may write in the fuzzy area between crossovers and fusions would be a Harry Potter – The Dresden Files crossover where the “wand wizards” have managed to carve out a little patch of innocence and safety for their children and civilians in the much grimmer, more consequential setting Harry Dresden knows.

In this case, the “fuzzy area” is defined by two things: What “canon” means  to each individual reader and how much skill the author can bring to bear. The more engaged the reader is, the more likely they’ll ignore or excuse changes necessary to bring the settings together.

I enjoy these mild forms of fusion when done well, since they preserve enough of the familiarity for the story to still be riding on the effort of the source material.

A more serious example which can be nothing but a fusion (which I’ve also seen in practice) would be to move recognizable characters from “anime Japan” to the far-future, desert planet “Gunsmoke” where Trigun takes place.

In such a case, it’s simply not practical to bring the canon characters there. Even if you can justify using technology to put them in stasis or bring them in from a parallel universe without it feeling contrived, you still have to use what “suspension of disbelief” you haven’t spent on trying to bridge the differences in atmosphere, tone, and mood between the two stories.

In this case, the fusion is accomplished by rewriting character backstories so that they’re “native” characters by origin, but still match the original characters in every significant attribute.

Personally, I’m not a fan of the latter case for two reasons:

First, when I start reading a fanfic, my interest is in taking known characters, introducing one change (the “divergence event” which starts off the story) and seeing how that changes them.

From that perspective, a fused-in character comes across as “harmful author laziness” because they exceed my ability to compensate for the differences. They’re unavoidably too different to be equivalent to their canon selves, but not original enough to hold my interest on their own merits. (It certainly doesn’t help that 99%+ of the stories I read lack characters who can stand fully on their own merits.)

Second, humans instinctively perceive things as having an identity imparted by their history. This is why a perfect forgery is not valued as highly as a copy made by the original artist, and one of the reasons we recoil at the idea of technologically reprocessing human waste into food rather than spreading it on a field where we don’t perceive the fertilizer as “becoming” the food.

(No matter how similar a fused-in character is, we can never forget that they aren’t the original.)

This is probably why I rarely find fusions written by good authors outside the fuzzy crossover-fusion border region. When you know enough to see the problem, you tend to find an easier way to accomplish your goals rather than burning effort on forcing it to work.

Also, I apologize for not having example hyperlinks for these. Despite a quick examination of the HP-Dresden crossover category on Fanfiction.net over the last couple of weeks, I failed to re-locate the mentioned fusion within the time available to me. As for the Trigun-AnimeJapan fusion, my memory of that detail is too disconnected from the greater story for me to remember anything searchable.

Abstract/Meta-Narrative Reference

Now, we come to the type which inspired this entire post.

The key to making a really good reference is to make something that’s recognizable, yet doesn’t detract from the story as a whole. (eg. by hurting the immersiveness of the setting)

Basically, it should be something so in-character that you only recognize it as a reference because you have extra information which is external to the setting. (eg. If you have one of your characters say the catchphrase of a character from a series that inspired yours, it has to be perfectly reasonable within the universe… not just because you (the author) are trying to say “wink, wink, nudge, nudge.” (While not as bad as breaking the fourth wall, it has the same kind of problem. Having a character say or do something noticeably out of the ordinary to make a reference, without sufficient justification, reminds people of “the man behind the curtain” (you).)

If you really want to focus on immersiveness and leave people impressed at your ability to weave a tale, then the best approach is to make your references an emergent property of the larger narrative, rather than small, self-contained things that don’t require much pre-planning.

As I mentioned at the start, the best example I’ve seen of this in fanfiction is murkybluematter‘s excellent series of stories which recasts the concept of Tamora Pierce’s The Lioness Quartet in the context of the Harry Potter series. (and, again, here’s my review of the first one.)

For example, in “The Futile Facade” (equivalent to Harry Potter, Book 4), when Leo (the youthful “king of the court of rogues” in Knockturn Alley) says “Besides, I’ve already got my eye on a lass, and something tells me honesty isn’t high on her priority list.”, it makes it clear that his attraction to the heroine isn’t merely one of curiosity or friendship.

It’s so perfectly in character to the story that there’s nothing to complain about, but we know that this story is recasting the concept of Tamora Pierce’s Song of the Lioness Quartet in a Harry Potter setting, and that, in those books, Alanna wound up married to her friend George Cooper, also a youthful king of thieves who wound up becoming a baron.

Because of that, a perfectly reasonable, in-character statement within the story takes on extra meaning for readers who remember how the source material progressed. (And murkybluematter has filled the series with that kind of elegant use of referential re-interpretation. The plot and characters don’t feel derivative beyond what is necessitated by it being an AU… and every time you recognize a reference, the forethought necessary to make it feel natural leaves a pleasant sense of “I’ve discovered an easter egg” rather than a shallow “Yep. I recognize that.”)

…and, importantly for the immersiveness, Leo and George aren’t the same name, nor do they meet the heroine in the same way, because either of those would be too blatant a coincidence.

murkybluematter’s approach produces an engaging story that feels original, but draws attention to the commonalities at points when it’s especially effective. (After all, as the oft-quoted maxim says, there are only 7 stories that everyone keeps rewriting.)

…now, admittedly, no technique is perfect. The flaw to this approach is that, the more familiar the reader is with the source materials (eg. the more recently they read them), the more difficult it is to keep your story from feeling predictable. murkybluematter resolves this problem by making the story thick with original details which help to induce a “can’t see forest for the trees” effect. You’re too busy getting caught up in the events which *aren’t* references to see the references as evidence of a predictable story or, really, even to notice then until they’re on top of you.

Direct Reference

Finally, we come to the most disconnected option. A story can simply make an isolated reference to another story, be it a catchphrase, character cameo, or some other minor nod.

The problem with this approach is that, ideally, every element in a story should improve the whole, and it’s surprisingly difficult to make a one-off reference satisfy that constraint for two reasons:

  1. The whole point of good writing is to build up a world, and a blatant reference to another story detracts from the atmosphere-building by reminding the reader that the story is an illusion crafted by “[the] man behind the curtain” (you).
  2. It takes quite a bit of skill (or luck) to make such a concrete reference subtle enough to feel truly natural, yet overt enough to not be missed by people who recognize what is being referenced.

Generally, the best solution is to employ one or both of the following tricks:

  • If your story’s primary purpose is comedy, then you can get away with more that would normally break immersion as long as your reference really does elicit a laugh… since the comedy more or less is the atmosphere you’re building.
  • If the work being referenced believably exists within your setting, then your characters can be referencing the in-universe version, rather than the real-life version. Examples of this latter case include:
    • A Harry Potter fic I read in which the nearby muggleborns find it inordinately funny when Draco Malfoy, having never heard of James Bond, introduces himself as “Malfoy. Draco Malfoy.”
    • A Harry Potter comedy fic I may have read or may have just envisioned where Harry makes use of a summoned Rabbit of Caerbannog to deal with the dragon in the first task and, again, only the muggleborns get the joke.

As for a more concrete example of a well-done reference, here’s one of Harry Dresden’s thoughts after winding up in Harry Potter’s body in A Wizard Named Harry by Bugz-Toon:

Of course, that didn’t mean that I was going to just sit back and watch the show. As good as Dumbledore was, backup never hurt. And besides all that, if I was somehow fated to be the one to bring Voldemort down, I was going to do my damnedest to make sure it was as unfair a fight as possible. Up to and including arranging for an anvil to be suspended above a big painted ‘X’ on the pavement, if possible. Although I might skip the birdseed part of that one- it was possible to overdo the Wile E. Coyote, suuuuuper genius thing, after all.

…or, even better, this delightful Philosoraptor reference from Harry Leferts’s The Scaly Raptor:

Now that got a laugh out of Owen as he shook his head. “Well, it is unexpected you know… but why not? I got time to kill after all.”

That caused him to get blank looks from the raptors before they looked at each other. Then Charlie reached up with one claw and scratched the bottom of her jaw like she had learned to after copying some of the various handlers. “{How does one kill time? Time not have body to kill nor blood to spill?}”

In reply, Blue scoffed. “{Just Alpha being stupid with saying stupid confusing things.}”

The key being that, if a reader doesn’t recognize the reference, it should fit in as seamlessly as possible and the biggest advantage of this type of reference is that it can also be used in non-fiction.

Posted in Fanfiction, Writing | Leave a comment

Fanfiction – “Harry Potter, the accidental ‘evil'” fics

This week, something that just barely qualifies as a list: Two fics where Harry Potter gets mistaken for a demon or other non-human horror to some degree or other.

(Sadly, no other such fics were noteworthy enough for me to remember them… though, if you don’t mind broadening the scope to other fandoms, The Dark Lords of Nerima is also fun.)

Anyway, let’s get going:

Fallen by ForgerOfLies
Length: 36,394 Words
Crossover: Buffy the Vampire Slayer
Status: Incomplete
When Harry Potter falls into an unaging coma for 68 years after vanquising Voldemort, he wakes up to discover that he gained a few new titles from his final battle including “Harry the Lightbringer”… but fate isn’t done with him yet. Not long after waking up, a hole in time and space opens up below his feet at a ministry ball.

Meanwhile, in Sunnydale, California, a demon tries to summon someone beyond what the Powers That Be or Glorificus can counter: The Morningstar. …he gets Harry instead.

What proceeds to unfold is a comedy of mistaken identity and misread clues. (And, of course, there’s an unhelpful prophecy about him because it wouldn’t be Harry Potter otherwise.)

I especially like the decision to flesh out the joke by having Harry and Dawn Summers bonding over how much they hate shrewd old men shaping their destinies for them… and the conclusion by others that, because it’s already been established that this is Lucifer, every little whim must be a plan too cunning for them to recognize.

That said, that the grammar occasionally trips up (in ways which suggest English isn’t the author’s first language) and, when the plot initially gets going (around when the assassin “Serpent” is brought in to kill Harry), the prose feels a little too shallow for several chapters, so I’d give it a 3.7 out of 5 rating. (It’s still something I’d recommend reading at least once for the novelty of the concept, given how it stuck in my memory for so many years, but it could really use some tighening up in those middle chapters in order to reach 4 out of 5.)

Make sure you don’t skip the omakes at the ends of some chapters. Even when they start slow, the punchlines tend to be great.

The Master of Death by rgm0005
Length: 69,139 Words
Crossover: The Dresden Files
Status: Incomplete
Here we have a Dresden Files crossover by an author who knows how to take that wonderful Dresden balance of seriousness and wit but also to mix in some very engaging extra-universal world-building and engaging conversations between Harry and an OC.

It all starts when Harry Potter, having lived a full life, dies of old age and returns to the train station at the edge of the afterlife. After telling the train’s driver that he’s ready to go, settling down in a cabin, and accepting the hallows which have appeared next to him like a faithful dog, the driver comes to him with a message: He’s being summoned and would he be willing to answer it.

What follows is a brilliant depiction of passing out of one existence and then back into another to visit the Dresdenverse, becoming an Outsider along the way. (Because of the need to borrow a body from within outskirts of the Dresdenverse within Shape but outside Existence.)

Harry then arrives, summoned by Justin DuMorne and, being an ex-Auror, proceeds with his “saving people thing” after a brief legilimency scan. However, as events progress, he quickly discovers that he has a history in this world and, compelled by the threat of paradox, what follows is an interesting series of character interactions: Harry with the OC “afterlife train driver” (which is surprisingly satisfying) who he relies on to plot routes which temporarily exit Time. Harry with Rashid and Ebenezer, who understand that he means no harm, but also recognize that every time he is summoned or departs, it widens the cracks in the Outer Gates (and are unaware that Harry is experiencing their meetings in reverse order). etc.

Thus begins a story that can be thought of almost as a series of connected short stories, with one complete introductory arc, an interlude, and an incomplete arc having been written. The first two feel very much Dresdenverse stories, while the third taking place so far in the prehistoric past that it feels quite different.

While I’m not a huge fan of the incomplete third and and think the story would be much better off without it (it’s simply too original for the author’s skill level to maintain interest properly), the introductory arc and the interlude are excellent blends of what makes Harry Potter who he is (both personaly-wise and situation-wise) combined with the maturity, tone, and atmosphere of The Dresden Files, and with some elegantly chosen original bits for glue and flavour.

I’d say 4.5 out of 5 for the introductory arc, 4 out of 5 for the interlude, and 3.5 out of 5 for the rest.

For a taste of the aforementioned original bits, I’ll leave you with a quote from the driver to explain the mechanics of Harry borrowing an Outsider body:

“Of course not, sir; it just means nothing out there exists. I think you’ll find that there are a great number of things that don’t exist, sir; indeed, we didn’t exist a short time ago.”

Posted in Fanfiction | Leave a comment

Useful Info On Win16-Targeting Compilers… And a List of DOS/Win16 Resources

Updated 2017-12-29: Add a mention of the installer for Open Watcom C/C++, which is in the same source repository and can be built to run as a DOS or Win32 (possibly more) application using a single codebase and setup.inf.

Updated 2017-12-27: Merry slightly overdue Christmas. I tracked down the installer builder from the Windows 3.1 SDK, discovered that it’s effectively freeware, and added it to the table. (see LEGAL.TXT inside the self-extracting archive.)

Updated 2017-12-19: Added mentions of x2ftp and sunsite mirrors as good places to look for old programming resources.

Updated 2017-12-17: Added instructions for generating retro-styled Windows 9x installers using either an InnoSetup release or NSIS plugins. (And completed the table up to the present day for the heck of it. Speaking of which, for Linux, use Flatpak. It’s good enough for software pirates!)

Updated 2017-12-10: Updated information on Free Pascal’s real-mode support and added instructions for embedding the DPMI stub used by DJGPP and Free Pascal.

Updated 2017-12-08: Added “Tip 4: Open-Source Installer Creators for Old OSes” and a link to microjson.

While I was poking around the web, looking for information on the most liberally licensed way to put together some utilities for the copies of MS-DOS 6.22 and Windows 3.11 for Workgroups on my retro-gaming PC, I ran across a thread on Computing.Net titled win3.x compatable compilers.

Now, given that it was opened in 2007 and the most recent post was as new as April of 2016, I though I might as well help to fill in the gaps in their knowledge but, much to my dismay, after creating a post (in Leafpad) and creating an account, it seems it’s been locked for being too old. (I can only assume the threshold is something more than 9 years and less than 10.)

…so I decided to post what I put together here instead, so it won’t go to waste.

Tip 1: Current versions of Open Watcom C/C++ can definitely be used to target Windows 3.x.

Not only have I successfully used it to cross-compile basic test binaries on Linux and then run them in Windows 3.11 for Workgroups under DOSBox, I found a Building Win16 GUI Applications in C tutorial which includes an OpenWatcom project file in its example code archive.

Beyond that, it also includes a “windows extender” called Win386, which is essentially a DPMI extender for Windows 3.x applications, providing both a 32-bit flat address space and API thunks to make it more comfortable to call the Win16 API from 32-bit code.

From a deployment standpoint, Win386 has the advantage that it gets bundled into your executable rather than being installed separately like Win32s, so users need never know it even exists. (In fact, for that exact reason, there’s not much information on the web about it today outside the Watcom documentation.)

Tip 1.5: A Single OpenWatcom Install Can Compile To All Targets

In the build.sh script I put together for generating test files in one of my projects, I generate .com, 16-bit DOS EXE, DOS/4GW EXE, OS/2 1.x, OS/2 2.x, Win16, Win386, Windows 95, and Windows NT binaries all from the same hello.c file using the same OpenWatcom install.

(Also note that the linked script cross-compiles using other compilers as well, such as DJGPP, and includes instruction on how to get prebuilt Linux cross-compile binaries for them.)

Tip 2: Open Watcom C/C++ is the same compiler used by many classic games.

Watcom C/C++ was used in quite a few applications back in the day, because they offered the best value for your money if you wanted to do 32-bit protected-mode development. (The compiler was competitively priced, it was known for producing the tightest code, and it came with royalty-free licenses for both a DPMI extender and a precursor to Win32s at no extra charge.)

I’ll go into more detail on all of that…

DOS/4GW

When DOS games like DOOM say “DOS/4GW Protected Mode Runtime” on startup (or don’t, but include a copy of DOS4GW.EXE), that means they were compiled using Watcom C/C++ because DOS/4GW is the special Watcom bundle edition of DOS/4G. (It’s even still included in OpenWatcom, though more advanced, less nostalgic extenders like PMODE/WDOS/32A and Causeway are also now included.)

I forget which, but at least some of them can be merged into the binary to remove the need for a separate DPMI EXE file.

Win386

Win32s came out relatively late in Windows 3.1’s lifetime, so Watcom included a product called Win386 which did basically the same thing. (Providing a a 32-bit protected-mode environment with thunking wrappers to call back into Win16 code.)

Unlike with DOS/4GW, there’s no optional-but-on-by-default splash screen to tell you when Win386 is in use, but things like the Windows version of the Sierra SCI runtime use it.

(That’s actually why some Win16 programs crash on startup on modern CPUs. There’s a bug in older versions of Win386 that gets triggered on encountering CPUs faster than about 300MHz which can be fixed in any application by the “international” version of the KB240982 patch for Microsoft FoxPro 2.6.)

Information sourced from http://www.os2museum.com/wp/watcom-win386/

Performance of Resulting Binaries

According to Paul Hsieh’s WATCOM C/C++ Programmer’s FAQ, PC Magazine benchmarks indicated that “WATCOM C/C++ version 9.5 had the tightest and
fastest code among such compilers as Visual C++, Borland C/C++, Metaware Hi
C, Zortech and Symantec (by a wide margin)”.

According to that same FAQ, Borland’s strength was always their IDE and compile speed and, better code generators or not, Watcom’s approach to supporting embedding bits of assembly language is superior.

Tip 3: Free Pascal Can Apparently Produce Win32s-Compatible Applications and Win16 support is pending

Release versions of Free Pascal are currently (v3.0.4) incapable of developing Win16 applications, but real-mode DOS support has been released and Win16 support is being developed in FPC trunk.

That said, the user “watler” on the aforementioned Computing.Net thread claims to have confirmed that Free Pascal 1.9.6 could produce Win32s binaries. However, I haven’t yet found any further information on the DOs and DON’Ts of doing so.

According to this thread, Lazarus 1.6.x and Free Pascal 2.6.4 are the last versions to support Windows 9x with Free Pascal 2.4.x being the last to support it officially, so that’s where you’d want to start looking if you need to develop a Win32s application right now.

Tip 4: Open-Source Installer Creators for Old OSes

  • InnoSetup 1.2.16 is the last release of InnoSetup which can target Windows 3.1.
  • InnoSetup 2.0.19 is the last release of InnoSetup which supports WizardStyle=classic.
  • InnoSetup 5.4.3 (non-unicode version) is the last release of InnoSetup which can target Windows 9x.
  • Different major versions of InnoSetup can be installed on the same machine without stepping on each others’ toes.
  • NSIS still supports Win32 targets all the way back to Windows 95 according to the features list and the changelog for the most recent minor version as of this writing (3.02).  It can also be used for cross-building via the nsis package on Debian-family Linux distros.
  • The v2.0 version of the setup builder included with the Windows 3.1 SDK is effectively freeware, with the only potentially unusual condition from the included LEGAL.TXT being that you’re only allowed to profit from it when you’ve combined it with another software product which adds substantial value. (I originally obtained it from the Windows 3.x Resources page on conradshome.com)
  • If neither InnoSetup nor NSIS works for your use case, HJ-Install is probably the next-best choice. It is also free for commercial use and its base overhead is only about twice theirs (138Kb).
  • If you don’t mind the “publish the source, even for private uses” license and the need to compile it yourself, the installer for Open Watcom C/C++ is just as open-source as the compiler, gives you both DOS and early- Win95-era-style Win32 installers from a single setup.inf and codebase, and supports bundling all of the files into a single downloadable EXE file. (They only distribute DPMI and Win32 builds, but the source repo suggests it was intended to also compile for real-mode DOS and their Win386 extender for Win16.)
  • FreeDOS’s installer is built using batch files and V8Power.
  • Info-ZIP and ARJ both offer fully open-source ways to produce self-extracting archives for DOS… though neither’s self-extractor stub has ready-made support for extracting to a temporary folder, running a command, and then cleaning up the temporary files.
    • According to Maximum Compression, ARJ loses out to a good Zip compressor and, from what I remember, the only significant advantage it held over Zip back in the day was that PKZip’s support for split archives was a mess.
    • Info-ZIP lets you build DOS self-extractors from other platforms. Just grab the UnZipSFX stub from a DOS copy of Info-ZIP, concatenate the Zip file onto the end of it, and then run zip -A using your native copy of InfoZip to fix up the offsets in the Zip file.
    • You don’t strictly need to fix up offsets to make the UnZipSFX stub work… it just keeps it from complaining and ensures that you retain compatibility with external extractors like PKUNZIP.EXE which aren’t smart enough to compensate for offsets rendered invalid by prepended garbage.
    • You can customize the second line and beyond of the UnZipSFX banner text by setting an archive comment. Info-ZIP supports editing archive comments while I couldn’t find a way to do so using p7zip.
    • Zip compression can be optimized by either generating the Zip file using 7-zip/p7zip or recompressing it using advzip from AdvanceCOMP. However, advzip will strip the comment if you set it before optimizing the compression.
    • The zipnote command for editing archive comments is very picky about its input data.
    • While some FreeDOS versions of 7-zip include a DOS self-extractor stub, you don’t want it because it requires an external DPMI host.

I haven’t been able to find a single freeware or open-source option which allows a self-extracting archive to run custom install scripting and then clean up its own temporary files. (While UnZipSFX does support being compiled into a mode which can run a post-extraction command, doing so disables the ability to extract to a location other than the current working directory.)

The Takeaway:

Target OS Desired Experience Installer to Use
Anything .msi WiX
Windows 2000+ 64-bit era InstallShield NSIS with ExperienceUI or UltraModernUI
Win2K/XP era NSIS with Modern UI [1]
InnoSetup
Windows 95+ Win2K/XP era NSIS with ModernUI [1]
Late Win9x era NSIS with InstallSpiderUI [2][3]
Early Win9x era InnoSetup 2.0.19 with WizardStyle=classic [4]
Borrow Open Watcom C/C++’s installer
Windows 3.1x Single EXE or split archive InnoSetup 1.2.16
Open Watcom C/C++’s installer may be usable like this. [5]
Can replace system files
MS Setup 2.0 [6]
DOS Only suits EXE Downloads Use Info-ZIP‘s self-extractor [7]
Good for EXE Download or CD Image Borrow Open Watcom C/C++’s installer
Wait until I have time to write my planned installer kit.
Only suits CD Images Write an INSTALL.BAT using V8Power [8][9]
Suitable for Floppy Images  Use Info-ZIP‘s self-extractor [7][10]

Footnotes:

  1. Included with NSIS
  2. CAUTION: I wouldn’t use InstallSpiderUI without first substituting replacement icons and wizard sidebars. The default sidebar art says “Powered by NSIS” at the bottom and I’m skeptical that the author created such a convincing knock-off of unInstallShield’s distinctive sidebar art rather than just yanking every bit of art he used from a copy of InstallShield.
  3. So far, I have only tested InstallSpiderUI on Windows 98 SE and am suggesting it for Win9x based on the fact that NSIS itself still supports Windows 95. Do your own testing!. Also, in my tests, SimpleBg silently refused to activate on a real Windows 98 SE machine, so this can’t be used to replicate early Win9x-era stuff.
  4. I haven’t found a way to achieve maximum authenticity by disabling the confirmation prompt InnoSetup displays before progressing to the screen-filling gradient background. If I find time, I may examine the source code to get a definitive answer.
  5. The source repository for Open Watcom C/C++ suggests that it should be possible to compile a version of the installer GUI for Watcom’s Win386 extender for Win16, but I haven’t tried it. That code may have bit-rotted.
  6. Microsoft’s “MS Setup” cannot bundle all of your files into a single archive, but explicitly supports installing off multi-floppy sets in resource-constrained contexts and, judging by the documentation, has much more comprehensive support than InnoSetup for performing installs which must restart Windows 3.1x to replace system components.
  7. Shareware distributors who were higher-end, but not rich enough to pay for an install wizard would use a self-extracting archive with custom banner text. The self-extractor stub from real-mode DOS versions of Info-ZIP can be added to a Zip file using a native build of Info-ZIP. Here’s how you’d build an un-split self-extractor on a POSIXy OS like Linux:
    #!/bin/bash
    NAME="testapp2"
    SFX_STUB="infozip/UNZIPSFX.EXE"
    FILES="testapp"
    ENDFILES="SETUP.EXE README.1ST"
    BANNER="Test Application v2.01
    By: Foobar Software
    
    Synopsis and/or company slogan here
    
    "
    
    # -- Configuration Ends --
    
    # Ensure relative paths are relative to this script
    cd "$(dirname "$(readlink -f "$0")")"
    
    ZIPNAME="$NAME".zip
    EXENAME="$NAME".exe
    
    # shellcheck disable=SC2086
    zip -rT9 "$ZIPNAME" $FILES $ENDFILES -z <<< "$BANNER"
    
    cat "$SFX_STUB" "$ZIPNAME" > "$EXENAME"
    zip -A "$EXENAME"
    rm "$ZIPNAME"

    Note that I’ve added two newlines to the end of the banner and taken advantage of the fact that files will be decompressed in the order they were added to the file to make SETUP.EXE and README.1ST the last two file names which the extractor will print to the screen before it exits. (At some point in the future, I might make a proper reader/writer abstraction for zipnote dumps so it’s possible to reliably combine custom banner text with advzip -z4)

  8. Without the need to worry about the awkwardness of manually unpacking, running the installer, and then deleting the unpacked temporary files, you’ve got a lot more freedom.Do as FreeDOS does. Put the pieces of V8Power which are relevant to your needs into a folder and call them from INSTALL.BAT or INSTALL.EXE to make a fancy, professional-looking install wizard. (Run the included demos and examples inside DOSBox to get an idea for which effects are portable and how to accomplish them.)
  9. If you still feel the need to compress the files to be installed, rather than distributing the whole ISO inside some more modern kind of compression like 7-zip, the UnZipSFX stub allows your frontend to specify a destination directory using the -d switch starting with version 5.5.
  10. Info-ZIP’s zipsplit tool doesn’t require you to swap floppies to make a multi-volume set the way PKZip did. The -r option will allow you to leave a specified amount of room on the first disk for your installer frontend. However, not having all the V8Power bits remain resident in memory means that you’ll either need to do all of your configuration prompting before you turn the job over to the Zip extractor or, alternatively, build your own GUI.

If I can find the time to finish it, I’ve started experimenting with using Free Pascal to write a DOS analogue to InnoSetup or NSIS which functions as a scriptable Zip self-extractor stub. (Though, unfortunately, it won’t be suitable for floppy sets (at least in v1.0) because of how much storage overhead I’m incurring from depending on DPMI, unzip code not intended to be an SFX stub, and Turbo Vision.)

Given that my goal is to use this sort of thing for nostalgic retrocomputing, I may even write one for Windows 3.1 as well in order to replicate the appearance of memorable installers which don’t resemble 16-bit InnoSetup… though I’ll probably wait and see if the Win16 efforts by the Free Pascal crew reach a point where I could patch InnoSetup 1.2.19 for theming without needing Delphi 1.x to compile it.

Other Tips

Since I’m doing this as a standalone blog post, I might as well throw in a few other related bits of knowledge I’ve had kicking around:

      1. Custom DOS Stub: The Windows executable format must begin with a DOS executable. Normally, it just displays that message about it not being a DOS program, but both the Watcom and Microsoft linkers allow you to specify a STUB=filename.exe option to provide a custom DOS EXE file. QEMM 97 uses this facility to put its DOS and Windows installers inside the same .EXE file rather than having separate INSTALL.EXE (DOS) and SETUP.EXE (Windows) files.
      2. Other Libre DOS C Compilers: I’ve already written a StackOverflow answer listing all of the ones I know, but DJGPP is the only one I’d consider worthwhile. (While not as native/storied/historic as Watcom and only capable of protected-mode DOS output, this GCC port has a big ecosystem and, according to this comp.os.msdos.programmer post, produces DPMI executables which require no extender under NTVDM or dosemu, unlike OpenWatcom.)
      3. Bundling the DPMI stub: If you’re using DJGPP or Free Pascal, then it’s possible to bundle the GO32v2 DPMI stub to produce a standalone EXE file by stripping the default one off using exe2coff (also included with DJGPP cross-compiler builds.) and then prepending cwsdstub.exe (included with DOS versions of DJGPP and Free Pascal) using the same technique shown above for cross-building self-extracting Zip files. Some of the DPMI extenders included with OpenWatcom can also be bundled in a similar manner. This comp.os.msdos.programmer post provides a good overview of how it all fits together and this other post lists noteworthy alternative DPMI hosts such as DPMIONE.
      4. Supplemental Libraries: Here are some which look promising:
        1. Argument Parsing: Argtable 3.x seems to place a pretty big emphasis on portability and argtable 2.x explicitly lists DJGPP and Open Watcom as known to build it successfully.
        2. zlib/libzip: Archlinux’s AUR contains patches to build zlib and libzip for OpenWatcom’s DOS targets. (As well as one for zlib on win16, though I don’t see why there would be a difference unless it’s for static libraries vs. an LE-format DLL.)
        3. Extended standard library: iMatix’s legacy repositories on GitHub provide a Standard Function Library (online docs) which offers useful stuff for C such as various string- and filesystem-related functions now standard in modern languages and INI and XML reading/writing. The docs list Watcom and DJGPP among the supported compilers for targeting DOS.
        4. TUI (ie. text-mode GUI) Development: There are ports of Turbo Vision for DJGPP (instructions) and Free Pascal.
        5. DOS Game Development: Allegro provides API abstractions and a library of ready-made, optimized utility routines to allow easy writing of portable games. Version 4.2 is the last release which supports targeting DOS.
        6. Pattern Matching: Ozan Yigit’s website has single-file public domain implementations of a robust glob matcher and 4.3 BSD regex syntax.
        7. Executable Compression: UPX can pack pretty much any kind of executable you’re likely to want to pack except Win16 or .NET.
        8. JSON Parsing: While it doesn’t explicitly list compatibility with compilers like Open Watcom, microjson is a likely candidate, being a very compact, low-footprint, malloc-free parser for a subset of JSON intended for resource-constrained environments.
        9. Useful Misc.: You can find lots of useful bits in the Wayback Machine on Troels K. and Japheth‘s sites, such as Win16-compatible CEditView / CRichEditView implementations and the HX DOS extender (which provides limited support for Win32 applications in DOS), but be sure to double-check for license compatibility since I think at least one component on the list is an improvement on an EPL-licensed component and the EPL is GPL-incompatible.
        10. More Useful Misc.: Also, check out x2ftp and Sunsite mirrors for useful libraries and tutorials. (eg. the watcom folder on x2ftp)
      5. BASIC: If QBasic/QuickBASIC was more your thing, FreeBASIC supports targeting 32-bit protected-mode DOS and offers a qb dialect mode.
      6. Python: It’s ancient, protected-mode, and I’ve heard people use the phrase “buggy old …” to describe it, but a port of Python 2.4.2 for DOS does exist.
      7. Embedded Scripting: While I haven’t tested any of them yet, the most likely candidates for embedded scripting in a DOS/Win16 environment seem to be running either Lua or the V7 or tiny-js JavaScript runtimes under one of DPMI, Win386, or Win32s. (For more home-grown scripting handling, microjson may be useful as an example of how to write a resource-constrained parser.)

I also have a bunch of useful links for building things with Pascal and DOS batch files, but this is already getting really long, so I’ll leave that for another day.

Posted in Geek Stuff | 5 Comments

Fanfiction – The Pureblood Pretense

This time, I’ve changed things up as a side effect of finding a new way to slack off: This review is based on notes I took, but forgot to finally process into a review… so say hello to a “first time reading it” review for the first time since I started writing these again.

(Also, sorry for missing Wednesday slightly. I’d forgotten how much polish was left to apply and the tangent I spun out of this and published on time ate up more of the time I’d blocked out..)

The Pureblood Pretense by murkybluematter
Fandom: Harry Potter
Length: 229,389 words (plus sequels of even greater length)
Status: Complete (with two completed sequels and one actively being written)
Rating: 5.0 out of 5

This is a “FemHarry” Harry Potter fic, and some people might consider the main character a Mary Sue, but don’t be too quick to judge. The distinction between a not-too-bad Mary Sue and a room-for-improvement literary hero can be blurry and may rely heavily on whether you’re enjoying the story. I was so into this story that seeing her as a potential Sue never even occurred to me until I was part-way through the sequel and actively looking to revise my notes.

My verdict on those two points: Give the story a chance and see if it grips you. What makes this story so special isn’t the concept (which is sort of dime-a-dozen when you think about it), but how well it’s executed.

Anyway, the plot is basically a fusion of Harry Potter canon with Tamora Pierce’s Song of the Lioness Quartet. (For those unfamiliar with Pierce’s work, the main character, Alanna, trades places with her brother to follow her dreams of being a knight. It’s been years since I read it, but I remember enjoying it so there’s my in-passing recommendation for that series too.)

Now, in more detail:

Harriet Potter’s dream is to be a potions mistress. She eats, sleeps, and breathes potions study, going so far as to read articles in the latest potioneers journals, and she’s determined to study under Severus Snape, the most brilliant potions researcher around. Unfortunately, because of reforms passed through the Wizengamot by a Mr. Riddle’s Save Our World party, halfbloods and muggleborns are banned from attending Hogwarts.

(Note: As a computer-obsessed early-reader who was reading and understanding old BYTE magazines by age 6, I consider this to be plausible in the real world, but tricky to make properly believable when there’s an author who benefits from convenient contrivances.)

Meanwhile, Arcturus Rigel Black’s dream is to be a healer. The best healer program in the world is at the American Institute of Magic, but his father, Sirius, a changed man after his wife’s death and not wanting to drift apart from his only son, insists that he go to Hogwarts.

Just like in Pierce’s novel, the two hatch a plot to trade places, with Archie going to the A.I.M. where he manages to play off the gender mismatch as a records error and befriends Hermione Granger as “Harry Potter”, while “Rigel Black”, the quiet, studious, male, body-shy loner goes to Hogwarts to learn potions from Professor Snape. However, this being Harry Potter, things get more serious and complicated quickly.

The first thing I’m going to say now: Don’t go into this anticipating moments when people discover her secret. Despite how much I enjoyed what I’ve read so far, I’d have enjoyed it much more if I’d known that, like Alanna, Rigel is clever enough that the deception lasts and lasts. (I haven’t yet started the third book, “The Ambiguous Artifice”, yet, so I don’t know whether this series follow Pierce’s decision to have her get found out at the end of the third book.)

OK, back on topic. In accordance with her ambition and admiration for Snape, “he” gets sorted into Slytherin where intrigue is just another means of social interaction and it doesn’t help that Snape has no idea “he” is the daughter of Lily Potter and not the son of Sirius Black.

Now, I don’t want to give away too much and ruin the experience, but,  given that Riddle didn’t die to his own killing curse, the story clearly needs a new “conflict of the year” plot and this definitely delivers. I don’t want to spoil anything, but I found it clever, believable, and highly original. (Though, having taken a few days off to let the story’s grip on me fade, I do worry about certain aspects of the problem and its solution. They skirt close enough to the limits of what’s believable that I worry murkybluematter might overreach in future volumes if there is a need to escalate things.)

So, with the plot I’m willing to spoil covered, let’s get on with the story’s strengths…

First, this is a damn good “Draco and other Slytherins as interesting characters” story. The interactions between Rigel’s friends remind me of Harry and co. in canon or the Scoobies (main cast) in Buffy the Vampire Slayer and I really enjoy reading about them.

However, appropriately, given that she’s the main character rather than merely a main character, one of the story’s big strengths is how well murkybluematter presents Rigel as having the character of a true hero. She’s constantly trying to just be left alone to pursue her dream, yet she’s such a good person that she keeps attracting new allies and building strong loyalties just by being true to herself. …and, despite that, she’s so caught up in the minutiae of her studies and keeping up her deception that she never seems to realize the true significance of her actions while the readers clearly see foreshadowing of the dramatic way they’ll come into play when she eventually gets into a head-on collision with destiny.

This ties into the second point: murkybluematter really has a talent for good pacing. The ebb and flow of threats and resolutions kept me on my toes beautifully and, if the foreshadowed build-up in the series-level conflict arc is delivered upon, this is going to be one amazingly satisfying read when I get into the later volumes.

Again to this fic’s credit, I don’t detect any attempt to pander to anyone’s specific “fiction kinks” so far. When Polyjuice is used, it strikes an elegant balance for how much description to use (barely any, but enough to avoid the feeling that it’s being avoided to cover up poor authorship). In the only case I can think of where a trope comes up which has been horrendously abused by poor authors, it’s used merely as a threat on the horizon, to ratchet up the tension.

So… why is Rigel at risk of being a Mary Sue? Well, the gist of the problem is that it takes a lot of skill to justify a story about a prodigy whose talents have some kind of relevance to each arc’s driving conflict. There are several specific manifestations of this:

  1. Despite being a child the same age as Harry Potter, “Rigel Black” comes across as relying significantly more on skill to deal with the story’s challenges than Harry, who relied more on luck. (Once the story’s over and you’re no longer really in the thick of it, that draws attention to how authorially convenient it is for such a young heroine to be such a prodigy.)
  2. In canon, the structure of the first three years gives Harry some chance to grow, as Voldemort never really has the time and resources to care about Harry in more than the abstract until his resurrection. In this story, Tom Riddle is the leader of a major political party. He has ample time to be interested in the quiet, studious, introverted boy who, as a first-year, not only somehow thwarted his attempt to undermine Dumbledore that had the adults in Hogwarts stymied, but also happens to have befriended the heirs of several of his high-ranking underlings. (This draws more attention to how abnormally well such a young heroine is doing under a heavier burden than in canon.)
  3. Unlike Alanna, who lives in a middle ages setting where it’s expected that youths will mature quickly, Rigel lives in a contemporary setting, but the author has done little to justify how capable she is of pulling off the deception beyond some brief comments about how it’s normal for Slytherins to be raised mature. (Which we are forced to assume may have also hastened the onset of certain aspects of maturity in the Potter and Black households.)
  4. Unlike Alanna, Rigel and Archie are both prodigies. It’s always difficult to justify a character being gifted in a way which directly benefits the plausibility of the story (normally, you write a prodigy who struggles with being introduced to the first major problem their talents can’t solve), but, in this case, I really worry about what will happen in the later books when things need to escalate but escalating Rigel’s talents might push her over into full-on Sue-dom. (The general rule people tend to intuitively derive is “If your plot would be impossible without making the main character a shining exception, your main character is probably a Mary Sue.”)
  5. One of the defining traits of a Mary Sue is that the characters love or hate her pretty quickly. The heroic aspects of Rigel’s character that I’ve already mentioned have a similar effect, since she tends to earn loyalty and admiration from those she helps and draw the attention of those whose plots she foils. (A hero can legitimately do that, but it’s one of those traits that puts you in the hazy region between a well-written Sue and a badly written hero unless you’re really good at it.)

At the moment, I’ve only read first of the sequels but, if they’re representative of what follows, I’d guess that every potential sticking point in the first story and beyond can probably be traced back to the author not having put much effort into justifying how smart the two main protagonists are, given their ages. Now, admittedly, that is somewhat mitigated by accelerated maturity being part of a standard pureblood upbringing, but that detail, though stated, is somewhat brushed under the rug. While the risks in the story have been upped to match, a brilliant protagonist who attracts loyal friends and allies is always at risk of coming across as a Mary Sue and, while I don’t personally perceive Rigel that way, she’s pretty close to the line.

That said, given that this was still the most enjoyable fanfic I’ve read in a long time and I do mainly notice the potential Sue-ness after I take a break, I’m willing to count it as “unpolished hero” rather than “polished Sue”. In fact, my biggest concern is how much of a house of cards this is. (Or, to put it another way, the author clearly has quite the talent for making the story engaging, regardless of the fact that their talent is being applied to a flawed concept. If you’re the type who thinks Rigel is a Sue and writing Sues is turd-polishing, then this is one damn shiny turd.)

Either way, there’s not much murkybluematter can do to change things this late in the game. The reader’s expectations have become locked in and kicking Rigel because things have been too convenient for her is one of the biggest sloppy “ruin a story by overreacting to a flaw” mistakes I see bad fanfiction authors making. …especially since one of the hardest things for a fanfiction author to learn is to put their main character in danger in a way that still earns the readers’ trust, so they’ll allow themselves to open up and ride the emotional roller-coaster.

After over 200,000 words of building a certain expectation for the balance between success and danger that Rigel experiences, it’ll be difficult enough to ramp up the tension without turning off the readers. Actually trying to fix the delicate balance that is Rigel Black’s narrative in order to reduce the Mary Sue element would almost certainly make it feel like a collapse into “hardship porn”.

In fact, it’s something that’s ruined so many fics I’ve read that I had to spin out a whole separate article on it after I went off on a tangent while writing this.

That said, I think one of the biggest pieces of praise I can give is that this is the first “I have a secret” fanfic I’ve ever read where I wound up wanting the reveal to take longer simply because it would give more time to build up to the pay-off. (The thing I love most in stories is reactions to worldview-challenging stimuli)

Normally, I either read a story to get laughs or see hypotheticals for how characters would respond to novel stimuli. Normally, if a fic tries to stand on its own, it destroys the implicit promise of being a Harry Potter fic… but this story does it properly. Rather than trying to introduce new elements willy-nilly, it simply pours a ton of effort into the nuances of how the aforementioned pacing and intrigue affect the reader. Sure, I’d never have picked it up if I weren’t curious about a Lioness Quartet-inspired Harry Potter fic, but I strongly suspect I’d have enjoyed it no less if I had given it a chance without even having read Harry Potter.

All in all, this is one of the best fics I’ve ever read. Of the multiple gigabytes of fanfiction I’ve chewed through in the last 15 years, I’m not sure I can find half a dozen which came this close to the satisfaction I get from a good professionally published novel.

…or, to put it another way, out of all the fanfiction I’ve read, this is one of a literal handful where the writing is good enough to make me fully enjoy it on its own merits, rather than simply as a vehicle for what I typically look for.

Normally, when I see the phrase “marriage law” in Harry Potter fanfiction, I run the other way (unless it’s one of those “how it’d really go down” oneshots) because it’s a pretty good indicator that the story is going to be what I broadly refer to as “suffering/victimization/powerlessness porn”. In this story, when such a bill gets proposed and the light-side families block it, I grin in anticipation at a clear Chekhov’s gun. I trust it won’t get used until our heroine is ready to resist and win. The more you can throw at a great hero without breaking them, the more satisfying the eventual triumph will be… as long as you don’t destroy the reader’s faith in their ability to carry the load.

Likewise, for the other Slytherins’ views on Rigel and “his” secretive nature, I trust that Rigel’s secret will come out in ways that leave her position stronger when the dust clears.

Here’s a short list of common pitfalls this story has dodged so far:

  • It’s a gender-bending story which doesn’t obsess over some non-sexual kink (for lack of a better term) to the detriment of the story.
  • It establishes itself as its own entity, rather than a “mere” fanfic, without alienating people for being too original.
  • It’s a “girl in a hostile environment” story that, so far, doesn’t seem to be risking devolving into “hardship porn”.
  • While it acknowledges a trope I don’t want to name for risk of spoilers, it doesn’t let it dominate the story and seems to be using it only as a credible threat to the character, given the context.

I’d say that, aside from part of its punchiness coming from not having to introduce the reader to the Harry Potter setting, this could stand quite well on its own.

It really is a shame that I almost missed this, given how many different ways in which I look for good fiction on FFnet (spidering from author to author via favourites lists, using a custom filter script combined with sorting search/category results by faves or follows, recommendations elsewhere, etc.).

Specifically, I discovered this fic almost by accident when, for the first time in at least half a decade, I was so hard-up for what I was in the mood for that I decided to wade through the muck in the C2 lists and got curious about what C2s might exist which were gender-bending themed. If it hadn’t been mentioned as Lioness Quartet-inspired right in the summary I wouldn’t have been curious enough to give it a chance among all of the other fics I saw. (In the intervening years, I even left Fanfiction.net for a while to go to sites like Twisting the Hellmouth and FiMFiction simply because I’d walked down the curve of diminishing returns so much that I was willing to switch fandoms to get a site with more advanced filtering, a recommender system, and/or a community with higher standards.)

Definitely a 5 out of 5, even with the aforementioned flaws.

UPDATE: Now that I’ve started reading the third volume, I’ve been reminded of how flat-out gleeful I feel at each new twist and turn of the plot. It really is hard to express my feelings in writing when I find something I enjoy reading this much. (Heck, most professional fiction doesn’t hook me this strongly.)

Posted in Fanfiction | Leave a comment