Relaxing My Schedule For Fanfiction

My apologies to readers, but I’m going to have to stop releasing a review every week.

Things I want to do more have been piling up over the last couple of months and re-reading fics I know to meet my standards for this blog is starting to feel like a real chore when it takes up leisure time I’d rather spend…

  • Catching up to all of the professional-quality print sci-fi and fantasy that has accumulated on my TODO list while I was hooked on fanfiction.
  • Playing various computer and console games that I wanted as a kid but never owned.
  • Reading various non-fiction books.
  • Programming useful utilities, such as a free alternative to Scrivener and a DOS installer builder for retro-hobbyists.
  • Reading new fanfics that may or may not be worth reviewing here when I’m too tired to feel like taking notes.

I do still have fics on my “to review” list, and I’ll also try to review the print novels I read, but getting back into reviews began as just polishing up notes I was taking for my own reference, and and obligating myself to do it (especially on a schedule) has been draining the enjoyment out of my leisure time.

That said, I do have a Harry Potter review about half done right now, so I’ll try to get that done before I move on to reading something else.

Posted in Fanfiction | Leave a comment

Fanfiction – Cheaters Prosper

Well, it’s been a very busy week and my reading schedule slipped a little too much, so I had to just dig something up quickly.

Cheaters Prosper by drakensis

This is another fun little comedy oneshot which asks a simple question: What might happen if Uzumaki Naruto took the idea to heart that to be a good ninja is to cheat.

I don’t want to spoil things too much, so I’ll just give one amusing little sampling of the phrasing and secondary humour:

“One of the genin has demonstrated a creative, if not technically illegal, perspective on the rules,” the Hokage explained. “It’s certainly a good sign that he’s ready to be promoted, but not the sort of thing to share with outsiders. However, with all these guards, I’m sure that nothing will go wrong. If anyone so much as tries to form a genjutsu my ANBU will be onto them in an instant. And as for sneaking in under a henge… no, nothing like that will be permitted.”

“How reassuring,” Orochimaru said, although the words tasted like ashes in his mouth as he started making covert ‘abort’ signals to Kabuto and his other minions.

I’d say it’s a good 4.5 out of 5. It’s got some clever ideas, and some amusing lines… but there’s still room for improvement.

Posted in Fanfiction | Leave a comment

Fanfiction – Transcendant Humanity

OK, back to Mass Effect fanfiction.

Transcendant Humanity by Solaris242

One of the things I really enjoy is first-contact scenarios, because they have so much potential for interesting explorations of the societies involved… especially if one or both of the species have never met anything like each other before. After all, if you want “reaction to the unexpected”, first contact is hard to top.

The problem is that, if you check a list like the Alternate First Contact War C2 on Fanfiction.net, you’ll find that far too many of them are focused on either the on-the-ground experiences of the soldiers, or how a different humanity can curb-stomp the Turians. (Not that it’s surprising. Writing a really good contact fic requires out-of-the-box thinking that school tends not to teach, and Mass Effect is a mainstream fandom.)

Obviously, you can do nuance and subterfuge, but that’s a fic for another review. Transcendant Humanity is more of a Humanity, F*k Yeah! story, done well.

The basic premise is that, instead of leaving behind eezo, the Protheans left behind only a warning… leaving humanity without FTL travel and united in their fear of a cryptic, genocidal force from out among the stars. Instead of expanding outward, humanity turned to transhumanism.

Now, this is where canon timelines get fudged a bit, but definitely for the good of the story.

Without eezo, and with humanity turning our effort and our intellect toward dealing with ever-increasing population density and a long-term plan to fortify Sol, Charon spends two millennia ignored as too uninteresting for mining purposes and another decade as the subject of study by a humanity that still remembers to “Trust not the Gates”.

When a means is developed to send exploratory ships without using eezo, they wind up on the wrong side of a Turian patrol fleet and the first chapter ends on one of the most distinctive cliffhangers I’ve ever read:

The Turians expected a young race, just reaching the stars. They feared that humanity was another potential Krogan, or Rachni. Upon exiting the Sol Gate, their entire fleet is frozen by the sight before them.

Thousands of ships that the Turians had believed to be ‘dreadnoughts’. Tens of thousands of frigates. A hundred true dreadnoughts, and dozens of super-carriers almost ten kilometres across; spawning truly uncountable swarms of fighters and drones.

And behind the defensive fleet, the true power of humanity. An occluded star, a supercomputer larger than worlds, filled with a trillion minds. Transcendent Humanity speaks as one, the force of their voice ripping through firewalls, absorbing language and codex, booming from every device capable aboard the Turian ships.

This is Sol, the home of humanity. YOU ARE NOT WELCOME HERE.

Now, admittedly, the first chapter is an exposition dump. A reasonably good example of one and having one for the first chapter (or even just a point-form timeline) is a tradition in these sorts of fics, but it’s an exposition dump nonetheless.

Chapter 2 puts the story into a narrative that’s much more normal, accounting for the context of a humanity who consider bodies optional.

It’s the kind of story where it’s difficult for me to give much detail on the plot, because the plot is merely a framework tying together creative and novel scenes. I’ve seen first contact done a million times before. What makes this story work is the fresh world and interesting character experiences that it brings to the table.

The moment I find most memorable is probably when the “Ghosts” (bodiless human infiltrators) who make their way into the Citadel’s systems wind up bringing home an ambassadorial cluster of Geth runtimes, who are struck dumb by the experience of downloading into a “home body” and then experiencing the taste of food.

It’s also an amusingly nostalgic reminder of the early days of the Internet when one of them, making an observation about the Citadel network, comments that “This place is like 75% Asari porn.”

At the same time, it’s refreshing to see a story where, unlike so many Alternate First Contact War fics, the Shanxi assault is averted entirely and it’s satisfying to see a story where humanity is a walking middle finger to the concept of circumscribing and outlawing A.I.

On the character side, there’s one scene which truly captures what makes this story so special. During the initial meetings on the Citadel, a more likeable Donnel Udina visits a café, where, as the first organic human to ever set foot in Council space, he has a conversation with the proprietress… another kind of first contact and an elegant way to insert fresh new content into events I’ve read countless times over.

It’s the use of that imaginativeness on scales both large and small which makes the story what it is. (Wait until you see how they get a cyber-attack into a fleet that’s prepared for it and the crafty solution they come up with for outwitting the Treaty of Farixen.)

Unfortunately, the story stands incomplete at 40,604 words and the update pattern suggests it’s unlikely to be finished, but I’m glad to have what we got. (Not to mention, the author also started another fic, in which the Turians’ first contact with humanity is as survivors of Sol having being consumed by a black hole… though that has made even less progress through its story arc.)

All in all, there’s no other Mass Effect fic quite like Transcendant Humanity and, when I think about it, that’s kind of sad. It’s not wonderously well-written and it’s not a particularly novel concept (I’d give it a 4.5 out of 5). What makes it special is that it manages to evoke some wisp of that era when the space program had sparked a curiosity in the world and the sci-fi new releases didn’t feel so glutted with thrillers, dystopic projections of corporate overreach, and other aspirants to movie adaptation… and isn’t that what an alternate history story should aspire to do?

UPDATE 2020-02-11: The monologue in chapter 20 where a human character insightfully lays out the nature of the relationship between the Geth and the Quarians is also a masterpiece that deserves mention.

Posted in Fanfiction | Leave a comment

Fanfiction – Magical Mystery Oops

Well, the last fic I covered reminded me of another MLP fic I wanted to re-read. This one is also a “Twilight Sparkle becomes something” fic (this time, a draconequus), it’s also good and memorable, and, if Ascend had a decent grasp of referential comedy, this one is brilliant at it.

Magical Mystery Oops by BookeCypher

The story is set after the Tirek incident and we’re brought in just as Twilight Sparkle is about to attempt another first: Leveraging her access to consult with Discord, she will attempt to be the first pony to ever make use of chaos magic.

The first time she did something so unprecedented, she earned a pair of wings. This time, things go… well… chaotic and, when she comes to, she finds that she’s been transformed into a draconequus. (Though, not being on a level equivalent to Celestia and Luna, she lacks Discord’s “fashionable asymmetry”.)

Almost immediately, we get to see a solid impression that this is an author who knows how to write interactions between Twilight and Discord which feel both natural for the two of them and, at the same time, very engaging.

When Twilight’s friends show up, we also get to see the first example of the elegant way in which Discord is used to make referential humour feel natural: His initial summation of what went wrong is “She ate an energy field larger than her head.” (Hyperlink mine.)

It feels natural for Discord to say it, it’s amusing even without the reference, and you wouldn’t know it’s a reference at all if you were unaware of what’s being referenced. The story does this again and again, but never too often, so it becomes a fun game of “spot the reference” with the one canon character more suited to making them than Pinkie Pie.

(Another such example would be when Twilight’s first trip through town prompts Mayor Mare to unknowingly quote Ray from Ghostbusters.)

Continuing with the plot, it’s quickly revealed that:

  1. Twilight can’t use her old pony magic while she’s a draconequus.
  2. She got turned into a draconequus because chaos magic has a different conception of “easiest way to accomplish a task” such as “controlling chaos magic”.
  3. If she wants to change back, she’ll have to figure out how to do it herself, because her new innate abilities will counteract any attempt Discord might make.

At first, she refuses Discord’s offer to give her some training, but he gets his foot in the door when his parting comment of “nudge it, don’t force it” proves to be the key detail that allows even the tiniest bit of progress on her own.

That also touches on two other things that make the story so good:

First, the amount of detail that BookeCypher put into how Twilight perceives chaos magic and how it actually achieves its effects on the world around her.

I could spend all day just reading about this, purely based on the (quantum) mechanics… let alone the fun that emerges from Discord being Discord during Twilight’s chaos magic lessons:

“Wouldn’t transfiguration be easier then reversing gravity?” Twilight asked.

“Reversing gravity just means you make the apple do what it wants to do anyway.” Discord waved a finger and a few of the apples started dancing in the air around him. “Transfiguring means making it into something it isn’t. Apples don’t like that.” He paused before adding “Neither do the bunnies, now that I think about it.”

I also love the world-building related to that, such as the nature of Poison Joke and why it smells heavenly to draconequines yet causes no end of trouble for ponies.

Second, and more significantly, the overall interaction between Twilight and Discord as the story unfolds.

This is a romantic comedy… and it works! Twilight and Discord grow together little by little, because circumstance leads them to do and say perfectly plausible things, which cause them to slowly see each other in a new light. Likewise, they snark at each other, but there’s no malice in it. They get on each other’s nerves, and they make mistakes, but and they get past them… and, through it all, they grow and change as characters without losing the essence of what makes them who they are.

Far too many stories are written by impatient authors, but this one isn’t.

It also works beautifully because of how it makes the readers see them in a new light. For example, there’s one scene where Twilight does something perfectly plausible for her canon personality, but the way it’s presented makes you realize that, were it not for her upbringing, she could easily be a mad scientist sort of villain.

The end result is charming, funny, and all the other adjectives that a good romantic comedy should have… yet, at the same time, has a depth to the conception of how chaos magic actually works that helps to make it feel satisfyingly balanced.

…and the delightful characterizations aren’t limited to just Twilight and Discord, as this quote demonstrates:

Luna cut her off as she gestured at Twilight with one hoof. “You mean to tell me that this adorable creature is of the same ilk as that scruffy looking fellow Discord?”

“Who’s scruffy looking!?” Came a shout from one of the windows above them

There is one arc where the tone gets more serious temporarily and the references feel a bit discordant with the narrative tone there (ignore the pun. It detracts from what I’m trying to communicate.), but the rest is good enough that I can’t count it against the story’s overall rating.

The illustration of Draconequus Twilight used for the cover is also beautiful and really helps to get one into the story.

Definitely a 5 out of 5. As of this writing, it stands incomplete at 99,272 words and is still receiving infrequent updates.

Posted in Fanfiction | Leave a comment

Music – Instrumental MLP Fan-songs

Sorry for not having a fanfic review ready today. Not only was my week a mess, a programming project consumed all of the leisure time I’d normally use for re-reading an old favourite fanfic.

Instead, I decided to spotlight some instrumental music which came out of the My Little Pony fandom that I really enjoyed and didn’t want to risk losing track of if something ever happens to my backups.

…because, after all, if the music has no lyrics, it doesn’t matter what you think of the fandom as long as it’s good.

Why Am I Pinkie Pie (download) by DnBeanie
Inspired by a fanfic of the same name by Hoopy McGee, this is a bouncy instrumental EDM pop song that I just keep coming back to.
On a more intellectual note, what draws my attention is how it uses its simplicity. From when the beat starts up to the last 15 seconds, the entire song runs off the same regular, fast paced beat and it’s not technically complex. Basically, a beat, an accompaniment line, and a melody line. Likewise, before the melody comes in, the accompaniment manages to feel anticipatory, simply by the progression it uses and its unbroken nature.
As for the main melody, it’s bouncy like Pinkie Pie, but has a more serious air to it which I’m assuming is intended to follow the nature of the story, where a human wakes up as Pinkie Pie and doesn’t know how it happened or why.
Friendship is Magic (Orchestral Arrangement) (tindeck) by Evening Star
When I want something catchy, with a majestic feel to it, yet which isn’t “on” all the time like Sogno di Volare, this is what I turn to.
It makes me think of reading an epic. At first, the music is soft and light, like a morning sunrise in a small village. Then, it picks up and adds a sense of adventure as the heroes set off on their quest. The music then flows back and forth between the swelling, impressive passages which make the world sit up and listen, and the soft, light explorations of the heroes’ character, without which the story simply wouldn’t work.
Octavia (bandcamp) by Evening Star
Like the previous example, this track (named after a background character who plays the cello) flows back and forth between the personal and the worldly, but this leans more to the personal side.
If that was an epic “tale of a world”, like Lord of the Rings, then this is the personal study of a character whose life has been marked by “forays into the wider world”.
WoodenOverture by Tsyolin
This eight and a half minute track is an orchestral medley of four excellent songs (originally with lyrics) by WoodenToaster. While the originals have more of an electronica element, this version uses excellent samples of classical instruments and I love each on its own merits.
I recommend this both on its own merits and as a sampler of some of the catchier melodies I’ve encountered in MLP songs. Also, if you like this, you might want to try StormWolf’s orchestral cover of Nightmare Night.
Diffraction (soundcloud) by StormWolf
Now back to the more modern genres for a bit. This is a frenetic europop track that does incorporate some vocal samples, but not in any way you’d be able to distinguish from other examples of the genre. Appropriately, it was StormWolf’s contribution to an album themed around the speediest character in the series.
While it’s catchy on its own, I have a soft spot for europop and trance songs which make good use of the piano, with other ones I love including DHT’s techno mix of Listen To Your Heart, the intros to Drift Away (Sven-R-G vs. Bass-T) and Because The Night (Cascada), and the piano accents in Reaching the Sky by Atomix and Vamos A La Playa (Dan Winter Edit) by Loona.
Lesson Learnt by StormWolf
This is another frenetic pop piece and the reason I mention this one is that it reminds many people of the Touhou games. (Here’s the Phantasm Stage from Perfect Cherry Blossom for comparison.)
This particular song in inspired by an incident when the occasionally neurotic main character blows a situation way out of proportion and goes a bit nuts as a result.
Nightmare Night 8 Bit Style by Lukspups
While I’m on the topic of of songs which evoke feelings of games, I should also mention this cover of WoodenToaster’s Nightmare Night.
Aside from enjoying the sound of it, I just have a certain fondness for music which sounds like it could have come from a Castlevania game… in this case, the main melody tracks where tracks which sound sound like the might have originated in a Castlevania game.
(Filmore from Actraiser is one that has that effect even more strongly. I’m one of many who misattribute it to Castlevania if it’s been too many years since last seeing the track metadata.)
Gypsy Bard (Full Orchestral Instrumental) by BassBeastJD
I’ll close this list out with a song I’ve already mentioned in passing.
The original version of this song is from a fan-made edit of MLP sort of like an Abridged Series, in which the lyrics give the impression that the singer is putting on a mask of cheerfulness because it’s the only thing that keeps her from crumbling under the weight of her life’s tragedies. All the while, the tune is unfailingly bouncy and cheerful.
This version varies the pacing and styling quite a bit in an attempt to make up for the lack of lyrics by moving some of that weight and gravitas into the melody.
The use of ambient sounds in the beginning to allude to the events in the lyrics is a nice touch, I enjoy the song, and I’d certainly recommend it to others.
Posted in Music | Leave a comment

Free Installer Creators for All Eras

UPDATE 2021-12-19: Added Installer and InstallerLG for AmigaOS and derivatives

Since my list of installer-construction resources has grown so huge, I thought I’d move it out of my list of DOS/Win16 programming resources into its own post. After all, it extends all the way up to the modern era and it was sort of taking over.

Consider this a one-stop shop for finding a legally free way to make your installers as authentic to a certain aesthetic as possible.

The Resources:

ClickTeam Install Creator 2 (mirror)
This install creator for 32-bit Windows is under “freeware, unless you want to remove the final self-promotion screen in your installer” terms that also allow you to redistribute the original install package for the installer builder as long as you don’t modify it, bundle it with anything, charge for it, or ask for donations (so no compilation CDs).
Since I’m planning make it possible to grab a copy of this whole blog with a single git pull, I don’t know if they count that as “bundling” it, and their contact system requires me to create a forum account before I can open a ticket, I’m letting Archive.org handle mirroring it instead of hosting a copy myself. (It says “Demo” on the Archive.org page but it is their standard “Do you want the unregistered freeware version or the registered version?” installer.)
I wouldn’t normally mention something like this when there are completely unrestricted options, but I do remember seeing ClickTeam’s self-promotion screens on the installers for a few pieces of freeware back in the late 90s and early 2000s, and it does still work back to Windows 95 and let you choose the classic looks so, if you’re going for retro-authenticity, this might be something to consider.
HJ-Install
A freeware installer builder for Win32 that’s been around long enough to be on one of my 1998 shovelware compilations.
It’s free for commercial use, but I’d try an appropriate version of InnoSetup or NSIS first. HJ-Install’s 138KiB base overhead is two to four times theirs and they’re more featureful.
Info-ZIP
The open-source DOS self-extractor stub and Zip-modification tools you’ll need to build your own free-for-commercial-use self-extracting archives for DOS.
InnoSetup 1.2.16
The last release of InnoSetup which can target Windows 3.1. Open-source, but requires Borland Delphi 1.x to build.
InnoSetup 2.0.19
The last release of InnoSetup which supports WizardStyle=classic. Open-source, but requires Borland Delphi 2.x (and nothing newer) to build.
InnoSetup 5.4.3 (non-unicode version)
The last release of InnoSetup which can target Windows 9x. Starting with version 4.x, InnoSetup supports being extended via Pascal Script for full customization. Open-source but requires Borland Delphi to build. (Delphi 2.x-5.x or 2009, if the requirements are the same as the latest release.)
Install 3.0 and 4.0 by Kenneth W. Illig
An ultra-simple freeware installer TUI for DOS to stick in front of a self-extracting archive. Just tell it the suggested install directory name, the program to tell people to run after the install completes, the name of the self-extracting archive, and a message of up to 79 characters to display. No other customization of the UI is possible.
The 3.0 version hard-codes the expectation of a single self-extracting archive with an .exe extension while the 4.0 version adds a few extra fields so you have more flexibility to run up to three additional commands as part of the installation process.
NOTE: You are required to distribute its INSTALL.DOC file (3.1KiB uncompressed, 1.3KiB zipped) along with it so that anyone who receives whatever you’re installing can also use it to build their own installers.
Mirrored here but originally found as install.zip in the \DOS\PRGMMING folder of the PSL Monthly Shareware CD-ROM, November 1993 and instl4.zip in the \PRGMMING\DOS\GEN_INST folder of the PSL Monthly Shareware CD-ROM, August 1995 on annex.retroarchive.org.
Installer v1.03 by Bloody Cactus Development Labs (HTTPS, FTP, Local Mirror)
A freeware installer builder for DOS with intermediate complexity and an intermediate feature set.
Takes an .ini-format project file as input which allows you to specify file groups which may be required or user-selectable (ie. optional features). Also supports displaying a short message and a README file within the installer, and leaving a closing message like “Install finished. Type FOO to start your program,” visible when quitting.
Uses a custom packfile format rather than something like Zip, but the compiler has built-in support for splitting packfiles to fit your installation volumes and reserving extra space on the first volume for things like README files.
Includes two example project definitions, one of which defines the installer it’s distributed as.
Installer and InstallerLG
The installation tool for AmigaOS 2.1 and beyond, and a compatible reimplementation for things like AROS. See also InstallerGen for automating the task of writing install scripts.
Loki Setup (GitHub)
The source for the installer used by Loki Software on their Linux game CDs from 1999 to 2001.
Microsoft Setup Toolkit 2.0 (also locally mirrored, originally from conradshome.com).
According to the included LEGAL.TXT, the 2.0 version of the installer bundled with early releases of the Windows 3.1 SDK is effectively freeware. (Just don’t sell it without combining it with “another software product which adds substantial value”.)
It doesn’t produce single-file installers, but it is iconic, capable of updating Windows 3.1x system files from a GUI installer, and it includes a tool for laying out floppy sets for your installer.
MojoSetup
The install wizard for Linux used by GOG.com and many other publishers for non-Steam releases of games.
Note that, if you’re not actively trying to replicate an aesthetic, I advise using either Flatpak or an archive people can just unpack for modern Linux games. Linux users don’t like Windows-style installers doodling all over their home directories.
Also, Flatpak makes “build once, run on every distro” easy by allowing you to sandbox both building and running your program to catch any accidental dependencies on the host system.
msitools (msitools and wixl packages on Debian-family Linux distros)
A portable toolset for creating and manipulating MSI files, allowing cross-building MSI installers from Linux.
NSIS 3.x
The Nullsoft Scriptable Install System. As long as you don’t use the Unicode true directive, it 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, which is 3.02). Open-source.
NSIS 1.98
Use this open-source tool if you want the distinctive “WinAMP installer” look. Open-source, but I’m not sure where the source is.
Open Watcom C/C++‘s installer
If you don’t mind your installer stub being under a “publish the source, even for private uses” license and having to figure out how to build it yourself, OpenWatcom C/C++ has a nifty, powerful, single-file installer which runs off a .inf file and can target DPMI-extended DOS, Win32, and, assuming it hasn’t bit-rotted, Win16 via Win386 (Watcom’s 32-bit extender).
Program Installer v2.0.1 for DOS by Pelikan
A very simple freeware installer TUI for DOS which essentially just presents a UI to let someone pick the install target, verifies that there’s enough free space, and then calls a decompressor of your choice (PKUNZIP.EXE is used in the example .ini file) with the appropriate arguments.
No fancy progress GUI or high degree of customization. On the downside, if you don’t find the .ini file self-evident, all the documentation is in Slovak and must be fed through Google Translate. On the upside(?), it plays a .mod music file of your choice while it’s running, including while it’s shelled out to the decompressor.
Originally found as install.zip on the SAC’s SK_MADE archive of shareware and freeware by Slovak authors but, since it’s so obscure, they don’t have per-file detail pages, and hotlinking is bad (mmkay?), I’m mirroring it here.
Qt Installer Framework
The Qt application framework for C++ and Python includes tooling for building installers for Windows, Linux, and macOS, and it doesn’t appear to be coupled to Qt-based applications any more tightly than “put your installable artifacts in the right folder(s) within the installer project.
Qt is available under LGPL and GPL licenses, and an installer’s code isn’t linked against what it installs or vice-versa, so your project doesn’t need to be under those licenses but you will need to provide sources for the installer if asked.
V8Power
The DOS utility similar to dialog which FreeDOS uses to build their CD installer out of batch files. If you’ve used Norton Batch Enhancer, think of it as a more powerful open-source alternative to that.
Wix# (WixSharp)
A transpiler that converts a script in a C#-like language into WiX XML markup or straight to an MSI file, allowing you to generate MSI-based installers without having to choke down the infamously obtuse design of WiX’s XML. If you really need a GUI interface, Nvninstaller might be an option, though it hasn’t been updated since it was open-sourced in 2018.

Tips:

  • Different major versions of InnoSetup can be installed on the same machine without stepping on each others’ toes.
  • While UnZipSFX from Info-Zip can be compiled to support a post-extraction command, doing so disables support for extracting to locations other than the current working directory.
  • NSIS 3.x can be used for cross-building Windows installers from Debian-family Linux systems (eg. Ubuntu) via the nsis package.

…for Info-ZIP Self-Extractors:

  • Before installer builders started to support single-file output natively, a common solution for downloadable single-file installers was to wrap their output in a self-extracting PKZIP or WinZIP archive, but no “free for commercial use” option I’ve found supports automatically unpacking to a temporary folder, running an installer, and then cleaning up when it exits.
  • Info-ZIP and ARJ both offer fully open-source ways to produce self-extracting archives for DOS, but, 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 prepending stuff.
  • Shareware distributors who had enough money to pay for an archive tool, but lacked the money to buy an install builder or the skill to write one would use a self-extracting archive with custom banner text.
  • 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.
  • The zipnote command for editing archive comments is very picky about its input data.
  • 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.
  • 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.

My Recommendations:

Target OS Desired Experience Installer to Use
Anything .msi WiX# [1] or msitools
Windows 2000+ 64-bit era InstallShield NSIS with ExperienceUI or UltraModernUI
Win2K/XP era NSIS with Modern UI [2]
InnoSetup
Windows 95+ Win2K/XP era NSIS with ModernUI [2]
Late Win9x era NSIS with InstallSpiderUI [3][4]
Early Win9x era InnoSetup 2.0.19 with WizardStyle=classic [5]
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. [6]
Can replace system files
MS Setup 2.0 [7]
DOS Only suits EXE Downloads Use Info-ZIP‘s self-extractor [8]
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 [9][10] or use whichever of the two ultra-simple install TUIs best fits your needs.
Also suitable for Floppy Images Use Installer v1.03 by Bloody Cactus Development Labs.

Footnotes:

  1. The instructions for getting WiX# to cross-build MSI installers via Wine are stored in the Codeplex archive. It’s easier to read them via the Wayback Machine.
  2. Included with NSIS
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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)

  9. 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.)
  10. 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.
  11. 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 using Open Watcom C/C++ to write a DOS analogue to InnoSetup or NSIS and I’ve been making a concerted effort to keep the code lean so it will be usable on floppy disk sets. (Including preferring custom wrappers around DOS and BIOS APIs over standard library functions where it will reduce the size of the final binary.)

Given that my goal is to use this sort of thing for nostalgic retrocomputing, I may even use the copy of Delphi 1.x on my Borland Delphi 2.x CD to to write a fork of 16-bit InnoSetup that can better mimic other nostalgic Win16 installers… though I’ll probably wait and see if the Win16 efforts by the Free Pascal crew reach a point where I wouldn’t be sharing new source that depends on a proprietary compiler.

(I should probably also decide whether it would be worthwhile to make a rundown of period-appropriate patching tools like BPatch, given how easy it now is to just download a whole new installer for something sized to fit on a retro PC.)

Posted in Geek Stuff, Retrocomputing | Leave a comment

Fanfiction – Ascend

This time, I decided to go for something full-length, but My Little Pony… because that’s just the mood I’ve been in recently.

Ascend by xTSGx

This one’s noteworthy because it beat canon to something that evoked quite a bit of fan controversy, but did it in a way which was self-aware and amusing: What if Twilight Sparkle became an alicorn?

In the My Little Pony setting, Celestia and Luna were originally portrayed as “gods in the literary sense” and, when Twilight Sparkle became one, it was seen by many as a sign that the quality of the series was falling in the wake of Lauren Faust moving on, merely as an excuse to pump out more merchandise.

In this story, it’s played in a much more appropriate setting: One morning, Twilight wakes up to find herself with wings to complement her horn. Naturally, her imagination runs away with her, she panics, and her plan to keep it secret sets the stage for Murphy to try his hand at comedy.

(And, importantly, it’s a novella-length “What if?” dedicated to the concept, rather than a sudden change in canon which usually has to time-share with normal episode-to-episode conflicts.)

Right out of the gate, her first solution is to reverse-engineer changeling magic to hide her new wings… and, sure enough, what should arrive in the mail just after she succeeds, but a subpoena to appear before the committee investigating the events which led up to Queen Chrysalis’s failed invasion attempt.

To quote Spike, “Looks like that implosion’s gonna happen sooner than I thought.” followed not long after by “Oh, come on! That’s so contrived!” when he tries to tell Princess Celestia anyway.

That said, aside from that one lampshaded contrivance, this is the polar opposite of those stories where events just keep getting drawn out through liberal use of the idiot ball or a refusal to just @#$%ing communicate. Instead, any mistakes which move the plot along are either of the “I might have made the same mistake in her situation” variety or the “Oh, Twilight. Why you gotta be so you?” variety. That helps to keep things satisfying.

The end result being a narrative in two phases:

For the first half, it fits its Slice of Life tag beautifully, with the vast majority of the narrative following Twilight interacting with her friends on what they see as an ordinary day. Events just sometimes lead some of them to discover her secret.

Shortly after the mid-point, that then changes when Twilight’s deception is revealed in the most public way possible. The second half is then dedicated to the aftermath of Twilight’s ascension coming out… a country populated by a species that produced the Flower Trio.

Humour-wise, it ranges from fairly typical humour (such as the thing that’s bubbling up within Twilight turning out to be a burp… in addition to the expected panic) to genre-savvy, trope-aware jokes which sometimes lean on the fourth wall without breaking it. (Including some “Spike voicing the readers” moments in the middle of the range, such as when Twilight rebuffs Spike’s efforts to prevent another Lesson Zero, and he grumbles about how he should just take a vacation and see how long it takes for a “Ponyville Exclusion Zone” to be established.)

Of course, my favourite joke has to be the history of the term “alicorn” that Twilight rambles off while trying to collect her wits after Rainbow Dash discovers her secret.

On the other end of things, I’m not a big fan of the dream interludes. “Flashing forward” to Twilight’s visions of how things could go wrong in the middle of something I’ve been primed to want more of just makes me want to skip past them… especially since each one’s significance to the primary story arc could be summed up in a paragraph or less of “after Twilight woke up” text.

That said, there is one exception. I love the joke which ends the dream sequence in chapter 9. So you don’t have to read the entire dream sequence if you don’t want to, here it is:

Pinkie looked somberly at the purple alicorn.

“Twilight, there’s something I have to tell you.”

“W-What?”

Pinkie grabbed hold of Twilight and faced her.

“It’s eight o’clock in the morning and you’re listening to Everfree Radio.”

As for the mentioned subpoena, the pacing of the story is such that Twilight actually going to Canterlot is an “on the horizon” thing for the vast majority of the fic. That said, the story does have a tonal thread of “Equestria is a real place with real politics” that surfaces occasionally… as evidenced by a scene where Twilight has to head off an argument between Rarity and Rainbow Dash over who’s the bad guy in one MP’s fight with the Cloudsdale Weather Factory. I’m neutral on that.

The story is complete at 61,412 words, with an incomplete sequel half as long. I’d rate it at a 4.2 out of 5. (4.3 if you edit out the interludes so they don’t disrupt the flow of the story.

 

Posted in Fanfiction | Leave a comment