Fixes for bishoujo games

by Takuya Aihara (aiharasama (at-sign-separator) geocities.com)

If you've ever tried playing a Windows port of a bishoujo game that's been translation to English, particularly under Windows XP, you've undoubtedly discovered the #1 problem with such ports: the fonts are screwed up. Well, something can be done about it: patch!

A couple of notes, though:

  1. You must have the correct executable. Check the name, byte size, and MD5 footprint.
  2. Back up the old executable and your save games before proceeding.
  3. Don't contact the publisher for support with a modified executable. Make sure you revert to a clean executable, save file, and data files and confirm that the same problem occurs with an unmodified setup.

All patches are in the form of:

address: old-byte replacement-byte

This output matches the output of the Windows command-line "fc" utility in binary mode (/b). If the old-bytes don't match, you cannot apply the patch without reanalyzing the executable and modifying the patch appropriately.

Now that we've gotten that out of the way, let's patch!

Back to home page.

Tokimeki Check-in! (Crowd / Peach Princess)

Executable name: CHECKIN.EXE
Executable size: 188,416 bytes
Executable MD5 checksum: ae4cda3d66c85683ffbd134b67c349d5

The way you encounter women in this game resembles chaos theory.

Font stretching fix

If you've tried the game "Tokimeki Check-in!", you may have gotten interesting text like this:

This is caused by the game requesting the font Fixedsys with the Japanese character set, which typically causes other fonts to be chosen instead, and then stretched to meet a rather wide width request. To fix:

000159DC: 08 00
00015A09: 80 00
00015B74: F2 90
00015B75: AE 90

This patches a CreateFontIndirectA call to width=0 and charset=default, then defeats an intrinsic strlen() to turn off a psuedo-bold effect that makes the text hard to read.

Font name change

Optionally, change icky Fixedsys to Arial:

00020808: 46 41
00020809: 69 72
0002080A: 78 69
0002080B: 65 61
0002080C: 64 6C
0002080D: 53 00

Arial is narrower on average than Fixedsys, so this may result in some text being crunched to the left, but the increased readability is typically well worth it.


X-Change 1 (Crowd / Peach Princess)

Executable name: XCHANGE.EXE
Executable size: 237,568 bytes
Executable MD5 checksum: 543627cd344816d3bf4da62a42a8f4b1

I swear I didn't spill that beaker on myself on purpose.

Font stretching fix

It turns out that X-Change 1 has a similar engine to Tokimeki Check-in!, and thus has the same font problems. Fortunately, the solutions are still the same. Patch as follows:

00009093: 08 00
000090C0: 80 00
00009174: F2 90
00009175: AE 90

Font change patch

Patch as follows to force Arial:

000125E0: 46 41
000125E1: 69 72
000125E2: 78 69
000125E3: 65 61
000125E4: 64 6C
000125E5: 53 00

It is recommended that you leave the font as Fixedsys, however, since X-Change 1 doesn't darken the dialogue background as much as Tokimeki Check-in! and thus plain Arial can be difficult to read.


Brave Soul (Crowd / Peach Princess)

Executable name: brave_s.exe
Executable size: 495,616 bytes
Executable MD5 checksum: 9820920a8c5e44c176f1e916c53bce47

Color Caroll's hair orange and call her Lina.

The patches in this section are for the 20031215 patch from Peach Princess (patch 2). You must update to the 20031215 patch before applying these manual patches. Not only does the Peach Princess patch fix a lot of crashing problems, it also installs an unprotected executable — the original executable is wrapped with a copy protection wrapper and is very difficult to patch.

Windows XP ClearType fix

Microsoft's ClearType font antialiasing technology results in font rendering spreading out slightly outside of the requested position. This results in purple fringes in text in Brave Soul due to interference with the surrounding color key. This can be bypassed by temporarily disabling ClearType, but that is very annoying and it is easier to apply this patch:

00019C36: FF E8
00019C37: 15 17
00019C38: 3C D0
00019C39: 80 04
00019C3A: 46 00
00019C3B: 00 90
00066C52: CC C6
00066C53: CC 40
00066C54: CC 17
00066C55: CC 00
00066C56: CC C6
00066C57: CC 40
00066C58: CC 1A
00066C59: CC 03
00066C5A: CC FF
00066C5B: CC 25
00066C5C: CC 3C
00066C5D: CC 80
00066C5E: CC 46
00066C5F: CC 00

The patch reroutes the only call to CreateFontIndirectA to a small routine that patches the character set from Shift-JIS to default and sets the rendering mode to NONANTIALIASED_QUALITY. (It would be preferable only to patch those fonts that require it, but there are a large number of routines in the game that create LOGFONT structures and this is a much easier solution.)


True Love (Software Parsley / Otaku)

Executable name: T_LOVE95.EXE
Executable size: 212,992 bytes
Executable MD5 checksum: 798144499771abdd5d2d3ac62105b5bf

True Love is probably the closest we'll ever see to an English version of Tokimeki Memorial. *sigh*

Font fix

True Love has a habit of coming up with a very blocky font that makes the text hard to read. For some reason, the application asks for GDI to match its requested metrics exactly even if the resulting font looks horrible — usually because GDI chooses something like Small Fonts 6 and scales it up. To fix this, patch the call to CreateFontA() to change the requested quality from DRAFT_QUALITY to DEFAULT_QUALITY, and as usual, change the character set from Shift-JIS to default ANSI:

0000254E: 01 00
00002556: 80 00

This usually makes True Love display its dialogue text in MS Sans Serif, or another more agreeable font.


Immoral Story (ScooP / Himeya Soft)

Executable name: Immoral1.exe
Executable size: 95,744 bytes
Executable MD5 checksum: b8bf96743bb04eefc5344848f7eb854e

I won't comment on the story, but the full-screen animations are a distinctive touch.

Crash workaround

Immoral Story unfortunately has a habit of crashing under Windows NT/2000/XP in its blitter routine, caused by an out-of-bounds blit. This is somewhat non-trivial to work around and requires a rather large patch:

00002510: 55 60
00002511: 8B 68
00002512: EC 72
00002513: 53 31
00002514: 56 40
00002515: 57 00
00002516: 56 33
00002517: 57 C0
00002518: 8B 64
00002519: 5D FF
0000251A: 10 30
0000251B: 0B 64
0000251C: DB 89
0000251D: 74 20
0000251E: 4E 8B
0000251F: 8B C4
00002520: 55 8B
00002521: 14 78
00002522: 0B 2C
00002523: D2 8B
00002524: 74 70
00002525: 47 30
00002526: 29 8B
00002527: 5D 58
00002528: 18 34
00002529: 29 8B
0000252A: 5D 68
0000252B: 1C 38
0000252C: 8B 0B
0000252D: 75 FF
0000252E: 0C 74
0000252F: 8B 3A
00002530: 7D 0B
00002531: 08 F6
00002532: 0B 74
00002533: FF 36
00002534: 74 0B
00002535: 37 ED
00002536: 0B 74
00002537: F6 32
 
00002538: 74 29
00002539: 33 58
0000253A: 8B 3C
0000253B: CF 29
0000253C: 83 58
0000253D: E1 40
0000253E: 03 8B
0000253F: B8 C7
00002540: 04 F7
00002541: 00 D8
00002542: 00 83
00002543: 00 E0
00002544: 2B 03
00002545: C1 3B
00002546: 3B C3
00002547: C3 76
00002548: 72 02
00002549: 02 8B
0000254A: 8B C3
0000254B: C3 2B
0000254C: 8B D8
0000254D: C8 8B
0000254E: F3 C8
0000254F: A4 F3
00002550: 8B A4
00002551: CB 8B
00002552: 2B CB
00002553: C8 C1
00002554: 50 E9
00002555: 8B 02
00002556: C1 F3
00002557: C1 A5
00002558: E9 8B
00002559: 02 CB
0000255A: F3 83
0000255B: A5 E1
0000255C: 83 03
0000255D: E0 F3
0000255E: 03 A4
0000255F: 8B 03
 
00002560: C8 7C
00002561: F3 24
00002562: A4 3C
00002563: 58 03
00002564: 03 74
00002565: 75 24
00002566: 1C 40
00002567: 03 4D
00002568: 7D 75
00002569: 18 E3
0000256A: 4A 33
0000256B: 75 C0
0000256C: DF 64
0000256D: 5F 8F
0000256E: 5E 00
0000256F: 5F 58
00002570: 5E 61
00002571: 5B C3
00002572: 5D 8B
00002573: C3 4C
00002574: 90 24
00002575: 90 0C
00002576: 90 33
00002577: 90 C0
00002578: 90 E9
00002579: 90 E8
0000257A: 90 00
0000257B: 90 00
0000257C: 90 00
00002665: 90 C7
00002666: 90 81
00002667: 90 B8
00002668: 90 00
00002669: 90 00
0000266A: 90 00
0000266B: 90 6A
0000266C: 90 31
0000266D: 90 40
0000266E: 90 00
0000266F: 90 C3

This patch rewrites the blitter to be more compact and wraps an exception handler around it to trap the out-of-bounds writes. A debugger will show two first-chance access violations every time the main menu screen appears.


Back to home page.
Archived on july 7th 2010 by classpc