Edenwaith Blog
20th September 2020 | Games
As I've written before, I play through at least one Quest For Glory game every year, and this year's was QFG3, probably the most polarizing entry of the entire series. It certainly has its fans (especially those who love the African narrative), but it definitely has more than its share of detractors. I am most certainly in the latter category. I still like the game far more than many other games, but it is easily the weakest game in this particular series. To make things a little more interesting, I applied a recent fan-made patch of the game which fixes a number of issues and even adds an extra scene or two. Let's see how things fared.
The Review
The Good:
- The art: The artistry of this game is quite superb, and the Sierra team knew how to take advantage of VGA graphics. The box art in particular is notable and stands out well against the other QFG games.
- Awari: This mini-game is my favorite addition to the game. Several months before I played QFG3, I had learned Mancala, a similar African board game.
- Characters: One of the defining features of QFG games are the unique and memorable characters, and QFG3 comes equipped with plenty of its own: Arne, Kalb, the junk merchants, plus the addition of a couple of gags like the Awful Waffle Walker and the French Legionnaires.
- Environment: The QFG series has not been immune from falling into the mountain village fantasy trope (QFG1 and 4 in particular), so QFG3 introduced a more unique environment which draws from numerous African settings (Egyptian, savanna, jungles).
The Bad:
- Way too short: Especially once the Leopardman has been caught, the rest of the game progresses very quickly. The first 250 points seem to move along pretty well, but the last 250 points progresses way too quickly.
- The Lost City is too small: There is very little to the Lost City, which is a squandered opportunity to have expanded the game. It is not much of a challenge, however the end battle is reminiscent of the end battle with Ad Avis in QFG2.
- The music: There is quite a bit of background music, but very little of it is overly memorable. I was listening to the QFG4 soundtrack, and it is amazing in comparison. Mark Seibert did an amazing job with the first two games, QFG4 is awesome, and Chance Thomas had an epic score with QFG5 which sounded like it belonged to a movie (which resulted in Chance leading a successful movement which brought game music into the Grammy Awards). The discordant chords after a battle are particularly annoying to me.
- The Thief got robbed: This game focused more on the new Paladin class, but at the expense of the other three classes, especially the Thief. Depending on how one approaches the game, he might only end up robbing a lonely, single place.
- Maxing stats: Trying to max out stats can be very difficult. There are not many places to practice climbing (however the patch does make it possible to practice climbing in the monkey village). Learning Lightning Ball so late in the game doesn't help to be a very useful skill.
New Things:
- Paladin Ceremony: Even though I tried to be bad, I ended up becoming a Paladin. Rakeesh makes you a Paladin right before the peace conference. Didn't seem to gain any special new abilities, so probably more useful to carry over to the next game. Normally I come into the game as a particular character, or am already a Paladin at the beginning, so this was a new scene to me.
- When I went to visit the Simbani village, Uhura was waiting out there and could talk with her a bit and the mourning the Simbani had for their deceased Laibon. This is an addition from the patch. I'm assuming there might have been some unused content that was discovered hidden in the game that was added back into to the game.
- During the Warrior trial, I read a fighter with climbing can also climb the tree. I have not tried this, but it provides for an interesting alternative to win the contest.
- During the Warrior trial, there was a bug with the new patch where the log did not appear, but it is possible to light the thorns on fire to get through. I only tried this on whim, but was very glad to see that this was possible.
- With the new path, the "bong music" in the apothecary sounds different, much more like a Jimi Hendrix riff.
There feels like some great potential to this game, but it fell short. Perhaps if resources had been spent on this game instead of the VGA remake of QFG1 that Wages of War would have been more flushed out. When I made King's Quest 1 - Redux, I focused on ways to improve upon the original game. I do not expect a remake of QFG3 to ever happen, but it would be fun to speculate on how the game can be improved.
Ways to Improve the Game:
- Better fighting system: I enjoyed the combat in Hero's Quest, QFG1 VGA, and QFG2, so this was not a new process, but the fighting system in QFG3 looks and feels kludgy. With some of the fights, the monster will be a floating head and arms with the body faded into the background. In the game, one of the Simbani mentions the Hyenamen, which might have been a potential monster (perhaps similar to the Jackalmen of QFG2) that didn't make the cut.
- Add more content:
- Considering how few side quests the thief had, allow the thief to sneak into the Liontaur section of Tarna and rob a place or few.
- Expand upon the Lost City. It felt like the developers ran out of steam (or time) and threw together a minimal amount of screens and called it good.
- More quests. This is the shortest of the QFG games, and far more could have been done to flush out the game further, especially for the non-Paladin classes.
- Yet another dispel potion: It was pretty novel in the first game, but became a worn out concept by the third. Still, the dispel potions were used effectively in this game (but not nearly as much in the 2nd game). I'm glad that dispel potions stopped after this game.
- Pacing: By adding more content, whether it be more side quests or expanding upon the Lost City, this wouldn't make the game feel quite so rushed once the Leopardman is captured.
This isn't a criticism of the game based upon its age, because there were better games around the same time period, but QFG3 faltered in a number of ways. The Quest for Glory series was originally imagined to be comprised of four games, each one representing the four cardinal directions and seasons. QFG3 was the game which was never originally intended (as evidenced by the end of QFG2 which mentioned that QFG3 was going to be Shadows of Darkness). Ultimately, this feels like an expansion pack to the QFG series which was used as a stop gap between Trial By Fire and Shadows of Darkness to let the hero grow a little more and to introduce the new Paladin class.
Bugs
In this latest playthrough I encountered a couple of frustrating bugs with the Fighter class, and here are the work arounds I performed to fix them.
Trying to give the Laibon the dinosaur horn to start the Warrior initiation
When I would go visit the Laibon, he would not accept the dinosaur horn, nor could I talk about it. The workaround I found was to drop (or place any existing dino horns in a trunk), then visit the Laibon to talk about about the initiation, and then go fight another dinosaur to get its horn, then the hero had a dialog option (click the mouth on ego) to tell about the dinosaur horn.
Trying to visit the Laibon after becoming a Warrior
After the initiation to become a Simbani Warrior, I could no longer visit the Laibon. One suggestion I read was right after the Initiation when the Laibon asks what favor you request, first ask about bride price so the Leopardwoman can be purchased.
No log in the second Warrior initiation rite
I believe this might be a bug due to the new 1.3.1a patch where the log does not appear. I tested the initiation with the pre-patch version and the log appeared. Fortunately, using your tinderbox on the ring of thorns also works as another option to get past this trial.
The 1.3.1a patch corrects a number of behind-the-scenes issues with this game, but there are a couple of other areas which could further improve the game.
Wages of War vs. Seekers of the Lost City
The subtitle on the QFG3 box reads Wages of War, but there are other references (such as in the About section of QFG4) to this game which say Seekers of the Lost City. Why the two subtitles? According to the series co-founder Corey Cole, QFG3 underwent a similar legal naming dispute as the first game did, which resulted in Hero's Quest being renamed to Quest For Glory. However, QFG3 was already out, so even though Sierra came up with an alternate subtitle of Seekers of the Lost City, it never ended up on any official game covers or documentation. If there had been another release of the game (in the manner that QFG4 was released with a follow up CD version), then perhaps the alternate title would have been used.
QFG3 Fan Patch
I was excited to see how the new QFG3 fan patch (version 1.3.1a as of this writing) worked with the game. The patch's GitHub web page describes the patch:
An unofficial update for Quest for Glory III: Wages of War that builds on Sierra's anthology release and NewRisingSun's speed fixes. Fixes crashes, lockups, dead ends, glitches, sprites/animations, sounds/music loops, and text. Restores cut content. Written in SCI programming language using the SCI Companion 3.0 tool. Please use the latest version!
New and Improved:
- This patch fixes a whole host of minor issues in the game (similar to what I did with King's Quest 1 - Redux).
- The biggest addition I found was the ability to talk with Uhura at the edge of the Simbani village right after the not-so-peaceful Peace Conference.
- The "bong music" in the apothecary sounds different, much more like a Jimi Hendrix guitar riff.
- Speed issues appear to be corrected. Trying to hit the moving target during the spear competition is actually feasible now.
Potential Fixes:
- As I mentioned above, there are still a couple of tricky bugs in the game when it comes to visiting and interacting with the Laibon.
- A new bug seems to have been introduced with the missing log in the second Warrior Initiation rite.
- I also never encountered any random Demon Worms when exploring the Tarna jungle and only found a single Ape Man battle. I'm not sure if this is related to the patch or just bad luck.
- Fighting is more difficult. Hero often dodges or parries when those commands were not used. Seems glitchy. The fighting system still sucks and is the worst of the entire series, but that is more of a gameplay issue outside of the realm of a patch.
Decoding the SAV files
One of the more unique features in the Quest for Glory games is the ability to transfer a character from one game to another game in the series. The only other games I can think of which had a similar feature were the gold box SSI games (Dragonlance, Forgotten Realms). This feature generally encourages the player to develop their skills as much as possible in one game so they will be better prepared at the start of the next game.
Unfortunately, QFG3 does not always give ample opportunities to properly develop all abilities (such as climbing or practicing the Lightning Ball spell). This then tickled my curiosity on learning how one might go about reverse engineering the exported character file. The exported SAV
file is quite small, only a couple hundred bytes in size, which makes it an ideal candidate to reverse engineer (far more feasible than trying to dig through a game's save file which is relatively much larger.
After doing some initial research, it appears that there had been some slight variations between the different QFG export files, but like reverse engineering the AGI files, some interesting encoding trickery was used to make the SAV
file's contents look like a random set of numbers which could not be easily gleaned of their true meaning. A couple of years ago, several others had dug deep into figuring out how to read and modify these files. The following are several resources of apps and web pages which can be used for viewing and altering Quest For Glory SAV
files.
References
19th September 2020 | Games
In honor of International Talk Like A Pirate Day, I've made it a yearly tradition to play some Monkey Island games. Over the course of many years I slowly replayed the remake of The Secret of Monkey Island. Earlier this year I replayed Monkey Island 2 (I enjoyed it more than the first time I played it more than 20 years ago, however the spitting contest puzzle is still awful), and now I'm onto the third entry in the series: The Curse of Monkey Island.
I still owned a boxed copy of this game, so I wanted to see if it would be possible to play it on modern systems, specifically under ScummVM. I did a quick search to see if this was possible, and I came across a page that almost seemed like what I was looking for. However, that web page merely referred the reader to the GoG.com product page. It's great that this game is available and playable under the Mac, but I did not want to have to repurchase a game I already own.
Fortunately, the way to install and play The Curse of Monkey Island under ScummVM on a Mac is fairly straightforward. Here's the instructions:
- Create a new folder which will contain the game files (e.g.
MI3
)
- Copy all of the contents of CD 1 into this folder.
- Copy the contents of CD 2's Resources folder into the Resources folder on your computer (e.g.
MI/Resources
). There will be a few duplicates, such as the font files, so skip those and let your Mac copy over the other files.
- Also from CD 2, copy the file
COMI.LA2
into the same folder which contains the files COMI.LA0
and COMI.LA1
. Your folder should look like the following screenshot.
- Launch ScummVM, Add Game, navigate to your folder which contains The Curse of Monkey Island.
- In ScummVM, start up The Curse of Monkey Island
This is possible because Curse was the twelfth and last LucasArts game to be developed using the SCUMM game engine, so I assumed that ScummVM would be able to handle playing this game on the Mac. (Side Note: If you want to play later LA games developed with the GrimE game engine like Grim Fandango or Escape From Monkey Island, check out ResidualVM.)
Have fun playing and watch out for that three-headed monkey behind you!
9th September 2020 | Games
These days, playing DOS-era computer games on modern computers is relatively easy thanks to DOSBox and ScummVM. Even games which were built with Windows XP in mind have a half-way decent chance of running properly under Windows 10. However, there is a half-decade span where things get sketchy: the Windows 9x era of the 1990s. Those games which were built exclusively for Windows 95 or 98 (but not for DOS or Windows NT) have not fared well in being able to run on newer systems.
Once I inserted the CD, the autorun started, prompting me to try and play the game. However, the install option was not enabled. I then tried to manually install the game by running the setup.exe
program. Windows 10 asked whether to trust the installer and then...nothing.
I first checked the Sierra Help website to see if there were any tips, but did not find what I was looking for to correct the installation issue. Fortunately, after a little further searching, I did come across what I was looking for, an updated installer which according to the website: Addresses issues some have with the original installer under XP/Vista. Installs all three discs to the hard drive for CD-less play. The updated installer for Gabriel Knight 3 can be downloaded here (mirror download link).
To start up the game, one might assume to go for the obvious GK3.exe file, but you will actually want to ignore that. Instead, click on Configure GK3.exe to initially set the resolution properties of the game. Set the options whether you want the game to run in a windowed or full screen mode and at what screen resolution. For streaming purposes, I selected Windowed mode at 800x600 resolution, which would have been a fairly standard gaming resolution in 1999.
Trying to start up the game by clicking on Gabriel Knight 3.exe might result in an error that says Sorry, this program requires support for 16-bit color mode.
To correct this issue, right-click on the Gabriel Knight 3.exe file and select Properties. Switch to the Compatibility tab. In the Settings, select the Reduced color mode checkbox and change the drop down menu to 16-bit (65535) color.
Once the game starts up, you will see the animated Sierra Studios logo, the intro, and then the game will begin. However, it only takes a bit of moving the camera to realize that things are quite wrong with the graphics performance. There are black boxes appearing around Gabriel and the rest of the screen flickers like mad. Fortunately, there is a quick fix for this.
- Right-click anywhere to bring up the game options
- Click on the Advanced Options button
- Click on the Graphic options button
- Deselect the Incremental Rendering checkbox
These instructions should get you started so you can start exploring Rennes-le-Château in all of its garish, blocky 3D glory! *sniff, sniff* Is that maple syrup I smell?
References
4th July 2020 | Permanent Eraser
Just three weeks since the last release, Permanent Eraser 2.9.0 has been released which focuses on several refinements and improvements for the app on macOS Mojave and Catalina. These resolved issues were discovered during the initial development of 2.9.0 (and subsequent development of 2.8.1). However, several of these issues (such as properly refreshing the progress indicator and preventing the "cannot check for malicious software" Gatekeeper warning on Catalina) required bumping up the minimum system requirements of the app which resulted in Permanent Eraser finally dropping support for PowerPC-based Macs.
For many years, I held off from dropping support for older computers and operating systems, especially since the primary function of Permanent Eraser is to securely erase files on mechanical hard drives, which are not so common these days. That was the primary reason that Apple removed Permanent Eraser from the Mac App Store, because this "could" cause harm to a person's computer, even though Permanent Eraser checks if a file is on an SSD, and if so, only erases the file once. However, changes in macOS Mojave and Catalina finally forced Permanent Eraser to upgrade a bit and drop support for PowerPC, 32-bit Intel (the earliest line of Intel-based Macs), and Mac OS X 10.5 Leopard.
What's new and improved in Permanent Eraser 2.9.0:
- Fixed progress indicator refreshing issue on macOS Mojave and Catalina.
- Fully Intel 64-bit, no longer runs on PowerPC or 32-bit systems.
- Adheres to Gatekeeper requirements on macOS Catalina.
- Tested on macOS Big Sur Beta 1 for potential issues.
- Note: Now requires Mac OS X 10.6 Snow Leopard or later.
As mentioned in the release for Permanent Eraser 2.8.1, Gatekeeper on macOS Catalina was throwing an invalid warning error that said that Apple could not check Permanent Eraser for malicious software. This is the type of message I'd expect if Permanent Eraser had not been properly code signed and notarized, but Permanent Eraser 2.8.1 had both of those in place. Fortunately, with Permanent Eraser 2.9.0, this error went away. My assumption is that dropping support for PowerPC and 32-bit Intel corrected this particular problem. Despite Permanent Eraser being removed from the Mac App Store (MAS), the previous attempt to submit Permanent Eraser 2.8.1 to MAS did clue me in that Apple only wants 64-bit software now, no legacy software. This might be due to Intel will soon be the new legacy as Apple announced at WWDC 2020 that it will be switching Macs over to their own custom Arm-based processors, currently dubbed Apple Silicon.
Fifteen years ago we saw Apple begin the process to migrate from PowerPC processors to Intel. We are seeing the same song and dance, and even a lot of the same actors, such as Rosetta, coming back onto the scene. Will Permanent Eraser run natively on Apple Silicon? For the current iteration of Permanent Eraser, the answer is likely 'no'. I would not be surprised if all Arm-based Macs going forward will only be equipped with SSDs, and if this does occur, then there is little reason for Permanent Eraser 2 to support these particular Macs. However, Permanent Eraser 3 will likely support Intel and Arm-based Macs.
I did a little preliminary testing of Permanent Eraser 2.9.0 on the first beta of the next version of macOS: Big Sur. As should be expected with any beta, it has its rough edges, and I encountered a couple of areas which did not look correct.
- The icons in the Preferences toolbar did not display: I'm not certain if this is a change in using glyphs for the OS iconography, or an issue with the app that will need to be updated to adhere to the new style.
- The plug-in does not work and claims there is an issue with one of the Automator actions: Once again, this might be an issue with Big Sur being in beta. I will need to check with a later version of Big Sur to determine if Permanent Eraser will need to be updated or if this is a beta issue.
Considering there could be some potential issues with Permanent Eraser and macOS Big Sur, a patch release could still be in the future before Permanent Eraser 3 is released. But for now, Permanent Eraser 2.9.0 address the most egregious of issues encountered with macOS Mojave and Catalina.
Update - 18 July 2020
Permanent Eraser 2.9.1 has been released to address an occasional crash which could occur when erasing the Trash on macOS Mojave.
References
24th June 2020 | Apple
Another year, another update to the plethora of Apple's operating systems. This year's macOS release — Big Sur — certainly has some big changes, most notably the first version that will run on Apple's upcoming Apple Silicon processors. There was also a visual refresh, more akin to the jump from Mavericks to Yosemite than moving from Mac OS 9 to X.
Installing beta software is always risky, and already I've read of a couple accounts where people have tried to install Big Sur on either an external disk or on another partition and encountered some nasty surprises (including bricking the computer). For now, installing Big Sur under a virtual machine (VM) might be the safer way to go until the software hardens up. In this post, I'll go over the steps and issues I encountered with installing the first beta version of macOS Big Sur under VMWare Fusion 11.5.5.
Download macOS Big Sur
The first step is to get a copy of the software. Unfortunately, Apple doesn't make this as straightforward as just downloading a single file. Log in to Apple's developer portal and go to the beta applications downloads page. Click on the Install Profile button to download the macOSDeveloperBetaAccessUtility.dmg
file. Open up the disk image and install the software. This will then allow you to download the beta version of Big Sur through the Software Update pane in System Preferences. Note how the window says macOS 10.16, yet Big Sur is actually version 11.0.
Creating a Big Sur ISO
To install macOS in VMWare Fusion, we need to generate an ISO from the downloaded Install macOS Beta.app
installer. The installer comes in at 9.57GB and another 22GB will be needed on top of another 60GB reserved for the VM.
// Create a DMG Disk Image
hdiutil create -o /tmp/BigSur -size 12000m -volname BigSur -layout SPUD -fs HFS+J
// Mount it to your macOS
hdiutil attach /tmp/BigSur.dmg -noverify -mountpoint /Volumes/BigSur
// Create macOS Big Sur Installer
sudo /Applications/Install\ macOS\ Beta.app/Contents/Resources/createinstallmedia --volume /Volumes/BigSur --nointeraction
On my first attempt, I initially reserved 10GB, expecting that would be large enough. Nope. That resulted in a "prelinkedkernel" error. Bumping things up to 11GB fixed the issue, though. I've seen some feedback mentioning that 11GB is not even enough, and it should now be 12GB.
// First attempt tried to make the volume sized at 10GB
% sudo /Applications/Install\ macOS\ Beta.app/Contents/Resources/createinstallmedia --volume /Volumes/BigSur --nointeraction
Password:
Erasing disk: 0%... 10%... 20%... 30%... 100%
Copying to disk: 0%... 10%... 20%... 30%... 40%... 50%... 60%... 70%... 80%... 90%... 100%
Making disk bootable...
Copying boot files...
Failed to copy boot file: “prelinkedkernel” couldn’t be copied to “PrelinkedKernels”.
The bless of the installer disk failed.
// Second attempt, successful at 11GB
% sudo /Applications/Install\ macOS\ Beta.app/Contents/Resources/createinstallmedia --volume /Volumes/BigSur --nointeraction
Password:
Erasing disk: 0%... 10%... 20%... 30%... 100%
Copying to disk: 0%... 10%... 20%... 30%... 40%... 50%... 60%... 70%... 80%... 90%... 100%
Making disk bootable...
Copying boot files...
Install media now available at "/Volumes/Install macOS Beta"
Next, I tried to unmount the Installl macOS Beta
disk, but encountered some errors. I ended up having to force eject the volume from the Finder.
// Unmount Big Sur Disk
hdiutil detach /Volumes/Install\ macOS\ Beta
hdiutil: couldn't unmount "disk4" - Resource busy
The final step is to convert the disk image and rename it to an ISO file.
// Convert the DMG file to an ISO file
hdiutil convert /tmp/BigSur.dmg -format UDTO -o ~/Desktop/BigSur.cdr
Reading Driver Descriptor Map (DDM : 0)…
Reading Apple (Apple_partition_map : 1)…
Reading (Apple_Free : 2)…
Reading disk image (Apple_HFS : 3)…
.....................................................................................................................
Elapsed Time: 1m 46.417s
Speed: 103.4Mbytes/sec
Savings: 0.0%
created: /Users/[username]/Desktop/BigSur.cdr
// Rename and Move to Desktop
mv ~/Desktop/BigSur.cdr ~/Desktop/BigSur.iso
Another Example
A helpful reader submitted this tip on what worked for them:
hdiutil create -o InstallMedia -size 20G -layout SPUD -fs HFS+J -type SPARSE
hdiutil attach InstallMedia.sparseimage -noverify -mountpoint /Volumes/install_build
sudo /Applications/Install\ macOS\ Big\ Sur\ Beta.app/Contents/Resources/createinstallmedia --volume /Volumes/install_build --nointeraction
hdiutil convert InstallMedia.sparseimage -format UDZO -o InstallMedia.dmg
Installing onto VMWare Fusion
Now that we have an ISO of Big Sur, we can install it on VMWare Fusion. Start up VMWare Fusion, create a new VM (File > New...
) then drag the ISO file onto the main window. Highlight BigSur.iso and click the Continue button. Since Big Sur is not recognized, just select macOS 10.15 for now.
On the Finish screen, you can customize the settings, which only allows the rename of the VM file. We'll need to modify some other settings later in the process.
The first problem I encountered was that the default 40GB for the VM was not going to be large enough for macOS Big Sur. As the installation began, I went into the VM settings and changed the hard drive size up to 60GB. However, this isn't as easy or as straightforward as it should be. Another step will be needed to ensure that the VM is the proper size.
At the Recovery screen of the installation process, select Disk Utility before continuing the installation of Big Sur.
If Disk Utility still only shows ~40GB, shut down the installation process, make sure that the VM HD settings show at least 60GB, and restart the process. I also recommend bumping up the VM's RAM from the default 2GB.
Now that the virtual drive's size has been increased, there should be enough space to install Big Sur. Quit out of Disk Utility and then click on Install macOS from the menu to continue the process to install the new operating system. I ran this on an iMac with a 2TB Fusion drive, so the install took awhile at times (and ran slower than a Mac SE), but it does give an early taste of the next version of macOS.
References
17th June 2020 | Permanent Eraser
I've had a tenuous relationship with the Mac App Store (MAS). The first version of Permanent Eraser to be released on MAS was 2.5.3 over eight years ago. When I tried to release version 2.6.0, it was rejected due to the optional plug-in (which was also present in the previous version). Since this was an important component to Permanent Eraser, I did not bother trying to release 2.6.0 on MAS. Years later I started getting reports from people that Permanent Eraser was not working for them, and I determined the issue was they were running the older MAS version of Permanent Eraser which encountered an issue on macOS Sierra due to that the srm
utility had been removed from the operating system. Permanent Eraser 2.6.0 added a custom build of srm
which allowed for alternate erasing patterns, but Permanent Eraser 2.5.3 still relied on the version of srm
which had previously been supplied by the operating system. I ended up releasing Permanent Eraser 2.7.2 and 2.7.3 onto the Mac App Store without any memorable issues or complications. I did not bother releasing Permanent Eraser 2.8.0 on MAS since the new feature to be able erase protected files required authorization rights, which would not have been permitted in a MAS version of the app. This brings us up to the current version of Permanent Eraser.
Due to the issue where Permanent Eraser 2.8.1 was getting a Gatekeeper warning (Apple cannot check for malicious software) when launching in macOS Catalina, I decided that perhaps submitting the latest version of the app to the Mac App Store would be a workaround for this particular issue until I can resolve it.
It's been several years since the last Mac App Store version of Permanent Eraser and things have certainly changed in that time. Application Loader has been retired and has been replaced by altool
and Transporter. The latter tool can upload ipa
and pkg
files, so I needed to bundle up the Mac app into a package. To do so, I packaged Permanent Eraser using the following (not entirely correct) command:
productbuild --component ./Permanent\ Eraser.app/ /Applications/ PermanentEraser.pkg
I then submitted the app via Transporter, and after a couple minutes of validation, it returned six errors.
ERROR ITMS-90237: "The product archive package's signature is invalid. Ensure that it is signed with your "3rd Party Mac Developer Installer" certificate."
ERROR ITMS-90240: "Unsupported Architectures. Your executable contained the following disallowed architectures: '[i386 (in com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/Library/Automator/Erase.action/Contents/MacOS/Erase), none (in com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/Library/Automator/Erase.action/Contents/MacOS/Erase)]'. New apps submitted to the Mac App Store must support 64-bit starting January 2018, and Mac app updates and existing apps must support 64-bit starting June 2018."
ERROR ITMS-90240: "Unsupported Architectures. Your executable contained the following disallowed architectures: '[i386 (in com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/Library/Automator/EraseFreespace.action/Contents/MacOS/EraseFreespace), none (in com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/Library/Automator/EraseFreespace.action/Contents/MacOS/EraseFreespace)]'. New apps submitted to the Mac App Store must support 64-bit starting January 2018, and Mac app updates and existing apps must support 64-bit starting June 2018."
ERROR ITMS-90240: "Unsupported Architectures. Your executable contained the following disallowed architectures: '[i386 (in com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/Library/Automator/EraseTrash.action/Contents/MacOS/EraseTrash), none (in com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/Library/Automator/EraseTrash.action/Contents/MacOS/EraseTrash)]'. New apps submitted to the Mac App Store must support 64-bit starting January 2018, and Mac app updates and existing apps must support 64-bit starting June 2018."
ERROR ITMS-90240: "Unsupported Architectures. Your executable contained the following disallowed architectures: '[i386 (in com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/MacOS/Permanent Eraser, com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/Resources/srm), none (in com.edenwaith.mac.permanenteraser.pkg/Payload/Permanent Eraser.app/Contents/Resources/srm)]'. New apps submitted to the Mac App Store must support 64-bit starting January 2018, and Mac app updates and existing apps must support 64-bit starting June 2018."
WARNING ITMS-90788: "Incomplete Document Type Configuration. The CFBundleDocumentTypes dictionary array in the 'com.edenwaith.mac.permanenteraser' Info.plist should contain an LSHandlerRank value for the CFBundleTypeName 'All' entry. Refer to https://developer.apple.com/library/archive/documentation/General/Reference/ InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-SW1 for more information on the LSHandlerRank key."
Lovely. Fortunately, most of these issues were relatively easy to fix.
Code Signing a Package
For the first issue, I originally thought it was questioning which certificate I used to sign the app. My code signing of the app was correct, it was code signing the package file which I forgot to do. I logged into the Apple Developer portal and created a new Mac Installer Distribution certificate which I could use to properly sign the pkg
file. Once I had the new certificate, I then built and signed the package:
productbuild --component ./Permanent\ Eraser.app/ /Applications/ PermanentEraser.pkg --sign "3rd Party Mac Developer Installer: John Doe (12AB34567C)"
Removing the Fat
For years, Apple has been heavily "encouraging" developers to ensure that their software is entirely 64-bit compliant. Things ultimately came to a head with the release of macOS Catalina which disallowed any 32-bit software and brought about the end to older applications and frameworks. Current trending predictions are that Apple will soon announce that they will be transitioning their Macs over to ARM processors, and if so, the movement towards 64-bit software might have been part of a multi-year plan.
Four of the warnings complain about the presence of any non-64 Intel architectures. There are two different command line tools which can be used to see what architectures are present in a binary: file
and lipo
. The following displays what architectures were present in the secure removal utility srm
:
% file srm
srm: Mach-O universal binary with 4 architectures: [ppc_7400:Mach-O executable ppc_7400] [x86_64:Mach-O 64-bit executable x86_64]
srm (for architecture ppc7400): Mach-O executable ppc_7400
srm (for architecture ppc64): Mach-O executable ppc64
srm (for architecture i386): Mach-O executable i386
srm (for architecture x86_64): Mach-O 64-bit executable x86_64
% lipo -info srm
Architectures in the fat file: srm are: ppc7400 ppc64 i386 x86_64
The results show that srm
contained four architectures, two for PowerPC (ppc7400 and ppc64), and two for Intel (i386 and x86_64). To remove the unwanted architectures, we use lipo
, a utility which does what it sounds like: it sucks out the fat from a fat binary.
% lipo -remove ppc7400 srm -o srm
% lipo -remove ppc64 srm -o srm
% lipo -remove i386 srm -o srm
% lipo -info srm
Architectures in the fat file: srm are: x86_64
After this "surgery", srm
has been slimmed down so it now only contains the 64-bit Intel architecture.
LSHandlerRank
The last issue was relatively trivial, but did require a bit of research to determine how I was going to fix the issue. I ultimately just needed to add the LSHandlerRank
key-value pair in the app's Info.plist file. As things change over time, Apple's requirements and expectations have, as well, including minor issues such as this.
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>*</string>
</array>
<key>CFBundleTypeName</key>
<string>All</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>****</string>
</array>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
</dict>
</array>
Now that I had fixed these six issues, I resubmitted the build, and it passed the automatic verification step. Next came the real fun: the App Review.
App Review: Round 1 - Prepopulating the Full Disk Access List
One thing I found recently is that reviews for Mac apps tend to occur within a couple of hours of being submitted during the weekdays, whereas an iOS app can take around a day (which is still far better than the 10-14 day review process it used to take). So I ended up getting my first reviewer rejection fairly quickly.
Guideline 2.1 - Performance
We discovered one or more bugs in your app when reviewed on Mac running macOS 10.15.4.
Specifically, your app does not display in the Full Disk Access menu to be enabled for use.
In my initial testing of Permanent Eraser 2.9.0 (which predated PE 2.8.1), I saw Permanent Eraser listed in the Full Disk Access list, but in later builds of Permanent Eraser 2.8.1, I was no longer seeing that listed. To detect if Full Disk Access needed to be enabled, I checked to see if the user's Trash could be read. If not, then I assumed that Full Disk Access was not enabled. The extra trick here is that the code needs to try and access the contents of the Trash to act as the trigger so that Permanent Eraser would be pre-populated in the Full Disk Access list.
Once I updated my code, I submitted the app again.
App Review: Round 2 - Rejected for the Help Files
Design Preamble
The user interface of your app is not consistent with the macOS Human Interface Guidelines.
Specifically, we found that the content gets cut off when resizing the app window to a smaller size. When resizing it to the minimum size, the content disappears.
Upon initially reading this rejection, I was confused. The Permanent Eraser window does not resize, so I did not understand what their complaint would be or how the app was not adhering to good HIG. Fortunately, a screenshot was attached...of the help viewer. Since Catalina displays a more narrow help viewer window, the landing page of the help files were cut off on the right (but easily visible by resizing the window). I rejected this rejection and notified the reviewer that this was not a valid complaint and that these help files are based off of one of Apple's own templates! Still, I begrudgingly acquiesced and updated the main help page. Fortunately, my past experience as a web developer came in handy as I made some small updates to the page so it would flow better with smaller display ports. It was a ridiculous reason to reject the app, in my opinion, but I continued to play ball with Apple and made the necessary changes before submitting another build.
App Review: Round 3 - Potentially Harmful
Guideline 2.4.2 - Performance - Hardware Compatibility
Your app contains features, which when used, may cause damage to the user's device.
Specifically, your app overwrites data numerous times in order to "securely erase" it.
You know that scene where Clark Griswald goes on a swearing rant and eventually asks where the Tylenol is? I was definitely feeling those vibes by this point. Now the app was getting rejected for its primary purpose to securely erase files! I carefully explained to the reviewer that the app does not overwrite data numerous times on newer SSDs (which is effectively pointless), and that functionality is reserved for mechanical hard drives. I pointed out that this safeguard has been in Permanent Eraser for the past eight year since version 2.6.0. The following is even stated in the help files:
Per Permanent Eraser's help files: "Files which reside on a Solid State Drives (SSD) will only be overwritten once, due to the wear leveling technique used by SSDs when writing to the drive."
Despite my appeal, Apple continued to reject the app. However, a subsequent response did at least reveal a little bit more information.
Guideline 2.4.2 - Performance - Hardware Compatibility
Your app contains features, which when used, may cause damage to the user’s device.
Specifically, your app securely erase files from system.
Additional Notes:
There was a Policy change regarding file erasing apps since your last update.
Considering that any other file erasing app listed on the Mac App Store hadn't been updated in at least a year, I wouldn't be surprised if this was a new policy that was instituted, but never clearly defined or announced. This hinted that Apple had "altered the deal" once again, but without explicitly dictating what and why they were rejecting apps like Permanent Eraser.
Even after I explicitly described (and showed the documentation) that PE does not perform multiple overwrites of files which are on SSDs, they continued to reject my submission. I can understand why Apple no longer supports secure file erasing and removed it from macOS several years ago, their deafness to developers has been incredibly frustrating and infuriating.
While the Mac App Store version has never been my main focus, it has been frustrating to see that Apple has continued making the Mac more and more restrictive and frustrating to develop for. By this point, I was resigned that Permanent Eraser 2.8.1 was not going to make it into the Mac App Store.
App Review: Final Round - Threatened App Removal
A day after the last rejection, I got this "Policy Notification" from Apple:
From Apple
2.4.2 - Efficient power use
Please review this information carefully as it impacts your app’s availability on the App Store and requires your immediate action.
Hello,
We are writing to let you know about new information regarding your app.
Upon re-evaluation, we found that your app is not in compliance with the App Store Review Guidelines. Specifically, we found your app is in violation of the following:
Guideline 2.4.2 - Performance - Hardware Compatibility
Your app contains features, which when used, may cause damage to the user's device.
Specifically, your app overwrites data numerous times in order to “securely erase” it.
Next Steps
To resolve this issue, please revise your app to remove any feature that may result in damaging the user's device. Apps should not rapidly drain the device battery, generate excessive heat, or put unnecessary strain on device resources – this includes cryptocurrency mining in the background or in third-party advertisements.
To ensure there is no interruption of the availability of your app on the App Store, please submit an update within two weeks of the date of this message. If we do not receive an update compliant with the App Store Review Guidelines within two weeks, your app will be removed from sale. Please note, if your app is found to be out of compliance for any reason and rejected after the time period provided has elapsed, your app will be removed from sale until a compliant update is submitted, approved and released to the App Store.
In order to return your app to the App Store, you will need to submit an updated version for review which addresses these issues.
If you have any questions about this information, please reply to this message to let us know.
Best regards,
App Store Review
Ever had those moments when someone spits in your face, and then later follows up with a kick to the teeth? I'd probably be more insulted by this backhand from Apple if I hadn't already accepted that an update to Permanent Eraser in the Mac App Store was a lost cause by this point.
Right now, I am far from the only one right now having a dispute with Apple and their app store policies. Fortunately, Permanent Eraser has a better alternative as an independent app which does not need to be as restrained by the Mac App Store guidelines. If Permanent Eraser had been an iOS app undergoing such scrutiny, the only options would be change or die.
If Apple makes good their promise/threat, I expect that Permanent Eraser will be removed from the Mac App Store soon. What I will find more interesting will be if Apple will update their guidelines to explicitly forbid file erasing utilities and if they will also remove other similar apps (a quick search for "file shredder" comes up with 13 different apps on the Mac App Store).
Will Permanent Eraser ever return to the Mac App Store? I have some grand plans for what I'd like to include in Version 3, but depending on how much more Apple continues locking down the Mac, it could severely limit the effectiveness of Permanent Eraser, especially if its capabilities continue to be limited under the Mac App Store restrictions. When Permanent Eraser 3 is released, I'll then evaluate whether it might be a candidate for the Mac App Store, or if it is best left roaming outside of that walled garden.
Even if Permanent Eraser's involvement with the Mac App Store comes to an abrupt end, its progress will continue. Permanent Eraser 2.9.0 is intended as a fast(ish) follow up which will address an animation issue on macOS Mojave and Catalina, and will also take a look at macOS 10.16 which is expected to be announced in several days at WWDC 2020.
References
16th June 2020 | Permanent Eraser
Plans are meant to provide guidance and direction, but even with the best of intentions, they can be led astray. When Permanent Eraser 2.8.0 was released, the original intention was that 2.8 was going to be the last significant release of the app until 3.0 was completed. Unfortunately, changes in the latest two versions of macOS (Mojave and Catalina) have caused numerous issues with Permanent Eraser which needed to be addressed first before moving onto the more grander ambitions of the next major version. Numerous people have written in to mention that Permanent Eraser was having issues on macOS Catalina, especially regarding erasing the Trash. After some investigation I discovered that Apple has further increased their security measures, which included locking down the Trash. To allow Permanent Eraser the ability to once again erase files from the Trash, the user needs to enable Full Disk Access. Permanent Eraser 2.8.1 is intended as a stopgap measure to help address some of the most egregious issues with Catalina and Mojave.
- Updated for better compatibility with macOS Catalina and Mojave.
- Updated Help files to instruct how to enable Full Disk Access and Automator Actions.
- Code signed and notarized for macOS Catalina.
- Updated app icon for non-retina displays.
- Tested and verified for macOS Mojave and Catalina.
Several weeks ago, I was doing some final testing and was just about ready to release Permanent Eraser 2.8.1. I had tested across a variety of systems from a PowerBook G4 running Mac OS X Leopard to an iMac running macOS Catalina, and things were looking good for the most part. Then Murphy’s Law inevitably interceded...
On macOS Catalina, I downloaded the DMG containing the final version of Permanent Eraser, and when I opened the app, this message appeared.
One of the key things I focused on with this release was adhering to Apple's increased security, which meant code signing and the new notarization process. I had already notarized a number of games and EdenMath 1.2.2, none which had encountered this particular issue. I performed the standard checks and verified that the app was properly code signed and notarized, yet Gatekeeper was being fiendish and elusive in its reasons for suspecting that something wasn't quite proper with the app.
I checked through the console logs, particularly looking for anything mentioning Xprotect
which might give me a hint why I was getting this error. Unfortunately, I still have not resolved this particular issue, which caused me to pause on releasing the app for two weeks. However, if you are using Permanent Eraser 2.8.1 on Catalina and receive this error, right-click on the app and select Open and follow the steps to allow Permanent Eraser to be opened. This is an issue I'm going to continue investigating to try and correct for Permanent Eraser 2.9.0.
In my investigations to determine why Catalina's Gatekeeper was complaining, I did learn something new in the process. Disk images (dmg) can also be code signed and notarized, not just apps and packages.
codesign --force --sign "Developer ID Application: John Doe (12AB34567C)" <pathToDMG>
spctl -a -t open --context context:primary-signature -v <pathToDMG>
The original plan was to release PE 2.9.0, until I realized that to fully implement all of the improvements would require a little more effort than I had originally expected. As I was working through the set of issues which PE was having on newer versions of macOS, I had resolved most of them, but one issue was still prominent: the progress bar was not updating properly, and this was especially noticeable on Catalina and Mojave. The progress bar might make an initial jump, but then it wouldn’t move much (if at all) until it was done erasing. I researched this issue and discovered a way to resolve it, but it required using newer technology (hello GCD!) than what the base version of PE could provide.
I have always tried to support as many versions of macOS as possible and have always been cautious about raising the base minimum for my apps. However, in this case, there are likely more people using macOS Mojave and Catalina than are using Leopard, so to resolve some of the most egregious issues on Catalina, I’ll need to finally drop support for Mac OS X Leopard and PowerPC processors. It’s been a great run, and I held off as long as possible, but that time has come to an end. PE 2.8.1 is final gift for older versions of macOS/OS X/Mac OS X, especially those that might still be running on a PowerPC processor.
When I was starting work on PE 2.9.0, I initially imported it into Xcode 11, and encountered a lot of deprecation warnings in my code. This is yet another sign of the times that the next major version of Permanent Eraser will be a massive rewrite to bring PE into the modern age. There are many parts of PE’s code which are still original from 17 years ago, and the way it was originally architected shows. That the app still manages to run on modern systems is a small miracle in itself, especially considering how Apple tends to force developers to continually keep up with the "latest and greatest."
So much of the code has become deprecated over the years, that it is certainly tempting to throw away every line of Objective-C code and start fresh with Swift. To Objective-C's credit, though, the language has remained fairly stable, even with the additions of Objective-C 2.0 and ARC, unlike the rapid mutations that Swift underwent for its first couple of years. Hopefully Swift (currently at version 5.2) will remain relatively stable so any future updates won't require a bunch of unwanted maintenance just because the language changed again.
Regarding app rewrites: I eventually did an entire rewrite of the iOS version of EdenList because there had been so many changes in iOS development since EdenList's release in 2010, that I could no longer make changes to the original code without something breaking. That forced my hand to perform a complete rewrite of the app. EdenList is only a couple thousand lines of code and is a fairly simple iOS app. Permanent Eraser is far larger and more complex, so I imagine rewriting and reworking the app will take a significant and focused effort. However, it is not just rewriting the app which will be so time consuming, but the addition of many new features I’d like to include into the app.
Next up will be Permanent Eraser 2.9.0 and reasons why it won't be available on the Mac App Store.
References
13th June 2020 | Programming
One of the most derided and cringe-worthy lines squawked by Cedric the Owl in King's Quest 5 was "Graham, watch out! A poisonous snake!" However, this was not the first time that a King's Quest game misused the term "poisonous" to describe a "venomous" snake. In King's Quest 2, a "poisonous viper" is obstructing King Graham from obtaining one of the golden keys. I thought it would be fun to hack the game and actually make the snake "poisonous".
Using AGI Studio, I opened up the 56th LOGIC file, which is the source code for the screen on the plateau with the snake. I first started by making a small change to the initial message to mirror Cedric's warning:
if (!isset(f108) &&
!isset(f109) &&
!isset(f110)) {
print("Watch out! A poisonous snake!");
}
A poisonous snake would only be lethal if consumed, especially if it secreted a toxic substance which would be deadly to intrepid adventurers. Instead of letting the snake get a taste Graham, let's let Graham get in his own "licks". Since the Sierra games of the 80s were parser-driven, there is a dictionary of words that the game understands. In King's Quest 2, there are up to 255 word groups. Each word group can contain multiple terms which are similar in meaning. A person might type "get rock"
or "take stone"
, and the game would (or should) understand that both phrases mean the same thing.
Once again, using AGI Studio, I opened up the WORDS.TOK file (where all of the tokenized words reside), and searched for the word "eat". It initially found the phrase "leather bridle", which does contain the string "eat", but not quite what I was originally looking for. Continuing the search brought up the "consuming" word group which contained the words "consume", "eat", and "taste". I then added the extra word "lick" to this group and saved the changes to WORD.TOK. Now the game will understand the word "lick".
The final piece of this playful hack is to add the code to allow Graham to lick the "poisonous" snake. At line 10, add the lines:
load.view(92);
load.view(91);
This code pre-loads the two views #92 and #91, which are Graham's choking animation and his death sprite, respectively. Next, at line 85 in the file logic.056
I added the following code.
if (said("consume","snake")) {
if (isset(f31)) {
print("You bend over and lick the poisonous snake.");
set(f147);
get.posn(o0,v67,v68);
if (v68 < 45) {
v67 = 0;
v68 = 5;
reposition(o0,v67,v68);
}
program.control();
set(f92);
set.view(o0,92);
v94 = 3;
cycle.time(o0,v94);
end.of.loop(o0,f93);
}
}
if (isset(f93)) {
set.priority(o0,15);
set.view(o0,91);
set(f50);
}
There are two parts to this chunk of code. The first part checks to see if the player typed in some variant of "consume snake" such as "lick snake", "eat viper", "taste snake", etc. When this happens, the game then loads in view #92 to display Graham choking after licking the poisonous snake. Once the animation completes, flag f93
is set. After the game interpreter loops again through the script, it will come across the second part of this code snippet since the f93
flag has been set. Graham's character is then swapped from the choking animation to the death sprite (View #91). Finally flag f50
is set, which triggers the death sequence.
Happy hacking and watch out for those "poisonous" snakes!
References
26th April 2020 | EdenList
A small update for EdenList for iOS has been released which corrects a couple of UI issues for Dark Mode and verifies that the app works properly on iPad OS 13.4.
- Dark Mode and UI improvements
- Verified and tested for iPad OS 13
26th April 2020 | Permanent Eraser
As with the previous iteration of macOS, Catalina has increased its security measures, which has caused complications with existing software. I have received numerous reports that Permanent Eraser is not fully functional under macOS Catalina, primarily with erasing the contents of the Trash (however, individual files which are not in the Trash can still be erased). The primary cause for this issue is that Full Disk Access is required for apps (such as Terminal or Permanent Eraser) to access the contents of the Trash. Since Permanent Eraser was not able to find the contents in the Trash, it was not erasing anything. The following steps detail how to enable Full Disk Access for Permanent Eraser so it can erase files from the Trash in Catalina:
- Open up the System Preferences (
> System Preferences
)
- Select the Security & Privacy pane.
- Click on the Privacy tab.
- Click on the lock in the bottom-left corner and type in your administrator credentials to unlock it.
- Select the Full Disk Access option in the left pane.
- Click on the + button and add Permanent Eraser to the list of approved applications for Full Disk Access. Make sure that the checkbox to the left of Permanent Eraser is checked.
- Close the System Preferences window
These steps will resolve the largest problem Permanent Eraser has on macOS Catalina, but an update is in the works to resolve other smaller issues Permanent Eraser has with Catalina.