“What's going on!? A spaceship came crashing down! Oh my stars, look at that hole!”
“The Sword of
Kumdor” (クムドールの剣) is a touch-typing RPG for the
NEC PC‑98, created by Michiaki Tsubaki in 1991. You play as
the Milky Way's #1 typist, summoned to planet Kumdor to
fight mysterious monsters by typing spells — but you lose all your
keyboard keys and your QWERTY skills in a crash landing. Can
you recover your talents and save the world??
The game has a
surreal atmosphere, quirky dialogue, and a distinctive visual style.
Japanese fansites call it “my favorite childhood RPG” and
“an underrated masterpiece.” I think it deserves more
recognition, so I translated the game to English.
Kumdor has
the strangest control scheme ever. Outside of combat and
spell-casting, only the
F
, J
, and
Space
keys are used, so as to keep even a novice typist's
hands in the home row position at all times. F
walks
forward and Space
turns you 90° clockwise. You get used
to it, sorta.
Download the translation patch here.
The translation is
released as an xDelta patch. To apply
it, I suggest you use
xdelta UI, but if you prefer using the command line, try:
xdelta -d -s "The Sword of Kumdor.hdm" kumdor-english.xdelta kumdor-english.hdm
To run the patched game in an emulator, load it into FDD Slot #1 and
reboot. You will need BIOS files (specifically
SOUND.ROM
)
placed in the emulator folder,
or else the game crashes when you walk out of the
tutorial.
Your keyboard
likely has fewer keys than the JIS keyboard used by the PC-98. As
such, when playing in an emulator, you may have trouble typing
^
and _
. In Neko Project II, you can use the
on-screen keyboard, or create a text file next to
np21w.exe
called key.txt
with the following
contents:
TAB = ^ CTRL = SHIFT _
Now you can type these symbols by pressing Tab and Ctrl. In general, the layout of punctuation is different, so you may have to relearn some of the locations. (This might be a bit frustrating, but by the end, you will have actually mastered the PC-98 keyboard layout, which is the point of the game!)
If you've never
emulated PC-98 games before,
PC-98 Emulation For Beginners
is a great resource.
My playtesting was greatly assisted by rocky75's fan site, which contains a thorough tutorial in Japanese. If you're stuck, I suggest referring to it with the help of your favorite machine translation service.
I found this overworld map (spoiler!) floating around on the Internet.
You can browse the Mac version's manual: also in Japanese, but contains plenty of cute illustrations. (Kumdor was released as a book with the game floppies on the inside.)
Finally, there's my
code repository, where
all the translating and patch-writing and sprite-dumping happens.
To make a delicious
keyboard/fruit pun, I translated
クムの木
as "keytree", so that クムの実 could be
"keylime". That makes クム酒 "keywine".
The "whithervane"
is called 風見ダヌキ
(weather-seeing tanuki) in Japanese, which is a play on the actual
word for a weather-vane,
風見鶏 (weather-seeing chicken, like
"weathercock").
I think the ダイビング equipment shop that pivots into a タイピング equipment shop is a visual kana pun.
Fivetown is called ヨゴンナ in Japanese, which is goroawase for 4567, the keys found there.
Translating the spells was interesting: there's no way to do it
without affecting the game balance. For example, to cast
CURE
, you need a different set of keyboard keys than for
the original NAOSU
. (Thankfully spells are just not very
useful anyway! Shop items are easier to get and just as good.)
Kumdor
came out two years after the highly successful release of
Mother for the Famicom. There are some similar themes: an alien
invader causes chaos on a modern low-fantasy planet, RPG tropes are
subverted and riffed on, and all is resolved in a slightly psychedelic
final encounter. I can't say for certain what inspired Tsubaki, but
some of the "mundanely funny" dialogue in this game reminds me of
Shigesato Itoi's style. I often kept the quirky, matter-of-factly
voice of EarthBound's localization in the back of my mind when writing
this translation.
This
translation is my first ever romhacking project. I had a lot of fun!
I used np2debug,
Ghidra, a hex editor, and
Python. For translation, I relied on my own Japanese-reading and
English-writing skills.
Kumdor has a weird custom file system, so I had to treat the ROM as a unit rather than dumping files from it. Thankfully, the text is almost all consolidated in uncompressed sections of null-separated Shift-JIS data, so finding and dumping and reimporting it was super easy. Writing translations took about a month and a half. The game text is about 7,200 words in English.
This intro was difficult to translate. The handwritten text is stored as thousands of little line segment coordinates in a strange data layout. I reverse-engineered the format by corrupting the data in weird ways and seeing what happens. Then I programmed a tool for editing this format, and handwrote a translation with a tablet pen. (You can see the process here.)
The popular dump of this game that floats around online triggers a copy protection check that freezes the game right before the final dungeon! I never really bothered to figure out what exactly it's checking. I used a debugger and Ghidra to find the instruction responsible for locking up the game, and disabled it.
When picking
up an item, the game joins two strings together with code somewhat
like this:
pick_up_item: ... mov di, 0xc000 // Reset the message buffer mov cl, al // Load the item ID call write_item_name // Append its name to the buffer mov cl, 0x1b // Index of "を拾った。" call write_common_string // Append to the buffer ...
This builds a string like
"呪文書を拾った。"
, which I can only translate part-by-part as
"scroll was obtained."
. The grammar is awkward, and as
a full sentence, it's missing capitalization.
Dissatisfied, I got my hands dirty and wrote some assembly patches to print my own bits of text. I had to figure out a way to inject code of my own without moving any of the surrounding code, as that would dislocate a bunch of pointers.
pick_up_item: ...mov di, 0xc000// Overwrite a 3-byte instruction here call you_got_a // Call my cool new subroutine instead mov cl, al call write_item_name mov cl, 0x1b // I've translated "を拾った。" as "." call write_common_string ... // Far, far away, in a blank region of ROM: you_got_a: mov di, 0xc000 // The instruction we overwrote push ax mov cl, 0x60 // Index of "You got a " (my new string) call write_common_string // Append to the buffer pop ax ret
All to get nice messages like
"You got a scroll."
. It was totally worth it.
The game's
soundtrack is a bit outré so I turned it off after an hour or
so. I listened to suitably psychedelic electronic music instead and I
can highly recommend this. For example:
Sorry, let me
collapse somewhere out of your way.
— Lynn