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

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 .)

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.)

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

Free Pascal is currently incapable of developing Win16 applications because support for producing real-mode applications was only just added in version 3.0.0 (the most recent version at the moment), but they’re not ruling it out in the future.

Specifically, the docs say that “When the large memory model of the i8086 code generator matures, Win16 support can also be implemented”.

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.

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.)
  3. 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. 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.
  4. BASIC: If QBasic/QuickBASIC was more your thing, FreeBASIC supports targeting 32-bit protected-mode DOS and offers a qb dialect mode.
  5. 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.
  6. 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.

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 | Leave a comment

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

The Importance of Consistent Tone: A Brief Tangent

While I was working on my latest fanfic review, I found myself going off on a massive tangent about one of the most common ways I see fanfiction authors ruining stories: Realizing “late” that the main character “has it too easy” and destroying key aspects of the story’s appeal in an attempt to “fix” things.

This typically happens when an author has let their character one-up the villain too consistently and handily for that to be the driving source of interest in the story, so they suddenly give the villain a free boost without warning.

The problem is that by the time you finish Act 1 (or the 20,000 to 30,000 words that an Act 1 would take in a typical three-act novel at the 80,000 to 120,000 word length that professional editors require of first-time authors), the readers’ expectations have solidified. (And, if you’re writing a series, book 1 sets a marker which all future books in the series must not stray too far from.)

If your readers got that far and didn’t wander away, then something about the story works. Typically, it’s one (or both) of the following:

Possibility A: You’ve built an expectation sort of like a Saturday morning cartoon, where we all know the hero will win (and, for most stories that do this, that no “good guys” will suffer permanent harm).

In this case, it’s not about the outcome, but in how creative you are in letting the hero outplay the villain. (Personally, I’m especially partial to stories where a chessmaster villain’s plans are diverging wildly, and they can’t figure out why because they made one tiny-but-wrong assumption early on and it’s causing all of the logical reasoning they’ve been doing since then to take them further away from reality despite the influx of new data.)

This is also a common vehicle for humorous stories, where the villain having any significant success would run counter to the purpose of the story. (Also, think about The Hitchhiker’s Guide to the Galaxy series. It’s basically a sequence of jokes glued together with a token plot and with characters added to give a frame of reference… and it’s a classic.)

Possibility B: An alternative purpose for the story snuck up on you, such as bildungsroman or some kind of person vs. self conflict.

In this case, it’s pretty obvious why “fixing” it by helping the villain become more relevant would wreck things.

Either way, no matter how “easy a character had it”, you mustn’t betray the expectations cemented by what has come before. (You’ll make the story feel inconsistent and dissatisfy the readers who did read what has come before in an effort to please hypothetical people who are willing to either wade through chapters they don’t like or skip straight into the middle of the story.)

Another big problem of doing this is that making this mistake is part of the reason it’s as difficult as it is to get experienced readers to trust your writing enough to emotionally engage with a story with high stakes for the main character. If you get on an emotional rollercoaster and it sends you crashing into the ground, you’re going to be wary about getting onto the next one you see.

In fact, even professionally published authors can make this mistake.

Harry Potter and the Goblet of Fire gave me a massive emotional shock when it betrayed the sense of “childhood innocence/things will always be OK in the end” and “Voldemort is No Heart from Care Bears” (ie. a Saturday morning cartoon villain) that the first three books had allowed me to develop… and that, combined with badly-written fanfiction is why, today, I don’t often emotionally engage with what I’m reading. I’ve been burned too many times to trust easily.

(And, honestly, I honestly suspect that Rowling’s year of writer’s block after Goblet of Fire is because it shattered her mental models too.)

…plus, at least when I’ve seen it happen in fanfiction, it also tends to make the story feel like “hardship porn”… where it feels as if you’re not doing it for any artistic merit, but merely because you get off on making your character suffer for no good reason.

That said, one excellent example of doing it so properly that I did ride the emotional roller coaster is a gripping sci-fi story named Days of Wasp and Spider which is technically a distant-past prequel to My Little Pony, but was intentionally written so that you only need to change the cover art to publish it for money. (Trivia: Fifty Shades of Grey began as Twilight fanfiction)

In short, if you’re not the type of author to plan ahead in sufficient detail or revise already-written chapters, accept that you may have to update your plans in response to characters who take on minds of their own. Your readers won’t know to thank you if you get it right, but they’re likely to curse you if you get it wrong.

Posted in Writing | Leave a comment

Fanfiction – Divine Blood

I’ve been giving too much effusive praise recently, so let’s try something different.

Divine Blood by Thrythlind is an interesting case, because it does so many things wrong, yet I re-read it despite that. (This being my third time reading it when it’s over 400,000 words long.)

Overall, I’d give it a 4 out of 5, but the interesting part is the “why”.

The story is a study in starting out weak and getting strong, beginning with the kind of “skipped an essential story arc”feel that usually comes about because a bad author decided to arbitrarily change aspects of canon “because I like it better that way”.

The Cons

The prologue has Ranma Saotome raped, impregnated, and locked in female form by greek gods when the most Greek thing in Ranma ½ canon is Chinese amazons and the most “darkly consequential” thing in Ranma ½ canon is Saffron’s temporary death at the end of the final story arc. …and, after that, it time-skips to an adult, female Ranma and her three half-divine OC children. (ie. a half-OC and her three half-divine OC children.) That screams “bad Ranma ½ fanfic”.

Also, the kids have the “weeaboo Japanese” names “Deimosu”, “Naiki”, and “Eija”. Even assuming that it’s justified as “Their mother wouldn’t have known any better”, it’s too distracting. Thrythlind should have exercised his world-building prerogative to justify something that doesn’t act as a prose-level barrier to making the narrative immersive.

For a final issue, the feel of the story starts out slapdash. For example, details like magical aptitude on an application form carry an undercurrent of that “western 90s fanfic” feel to it, which comes about when the author doesn’t know how to extrapolate a desired element from any of the source series and, instead, constructs it out of whole-cloth. (Seen more strongly in stories like Generation Lost.)

Essentially, it implicitly promises a Ranma ½ component to the story, then starts out by rubbing the reader’s face in how much of what is Ranma ½ it can arbitrarily throw away or change just because the author wants it… and, as the scope of the story continues to grow, the original justification for using Ranma becomes shakier. (Post-canon Ranma is, at best, a big fish in a little pond, yet the justification hinges on Ranma being the best candidate in the world for a plan which requires that “she” not die.)

It does have a bit of a propensity for one-shot references and, once the epic story arc really gets going, a bit of a laissez-faire attitude toward multi-crossing in characters to flesh out the roster from other countries, but, if you’ve gotten that far, it only really “helps to give the story that fanfic flavour”.

The Pros

Now, if it were just those, the rating might wind up in the 2.5 to 3.5 range. So, what about the good bits?

Well, If you haven’t lost interest by the third or fourth chapter, it settles into a first story arc which feels like a reasonably engaging story about OCs in a crossover between Full Metal Panic and some of the more headcanon-ish 1990s Ranma fanfiction… leaning toward the former.

…and, once Oh My Goddess enters the story proper in chapter 7, the world-building really kicks off. In that very chapter, it brings a clever take on why demons act as they do that injects a surprising amount of depth and potential very quickly. From that point on, it starts to feel like a more even balance between Full Metal Panic, Oh My Goddess, and a wavering mix of Ranma ½ and OC elements.

The world-building in this story is a joy to read and my impression while re-reading it was that, whether or not Thrythlind was actively trying to world-build, my level of engagement correlated very strongly with how much a scene was revealing about his larger conception of the Oh My Goddess or Full Metal Panic settings and characters. (For example, the origins of Gods and Demons, the nature of Yggdrasil and Nidhogg, and what the Whispered signify for humanity.)

Also, once you’ve read enough to start to learn to accept that “the story is what it is, take it or leave it”, the Ranma ½ and OC elements start to get engaging too.

Overall, like most good epics, once it gets going, the story is a strong blend of in-close character development and large-scale world-building.

What Could Have Been Improved

So, far be it from me to just complain, let’s analyze how it could have been done better.

First, I remember Thrythlind having been working on a non-fanfic version of the narrative, so I want to address that… I have no interest in it. The story’s greatest strength, by far, is how it explores and merges the greater Oh My Goddess and Full Metal Panic elements, and making the story a standalone piece just turns it into a dime-a-dozen idea for a cosmology that I might have actually come up with and dismissed as uninteresting during my teen years.

The actual problems are threefold:

Slow Startup Of The Epic Elements

First, the story is slow to get started… but in a somewhat unusual way. The story isn’t boring… but it feels like a different genre until enough elements reveal themselves for you to start to recognize an epic feeling in it. A story which grows into a huge epic shouldn’t spend its first six chapters feeling like a twist on a canon Full Metal Panic story arc.

(In essence, it’s a failure of the “make a representative first impression” principle, but the author is skilled enough that, even a failed attempt still manages to achieve “good enough”.)

Perhaps ironically for a fanfic, the solution is that it’s not OC enough. Aside from kicking out the Musk characters for being distracting small fry who delay the development of the epic tone, there’s not really much that can be cut or shrunk without making the first arc feel rushed. It really does need a certain degree of patience to establish such a tone and for the Full Metal Panic cast to start to connect with the main characters, so the solution is to make spending that time more worthwhile… something that could have been solved by jettisoning the Ranma ½ connection entirely, so there’s valid reason to spend that much time getting to know the main characters.

If nothing else, a cast of purely OC main characters who have to hook reader interest more or less cold-turkey would ensure proper recognition is given to the need to make the OCs interesting.

Inconsistent Feel For The Villains

While it gets better near the end of their times as characters, the villains never really feel like they belong to the Oh My Goddess setting that they claim to be from. Scenes which involve them feel like they come from some unknown or original work that got crossed into the setting and their behaviour and presentation feel so divorced from what culture is shown or implied in Oh My Goddess canon that it feels like they’re scheming hermits who left to go live and plot in a cabin in some private pocket dimension.

(Compared to the OCs who do work, which feel like “native OCs” hailing from either Full Metal Panic or Oh My Goddess.)

Detrimental Aversion To Using OCs

This ties into the second problem: None of the Ranma ½ elements feel like they need to be Ranma ½ elements for the sake of the greater narrative, and, in some cases, they run against the grain of the story.

Sure, they’re entertaining to read about… but it feels like the story would have been better off if Thrythlind had taken the time to extend either the Full Metal Panic or Oh My Goddess settings with proper “native OCs”. (Something supported by how well-fitting OCs work when they are used, such as Lusca Kraken and Kodachi‘s pseudo-clones.)

The inclusion of Ranma seems to serve two purposes:

First, as a cheap attempt to avoid having to reconcile the presence of “organic/local-scale magic” (eg. feng shui, exorcists, human half-breeds, etc.) with the Oh My Goddess and Full Metal Panic settings, which present “bureaucratic/enterprise-scale magic” and a mild/near-future blend of psionics and super-tech, respectively.

Not only does this cast Ranma in a role that is quite removed from canon, it’s unnecessary. All of this can be justified just as readily by writing the local-scale magic as “the intersection of Oh My Goddess and Full Metal Panic overturned over a rock and the cast noticed the minor magics that scuttled out.”

Second, as a cheap attempt to justify the skill level of the main character and the relevance of her three OC kids… which also isn’t necessary.

For all the crazy magic going on around Ranma Saotome, it’s inherently a failed errand to use that plus a ~15 year time-skip to justify “her” having become just as much a mystic practitioner as a martial artist. That takes a story arc to justify, you can’t just gloss over it, and it’d probably cheapen the overall series to attempt it nonetheless.

Likewise, Thrythlind has demonstrated an ability to write engaging OCs, so I think the story would have been much better off if Thrythlind had acknowledged that these are OCs, regardless of what he names them, and then dedicated proper attention to developing them.

Solution Summary

So, here, in short, is what could be done to raise this to a  4.5 or even a 5.0 out of 5:

First,replace Ranma with an OC “hailing from the Full Metal Panic setting”, with the story being touched off when the gods from Oh My Goddess decide to “play old-school Greek Pantheon” with her. (She can still be a practitioner of minor magics and the like… just not with the reader preconceptions associated with Ranma ½.)

In my estimation, that would lead to the most effective tone for the story. (As-is, it sort of reads like two interesting stories operating as conjoined twins in the same universe, rather than one very interesting one and the Ranma ½ elements are a big part of this problem.)

Second, mitigate the sense that the story is slow to start by packing more exploration of the now-fully-OC main characters into that initial arc. (Which must necessarily be somewhat slow to handle the “OCs get to meet the canon Full Metal Panic cast” and “reveal hints of The Whispered being more than shown in canon” aspects in a way which feels satisfying, believable, and un-rushed.)

Third, use some of that OC development to explain how “local-scale” magic fits in “off-camera” in this hybrid Oh My Goddess – Full Metal Panic setting. (eg. Either “confidently ignore” or clarify the various implications of having human hybrids and other potentially weaponizable supernature in the Full Metal Panic setting. To avoid getting things side-tracked, I prefer to lean toward seeing it as “The Whispered are significant because they’re new, while the rest has been known to aspiring Mengele types for long enough that what we see today is a state of equilibrium sort of like the ‘average people ignore the strange and unknown’ from The Dresden Files.”)

Fourth, spend proper effort justifying and explaining how such archaic, villainous gods can believably “exist off-camera” in Oh My Goddess canon.

The Plot

Anyway, so what actually is the plot?

The gist of it is that Zeus, Poseidon, and Hecate hatch a plan to bring down the doublet system, overthrow the current leadership, kill off “half-breeds and traitors”, wipe out the human interlopers who infest “their” Earth, and return to the age of war against the demons (who see them in turn as interlopers on “their” Earth).

However, for a variety of reasons, Murphy’s Law takes effect… including that the Whispered are actually a sign that humanity is on the threshold of ascending to become much like the Gods and Demons and circumstances conspire to let some of them play Prometheus, just as the Gods did when the Demons emerged from their KT-event shelter and tried to reclaim Earth.

Now, obviously, this is a very abridged explanation, and omits so many engaging details but, if you don’t mind a spoiler, the doublet system falls, Yggdrasil and Nidhogg crash, and humanity at large is introduced to the true reality of things by a flood of god and demon refugees, soon followed by attacks from their respective insurgent factions.

Speaking of which, I also love the elegance of having the demons develop an animal-based supercomputer (Nidhogg), the Gods using a plant basis for their known-off (Yggdrasil), and humans completing the Animal/Vegetable/Mineral trifecta with a crystal-based knock-off of the other two (Silmaril).

All in all, it’s an incomplete but good story… if you can overlook the flood of warts in the first few chapters, but it could have been so much better.

Posted in Fanfiction | Leave a comment

Fanfiction – The Petriculture Cycle

I’ve had another extremely busy week, so I’ve decided to try another approach to delivering a quality recommendation without having to re-read an entire story to make sure I’ve got things right… a story where the details are so spoiler-y that digging up details would be a waste of time.

The Petriculture Cycle by Kwakerjak

Beginning with the eponymous Petriculture, this series of My Little Pony: Friendship is Magic fanfics is one of the most satisfyingly clever cases of world-building I’ve ever read.

That said, it’s also one of the trickiest stories to write a recommendation for because simply saying Alternate Universe rather than a more euphemistic “world-building” is spoiler enough for the first story in the series that it’s not listed in the story’s tags. (Let that sink in for a moment. The first story in the series contains such a fundamental plot twist that properly tagging it would be a spoiler.)

As the very sparse intro to the TVTropes page says, “the premise of each successive story is more or less grounded in the surprise ending of the previous story”.

All I can really say for those who want the full experience is that the series is a brilliant example of out-of-the-box creativity in how it blends novel character, setting, and plot details and I’d give it a 5.0 out of 5.

I highly recommend that you just read the series for yourself. I didn’t read the first story until a spoiler for the twist got me curious, and I still regret that.

That said, if I hadn’t seen the spoiler, I might never have read it, so here’s a series of increasingly twist-ruining spoilers for if you’re not yet convinced:

  1. The key detail which forms the core of why this setting is fascinating (and completely spoils book 1) is that Pinkie Pie is Twilight Sparkle’s imaginary friend, who gained her own independent existence during that first Sonic Rainboom and her strange abilities are due to her unusual nature.
  2. The reason it makes it so fascinating (which is a partial spoiler for the later books) is that she’s not the only canon character who’s actually a reified imaginary friend.
  3. The cherry on top (which is a bigger spoiler because of how it gets you thinking) is who these other “thoughtforms” are and whose minds they were born from.
  4. If you’re still not convinced that you want to read it, maybe knowing some (but not all) twist-spoiling specifics will sway you. Nightmare Moon was an “imaginary antagonist” created by Luna who got out of hand. She gets redeemed and becomes an interesting OC. Discord is a name Celestia’s imaginary friend took on when he felt he’d been abandoned by her. Thoughtforms not taking rejection well is a recurring theme.

That said, it’s what Kwakerjak does with those spoilers which earns the story such a high rating. Spoilers or not, it’s still a great read.

Enjoy. 🙂

Posted in Fanfiction | Leave a comment

Disabling Controller Paks in Mupen64Plus Without a GUI

If you have a Retrode and a copy of Chameleon Twist and you tried to play your dumped game in Mupen64Plus, you may have gotten stuck at this screen on startup.

Depending on how your copy of Mupen64Plus is configured, this is caused by one of two problems:

  1. By default, Mupen64Plus emulates a Controller Pak so that games which save to Controller Paks Just Work™ without any fussing around… but, unlike other games, Chameleon Twist throws a fit if you leave a Controller Pak plugged into any of the controllers when you turn your N64 on rather than just ignoring it.
  2. Something about Mupen64Plus’s Rumble Pak emulation is broken or incomplete.

Now, apparently, for those who are less scrupulous, the workaround is to download a dump of Revision A/Version 1.1. However, for those of us who are very particular about trying to do right by copyright law, that’s not very helpful.

The question is, if you found it too bothersome to install a Mupen64Plus frontend, how do you change this?

Mupen64Plus doesn’t allow specifying the inserted controller/rumble pack configuration at the command line, so you need to edit ~/.config/mupen64plus/mupen64plus.cfg.

You’ll need to edit all four of the [Input-SDL-Control#] sections, because Mupen64Plus’s default auto-configuration will leave the virtual controller plugged in even if there’s no device for it to be mapped to.

For controllers you don’t plan to use, the simplest solution is probably just to set plugged = False.

However, for controllers that stay plugged in (eg. player 1), you will need the more complex solution:

  1. Make sure your controller is configured as you want it (eg. Start Mupen64Plus once with mode = 2 (full autodetect) or with mode = 1 (autodetect for given name) and an appropriate value for the name field.)
  2. Set mode = 0 (fully manual) or the autodetection will undo any changes you make as soon as you start Mupen64Plus.
  3. Set plugin = 1 to emulate a controller with nothing inserted into the Pak socket.

Your copy of Chameleon Twist should now work properly.

Bonus Tip: The controller plugin’s sections are the only ones in my mupen64plus.cfg with lines matching ^mode = and ^plugin= so you could write a shell script like this if you want a quick hack to launch Chameleon Twist without a frontend:

#!/bin/sh

sed -i 's@^mode = .*$@mode = 0@' ~/.config/mupen64plus/mupen64plus.cfg
sed -i 's@^plugin = .*$@plugin = 1@' ~/.config/mupen64plus/mupen64plus.cfg
mupen64plus /path/to/Chameleon_Twist.z64
sed -i 's@^plugin = .*$@plugin = 1@' ~/.config/mupen64plus/mupen64plus.cfg
sed -i 's@^mode = .*$@mode = 0@' ~/.config/mupen64plus/mupen64plus.cfg
Posted in Geek Stuff | Leave a comment

A simple “Update your Retrode on Linux” helper script

A good rule of programming is, if you find something bothersome twice, and you can’t rule out having to do it again, automate it… I had to look up the steps to update my Retrode twice.

In short, I wrote a little script to automate the process of updating a Retrode’s firmware on Linux.

In addition to converting two hard-to-remember dfu-programmer commands into a single ./update_retrode.sh new_firmware.hex, it also does a few basic safety checks and reminds you which order to press and release the buttons on the Retrode to put it into programming mode.

I hope someone finds this useful. 🙂

Posted in Geek Stuff | Leave a comment