[Scummvm-git-logs] scummvm master -> cf7a1e44941ea838f302b325527dabefa9ae12e2

athrxx noreply at scummvm.org
Fri May 12 14:08:00 UTC 2023


This automated email contains information about 19 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
6ab1af3cc4 KYRA: (EOB II/PC98) - add detection entry
141c62eaa9 KYRA: (EOB II/PC98) - add static resources
19dbab27da KYRA: (EOB II/PC98) - fix startup
204b501841 KYRA: (EOB II/PC98) - fix intro and main menu text
99d8f6146c KYRA: (EOB II/PC98) - adapt file formats
8d339d00df KYRA: (EOB II/PC98) - font/layout fixes
6ae5b0d6b3 KYRA: (EOB II/PC98) - more work on the text display
6380c9da0e KYRA: (EOBII) - improve intro scrolling
4be42a4fb6 KYRA: (EOB) - fix text glitch
57077022f2 KYRA: (EOB) - fix level music glitch
e1706afa12 KYRA: (EOB/SegaCD) - fix minor gfx glitch
7c43617dc5 KYRA: (EOB II/PC98) - more text/font related work and cleanup
82421879ee KYRA: (EOB II/PC98) - adapt keyboard mapping
5c8e799b22 KYRA: some var renames
b28ec9260f KYRA: (EOB II/PC98) - menu text fixes
67f374c798 KYRA: (EOB II/PC98) - fix saveload strings
aca46ac5a4 KYRA: (EOB II/PC98) - fix party transfer dialog
77976efabe KYRA: (EOB II/PC98) - fix party transfer JIS font conversion
cf7a1e4494 KYRA: (EOB) - fix warnings


Commit: 6ab1af3cc4e5e770d26d628621047df2d77fa24a
    https://github.com/scummvm/scummvm/commit/6ab1af3cc4e5e770d26d628621047df2d77fa24a
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:50:42+02:00

Commit Message:
KYRA: (EOB II/PC98) - add detection entry

Changed paths:
    engines/kyra/detection_tables.h


diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h
index ce573c75888..9219b43556b 100644
--- a/engines/kyra/detection_tables.h
+++ b/engines/kyra/detection_tables.h
@@ -69,6 +69,7 @@ namespace {
 #define EOB_PC98_FLAGS FLAGS(false, false, false, false, true, true, false, false, false, Kyra::GI_EOB1)
 #define EOB2_FLAGS FLAGS(false, false, false, false, false, false, false, false, false, Kyra::GI_EOB2)
 #define EOB2_FMTOWNS_FLAGS FLAGS(false, false, false, false, true, false, true, false, false, Kyra::GI_EOB2)
+#define EOB2_PC98_FLAGS FLAGS(false, false, false, false, true, false, false, false, false, Kyra::GI_EOB2)
 #define EOB2_TALKIE_FLAGS FLAGS(false, false, true, false, false, false, false, false, false, Kyra::GI_EOB2)
 
 static const char msg_missingLangResources[]			= _s("Missing language specific game code and/or resources.");
@@ -2103,6 +2104,22 @@ const KYRAGameDescription adGameDescs[] = {
 		EOB2_FLAGS
 	},
 
+	{
+		{
+			"eob2",
+			0,
+			{
+				{ "AAD_LOGO.CPS", 0, "a0951ff3cce7fcbd57b8152278eac3eb", -1 },
+				{ 0, 0, 0, 0 }
+			},
+				Common::JA_JPN,
+				Common::kPlatformPC98,
+				ADGF_NO_FLAGS,
+				GUIO7(GUIO_NOSPEECH, GUIO_MIDIPC98, GUIO_MIDIMT32, GUIO_MIDIGM, GUIO_RENDERPC9821, GUIO_RENDERPC9801, GAMEOPTION_EOB_HPGRAPHS)
+		},
+		EOB2_PC98_FLAGS
+	},
+
 	{ AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) }
 };
 


Commit: 141c62eaa9608cfa34b70f2d0e062c9efe48d545
    https://github.com/scummvm/scummvm/commit/141c62eaa9608cfa34b70f2d0e062c9efe48d545
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:50:46+02:00

Commit Message:
KYRA: (EOB II/PC98) - add static resources

(also make some initial adjustments to the code, but it will throw an assert for now)

Changed paths:
  A devtools/create_kyradat/resources/eob2_pc98.h
  A devtools/create_kyradat/resources/eob2_pc98_japanese.h
    devtools/create_kyradat/create_kyradat.cpp
    devtools/create_kyradat/create_kyradat.h
    devtools/create_kyradat/games.cpp
    devtools/create_kyradat/resources.cpp
    devtools/create_kyradat/resources/eob1_segacd_english.h
    devtools/create_kyradat/resources/eob1_segacd_japanese.h
    devtools/create_kyradat/resources/eob2_amiga_english.h
    devtools/create_kyradat/resources/eob2_amiga_german.h
    devtools/create_kyradat/resources/eob2_fmtowns.h
    dists/engine-data/kyra.dat
    engines/kyra/engine/chargen.cpp
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/resource/resource.h
    engines/kyra/resource/staticres.cpp
    engines/kyra/sequence/sequences_darkmoon.cpp


diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp
index f5372db6726..1984eedd5e9 100644
--- a/devtools/create_kyradat/create_kyradat.cpp
+++ b/devtools/create_kyradat/create_kyradat.cpp
@@ -38,7 +38,7 @@
 
 
 enum {
-	kKyraDatVersion = 120
+	kKyraDatVersion = 121
 };
 
 const ExtractFilename extractFilenames[] = {
@@ -601,6 +601,10 @@ const ExtractFilename extractFilenames[] = {
 	{ kEoB2IntroAnimData41, kEoB2SequenceData, false },
 	{ kEoB2IntroAnimData42, kEoB2SequenceData, false },
 	{ kEoB2IntroAnimData43, kEoB2SequenceData, false },
+	{ kEoB2IntroAnimData44, kEoB2SequenceData, false },
+	{ kEoB2IntroAnimData45, kEoB2SequenceData, false },
+	{ kEoB2IntroAnimData46, kEoB2SequenceData, false },
+	{ kEoB2IntroAnimData47, kEoB2SequenceData, false },
 	{ kEoB2IntroShapes00, kEoB2ShapeData, false },
 	{ kEoB2IntroShapes01, kEoB2ShapeData, false },
 	{ kEoB2IntroShapes04, kEoB2ShapeData, false },
@@ -1049,7 +1053,8 @@ const ExtractFilename extractFilenames[] = {
 	{ kEoB2Config2431Strings, kStringList, true },
 	{ kEoBBaseTextInputCharacterLines, kStringList, true },
 	{ kEoBBaseTextInputSelectStrings, kStringList, true },
-	{ kEoB2FontDmpSearchTbl, kRawDataBe16, false },
+	{ kEoB2FontLookupTbl, kRawDataBe16, false },
+	{ kEoB2FontConvertTbl, kRawData, false },
 	{ kEoB2Ascii2SjisTables, kStringList, false },
 	{ kEoB2Ascii2SjisTables2, kStringList, false },
 	{ kEoBBaseSaveNamePatterns, kStringList, true },
diff --git a/devtools/create_kyradat/create_kyradat.h b/devtools/create_kyradat/create_kyradat.h
index 0c4e80d9271..e01ff61909b 100644
--- a/devtools/create_kyradat/create_kyradat.h
+++ b/devtools/create_kyradat/create_kyradat.h
@@ -756,6 +756,11 @@ enum kExtractID {
 	kEoB2IntroAnimData42,
 	kEoB2IntroAnimData43,
 
+	kEoB2IntroAnimData44,
+	kEoB2IntroAnimData45,
+	kEoB2IntroAnimData46,
+	kEoB2IntroAnimData47,
+
 	kEoB2IntroShapes00,
 	kEoB2IntroShapes01,
 	kEoB2IntroShapes04,
@@ -1052,7 +1057,8 @@ enum kExtractID {
 
 	kEoB2UtilMenuStrings,
 	kEoB2Config2431Strings,
-	kEoB2FontDmpSearchTbl,
+	kEoB2FontLookupTbl,
+	kEoB2FontConvertTbl,
 	kEoB2Ascii2SjisTables,
 	kEoB2Ascii2SjisTables2,
 	kEoB2PcmSoundEffectsIngame,
diff --git a/devtools/create_kyradat/games.cpp b/devtools/create_kyradat/games.cpp
index faf3fa6d06f..a64df300f34 100644
--- a/devtools/create_kyradat/games.cpp
+++ b/devtools/create_kyradat/games.cpp
@@ -143,7 +143,7 @@ const Game eob2Games[] = {
 	{ kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY },
 	{ kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU },
 
-	//{ kEoB2, kPlatformPC98, kNoSpecial, JA_JPN },
+	{ kEoB2, kPlatformPC98, kNoSpecial, JA_JPN },
 
 	{ kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN },
 
@@ -3676,7 +3676,7 @@ const int eob2AmigaNeed[] = {
 
 	-1
 };
-/*
+
 const int eob2PC98Need[] = {
 	kEoBBaseChargenStrings1,
 	kEoBBaseChargenStrings2,
@@ -3844,9 +3844,6 @@ const int eob2PC98Need[] = {
 	kEoBBaseDscTelptrShpCoords,
 
 	kEoBBasePortalSeqData,
-	kEoBBaseManDef,
-	kEoBBaseManWord,
-	kEoBBaseManPrompt,
 
 	kEoBBaseDscMonsterFrmOffsTbl1,
 	kEoBBaseDscMonsterFrmOffsTbl2,
@@ -3919,14 +3916,18 @@ const int eob2PC98Need[] = {
 	kEoB2IntroAnimData41,
 	kEoB2IntroAnimData42,
 	kEoB2IntroAnimData43,
+	kEoB2IntroAnimData44,
+	kEoB2IntroAnimData45,
+	kEoB2IntroAnimData46,
+	kEoB2IntroAnimData47,
 
 	kEoB2IntroShapes00,
 	kEoB2IntroShapes01,
 	kEoB2IntroShapes04,
 	kEoB2IntroShapes07,
+	kEoB2IntroShapes13,
 
 	kEoB2FinaleStrings,
-	kEoB2CreditsData,
 	kEoB2FinaleCPSFiles,
 	kEoB2FinaleAnimData00,
 	kEoB2FinaleAnimData01,
@@ -3999,11 +4000,15 @@ const int eob2PC98Need[] = {
 	kRpgCommonDscDimMap,
 	kRpgCommonDscBlockIndex,
 
+	kEoB2Ascii2SjisTables,
+	kEoB2Ascii2SjisTables2,
+	kEoB2FontConvertTbl,
+
 	kEoBBaseSoundFilesIntro,
 	kEoBBaseSoundFilesFinale,
 
 	-1
-};*/
+};
 
 const int eob2FMTownsNeed[] = {
 	kEoBBaseChargenStrings1,
@@ -4557,7 +4562,7 @@ const int eob2FMTownsNeed[] = {
 	kEoB2Config2431Strings,
 	kEoBBaseTextInputCharacterLines,
 	kEoBBaseTextInputSelectStrings,
-	kEoB2FontDmpSearchTbl,
+	kEoB2FontLookupTbl,
 	kEoB2Ascii2SjisTables,
 	kEoB2Ascii2SjisTables2,
 	kEoBBaseSaveNamePatterns,
@@ -4630,7 +4635,7 @@ const GameNeed gameNeedTable[] = {
 	{ kEoB2, kPlatformDOS, kNoSpecial, eob2FloppyNeed },
 	{ kEoB2, kPlatformDOS, kTalkieVersion, eob2FloppyNeed },
 	{ kEoB2, kPlatformAmiga, kNoSpecial, eob2AmigaNeed },
-	//{ kEoB2, kPlatformPC98, kNoSpecial, eob2PC98Need },
+	{ kEoB2, kPlatformPC98, kNoSpecial, eob2PC98Need },
 	{ kEoB2, kPlatformFMTowns, kNoSpecial, eob2FMTownsNeed },
 
 	{ -1, -1, -1, nullptr }
diff --git a/devtools/create_kyradat/resources.cpp b/devtools/create_kyradat/resources.cpp
index 9ecba81861c..72515baf4cb 100644
--- a/devtools/create_kyradat/resources.cpp
+++ b/devtools/create_kyradat/resources.cpp
@@ -140,8 +140,8 @@
 #include "resources/eob2_amiga.h"
 #include "resources/eob2_amiga_english.h"
 #include "resources/eob2_amiga_german.h"
-//#include "resources/eob2_pc98.h"
-//#include "resources/eob2_pc98_japanese.h"
+#include "resources/eob2_pc98.h"
+#include "resources/eob2_pc98_japanese.h"
 #include "resources/eob2_fmtowns.h"
 #include "resources/eob2_fmtowns_japanese.h"
 
@@ -4837,13 +4837,307 @@ static const ResourceProvider resourceProviders[] = {
 	{ kEoB2Config2431Strings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2Config2431StringsFMTownsJapaneseProvider },
 	{ kEoBBaseTextInputCharacterLines, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2TextInputCharacterLinesFMTownsJapaneseProvider },
 	{ kEoBBaseTextInputSelectStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2TextInputSelectStringsFMTownsJapaneseProvider },
-	{ kEoB2FontDmpSearchTbl, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FontDmpSearchTblFMTownsProvider },
+	{ kEoB2FontLookupTbl, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FontLookupTblFMTownsProvider },
 	{ kEoB2Ascii2SjisTables, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2Ascii2SjisTablesFMTownsProvider },
 	{ kEoB2Ascii2SjisTables2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2Ascii2SjisTables2FMTownsProvider },
 	{ kEoBBaseSaveNamePatterns, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2SaveNamePatternsFMTownsJapaneseProvider },
 	{ kEoB2PcmSoundEffectsIngame, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2PcmSoundEffectsIngameFMTownsProvider },
 	{ kEoB2PcmSoundEffectsIntro, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2PcmSoundEffectsIntroFMTownsProvider },
 	{ kEoB2PcmSoundEffectsFinale, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2PcmSoundEffectsFinaleFMTownsProvider },
+	{ kEoBBaseNpcPresetsNames, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2NpcPresetsNamesPC98JapaneseProvider },
+	{ kEoBBaseChargenStrings1, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ChargenStrings1PC98JapaneseProvider },
+	{ kEoBBaseChargenStrings2, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ChargenStrings2PC98JapaneseProvider },
+	{ kEoBBaseChargenStartLevels, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ChargenStartLevelsPC98Provider },
+	{ kEoBBaseChargenStatStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ChargenStatStringsPC98JapaneseProvider },
+	{ kEoBBaseChargenRaceSexStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ChargenRaceSexStringsPC98JapaneseProvider },
+	{ kEoBBaseChargenClassStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ChargenClassStringsPC98JapaneseProvider },
+	{ kEoBBaseChargenAlignmentStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ChargenAlignmentStringsPC98JapaneseProvider },
+	{ kEoBBaseChargenEnterGameStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ChargenEnterGameStringsPC98JapaneseProvider },
+	{ kEoBBaseChargenClassMinStats, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ChargenClassMinStatsPC98Provider },
+	{ kEoBBaseChargenRaceMinStats, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ChargenRaceMinStatsPC98Provider },
+	{ kEoBBaseChargenRaceMaxStats, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ChargenRaceMaxStatsPC98Provider },
+	{ kEoBBaseSaveThrowTable1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable1PC98Provider },
+	{ kEoBBaseSaveThrowTable2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable2PC98Provider },
+	{ kEoBBaseSaveThrowTable3, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable3PC98Provider },
+	{ kEoBBaseSaveThrowTable4, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable4PC98Provider },
+	{ kEoBBaseSaveThrwLvlIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SaveThrwLvlIndexPC98Provider },
+	{ kEoBBaseSaveThrwModDiv, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SaveThrwModDivPC98Provider },
+	{ kEoBBaseSaveThrwModExt, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SaveThrwModExtPC98Provider },
+	{ kEoBBasePryDoorStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2PryDoorStringsPC98JapaneseProvider },
+	{ kEoBBaseWarningStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2WarningStringsPC98JapaneseProvider },
+	{ kEoBBaseItemSuffixStringsRings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ItemSuffixStringsRingsPC98JapaneseProvider },
+	{ kEoBBaseItemSuffixStringsPotions, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ItemSuffixStringsPotionsPC98JapaneseProvider },
+	{ kEoBBaseItemSuffixStringsWands, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ItemSuffixStringsWandsPC98JapaneseProvider },
+	{ kEoBBaseRipItemStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2RipItemStringsPC98JapaneseProvider },
+	{ kEoBBaseCursedString, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CursedStringPC98JapaneseProvider },
+	{ kEoBBaseEnchantedString, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2EnchantedStringPC98Provider },
+	{ kEoBBaseMagicObjectStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicObjectStringsPC98JapaneseProvider },
+	{ kEoBBaseMagicObjectString5, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicObjectString5PC98JapaneseProvider },
+	{ kEoBBasePatternSuffix, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2PatternSuffixPC98JapaneseProvider },
+	{ kEoBBasePatternGrFix1, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2PatternGrFix1PC98JapaneseProvider },
+	{ kEoBBasePatternGrFix2, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2PatternGrFix2PC98JapaneseProvider },
+	{ kEoBBaseValidateArmorString, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ValidateArmorStringPC98JapaneseProvider },
+	{ kEoBBaseValidateCursedString, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ValidateCursedStringPC98JapaneseProvider },
+	{ kEoBBaseValidateNoDropString, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ValidateNoDropStringPC98JapaneseProvider },
+	{ kEoBBasePotionStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2PotionStringsPC98JapaneseProvider },
+	{ kEoBBaseWandStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2WandStringsPC98JapaneseProvider },
+	{ kEoBBaseItemMisuseStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ItemMisuseStringsPC98JapaneseProvider },
+	{ kEoBBaseTakenStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2TakenStringsPC98JapaneseProvider },
+	{ kEoBBasePotionEffectStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2PotionEffectStringsPC98JapaneseProvider },
+	{ kEoBBaseYesNoStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2YesNoStringsPC98JapaneseProvider },
+	{ kRpgCommonMoreStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MoreStringsPC98JapaneseProvider },
+	{ kEoBBaseNpcMaxStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2NpcMaxStringsPC98JapaneseProvider },
+	{ kEoBBaseOkStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2OkStringsPC98JapaneseProvider },
+	{ kEoBBaseNpcJoinStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2NpcJoinStringsPC98JapaneseProvider },
+	{ kEoBBaseCancelStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CancelStringsPC98JapaneseProvider },
+	{ kEoBBaseAbortStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2AbortStringsPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsMain, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsMainPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsSaveLoad, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsSaveLoadPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsOnOff, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsOnOffPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsSpells, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsSpellsPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsRest, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsRestPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsDrop, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsDropPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsExit, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsExitPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsStarve, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsStarvePC98JapaneseProvider },
+	{ kEoBBaseMenuStringsScribe, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsScribePC98JapaneseProvider },
+	{ kEoBBaseMenuStringsDrop2, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsDrop2PC98JapaneseProvider },
+	{ kEoBBaseMenuStringsHead, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsHeadPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsPoison, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsPoisonPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsMgc, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsMgcPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsPrefs, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsPrefsPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsRest2, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsRest2PC98JapaneseProvider },
+	{ kEoBBaseMenuStringsRest3, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsRest3PC98JapaneseProvider },
+	{ kEoBBaseMenuStringsRest4, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsRest4PC98JapaneseProvider },
+	{ kEoBBaseMenuStringsDefeat, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsDefeatPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsTransfer, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsTransferPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsSpec, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuStringsSpecPC98JapaneseProvider },
+	{ kEoBBaseMenuStringsSpellNo, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MenuStringsSpellNoPC98Provider },
+	{ kEoBBaseMenuYesNoStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MenuYesNoStringsPC98JapaneseProvider },
+	{ kEoBBaseSpellLevelsMage, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SpellLevelsMagePC98Provider },
+	{ kEoBBaseSpellLevelsCleric, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SpellLevelsClericPC98Provider },
+	{ kEoBBaseNumSpellsCleric, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2NumSpellsClericPC98Provider },
+	{ kEoBBaseNumSpellsWisAdj, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2NumSpellsWisAdjPC98Provider },
+	{ kEoBBaseNumSpellsPal, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2NumSpellsPalPC98Provider },
+	{ kEoBBaseNumSpellsMage, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2NumSpellsMagePC98Provider },
+	{ kEoBBaseCharGuiStringsHp, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsHpPC98JapaneseProvider },
+	{ kEoBBaseCharGuiStringsWp2, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsWp2PC98JapaneseProvider },
+	{ kEoBBaseCharGuiStringsWr, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsWrPC98JapaneseProvider },
+	{ kEoBBaseCharGuiStringsSt2, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsSt2PC98JapaneseProvider },
+	{ kEoBBaseCharGuiStringsIn, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsInPC98JapaneseProvider },
+	{ kEoBBaseCharStatusStrings7, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings7PC98JapaneseProvider },
+	{ kEoBBaseCharStatusStrings82, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings82PC98JapaneseProvider },
+	{ kEoBBaseCharStatusStrings9, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings9PC98JapaneseProvider },
+	{ kEoBBaseCharStatusStrings12, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings12PC98JapaneseProvider },
+	{ kEoBBaseCharStatusStrings132, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings132PC98JapaneseProvider },
+	{ kEoBBaseLevelGainStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2LevelGainStringsPC98JapaneseProvider },
+	{ kEoBBaseExperienceTable0, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable0PC98Provider },
+	{ kEoBBaseExperienceTable1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable1PC98Provider },
+	{ kEoBBaseExperienceTable2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable2PC98Provider },
+	{ kEoBBaseExperienceTable3, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable3PC98Provider },
+	{ kEoBBaseExperienceTable4, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable4PC98Provider },
+	{ kEoBBaseBookNumbers, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2BookNumbersPC98JapaneseProvider },
+	{ kEoBBaseMageSpellsList, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MageSpellsListPC98JapaneseProvider },
+	{ kEoBBaseClericSpellsList, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2ClericSpellsListPC98JapaneseProvider },
+	{ kEoBBaseSpellNames, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2SpellNamesPC98JapaneseProvider },
+	{ kEoBBaseMagicStrings1, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicStrings1PC98JapaneseProvider },
+	{ kEoBBaseMagicStrings2, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicStrings2PC98JapaneseProvider },
+	{ kEoBBaseMagicStrings3, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicStrings3PC98JapaneseProvider },
+	{ kEoBBaseMagicStrings4, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicStrings4PC98JapaneseProvider },
+	{ kEoBBaseMagicStrings6, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicStrings6PC98JapaneseProvider },
+	{ kEoBBaseMagicStrings7, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicStrings7PC98JapaneseProvider },
+	{ kEoBBaseMagicStrings8, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MagicStrings8PC98JapaneseProvider },
+	{ kEoBBaseExpObjectTlMode, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTlModePC98Provider },
+	{ kEoBBaseExpObjectTblIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTblIndexPC98Provider },
+	{ kEoBBaseExpObjectShpStart, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExpObjectShpStartPC98Provider },
+	{ kEoBBaseExpObjectTbl1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl1PC98Provider },
+	{ kEoBBaseExpObjectTbl2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl2PC98Provider },
+	{ kEoBBaseExpObjectTbl3, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl3PC98Provider },
+	{ kEoBBaseExpObjectY, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ExpObjectYPC98Provider },
+	{ kEoBBaseSparkDefSteps, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkDefStepsPC98Provider },
+	{ kEoBBaseSparkDefSubSteps, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkDefSubStepsPC98Provider },
+	{ kEoBBaseSparkDefShift, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkDefShiftPC98Provider },
+	{ kEoBBaseSparkDefAdd, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkDefAddPC98Provider },
+	{ kEoBBaseSparkDefX, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkDefXPC98Provider },
+	{ kEoBBaseSparkDefY, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkDefYPC98Provider },
+	{ kEoBBaseSparkOfFlags1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkOfFlags1PC98Provider },
+	{ kEoBBaseSparkOfFlags2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkOfFlags2PC98Provider },
+	{ kEoBBaseSparkOfShift, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkOfShiftPC98Provider },
+	{ kEoBBaseSparkOfX, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkOfXPC98Provider },
+	{ kEoBBaseSparkOfY, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SparkOfYPC98Provider },
+	{ kEoBBaseSpellProperties, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SpellPropertiesPC98Provider },
+	{ kEoBBaseMagicFlightProps, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MagicFlightPropsPC98Provider },
+	{ kEoBBaseTurnUndeadEffect, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2TurnUndeadEffectPC98Provider },
+	{ kEoBBaseBurningHandsDest, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2BurningHandsDestPC98Provider },
+	{ kEoBBaseConeOfColdDest1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest1PC98Provider },
+	{ kEoBBaseConeOfColdDest2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest2PC98Provider },
+	{ kEoBBaseConeOfColdDest3, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest3PC98Provider },
+	{ kEoBBaseConeOfColdDest4, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest4PC98Provider },
+	{ kEoBBaseConeOfColdGfxTbl, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdGfxTblPC98Provider },
+	{ kRpgCommonDscDoorShapeIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorShapeIndexPC98Provider },
+	{ kEoBBaseWllFlagPreset, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2WllFlagPresetPC98Provider },
+	{ kEoBBaseDscShapeCoords, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscShapeCoordsPC98Provider },
+	{ kRpgCommonDscDoorScaleOffs, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleOffsPC98Provider },
+	{ kEoBBaseDscDoorScaleMult1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult1PC98Provider },
+	{ kEoBBaseDscDoorScaleMult2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult2PC98Provider },
+	{ kEoBBaseDscDoorScaleMult3, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult3PC98Provider },
+	{ kEoBBaseDscDoorType5Offs, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorType5OffsPC98Provider },
+	{ kEoBBaseDscDoorY1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorY1PC98Provider },
+	{ kRpgCommonDscDoorY2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorY2PC98Provider },
+	{ kRpgCommonDscDoorFrameY1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorFrameY1PC98Provider },
+	{ kRpgCommonDscDoorFrameY2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDoorFrameY2PC98Provider },
+	{ kEoBBaseDscItemPosIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscItemPosIndexPC98Provider },
+	{ kEoBBaseDscItemShpX, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscItemShpXPC98Provider },
+	{ kEoBBaseDscItemScaleIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscItemScaleIndexPC98Provider },
+	{ kEoBBaseDscItemTileIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscItemTileIndexPC98Provider },
+	{ kEoBBaseDscItemShapeMap, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscItemShapeMapPC98Provider },
+	{ kEoBBaseDscTelptrShpCoords, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscTelptrShpCoordsPC98Provider },
+	{ kEoBBasePortalSeqData, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2PortalSeqDataPC98Provider },
+	{ kEoBBaseDscMonsterFrmOffsTbl1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscMonsterFrmOffsTbl1PC98Provider },
+	{ kEoBBaseDscMonsterFrmOffsTbl2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscMonsterFrmOffsTbl2PC98Provider },
+	{ kEoBBaseInvSlotX, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2InvSlotXPC98Provider },
+	{ kEoBBaseInvSlotY, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2InvSlotYPC98Provider },
+	{ kEoBBaseSlotValidationFlags, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SlotValidationFlagsPC98Provider },
+	{ kEoBBaseProjectileWeaponTypes, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ProjectileWeaponTypesPC98Provider },
+	{ kEoBBaseWandTypes, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2WandTypesPC98Provider },
+	{ kEoBBaseDrawObjPosIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DrawObjPosIndexPC98Provider },
+	{ kEoBBaseFlightObjFlipIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FlightObjFlipIndexPC98Provider },
+	{ kEoBBaseFlightObjShpMap, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FlightObjShpMapPC98Provider },
+	{ kEoBBaseFlightObjSclIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FlightObjSclIndexPC98Provider },
+	{ kEoB2MainMenuStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MainMenuStringsPC98JapaneseProvider },
+	{ kEoB2TransferPortraitFrames, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2TransferPortraitFramesPC98Provider },
+	{ kEoB2TransferConvertTable, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2TransferConvertTablePC98Provider },
+	{ kEoB2TransferItemTable, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2TransferItemTablePC98Provider },
+	{ kEoB2TransferExpTable, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2TransferExpTablePC98Provider },
+	{ kEoB2TransferStrings1, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2TransferStrings1PC98JapaneseProvider },
+	{ kEoB2TransferStrings2, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2TransferStrings2PC98JapaneseProvider },
+	{ kEoB2TransferLabels, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2TransferLabelsPC98JapaneseProvider },
+	{ kEoB2IntroStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2IntroStringsPC98JapaneseProvider },
+	{ kEoB2IntroCPSFiles, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2IntroCPSFilesPC98JapaneseProvider },
+	{ kEoB2IntroAnimData00, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData00PC98Provider },
+	{ kEoB2IntroAnimData01, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData01PC98Provider },
+	{ kEoB2IntroAnimData02, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData02PC98Provider },
+	{ kEoB2IntroAnimData03, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData03PC98Provider },
+	{ kEoB2IntroAnimData04, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData04PC98Provider },
+	{ kEoB2IntroAnimData05, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData05PC98Provider },
+	{ kEoB2IntroAnimData06, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData06PC98Provider },
+	{ kEoB2IntroAnimData07, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData07PC98Provider },
+	{ kEoB2IntroAnimData08, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData08PC98Provider },
+	{ kEoB2IntroAnimData09, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData09PC98Provider },
+	{ kEoB2IntroAnimData10, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData10PC98Provider },
+	{ kEoB2IntroAnimData11, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData11PC98Provider },
+	{ kEoB2IntroAnimData12, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData12PC98Provider },
+	{ kEoB2IntroAnimData13, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData13PC98Provider },
+	{ kEoB2IntroAnimData14, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData14PC98Provider },
+	{ kEoB2IntroAnimData15, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData15PC98Provider },
+	{ kEoB2IntroAnimData16, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData16PC98Provider },
+	{ kEoB2IntroAnimData17, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData17PC98Provider },
+	{ kEoB2IntroAnimData18, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData18PC98Provider },
+	{ kEoB2IntroAnimData19, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData19PC98Provider },
+	{ kEoB2IntroAnimData20, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData20PC98Provider },
+	{ kEoB2IntroAnimData21, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData21PC98Provider },
+	{ kEoB2IntroAnimData22, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData22PC98Provider },
+	{ kEoB2IntroAnimData23, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData23PC98Provider },
+	{ kEoB2IntroAnimData24, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData24PC98Provider },
+	{ kEoB2IntroAnimData25, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData25PC98Provider },
+	{ kEoB2IntroAnimData26, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData26PC98Provider },
+	{ kEoB2IntroAnimData27, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData27PC98Provider },
+	{ kEoB2IntroAnimData28, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData28PC98Provider },
+	{ kEoB2IntroAnimData29, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData29PC98Provider },
+	{ kEoB2IntroAnimData30, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData30PC98Provider },
+	{ kEoB2IntroAnimData31, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData31PC98Provider },
+	{ kEoB2IntroAnimData32, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData32PC98Provider },
+	{ kEoB2IntroAnimData33, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData33PC98Provider },
+	{ kEoB2IntroAnimData34, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData34PC98Provider },
+	{ kEoB2IntroAnimData35, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData35PC98Provider },
+	{ kEoB2IntroAnimData36, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData36PC98Provider },
+	{ kEoB2IntroAnimData37, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData37PC98Provider },
+	{ kEoB2IntroAnimData38, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData38PC98Provider },
+	{ kEoB2IntroAnimData39, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData39PC98Provider },
+	{ kEoB2IntroAnimData40, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData40PC98Provider },
+	{ kEoB2IntroAnimData41, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData41PC98Provider },
+	{ kEoB2IntroAnimData42, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData42PC98Provider },
+	{ kEoB2IntroAnimData43, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData43PC98Provider },
+	{ kEoB2IntroAnimData44, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData44PC98Provider },
+	{ kEoB2IntroAnimData45, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData45PC98Provider },
+	{ kEoB2IntroAnimData46, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData46PC98Provider },
+	{ kEoB2IntroAnimData47, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData47PC98Provider },
+	{ kEoB2IntroShapes00, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroShapes00PC98Provider },
+	{ kEoB2IntroShapes01, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroShapes01PC98Provider },
+	{ kEoB2IntroShapes04, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroShapes04PC98Provider },
+	{ kEoB2IntroShapes07, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroShapes07PC98Provider },
+	{ kEoB2IntroShapes13, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2IntroShapes13PC98Provider },
+	{ kEoB2FinaleStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2FinaleStringsPC98JapaneseProvider },
+	{ kEoB2FinaleCPSFiles, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2FinaleCPSFilesPC98JapaneseProvider },
+	{ kEoB2FinaleAnimData00, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData00PC98Provider },
+	{ kEoB2FinaleAnimData01, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData01PC98Provider },
+	{ kEoB2FinaleAnimData02, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData02PC98Provider },
+	{ kEoB2FinaleAnimData03, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData03PC98Provider },
+	{ kEoB2FinaleAnimData04, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData04PC98Provider },
+	{ kEoB2FinaleAnimData05, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData05PC98Provider },
+	{ kEoB2FinaleAnimData06, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData06PC98Provider },
+	{ kEoB2FinaleAnimData07, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData07PC98Provider },
+	{ kEoB2FinaleAnimData08, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData08PC98Provider },
+	{ kEoB2FinaleAnimData09, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData09PC98Provider },
+	{ kEoB2FinaleAnimData10, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData10PC98Provider },
+	{ kEoB2FinaleAnimData11, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData11PC98Provider },
+	{ kEoB2FinaleAnimData12, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData12PC98Provider },
+	{ kEoB2FinaleAnimData13, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData13PC98Provider },
+	{ kEoB2FinaleAnimData14, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData14PC98Provider },
+	{ kEoB2FinaleAnimData15, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData15PC98Provider },
+	{ kEoB2FinaleAnimData16, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData16PC98Provider },
+	{ kEoB2FinaleAnimData17, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData17PC98Provider },
+	{ kEoB2FinaleAnimData18, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData18PC98Provider },
+	{ kEoB2FinaleAnimData19, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData19PC98Provider },
+	{ kEoB2FinaleAnimData20, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData20PC98Provider },
+	{ kEoB2FinaleShapes00, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes00PC98Provider },
+	{ kEoB2FinaleShapes03, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes03PC98Provider },
+	{ kEoB2FinaleShapes07, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes07PC98Provider },
+	{ kEoB2FinaleShapes09, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes09PC98Provider },
+	{ kEoB2FinaleShapes10, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes10PC98Provider },
+	{ kEoB2NpcShapeData, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2NpcShapeDataPC98Provider },
+	{ kEoBBaseClassModifierFlags, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2ClassModifierFlagsPC98Provider },
+	{ kEoBBaseMonsterStepTable02, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable02PC98Provider },
+	{ kEoBBaseMonsterStepTable1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable1PC98Provider },
+	{ kEoBBaseMonsterStepTable2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable2PC98Provider },
+	{ kEoBBaseMonsterStepTable3, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable3PC98Provider },
+	{ kEoBBaseMonsterCloseAttPosTable1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttPosTable1PC98Provider },
+	{ kEoBBaseMonsterCloseAttPosTable22, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttPosTable22PC98Provider },
+	{ kEoBBaseMonsterCloseAttUnkTable, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttUnkTablePC98Provider },
+	{ kEoBBaseMonsterCloseAttChkTable1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttChkTable1PC98Provider },
+	{ kEoBBaseMonsterCloseAttChkTable2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttChkTable2PC98Provider },
+	{ kEoBBaseMonsterCloseAttDstTable1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttDstTable1PC98Provider },
+	{ kEoBBaseMonsterCloseAttDstTable2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttDstTable2PC98Provider },
+	{ kEoBBaseMonsterProximityTable, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterProximityTablePC98Provider },
+	{ kEoBBaseFindBlockMonstersTable, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FindBlockMonstersTablePC98Provider },
+	{ kEoBBaseMonsterDirChangeTable, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2MonsterDirChangeTablePC98Provider },
+	{ kEoBBaseMonsterDistAttStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MonsterDistAttStringsPC98JapaneseProvider },
+	{ kEoBBaseEncodeMonsterDefs, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2EncodeMonsterDefsPC98Provider },
+	{ kEoBBaseNpcPresets, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2NpcPresetsPC98Provider },
+	{ kEoBBaseSoundFilesIntro, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SoundFilesIntroPC98Provider },
+	{ kEoBBaseSoundFilesFinale, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2SoundFilesFinalePC98Provider },
+	{ kEoB2Npc1Strings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2Npc1StringsPC98JapaneseProvider },
+	{ kEoB2Npc2Strings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2Npc2StringsPC98JapaneseProvider },
+	{ kEoB2MonsterDustStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2MonsterDustStringsPC98JapaneseProvider },
+	{ kEoB2DreamSteps, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DreamStepsPC98Provider },
+	{ kEoB2KheldranStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2KheldranStringsPC98JapaneseProvider },
+	{ kEoB2HornStrings, kEoB2, kPlatformPC98, kNoSpecial, JA_JPN, &kEoB2HornStringsPC98JapaneseProvider },
+	{ kEoB2HornSounds, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2HornSoundsPC98Provider },
+	{ kEoB2WallOfForceDsX, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2WallOfForceDsXPC98Provider },
+	{ kEoB2WallOfForceDsY, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2WallOfForceDsYPC98Provider },
+	{ kEoB2WallOfForceNumW, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2WallOfForceNumWPC98Provider },
+	{ kEoB2WallOfForceNumH, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2WallOfForceNumHPC98Provider },
+	{ kEoB2WallOfForceShpId, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShpIdPC98Provider },
+	{ kRpgCommonDscShapeIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscShapeIndexPC98Provider },
+	{ kRpgCommonDscX, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscXPC98Provider },
+	{ kRpgCommonDscTileIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscTileIndexPC98Provider },
+	{ kRpgCommonDscDimData1, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDimData1PC98Provider },
+	{ kRpgCommonDscDimData2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDimData2PC98Provider },
+	{ kRpgCommonDscBlockMap, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscBlockMapPC98Provider },
+	{ kRpgCommonDscDimMap, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscDimMapPC98Provider },
+	{ kRpgCommonDscBlockIndex, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2DscBlockIndexPC98Provider },
+	{ kEoB2Ascii2SjisTables, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2Ascii2SjisTablesPC98Provider },
+	{ kEoB2Ascii2SjisTables2, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2Ascii2SjisTables2PC98Provider },
+	{ kEoB2FontConvertTbl, kEoB2, kPlatformPC98, kNoSpecial, UNK_LANG, &kEoB2FontConvertTblPC98Provider },
 	{ kLoLIngamePakFiles, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngamePakFilesDOSProvider },
 	{ kLoLCharacterDefs, kLoL, kPlatformDOS, kNoSpecial, EN_ANY, &kLoLCharacterDefsDOSEnglishProvider },
 	{ kLoLIngameSfxFiles, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngameSfxFilesDOSProvider },
diff --git a/devtools/create_kyradat/resources/eob1_segacd_english.h b/devtools/create_kyradat/resources/eob1_segacd_english.h
index 34c9d413426..4f83bc10d9b 100644
--- a/devtools/create_kyradat/resources/eob1_segacd_english.h
+++ b/devtools/create_kyradat/resources/eob1_segacd_english.h
@@ -1173,7 +1173,7 @@ static const char *const kEoB1TextInputSelectStringsSegaCDEnglish[5] = {
 static const StringListProvider kEoB1TextInputSelectStringsSegaCDEnglishProvider = { ARRAYSIZE(kEoB1TextInputSelectStringsSegaCDEnglish), kEoB1TextInputSelectStringsSegaCDEnglish };
 
 static const char *const kEoB1SaveNamePatternsSegaCDEnglish[1] = {
-	"%s\r FLOOR % -2u % u: % 02u"
+	"%s\r FLOOR %-2u %u:%02u"
 };
 
 static const StringListProvider kEoB1SaveNamePatternsSegaCDEnglishProvider = { ARRAYSIZE(kEoB1SaveNamePatternsSegaCDEnglish), kEoB1SaveNamePatternsSegaCDEnglish };
diff --git a/devtools/create_kyradat/resources/eob1_segacd_japanese.h b/devtools/create_kyradat/resources/eob1_segacd_japanese.h
index 9725b9625c1..57e700f0e16 100644
--- a/devtools/create_kyradat/resources/eob1_segacd_japanese.h
+++ b/devtools/create_kyradat/resources/eob1_segacd_japanese.h
@@ -1168,7 +1168,7 @@ static const char *const kEoB1TextInputSelectStringsSegaCDJapanese[5] = {
 static const StringListProvider kEoB1TextInputSelectStringsSegaCDJapaneseProvider = { ARRAYSIZE(kEoB1TextInputSelectStringsSegaCDJapanese), kEoB1TextInputSelectStringsSegaCDJapanese };
 
 static const char *const kEoB1SaveNamePatternsSegaCDJapanese[1] = {
-	"%s\r FLOOR % -2u % u: % 02u"
+	"%s\r FLOOR %-2u %u:%02u"
 };
 
 static const StringListProvider kEoB1SaveNamePatternsSegaCDJapaneseProvider = { ARRAYSIZE(kEoB1SaveNamePatternsSegaCDJapanese), kEoB1SaveNamePatternsSegaCDJapanese };
diff --git a/devtools/create_kyradat/resources/eob2_amiga_english.h b/devtools/create_kyradat/resources/eob2_amiga_english.h
index 30dc51f4f7f..a3db76d7168 100644
--- a/devtools/create_kyradat/resources/eob2_amiga_english.h
+++ b/devtools/create_kyradat/resources/eob2_amiga_english.h
@@ -893,7 +893,7 @@ static const char *const kEoB2MainMenuStringsAmigaEnglish[5] = {
 	"START A NEW PARTY\r",
 	"TRANSFER EOB I PARTY\r",
 	"RUN INTRODUCTION\r",
-	"FORMAT SAVE GAME DISK\r"
+	"EXIT TO DOS\r"
 };
 
 static const StringListProvider kEoB2MainMenuStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MainMenuStringsAmigaEnglish), kEoB2MainMenuStringsAmigaEnglish };
diff --git a/devtools/create_kyradat/resources/eob2_amiga_german.h b/devtools/create_kyradat/resources/eob2_amiga_german.h
index a8cda487568..76dffd6c755 100644
--- a/devtools/create_kyradat/resources/eob2_amiga_german.h
+++ b/devtools/create_kyradat/resources/eob2_amiga_german.h
@@ -895,7 +895,7 @@ static const char *const kEoB2MainMenuStringsAmigaGerman[5] = {
 	"NEUE PARTY ERSTELLEN\r",
 	"EOB I PARTY TRANSFER\r",
 	"INTRO ANSEHEN\r",
-	"FORMATIEREN\r"
+	"ZUR""\xFC""CK ZUM DOS\r\r"
 };
 
 static const StringListProvider kEoB2MainMenuStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2MainMenuStringsAmigaGerman), kEoB2MainMenuStringsAmigaGerman };
diff --git a/devtools/create_kyradat/resources/eob2_fmtowns.h b/devtools/create_kyradat/resources/eob2_fmtowns.h
index cb9688654d0..b332c2c2973 100644
--- a/devtools/create_kyradat/resources/eob2_fmtowns.h
+++ b/devtools/create_kyradat/resources/eob2_fmtowns.h
@@ -73603,7 +73603,7 @@ static const byte kEoB2PcmSoundEffectsFinaleFMTowns[36768] = {
 
 static const ByteProvider kEoB2PcmSoundEffectsFinaleFMTownsProvider = { ARRAYSIZE(kEoB2PcmSoundEffectsFinaleFMTowns), kEoB2PcmSoundEffectsFinaleFMTowns };
 
-static const uint16 kEoB2FontDmpSearchTblFMTowns[149] = {
+static const uint16 kEoB2FontLookupTblFMTowns[149] = {
 	0x4083, 0x4283, 0x4483, 0x4683, 0x4883, 0x8383, 0x8583, 0x8783, 0x6283, 0x4183, 0x4383, 0x4583, 0x4783, 0x4983, 0x4a83, 0x4c83,
 	0x4e83, 0x5083, 0x5283, 0x5483, 0x5683, 0x5883, 0x5a83, 0x5c83, 0x5e83, 0x6083, 0x6383, 0x6583, 0x6783, 0x6983, 0x6a83, 0x6b83,
 	0x6c83, 0x6d83, 0x6e83, 0x7183, 0x7483, 0x7783, 0x7a83, 0x7d83, 0x7e83, 0x8083, 0x8183, 0x8283, 0x8483, 0x8683, 0x8883, 0x8983,
@@ -73616,7 +73616,7 @@ static const uint16 kEoB2FontDmpSearchTblFMTowns[149] = {
 	0x9681, 0x4881, 0x8381, 0x8481, 0x0000
 };
 
-static const Uint16Provider kEoB2FontDmpSearchTblFMTownsProvider = { ARRAYSIZE(kEoB2FontDmpSearchTblFMTowns), kEoB2FontDmpSearchTblFMTowns };
+static const Uint16Provider kEoB2FontLookupTblFMTownsProvider = { ARRAYSIZE(kEoB2FontLookupTblFMTowns), kEoB2FontLookupTblFMTowns };
 
 static const char *const kEoB2SoundFilesIntroFMTowns[1] = {
 	"INTRO"
diff --git a/devtools/create_kyradat/resources/eob2_pc98.h b/devtools/create_kyradat/resources/eob2_pc98.h
new file mode 100644
index 00000000000..15b87d4f90c
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob2_pc98.h
@@ -0,0 +1,2599 @@
+static const byte kEoB2ChargenStartLevelsPC98[60] = {
+	0x07, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01,
+	0x06, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01,
+	0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01,
+	0x06, 0x06, 0x00, 0x02, 0x06, 0x06, 0x00, 0x02,
+	0x06, 0x05, 0x00, 0x02, 0x05, 0x05, 0x06, 0x03,
+	0x06, 0x05, 0x00, 0x02, 0x06, 0x06, 0x00, 0x02,
+	0x05, 0x05, 0x05, 0x03, 0x05, 0x06, 0x00, 0x02,
+	0x06, 0x05, 0x00, 0x02
+};
+
+static const ByteProvider kEoB2ChargenStartLevelsPC98Provider = { ARRAYSIZE(kEoB2ChargenStartLevelsPC98), kEoB2ChargenStartLevelsPC98 };
+
+static const byte kEoB2ChargenClassMinStatsPC98[90] = {
+	0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00,
+	0x0E, 0x0D, 0x0E, 0x00, 0x0C, 0x00, 0x0D, 0x00,
+	0x09, 0x11, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,
+	0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00,
+	0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09,
+	0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09,
+	0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00,
+	0x09, 0x09, 0x09, 0x00, 0x00, 0x00, 0x0D, 0x00,
+	0x0E, 0x0D, 0x0E, 0x00, 0x00, 0x09, 0x09, 0x00,
+	0x00, 0x00
+};
+
+static const ByteProvider kEoB2ChargenClassMinStatsPC98Provider = { ARRAYSIZE(kEoB2ChargenClassMinStatsPC98), kEoB2ChargenClassMinStatsPC98 };
+
+static const byte kEoB2ChargenRaceMinStatsPC98[36] = {
+	0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x08,
+	0x03, 0x07, 0x06, 0x08, 0x03, 0x04, 0x03, 0x06,
+	0x06, 0x03, 0x08, 0x03, 0x03, 0x03, 0x0C, 0x02,
+	0x06, 0x07, 0x02, 0x03, 0x08, 0x03, 0x07, 0x06,
+	0x03, 0x08, 0x0A, 0x06
+};
+
+static const ByteProvider kEoB2ChargenRaceMinStatsPC98Provider = { ARRAYSIZE(kEoB2ChargenRaceMinStatsPC98), kEoB2ChargenRaceMinStatsPC98 };
+
+static const uint16 kEoB2ChargenRaceMaxStatsPC98[36] = {
+	0x6412, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x6412, 0x0012,
+	0x0012, 0x0013, 0x0011, 0x0012, 0x6412, 0x0012, 0x0012, 0x0012,
+	0x0012, 0x0012, 0x6412, 0x0012, 0x0012, 0x0011, 0x0013, 0x0010,
+	0x6412, 0x0013, 0x0011, 0x0012, 0x0012, 0x0012, 0x0011, 0x0012,
+	0x0011, 0x0013, 0x0012, 0x0012
+};
+
+static const Uint16Provider kEoB2ChargenRaceMaxStatsPC98Provider = { ARRAYSIZE(kEoB2ChargenRaceMaxStatsPC98), kEoB2ChargenRaceMaxStatsPC98 };
+
+static const byte kEoB2SaveThrowTable1PC98[50] = {
+	0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x08, 0x07, 0x05,
+	0x04, 0x03, 0x12, 0x10, 0x0F, 0x0D, 0x0C, 0x0A,
+	0x09, 0x07, 0x06, 0x05, 0x11, 0x0F, 0x0E, 0x0C,
+	0x0B, 0x09, 0x08, 0x06, 0x05, 0x04, 0x14, 0x11,
+	0x10, 0x0D, 0x0C, 0x09, 0x08, 0x05, 0x04, 0x04,
+	0x13, 0x11, 0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x08,
+	0x07, 0x06
+};
+
+static const ByteProvider kEoB2SaveThrowTable1PC98Provider = { ARRAYSIZE(kEoB2SaveThrowTable1PC98), kEoB2SaveThrowTable1PC98 };
+
+static const byte kEoB2SaveThrowTable2PC98[25] = {
+	0x0E, 0x0D, 0x0B, 0x0A, 0x08, 0x0B, 0x09, 0x07,
+	0x05, 0x03, 0x0D, 0x0B, 0x09, 0x07, 0x05, 0x0F,
+	0x0D, 0x0B, 0x09, 0x07, 0x0C, 0x0A, 0x08, 0x06,
+	0x04
+};
+
+static const ByteProvider kEoB2SaveThrowTable2PC98Provider = { ARRAYSIZE(kEoB2SaveThrowTable2PC98), kEoB2SaveThrowTable2PC98 };
+
+static const byte kEoB2SaveThrowTable3PC98[35] = {
+	0x0A, 0x09, 0x07, 0x06, 0x05, 0x04, 0x02, 0x0E,
+	0x0D, 0x0B, 0x0A, 0x09, 0x08, 0x06, 0x0D, 0x0C,
+	0x0A, 0x09, 0x08, 0x07, 0x05, 0x10, 0x0F, 0x0D,
+	0x0C, 0x0B, 0x0A, 0x08, 0x0F, 0x0E, 0x0C, 0x0B,
+	0x0A, 0x09, 0x07
+};
+
+static const ByteProvider kEoB2SaveThrowTable3PC98Provider = { ARRAYSIZE(kEoB2SaveThrowTable3PC98), kEoB2SaveThrowTable3PC98 };
+
+static const byte kEoB2SaveThrowTable4PC98[30] = {
+	0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x0E, 0x0C,
+	0x0A, 0x08, 0x06, 0x07, 0x0C, 0x0B, 0x0A, 0x09,
+	0x08, 0x04, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B,
+	0x0F, 0x0D, 0x0B, 0x09, 0x07, 0x05
+};
+
+static const ByteProvider kEoB2SaveThrowTable4PC98Provider = { ARRAYSIZE(kEoB2SaveThrowTable4PC98), kEoB2SaveThrowTable4PC98 };
+
+static const byte kEoB2SaveThrwLvlIndexPC98[6] = {
+	0x11, 0x15, 0x13, 0x15, 0x11, 0x11
+};
+
+static const ByteProvider kEoB2SaveThrwLvlIndexPC98Provider = { ARRAYSIZE(kEoB2SaveThrwLvlIndexPC98), kEoB2SaveThrwLvlIndexPC98 };
+
+static const byte kEoB2SaveThrwModDivPC98[6] = {
+	0x02, 0x05, 0x03, 0x04, 0x02, 0x02
+};
+
+static const ByteProvider kEoB2SaveThrwModDivPC98Provider = { ARRAYSIZE(kEoB2SaveThrwModDivPC98), kEoB2SaveThrwModDivPC98 };
+
+static const byte kEoB2SaveThrwModExtPC98[6] = {
+	0x0A, 0x05, 0x07, 0x06, 0x0A, 0x0A
+};
+
+static const ByteProvider kEoB2SaveThrwModExtPC98Provider = { ARRAYSIZE(kEoB2SaveThrwModExtPC98), kEoB2SaveThrwModExtPC98 };
+
+static const char *const kEoB2EnchantedStringPC98[1] = {
+	"+%d %s"
+};
+
+static const StringListProvider kEoB2EnchantedStringPC98Provider = { ARRAYSIZE(kEoB2EnchantedStringPC98), kEoB2EnchantedStringPC98 };
+
+static const char *const kEoB2MenuStringsSpellNoPC98[3] = {
+	"\x82""U",
+	"\x82""V",
+	"\x82""W"
+};
+
+static const StringListProvider kEoB2MenuStringsSpellNoPC98Provider = { ARRAYSIZE(kEoB2MenuStringsSpellNoPC98), kEoB2MenuStringsSpellNoPC98 };
+
+static const byte kEoB2SpellLevelsMagePC98[35] = {
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03,
+	0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05,
+	0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08,
+	0x00, 0x01, 0x01
+};
+
+static const ByteProvider kEoB2SpellLevelsMagePC98Provider = { ARRAYSIZE(kEoB2SpellLevelsMagePC98), kEoB2SpellLevelsMagePC98 };
+
+static const byte kEoB2SpellLevelsClericPC98[29] = {
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02,
+	0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04,
+	0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+	0x06, 0x06, 0x08, 0x08, 0x00
+};
+
+static const ByteProvider kEoB2SpellLevelsClericPC98Provider = { ARRAYSIZE(kEoB2SpellLevelsClericPC98), kEoB2SpellLevelsClericPC98 };
+
+static const byte kEoB2NumSpellsClericPC98[136] = {
+	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+	0x04, 0x04, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x05, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00,
+	0x06, 0x05, 0x05, 0x03, 0x02, 0x02, 0x00, 0x00,
+	0x06, 0x06, 0x06, 0x04, 0x02, 0x02, 0x00, 0x00,
+	0x06, 0x06, 0x06, 0x05, 0x03, 0x02, 0x01, 0x00,
+	0x06, 0x06, 0x06, 0x06, 0x04, 0x02, 0x01, 0x00,
+	0x07, 0x07, 0x07, 0x06, 0x04, 0x03, 0x01, 0x00,
+	0x07, 0x07, 0x07, 0x07, 0x05, 0x03, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsClericPC98Provider = { ARRAYSIZE(kEoB2NumSpellsClericPC98), kEoB2NumSpellsClericPC98 };
+
+static const byte kEoB2NumSpellsWisAdjPC98[64] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsWisAdjPC98Provider = { ARRAYSIZE(kEoB2NumSpellsWisAdjPC98), kEoB2NumSpellsWisAdjPC98 };
+
+static const byte kEoB2NumSpellsPalPC98[136] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsPalPC98Provider = { ARRAYSIZE(kEoB2NumSpellsPalPC98), kEoB2NumSpellsPalPC98 };
+
+static const byte kEoB2NumSpellsMagePC98[276] = {
+	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x04, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00,
+	0x04, 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+	0x04, 0x04, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00,
+	0x04, 0x04, 0x04, 0x03, 0x03, 0x00, 0x00, 0x00,
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x00, 0x00,
+	0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x00,
+	0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x01, 0x00,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x01, 0x00,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x02, 0x01,
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x02,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsMagePC98Provider = { ARRAYSIZE(kEoB2NumSpellsMagePC98), kEoB2NumSpellsMagePC98 };
+
+static const uint32 kEoB2ExperienceTable0PC98[14] = {
+	0x00000000, 0x000007D0, 0x00000FA0, 0x00001F40, 0x00003E80, 0x00007D00, 0x0000FA00, 0x0001E848,
+	0x0003D090, 0x0007A120, 0x000B71B0, 0x000F4240, 0x001312D0, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable0PC98Provider = { ARRAYSIZE(kEoB2ExperienceTable0PC98), kEoB2ExperienceTable0PC98 };
+
+static const uint32 kEoB2ExperienceTable1PC98[14] = {
+	0x00000000, 0x000009C4, 0x00001388, 0x00002710, 0x00004E20, 0x00009C40, 0x0000EA60, 0x00015F90,
+	0x00020F58, 0x0003D090, 0x0005B8D8, 0x000B71B0, 0x00112A88, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable1PC98Provider = { ARRAYSIZE(kEoB2ExperienceTable1PC98), kEoB2ExperienceTable1PC98 };
+
+static const uint32 kEoB2ExperienceTable2PC98[14] = {
+	0x00000000, 0x000005DC, 0x00000BB8, 0x00001770, 0x000032C8, 0x00006B6C, 0x0000D6D8, 0x0001ADB0,
+	0x00036EE8, 0x0006DDD0, 0x000A4CB8, 0x000DBBA0, 0x00112A88, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable2PC98Provider = { ARRAYSIZE(kEoB2ExperienceTable2PC98), kEoB2ExperienceTable2PC98 };
+
+static const uint32 kEoB2ExperienceTable3PC98[14] = {
+	0x00000000, 0x000004E2, 0x000009C4, 0x00001388, 0x00002710, 0x00004E20, 0x00009C40, 0x00011170,
+	0x0001ADB0, 0x00027100, 0x00035B60, 0x0006B6C0, 0x000A1220, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable3PC98Provider = { ARRAYSIZE(kEoB2ExperienceTable3PC98), kEoB2ExperienceTable3PC98 };
+
+static const uint32 kEoB2ExperienceTable4PC98[14] = {
+	0x00000000, 0x000008CA, 0x00001194, 0x00002328, 0x00004650, 0x00008CA0, 0x000124F8, 0x000249F0,
+	0x000493E0, 0x000927C0, 0x000DBBA0, 0x00124F80, 0x0016E360, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable4PC98Provider = { ARRAYSIZE(kEoB2ExperienceTable4PC98), kEoB2ExperienceTable4PC98 };
+
+static const byte kEoB2ExpObjectTlModePC98[18] = {
+	0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00,
+	0x01, 0x02, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00,
+	0x02, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTlModePC98Provider = { ARRAYSIZE(kEoB2ExpObjectTlModePC98), kEoB2ExpObjectTlModePC98 };
+
+static const byte kEoB2ExpObjectTblIndexPC98[14] = {
+	0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTblIndexPC98Provider = { ARRAYSIZE(kEoB2ExpObjectTblIndexPC98), kEoB2ExpObjectTblIndexPC98 };
+
+static const byte kEoB2ExpObjectShpStartPC98[4] = {
+	0x07, 0x0C, 0x0F, 0x12
+};
+
+static const ByteProvider kEoB2ExpObjectShpStartPC98Provider = { ARRAYSIZE(kEoB2ExpObjectShpStartPC98), kEoB2ExpObjectShpStartPC98 };
+
+static const byte kEoB2ExpObjectTbl1PC98[13] = {
+	0x0F, 0x05, 0x0F, 0x05, 0x06, 0x05, 0x06, 0x08,
+	0x06, 0x08, 0x06, 0x08, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl1PC98Provider = { ARRAYSIZE(kEoB2ExpObjectTbl1PC98), kEoB2ExpObjectTbl1PC98 };
+
+static const byte kEoB2ExpObjectTbl2PC98[10] = {
+	0x0F, 0x09, 0x0F, 0x09, 0x02, 0x0A, 0x0B, 0x0A,
+	0x0B, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl2PC98Provider = { ARRAYSIZE(kEoB2ExpObjectTbl2PC98), kEoB2ExpObjectTbl2PC98 };
+
+static const byte kEoB2ExpObjectTbl3PC98[11] = {
+	0x05, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x0B,
+	0x03, 0x0B, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl3PC98Provider = { ARRAYSIZE(kEoB2ExpObjectTbl3PC98), kEoB2ExpObjectTbl3PC98 };
+
+static const byte kEoB2ExpObjectYPC98[4] = {
+	0x77, 0x67, 0x4F, 0x3F
+};
+
+static const ByteProvider kEoB2ExpObjectYPC98Provider = { ARRAYSIZE(kEoB2ExpObjectYPC98), kEoB2ExpObjectYPC98 };
+
+static const byte kEoB2SparkDefStepsPC98[8] = {
+	0x40, 0x90, 0xE4, 0xB9, 0x6E, 0x1B, 0x06, 0x01
+};
+
+static const ByteProvider kEoB2SparkDefStepsPC98Provider = { ARRAYSIZE(kEoB2SparkDefStepsPC98), kEoB2SparkDefStepsPC98 };
+
+static const byte kEoB2SparkDefSubStepsPC98[4] = {
+	0xC0, 0x30, 0x0C, 0x03
+};
+
+static const ByteProvider kEoB2SparkDefSubStepsPC98Provider = { ARRAYSIZE(kEoB2SparkDefSubStepsPC98), kEoB2SparkDefSubStepsPC98 };
+
+static const byte kEoB2SparkDefShiftPC98[4] = {
+	0x06, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2SparkDefShiftPC98Provider = { ARRAYSIZE(kEoB2SparkDefShiftPC98), kEoB2SparkDefShiftPC98 };
+
+static const byte kEoB2SparkDefAddPC98[8] = {
+	0x08, 0x06, 0x1C, 0x14, 0x0D, 0x18, 0x0D, 0x0F
+};
+
+static const ByteProvider kEoB2SparkDefAddPC98Provider = { ARRAYSIZE(kEoB2SparkDefAddPC98), kEoB2SparkDefAddPC98 };
+
+static const byte kEoB2SparkDefXPC98[6] = {
+	0x17, 0x20, 0x17, 0x20, 0x17, 0x20
+};
+
+static const ByteProvider kEoB2SparkDefXPC98Provider = { ARRAYSIZE(kEoB2SparkDefXPC98), kEoB2SparkDefXPC98 };
+
+static const byte kEoB2SparkDefYPC98[6] = {
+	0x02, 0x02, 0x34, 0x34, 0x66, 0x66
+};
+
+static const ByteProvider kEoB2SparkDefYPC98Provider = { ARRAYSIZE(kEoB2SparkDefYPC98), kEoB2SparkDefYPC98 };
+
+static const uint32 kEoB2SparkOfFlags1PC98[11] = {
+	0x40000000, 0x95000000, 0xEA550000, 0xBFAA5400, 0x6AFFA954, 0x15AAFEA9, 0x0055ABFE, 0x000056AB,
+	0x00000156, 0x00000001, 0x00000000
+};
+
+static const Uint32Provider kEoB2SparkOfFlags1PC98Provider = { ARRAYSIZE(kEoB2SparkOfFlags1PC98), kEoB2SparkOfFlags1PC98 };
+
+static const uint32 kEoB2SparkOfFlags2PC98[16] = {
+	0xC0000000, 0x30000000, 0x0C000000, 0x03000000, 0x00C00000, 0x00300000, 0x000C0000, 0x00030000,
+	0x0000C000, 0x00003000, 0x00000C00, 0x00000300, 0x000000C0, 0x00000030, 0x0000000C, 0x00000003
+};
+
+static const Uint32Provider kEoB2SparkOfFlags2PC98Provider = { ARRAYSIZE(kEoB2SparkOfFlags2PC98), kEoB2SparkOfFlags2PC98 };
+
+static const byte kEoB2SparkOfShiftPC98[16] = {
+	0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x14, 0x12, 0x10,
+	0x0E, 0x0C, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2SparkOfShiftPC98Provider = { ARRAYSIZE(kEoB2SparkOfShiftPC98), kEoB2SparkOfShiftPC98 };
+
+static const byte kEoB2SparkOfXPC98[16] = {
+	0x50, 0x70, 0x30, 0x68, 0x20, 0x60, 0x38, 0x78,
+	0x80, 0x48, 0x58, 0x28, 0x60, 0x40, 0x70, 0x48
+};
+
+static const ByteProvider kEoB2SparkOfXPC98Provider = { ARRAYSIZE(kEoB2SparkOfXPC98), kEoB2SparkOfXPC98 };
+
+static const byte kEoB2SparkOfYPC98[16] = {
+	0x31, 0x2B, 0x48, 0x17, 0x16, 0x48, 0x35, 0x1B,
+	0x43, 0x2E, 0x24, 0x28, 0x38, 0x1C, 0x16, 0x44
+};
+
+static const ByteProvider kEoB2SparkOfYPC98Provider = { ARRAYSIZE(kEoB2SparkOfYPC98), kEoB2SparkOfYPC98 };
+
+static const byte kEoB2SpellPropertiesPC98[1750] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xFE, 0x2B, 0x16, 0x2B, 0x60, 0x00, 0xA7,
+	0x13, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x5C, 0x01, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x04, 0x2C, 0x16, 0x2B, 0xC3, 0x00,
+	0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
+	0x00, 0x21, 0x00, 0x12, 0x2C, 0x16, 0x2B, 0x9D,
+	0x01, 0xA7, 0x13, 0x4C, 0x00, 0x00, 0x00, 0x95,
+	0x29, 0xBB, 0x01, 0xA7, 0x13, 0x5F, 0x02, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x1F, 0x2C, 0x16, 0x2B,
+	0xD9, 0x01, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00,
+	0x00, 0x00, 0xFA, 0x01, 0xA7, 0x13, 0x55, 0x00,
+	0x00, 0x00, 0x00, 0x01, 0x00, 0x2D, 0x2C, 0x16,
+	0x2B, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00,
+	0x00, 0x96, 0x29, 0x00, 0x00, 0x00, 0x00, 0x5C,
+	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2C,
+	0x16, 0x2B, 0x2D, 0x02, 0xA7, 0x13, 0x88, 0x04,
+	0x00, 0x00, 0x97, 0x29, 0xE4, 0x02, 0xA7, 0x13,
+	0x58, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x43,
+	0x2C, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x89,
+	0x00, 0x00, 0x00, 0x98, 0x29, 0x00, 0x00, 0x00,
+	0x00, 0x4B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x48, 0x2C, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00,
+	0x4C, 0x00, 0x00, 0x00, 0x9A, 0x29, 0x00, 0x00,
+	0x00, 0x00, 0x5F, 0x20, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x5C, 0x2C, 0x16, 0x2B, 0x2C, 0x00, 0xA7,
+	0x13, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x6E, 0x2C, 0x16, 0x2B, 0x00, 0x00,
+	0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x5E, 0x40, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x7B, 0x2C, 0x16, 0x2B, 0x2B,
+	0x03, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00,
+	0x00, 0x4D, 0x03, 0xA7, 0x13, 0x60, 0x00, 0x00,
+	0x00, 0x00, 0x11, 0x00, 0x8D, 0x2C, 0x16, 0x2B,
+	0x02, 0x00, 0xA7, 0x13, 0x00, 0x10, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x2C, 0x16,
+	0x2B, 0x82, 0x03, 0xA7, 0x13, 0x00, 0x01, 0x00,
+	0x00, 0x00, 0x00, 0xA4, 0x03, 0xA7, 0x13, 0x63,
+	0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0xA3, 0x2C,
+	0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x48, 0x02,
+	0x00, 0x00, 0x99, 0x29, 0x00, 0x00, 0x00, 0x00,
+	0x64, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA9,
+	0x2C, 0x16, 0x2B, 0xD3, 0x03, 0xA7, 0x13, 0x00,
+	0x01, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x03, 0xA7,
+	0x13, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xB5, 0x2C, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00,
+	0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x5E, 0x40, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xCD, 0x2C, 0x16, 0x2B, 0xFA, 0x04, 0xA7,
+	0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1C,
+	0x05, 0xA7, 0x13, 0x47, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x00, 0xDC, 0x2C, 0x16, 0x2B, 0x4B, 0x05,
+	0xA7, 0x13, 0x88, 0x04, 0x00, 0x00, 0x9B, 0x29,
+	0x04, 0x06, 0xA7, 0x13, 0x66, 0x00, 0x00, 0x00,
+	0x00, 0x01, 0x00, 0xEB, 0x2C, 0x16, 0x2B, 0x2B,
+	0x06, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0xF0, 0x2C, 0x16, 0x2B,
+	0x89, 0x06, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00,
+	0x00, 0x00, 0xAB, 0x06, 0xA7, 0x13, 0x59, 0x00,
+	0x00, 0x00, 0x00, 0x41, 0x00, 0xFA, 0x2C, 0x16,
+	0x2B, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00,
+	0x00, 0x9C, 0x29, 0x00, 0x00, 0x00, 0x00, 0x08,
+	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x2D,
+	0x16, 0x2B, 0x3C, 0x07, 0xA7, 0x13, 0x20, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D,
+	0x2D, 0x16, 0x2B, 0x9F, 0x07, 0xA7, 0x13, 0x00,
+	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00,
+	0x2A, 0x2D, 0x16, 0x2B, 0x94, 0x08, 0xA7, 0x13,
+	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x08,
+	0xA7, 0x13, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x37, 0x2D, 0x16, 0x2B, 0xD0, 0x09, 0xA7,
+	0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x45, 0x2D, 0x16, 0x2B, 0x25, 0x0B,
+	0xA7, 0x13, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
+	0x00, 0x01, 0x00, 0x52, 0x2D, 0x16, 0x2B, 0x89,
+	0x0B, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00,
+	0x00, 0x00, 0x01, 0x00, 0x61, 0x2D, 0x16, 0x2B,
+	0xF1, 0x0B, 0xA7, 0x13, 0x20, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x2D, 0x16,
+	0x2B, 0x0D, 0x0C, 0xA7, 0x13, 0x4C, 0x00, 0x00,
+	0x00, 0x9D, 0x29, 0x1C, 0x0C, 0xA7, 0x13, 0x49,
+	0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x2D,
+	0x16, 0x2B, 0x2B, 0x0C, 0xA7, 0x13, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8C,
+	0x2D, 0x16, 0x2B, 0x98, 0x0C, 0xA7, 0x13, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x9C, 0x2D, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0xB2, 0x2D, 0x16, 0x2B, 0x00, 0x00,
+	0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x9E, 0x29,
+	0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x04, 0x00,
+	0x00, 0x00, 0x00, 0xB8, 0x2D, 0x16, 0x2B, 0xDE,
+	0x0C, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x00,
+	0x00, 0x00, 0x01, 0x00, 0xCB, 0x2D, 0x16, 0x2B,
+	0xF6, 0x0C, 0xA7, 0x13, 0x20, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x2D, 0x16,
+	0x2B, 0x9D, 0x01, 0xA7, 0x13, 0x4C, 0x00, 0x00,
+	0x00, 0x95, 0x29, 0xBB, 0x01, 0xA7, 0x13, 0x5F,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x2D,
+	0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00,
+	0x00, 0x00, 0x9F, 0x29, 0x00, 0x00, 0x00, 0x00,
+	0x6E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xFF,
+	0x2D, 0x16, 0x2B, 0x1A, 0x0D, 0xA7, 0x13, 0x39,
+	0x00, 0x00, 0x00, 0xA0, 0x29, 0xC9, 0x0D, 0xA7,
+	0x13, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x2E, 0x16, 0x2B, 0xEF, 0x0D, 0xA7, 0x13,
+	0x08, 0x24, 0x00, 0x00, 0xA1, 0x29, 0xE4, 0x02,
+	0xA7, 0x13, 0x63, 0x00, 0x00, 0x00, 0x00, 0x21,
+	0x00, 0x0F, 0x2E, 0x16, 0x2B, 0xD3, 0x03, 0xA7,
+	0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF5,
+	0x03, 0xA7, 0x13, 0x65, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x1B, 0x2E, 0x16, 0x2B, 0x99, 0x0E,
+	0xA7, 0x13, 0x28, 0x00, 0x00, 0x00, 0xA2, 0x29,
+	0xF2, 0x0E, 0xA7, 0x13, 0x6F, 0x00, 0x20, 0x00,
+	0x00, 0x00, 0x00, 0x27, 0x2E, 0x16, 0x2B, 0x08,
+	0x0F, 0xA7, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x33, 0x2E, 0x16, 0x2B,
+	0x02, 0x00, 0xA7, 0x13, 0x00, 0x10, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2E, 0x16,
+	0x2B, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00,
+	0x00, 0xA3, 0x29, 0x00, 0x00, 0x00, 0x00, 0x71,
+	0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x51, 0x2E,
+	0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00,
+	0x00, 0x00, 0xA4, 0x29, 0x00, 0x00, 0x00, 0x00,
+	0x5B, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58,
+	0x2E, 0x16, 0x2B, 0x38, 0x0F, 0xA7, 0x13, 0x40,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x69, 0x2E, 0x16, 0x2B, 0x95, 0x0F, 0xA7, 0x13,
+	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x01,
+	0x00, 0x7E, 0x2E, 0x16, 0x2B, 0x71, 0x0F, 0xA7,
+	0x13, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x92, 0x2E, 0x16, 0x2B, 0xAE, 0x0F,
+	0xA7, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xA4, 0x2E, 0x16, 0x2B, 0x00,
+	0x00, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x9F,
+	0x29, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x08,
+	0x00, 0x00, 0x00, 0x00, 0xC4, 0x2E, 0x16, 0x2B,
+	0xD1, 0x0F, 0xA7, 0x13, 0x00, 0x01, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00,
+	0x00, 0x00, 0x00, 0x01, 0x00, 0xDA, 0x2E, 0x16,
+	0x2B, 0xEA, 0x0F, 0xA7, 0x13, 0x20, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x2E,
+	0x16, 0x2B, 0x0E, 0x10, 0xA7, 0x13, 0x00, 0x01,
+	0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0xA7, 0x13,
+	0x62, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0xFC,
+	0x2E, 0x16, 0x2B, 0x4F, 0x10, 0xA7, 0x13, 0x20,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x07, 0x2F, 0x16, 0x2B, 0x2B, 0x0C, 0xA7, 0x13,
+	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x01,
+	0x00, 0x13, 0x2F, 0x16, 0x2B, 0x0D, 0x0C, 0xA7,
+	0x13, 0x4C, 0x00, 0x00, 0x00, 0x9D, 0x29, 0x1C,
+	0x0C, 0xA7, 0x13, 0x49, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x00, 0x1F, 0x2F, 0x16, 0x2B, 0x84, 0x10,
+	0xA7, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
+	0x00, 0x01, 0x00, 0x24, 0x2F, 0x16, 0x2B, 0x97,
+	0x10, 0xA7, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x29, 0x2F, 0x16, 0x2B,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x2F, 0x16,
+	0x2B, 0xA8, 0x13, 0xA7, 0x13, 0x20, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x2F,
+	0x16, 0x2B, 0xE6, 0x10, 0xA7, 0x13, 0x00, 0x10,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F,
+	0x2F, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0x13, 0xA7,
+	0x13, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x50, 0x2F, 0x16, 0x2B, 0x00, 0x00, 0x00, 0x00,
+	0x4C, 0x00, 0x00, 0x00, 0xA5, 0x29, 0x00, 0x00,
+	0x00, 0x00, 0x5B, 0x00, 0x00, 0x02, 0x00, 0x00,
+	0x00, 0x5F, 0x2F, 0x16, 0x2B, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D,
+	0x14, 0xA7, 0x13, 0x62, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x60, 0x2F, 0x16, 0x2B, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x6A, 0x12, 0xA7, 0x13, 0x65, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x61, 0x2F, 0x16, 0x2B, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xF6, 0x11, 0xA7, 0x13, 0x65, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x62, 0x2F, 0x16, 0x2B,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0xE1, 0x12, 0xA7, 0x13, 0x65, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x2F, 0x16,
+	0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x43, 0x13, 0xA7, 0x13, 0x65,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2SpellPropertiesPC98Provider = { ARRAYSIZE(kEoB2SpellPropertiesPC98), kEoB2SpellPropertiesPC98 };
+
+static const byte kEoB2MagicFlightPropsPC98[56] = {
+	0x04, 0xFF, 0x41, 0x0C, 0x0B, 0xFF, 0x04, 0x06,
+	0x0D, 0xFF, 0x7A, 0x09, 0x0F, 0xFF, 0x4A, 0x08,
+	0x11, 0x06, 0x38, 0x0A, 0x14, 0x06, 0x7A, 0x0B,
+	0x18, 0xFF, 0x4A, 0x08, 0x36, 0xFF, 0x4B, 0x09,
+	0x3F, 0xFF, 0x4B, 0x09, 0x41, 0x06, 0x4B, 0x09,
+	0x42, 0x06, 0x4B, 0x08, 0x43, 0x06, 0x4B, 0x08,
+	0x44, 0x06, 0x4B, 0x08, 0x45, 0x06, 0x4B, 0x08
+};
+
+static const ByteProvider kEoB2MagicFlightPropsPC98Provider = { ARRAYSIZE(kEoB2MagicFlightPropsPC98), kEoB2MagicFlightPropsPC98 };
+
+static const byte kEoB2TurnUndeadEffectPC98[140] = {
+	0x0A, 0x07, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0x0A,
+	0x07, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x0D, 0x0A, 0x07,
+	0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04,
+	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0x14, 0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00,
+	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x14,
+	0x13, 0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00, 0x00,
+	0x00, 0xFF, 0xFF, 0x00, 0x63, 0x63, 0x14, 0x13,
+	0x10, 0x0D, 0x0A, 0x07, 0x04, 0x00, 0x00, 0x00,
+	0x00, 0xFF, 0x63, 0x63, 0x63, 0x14, 0x13, 0x10,
+	0x0D, 0x0A, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00,
+	0x63, 0x63, 0x63, 0x63, 0x14, 0x13, 0x10, 0x0D,
+	0x0A, 0x07, 0x07, 0x04, 0x04, 0x00, 0x63, 0x63,
+	0x63, 0x63, 0x63, 0x14, 0x13, 0x10, 0x0D, 0x0A,
+	0x0A, 0x07, 0x07, 0x04
+};
+
+static const ByteProvider kEoB2TurnUndeadEffectPC98Provider = { ARRAYSIZE(kEoB2TurnUndeadEffectPC98), kEoB2TurnUndeadEffectPC98 };
+
+static const byte kEoB2BurningHandsDestPC98[32] = {
+	0x02, 0x03, 0x04, 0x01, 0x02, 0x05, 0x00, 0x00,
+	0x00, 0x02, 0x04, 0x01, 0x03, 0x05, 0x00, 0x00,
+	0x00, 0x01, 0x04, 0x02, 0x03, 0x05, 0x00, 0x00,
+	0x01, 0x03, 0x04, 0x00, 0x02, 0x05, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2BurningHandsDestPC98Provider = { ARRAYSIZE(kEoB2BurningHandsDestPC98), kEoB2BurningHandsDestPC98 };
+
+static const byte kEoB2ConeOfColdDest1PC98[7] = {
+	0xE0, 0xC0, 0xC1, 0xBF, 0xA0, 0x9F, 0xA1
+};
+
+static const ByteProvider kEoB2ConeOfColdDest1PC98Provider = { ARRAYSIZE(kEoB2ConeOfColdDest1PC98), kEoB2ConeOfColdDest1PC98 };
+
+static const byte kEoB2ConeOfColdDest2PC98[7] = {
+	0x01, 0x02, 0xE2, 0x22, 0x03, 0xE3, 0x23
+};
+
+static const ByteProvider kEoB2ConeOfColdDest2PC98Provider = { ARRAYSIZE(kEoB2ConeOfColdDest2PC98), kEoB2ConeOfColdDest2PC98 };
+
+static const byte kEoB2ConeOfColdDest3PC98[7] = {
+	0x20, 0x40, 0x3F, 0x41, 0x60, 0x5F, 0x61
+};
+
+static const ByteProvider kEoB2ConeOfColdDest3PC98Provider = { ARRAYSIZE(kEoB2ConeOfColdDest3PC98), kEoB2ConeOfColdDest3PC98 };
+
+static const byte kEoB2ConeOfColdDest4PC98[7] = {
+	0xFF, 0xFE, 0x1E, 0xDE, 0xFD, 0x1D, 0xDD
+};
+
+static const ByteProvider kEoB2ConeOfColdDest4PC98Provider = { ARRAYSIZE(kEoB2ConeOfColdDest4PC98), kEoB2ConeOfColdDest4PC98 };
+
+static const byte kEoB2ConeOfColdGfxTblPC98[8] = {
+	0x0F, 0x09, 0x0F, 0x09, 0x02, 0x0A, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2ConeOfColdGfxTblPC98Provider = { ARRAYSIZE(kEoB2ConeOfColdGfxTblPC98), kEoB2ConeOfColdGfxTblPC98 };
+
+static const byte kEoB2DscDoorShapeIndexPC98[53] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x01
+};
+
+static const ByteProvider kEoB2DscDoorShapeIndexPC98Provider = { ARRAYSIZE(kEoB2DscDoorShapeIndexPC98), kEoB2DscDoorShapeIndexPC98 };
+
+static const byte kEoB2WllFlagPresetPC98[25] = {
+	0x07, 0x00, 0x40, 0xA8, 0x88, 0x88, 0x88, 0x9F,
+	0xA8, 0x88, 0x88, 0x88, 0x9F, 0xA8, 0x88, 0x88,
+	0x88, 0x9F, 0xA8, 0x88, 0x88, 0x88, 0x9F, 0x03,
+	0x03
+};
+
+static const ByteProvider kEoB2WllFlagPresetPC98Provider = { ARRAYSIZE(kEoB2WllFlagPresetPC98), kEoB2WllFlagPresetPC98 };
+
+static const uint16 kEoB2DscShapeCoordsPC98[180] = {
+	0xFF91, 0xFFC1, 0xFFA1, 0xFFC1, 0xFF75, 0xFFC5, 0xFF8B, 0xFFC5,
+	0xFF88, 0xFFC3, 0xFFB4, 0xFFC1, 0xFFC4, 0xFFC1, 0xFFA1, 0xFFC5,
+	0xFFB6, 0xFFC5, 0xFFB0, 0xFFC3, 0xFFD5, 0xFFC1, 0xFFE5, 0xFFC1,
+	0xFFCB, 0xFFC5, 0xFFE1, 0xFFC5, 0xFFD8, 0xFFC3, 0xFFF8, 0xFFC1,
+	0x0008, 0xFFC1, 0xFFF6, 0xFFC5, 0x000A, 0xFFC5, 0x0000, 0xFFC3,
+	0x001B, 0xFFC1, 0x002B, 0xFFC1, 0x001F, 0xFFC5, 0x0035, 0xFFC5,
+	0x0028, 0xFFC3, 0x003C, 0xFFC1, 0x004C, 0xFFC1, 0x004A, 0xFFC5,
+	0x005F, 0xFFC5, 0x0050, 0xFFC3, 0x005F, 0xFFC1, 0x006F, 0xFFC1,
+	0x0075, 0xFFC5, 0x008B, 0xFFC5, 0x0078, 0xFFC3, 0xFF8A, 0xFFCB,
+	0xFFA4, 0xFFCB, 0xFF68, 0xFFD3, 0xFF88, 0xFFD3, 0xFF8A, 0xFFCE,
+	0xFFBE, 0xFFCB, 0xFFD8, 0xFFCB, 0xFFAC, 0xFFD3, 0xFFCD, 0xFFD3,
+	0xFFC5, 0xFFCE, 0xFFF3, 0xFFCB, 0x000D, 0xFFCB, 0xFFF0, 0xFFD3,
+	0x0010, 0xFFD3, 0x0000, 0xFFCE, 0x0028, 0xFFCB, 0x0042, 0xFFCB,
+	0x0033, 0xFFD3, 0x0054, 0xFFD3, 0x003B, 0xFFCE, 0x005C, 0xFFCB,
+	0x0076, 0xFFCB, 0x0078, 0xFFD3, 0x0098, 0xFFD3, 0x0076, 0xFFCE,
+	0xFF92, 0xFFDD, 0xFFBD, 0xFFDD, 0xFF74, 0xFFEA, 0xFFAD, 0xFFEA,
+	0xFF9E, 0xFFE2, 0xFFEA, 0xFFDD, 0x0016, 0xFFDD, 0xFFE5, 0xFFEA,
+	0x001B, 0xFFEA, 0x0000, 0xFFE2, 0x0043, 0xFFDD, 0x006E, 0xFFDD,
+	0x0053, 0xFFEA, 0x008C, 0xFFEA, 0x0062, 0xFFE2, 0xFF80, 0xFFFC,
+	0x0080, 0xFFFC, 0xFF80, 0xFFBE, 0x0080, 0xFFBE, 0x0080, 0x0000,
+	0xFFDA, 0xFFFC, 0x0026, 0xFFFC, 0xFFDA, 0xFFBE, 0x0026, 0xFFBE,
+	0x0000, 0x0000, 0xFF80, 0xFFFC, 0x0080, 0xFFFC, 0xFF80, 0xFFBE,
+	0x0080, 0xFFBE, 0x0080, 0x0000
+};
+
+static const Uint16Provider kEoB2DscShapeCoordsPC98Provider = { ARRAYSIZE(kEoB2DscShapeCoordsPC98), kEoB2DscShapeCoordsPC98 };
+
+static const byte kEoB2DscDoorScaleOffsPC98[53] = {
+	0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+	0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+	0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x33, 0x34
+};
+
+static const ByteProvider kEoB2DscDoorScaleOffsPC98Provider = { ARRAYSIZE(kEoB2DscDoorScaleOffsPC98), kEoB2DscDoorScaleOffsPC98 };
+
+static const byte kEoB2DscDoorScaleMult1PC98[4] = {
+	0x08, 0x0C, 0x12, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult1PC98Provider = { ARRAYSIZE(kEoB2DscDoorScaleMult1PC98), kEoB2DscDoorScaleMult1PC98 };
+
+static const byte kEoB2DscDoorScaleMult2PC98[4] = {
+	0x00, 0x02, 0x04, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult2PC98Provider = { ARRAYSIZE(kEoB2DscDoorScaleMult2PC98), kEoB2DscDoorScaleMult2PC98 };
+
+static const byte kEoB2DscDoorScaleMult3PC98[4] = {
+	0x05, 0x08, 0x0C, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult3PC98Provider = { ARRAYSIZE(kEoB2DscDoorScaleMult3PC98), kEoB2DscDoorScaleMult3PC98 };
+
+static const byte kEoB2DscDoorType5OffsPC98[6] = {
+	0x05, 0x03, 0x01, 0x05, 0x03, 0x01
+};
+
+static const ByteProvider kEoB2DscDoorType5OffsPC98Provider = { ARRAYSIZE(kEoB2DscDoorType5OffsPC98), kEoB2DscDoorType5OffsPC98 };
+
+static const byte kEoB2DscDoorY1PC98[4] = {
+	0x3B, 0x47, 0x56, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorY1PC98Provider = { ARRAYSIZE(kEoB2DscDoorY1PC98), kEoB2DscDoorY1PC98 };
+
+static const byte kEoB2DscDoorY2PC98[4] = {
+	0x1F, 0x18, 0x0F, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorY2PC98Provider = { ARRAYSIZE(kEoB2DscDoorY2PC98), kEoB2DscDoorY2PC98 };
+
+static const byte kEoB2DscDoorFrameY1PC98[4] = {
+	0x1E, 0x18, 0x10, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorFrameY1PC98Provider = { ARRAYSIZE(kEoB2DscDoorFrameY1PC98), kEoB2DscDoorFrameY1PC98 };
+
+static const byte kEoB2DscDoorFrameY2PC98[4] = {
+	0x3B, 0x47, 0x56, 0x78
+};
+
+static const ByteProvider kEoB2DscDoorFrameY2PC98Provider = { ARRAYSIZE(kEoB2DscDoorFrameY2PC98), kEoB2DscDoorFrameY2PC98 };
+
+static const byte kEoB2DscItemPosIndexPC98[16] = {
+	0x00, 0x01, 0x02, 0x03, 0x02, 0x00, 0x03, 0x01,
+	0x03, 0x02, 0x01, 0x00, 0x01, 0x03, 0x00, 0x02
+};
+
+static const ByteProvider kEoB2DscItemPosIndexPC98Provider = { ARRAYSIZE(kEoB2DscItemPosIndexPC98), kEoB2DscItemPosIndexPC98 };
+
+static const uint16 kEoB2DscItemShpXPC98[18] = {
+	0xFFC8, 0xFFF8, 0x0028, 0x0058, 0x0088, 0x00B8, 0x00E8, 0xFFB8,
+	0x0008, 0x0058, 0x00A8, 0x00F8, 0xFFD8, 0x0058, 0x00D8, 0xFFA8,
+	0x0058, 0x0108
+};
+
+static const Uint16Provider kEoB2DscItemShpXPC98Provider = { ARRAYSIZE(kEoB2DscItemShpXPC98), kEoB2DscItemShpXPC98 };
+
+static const byte kEoB2DscItemScaleIndexPC98[18] = {
+	0xFF, 0xFF, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02,
+	0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF,
+	0x25, 0x00
+};
+
+static const ByteProvider kEoB2DscItemScaleIndexPC98Provider = { ARRAYSIZE(kEoB2DscItemScaleIndexPC98), kEoB2DscItemScaleIndexPC98 };
+
+static const byte kEoB2DscItemTileIndexPC98[18] = {
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0x0B,
+	0x0C, 0x0D
+};
+
+static const ByteProvider kEoB2DscItemTileIndexPC98Provider = { ARRAYSIZE(kEoB2DscItemTileIndexPC98), kEoB2DscItemTileIndexPC98 };
+
+static const byte kEoB2DscItemShapeMapPC98[113] = {
+	0x00, 0x00, 0x00, 0x05, 0x01, 0x02, 0x03, 0x04,
+	0x03, 0x05, 0x06, 0x06, 0x12, 0x05, 0x0F, 0x12,
+	0x14, 0x08, 0x13, 0x11, 0x15, 0x18, 0x07, 0x07,
+	0x07, 0x1F, 0x09, 0x23, 0x09, 0x09, 0x09, 0x09,
+	0x08, 0x1C, 0x1C, 0x1A, 0x1B, 0x21, 0x1D, 0x1D,
+	0x22, 0x22, 0x22, 0x00, 0x16, 0x00, 0x00, 0x17,
+	0x17, 0x17, 0x17, 0x17, 0x22, 0x21, 0x19, 0x23,
+	0x10, 0x1E, 0x17, 0x25, 0x17, 0x26, 0x12, 0x21,
+	0x17, 0x23, 0x1C, 0x00, 0x20, 0x25, 0x12, 0x18,
+	0x1F, 0x07, 0x07, 0x15, 0x15, 0x0F, 0x03, 0x09,
+	0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B,
+	0x1B, 0x17, 0x17, 0x16, 0x16, 0x21, 0x08, 0x25,
+	0x25, 0x25, 0x25, 0x28, 0x03, 0x04, 0x21, 0x00,
+	0x17, 0x00, 0x20, 0x24, 0x27, 0x27, 0x1C, 0x27,
+	0x00
+};
+
+static const ByteProvider kEoB2DscItemShapeMapPC98Provider = { ARRAYSIZE(kEoB2DscItemShapeMapPC98), kEoB2DscItemShapeMapPC98 };
+
+static const byte kEoB2DscTelptrShpCoordsPC98[156] = {
+	0x0C, 0x07, 0x1A, 0x01, 0x3E, 0x03, 0x0C, 0x1A,
+	0x2A, 0x13, 0x40, 0x18, 0x02, 0x2D, 0x16, 0x25,
+	0x28, 0x32, 0x36, 0x27, 0x0A, 0x3E, 0x16, 0x49,
+	0x3E, 0x44, 0x06, 0x06, 0x2A, 0x04, 0x37, 0x0A,
+	0x04, 0x1B, 0x1A, 0x16, 0x37, 0x1D, 0x0E, 0x2A,
+	0x1B, 0x35, 0x2E, 0x28, 0x42, 0x30, 0x06, 0x47,
+	0x06, 0x47, 0x2D, 0x4C, 0x0A, 0x04, 0x14, 0x00,
+	0x2E, 0x01, 0x0C, 0x10, 0x1F, 0x10, 0x2F, 0x10,
+	0x12, 0x18, 0x28, 0x1D, 0x01, 0x21, 0x08, 0x2A,
+	0x11, 0x32, 0x2F, 0x2E, 0x1F, 0x25, 0x02, 0x02,
+	0x01, 0x11, 0x01, 0x2F, 0x08, 0x1E, 0x11, 0x0E,
+	0x11, 0x26, 0x1C, 0x01, 0x1E, 0x19, 0x1F, 0x33,
+	0x24, 0x11, 0x26, 0x05, 0x28, 0x2B, 0x2F, 0x22,
+	0x00, 0x13, 0x05, 0x01, 0x06, 0x08, 0x09, 0x0C,
+	0x04, 0x1A, 0x08, 0x1F, 0x12, 0x05, 0x12, 0x15,
+	0x16, 0x10, 0x1A, 0x08, 0x1A, 0x1D, 0x0A, 0x00,
+	0x0A, 0x00, 0x00, 0x09, 0x00, 0x1E, 0x04, 0x11,
+	0x08, 0x16, 0x08, 0x06, 0x10, 0x00, 0x11, 0x0D,
+	0x12, 0x20, 0x15, 0x02, 0x14, 0x09, 0x16, 0x1B,
+	0x1A, 0x14, 0x1A, 0x14
+};
+
+static const ByteProvider kEoB2DscTelptrShpCoordsPC98Provider = { ARRAYSIZE(kEoB2DscTelptrShpCoordsPC98), kEoB2DscTelptrShpCoordsPC98 };
+
+static const byte kEoB2PortalSeqDataPC98[126] = {
+	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
+	0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+	0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+	0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+	0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
+	0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
+	0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x03, 0x02,
+	0x02, 0x03, 0x01, 0x04, 0x00, 0x02, 0x01, 0x03,
+	0x02, 0x04, 0x03, 0x02, 0x04, 0x03, 0x03, 0x04,
+	0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+	0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x03, 0x07,
+	0x02, 0x08, 0x02, 0x08, 0x01, 0x09, 0x01, 0x09,
+	0x01, 0x09, 0x00, 0x0A, 0xFF, 0xFF
+};
+
+static const ByteProvider kEoB2PortalSeqDataPC98Provider = { ARRAYSIZE(kEoB2PortalSeqDataPC98), kEoB2PortalSeqDataPC98 };
+
+static const byte kEoB2DscMonsterFrmOffsTbl1PC98[32] = {
+	0x04, 0xFE, 0x01, 0x03, 0x03, 0x04, 0xFE, 0x01,
+	0x01, 0x03, 0x04, 0xFE, 0xFE, 0x01, 0x03, 0x04,
+	0xFC, 0xFD, 0xFF, 0x02, 0x02, 0xFC, 0xFD, 0xFF,
+	0xFF, 0x02, 0xFC, 0xFD, 0xFD, 0xFF, 0x02, 0xFC
+};
+
+static const ByteProvider kEoB2DscMonsterFrmOffsTbl1PC98Provider = { ARRAYSIZE(kEoB2DscMonsterFrmOffsTbl1PC98), kEoB2DscMonsterFrmOffsTbl1PC98 };
+
+static const byte kEoB2DscMonsterFrmOffsTbl2PC98[32] = {
+	0x04, 0xFE, 0x01, 0x03, 0x03, 0x04, 0xFE, 0x01,
+	0x01, 0x03, 0x04, 0xFE, 0xFE, 0x01, 0x03, 0x04,
+	0x04, 0xFD, 0x01, 0x02, 0x02, 0x04, 0xFD, 0x01,
+	0x01, 0x02, 0x04, 0xFD, 0xFD, 0x01, 0x02, 0x04
+};
+
+static const ByteProvider kEoB2DscMonsterFrmOffsTbl2PC98Provider = { ARRAYSIZE(kEoB2DscMonsterFrmOffsTbl2PC98), kEoB2DscMonsterFrmOffsTbl2PC98 };
+
+static const uint16 kEoB2InvSlotXPC98[27] = {
+	0x00E6, 0x0116, 0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7,
+	0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7, 0x00B5, 0x00C7,
+	0x00E1, 0x00E0, 0x00E1, 0x012A, 0x011F, 0x0115, 0x012C, 0x012C,
+	0x012C, 0x00E4, 0x00F0
+};
+
+static const Uint16Provider kEoB2InvSlotXPC98Provider = { ARRAYSIZE(kEoB2InvSlotXPC98), kEoB2InvSlotXPC98 };
+
+static const byte kEoB2InvSlotYPC98[27] = {
+	0x74, 0x74, 0x28, 0x28, 0x3A, 0x3A, 0x4C, 0x4C,
+	0x5E, 0x5E, 0x70, 0x70, 0x82, 0x82, 0x94, 0x94,
+	0x38, 0x4C, 0x60, 0x37, 0x4B, 0x89, 0x5E, 0x70,
+	0x82, 0x88, 0x88
+};
+
+static const ByteProvider kEoB2InvSlotYPC98Provider = { ARRAYSIZE(kEoB2InvSlotYPC98), kEoB2InvSlotYPC98 };
+
+static const uint16 kEoB2SlotValidationFlagsPC98[27] = {
+	0x0008, 0x0008, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+	0x0001, 0x0002, 0x0004, 0x0020, 0x0040, 0x0010, 0xFFFF, 0x0080,
+	0x0080, 0x0100, 0x0100
+};
+
+static const Uint16Provider kEoB2SlotValidationFlagsPC98Provider = { ARRAYSIZE(kEoB2SlotValidationFlagsPC98), kEoB2SlotValidationFlagsPC98 };
+
+static const byte kEoB2ProjectileWeaponTypesPC98[15] = {
+	0xFF, 0x01, 0xFF, 0x02, 0x04, 0x03, 0x05, 0x10,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x12
+};
+
+static const ByteProvider kEoB2ProjectileWeaponTypesPC98Provider = { ARRAYSIZE(kEoB2ProjectileWeaponTypesPC98), kEoB2ProjectileWeaponTypesPC98 };
+
+static const byte kEoB2WandTypesPC98[8] = {
+	0x00, 0x11, 0x17, 0x31, 0x0D, 0xFF, 0x04, 0x0C
+};
+
+static const ByteProvider kEoB2WandTypesPC98Provider = { ARRAYSIZE(kEoB2WandTypesPC98), kEoB2WandTypesPC98 };
+
+static const byte kEoB2DrawObjPosIndexPC98[20] = {
+	0x00, 0x01, 0x02, 0x03, 0x04, 0x02, 0x00, 0x03,
+	0x01, 0x04, 0x02, 0x03, 0x00, 0x01, 0x04, 0x01,
+	0x03, 0x00, 0x02, 0x04
+};
+
+static const ByteProvider kEoB2DrawObjPosIndexPC98Provider = { ARRAYSIZE(kEoB2DrawObjPosIndexPC98), kEoB2DrawObjPosIndexPC98 };
+
+static const byte kEoB2FlightObjFlipIndexPC98[16] = {
+	0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
+	0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2FlightObjFlipIndexPC98Provider = { ARRAYSIZE(kEoB2FlightObjFlipIndexPC98), kEoB2FlightObjFlipIndexPC98 };
+
+static const byte kEoB2FlightObjShpMapPC98[45] = {
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02,
+	0xFF, 0xFF, 0x04, 0xFF, 0x06, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2FlightObjShpMapPC98Provider = { ARRAYSIZE(kEoB2FlightObjShpMapPC98), kEoB2FlightObjShpMapPC98 };
+
+static const byte kEoB2FlightObjSclIndexPC98[72] = {
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
+	0xFF, 0xFF, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0x03,
+	0xFF, 0xFF, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+	0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0x01, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+};
+
+static const ByteProvider kEoB2FlightObjSclIndexPC98Provider = { ARRAYSIZE(kEoB2FlightObjSclIndexPC98), kEoB2FlightObjSclIndexPC98 };
+
+static const uint16 kEoB2TransferPortraitFramesPC98[32] = {
+	0x0004, 0x0018, 0x009D, 0x0038, 0x00A2, 0x0018, 0x013C, 0x0039,
+	0x0004, 0x0040, 0x009D, 0x0060, 0x00A2, 0x0040, 0x013C, 0x0060,
+	0x0004, 0x0068, 0x009D, 0x0089, 0x00A2, 0x0068, 0x013C, 0x0089,
+	0x0004, 0x0094, 0x002E, 0x009E, 0x0110, 0x0094, 0x013A, 0x009E
+};
+
+static const Uint16Provider kEoB2TransferPortraitFramesPC98Provider = { ARRAYSIZE(kEoB2TransferPortraitFramesPC98), kEoB2TransferPortraitFramesPC98 };
+
+static const byte kEoB2TransferConvertTablePC98[49] = {
+	0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x05, 0x06,
+	0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x0D, 0x00, 0x0E,
+	0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x00, 0x00,
+	0x17, 0x18, 0x22, 0x24, 0x23, 0x25, 0x26, 0x27,
+	0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+	0x31, 0x30, 0x32, 0x33, 0x00, 0x35, 0x34, 0x36,
+	0x37
+};
+
+static const ByteProvider kEoB2TransferConvertTablePC98Provider = { ARRAYSIZE(kEoB2TransferConvertTablePC98), kEoB2TransferConvertTablePC98 };
+
+static const byte kEoB2TransferItemTablePC98[60] = {
+	0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
+	0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
+	0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01,
+	0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01,
+	0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2TransferItemTablePC98Provider = { ARRAYSIZE(kEoB2TransferItemTablePC98), kEoB2TransferItemTablePC98 };
+
+static const uint32 kEoB2TransferExpTablePC98[6] = {
+	0x000F423F, 0x000B71AF, 0x000DBB9F, 0x0006B6BF, 0x000DBB9F, 0x000DBB9F
+};
+
+static const Uint32Provider kEoB2TransferExpTablePC98Provider = { ARRAYSIZE(kEoB2TransferExpTablePC98), kEoB2TransferExpTablePC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData00PC98[5] = {
+	{ 0x01,   0, 208,  16,   1,   1,   0,   0,   0,   0 },
+	{ 0x01,   0, 208,  16,   1,   1,   0,   0,   0,   0 },
+	{ 0x00,   0, 216,  51,   8,   0,   0,   0,   0,   0 },
+	{ 0x06,   5,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData00PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData00PC98), kEoB2IntroAnimData00PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData01PC98[5] = {
+	{ 0x01,   1, 184,   8,   1,   1,   0,   0,   0,   0 },
+	{ 0x01,   1, 184,   8,   1,   1,   0,   0,   0,   0 },
+	{ 0x00,   0, 216,  51,   7,   0,   0,   0,   0,   0 },
+	{ 0x06,   6,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData01PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData01PC98), kEoB2IntroAnimData01PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData02PC98[5] = {
+	{ 0x01,   2, 216,  51,   1,   0,   0,   0,   0,   0 },
+	{ 0x01,   2, 216,  51,   1,   0,   0,   0,   0,   0 },
+	{ 0x00,   0, 216,  51,  18,   0,   0,   0,   0,   0 },
+	{ 0x06,   8,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData02PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData02PC98), kEoB2IntroAnimData02PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData03PC98[4] = {
+	{ 0x00,   0,   0,   0,   1,   2,   0,   0,   0,   0 },
+	{ 0x06,   5,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   2,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData03PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData03PC98), kEoB2IntroAnimData03PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData04PC98[3] = {
+	{ 0x01,   0, 282,   8,   1,   0,   0,   0,   0,   0 },
+	{ 0x01,   0, 282,   8,   1,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData04PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData04PC98), kEoB2IntroAnimData04PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData05PC98[4] = {
+	{ 0x00,   0,   0,   0,   1,   1,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   1,   0,   0,   0,   0 },
+	{ 0x06,   7,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData05PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData05PC98), kEoB2IntroAnimData05PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData06PC98[16] = {
+	{ 0x01,  12, 170,  11,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 188,  38,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 203,  63,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 218,  85,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 232, 107,   2,   0,   0,   0,   0,   0 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x01,   3, 242, 125,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,   4, 240, 125,   3,   0,   0,   0,   0,   0 },
+	{ 0x01,   5, 238, 124,   3,   0,   0,   0,   0,   0 },
+	{ 0x01,   6, 236, 123,   3,   0,   0,   0,   0,   0 },
+	{ 0x01,   7, 232, 121,   3,   0,   0,   0,   0,   0 },
+	{ 0x01,   8, 226, 120,   4,   0,   0,   0,   0,   0 },
+	{ 0x01,   9, 220, 119,   4,   0,   0,   0,   0,   0 },
+	{ 0x01,  10, 241, 115,   4,   0,   0,   0,   0,   0 },
+	{ 0x01,  11, 241, 115,   4,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData06PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData06PC98), kEoB2IntroAnimData06PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData07PC98[5] = {
+	{ 0x01,  12,  54,  17,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12,  80,  53,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 104,  87,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 130, 124,   2,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData07PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData07PC98), kEoB2IntroAnimData07PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData08PC98[6] = {
+	{ 0x01,  12, 112,   8,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 126,  34,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 142,  60,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,  12, 170, 109,   2,   0,   0,   0,   0,   0 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData08PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData08PC98), kEoB2IntroAnimData08PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData09PC98[4] = {
+	{ 0x05,   0, 184,  64,   6,   0,  30,   8,   3,  16 },
+	{ 0x05,   0, 184,  64,   6,   0,  33,   8,   3,  16 },
+	{ 0x05,   0, 184,  64,   6,   0,  36,   8,   3,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData09PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData09PC98), kEoB2IntroAnimData09PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData10PC98[10] = {
+	{ 0x05,   0, 184,  64,   0,   0,  30,   8,   3,  16 },
+	{ 0x05,   0, 128,  88,   3,   0,  30,  32,   4,  24 },
+	{ 0x05,   0, 128,  88,   3,   0,  34,  32,   4,  24 },
+	{ 0x05,   0, 184,  64,   0,   0,  33,   8,   3,  16 },
+	{ 0x05,   0, 128,  88,   3,   0,  30,  32,   4,  24 },
+	{ 0x05,   0, 128,  88,   3,   0,  34,  32,   4,  24 },
+	{ 0x05,   0, 184,  64,   0,   0,  36,   8,   3,  16 },
+	{ 0x05,   0, 128,  88,   3,   0,  30,  32,   4,  24 },
+	{ 0x05,   0, 128,  88,   3,   0,  34,  32,   4,  24 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData10PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData10PC98), kEoB2IntroAnimData10PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData11PC98[4] = {
+	{ 0x06,  10,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 104,  24,   5,   0,   0,   8,  15, 112 },
+	{ 0x05,   0, 104,  24,   5,   0,  15,   8,  15, 112 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData11PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData11PC98), kEoB2IntroAnimData11PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData12PC98[6] = {
+	{ 0x05,   0, 184,  64,   0,   0,  30,   8,   3,  16 },
+	{ 0x05,   0, 104,  72,   5,   0,  10, 120,  10,  64 },
+	{ 0x05,   0, 184,  64,   0,   0,  33,   8,   3,  16 },
+	{ 0x05,   0, 104,  72,   5,   0,  20, 120,  10,  64 },
+	{ 0x05,   0, 184,  64,   0,   0,  36,   8,   3,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData12PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData12PC98), kEoB2IntroAnimData12PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData13PC98[4] = {
+	{ 0x05,   0, 104,   0,   8,   0,   0,   0,  13, 200 },
+	{ 0x05,   0, 104,   0,   8,   0,  13,   0,  13, 200 },
+	{ 0x05,   0, 104,   0,   8,   0,  26,   0,  13, 200 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData13PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData13PC98), kEoB2IntroAnimData13PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData14PC98[10] = {
+	{ 0x02,   9, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 240,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   6, 112,  72,   6,   0,   0,   0,   0,   0 },
+	{ 0x02,   1, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   4, 240,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   7, 112,  72,   6,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   5, 240,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   8, 112,  72,   6,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData14PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData14PC98), kEoB2IntroAnimData14PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData15PC98[11] = {
+	{ 0x02,   9, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 240,  40,   6,   0,   0,   0,   0,   0 },
+	{ 0x06,   7,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   3,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   3,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   3,   0,   0,   0,   0 },
+	{ 0x02,   1, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   4, 240,  40,   6,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   5, 240,  40,   6,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData15PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData15PC98), kEoB2IntroAnimData15PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData16PC98[8] = {
+	{ 0x06, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   9, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 240,  40,   6,   0,   0,   0,   0,   0 },
+	{ 0x02,   1, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   4, 240,  40,   6,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   5, 240,  40,   6,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData16PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData16PC98), kEoB2IntroAnimData16PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData17PC98[14] = {
+	{ 0x06, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,  10, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   9, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  11, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  12, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   1, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   4, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  13, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  10, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   5, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  13, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData17PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData17PC98), kEoB2IntroAnimData17PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData18PC98[14] = {
+	{ 0x06, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,  11, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   9, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  10, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  13, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   1, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   4, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  12, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  11, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   5, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  13, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData18PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData18PC98), kEoB2IntroAnimData18PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData19PC98[14] = {
+	{ 0x06, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,  14, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   9, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  15, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  16, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   1, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   4, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  17, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  14, 136,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 224,  72,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   5, 240,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0x02,  17, 136,  40,   3,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData19PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData19PC98), kEoB2IntroAnimData19PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData20PC98[2] = {
+	{ 0x05,   0, 104,  32,   0,   0,  10,   0,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData20PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData20PC98), kEoB2IntroAnimData20PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData21PC98[2] = {
+	{ 0x05,   0, 104,  32,   3,   0,  20,   0,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData21PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData21PC98), kEoB2IntroAnimData21PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData22PC98[2] = {
+	{ 0x05,   0, 104,  32,   0,   0,  30,   0,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData22PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData22PC98), kEoB2IntroAnimData22PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData23PC98[2] = {
+	{ 0x05,   0, 104,  32,   0,   0,   0,  96,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData23PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData23PC98), kEoB2IntroAnimData23PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData24PC98[2] = {
+	{ 0x05,   0, 104,  32,   3,   0,  10,  96,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData24PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData24PC98), kEoB2IntroAnimData24PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData25PC98[2] = {
+	{ 0x05,   0, 104,  32,   0,   0,  20,  96,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData25PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData25PC98), kEoB2IntroAnimData25PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData26PC98[2] = {
+	{ 0x05,   0, 104,  32,   0,   0,   0,   0,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData26PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData26PC98), kEoB2IntroAnimData26PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData27PC98[2] = {
+	{ 0x05,   0, 104,  32,   3,   0,   0,   0,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData27PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData27PC98), kEoB2IntroAnimData27PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData28PC98[2] = {
+	{ 0x05,   0, 104,  32,   4,   0,  10,   0,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData28PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData28PC98), kEoB2IntroAnimData28PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData29PC98[2] = {
+	{ 0x05,   0, 104,  32,   8,   0,  20,   0,  10,  96 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData29PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData29PC98), kEoB2IntroAnimData29PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData30PC98[5] = {
+	{ 0x06, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 176,  56,   3,   0,  19, 136,   2,   8 },
+	{ 0x05,   0, 176,  56,   3,   0,  21, 136,   2,   8 },
+	{ 0x05,   0, 176,  56,   3,   0,  23, 136,   2,   8 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData30PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData30PC98), kEoB2IntroAnimData30PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData31PC98[14] = {
+	{ 0x06, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 176,  56,   0,   0,  19, 136,   2,   8 },
+	{ 0x05,   0, 144,  88,   5,   0,   1, 136,   6,  40 },
+	{ 0x05,   0, 176,  56,   0,   0,  21, 136,   2,   8 },
+	{ 0x05,   0, 144,  88,   3,   0,   7, 136,   6,  40 },
+	{ 0x05,   0, 176,  56,   2,   0,  23, 136,   2,   8 },
+	{ 0x05,   0, 144,  88,   3,   0,  13, 136,   6,  40 },
+	{ 0x05,   0, 176,  56,   0,   0,  19, 136,   2,   8 },
+	{ 0x05,   0, 144,  88,   6,   0,   1, 136,   6,  40 },
+	{ 0x05,   0, 176,  56,   0,   0,  21, 136,   2,   8 },
+	{ 0x05,   0, 144,  88,   3,   0,   7, 136,   6,  40 },
+	{ 0x05,   0, 176,  56,   0,   0,  23, 136,   2,   8 },
+	{ 0x05,   0, 144,  88,   3,   0,   1, 136,   6,  40 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData31PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData31PC98), kEoB2IntroAnimData31PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData32PC98[8] = {
+	{ 0x06, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0,  80,  64,   0,   0,   1, 136,   2,  16 },
+	{ 0x05,   0, 248,  64,   3,   0,   7, 136,   2,  16 },
+	{ 0x05,   0,  80,  64,   0,   0,   3, 136,   2,  16 },
+	{ 0x05,   0, 248,  64,   3,   0,   9, 136,   2,  16 },
+	{ 0x05,   0,  80,  64,   0,   0,   5, 136,   2,  16 },
+	{ 0x05,   0, 248,  64,   3,   0,  11, 136,   2,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData32PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData32PC98), kEoB2IntroAnimData32PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData33PC98[5] = {
+	{ 0x06, 255,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0,  16,  48,   0,   0,   0, 152,  14,  48 },
+	{ 0x05,   0, 192,  48,   4,   0,  14, 128,  13,  48 },
+	{ 0x05,   0,  16,  48,   0,   0,   1,  40,  35,  48 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData33PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData33PC98), kEoB2IntroAnimData33PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData34PC98[6] = {
+	{ 0x06,   3,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 168,  24,   3,   0,   0, 128,   2,  32 },
+	{ 0x05,   0, 152,  16,   3,   0,   0,  88,   5,  40 },
+	{ 0x05,   0, 128,   0,   3,   0,   0,   0,  10,  88 },
+	{ 0x05,   0, 104,   0,   3,   0,  13,   0,  14,  88 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData34PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData34PC98), kEoB2IntroAnimData34PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData35PC98[2] = {
+	{ 0x05,   0, 104,   0,   0,   0,  13,   0,  13, 200 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData35PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData35PC98), kEoB2IntroAnimData35PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData36PC98[15] = {
+	{ 0x03,  16,   8,  63,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   6,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,  54,   7,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   6,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  16,   8,  63,   1,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData36PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData36PC98), kEoB2IntroAnimData36PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData37PC98[3] = {
+	{ 0x02,  16,   8,  63,  54,   0,   0,   0,   0,   0 },
+	{ 0x07,  16,   8,  63,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData37PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData37PC98), kEoB2IntroAnimData37PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData38PC98[32] = {
+	{ 0x03,  21,  21,  32,   0,   1,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   2,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   3,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   4,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   3,   0,   0,   0,   0 },
+	{ 0x06,  11,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   5,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   6,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   7,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,  18,   6,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   7,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,  90,   6,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   6,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   5,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   4,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   3,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   2,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   1,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  21,  21,  32,   0,   0,   0,   0,   0,   0 },
+	{ 0x03,  22,  67,  80,   1,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData38PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData38PC98), kEoB2IntroAnimData38PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData39PC98[5] = {
+	{ 0x02,  21,  21,  32,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,  22,  67,  80,  90,   0,   0,   0,   0,   0 },
+	{ 0x07,  21,  21,  32,   0,   0,   0,   0,   0,   0 },
+	{ 0x07,  22,  67,  80,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData39PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData39PC98), kEoB2IntroAnimData39PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData40PC98[3] = {
+	{ 0x06,   5,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   2,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData40PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData40PC98), kEoB2IntroAnimData40PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData41PC98[5] = {
+	{ 0x06,   7,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   3,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   3,   0,   0,   0,   0 },
+	{ 0x00,   0,   0,   0,   1,   3,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData41PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData41PC98), kEoB2IntroAnimData41PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData42PC98[15] = {
+	{ 0x03,  15, 100,  65,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   6,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,  90,   7,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   6,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  15, 100,  65,   1,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData42PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData42PC98), kEoB2IntroAnimData42PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData43PC98[3] = {
+	{ 0x02,  15, 100,  65,  90,   0,   0,   0,   0,   0 },
+	{ 0x07,  15, 100,  65,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData43PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData43PC98), kEoB2IntroAnimData43PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData44PC98[43] = {
+	{ 0x03,  18,  44,  64,   0,   1,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   1,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   2,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   2,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   3,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   3,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   4,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   4,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   5,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   5,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   6,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   6,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   6,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   7,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   7,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,  54,   7,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   6,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   6,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   6,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   5,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   5,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   4,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   4,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   3,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   3,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   2,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   2,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   1,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   1,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  18,  44,  64,   0,   0,   0,   0,   0,   0 },
+	{ 0x03,  19, 142,  96,   0,   0,   0,   0,   0,   0 },
+	{ 0x03,  17, 151,  40,   1,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData44PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData44PC98), kEoB2IntroAnimData44PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData45PC98[7] = {
+	{ 0x02,  18,  44,  64,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,  19, 142,  96,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,  17, 151,  40,  54,   0,   0,   0,   0,   0 },
+	{ 0x07,  18,  44,  64,   0,   0,   0,   0,   0,   0 },
+	{ 0x07,  19, 142,  96,   0,   0,   0,   0,   0,   0 },
+	{ 0x07,  17, 151,  40,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData45PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData45PC98), kEoB2IntroAnimData45PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData46PC98[15] = {
+	{ 0x03,  20,  12,  35,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   6,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,  54,   7,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   6,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   5,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   4,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   3,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   2,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   1,   0,   0,   0,   0 },
+	{ 0x03,  20,  12,  35,   1,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData46PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData46PC98), kEoB2IntroAnimData46PC98 };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData47PC98[3] = {
+	{ 0x02,  20,  12,  35,  54,   0,   0,   0,   0,   0 },
+	{ 0x07,  20,  12,  35,   0,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData47PC98Provider = { ARRAYSIZE(kEoB2IntroAnimData47PC98), kEoB2IntroAnimData47PC98 };
+
+static const DarkMoonShapeDef kEoB2IntroShapes00PC98[15] = {
+	{    0,   1, 137,   4,  43 },
+	{    1,   5, 137,   4,  54 },
+	{    2,   9, 140,   4,   8 },
+	{    3,   1, 181,   1,   3 },
+	{    4,   9, 154,   1,   3 },
+	{    5,   9, 158,   2,   5 },
+	{    6,   9, 164,   3,   7 },
+	{    7,   9, 172,   3,  11 },
+	{    8,   9, 184,   5,  13 },
+	{    9,  15, 137,   6,  15 },
+	{   10,  15, 153,   2,  21 },
+	{   11,  17, 153,   2,  21 },
+	{   12,   1, 185,   1,   4 },
+	{   13,   1, 190,   1,   1 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes00PC98Provider = { ARRAYSIZE(kEoB2IntroShapes00PC98), kEoB2IntroShapes00PC98 };
+
+static const DarkMoonShapeDef kEoB2IntroShapes01PC98[2] = {
+	{    0,   1, 137,   1,  16 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes01PC98Provider = { ARRAYSIZE(kEoB2IntroShapes01PC98), kEoB2IntroShapes01PC98 };
+
+static const DarkMoonShapeDef kEoB2IntroShapes04PC98[5] = {
+	{   17,  21,  16,   3,   8 },
+	{   19,   5,  16,   5,   8 },
+	{   21,   0,  71,  35,  39 },
+	{   22,   0, 119,  24,  15 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes04PC98Provider = { ARRAYSIZE(kEoB2IntroShapes04PC98), kEoB2IntroShapes04PC98 };
+
+static const DarkMoonShapeDef kEoB2IntroShapes07PC98[18] = {
+	{   -9,   1, 136,   6,  40 },
+	{   -1,   7, 136,   6,  40 },
+	{   -2,  13, 136,   6,  40 },
+	{    3,  19, 136,   2,  16 },
+	{    4,  21, 136,   2,  16 },
+	{    5,  23, 136,   2,  16 },
+	{    6,  19, 152,   1,   8 },
+	{    7,  20, 152,   1,   8 },
+	{    8,  21, 152,   1,   8 },
+	{  -10,  25, 136,   2,  16 },
+	{  -11,  27, 136,   2,  16 },
+	{  -12,  29, 136,   2,  16 },
+	{  -13,  31, 136,   2,  16 },
+	{  -14,  25, 152,   2,  16 },
+	{  -15,  27, 152,   2,  16 },
+	{  -16,  29, 152,   2,  16 },
+	{  -17,  31, 152,   2,  16 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes07PC98Provider = { ARRAYSIZE(kEoB2IntroShapes07PC98), kEoB2IntroShapes07PC98 };
+
+static const DarkMoonShapeDef kEoB2IntroShapes13PC98[5] = {
+	{   15,  13,   0,  15,  16 },
+	{   16,   1,  32,  39,  18 },
+	{   18,   5,  64,  29,  16 },
+	{   20,   2,  96,  37,  74 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes13PC98Provider = { ARRAYSIZE(kEoB2IntroShapes13PC98), kEoB2IntroShapes13PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData00PC98[11] = {
+	{ 0x06,   3,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 136,   8,   8,   0,   5, 136,  11,  48 },
+	{ 0x02,   1, 136,   8,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0,  80,   8,   0,   0,   0, 136,   5,  40 },
+	{ 0x06,   4,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 232,  88,   4,   0,   0,  88,   8,  48 },
+	{ 0x02,   3,  80,   8,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 232,  88,   4,   0,   8,  88,   8,  48 },
+	{ 0x05,   0, 232,  88,   4,   0,  16,  88,   8,  48 },
+	{ 0x02,   2, 232,  88,   4,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData00PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData00PC98), kEoB2FinaleAnimData00PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData01PC98[9] = {
+	{ 0x06,   3,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 136,   8,  12,   0,   5, 136,  11,  48 },
+	{ 0x02,   1, 136,   8,   0,   0,   0,   0,   0,   0 },
+	{ 0x06,   4,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 232,  88,   6,   0,   0,  88,   8,  48 },
+	{ 0x05,   0, 232,  88,   6,   0,   8,  88,   8,  48 },
+	{ 0x05,   0, 232,  88,   6,   0,  16,  88,   8,  48 },
+	{ 0x02,   2, 232,  88,   6,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData01PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData01PC98), kEoB2FinaleAnimData01PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData02PC98[4] = {
+	{ 0x05,   0, 232, 112,   6,   0,  24, 176,   3,  16 },
+	{ 0x05,   0, 232, 112,   6,   0,  27, 176,   3,  16 },
+	{ 0x05,   0, 232, 112,   6,   0,  30, 176,   3,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData02PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData02PC98), kEoB2FinaleAnimData02PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData03PC98[6] = {
+	{ 0x05,   0,  80,   8,   0,   0,   0, 136,   5,  40 },
+	{ 0x05,   0, 232, 112,   3,   0,  24, 176,   3,  16 },
+	{ 0x02,   3,  80,   8,   3,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 232, 112,   3,   0,  27, 176,   3,  16 },
+	{ 0x05,   0, 232, 112,   3,   0,  30, 176,   3,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData03PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData03PC98), kEoB2FinaleAnimData03PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData04PC98[8] = {
+	{ 0x06,   5,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 104,  40,   3,   0,  32,  88,   8,  88 },
+	{ 0x05,   0, 104,  40,   3,   0,  32,   0,   8,  88 },
+	{ 0x05,   0, 104,  40,   3,   0,  24,   0,   8,  88 },
+	{ 0x05,   0, 104,  40,   3,   0,  16,   0,   8,  88 },
+	{ 0x05,   0, 104,  40,   3,   0,   0,   0,   8,  88 },
+	{ 0x05,   0, 104,  40,   3,   0,  24,  88,   8,  88 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData04PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData04PC98), kEoB2FinaleAnimData04PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData05PC98[7] = {
+	{ 0x05,   0, 232, 112,   0,   0,  24, 176,   3,  16 },
+	{ 0x05,   0, 128,  40,   4,   0,  33, 176,   2,  16 },
+	{ 0x05,   0, 232, 112,   0,   0,  27, 176,   3,  16 },
+	{ 0x05,   0, 128,  40,   4,   0,  35, 176,   2,  16 },
+	{ 0x05,   0, 232, 112,   0,   0,  30, 176,   3,  16 },
+	{ 0x05,   0, 128,  40,   4,   0,  37, 176,   2,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData05PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData05PC98), kEoB2FinaleAnimData05PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData06PC98[2] = {
+	{ 0x05,   0, 104,  40,   0,   0,  16, 136,   8,  48 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData06PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData06PC98), kEoB2FinaleAnimData06PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData07PC98[6] = {
+	{ 0x05,   0, 208,  80,   4,   0,   0, 128,   6,  56 },
+	{ 0x05,   0, 208,  80,   4,   0,   6, 128,   6,  56 },
+	{ 0x05,   0, 208,  80,   4,   0,  12, 128,   6,  56 },
+	{ 0x05,   0, 208,  80,   4,   0,  18, 128,   6,  56 },
+	{ 0x05,   0, 208,  80,   4,   0,  24, 128,   6,  56 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData07PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData07PC98), kEoB2FinaleAnimData07PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData08PC98[3] = {
+	{ 0x05,   0, 224,  56,   3,   0,   0, 184,   4,  16 },
+	{ 0x05,   0, 224,  56,   0,   0,   4, 184,   4,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData08PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData08PC98), kEoB2FinaleAnimData08PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData09PC98[8] = {
+	{ 0x01,   1, -10,  40,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,   1,   0,  40,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,   1,  10,  40,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,   1,  20,  40,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,   1,  30,  40,   2,   0,   0,   0,   0,   0 },
+	{ 0x01,   1,  40,  40,   2,   0,   0,   0,   0,   0 },
+	{ 0x02,   2,  48,  40,   2,   0,   0,   0,   0,   0 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData09PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData09PC98), kEoB2FinaleAnimData09PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData10PC98[14] = {
+	{ 0x05,   1,   8,  40,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  24, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   3,   0,  12,  80,   1,  16 },
+	{ 0x05,   1,   8,  40,   0,   0,  32,  80,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  28, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   3,   0,  13,  80,   1,  16 },
+	{ 0x05,   1,   8,  40,   0,   0,  24,  80,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  32, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   3,   0,  14,  80,   1,  16 },
+	{ 0x06,   7,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,   0,  40,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,  12, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0, 128,  12,  24 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData10PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData10PC98), kEoB2FinaleAnimData10PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData11PC98[18] = {
+	{ 0x05,   1,  40,  32,   0,   0,  16,  40,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,  18, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   0,   0,   0, 152,  12,  24 },
+	{ 0x05,   1,   8,  40,   0,   0,  24,  80,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  32, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   0,   0,  14,  80,   1,  16 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x05,   1,   8,  40,   0,   0,  24,  80,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  32, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   3,   0,  14,  80,   1,  16 },
+	{ 0x05,   1,   8,  40,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  24, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   3,   0,  12,  80,   1,  16 },
+	{ 0x05,   1,   8,  40,   0,   0,  16,  80,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  36, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   3,   0,  15,  80,   1,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData11PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData11PC98), kEoB2FinaleAnimData11PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData12PC98[23] = {
+	{ 0x05,   1,  40,  32,   0,   0,  16,  40,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,  18, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   0,   0,   0, 152,  12,  24 },
+	{ 0x05,   1,   8,  40,   0,   0,  24,  80,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  32, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   0,   0,  14,  80,   1,  16 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,   8,  40,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  24, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   3,   0,  12,  80,   1,  16 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,   8,  40,   0,   0,  16,  80,   8,  80 },
+	{ 0x05,   1, 280,  96,   0,   0,  36, 160,   4,  40 },
+	{ 0x05,   1,  96,  96,   3,   0,  15,  80,   1,  16 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData12PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData12PC98), kEoB2FinaleAnimData12PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData13PC98[23] = {
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   1, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x06,   8,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,   0,   0,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,   0, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0,  80,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,  16,   0,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,   6, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0, 104,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,   0,  40,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,  12, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0, 128,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData13PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData13PC98), kEoB2FinaleAnimData13PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData14PC98[24] = {
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   1, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x06,   8,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,   0,   0,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,   0, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0,  80,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,  16,   0,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,   6, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0, 104,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x06,   8,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,   0,  40,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,  12, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0, 128,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData14PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData14PC98), kEoB2FinaleAnimData14PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData15PC98[19] = {
+	{ 0x05,   1,  40,  32,   0,   0,   0,   0,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,   0, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0,  80,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 168,  16,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,  16,   0,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,   6, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0, 104,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   8,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   1,  40,  32,   0,   0,   0,  40,  16,  40 },
+	{ 0x05,   1, 248,  88,   0,   0,  12, 176,   6,  24 },
+	{ 0x05,   1,  96,  80,   3,   0,   0, 128,  12,  24 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData15PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData15PC98), kEoB2FinaleAnimData15PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData16PC98[13] = {
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   1, 168,  16,   3,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   2, 168,  16,   3,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0x06,   9,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x02,   3, 168,  16,   3,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 168,  16,   0,   0,  32,   0,   8,  80 },
+	{ 0x05,   0, 232,  16,   0,   0,  32,  80,   8,  80 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData16PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData16PC98), kEoB2FinaleAnimData16PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData17PC98[20] = {
+	{ 0x05,   0, 168,  16,   1,   0,   0,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,   0,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,   0,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,   0,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,   0,  16,  80 },
+	{ 0x06,  12,   0,   0,   0,   0,   0,   0,   0,   0 },
+	{ 0x05,   0, 168,  16,   3,   0,   0,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,  16,   0,  16,  80 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData17PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData17PC98), kEoB2FinaleAnimData17PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData18PC98[28] = {
+	{ 0x05,   0, 168,  16,   1,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,  16,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,  16,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,   0,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,   0,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,  16,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,  16,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   3,   0,  16,   0,  16,  80 },
+	{ 0x05,   0, 168,  16,   1,   0,   0,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   2,   0,  16,  80,  16,  80 },
+	{ 0x05,   0, 168,  16,   0,   0,  16,  80,  16,  80 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData18PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData18PC98), kEoB2FinaleAnimData18PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData19PC98[7] = {
+	{ 0x05,   0,  80,  80,   4,   0,   0, 128,   6,  56 },
+	{ 0x05,   0,  80,  80,   4,   0,   6, 128,   6,  56 },
+	{ 0x05,   0,  80,  80,   4,   0,  12, 128,   6,  56 },
+	{ 0x05,   0,  80,  80,   4,   0,  18, 128,   6,  56 },
+	{ 0x05,   0,  80,  80,   4,   0,  24, 128,   6,  56 },
+	{ 0x05,   0,  80,  80,   4,   0,  30, 128,   6,  56 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData19PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData19PC98), kEoB2FinaleAnimData19PC98 };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData20PC98[3] = {
+	{ 0x05,   0,  96,  56,   3,   0,   0, 184,   4,  16 },
+	{ 0x05,   0,  96,  56,   0,   0,   4, 184,   4,  16 },
+	{ 0xff,   0,   0,   0,   0,   0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData20PC98Provider = { ARRAYSIZE(kEoB2FinaleAnimData20PC98), kEoB2FinaleAnimData20PC98 };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes00PC98[4] = {
+	{   -1,  16,   0,  11,  48 },
+	{   -2,  28,  80,   8,  48 },
+	{   -3,   9,   0,   5,  40 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes00PC98Provider = { ARRAYSIZE(kEoB2FinaleShapes00PC98), kEoB2FinaleShapes00PC98 };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes03PC98[3] = {
+	{   -1,  30,   0,   8,  96 },
+	{   -2,  30, 104,  10,  96 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes03PC98Provider = { ARRAYSIZE(kEoB2FinaleShapes03PC98), kEoB2FinaleShapes03PC98 };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes07PC98[4] = {
+	{    1,   0,   0,  16,  72 },
+	{    2,  16,   0,  16,  72 },
+	{    3,   0,  72,  16,  72 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes07PC98Provider = { ARRAYSIZE(kEoB2FinaleShapes07PC98), kEoB2FinaleShapes07PC98 };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes09PC98[9] = {
+	{    0,   0,   0,  32,  16 },
+	{    2,   0,  36,  35,  41 },
+	{    3,   0,  77,  24,  17 },
+	{    4,   0,  94,  15,  33 },
+	{    5,  24,  77,  10,  17 },
+	{    6,  16,  99,  23,  69 },
+	{  -10,   0, 136,   8,  64 },
+	{  -11,   8, 136,   8,  64 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes09PC98Provider = { ARRAYSIZE(kEoB2FinaleShapes09PC98), kEoB2FinaleShapes09PC98 };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes10PC98[5] = {
+	{    1,   0,   0,  40,  30 },
+	{   15,   9,  37,  21,  48 },
+	{   16,  16,  88,   6,  56 },
+	{   17,  12, 152,  14,  24 },
+	{    0,   0,   0,   0,   0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes10PC98Provider = { ARRAYSIZE(kEoB2FinaleShapes10PC98), kEoB2FinaleShapes10PC98 };
+
+static const byte kEoB2NpcShapeDataPC98[24] = {
+	0x00, 0x00, 0x00, 0x05, 0x39, 0x00, 0x00, 0xFF,
+	0x00, 0x00, 0x64, 0x05, 0x4F, 0x00, 0x00, 0xFF,
+	0x00, 0x00, 0x39, 0x06, 0x2B, 0x00, 0x00, 0xFF
+};
+
+static const ByteProvider kEoB2NpcShapeDataPC98Provider = { ARRAYSIZE(kEoB2NpcShapeDataPC98), kEoB2NpcShapeDataPC98 };
+
+static const byte kEoB2ClassModifierFlagsPC98[15] = {
+	0x01, 0x20, 0x10, 0x02, 0x04, 0x08, 0x05, 0x09,
+	0x03, 0x0B, 0x0A, 0x0C, 0x07, 0x05, 0x06
+};
+
+static const ByteProvider kEoB2ClassModifierFlagsPC98Provider = { ARRAYSIZE(kEoB2ClassModifierFlagsPC98), kEoB2ClassModifierFlagsPC98 };
+
+static const byte kEoB2MonsterStepTable02PC98[8] = {
+	0xE0, 0xE1, 0x01, 0x21, 0x20, 0x1F, 0xFF, 0xDF
+};
+
+static const ByteProvider kEoB2MonsterStepTable02PC98Provider = { ARRAYSIZE(kEoB2MonsterStepTable02PC98), kEoB2MonsterStepTable02PC98 };
+
+static const byte kEoB2MonsterStepTable1PC98[16] = {
+	0x01, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00,
+	0x00, 0x00, 0xFF, 0x20, 0xFF, 0x00, 0x00, 0xE0
+};
+
+static const ByteProvider kEoB2MonsterStepTable1PC98Provider = { ARRAYSIZE(kEoB2MonsterStepTable1PC98), kEoB2MonsterStepTable1PC98 };
+
+static const byte kEoB2MonsterStepTable2PC98[8] = {
+	0x07, 0xFA, 0x05, 0xFC, 0x03, 0xFE, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2MonsterStepTable2PC98Provider = { ARRAYSIZE(kEoB2MonsterStepTable2PC98), kEoB2MonsterStepTable2PC98 };
+
+static const byte kEoB2MonsterStepTable3PC98[8] = {
+	0xF9, 0x06, 0xFB, 0x04, 0xFD, 0x02, 0xFF, 0x00
+};
+
+static const ByteProvider kEoB2MonsterStepTable3PC98Provider = { ARRAYSIZE(kEoB2MonsterStepTable3PC98), kEoB2MonsterStepTable3PC98 };
+
+static const byte kEoB2MonsterCloseAttPosTable1PC98[4] = {
+	0x00, 0x01, 0x03, 0x02
+};
+
+static const ByteProvider kEoB2MonsterCloseAttPosTable1PC98Provider = { ARRAYSIZE(kEoB2MonsterCloseAttPosTable1PC98), kEoB2MonsterCloseAttPosTable1PC98 };
+
+static const byte kEoB2MonsterCloseAttPosTable22PC98[16] = {
+	0x00, 0x01, 0x02, 0x03, 0x00, 0x02, 0x01, 0x03,
+	0x00, 0x01, 0x02, 0x03, 0x03, 0x01, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttPosTable22PC98Provider = { ARRAYSIZE(kEoB2MonsterCloseAttPosTable22PC98), kEoB2MonsterCloseAttPosTable22PC98 };
+
+static const byte kEoB2MonsterCloseAttUnkTablePC98[12] = {
+	0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0x00, 0x02, 0xFF, 0x01
+};
+
+static const ByteProvider kEoB2MonsterCloseAttUnkTablePC98Provider = { ARRAYSIZE(kEoB2MonsterCloseAttUnkTablePC98), kEoB2MonsterCloseAttUnkTablePC98 };
+
+static const byte kEoB2MonsterCloseAttChkTable1PC98[16] = {
+	0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
+	0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttChkTable1PC98Provider = { ARRAYSIZE(kEoB2MonsterCloseAttChkTable1PC98), kEoB2MonsterCloseAttChkTable1PC98 };
+
+static const byte kEoB2MonsterCloseAttChkTable2PC98[16] = {
+	0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
+	0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttChkTable2PC98Provider = { ARRAYSIZE(kEoB2MonsterCloseAttChkTable2PC98), kEoB2MonsterCloseAttChkTable2PC98 };
+
+static const byte kEoB2MonsterCloseAttDstTable1PC98[16] = {
+	0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+	0x00, 0x01, 0x02, 0x03, 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kEoB2MonsterCloseAttDstTable1PC98Provider = { ARRAYSIZE(kEoB2MonsterCloseAttDstTable1PC98), kEoB2MonsterCloseAttDstTable1PC98 };
+
+static const byte kEoB2MonsterCloseAttDstTable2PC98[48] = {
+	0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x00, 0x01,
+	0x02, 0x03, 0x04, 0x05, 0x05, 0x03, 0x01, 0x04,
+	0x02, 0x00, 0x01, 0x03, 0x05, 0x00, 0x02, 0x04,
+	0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x05, 0x04,
+	0x03, 0x02, 0x01, 0x00, 0x00, 0x02, 0x04, 0x01,
+	0x03, 0x05, 0x04, 0x02, 0x00, 0x05, 0x03, 0x01
+};
+
+static const ByteProvider kEoB2MonsterCloseAttDstTable2PC98Provider = { ARRAYSIZE(kEoB2MonsterCloseAttDstTable2PC98), kEoB2MonsterCloseAttDstTable2PC98 };
+
+static const byte kEoB2MonsterProximityTablePC98[32] = {
+	0x02, 0x03, 0x00, 0x01, 0x03, 0x02, 0x01, 0x00,
+	0x00, 0x02, 0x01, 0x03, 0x02, 0x00, 0x03, 0x01,
+	0x01, 0x00, 0x03, 0x02, 0x00, 0x01, 0x02, 0x03,
+	0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2MonsterProximityTablePC98Provider = { ARRAYSIZE(kEoB2MonsterProximityTablePC98), kEoB2MonsterProximityTablePC98 };
+
+static const byte kEoB2FindBlockMonstersTablePC98[64] = {
+	0x04, 0x02, 0x01, 0x03, 0x04, 0x03, 0x00, 0x02,
+	0x04, 0x00, 0x03, 0x01, 0x04, 0x01, 0x02, 0x00,
+	0x04, 0x01, 0x02, 0x03, 0x04, 0x00, 0x03, 0x02,
+	0x04, 0x03, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00,
+	0x04, 0x02, 0x01, 0x03, 0x04, 0x03, 0x00, 0x02,
+	0x04, 0x00, 0x03, 0x01, 0x04, 0x01, 0x02, 0x00,
+	0x04, 0x01, 0x02, 0x03, 0x04, 0x00, 0x03, 0x02,
+	0x04, 0x03, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2FindBlockMonstersTablePC98Provider = { ARRAYSIZE(kEoB2FindBlockMonstersTablePC98), kEoB2FindBlockMonstersTablePC98 };
+
+static const byte kEoB2MonsterDirChangeTablePC98[48] = {
+	0xFF, 0x06, 0x02, 0xFF, 0x04, 0x05, 0x03, 0xFF,
+	0x00, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xDF, 0xFF, 0xE0, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF,
+	0x01, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00,
+	0xC0, 0xFF, 0xA0, 0xFF, 0x02, 0x00, 0x03, 0x00,
+	0x40, 0x00, 0x60, 0x00, 0xFE, 0xFF, 0xFD, 0xFF
+};
+
+static const ByteProvider kEoB2MonsterDirChangeTablePC98Provider = { ARRAYSIZE(kEoB2MonsterDirChangeTablePC98), kEoB2MonsterDirChangeTablePC98 };
+
+static const uint16 kEoB2EncodeMonsterDefsPC98[168] = {
+	0x0000, 0x0000, 0x0007, 0x0060, 0x0007, 0x0028, 0x000C, 0x0038,
+	0x0013, 0x0028, 0x000C, 0x0038, 0x001F, 0x0000, 0x0007, 0x0060,
+	0x0000, 0x0060, 0x0007, 0x0060, 0x0007, 0x0060, 0x0007, 0x0060,
+	0x000E, 0x0060, 0x0005, 0x0038, 0x0007, 0x0000, 0x0007, 0x0028,
+	0x000E, 0x0000, 0x0007, 0x0028, 0x0013, 0x0060, 0x0005, 0x0038,
+	0x0018, 0x0060, 0x0005, 0x0038, 0x001D, 0x0060, 0x0005, 0x0038,
+	0x000E, 0x0098, 0x0003, 0x0020, 0x0011, 0x00A0, 0x0004, 0x0018,
+	0x0015, 0x00A0, 0x0004, 0x0018, 0x0019, 0x0098, 0x0003, 0x0020,
+	0x001C, 0x0098, 0x0003, 0x0020, 0x001F, 0x0098, 0x0003, 0x0020,
+	0x0000, 0x0000, 0x0007, 0x0060, 0x0007, 0x0000, 0x0007, 0x0060,
+	0x000E, 0x0000, 0x0007, 0x0060, 0x0015, 0x0000, 0x0007, 0x0060,
+	0x001C, 0x0000, 0x0007, 0x0060, 0x0000, 0x0060, 0x0007, 0x0060,
+	0x0007, 0x0060, 0x0005, 0x0038, 0x000C, 0x0060, 0x0005, 0x0038,
+	0x0011, 0x0060, 0x0005, 0x0038, 0x0016, 0x0060, 0x0005, 0x0038,
+	0x001B, 0x0060, 0x0005, 0x0038, 0x0020, 0x0060, 0x0005, 0x0038,
+	0x0007, 0x0098, 0x0003, 0x0020, 0x000A, 0x0098, 0x0003, 0x0020,
+	0x000D, 0x0098, 0x0003, 0x0020, 0x0010, 0x0098, 0x0003, 0x0020,
+	0x0013, 0x0098, 0x0003, 0x0020, 0x0016, 0x0098, 0x0003, 0x0020,
+	0x0000, 0x0000, 0x000A, 0x0058, 0x000A, 0x0000, 0x000A, 0x0058,
+	0x0014, 0x0000, 0x000A, 0x0058, 0x001E, 0x0000, 0x000A, 0x0058,
+	0x0000, 0x0058, 0x000A, 0x0058, 0x000A, 0x0058, 0x000A, 0x0058
+};
+
+static const Uint16Provider kEoB2EncodeMonsterDefsPC98Provider = { ARRAYSIZE(kEoB2EncodeMonsterDefsPC98), kEoB2EncodeMonsterDefsPC98 };
+
+static const EoBCharacter kEoB2NpcPresetsPC98[6] = {
+	{ 0x00, 0x01,
+	  15, 15,  0,  0, 13, 13, 11, 11, 17, 17, 16, 16,  9,  9,
+	     3,   39, 10, 0, 10, 5, 5, -1, 8, { 6, 0, 0 },
+	  { 0x00006ADA, 0x00000000, 0x00000000 }, 0x00000000,
+	  { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000 } },
+	{ 0x00, 0x01,
+	  18, 18, 36, 36, 13, 13,  8,  8, 15, 15, 16, 16, 14, 14,
+	     4,   76, 10, 0, 1, 0, 2, -2, 12, { 9, 0, 0 },
+	  { 0x0003DF35, 0x00000000, 0x00000000 }, 0x00000000,
+	  { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000 } },
+	{ 0x00, 0x01,
+	  15, 15,  0,  0, 14, 14, 13, 13, 14, 14, 13, 13, 16, 16,
+	    40,   40, 10, 0, 6, 4, 3, -3, 100, { 8, 0, 0 },
+	  { 0x00021730, 0x00000000, 0x00000000 }, 0x00000000,
+	  { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000 } },
+	{ 0x00, 0x01,
+	  11, 11,  0,  0, 18, 18, 13, 13, 14, 14, 16, 16,  9,  9,
+	    28,   28, 10, 0, 2, 3, 5, -4, 100, { 8, 0, 0 },
+	  { 0x00017AF0, 0x00000000, 0x00000000 }, 0x096B4566,
+	  { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000 } },
+	{ 0x00, 0x01,
+	  16, 16,  0,  0, 13, 13, 16, 16, 15, 15, 11, 11, 12, 12,
+	    53,   53,  9, 0, 4, 6, 1, -5, 100, { 7, 7, 0 },
+	  { 0x00010FC2, 0x00010FC2, 0x00000000 }, 0xFFFFFFFF,
+	  { 0x0004, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000 } },
+	{ 0x00, 0x01,
+	  14, 14,  0,  0, 17, 17, 12, 12, 18, 18,  9,  9, 17, 17,
+	    36,   36, 10, 0, 3, 10, 1, -6, 100, { 7, 7, 0 },
+	  { 0x0000FAE6, 0x0000FAE6, 0x00000000 }, 0x00294566,
+	  { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	    0x0000, 0x0000, 0x0000 } }
+};
+
+static const EoBCharacterProvider kEoB2NpcPresetsPC98Provider = { ARRAYSIZE(kEoB2NpcPresetsPC98), kEoB2NpcPresetsPC98 };
+
+static const byte kEoB2DreamStepsPC98[14] = {
+	0x01, 0x02, 0x03, 0x02, 0x01, 0x00, 0x01, 0x02,
+	0x03, 0x03, 0x02, 0x01, 0x00, 0xFF
+};
+
+static const ByteProvider kEoB2DreamStepsPC98Provider = { ARRAYSIZE(kEoB2DreamStepsPC98), kEoB2DreamStepsPC98 };
+
+static const byte kEoB2HornSoundsPC98[4] = {
+	0x40, 0x41, 0x42, 0x43
+};
+
+static const ByteProvider kEoB2HornSoundsPC98Provider = { ARRAYSIZE(kEoB2HornSoundsPC98), kEoB2HornSoundsPC98 };
+
+static const uint16 kEoB2WallOfForceDsXPC98[18] = {
+	0xFFCC, 0xFFF4, 0x001C, 0x0044, 0x006C, 0x0094, 0x00BC, 0xFFB8,
+	0xFFF8, 0x0038, 0x0078, 0x00B8, 0xFFC8, 0x0028, 0x0088, 0x0000,
+	0x0000, 0x0000
+};
+
+static const Uint16Provider kEoB2WallOfForceDsXPC98Provider = { ARRAYSIZE(kEoB2WallOfForceDsXPC98), kEoB2WallOfForceDsXPC98 };
+
+static const byte kEoB2WallOfForceDsYPC98[3] = {
+	0x20, 0x18, 0x10
+};
+
+static const ByteProvider kEoB2WallOfForceDsYPC98Provider = { ARRAYSIZE(kEoB2WallOfForceDsYPC98), kEoB2WallOfForceDsYPC98 };
+
+static const byte kEoB2WallOfForceNumWPC98[3] = {
+	0x01, 0x02, 0x03
+};
+
+static const ByteProvider kEoB2WallOfForceNumWPC98Provider = { ARRAYSIZE(kEoB2WallOfForceNumWPC98), kEoB2WallOfForceNumWPC98 };
+
+static const byte kEoB2WallOfForceNumHPC98[3] = {
+	0x02, 0x06, 0x09
+};
+
+static const ByteProvider kEoB2WallOfForceNumHPC98Provider = { ARRAYSIZE(kEoB2WallOfForceNumHPC98), kEoB2WallOfForceNumHPC98 };
+
+static const byte kEoB2WallOfForceShpIdPC98[3] = {
+	0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2WallOfForceShpIdPC98Provider = { ARRAYSIZE(kEoB2WallOfForceShpIdPC98), kEoB2WallOfForceShpIdPC98 };
+
+static const byte kEoB2DscShapeIndexPC98[36] = {
+	0x01, 0x01, 0x04, 0x0A, 0x04, 0x08, 0x04, 0x01,
+	0x04, 0xF8, 0x04, 0xF6, 0x00, 0x00, 0x03, 0x09,
+	0x03, 0x07, 0x03, 0x01, 0x03, 0xF9, 0x03, 0xF7,
+	0x02, 0x06, 0x02, 0x01, 0x02, 0xFA, 0x01, 0x05,
+	0x01, 0x01, 0x01, 0xFB
+};
+
+static const ByteProvider kEoB2DscShapeIndexPC98Provider = { ARRAYSIZE(kEoB2DscShapeIndexPC98), kEoB2DscShapeIndexPC98 };
+
+static const uint16 kEoB2DscXPC98[18] = {
+	0xFF70, 0xFFA0, 0xFFD0, 0x0000, 0x0030, 0x0060, 0x0090, 0xFF60,
+	0xFFB0, 0x0000, 0x0050, 0x00A0, 0xFF80, 0x0000, 0x0080, 0x0000,
+	0x0000, 0x0000
+};
+
+static const Uint16Provider kEoB2DscXPC98Provider = { ARRAYSIZE(kEoB2DscXPC98), kEoB2DscXPC98 };
+
+static const byte kEoB2DscTileIndexPC98[18] = {
+	0x00, 0x06, 0x01, 0x05, 0x02, 0x04, 0x03, 0x07,
+	0x0B, 0x08, 0x0A, 0x09, 0x0C, 0x0E, 0x0D, 0x0F,
+	0x11, 0x10
+};
+
+static const ByteProvider kEoB2DscTileIndexPC98Provider = { ARRAYSIZE(kEoB2DscTileIndexPC98), kEoB2DscTileIndexPC98 };
+
+static const byte kEoB2DscDimData1PC98[324] = {
+	0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+	0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+	0xD8, 0xD7, 0xD8, 0xD8, 0x02, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xFE, 0xD7, 0xD8, 0xD8, 0xD8, 0xD7, 0x03,
+	0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xFE, 0xD8, 0x08,
+	0xD8, 0xD8, 0xD8, 0xFE, 0xD7, 0x06, 0xD8, 0xD8,
+	0xFA, 0x03, 0xD8, 0xFD, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFA, 0xD7,
+	0x10, 0xD8, 0xFD, 0xD7, 0x13, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xF2, 0xD8, 0x14, 0xD8, 0xD8,
+	0xD8, 0xF0, 0xD7, 0x14, 0xD8, 0xED, 0x10, 0xD8,
+	0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8, 0xEC, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0x14, 0xD8, 0xED,
+	0xD7, 0xD8, 0xD8, 0x13, 0xD7, 0xD7, 0xD7, 0xD7,
+	0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+	0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7, 0xD7, 0xD7,
+	0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+	0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0x06, 0xD8, 0xD8, 0xFA, 0x03, 0xD8, 0xFD,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xFA, 0xD8, 0x10, 0xD8, 0xFD, 0xD7,
+	0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xF0, 0xD8, 0xD8,
+	0xD8, 0xED, 0x10, 0xD8, 0xD8, 0x13, 0xD7, 0xD7,
+	0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
+	0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, 0xD7,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x03, 0xD8, 0xFD,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFD, 0xD8,
+	0x13, 0xFD, 0xD8, 0x13, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xED, 0xD8, 0xD8, 0xD8, 0x13, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
+	0xD8, 0xD8, 0xD8, 0xD8
+};
+
+static const ByteProvider kEoB2DscDimData1PC98Provider = { ARRAYSIZE(kEoB2DscDimData1PC98), kEoB2DscDimData1PC98 };
+
+static const byte kEoB2DscDimData2PC98[648] = {
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x00, 0x16, 0x16, 0x00, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x02, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x02, 0x16, 0x00, 0x04, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x03,
+	0x00, 0x16, 0x03, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x02, 0x16, 0x00, 0x16, 0x00, 0x08,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02,
+	0x16, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+	0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x00,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x08, 0x0E,
+	0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x06, 0x10,
+	0x00, 0x13, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x0E, 0x16,
+	0x00, 0x16, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x10, 0x16, 0x16, 0x00, 0x00, 0x14,
+	0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x14, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x12, 0x16, 0x14, 0x16, 0x00, 0x16, 0x13, 0x16,
+	0x16, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+	0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x00, 0x16,
+	0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x07, 0x0F,
+	0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x10, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x13, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+	0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x03, 0x16, 0x00, 0x16,
+	0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x13, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+	0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16
+};
+
+static const ByteProvider kEoB2DscDimData2PC98Provider = { ARRAYSIZE(kEoB2DscDimData2PC98), kEoB2DscDimData2PC98 };
+
+static const byte kEoB2DscBlockMapPC98[12] = {
+	0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+	0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kEoB2DscBlockMapPC98Provider = { ARRAYSIZE(kEoB2DscBlockMapPC98), kEoB2DscBlockMapPC98 };
+
+static const byte kEoB2DscDimMapPC98[18] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
+	0x03, 0x03
+};
+
+static const ByteProvider kEoB2DscDimMapPC98Provider = { ARRAYSIZE(kEoB2DscDimMapPC98), kEoB2DscDimMapPC98 };
+
+static const byte kEoB2DscBlockIndexPC98[72] = {
+	0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xBE,
+	0xBF, 0xC0, 0xC1, 0xC2, 0xDF, 0xE0, 0xE1, 0xFF,
+	0x00, 0x01, 0xA3, 0xC3, 0xE3, 0x03, 0x23, 0x43,
+	0x63, 0xC2, 0xE2, 0x02, 0x22, 0x42, 0xE1, 0x01,
+	0x21, 0xE0, 0x00, 0x20, 0x63, 0x62, 0x61, 0x60,
+	0x5F, 0x5E, 0x5D, 0x42, 0x41, 0x40, 0x3F, 0x3E,
+	0x21, 0x20, 0x1F, 0x01, 0x00, 0xFF, 0x5D, 0x3D,
+	0x1D, 0xFD, 0xDD, 0xBD, 0x9D, 0x3E, 0x1E, 0xFE,
+	0xDE, 0xBE, 0x1F, 0xFF, 0xDF, 0x20, 0x00, 0xE0
+};
+
+static const ByteProvider kEoB2DscBlockIndexPC98Provider = { ARRAYSIZE(kEoB2DscBlockIndexPC98), kEoB2DscBlockIndexPC98 };
+
+static const char *const kEoB2Ascii2SjisTablesPC98[4] = {
+	"\x81""@""\x81""I""\x81""h""\x81\x94\x81\x90\x81\x93\x81\x95\x81""f""\x81""i""\x81""j""\x81\x96\x81""{""\x81""C""\x81""|""\x81""D""\x81""^""\x82""O""\x82""P""\x82""Q""\x82""R""\x82""S""\x82""T""\x82""U""\x82""V""\x82""W""\x82""X""\x81""F""\x81""G""\x81\x83\x81\x81\x81\x84\x81""H""\x81\x97\x82""`""\x82""a""\x82""b""\x82""c""\x82""d""\x82""e""\x82""f""\x82""g""\x82""h""\x82""i""\x82""j""\x82""k""\x82""l""\x82""m""\x82""n""\x82""o""\x82""p""\x82""q""\x82""r""\x82""s""\x82""t""\x82""u""\x82""v""\x82""w""\x82""x""\x82""y""\x81""m""\x81\x8f\x81""n""\x81""O""\x81""Q""\x81""M""\x82\x81\x82\x82\x82\x83\x82\x84\x82\x85\x82\x86\x82\x87\x82\x88\x82\x89\x82\x8a\x82\x8b\x82\x8c\x82\x8d\x82\x8e\x82\x8f\x82\x90\x82\x91\x82\x92\x82\x93\x82\x94\x82\x95\x82\x96\x82\x97\x82\x98\x82\x99\x82\x9a\x81""o""\x81""b""\x81""p""\x81""P""\x81""A""\x81""B""\x81""E""\x81""[",
+	"\x83""n""\x83""q""\x83""t""\x83""w""\x83""z",
+	"\x83""J""\x83""L""\x83""N""\x83""P""\x83""R""\x83""T""\x83""V""\x83""X""\x83""Z""\x83""\\""\x83""^""\x83""`""\x83""c""\x83""e""\x83""g""\x83""n""\x83""q""\x83""t""\x83""w""\x83""z",
+	"\x83\x92\x83""@""\x83""B""\x83""D""\x83""F""\x83""H""\x83\x83\x83\x85\x83\x87\x83""b""\x81""[""\x83""A""\x83""C""\x83""E""\x83""G""\x83""I""\x83""J""\x83""L""\x83""N""\x83""P""\x83""R""\x83""T""\x83""V""\x83""X""\x83""Z""\x83""\\""\x83""^""\x83""`""\x83""c""\x83""e""\x83""g""\x83""i""\x83""j""\x83""k""\x83""l""\x83""m""\x83""n""\x83""q""\x83""t""\x83""w""\x83""z""\x83""}""\x83""~""\x83\x80\x83\x81\x83\x82\x83\x84\x83\x86\x83\x88\x83\x89\x83\x8a\x83\x8b\x83\x8c\x83\x8d\x83\x8f\x83\x93",
+};
+
+static const StringListProvider kEoB2Ascii2SjisTablesPC98Provider = { ARRAYSIZE(kEoB2Ascii2SjisTablesPC98), kEoB2Ascii2SjisTablesPC98 };
+
+static const char *const kEoB2Ascii2SjisTables2PC98[2] = {
+	"\x81""@""\x81""I""\x81""h""\x81\x94\x81\x90\x81\x93\x81\x95\x81""f""\x81""i""\x81""j""\x81\x96\x81""{""\x81""C""\x81""|""\x81""D""\x81""^""\x82""O""\x82""P""\x82""Q""\x82""R""\x82""S""\x82""T""\x82""U""\x82""V""\x82""W""\x82""X""\x81""F""\x81""G""\x81\x83\x81\x81\x81\x84\x81""H""\x81\x97\x82""`""\x82""a""\x82""b""\x82""c""\x82""d""\x82""e""\x82""f""\x82""g""\x82""h""\x82""i""\x82""j""\x82""k""\x82""l""\x82""m""\x82""n""\x82""o""\x82""p""\x82""q""\x82""r""\x82""s""\x82""t""\x82""u""\x82""v""\x82""w""\x82""x""\x82""y""\x81""m""\x81\x8f\x81""n""\x81""O""\x81""Q""\x81""M""\x82\x81\x82\x82\x82\x83\x82\x84\x82\x85\x82\x86\x82\x87\x82\x88\x82\x89\x82\x8a\x82\x8b\x82\x8c\x82\x8d\x82\x8e\x82\x8f\x82\x90\x82\x91\x82\x92\x82\x93\x82\x94\x82\x95\x82\x96\x82\x97\x82\x98\x82\x99\x82\x9a\x81""o""\x81""b""\x81""p""\x81""P",
+	"\x81""A""\x81""B""\x81""E""\x81""["
+};
+
+static const StringListProvider kEoB2Ascii2SjisTables2PC98Provider = { ARRAYSIZE(kEoB2Ascii2SjisTables2PC98), kEoB2Ascii2SjisTables2PC98 };
+
+static const byte kEoB2FontConvertTblPC98[109] = {
+	0x20, 0xd4, 0xd5, 0x2c, 0x2e, 0xd6, 0x3a, 0x3b,
+	0x3f, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e,
+	0x7e, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x2f, 0x00,
+	0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x27, 0x00,
+	0x22, 0x28, 0x29, 0x00, 0x00, 0x5b, 0x5d, 0x7b,
+	0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x2b, 0x2d, 0x00, 0x00, 0x00,
+	0x00, 0x3d, 0x00, 0x3c, 0x3e, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c,
+	0x24, 0x00, 0x00, 0x25, 0x23, 0x26, 0x2a, 0x40,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2FontConvertTblPC98Provider = { ARRAYSIZE(kEoB2FontConvertTblPC98), kEoB2FontConvertTblPC98 };
+
+static const char *const kEoB2SoundFilesIntroPC98[1] = {
+	"INTRO"
+};
+
+static const StringListProvider kEoB2SoundFilesIntroPC98Provider = { ARRAYSIZE(kEoB2SoundFilesIntroPC98), kEoB2SoundFilesIntroPC98 };
+
+static const char *const kEoB2SoundFilesFinalePC98[2] = {
+	"FINALE1",
+	"FINALE2"
+};
+
+static const StringListProvider kEoB2SoundFilesFinalePC98Provider = { ARRAYSIZE(kEoB2SoundFilesFinalePC98), kEoB2SoundFilesFinalePC98 };
diff --git a/devtools/create_kyradat/resources/eob2_pc98_japanese.h b/devtools/create_kyradat/resources/eob2_pc98_japanese.h
new file mode 100644
index 00000000000..a15bdbf1bc0
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob2_pc98_japanese.h
@@ -0,0 +1,971 @@
+static const char *const kEoB2ChargenStrings1PC98Japanese[9] = {
+	"\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcc\x83\x81\x83\x93\x83""o""\x81""[""\x82\xaa\x91""S""\x88\xf5""\r""\x91\xb5\x82\xa2\x82\xdc\x82\xb5\x82\xbd\x81""B""\x82""o""\x82""k""\x82""`""\x82""x""\x83""{""\x83""^""\x83\x93""\r""\x82\xa9\x81""A""\x83""L""\x81""[""\x83""{""\x81""[""\x83""h""\x82\xcc\x82""o""\x83""L""\x81""[""\x82\xf0""\r""\x89\x9f\x82\xb7\x82\xc6\x83""Q""\x81""[""\x83\x80\x82\xaa\x8e""n""\x82\xdc\x82\xe8\x82\xdc\x82\xb7\x81""B",
+	"          ",
+	"AC\rHP\rLVL",
+	"%s\r%d\r%d\r%d\r%d\r%d",
+	"%d\r%d",
+	"%d",
+	"%d/%d",
+	"%d/%d/%d",
+	"\x83""L""\x83\x83\x83\x89\x83""N""\x83""^""\x81""[""\x82\xf0\x8d\xec\x82\xe9\x82\xbd\x82\xdf\x82\xcc""\r""\x83""{""\x83""b""\x83""N""\x83""X""\x82\xf0\x8e""w""\x92\xe8\x82\xb5\x82\xc4\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B"
+};
+
+static const StringListProvider kEoB2ChargenStrings1PC98JapaneseProvider = { ARRAYSIZE(kEoB2ChargenStrings1PC98Japanese), kEoB2ChargenStrings1PC98Japanese };
+
+static const char *const kEoB2ChargenStrings2PC98Japanese[12] = {
+	"%s",
+	"%d",
+	"%s",
+	"%d",
+	"%d",
+	"%d",
+	"%s",
+	"%d",
+	"SELECT RACE:",
+	"SELECT CLASS:",
+	"SELECT ALIGNMENT:",
+	"\x96\xbc\x91""O""\x81""F"
+};
+
+static const StringListProvider kEoB2ChargenStrings2PC98JapaneseProvider = { ARRAYSIZE(kEoB2ChargenStrings2PC98Japanese), kEoB2ChargenStrings2PC98Japanese };
+
+static const char *const kEoB2ChargenStatStringsPC98Japanese[12] = {
+	"STR",
+	"INT",
+	"WIS",
+	"DEX",
+	"CON",
+	"CHA",
+	"STR",
+	"INT",
+	"WIS",
+	"DEX",
+	"CON",
+	"CHA"
+};
+
+static const StringListProvider kEoB2ChargenStatStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ChargenStatStringsPC98Japanese), kEoB2ChargenStatStringsPC98Japanese };
+
+static const char *const kEoB2ChargenRaceSexStringsPC98Japanese[12] = {
+	"HUMAN MALE",
+	"HUMAN FEMALE",
+	"ELF MALE",
+	"ELF FEMALE",
+	"HALF-ELF MALE",
+	"HALF-ELF FEMALE",
+	"DWARF MALE",
+	"DWARF FEMALE",
+	"GNOME MALE",
+	"GNOME FEMALE",
+	"HALFLING MALE",
+	"HALFLING FEMALE"
+};
+
+static const StringListProvider kEoB2ChargenRaceSexStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ChargenRaceSexStringsPC98Japanese), kEoB2ChargenRaceSexStringsPC98Japanese };
+
+static const char *const kEoB2ChargenClassStringsPC98Japanese[21] = {
+	"FIGHTER",
+	"RANGER",
+	"PALADIN",
+	"MAGE",
+	"CLERIC",
+	"THIEF",
+	"FIGHTER/CLERIC",
+	"FIGHTER/THIEF",
+	"FIGHTER/MAGE",
+	"FIGHTER/MAGE/THIEF",
+	"THIEF/MAGE",
+	"CLERIC/THIEF",
+	"FIGHTER/CLERIC/MAGE",
+	"RANGER/CLERIC",
+	"CLERIC/MAGE",
+	"FIGHTER",
+	"MAGE",
+	"CLERIC",
+	"THIEF",
+	"PALADIN",
+	"RANGER"
+};
+
+static const StringListProvider kEoB2ChargenClassStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ChargenClassStringsPC98Japanese), kEoB2ChargenClassStringsPC98Japanese };
+
+static const char *const kEoB2ChargenAlignmentStringsPC98Japanese[9] = {
+	"LAWFUL GOOD",
+	"NEUTRAL GOOD",
+	"CHAOTIC GOOD",
+	"LAWFUL NEUTRAL",
+	"TRUE NEUTRAL",
+	"CHAOTIC NEUTRAL",
+	"LAWFUL EVIL",
+	"NEUTRAL EVIL",
+	"CHAOTIC EVIL"
+};
+
+static const StringListProvider kEoB2ChargenAlignmentStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ChargenAlignmentStringsPC98Japanese), kEoB2ChargenAlignmentStringsPC98Japanese };
+
+static const char *const kEoB2ChargenEnterGameStringsPC98Japanese[1] = {
+	"\x83""Q""\x81""[""\x83\x80\x82\xf0\x8e""n""\x82\xdf\x82\xdc\x82\xb7\x81""B""\r""\x8f\xad\x81""X""\x82\xa8\x91\xd2\x82\xbf\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B"
+};
+
+static const StringListProvider kEoB2ChargenEnterGameStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ChargenEnterGameStringsPC98Japanese), kEoB2ChargenEnterGameStringsPC98Japanese };
+
+static const char *const kEoB2PryDoorStringsPC98Japanese[8] = {
+	"\r",
+	"\x97\xcd\x82\xb8\x82\xad\x82\xc5\x83""h""\x83""A""\x82\xf0\x8a""J""\x82\xaf\x82\xe9\x82\xb1\x82\xc6\x82\xcd\x82\xc5\x82\xab\x82\xbb\x82\xa4\x82\xc9\x82\xc8\x82\xa2\x81""B\r",
+	"\x06\x04\x83""h""\x83""A""\x82\xf0\x82\xb1\x82\xb6\x8a""J""\x82\xaf\x82\xbd\x81""B\r",
+	"\x06\x06\x83""h""\x83""A""\x82\xf0\x97\xcd\x82\xb8\x82\xad\x82\xc5\x8a""J""\x82\xaf\x82\xe6\x82\xa4\x82\xc6\x82\xb5\x82\xbd\x82\xaa\x8e\xb8\x94""s""\x82\xb5\x82\xbd\x81""B\r",
+	"\x83""A""\x83""C""\x83""e""\x83\x80\x82\xf0\x82\xbb\x82\xb1\x82\xc9\x92""u""\x82\xad\x82\xb1\x82\xc6\x82\xcd\x82\xc5\x82\xab\x82\xc8\x82\xa2\x81""B\r",
+	"\x82\xbb\x82\xcc\x83""A""\x83""C""\x83""e""\x83\x80\x82\xcd\x91\xe5\x82\xab\x82\xb7\x82\xac\x82\xc4\x93\xfc\x82\xe7\x82\xc8\x82\xa2\x81""B\r",
+	"\x92""N""\x82\xe0\x83""h""\x83""A""\x82\xf0\x82\xb1\x82\xb6\x8a""J""\x82\xaf\x82\xe9\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xc8\x82\xa2\x81""B\r",
+	"\r"
+};
+
+static const StringListProvider kEoB2PryDoorStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2PryDoorStringsPC98Japanese), kEoB2PryDoorStringsPC98Japanese };
+
+static const char *const kEoB2WarningStringsPC98Japanese[4] = {
+	"\x82\xbb\x82\xbf\x82\xe7\x82\xd6\x82\xcd\x8d""s""\x82\xaf\x82\xc8\x82\xa2\x81""B\r",
+	"%s""\x82\xcd\x95\xa8\x82\xf0\x90""H""\x82\xd7\x82\xe7\x82\xea\x82\xe9\x8f\xf3\x91\xd4\x82\xc5\x82\xcd\x82\xc8\x82\xa2\x81""I\r",
+	"\x82\xbb\x82\xcc\x90""H""\x97\xbf\x82\xcd\x95\x85\x82\xc1\x82\xc4\x82\xa2\x82\xe9\x81""I""\x90""H""\x82\xd7\x82\xe9\x8b""C""\x82\xaa\x82\xb5\x82\xc8\x82\xa2\x81""B\r",
+	"\x90""H""\x82\xd7\x95\xa8\x88\xc8\x8a""O""\x82\xcd\x90""H""\x82\xd7\x82\xe7\x82\xea\x82\xc8\x82\xa2\x81""I\r"
+};
+
+static const StringListProvider kEoB2WarningStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2WarningStringsPC98Japanese), kEoB2WarningStringsPC98Japanese };
+
+static const char *const kEoB2ItemSuffixStringsRingsPC98Japanese[4] = {
+	"\x83""A""\x83""h""\x81""[""\x83\x93\x83\x81\x83\x93\x83""g",
+	"\x83""E""\x83""B""\x83""U""\x81""[""\x83""h""\x83\x8a\x81""[",
+	"\x83""T""\x83""X""\x83""e""\x83""B""\x83""i""\x83\x93\x83""X",
+	"\x83""t""\x83""F""\x83""U""\x81""[""\x83""t""\x83""H""\x81""[""\x83\x8b"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsRingsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsRingsPC98Japanese), kEoB2ItemSuffixStringsRingsPC98Japanese };
+
+static const char *const kEoB2ItemSuffixStringsPotionsPC98Japanese[8] = {
+	"\x83""W""\x83\x83\x83""C""\x83""A""\x83\x93\x83""g""\x81""E""\x83""X""\x83""g""\x83\x8c\x83\x93\x83""O""\x83""X",
+	"\x83""q""\x81""[""\x83\x8a\x83\x93\x83""O",
+	"\x83""G""\x83""L""\x83""X""\x83""g""\x83\x89\x81""E""\x83""q""\x81""[""\x83\x8a\x83\x93\x83""O",
+	"\x83""|""\x83""C""\x83""Y""\x83\x93",
+	"\x83""o""\x83""C""\x83""^""\x83\x8a\x83""e""\x83""B",
+	"\x83""X""\x83""s""\x81""[""\x83""h",
+	"\x83""C""\x83\x93\x83""r""\x83""W""\x83""r""\x83\x8a\x83""e""\x83""B",
+	"\x83""L""\x83\x85\x83""A""\x81""E""\x83""|""\x83""C""\x83""Y""\x83\x93"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsPotionsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsPotionsPC98Japanese), kEoB2ItemSuffixStringsPotionsPC98Japanese };
+
+static const char *const kEoB2ItemSuffixStringsWandsPC98Japanese[8] = {
+	" Stick ",
+	" Lightning ",
+	" Frost ",
+	" Curing ",
+	" Fireball ",
+	" Starfire ",
+	" Magic Missile ",
+	" Dispel Magic "
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsWandsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsWandsPC98Japanese), kEoB2ItemSuffixStringsWandsPC98Japanese };
+
+static const char *const kEoB2RipItemStringsPC98Japanese[3] = {
+	"%s""\x82\xcc",
+	"%s""\x82\xcc",
+	"\x82\xcd\x96\xb3\x82\xad\x82\xc8\x82\xc1\x82\xbd""\r"
+};
+
+static const StringListProvider kEoB2RipItemStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2RipItemStringsPC98Japanese), kEoB2RipItemStringsPC98Japanese };
+
+static const char *const kEoB2CursedStringPC98Japanese[1] = {
+	"%d""\x82\xcc\x8e\xf4\x82\xed\x82\xea\x82\xbd""%s"
+};
+
+static const StringListProvider kEoB2CursedStringPC98JapaneseProvider = { ARRAYSIZE(kEoB2CursedStringPC98Japanese), kEoB2CursedStringPC98Japanese };
+
+static const char *const kEoB2MagicObjectStringsPC98Japanese[5] = {
+	"\x83\x81\x83""C""\x83""W""\x83""X""\x83""N""\x83\x8d\x81""[""\x83\x8b",
+	"\x83""N""\x83\x8c\x83\x8a\x83""b""\x83""N""\x83""X""\x83""N""\x83\x8d\x81""[""\x83\x8b",
+	"\x83\x8a\x83\x93\x83""O",
+	"\x83""|""\x81""[""\x83""V""\x83\x87\x83\x93",
+	"\x83\x8f\x83\x93\x83""h"
+};
+
+static const StringListProvider kEoB2MagicObjectStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicObjectStringsPC98Japanese), kEoB2MagicObjectStringsPC98Japanese };
+
+static const char *const kEoB2MagicObjectString5PC98Japanese[1] = {
+	"Stick"
+};
+
+static const StringListProvider kEoB2MagicObjectString5PC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicObjectString5PC98Japanese), kEoB2MagicObjectString5PC98Japanese };
+
+static const char *const kEoB2PatternSuffixPC98Japanese[1] = {
+	"%s""\x82\xcc""%s"
+};
+
+static const StringListProvider kEoB2PatternSuffixPC98JapaneseProvider = { ARRAYSIZE(kEoB2PatternSuffixPC98Japanese), kEoB2PatternSuffixPC98Japanese };
+
+static const char *const kEoB2PatternGrFix1PC98Japanese[1] = {
+	"%s""\x82\xcc""%s"
+};
+
+static const StringListProvider kEoB2PatternGrFix1PC98JapaneseProvider = { ARRAYSIZE(kEoB2PatternGrFix1PC98Japanese), kEoB2PatternGrFix1PC98Japanese };
+
+static const char *const kEoB2PatternGrFix2PC98Japanese[1] = {
+	"%s""\x82\xcc""%s"
+};
+
+static const StringListProvider kEoB2PatternGrFix2PC98JapaneseProvider = { ARRAYSIZE(kEoB2PatternGrFix2PC98Japanese), kEoB2PatternGrFix2PC98Japanese };
+
+static const char *const kEoB2ValidateArmorStringPC98Japanese[1] = {
+	"%s""\x82\xcd\x82\xbb\x82\xcc\x83""^""\x83""C""\x83""v""\x82\xcc\x96""h""\x8b\xef\x82\xf0\x90""g""\x82\xc9\x82\xc2\x82\xaf\x82\xe7\x82\xea\x82\xc8\x82\xa2\x81""B\r"
+};
+
+static const StringListProvider kEoB2ValidateArmorStringPC98JapaneseProvider = { ARRAYSIZE(kEoB2ValidateArmorStringPC98Japanese), kEoB2ValidateArmorStringPC98Japanese };
+
+static const char *const kEoB2ValidateCursedStringPC98Japanese[1] = {
+	"%s""\x82\xcd\x95\x90\x8a\xed\x82\xf0\x8a""O""\x82\xb7\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xc8\x82\xa2\x81""I""\x82\xbb\x82\xcc\x95\x90\x8a\xed\x82\xcd\x8e\xf4\x82\xed\x82\xea\x82\xc4\x82\xa2\x82\xe9\x81""I\r"
+};
+
+static const StringListProvider kEoB2ValidateCursedStringPC98JapaneseProvider = { ARRAYSIZE(kEoB2ValidateCursedStringPC98Japanese), kEoB2ValidateCursedStringPC98Japanese };
+
+static const char *const kEoB2ValidateNoDropStringPC98Japanese[1] = {
+	"\x82\xbb\x82\xcc\x83""A""\x83""C""\x83""e""\x83\x80\x82\xcd\x82\xb1\x82\xb1\x82\xc9\x92""u""\x82\xaf\x82\xc8\x82\xa2\x81""B\r"
+};
+
+static const StringListProvider kEoB2ValidateNoDropStringPC98JapaneseProvider = { ARRAYSIZE(kEoB2ValidateNoDropStringPC98Japanese), kEoB2ValidateNoDropStringPC98Japanese };
+
+static const char *const kEoB2PotionStringsPC98Japanese[2] = {
+	"\x93\xC5\x82\xF0\x8E\xF3\x82\xAF\x82\xBD",
+	"%s""\x82\xcd""%s""\x81""I\r"
+};
+
+static const StringListProvider kEoB2PotionStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2PotionStringsPC98Japanese), kEoB2PotionStringsPC98Japanese };
+
+static const char *const kEoB2WandStringsPC98Japanese[1] = {
+	"\x82\xbb\x82\xcc\x83\x8f\x83\x93\x83""h""\x82\xc9\x82\xcd\x96\x82\x97\xcd\x82\xaa\x8e""c""\x82\xc1\x82\xc4\x82\xa2\x82\xc8\x82\xa2\x81""B\r"
+};
+
+static const StringListProvider kEoB2WandStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2WandStringsPC98Japanese), kEoB2WandStringsPC98Japanese };
+
+static const char *const kEoB2ItemMisuseStringsPC98Japanese[3] = {
+	"\x82\xcd\x82\xbb\x82\xcc\x83""A""\x83""C""\x83""e""\x83\x80\x82\xf0\x8e""g""\x82\xa6\x82\xc8\x82\xa2\x81""B\r",
+	"\x82\xb1\x82\xcc\x83""A""\x83""C""\x83""e""\x83\x80\x82\xcd\x90""g""\x82\xc9\x82\xc2\x82\xaf\x82\xc4\x82\xa2\x82\xea\x82\xce\x8e\xa9\x93\xae\x93""I""\x82\xc9\x8c\xf8\x89\xca\x82\xf0\x94\xad\x8a\xf6\x82\xb7\x82\xe9\x81""B\r",
+	"\x83""A""\x83""C""\x83""e""\x83\x80\x82\xcc\x8e""g""\x82\xa2\x95\xfb\x82\xaa\x8a\xd4\x88\xe1\x82\xc1\x82\xc4\x82\xa2\x82\xe9\x81""B\r"
+};
+
+static const StringListProvider kEoB2ItemMisuseStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2ItemMisuseStringsPC98Japanese), kEoB2ItemMisuseStringsPC98Japanese };
+
+static const char *const kEoB2TakenStringsPC98Japanese[1] = {
+	"\x82\xf0\x8e\xe6\x82\xc1\x82\xbd\x81""B\r"
+};
+
+static const StringListProvider kEoB2TakenStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2TakenStringsPC98Japanese), kEoB2TakenStringsPC98Japanese };
+
+static const char *const kEoB2PotionEffectStringsPC98Japanese[8] = {
+	"\x97\xcd\x82\xaa\x82\xdd\x82\xc8\x82\xac\x82\xc1\x82\xc4\x82\xab\x82\xbd",
+	"\x8b""C""\x95\xaa\x82\xaa\x82\xe6\x82\xad\x82\xc8\x82\xc1\x82\xbd",
+	"\x8b""C""\x95\xaa\x82\xaa\x82\xa9\x82\xc8\x82\xe8\x82\xe6\x82\xad\x82\xc8\x82\xc1\x82\xbd",
+	"\x8b""C""\x95\xaa\x82\xaa\x88\xab\x82\xad\x82\xc8\x82\xc1\x82\xbd",
+	"\x8b\xf3\x95\xa0\x82\xc5\x82\xc8\x82\xad\x82\xc8\x82\xc1\x82\xbd",
+	"\x91""f""\x91\x81\x82\xb3\x82\xaa\x91\x9d\x82\xb5\x82\xbd",
+	"\x91\xcc\x82\xaa\x93\xa7\x96\xbe\x82\xc9\x82\xc8\x82\xc1\x82\xbd",
+	"\x8b""C""\x95\xaa\x82\xaa\x82\xe6\x82\xad\x82\xc8\x82\xc1\x82\xbd"
+};
+
+static const StringListProvider kEoB2PotionEffectStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2PotionEffectStringsPC98Japanese), kEoB2PotionEffectStringsPC98Japanese };
+
+static const char *const kEoB2YesNoStringsPC98Japanese[2] = {
+	" ""\x82\xcd\x82\xa2"" ",
+	"\x82\xa2\x82\xa2\x82\xa6"
+};
+
+static const StringListProvider kEoB2YesNoStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2YesNoStringsPC98Japanese), kEoB2YesNoStringsPC98Japanese };
+
+static const char *const kEoB2MoreStringsPC98Japanese[1] = {
+	"\x82""l""\x82""n""\x82""q""\x82""d"
+};
+
+static const StringListProvider kEoB2MoreStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2MoreStringsPC98Japanese), kEoB2MoreStringsPC98Japanese };
+
+static const char *const kEoB2NpcMaxStringsPC98Japanese[1] = {
+		"\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcc\x95\xd2\x90\xac\x82\xcd\x82""U""\x90""l""\x82\xdc\x82\xc5\x82\xc5\x82\xb7\x81""B""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xa9\x82\xe7\x8a""O""\x82\xb7\x90""l""\x82\xf0\x82""P""\x90""l""\x91""I""\x82\xf1\x82\xc5\x89\xba\x82\xb3\x82\xa2\x81""B"
+};
+
+static const StringListProvider kEoB2NpcMaxStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2NpcMaxStringsPC98Japanese), kEoB2NpcMaxStringsPC98Japanese };
+
+static const char *const kEoB2OkStringsPC98Japanese[1] = {
+	"\x82""n""\x82""j"
+};
+
+static const StringListProvider kEoB2OkStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2OkStringsPC98Japanese), kEoB2OkStringsPC98Japanese };
+
+static const char *const kEoB2NpcJoinStringsPC98Japanese[1] = {
+	"%s""\x82\xaa\x83""p""\x81""[""\x83""e""\x83""B""\x82\xc9\x89\xc1\x82\xed\x82\xc1\x82\xbd\x81""B\r"
+};
+
+static const StringListProvider kEoB2NpcJoinStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2NpcJoinStringsPC98Japanese), kEoB2NpcJoinStringsPC98Japanese };
+
+static const char *const kEoB2CancelStringsPC98Japanese[1] = {
+	"\x82""b""\x82""`""\x82""m""\x82""b""\x82""d""\x82""k"
+};
+
+static const StringListProvider kEoB2CancelStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2CancelStringsPC98Japanese), kEoB2CancelStringsPC98Japanese };
+
+static const char *const kEoB2AbortStringsPC98Japanese[1] = {
+	"\x92\x86\x8e""~"
+};
+
+static const StringListProvider kEoB2AbortStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2AbortStringsPC98Japanese), kEoB2AbortStringsPC98Japanese };
+
+static const char *const kEoB2MenuStringsMainPC98Japanese[8] = {
+	"\x81""@""\x83""I""\x83""v""\x83""V""\x83\x87\x83\x93\x91""I""\x91\xf0"":",
+	"\x8b""x""\x91\xa7\x82\xb7\x82\xe9",
+	"\x8e\xf4\x95\xb6\x82\xf0\x8b""L""\x89\xaf\x82\xb7\x82\xe9",
+	"\x8b""F""\x82\xe8\x82\xf0\x95\xf9\x82\xb0\x82\xe9",
+	"\x83""X""\x83""N""\x83\x8d\x81""[""\x83\x8b\x82\xf0\x8f\x91\x82\xab\x8e\xca\x82\xb7",
+	"\x8a\xc2\x8b\xab\x90\xdd\x92\xe8",
+	"\x83""I""\x83""v""\x83""V""\x83\x87\x83\x93",
+	"\x82""d""\x82""w""\x82""h""\x82""s"
+};
+
+static const StringListProvider kEoB2MenuStringsMainPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsMainPC98Japanese), kEoB2MenuStringsMainPC98Japanese };
+
+static const char *const kEoB2MenuStringsSaveLoadPC98Japanese[8] = {
+	"\x83""Q""\x81""[""\x83\x80\x83\x8d\x81""[""\x83""h",
+	"\x83""Q""\x81""[""\x83\x80\x83""Z""\x81""[""\x83""u",
+	"\x83""L""\x83\x83\x83\x89\x83""N""\x83""^""\x82\xf0\x8a""O""\x82\xb7",
+	"\x83""Q""\x81""[""\x83\x80\x82\xf0\x8f""I""\x97\xb9\x82\xb7\x82\xe9",
+	"\x81""@""\x83""I""\x83""v""\x83""V""\x83\x87\x83\x93"":",
+	"\r\r""\x81""@""\x81""@""\x81""@""\x81""@""\x83""Z""\x81""[""\x83""u""\x8f""I""\x97\xb9",
+	"\r""\x81""@""\x83""f""\x81""[""\x83""^""\x82\xcc\x83""Z""\x81""[""\x83""u""\x82\xc9\x8e\xb8\x94""s""\x82\xb5\x82\xdc\x82\xb5\x82\xbd\x81""I",
+	"\r""\x81""@""\x83""Z""\x81""[""\x83""u""\x83""f""\x81""[""\x83""^""\x82\xaa\x93\xc7\x82\xdd\x8d\x9e\x82\xdf\x82\xdc\x82\xb9\x82\xf1\x81""B\r""\x81""@""\x83""t""\x83""@""\x83""C""\x83\x8b\x82\xaa\x89\xf3\x82\xea\x82\xc4\x82\xa2\x82\xdc\x82\xb7\x81""I"
+};
+
+static const StringListProvider kEoB2MenuStringsSaveLoadPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsSaveLoadPC98Japanese), kEoB2MenuStringsSaveLoadPC98Japanese };
+
+static const char *const kEoB2MenuStringsOnOffPC98Japanese[2] = {
+	"\x82""n""\x82""m",
+	"\x82""n""\x82""e""\x82""e"
+};
+
+static const StringListProvider kEoB2MenuStringsOnOffPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsOnOffPC98Japanese), kEoB2MenuStringsOnOffPC98Japanese };
+
+static const char *const kEoB2MenuStringsSpellsPC98Japanese[17] = {
+	"\r\r  ""\x8e\xf4\x95\xb6\x82\xf0\x8b""L""\x89\xaf\x82\xb3\x82\xb9\x82\xbd\x82\xa2\x83""L""\x83\x83\x83\x89\x83""N""\x83""^""\x81""[""\x82\xf0""\r  ""\x91""I""\x82\xf1\x82\xc5\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B",
+	"\r  ""\x82\xbb\x82\xcc\x83""p""\x83\x89\x83""f""\x83""B""\x83\x93\x82\xcd\x83\x8c\x83""x""\x83\x8b\x82\xaa\x92\xe1\x82\xb7\x82\xac\x82\xc4\x8e\xf4\x95\xb6""\r  ""\x82\xf0\x8a""o""\x82\xa6\x82\xe9\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xc8\x82\xa2\x81""B",
+	"\r  ""\x82\xbb\x82\xcc\x83\x81\x83""C""\x83""W""\x82\xcd\x83""X""\x83""y""\x83\x8b\x83""u""\x83""b""\x83""N""\x82\xf0\x8e\x9d\x82\xc1\x82\xc4\x82\xa2\x82\xc8""\r""\x81""@""\x82\xa2\x81""I",
+	"\r\r\r  ""\x8e\xf4\x95\xb6\x82\xcc\x82\xbd\x82\xdf\x82\xc9\x8b""F""\x82\xe8\x82\xf0\x95\xf9\x82\xb0\x82\xe9\x83""L""\x83\x83\x83\x89\x83""N""\x83""^""\x81""[\r  ""\x82\xf0\x91""I""\x82\xf1\x82\xc5\x89\xba\x82\xb3\x82\xa2\x81""B",
+	"\r  ""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcc\x92\x86\x82\xc9\x8b""F""\x82\xe8\x82\xf0\x95\xf9\x82\xb0\x82\xe7\x82\xea\x82\xe9\x83""L""\x83\x83\x83\x89""\r""\x81""@""\x83""N""\x83""^""\x81""[""\x82\xaa\x82\xa2\x82\xc8\x82\xa2\x81""B",
+	"\r  ""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcc\x92\x86\x82\xc9\x82\xcd\x90""V""\x82\xb5\x82\xa2\x8e\xf4\x95\xb6\x82\xf0\x8a""o""\x82\xa6\x82\xe9\x82\xb1""\r""\x81""@""\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xe9\x8e\xd2\x82\xaa\x82\xa2\x82\xc8\x82\xa2\x81""B",
+	"\r  ""\x8b""C""\x90\xe2\x82\xdc\x82\xbd\x82\xcd\x8e\x80\x82\xf1\x82\xbe\x83\x81\x83""C""\x83""W""\x82\xcd\x8e\xf4\x95\xb6\x82\xf0\x8b""L""\x89\xaf""\r  ""\x82\xb7\x82\xe9\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xc8\x82\xa2\x81""B",
+	"\r  ""\x8b""C""\x90\xe2\x82\xdc\x82\xbd\x82\xcd\x8e\x80\x82\xf1\x82\xbe\x83""N""\x83\x8c\x83\x8a\x83""b""\x83""N""\x82\xcd\x8b""F""\x82\xe8\x82\xf0""\r  ""\x95\xf9\x82\xb0\x82\xe9\x82\xb1\x82\xc6\x82\xcd\x82\xc5\x82\xab\x82\xc8\x82\xa2\x81""B",
+	"\x82""P",
+	"\x82""Q",
+	"\x82""R",
+	"\x82""S",
+	"\x82""T",
+	"\x83""N""\x83\x8a\x83""A",
+	"\x81""@""\x8e""g""\x97""p""\x89\xc2\x94""\\""\x82\xc8\x8e\xf4\x95\xb6"":",
+	"\x82\xcd\x82\xa2",
+	"\x82\xa2\x82\xa2\x82\xa6"
+};
+
+static const StringListProvider kEoB2MenuStringsSpellsPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsSpellsPC98Japanese), kEoB2MenuStringsSpellsPC98Japanese };
+
+static const char *const kEoB2MenuStringsRestPC98Japanese[5] = {
+	"\r""\x81""@""\x83""N""\x83\x8c\x83\x8a\x83""b""\x83""N""\x82\xc9\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcc\x8e\xa1\x97\xc3\x82\xf0""\r  ""\x82\xb3\x82\xb9\x82\xdc\x82\xb7\x82\xa9\x81""H",
+	"\r  ""\x82\xdc\x82\xbe\x83""P""\x83""K""\x82\xf0\x82\xb5\x82\xc4\x82\xa2\x82\xe9\x90""l""\x82\xaa\x82\xa2\x82\xdc\x82\xb7\x81""B\r  ""\x8b""x""\x91\xa7\x82\xf0\x91\xb1\x82\xaf\x82\xdc\x82\xb7\x82\xa9\x81""H",
+	"  ""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcd\x8b""x""\x8c""e""\x82\xb5\x82\xc4\x82\xa2\x82\xdc\x82\xb7""..",
+	"\r\r  ""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcd\x91""S""\x88\xf5\x8a\xae\x91""S""\x82\xc9\x89\xf1\x95\x9c\x82\xb5\x82\xdc\x82\xb5\x82\xbd\x81""B",
+	"\r  ""\x8e\xf4\x95\xb6\x82\xf0\x8e""g""\x82\xa6\x82\xe9\x97""l""\x82\xc9\x82\xc8\x82\xe9\x82\xbd\x82\xdf\x82\xc9\x82\xcd\x81""A""\x8b""x""\x91\xa7\x82\xaa""\r""\x81""@""\x95""K""\x97""v""\x82\xc5\x82\xb7\x81""B"
+};
+
+static const StringListProvider kEoB2MenuStringsRestPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsRestPC98Japanese), kEoB2MenuStringsRestPC98Japanese };
+
+static const char *const kEoB2MenuStringsDropPC98Japanese[1] = {
+	"\r  ""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcc\x83\x81\x83\x93\x83""o""\x81""[""\x82\xf0\x82""S""\x90""l""\x96\xa2\x96\x9e\x82\xc9\x82\xb7\x82\xe9\x82\xb1""\r""\x81""@""\x82\xc6\x82\xcd\x82\xc5\x82\xab\x82\xdc\x82\xb9\x82\xf1\x81""B"
+};
+
+static const StringListProvider kEoB2MenuStringsDropPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsDropPC98Japanese), kEoB2MenuStringsDropPC98Japanese };
+
+static const char *const kEoB2MenuStringsExitPC98Japanese[1] = {
+	"\r""\x81""@""\x83""Q""\x81""[""\x83\x80\x82\xf0\x8f""I""\x97\xb9\x82\xb5\x82\xc4\x82\xe0\x82\xa2\x82\xa2\x82\xc5\x82\xb7\x82\xa9\x81""H",
+};
+
+static const StringListProvider kEoB2MenuStringsExitPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsExitPC98Japanese), kEoB2MenuStringsExitPC98Japanese };
+
+static const char *const kEoB2MenuStringsStarvePC98Japanese[1] = {
+	"\x81""@""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcc\x92\x86\x82\xc9\x8b\xf3\x95\xa0\x82\xcc\x83\x81\x83\x93\x83""o""\x81""[""\x82\xaa""\r  ""\x82\xa2\x82\xdc\x82\xb7\x81""B\r  ""\x82\xbb\x82\xea\x82\xc5\x82\xe0\x8b""x""\x91\xa7\x82\xf0\x91\xb1\x82\xaf\x82\xdc\x82\xb7\x82\xa9\x81""H"
+};
+
+static const StringListProvider kEoB2MenuStringsStarvePC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsStarvePC98Japanese), kEoB2MenuStringsStarvePC98Japanese };
+
+static const char *const kEoB2MenuStringsScribePC98Japanese[5] = {
+	"  ""\x8f\x91\x82\xab\x8e\xca\x82\xb5\x82\xbd\x82\xa2\x8e\xf4\x95\xb6\x82\xcc\x83""X""\x83""N""\x83\x8d\x81""[""\x83\x8b\x82\xf0""\r  ""\x91""I""\x82\xf1\x82\xc5\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B",
+	"\r\r\r\r  ""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcc\x92\x86\x82\xa9\x82\xe7\x8e\xf4\x95\xb6\x82\xf0\x8f\x91\x82\xab\x8e\xca\x82\xb5\x82\xbd\x82\xa2""\r  ""\x83\x81\x83""C""\x83""W""\x82\xf0\x91""I""\x82\xf1\x82\xc5\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B",
+	"\r""\x81""@""\x8e\xf4\x95\xb6\x82\xf0\x8f\xa5\x82\xa6\x82\xe9\x82\xbd\x82\xdf\x82\xcc\x83""X""\x83""N""\x83\x8d\x81""[""\x83\x8b\x82\xf0\x8e\x9d\x82\xc1\x82\xc4""\r""\x81""@""\x82\xa2\x82\xc8\x82\xa2\x81""B",
+	"\r  ""\x82\xb1\x82\xcc\x83\x81\x83""C""\x83""W""\x82\xaa\x95""K""\x97""v""\x82\xc6\x82\xb7\x82\xe9\x83""X""\x83""N""\x83\x8d\x81""[""\x83\x8b\x82\xf0\x8e\x9d""\r""\x81""@""\x82\xc1\x82\xc4\x82\xa2\x82\xc8\x82\xa2\x81""B",
+	"\r  ""\x90""V""\x82\xb5\x82\xa2\x8e\xf4\x95\xb6\x82\xf0\x8f\x91\x82\xab\x8e\xca\x82\xb7\x82\xb1\x82\xc6\x82\xcc\x82\xc5\x82\xab\x82\xe9\x83\x81\x83""C\r""\x81""@""\x83""W""\x82\xaa\x82\xa2\x82\xc8\x82\xa2\x81""B"
+};
+
+static const StringListProvider kEoB2MenuStringsScribePC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsScribePC98Japanese), kEoB2MenuStringsScribePC98Japanese };
+
+static const char *const kEoB2MenuStringsDrop2PC98Japanese[3] = {
+	"\r\r\r""\x81""@""\x95\xca\x82\xea\x82\xe9\x83""L""\x83\x83\x83\x89\x83""N""\x83""^""\x82\xf0\x91""I""\x82\xf1\x82\xc5\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B",
+	"\r  ""\x83""Z""\x81""[""\x83""u""\x83""t""\x83""@""\x83""C""\x83\x8b\x82\xc9\x82\xcd\x96\xbc\x91""O""\x82\xaa\x95""K""\x97""v""\x82\xc5\x82\xb7\x81""B",
+	"\r""\x91""O""\x82\xcc\x83""Z""\x81""[""\x83""u""\x83""f""\x81""[""\x83""^""\x82\xc9\x8f\xe3\x8f\x91\x82\xab\x82\xb5\x82\xc4\x82\xe0""\r""\x82\xa2\x82\xa2\x82\xc5\x82\xb7\x82\xa9\x81""H"
+};
+
+static const StringListProvider kEoB2MenuStringsDrop2PC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsDrop2PC98Japanese), kEoB2MenuStringsDrop2PC98Japanese };
+
+static const char *const kEoB2MenuStringsHeadPC98Japanese[3] = {
+	"\x81""@""\x83""L""\x83\x83\x83\x93\x83""v:",
+	"\x81""@""\x8a\xc2\x8b\xab\x90\xdd\x92\xe8"":",
+	"\x81""@""\x83""I""\x83""v""\x83""V""\x83\x87\x83\x93"":"
+};
+
+static const StringListProvider kEoB2MenuStringsHeadPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsHeadPC98Japanese), kEoB2MenuStringsHeadPC98Japanese };
+
+static const char *const kEoB2MenuStringsPoisonPC98Japanese[1] = {
+	"  ""\x93\xc5\x82\xf0\x8e\xf3\x82\xaf\x82\xbd\x83""L""\x83\x83\x83\x89\x83""N""\x83""^""\x81""[""\x82\xaa\x8e\x80\x82\xf1\x82\xc5\x82\xb5\x82\xdc""\r""\x81""@""\x82\xa2\x82\xdc\x82\xb7\x81""I\r  ""\x82\xbb\x82\xea\x82\xc5\x82\xe0\x8b""x""\x82\xdd\x82\xdc\x82\xb7\x82\xa9\x81""H"
+};
+
+static const StringListProvider kEoB2MenuStringsPoisonPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsPoisonPC98Japanese), kEoB2MenuStringsPoisonPC98Japanese };
+
+static const char *const kEoB2MenuStringsMgcPC98Japanese[2] = {
+	"%-18s %1d",
+	" %d""\x8c\xc2\x92\x86""  %d""\x8c\xc2\x8e""g""\x97""p""\x89\xc2\x94""\\",
+};
+
+static const StringListProvider kEoB2MenuStringsMgcPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsMgcPC98Japanese), kEoB2MenuStringsMgcPC98Japanese };
+
+static const char *const kEoB2MenuStringsPrefsPC98Japanese[4] = {
+	"\x82""a""\x82""f""\x82""l %-6s",
+	"\x8c\xf8\x89\xca\x89\xb9"" %-6s",
+	"\x83""o""\x81""[""\x83""O""\x83\x89\x83""t""\x95""\\""\x8e\xa6"" %-6s",
+	""
+};
+
+static const StringListProvider kEoB2MenuStringsPrefsPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsPrefsPC98Japanese), kEoB2MenuStringsPrefsPC98Japanese };
+
+static const char *const kEoB2MenuStringsRest2PC98Japanese[5] = {
+	"%s""\x82\xcd""%s""\x82\xcc\x8e\xf4\x95\xb6\x82\xf0\x8e\xf6\x82\xa9\x82\xc1\x82\xbd\x81""B\r",
+	"%s""\x82\xcd""%s""\x82\xcc\x8e\xf4\x95\xb6\x82\xf0\x8b""L""\x89\xaf\x82\xb5\x82\xbd\x81""B\r",
+	"%s""\x82\xcd""%s""\x82\xc9\x8e\xa1\x96\xfc\x82\xcc\x8e\xf4\x95\xb6\x82\xf0\x82\xc6\x82\xc8\x82\xa6\x82\xbd\x81""B\r",
+	"\x8b""x""\x91\xa7\x82\xb5\x82\xbd\x8e\x9e\x8a\xd4"": %-4d",
+	"\r%s\r"
+};
+
+static const StringListProvider kEoB2MenuStringsRest2PC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsRest2PC98Japanese), kEoB2MenuStringsRest2PC98Japanese };
+
+static const char *const kEoB2MenuStringsRest3PC98Japanese[1] = {
+	"\x06\x06\x82\xb1\x82\xb1\x82\xc5\x82\xcd\x88\xc0\x90""S""\x82\xb5\x82\xc4\x8b""x""\x82\xdf\x82\xbb\x82\xa4\x82\xc9\x82\xc8\x82\xa2\x81""B"
+};
+
+static const StringListProvider kEoB2MenuStringsRest3PC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsRest3PC98Japanese), kEoB2MenuStringsRest3PC98Japanese };
+
+static const char *const kEoB2MenuStringsRest4PC98Japanese[1] = {
+	"\x06\x06\x8b""x""\x82\xde\x82\xc9\x82\xcd\x8a\xeb\x8c\xaf\x89\xdf\x82\xac\x82\xe9\x81""B"
+};
+
+static const StringListProvider kEoB2MenuStringsRest4PC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsRest4PC98Japanese), kEoB2MenuStringsRest4PC98Japanese };
+
+static const char *const kEoB2MenuStringsDefeatPC98Japanese[1] = {
+	"\r""\x81""@""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcd\x91""S""\x96\xc5\x82\xb5\x82\xbd\x81""I\r  ""\x83""Z""\x81""[""\x83""u""\x83""f""\x81""[""\x83""^""\x82\xf0\x93\xc7\x82\xdd\x8d\x9e\x82\xf1\x82\xc5\x91\xb1\x82\xab\x82\xf0""\r  ""\x82\xb5\x82\xdc\x82\xb7\x82\xa9\x81""H"
+};
+
+static const StringListProvider kEoB2MenuStringsDefeatPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsDefeatPC98Japanese), kEoB2MenuStringsDefeatPC98Japanese };
+
+static const char *const kEoB2MenuStringsTransferPC98Japanese[5] = {
+	"\x88\xf8\x82\xab\x8c""p""\x82\xae\x83\x81\x83\x93\x83""o""\x81""[""\x82\xf0\x82""S""\x90""l""\x8c\x88\x82\xdf\x82\xc4\x89\xba\x82\xb3\x82\xa2\x81""I",
+	"\x88\xf8\x82\xab\x8c""p""\x82\xac\x82\xc5\x82\xab\x82\xe9\x82\xcc\x82\xcd\x82""S""\x90""l""\x82\xdc\x82\xc5\x82\xc5\x82\xb7\x81""I",
+	"\x93""]""\x91\x97\x82\xc5\x82\xab\x82\xc8\x82\xa2\x83""A""\x83""C""\x83""e""\x83\x80\x82\xf0\x88\xea\x95\x94\x8d\xed\x8f\x9c\x82\xb5\x82\xdc\x82\xb5\x82\xbd\x81""B",
+	"\r ""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xc9\x83\x81\x83""C""\x83""W""\x82\xaa\x82\xa2\x82\xdc\x82\xb9\x82\xf1\x81""B",
+	"\r  ""\x83""p""\x81""[""\x83""e""\x83""B""\x82\xc9\x83""N""\x83\x8c\x83\x8a\x83""b""\x83""N""\x82\xe0\x83""p""\x83\x89\x83""f""\x83""B""\x83\x93\x82\xe0\x82\xa2""\r""\x81""@""\x82\xdc\x82\xb9\x82\xf1\x81""B"
+};
+
+static const StringListProvider kEoB2MenuStringsTransferPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsTransferPC98Japanese), kEoB2MenuStringsTransferPC98Japanese };
+
+static const char *const kEoB2MenuStringsSpecPC98Japanese[2] = {
+	"  ""\x96\xda\x82\xaa\x8a""o""\x82\xdf\x82\xe9\x82\xc6\x81""A""\x83""V""\x81""[""\x83""t""\x82\xcc\x83""C""\x83\x93\x83""T""\x83\x8b\x82\xaa""\r  ""\x82\xa2\x82\xc8\x82\xad\x82\xc8\x82\xc1\x82\xc4\x82\xa2\x82\xbd\x81""I",
+	"  ""\x8e\x9d\x82\xbf\x95\xa8\x82\xaa\x82\xc8\x82\xad\x82\xc8\x82\xc1\x82\xc4\x82\xa2\x82\xe9\x81""I"
+};
+
+static const StringListProvider kEoB2MenuStringsSpecPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsSpecPC98Japanese), kEoB2MenuStringsSpecPC98Japanese };
+
+static const char *const kEoB2MenuYesNoStringsPC98Japanese[2] = {
+	"\x82\xcd\x82\xa2",
+	"\x82\xa2\x82\xa2\x82\xa6"
+};
+
+static const StringListProvider kEoB2MenuYesNoStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2MenuYesNoStringsPC98Japanese), kEoB2MenuYesNoStringsPC98Japanese };
+
+static const char *const kEoB2CharGuiStringsHpPC98Japanese[2] = {
+	"HP",
+	"%3d of %-3d"
+};
+
+static const StringListProvider kEoB2CharGuiStringsHpPC98JapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsHpPC98Japanese), kEoB2CharGuiStringsHpPC98Japanese };
+
+static const char *const kEoB2CharGuiStringsWp2PC98Japanese[3] = {
+	"MISS",
+	"HACK",
+	"BASH"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWp2PC98JapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsWp2PC98Japanese), kEoB2CharGuiStringsWp2PC98Japanese };
+
+static const char *const kEoB2CharGuiStringsWrPC98Japanese[4] = {
+	"CAN'T",
+	"REACH",
+	"NO",
+	"AMMO"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWrPC98JapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsWrPC98Japanese), kEoB2CharGuiStringsWrPC98Japanese };
+
+static const char *const kEoB2CharGuiStringsSt2PC98Japanese[7] = {
+	"Swapping",
+	"\x81""@""\x81""@""\x8e\x80\x96""S""\x81""@""\x81""@",
+	"\x81""@""\x81""@""\x8b""C""\x90\xe2\x81""@""\x81""@",
+	" ""\x93\xc5\x81""i""\x8e\xe3\x82\xa2\x81""j ",
+	"\x81""@""\x81""@ ""\x93\xc5"" ""\x81""@""\x81""@",
+	"\x81""@""\x81""@""\x96\x83\xe1\x83\x81""@""\x81""@",
+	"\x81""@""\x81""@""\x90\xce\x89\xbb\x81""@""\x81""@"
+};
+
+static const StringListProvider kEoB2CharGuiStringsSt2PC98JapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsSt2PC98Japanese), kEoB2CharGuiStringsSt2PC98Japanese };
+
+static const char *const kEoB2CharGuiStringsInPC98Japanese[4] = {
+	"CHARACTER INFO",
+	"ARMOR CLASS",
+	"EXP",
+	"LVL"
+};
+
+static const StringListProvider kEoB2CharGuiStringsInPC98JapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsInPC98Japanese), kEoB2CharGuiStringsInPC98Japanese };
+
+static const char *const kEoB2CharStatusStrings7PC98Japanese[1] = {
+	"%s""\x82\xcc\x83""W""\x83\x83\x83""C""\x83""A""\x83\x93\x83""g""\x81""E""\x83""X""\x83""g""\x83\x8c\x83\x93\x83""O""\x83""X""\x82\xcc\x8c\xf8\x89\xca\x82\xaa\x90\xd8\x82\xea\x82\xbd\x81""B\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings7PC98JapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings7PC98Japanese), kEoB2CharStatusStrings7PC98Japanese };
+
+static const char *const kEoB2CharStatusStrings82PC98Japanese[1] = {
+	"\x06\x06""%s""\x82\xcd\x93\xc5\x82\xaa\x89\xf1\x82\xc1\x82\xbd\x81""I\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings82PC98JapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings82PC98Japanese), kEoB2CharStatusStrings82PC98Japanese };
+
+static const char *const kEoB2CharStatusStrings9PC98Japanese[1] = {
+	"\x06\x04""%s""\x82\xcc\x96\x83\xe1\x83\x82\xcd\x8e\xa1\x82\xc1\x82\xbd\x81""I\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings9PC98JapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings9PC98Japanese), kEoB2CharStatusStrings9PC98Japanese };
+
+static const char *const kEoB2CharStatusStrings12PC98Japanese[1] = {
+	"%s""\x82\xcc\x93\xae\x82\xab\x82\xcd\x93\xdd\x82\xad\x82\xc8\x82\xc1\x82\xbd\x81""B\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings12PC98JapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings12PC98Japanese), kEoB2CharStatusStrings12PC98Japanese };
+
+static const char *const kEoB2CharStatusStrings132PC98Japanese[1] = {
+	"\x06\x06""%s""\x82\xcd""%s""\x81""I\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings132PC98JapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings132PC98Japanese), kEoB2CharStatusStrings132PC98Japanese };
+
+static const char *const kEoB2LevelGainStringsPC98Japanese[1] = {
+	"\x06\x01""%s""\x82\xcd\x83\x8c\x83""x""\x83\x8b\x82\xaa\x8f\xe3\x82\xaa\x82\xc1\x82\xbd\x81""B""\x06\x0f""\r" //!
+};
+
+static const StringListProvider kEoB2LevelGainStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2LevelGainStringsPC98Japanese), kEoB2LevelGainStringsPC98Japanese };
+
+static const char *const kEoB2BookNumbersPC98Japanese[5] = {
+	" ""\x82""P",
+	" ""\x82""Q",
+	" ""\x82""R",
+	" ""\x82""S",
+	" ""\x82""T"
+};
+
+static const StringListProvider kEoB2BookNumbersPC98JapaneseProvider = { ARRAYSIZE(kEoB2BookNumbersPC98Japanese), kEoB2BookNumbersPC98Japanese };
+
+static const char *const kEoB2MageSpellsListPC98Japanese[33] = {
+	"",
+	"Armor",
+	"Burning Hands",
+	"Detect Magic",
+	"Magic Missile",
+	"Shield",
+	"Shocking Grasp",
+	"Blur",
+	"Detect Invisible",
+	"Imp Identify",
+	"Invisibility",
+	"M's Acid Arrow",
+	"Dispel Magic",
+	"Fireball",
+	"Haste",
+	"Hold Person",
+	"Invisibility 10'",
+	"Lightning Bolt",
+	"Vampiric Touch",
+	"Fear",
+	"Ice Storm",
+	"Imp Invisibility",
+	"Remove Curse",
+	"Cone of Cold",
+	"Hold Monster",
+	"Wall of Force",
+	"Disintegrate",
+	"Flesh to Stone",
+	"Stone to Flesh",
+	"True Seeing",
+	"Finger of Death",
+	"Power Word Stun",
+	"Bigby's Fist"
+};
+
+static const StringListProvider kEoB2MageSpellsListPC98JapaneseProvider = { ARRAYSIZE(kEoB2MageSpellsListPC98Japanese), kEoB2MageSpellsListPC98Japanese };
+
+static const char *const kEoB2ClericSpellsListPC98Japanese[30] = {
+	"",
+	"Bless",
+	"Cause Light Wnds",
+	"Cure Light Wnds",
+	"Detect Magic",
+	"Protect-Evil",
+	"Aid",
+	"Flame Blade",
+	"Hold Person",
+	"Slow Poison",
+	"Create Food",
+	"Dispel Magic",
+	"Magical Vestment",
+	"Prayer",
+	"Remove Paralysis",
+	"Cause Serious",
+	"Cure Serious",
+	"Neutral-Poison",
+	"Protect-Evil 10'",
+	"Cause Critical",
+	"Cure Critical",
+	"Flame Strike",
+	"Raise Dead",
+	"Slay Living",
+	"True Seeing",
+	"Harm",
+	"Heal",
+	"Ressurection",
+	"Lay on Hands",
+	"Turn undead"
+};
+
+static const StringListProvider kEoB2ClericSpellsListPC98JapaneseProvider = { ARRAYSIZE(kEoB2ClericSpellsListPC98Japanese), kEoB2ClericSpellsListPC98Japanese };
+
+static const char *const kEoB2SpellNamesPC98Japanese[68] = {
+	"Armor",
+	"Burning Hands",
+	"Detect Magic",
+	"Magic Missile",
+	"Shield",
+	"Shocking Grasp",
+	"Blur",
+	"Detect Invisibility",
+	"Improved Identify",
+	"Invisibility",
+	"Melf's Acid Arrow",
+	"Dispel Magic",
+	"Fireball",
+	"Haste",
+	"Hold Person",
+	"Invisibility 10' Radius",
+	"Lightning Bolt",
+	"Vampiric Touch",
+	"Fear",
+	"Ice Storm",
+	"Improved Invisibility",
+	"Remove Curse",
+	"Cone of Cold",
+	"Hold Monster",
+	"Wall of Force",
+	"Disintegrate",
+	"Flesh to Stone",
+	"Stone to Flesh",
+	"True Seeing",
+	"Finger of Death",
+	"Power Word Stun",
+	"Bigby's Clenched Fist",
+	"Bless",
+	"Cause Light Wounds",
+	"Cure Light Wounds",
+	"Detect Magic",
+	"Protection from Evil",
+	"Aid",
+	"Flame Blade",
+	"Hold Person",
+	"Slow Poison",
+	"Create Food",
+	"Dispel Magic",
+	"Magical Vestment",
+	"Prayer",
+	"Remove Paralysis",
+	"Cause Serious Wounds",
+	"Cure Serious Wounds",
+	"Neutralize Poison",
+	"Protection from Evil 10' Radius",
+	"Cause Critical Wounds",
+	"Cure Critical Wounds",
+	"Flame Strike",
+	"Raise Dead",
+	"Slay Living",
+	"True Seeing",
+	"Harm",
+	"Heal",
+	"Ressurection",
+	"Lay on Hands",
+	"Turn Undead",
+	"",
+	"Mystic Defense",
+	"",
+	"",
+	"",
+	"",
+	""
+};
+
+static const StringListProvider kEoB2SpellNamesPC98JapaneseProvider = { ARRAYSIZE(kEoB2SpellNamesPC98Japanese), kEoB2SpellNamesPC98Japanese };
+
+static const char *const kEoB2MagicStrings1PC98Japanese[6] = {
+	"ABORT SPELL",
+	"ABORT SPELL",
+	"\x82\xb1\x82\xcc\x8e\xf4\x95\xb6\x82\xcd\x8e\xe8\x82\xaa\x8b\xf3\x82\xa2\x82\xc4\x82\xa2\x82\xc8\x82\xaf\x82\xea\x82\xce\x82\xc8\x82\xe7\x82\xc8\x82\xa2\x81""B\r",
+	"\x82\xb1\x82\xcc\x83""^""\x83""C""\x83""v""\x82\xcc\x96\x82\x96""@""\x82\xcd\x82""Q""\x82\xc2\x93\xaf\x8e\x9e\x82\xc9\x82\xa9\x82\xaf\x82\xe7\x82\xea\x82\xc8\x82\xa2\x81""B\r",
+	"%s""\x82\xcd""%s""\x82\xcc\x8e\xf4\x95\xb6\x82\xf0\x8f\xa5\x82\xa6\x82\xbd\x81""B\r",
+	"\r""\x82""n""\x82""j\r"
+};
+
+static const StringListProvider kEoB2MagicStrings1PC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings1PC98Japanese), kEoB2MagicStrings1PC98Japanese };
+
+static const char *const kEoB2MagicStrings2PC98Japanese[5] = {
+	"\x8e\xf4\x95\xb6\x82\xcd\x8e\xb8\x94""s""\x82\xb5\x82\xbd\x81""B\r",
+	"%s""\x82\xcd\x95\xaa\x89\xf0\x82\xb3\x82\xea\x82\xbd\x81""I\r",
+	"\x06\x06\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcd""Death""\x82\xcc\x8e\xf4\x95\xb6\x82\xf0\x8e\xf3\x82\xaf\x82\xbd\x81""I\r",
+	"\x06\x06""%s""\x82\xcd""Cause Serious Wounds""\x82\xcc\x8e\xf4\x95\xb6\x82\xf0\x8e\xf3\x82\xaf\x82\xbd\x81""I\r",
+	"\x90\xce\x89\xbb\x82\xb5\x82\xbd"
+};
+
+static const StringListProvider kEoB2MagicStrings2PC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings2PC98Japanese), kEoB2MagicStrings2PC98Japanese };
+
+static const char *const kEoB2MagicStrings3PC98Japanese[5] = {
+	"\x92""N""\x82\xc9\x8e\xf4\x95\xb6\x82\xf0\x8f\xa5\x82\xa6\x82\xdc\x82\xb7\x82\xa9\x81""H ",
+	"\r""\x8e\xf4\x95\xb6\x82\xcd\x92\x86\x92""f""\x82\xb3\x82\xea\x82\xdc\x82\xb5\x82\xbd\x81""B\r",
+	"%s""\x82\xcc""%s""\x82\xcc\x8e\xf4\x95\xb6\x82\xcc\x8c\xf8\x89\xca\x82\xaa\x90\xd8\x82\xea\x82\xbd\x81""B\r",
+	"%s""\x82\xcd\x83\x82\x83\x93\x83""X""\x83""^""\x81""[""\x82\xc9\x93\x96\x82\xbd\x82\xe7\x82\xc8\x82\xa9\x82\xc1\x82\xbd\x81""B\r",
+	"%s""\x82\xcd\x91""O""\x97\xf1\x82\xc9\x82\xa2\x82\xc8\x82\xaf\x82\xea\x82\xce\x8c\xf8\x89\xca\x82\xaa\x82\xc8\x82\xa2\x81""I\r"
+};
+
+static const StringListProvider kEoB2MagicStrings3PC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings3PC98Japanese), kEoB2MagicStrings3PC98Japanese };
+
+static const char *const kEoB2MagicStrings4PC98Japanese[1] = {
+	"\x8c\xf8\x89\xca\x82\xaa\x82\xc8\x82\xa9\x82\xc1\x82\xbd\x81""B\r"
+};
+
+static const StringListProvider kEoB2MagicStrings4PC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings4PC98Japanese), kEoB2MagicStrings4PC98Japanese };
+
+static const char *const kEoB2MagicStrings6PC98Japanese[1] = {
+	"%s""\x82\xcc\x83""A""\x81""[""\x83""}""\x81""[""\x82\xcc\x83""N""\x83\x89\x83""X""\x82\xcd\x8a\xf9\x82\xc9\x82""U""\x88\xc8\x89\xba\x82\xbe\x81""B"
+};
+
+static const StringListProvider kEoB2MagicStrings6PC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings6PC98Japanese), kEoB2MagicStrings6PC98Japanese };
+
+static const char *const kEoB2MagicStrings7PC98Japanese[2] = {
+	"%s""\x82\xc9\x82\xcd\x8a\xf9\x82\xc9""%s""\x82\xcc\x8c\xf8\x89\xca\x82\xaa\x82\xa0\x82\xe9\x81""B\r",
+	"\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcd\x8a\xf9\x82\xc9""%s""\x82\xcc\x8c\xf8\x89\xca\x82\xaa\x82\xa0\x82\xe9\x81""B\r"
+};
+
+static const StringListProvider kEoB2MagicStrings7PC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings7PC98Japanese), kEoB2MagicStrings7PC98Japanese };
+
+static const char *const kEoB2MagicStrings8PC98Japanese[6] = {
+	"\x8e\xf4\x95\xb6\x82\xcd\x8e\xb8\x94""s""\x82\xb5\x82\xbd\x81""B\r",
+	"\x90""g""\x93\xae\x82\xab\x82\xaa\x82\xc6\x82\xea\x82\xc8\x82\xa2",
+	"\x8e\xf4\x95\xb6\x82\xcd\x8e\xb8\x94""s""\x82\xb5\x82\xbd\x81""B\r",
+	"\x8e\xf4\x95\xb6\x82\xcd\x8e\xb8\x94""s""\x82\xb5\x82\xbd\x81""B\r",
+	"\x93\xcd\x82\xad\x94\xcd\x88\xcd\x82\xc9\x83\x82\x83\x93\x83""X""\x83""^""\x81""[""\x82\xaa\x82\xa2\x82\xc8\x82\xa2\x81""I\r",
+	"%s""\x82\xc9\x82\xcd\x8a\xf9\x82\xc9""Aid""\x82\xcc\x8e\xf4\x95\xb6\x82\xcc\x8c\xf8\x89\xca\x82\xaa\x82\xa0\x82\xe9\x81""B\r"
+};
+
+static const StringListProvider kEoB2MagicStrings8PC98JapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings8PC98Japanese), kEoB2MagicStrings8PC98Japanese };
+
+static const char *const kEoB2MainMenuStringsPC98Japanese[5] = {
+	"\x83""Z""\x81""[""\x83""u""\x83""Q""\x81""[""\x83\x80\x82\xa9\x82\xe7\x8e""n""\x82\xdf\x82\xe9""\r",
+	"\x90""V""\x82\xb5\x82\xad\x83""p""\x81""[""\x83""e""\x83""B""\x82\xf0\x8d\xec\x82\xc1\x82\xc4\x8e""n""\x82\xdf\x82\xe9""\r",
+	"\x82""d""\x82""n""\x82""a""\x82""h""\x82\xa9\x82\xe7\x82\xcc\x83""R""\x83\x93\x83""o""\x81""[""\x83""g\r",
+	"\x83""C""\x83\x93\x83""g""\x83\x8d\x83""_""\x83""N""\x83""V""\x83\x87\x83\x93""\r",
+	"\x82""c""\x82""n""\x82""r""\x82\xd6\x96\xdf\x82\xe9""\r"
+};
+
+static const StringListProvider kEoB2MainMenuStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2MainMenuStringsPC98Japanese), kEoB2MainMenuStringsPC98Japanese };
+
+static const char *const kEoB2TransferStrings1PC98Japanese[2] = {
+	"Level: %d",
+	" / %d"
+};
+
+static const StringListProvider kEoB2TransferStrings1PC98JapaneseProvider = { ARRAYSIZE(kEoB2TransferStrings1PC98Japanese), kEoB2TransferStrings1PC98Japanese };
+
+static const char *const kEoB2TransferStrings2PC98Japanese[2] = {
+	"\x88\xf8\x82\xab\x8c""p""\x82\xae\x83""L""\x83\x83\x83\x89\x83""N""\x83""^""\x81""[""\x82\xf0\x82""S""\x90""l""\x91""I""\x82\xf1\x82\xc5\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B",
+	"\x83\x81\x83\x93\x83""o""\x81""[""\x82\xaa\x8c\x88\x92\xe8\x82\xb5\x82\xbd\x82\xe7\x82""n""\x82""j""\x82\xf0\x83""N""\x83\x8a\x83""b""\x83""N""\x82\xb5\x82\xc4\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B"
+};
+
+static const StringListProvider kEoB2TransferStrings2PC98JapaneseProvider = { ARRAYSIZE(kEoB2TransferStrings2PC98Japanese), kEoB2TransferStrings2PC98Japanese };
+
+static const char *const kEoB2TransferLabelsPC98Japanese[2] = {
+	"\x82""b""\x82""`""\x82""m""\x82""b""\x82""d""\x82""k",
+	"\x82""n""\x82""j"
+};
+
+static const StringListProvider kEoB2TransferLabelsPC98JapaneseProvider = { ARRAYSIZE(kEoB2TransferLabelsPC98Japanese), kEoB2TransferLabelsPC98Japanese };
+
+static const char *const kEoB2IntroStringsPC98Japanese[20] = {
+	"\x82\xbb\x82\xcc\x94\xd3\x81""A""\x89\xe4\x81""X""\x82\xcd\x92""g""\x98""F""\x82\xcc\x82\xbb\x82\xce\x82\xc5""\r""\x81""@""\x82\xa2\x82\xc2\x82\xe0\x82\xcc\x82\xe6\x82\xa4\x82\xc9\x82\xad\x82\xc2\x82\xeb\x82\xa2\x82\xc5\x82\xa2\x82\xbd\x81""B",
+	"\x82\xbb\x82\xb1\x82\xd6\x93\xcb\x91""R""\x82\xcc\x92""m""\x82\xe7\x82\xb9\x82\xaa""\r""\x81""@""\x95\x91\x82\xa2\x8d\x9e\x82\xf1\x82\xc5\x82\xab\x82\xbd\x81""B",
+	"\x82\xbb\x82\xea\x82\xcd\x81""A""\x89\xe4\x81""X""\x82\xcc\x93\xaf\x8e""u""\x82\xc5\x82\xa0\x82\xe9""\r""\x83""E""\x83""H""\x81""[""\x83""^""\x81""[""\x83""f""\x83""B""\x81""[""\x83""v""\x82\xcc\x83""A""\x81""[""\x83""`""\x83\x81\x83""C""\x83""W\r""\x83""P""\x83\x8b\x83""x""\x83\x93\x81\x81\x83""u""\x83\x89\x83""b""\x83""N""\x83""X""\x83""^""\x83""b""\x83""t""\x82\xa9\x82\xe7\x82\xbe\x82\xc1\x82\xbd\x81""B",
+	"\x8b\xd9\x8b""}""\x82\xcc\x97""p""\x8c\x8f\x82\xc6\x82\xcc\x82\xb1\x82\xc6\x82\xbe\x82\xaa\x81""E""\x81""E",
+	"\x82\xa2\x82\xc1\x82\xbd\x82\xa2\x83""P""\x83\x8b\x83""x""\x83\x93\x82\xcd""\r""\x81""@""\x89\xbd\x82\xf0\x96""]""\x82\xf1\x82\xc5\x82\xa2\x82\xe9\x82\xcc\x82\xa9\x81""B",
+	"\x82\xc7\x82\xa4\x82\xbc\x82\xa8\x93\xfc\x82\xe8\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81""B",
+	"\x83""P""\x83\x8b\x83""x""\x83\x93\x97""l""\x82\xaa\x8f\x91\x8d\xd6\x82\xc5\x82\xa8\x91\xd2\x82\xbf\x82\xc5\x82\xb7\x81""B",
+	"\x91""f""\x91\x81\x82\xa2\x93\x9e\x92\x85\x82\xc9\x8a\xb4\x8e\xd3\x82\xb7\x82\xe9\x81""B",
+	"\x8d\xa2\x82\xc1\x82\xbd\x8e\x96\x82\xaa\x8b""N""\x82\xab\x82\xc4\x82\xb5\x82\xdc\x82\xc1\x82\xbd\x81""B",
+	"\x83""_""\x81""[""\x83""N""\x83\x80\x81""[""\x83\x93\x8e\x9b\x89""@""\x82\xc5""\r""\x8a\xf5\x82\xdc\x82\xed\x82\xb5\x82\xab\x82\xe0\x82\xcc\x82\xaa""\r""\x81""@""\x93\xae\x82\xab\x8f""o""\x82\xb5\x82\xbd\x82\xe6\x82\xa4\x82\xbe\x81""B",
+	"\x83""E""\x83""H""\x81""[""\x83""^""\x81""[""\x83""f""\x83""B""\x81""[""\x83""v""\x82\xcc\x88\xc0\x91""S""\x82\xaa""\r""\x81""@""\x8b\xba\x82\xa9\x82\xb3\x82\xea\x82\xc4\x82\xa2\x82\xe9\x81""B",
+	"\x8c""N""\x92""B""\x82\xcc\x8f\x95\x82\xaf\x82\xaa\x95""K""\x97""v""\x82\xbe\x81""B",
+	"\x8e""O""\x93\xfa\x91""O""\x81""A""\x92\xe3\x8e""@""\x82\xf0\x88\xea\x90""l""\x94""h""\x8c\xad\x82\xb5\x82\xbd\x82\xcc\x82\xbe\x82\xaa\x81""A",
+	"\x94\xde\x8f\x97\x82\xcd\x82\xa2\x82\xdc\x82\xbe\x82\xc9\x96\xdf\x82\xc1\x82\xc4\x82\xab\x82\xc4\x82\xa2\x82\xc8\x82\xa2\x81""B",
+	"\x94\xde\x8f\x97\x82\xcc\x82\xb1\x82\xc6\x82\xe0\x90""S""\x94""z""\x82\xbe\x81""B",
+	"\x82\xb1\x82\xcc\x83""R""\x83""C""\x83\x93\x82\xf0\x8e\x9d\x82\xc1\x82\xc4\x82\xa2\x82\xc1\x82\xc4\x82\xad\x82\xea\x81""B",
+	"\x8c""N""\x92""B""\x82\xc6\x98""A""\x97\x8d\x82\xf0\x8e\xe6\x82\xe9\x8e\x9e\x82\xc9\x8e""g""\x82\xa4\x82\xe0\x82\xcc\x82\xbe\x81""B",
+	"\x8e\x96\x82\xcd\x88\xea\x8d\x8f\x82\xf0\x91\x88\x82\xa4\x81""B",
+	"\x83""_""\x81""[""\x83""N""\x83\x80\x81""[""\x83\x93\x82\xcc\x8b\xdf\x82\xad\x82\xdc\x82\xc5""\r""\x81""@""\x8c""N""\x92""B""\x82\xf0\x83""e""\x83\x8c\x83""|""\x81""[""\x83""g""\x82\xb7\x82\xe9\x81""B",
+	"\x93\xaf\x8e""u""\x82\xc9\x90""_""\x82\xcc\x82\xb2\x89\xc1\x8c\xec\x82\xaa\x82\xa0\x82\xe7\x82\xf1\x82\xb1\x82\xc6\x82\xf0\x81""B"
+};
+
+static const StringListProvider kEoB2IntroStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2IntroStringsPC98Japanese), kEoB2IntroStringsPC98Japanese };
+
+static const char *const kEoB2IntroCPSFilesPC98Japanese[14] = {
+	"STREET1.CPS",
+	"STREET2.CPS",
+	"DOORWAY1.CPS",
+	"DOORWAY2.CPS",
+	"WESTWOOD.CPS",
+	"WINDING.CPS",
+	"KHELBAN2.CPS",
+	"KHELBAN1.CPS",
+	"KHELBAN3.CPS",
+	"KHELBAN4.CPS",
+	"COIN.CPS",
+	"KHELBAN5.CPS",
+	"KHELBAN6.CPS",
+	"AAD_LOGO.CPS"
+};
+
+static const StringListProvider kEoB2IntroCPSFilesPC98JapaneseProvider = { ARRAYSIZE(kEoB2IntroCPSFilesPC98Japanese), kEoB2IntroCPSFilesPC98Japanese };
+
+static const char *const kEoB2FinaleStringsPC98Japanese[20] = {
+	"\x82\xc2\x82\xa2\x82\xc9\x81""A""\x83""h""\x83\x89\x83\x93\x82\xcd\x97\xcd\x82\xc2\x82\xab\x82\xbd\x81""B",
+	"\x82\xbb\x82\xcc\x8e\x9e\x81""A""\x93\xaf\x8e""u""\x83""P""\x83\x8b\x83""x""\x83\x93\x82\xaa\x96\xda\x82\xcc\x91""O""\x82\xc9\x8c\xbb\x82\xea\x82\xbd\x81""B",
+	"\x82\xa8\x82\xdf\x82\xc5\x82\xc6\x82\xa4\x81""A""\x8c\xd6\x82\xe8\x8d\x82\x82\xab\x93\xaf\x8e""u""\x92""B""\x82\xe6\x81""B",
+	"\x8c""N""\x92""B""\x82\xc9\x82\xe6\x82\xc1\x82\xc4\x83""h""\x83\x89\x83\x93\x82\xcd\x93""|""\x82\xb3\x82\xea\x82\xbd\x81""I",
+	"\x83""h""\x83\x89\x83\x93\x82\xaa\x83""h""\x83\x89\x83""S""\x83\x93\x82\xbe\x82\xc1\x82\xbd\x82\xc6\x82\xcd\x8e\x84\x82\xe0\x92""m""\x82\xe7\x82\xc8\x82\xa9\x82\xc1\x82\xbd\x81""B",
+	"\x82\xb1\x82\xa2\x82\xc2\x82\xcd\x82""R""\x82""O""\x82""O""\x94""N""\x88\xc8\x8f\xe3\x90\xb6\x82\xab\x82\xc4\x82\xa2\x82\xbd\x82\xc9\x88\xe1\x82\xa2\x82\xc8\x82\xa2\x81""I",
+	"\x83""h""\x83\x89\x83\x93\x82\xcc\x97\xcd\x82\xcd\x8f\xc1\x82\xa6\x82\xbd\x81""B",
+	"\x82\xb5\x82\xa9\x82\xb5\x81""A""\x83""_""\x81""[""\x83""N""\x83\x80\x81""[""\x83\x93\x82\xcd\x96\xa2\x82\xbe\x82\xc9\x8b\x90\x91\xe5\x82\xc8\x88\xab\x82\xcc\x97\xcd\x82\xcc\x89\xf2\x82\xbe\x81""B",
+	"\x82\xbb\x82\xea\x82\xc9\x81""A""\x94\xde\x82\xcc\x89\xba\x96""l""\x92""B""\x82\xaa\x8e""c""\x82\xc1\x82\xc4\x82\xa2\x82\xe9\x81""B",
+	"\x82\xb3\x82\xa0\x81""A""\x82\xb1\x82\xcc\x8f\xea\x8f\x8a\x82\xf0\x97\xa3\x82\xea\x82\xe9\x82\xc6\x82\xb5\x82\xe6\x82\xa4\x81""B",
+	"\x8e\x84\x82\xcc\x97\xcd\x82\xc5\x94""j""\x89\xf3\x82\xb7\x82\xea\x82\xce\x81""A""\x8f""I""\x8e""~""\x95\x84\x82\xf0\x91\xc5\x82\xc2\x82\xb1\x82\xc6\x82\xaa\x82\xc5\x82\xab\x82\xe9\x82\xbe\x82\xeb\x82\xa4\x81""B",
+	"\x82\xc2\x82\xa2\x82\xc4\x97\x88\x82\xc8\x82\xb3\x82\xa2\x81""B",
+	"\x8b\xad\x97\xcd\x82\xc8\x83\x81\x83""C""\x83""W""\x92""B""\x82\xaa\x81""A""\x8d\xc5\x8c\xe3\x82\xcc\x8c\x88\x90\xed\x82\xcc\x88\xd7\x82\xc9\x83""_""\x81""[""\x83""N""\x83\x80\x81""[""\x83\x93\x82\xcc\x89\xf1\x82\xe8\x82\xc9\x97\xa7\x82\xc1\x82\xc4\x82\xa2\x82\xe9\x81""B",
+	"\x83""_""\x81""[""\x83""N""\x83\x80\x81""[""\x83\x93\x82\xcc\x88\xab\x82\xcc\x97\xcd\x82\xcd\x8b\xad\x97\xcd\x82\xbe\x81""B",
+	"\x90\xb6\x82\xa9\x82\xb5\x82\xc4\x82\xa8\x82\xa2\x82\xc4\x82\xcd\x82\xc8\x82\xe7\x82\xc8\x82\xa2\x81""I",
+	"\x83""_""\x81""[""\x83""N""\x83\x80\x81""[""\x83\x93\x82\xcd\x8f\xc1\x82\xa6\x8b\x8e\x82\xc1\x82\xc4\x82\xa2\x82\xc1\x82\xbd\x81""B",
+	"\x93\xaf\x8e""u""\x82\xe6\x81""B""\x82\xb1\x82\xea\x82\xc5\x81""A""\x91""S""\x82\xc4\x82\xaa\x8f""I""\x82\xed\x82\xc1\x82\xbd\x81""B",
+	"\x90""S""\x82\xa9\x82\xe7\x8a\xb4\x8e\xd3\x82\xb7\x82\xe9\x81""B",
+	"\x8c""N""\x92""B""\x82\xc9\x8e\x84\x82\xcc\x8d\xc5\x8d\x82\x82\xcc\x8c""h""\x88\xd3\x82\xf0\x95\xa5\x82\xa8\x82\xa4\x81""B",
+	"\x89\xe4\x81""X""\x82\xcd\x8c""N""\x92""B""\x82\xcc\x82\xb1\x82\xc6\x82\xf0\x82\xa2\x82\xc2\x82\xe0\x96""Y""\x82\xea\x82\xc8\x82\xa2\x82\xbe\x82\xeb\x82\xa4\x81""B"
+};
+
+static const StringListProvider kEoB2FinaleStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2FinaleStringsPC98Japanese), kEoB2FinaleStringsPC98Japanese };
+
+static const char *const kEoB2FinaleCPSFilesPC98Japanese[13] = {
+	"DRAGON1.CPS",
+	"DRAGON2.CPS",
+	"HURRY1.CPS",
+	"HURRY2.CPS",
+	"DESTROY0.CPS",
+	"DESTROY1.CPS",
+	"DESTROY2.CPS",
+	"MAGIC.CPS",
+	"DESTROY3.CPS",
+	"CREDITS2.CPS",
+	"CREDITS3.CPS",
+	"HEROES.CPS",
+	"THANKS.CPS"
+};
+
+static const StringListProvider kEoB2FinaleCPSFilesPC98JapaneseProvider = { ARRAYSIZE(kEoB2FinaleCPSFilesPC98Japanese), kEoB2FinaleCPSFilesPC98Japanese };
+
+static const char *const kEoB2MonsterDistAttStringsPC98Japanese[5] = {
+	"\x83""p""\x81""[""\x83""e""\x83""B""\x82\xcd""Psychic Mind Blast""\x82\xf0\x8e\xf3\x82\xaf\x82\xbd\x81""I\r",
+	"\x96\x83\xe1\x83\x82\xb5\x82\xbd",
+	"\x93\xc5\x82\xf0\x8e\xf3\x82\xaf\x82\xbd",
+	"\x96\x83\xe1\x83\x82\xb5\x82\xbd",
+	"\x90\xce\x89\xbb\x82\xb5\x82\xbd"
+};
+
+static const StringListProvider kEoB2MonsterDistAttStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2MonsterDistAttStringsPC98Japanese), kEoB2MonsterDistAttStringsPC98Japanese };
+
+static const char *const kEoB2Npc1StringsPC98Japanese[2] = {
+	"\x98""b""\x82\xb7",
+	"\x8b\x8e\x82\xe9"
+};
+
+static const StringListProvider kEoB2Npc1StringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2Npc1StringsPC98Japanese), kEoB2Npc1StringsPC98Japanese };
+
+static const char *const kEoB2Npc2StringsPC98Japanese[2] = {
+	"\x8d\xbd\x82\xf0\x8a""O""\x82\xb7",
+	"\x8b\x8e\x82\xe9"
+};
+
+static const StringListProvider kEoB2Npc2StringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2Npc2StringsPC98Japanese), kEoB2Npc2StringsPC98Japanese };
+
+static const char *const kEoB2MonsterDustStringsPC98Japanese[1] = {
+	"\x83\x82\x83\x93\x83""X""\x83""^""\x81""|""\x82\xcd\x8d\xd3\x82\xaf\x8e""U""\x82\xc1\x82\xbd\x81""I\r"
+};
+
+static const StringListProvider kEoB2MonsterDustStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2MonsterDustStringsPC98Japanese), kEoB2MonsterDustStringsPC98Japanese };
+
+static const char *const kEoB2KheldranStringsPC98Japanese[1] = {
+	"    ""\x82\xb1\x82\xcc\x8f\xac\x91""m""\x82\xdf\x82\xaa\x81""I"
+};
+
+static const StringListProvider kEoB2KheldranStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2KheldranStringsPC98Japanese), kEoB2KheldranStringsPC98Japanese };
+
+static const char *const kEoB2HornStringsPC98Japanese[4] = {
+	"\x83""z""\x81""[""\x83\x93\x82\xa9\x82\xe7\x82\xa4\x82\xc8\x82\xe9\x82\xe6\x82\xa4\x82\xc8\x89\xb9\x82\xaa\x8b\xbf\x82\xa2\x82\xbd\x81""B\r",
+	"\x83""z""\x81""[""\x83\x93\x82\xa9\x82\xe7\x82\xa4\x82\xc2\x82\xeb\x82\xc8\x89\xb9\x82\xaa\x95\xb7\x82\xb1\x82\xa6\x82\xe9\x81""B\r",
+	"\x83""z""\x81""[""\x83\x93\x82\xa9\x82\xe7\x94\xfc\x82\xb5\x82\xa2\x89\xb9\x82\xaa\x97\xac\x82\xea\x82\xe9\x81""B\r",
+	"\x83""z""\x81""[""\x83\x93\x82\xa9\x82\xe7\x95""s""\x8b""C""\x96\xa1\x82\xc8\x89\xb9\x82\xaa\x82\xb7\x82\xe9\x81""B\r"
+};
+
+static const StringListProvider kEoB2HornStringsPC98JapaneseProvider = { ARRAYSIZE(kEoB2HornStringsPC98Japanese), kEoB2HornStringsPC98Japanese };
+
+static const char *const kEoB2NpcPresetsNamesPC98Japanese[6] = {
+	"Insal",
+	"Calandra",
+	"Shorn",
+	"San-raal",
+	"Tanglor",
+	"Amber"
+};
+
+static const StringListProvider kEoB2NpcPresetsNamesPC98JapaneseProvider = { ARRAYSIZE(kEoB2NpcPresetsNamesPC98Japanese), kEoB2NpcPresetsNamesPC98Japanese };
diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat
index 4f26b70277e..03357523d38 100644
Binary files a/dists/engine-data/kyra.dat and b/dists/engine-data/kyra.dat differ
diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 623b783d0e2..8d9acc57664 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -479,6 +479,8 @@ void CharacterGenerator::checkForCompleteParty() {
 	_screen->copyRegion(0, 0, 160, 0, 160, 128, 2, 2, Screen::CR_NO_P_CHECK);
 	int cp = _screen->setCurPage(2);
 	int x = (_vm->gameFlags().platform == Common::kPlatformFMTowns) ? 184 : 168;
+	int y1 = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98) ? 80 : 16;
+	int y2 = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98) ? 112 : 61;
 	int cs = 0;
 
 	if (_vm->gameFlags().platform == Common::kPlatformSegaCD) {
@@ -487,7 +489,7 @@ void CharacterGenerator::checkForCompleteParty() {
 		cs = _screen->setFontStyles(_screen->_currentFont, _vm->gameFlags().lang == Common::JA_JPN ? Font::kStyleNone : Font::kStyleFullWidth);
 		_vm->_txt->printShadedText(_chargenStrings1[8], 0, 0, -1, 0x99);
 	} else {
-		_screen->printShadedText(_chargenStrings1[8], x, 16, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
+		_screen->printShadedText(_chargenStrings1[8], x, y1, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
 		_screen->copyRegion(160, 0, 144, 64, 160, 128, 2, 0, Screen::CR_NO_P_CHECK);
 	}
 	_screen->setCurPage(cp);
@@ -503,7 +505,7 @@ void CharacterGenerator::checkForCompleteParty() {
 			_vm->_txt->printShadedText(_chargenStrings1[0], 0, 60, -1, 0x99);
 		} else {
 			_screen->setCurPage(2);
-			_screen->printShadedText(_chargenStrings1[0], x, 61, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
+			_screen->printShadedText(_chargenStrings1[0], x, y2, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
 			_screen->setCurPage(0);
 			_screen->copyRegion(168, 61, 152, 125, 136, 40, 2, 0, Screen::CR_NO_P_CHECK);
 		}
@@ -1511,7 +1513,18 @@ void CharacterGenerator::finish() {
 	_screen->copyRegion(0, 0, 160, 0, 160, 128, 2, 2, Screen::CR_NO_P_CHECK);
 	if (_chargenEnterGameStrings) {
 		int cp = _screen->setCurPage(2);
-		_screen->printShadedText(_chargenEnterGameStrings[0], (_vm->gameFlags().platform == Common::kPlatformFMTowns) ? 184 : 168, 32, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
+		int tx = 168;
+		int ty = 32;
+
+		if (_vm->game() == GI_EOB2) {
+			if (_vm->gameFlags().platform == Common::kPlatformPC98) {
+				tx = 184;
+				ty = 96;
+			} else if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
+				tx = 184;
+			}
+		}
+		_screen->printShadedText(_chargenEnterGameStrings[0], tx, ty, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
 		_screen->setCurPage(cp);
 	}
 	_screen->copyRegion(160, 0, 144, 64, 160, 128, 2, 0, Screen::CR_NO_P_CHECK);
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 198f191a353..e29c7a03ba4 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -1328,6 +1328,9 @@ void EoBCoreEngine::npcSequence(int npcIndex) {
 		drawNpcScene(npcIndex);
 
 		Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
+		if (!s)
+			s = _res->createReadStream("JTEXT.DAT");
+
 		if (s) {
 			_screen->loadFileDataToPage(s, 5, 32000);
 		} else {
@@ -1587,6 +1590,9 @@ void EoBCoreEngine::initDialogueSequence() {
 		snd_stopSound();
 
 	Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
+	if (!s)
+		s = _res->createReadStream("JTEXT.DAT");
+
 	if (s) {
 		_screen->loadFileDataToPage(s, 5, 32000);
 	} else {
@@ -1832,6 +1838,9 @@ void EoBCoreEngine::displayParchment(int id) {
 	if (id >= 0) {
 		// display text
 		Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
+		if (!s)
+			s = _res->createReadStream("JTEXT.DAT");
+
 		if (s) {
 			_screen->loadFileDataToPage(s, 5, 32000);
 		} else {
diff --git a/engines/kyra/resource/resource.h b/engines/kyra/resource/resource.h
index 407b73c5253..d04fbd8ca93 100644
--- a/engines/kyra/resource/resource.h
+++ b/engines/kyra/resource/resource.h
@@ -843,6 +843,12 @@ enum KyraResources {
 	kEoB2IntroAnimData42,
 	kEoB2IntroAnimData43,
 
+	// extra entries for PC-98
+	kEoB2IntroAnimData44,
+	kEoB2IntroAnimData45,
+	kEoB2IntroAnimData46,
+	kEoB2IntroAnimData47,
+
 	kEoB2IntroShapes00,
 	kEoB2IntroShapes01,
 	kEoB2IntroShapes04,
diff --git a/engines/kyra/resource/staticres.cpp b/engines/kyra/resource/staticres.cpp
index 9f7344d5c78..5424554ee5c 100644
--- a/engines/kyra/resource/staticres.cpp
+++ b/engines/kyra/resource/staticres.cpp
@@ -38,7 +38,7 @@
 
 namespace Kyra {
 
-#define RESFILE_VERSION 120
+#define RESFILE_VERSION 121
 
 namespace {
 bool checkKyraDat(Common::SeekableReadStream *file) {
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index 4b918926803..b51b169e031 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -253,6 +253,10 @@ void DarkMoonEngine::seq_playIntro() {
 
 	uint8 textColor1 = 16;
 	uint8 textColor2 = 15;
+	int songCurPos = 0;
+
+	if (_flags.platform == Common::kPlatformPC98)
+		sq.loadScene(13, 2);
 
 	if (_flags.platform == Common::kPlatformAmiga) {
 		textColor1 = textColor2 = 31;
@@ -266,6 +270,8 @@ void DarkMoonEngine::seq_playIntro() {
 	sq.loadScene(0, 2);
 	sq.delay(1);
 
+	// PC-98 --- SFX 0
+
 	if (!skipFlag() && !shouldQuit())
 		snd_playSong(12);
 
@@ -284,29 +290,40 @@ void DarkMoonEngine::seq_playIntro() {
 	sq.animCommand(6, 18);
 	sq.animCommand(0);
 
-	sq.waitForSongNotifier(1);
+	sq.waitForSongNotifier(++songCurPos);
 
-	sq.animCommand(_configRenderMode == Common::kRenderEGA ? 12 : 11);
+	sq.animCommand(_flags.platform == Common::kPlatformPC98 ? (_configRenderMode == Common::kRenderEGA ? 43 : 42) : (_configRenderMode == Common::kRenderEGA ? 12 : 11));
 	sq.animCommand(7, 6);
 	sq.animCommand(2, 6);
 
-	sq.waitForSongNotifier(2);
+	sq.waitForSongNotifier(++songCurPos);
+
+	if (_flags.platform == Common::kPlatformPC98) {
+		sq.animCommand(_configRenderMode == Common::kRenderEGA ? 37 : 36);
+		sq.animCommand(7, 6);
+		sq.animCommand(2, 6);
+		sq.waitForSongNotifier(++songCurPos);
+		sq.animCommand(_configRenderMode == Common::kRenderEGA ? 45 : 44);
+		sq.animCommand(7, 6);
+		sq.animCommand(2, 6);
+		sq.waitForSongNotifier(++songCurPos);
+	}
 
-	sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 37 : (_configRenderMode == Common::kRenderEGA ? 39 : 38));
+	sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 37 : (_flags.platform == Common::kPlatformPC98 ? (_configRenderMode == Common::kRenderEGA ? 47 : 46) : (_configRenderMode == Common::kRenderEGA ? 39 : 38)));
 	sq.animCommand(3);
 	sq.animCommand(8);
 	sq.animCommand(1, 10);
 	sq.animCommand(0, 6);
 	sq.animCommand(2);
 
-	sq.waitForSongNotifier(3);
+	sq.waitForSongNotifier(++songCurPos);
 
 	_screen->setClearScreenDim(17);
 	_screen->setCurPage(2);
 	_screen->setClearScreenDim(17);
 	_screen->setCurPage(0);
 
-	sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 38 : (_configRenderMode == Common::kRenderEGA ? 41 : 40));
+	sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 38 : (_flags.platform == Common::kPlatformPC98 ? (_configRenderMode == Common::kRenderEGA ? 39 : 38) : (_configRenderMode == Common::kRenderEGA ? 41 : 40)));
 	sq.animCommand(7, 18);
 
 	if (_flags.platform == Common::kPlatformAmiga)
@@ -329,8 +346,10 @@ void DarkMoonEngine::seq_playIntro() {
 
 	sq.printText(3, textColor1);    // The message was urgent.
 
+	// PC-98 --- SFX 1
+
 	sq.loadScene(1, 2);
-	sq.waitForSongNotifier(4);
+	sq.waitForSongNotifier(++songCurPos);
 
 	// intro scroll
 	if (!skipFlag() && !shouldQuit()) {
@@ -341,7 +360,7 @@ void DarkMoonEngine::seq_playIntro() {
 				_screen->copyRegion(i << 3, 0, 304, 8, 8, 128, 2, 0, Screen::CR_NO_P_CHECK);
 				_screen->updateScreen();
 				if (i == 12)
-					sq.animCommand(42);
+					sq.animCommand(_flags.platform == Common::kPlatformPC98 ? 40 : 42);
 				else if (i == 25)
 					snd_playSoundEffect(11);
 				delayUntil(endtime);
@@ -356,7 +375,7 @@ void DarkMoonEngine::seq_playIntro() {
 					if (i == 4 || i == 24 || i == 36)
 						sq.animCommand(39);
 				} else if (i == 96) {
-					sq.animCommand(42);
+					sq.animCommand(_flags.platform == Common::kPlatformPC98 ? 40 : 42);
 				}
 				delayUntil(endtime);
 			}
@@ -377,7 +396,7 @@ void DarkMoonEngine::seq_playIntro() {
 
 	sq.loadScene(3, 2);
 	sq.delay(54);
-	sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 12 : 13);
+	sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 12 : (_flags.platform == Common::kPlatformPC98 ? 11 : 13));
 	_screen->copyRegion(104, 16, 96, 8, 120, 100, 0, 2, Screen::CR_NO_P_CHECK);
 	sq.fadeText();
 
@@ -398,6 +417,8 @@ void DarkMoonEngine::seq_playIntro() {
 
 	if (_flags.platform == Common::kPlatformAmiga)
 		sq.setPlatformAnimIndexOffset(-1);
+	else if (_flags.platform == Common::kPlatformPC98)
+		sq.setPlatformAnimIndexOffset(-2);
 
 	sq.animCommand(14);
 
@@ -414,7 +435,7 @@ void DarkMoonEngine::seq_playIntro() {
 			sq.fadeText();
 			snd_playSong(14);
 		} else {
-			sq.waitForSongNotifier(5);
+			sq.waitForSongNotifier(++songCurPos);
 			sq.fadeText();
 			_screen->clearCurPage();
 			_screen->updateScreen();
@@ -438,6 +459,9 @@ void DarkMoonEngine::seq_playIntro() {
 		snd_playSong(15);
 
 	sq.animCommand(16);
+
+	// PC-98 --- SFX 2
+
 	sq.printText(7, textColor2);    // Thank you for coming so quickly
 	sq.animCommand(16);
 	sq.animCommand(17);
@@ -473,7 +497,7 @@ void DarkMoonEngine::seq_playIntro() {
 	sq.fadeText();
 	sq.loadScene(9, 2);
 
-	sq.waitForSongNotifier(6);
+	sq.waitForSongNotifier(++songCurPos);
 
 	sq.update(2);
 	sq.animCommand(34);
@@ -581,15 +605,18 @@ void DarkMoonEngine::seq_playIntro() {
 	sq.animCommand(19);
 	sq.animCommand(20);
 	sq.animCommand(18);
+
+	// PC-98 --- SFX 3
+
 	sq.fadeText();
 	sq.animCommand(29);
 
-	sq.waitForSongNotifier(7);
+	sq.waitForSongNotifier(++songCurPos);
 
 	sq.animCommand(30);
 	sq.animCommand(31);
 
-	sq.waitForSongNotifier(8, true);
+	sq.waitForSongNotifier(++songCurPos, true);
 
 	if (_flags.platform == Common::kPlatformAmiga && !skipFlag() && !shouldQuit()) {
 		static const uint8 magicHandsCol[] = { 0x15, 0x1D, 0x3A, 0x32, 0x32, 0x3F };
@@ -948,12 +975,21 @@ void DarkMoonEngine::seq_playFinale() {
 		snd_playSong(_flags.platform == Common::kPlatformFMTowns ? 16 : 1);
 
 	int temp = 0;
-	const uint8 *creditsData = (_flags.platform != Common::kPlatformDOS) ? _res->fileData("CREDITS.TXT", 0) : _staticres->loadRawData(kEoB2CreditsData, temp);
+
+	static const char *const tryFiles[2] = {
+		"CREDITS.TXT",
+		"CREDITS4.CPS"
+	};
+
+	const uint8 *creditsFileData = 0;
+	for (int i = 0; i < ARRAYSIZE(tryFiles) && !creditsFileData; ++i)
+		creditsFileData = _res->fileData(tryFiles[i], 0);
+
+	const uint8 *creditsData = creditsFileData ? creditsFileData : _staticres->loadRawData(kEoB2CreditsData, temp);
 
 	seq_playCredits(&sq, creditsData, 18, 2, 6, 2);
 
-	if (_flags.platform != Common::kPlatformDOS)
-		delete[] creditsData;
+	delete[] creditsFileData;
 
 	sq.delay(90);
 
@@ -1533,7 +1569,7 @@ void DarkmoonSequenceHelper::init(DarkmoonSequenceHelper::Mode mode) {
 			new const uint8*[16],
 			_vm->_flags.platform == Common::kPlatformAmiga ? 0 : (_vm->_configRenderMode == Common::kRenderEGA ? _palFilesIntroEGA : _palFilesIntroVGA),
 			new const DarkMoonShapeDef*[16],
-			new const DarkMoonAnimCommand *[44],
+			new const DarkMoonAnimCommand*[48],
 			false,
 			false,
 			true,
@@ -1544,7 +1580,8 @@ void DarkmoonSequenceHelper::init(DarkmoonSequenceHelper::Mode mode) {
 			2
 		);
 
-		for (int i = 0; i < 44; i++)
+
+		for (int i = 0; i < 48; i++)
 			_config->animData[i] = _vm->staticres()->loadEoB2SeqData(kEoB2IntroAnimData00 + i, size);
 
 		for (int i = 0; i < 16; i++)


Commit: 19dbab27dabe0b2c078afa0ec89898323f53f04f
    https://github.com/scummvm/scummvm/commit/19dbab27dabe0b2c078afa0ec89898323f53f04f
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:50:51+02:00

Commit Message:
KYRA: (EOB II/PC98) - fix startup

- intro will run with glitchy text and without sound
- main menu will show, but also slightly glitched

Changed paths:
  A engines/kyra/sound/drivers/capcom98.cpp
  A engines/kyra/sound/drivers/capcom98.h
  A engines/kyra/sound/sound_pc98_darkmoon.cpp
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/module.mk
    engines/kyra/sequence/sequences_darkmoon.cpp
    engines/kyra/sound/sound_intern.h


diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index e29c7a03ba4..aca804345e5 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -429,7 +429,7 @@ Common::Error EoBCoreEngine::init() {
 			_sound = new SoundPC98_EoB(this, _mixer);
 		} else {
 			dev = MidiDriver::detectDevice(MDT_PC98 | MDT_MIDI);
-			/**/
+			_sound = new SoundPC98_Darkmoon(this, dev, _mixer);
 		}
 		break;
 	case Common::kPlatformAmiga:
@@ -575,6 +575,9 @@ void EoBCoreEngine::loadFonts() {
 		else
 			AmigaDOSFont::errorDialog(0);
 
+	} else if (_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformPC98) {
+		_screen->loadFont(Screen::FID_6_FNT, "FONT6B.FNT");
+		_screen->loadFont(Screen::FID_8_FNT, "FONT8B.FNT");
 	} else if (_flags.platform != Common::kPlatformSegaCD) {
 		_screen->loadFont(Screen::FID_6_FNT, "FONT6.FNT");
 		_screen->loadFont(Screen::FID_8_FNT, "FONT8.FNT");
@@ -582,7 +585,7 @@ void EoBCoreEngine::loadFonts() {
 
 	if (_flags.platform == Common::kPlatformFMTowns) {
 		_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, "FONT.DMP");
-	} else if (_flags.platform == Common::kPlatformPC98) {
+	} else if (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformPC98) {
 		_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, "FONT12.FNT");
 		_invFont1 = Screen::FID_SJIS_SMALL_FNT;
 		_conFont = _invFont3 = Screen::FID_SJIS_FNT;
diff --git a/engines/kyra/module.mk b/engines/kyra/module.mk
index 44f7e07a7a5..d4835218fa9 100644
--- a/engines/kyra/module.mk
+++ b/engines/kyra/module.mk
@@ -138,10 +138,12 @@ MODULE_OBJS += \
 	sequence/sequences_darkmoon.o \
 	sound/sound_amiga_eob.o \
 	sound/sound_pc98_eob.o \
+	sound/sound_pc98_darkmoon.o \
 	sound/sound_segacd_eob.o \
 	sound/sound_towns_darkmoon.o \
 	sound/drivers/audiomaster2.o \
 	sound/drivers/mlalf98.o \
+	sound/drivers/capcom98.o \
 	sound/drivers/pcspeaker_v1.o \
 	sound/drivers/segacd.o \
 	text/text_eob_segacd.o
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index b51b169e031..ca565e601d8 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -353,32 +353,20 @@ void DarkMoonEngine::seq_playIntro() {
 
 	// intro scroll
 	if (!skipFlag() && !shouldQuit()) {
-		if (_configRenderMode == Common::kRenderEGA) {
-			for (int i = 0; i < 35; i++) {
-				uint32 endtime = _system->getMillis() + 2 * _tickLength;
-				_screen->copyRegion(16, 8, 8, 8, 296, 128, 0, 0, Screen::CR_NO_P_CHECK);
-				_screen->copyRegion(i << 3, 0, 304, 8, 8, 128, 2, 0, Screen::CR_NO_P_CHECK);
-				_screen->updateScreen();
-				if (i == 12)
-					sq.animCommand(_flags.platform == Common::kPlatformPC98 ? 40 : 42);
-				else if (i == 25)
-					snd_playSoundEffect(11);
-				delayUntil(endtime);
-			}
-		} else {
-			for (int i = 0; i < 280; i += 3) {
-				uint32 endtime = _system->getMillis() + _tickLength;
-				_screen->copyRegion(11, 8, 8, 8, 301, 128, 0, 0, Screen::CR_NO_P_CHECK);
-				_screen->copyRegion(i, 0, 309, 8, 3, 128, 2, 0, Screen::CR_NO_P_CHECK);
-				_screen->updateScreen();
-				if (_flags.platform == Common::kPlatformAmiga) {
-					if (i == 4 || i == 24 || i == 36)
-						sq.animCommand(39);
-				} else if (i == 96) {
-					sq.animCommand(_flags.platform == Common::kPlatformPC98 ? 40 : 42);
-				}
-				delayUntil(endtime);
+		for (int i = 0; i < 280; ++i) {
+			uint32 endtime = _system->getMillis() + 18;
+			_screen->copyRegion(9, 8, 8, 8, 303, 128, 0, 0, Screen::CR_NO_P_CHECK);
+			_screen->copyRegion(i, 0, 311, 8, 1, 128, 2, 0, Screen::CR_NO_P_CHECK);
+			_screen->updateScreen();
+			if (_flags.platform == Common::kPlatformAmiga) {
+				if (i == 4 || i == 24 || i == 36)
+					sq.animCommand(39);
+			} else if (i == 96) {
+				sq.animCommand(_flags.platform == Common::kPlatformPC98 ? 40 : 42);
+			} else if (i == 200) {
+				snd_playSoundEffect(11);
 			}
+			delayUntil(endtime);
 		}
 	}
 
@@ -1792,9 +1780,11 @@ void DarkmoonSequenceHelper::delay(uint32 ticks) {
 void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim) {
 	if (_vm->gameFlags().platform == Common::kPlatformFMTowns)
 		index = _sndMarkersFMTowns[index - 1];
-	else if (_vm->sound()->getMusicType() != Sound::kAdLib)
+	else if (_vm->sound()->getMusicType() != Sound::kAdLib && _vm->gameFlags().platform != Common::kPlatformPC98)
 		return;
 
+	debug("waitForSongNotifier %d - waiting for trigger...", index);
+
 	int seq = 0;
 
 	while (_vm->sound()->musicEnabled() && _vm->sound()->checkTrigger() < index && !(_vm->skipFlag() || _vm->shouldQuit())) {
@@ -1808,6 +1798,8 @@ void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim
 
 		_vm->updateInput();
 	}
+
+	debug("waitForSongNotifier %d - ...finished", index);
 }
 
 void DarkmoonSequenceHelper::updateAmigaSound() {
diff --git a/engines/kyra/sound/drivers/capcom98.cpp b/engines/kyra/sound/drivers/capcom98.cpp
new file mode 100644
index 00000000000..b8600b54916
--- /dev/null
+++ b/engines/kyra/sound/drivers/capcom98.cpp
@@ -0,0 +1,54 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef ENABLE_EOB
+
+#include "kyra/sound/drivers/capcom98.h"
+
+namespace Kyra {
+
+class CapcomPC98AudioDriverInternal {
+public:
+	CapcomPC98AudioDriverInternal();
+	~CapcomPC98AudioDriverInternal();
+
+private:
+};
+
+CapcomPC98AudioDriverInternal::CapcomPC98AudioDriverInternal() {
+
+}
+
+CapcomPC98AudioDriverInternal::~CapcomPC98AudioDriverInternal() {
+
+}
+
+CapcomPC98AudioDriver::CapcomPC98AudioDriver() {
+
+}
+
+CapcomPC98AudioDriver::~CapcomPC98AudioDriver() {
+
+}
+
+} // End of namespace Kyra
+
+#endif
diff --git a/engines/kyra/sound/drivers/capcom98.h b/engines/kyra/sound/drivers/capcom98.h
new file mode 100644
index 00000000000..9da302435f7
--- /dev/null
+++ b/engines/kyra/sound/drivers/capcom98.h
@@ -0,0 +1,51 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef ENABLE_EOB
+
+#ifndef KYRA_SOUND_CAPCOM98_H
+#define KYRA_SOUND_CAPCOM98_H
+
+#include "common/scummsys.h"
+//#include "common/array.h"
+
+namespace Audio {
+	class Mixer;
+}
+
+namespace Kyra {
+
+class CapcomPC98AudioDriverInternal;
+
+class CapcomPC98AudioDriver {
+public:
+	CapcomPC98AudioDriver();
+	~CapcomPC98AudioDriver();
+
+private:
+	CapcomPC98AudioDriverInternal *_drv;
+};
+
+} // End of namespace Kyra
+
+#endif
+
+#endif
diff --git a/engines/kyra/sound/sound_intern.h b/engines/kyra/sound/sound_intern.h
index 47225fa0c52..6be2c35842d 100644
--- a/engines/kyra/sound/sound_intern.h
+++ b/engines/kyra/sound/sound_intern.h
@@ -533,6 +533,47 @@ private:
 	bool _ready;
 };
 
+class CapcomPC98AudioDriver;
+class SoundPC98_Darkmoon : public Sound {
+public:
+	SoundPC98_Darkmoon(KyraEngine_v1 *vm, MidiDriver::DeviceHandle dev, Audio::Mixer *mixer);
+	~SoundPC98_Darkmoon() override;
+
+	kType getMusicType() const override;
+
+	bool init() override;
+
+	void initAudioResourceInfo(int set, void *info) override;
+	void selectAudioResourceSet(int set) override;
+	bool hasSoundFile(uint file) const override { return true; }
+	void loadSoundFile(uint file) override {}
+	void loadSoundFile(Common::String name) override;
+
+	void playTrack(uint8 track) override;
+	void haltTrack() override;
+	bool isPlaying() const override;
+
+	void playSoundEffect(uint16 track, uint8 volume = 0xFF) override;
+	void stopAllSoundEffects() override;
+
+	void beginFadeOut() override;
+
+	void updateVolumeSettings() override;
+
+	int checkTrigger() override;
+
+	void resetTrigger() override;
+
+private:
+	KyraEngine_v1 *_vm;
+	CapcomPC98AudioDriver *_driver;
+
+	int _currentResourceSet;
+
+	kType _drvType;
+	bool _ready;
+};
+
 class SegaAudioDriver;
 class SoundSegaCD_EoB : public Sound {
 public:
diff --git a/engines/kyra/sound/sound_pc98_darkmoon.cpp b/engines/kyra/sound/sound_pc98_darkmoon.cpp
new file mode 100644
index 00000000000..20a3206df7b
--- /dev/null
+++ b/engines/kyra/sound/sound_pc98_darkmoon.cpp
@@ -0,0 +1,136 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef ENABLE_EOB
+
+#include "kyra/sound/sound_intern.h"
+#include "kyra/resource/resource.h"
+#include "kyra/sound/drivers/capcom98.h"
+
+#include "common/config-manager.h"
+
+namespace Kyra {
+
+SoundPC98_Darkmoon::SoundPC98_Darkmoon(KyraEngine_v1 *vm, MidiDriver::DeviceHandle dev, Audio::Mixer *mixer) : Sound(vm, mixer),
+	_vm(vm), _driver(0), _currentResourceSet(-1), _ready(false), _drvType(kPC98) {
+	MusicType type = MidiDriver::getMusicType(dev);
+	if (type == MT_MT32) {
+		_drvType = kMidiMT32;
+	} else if (type == MT_GM) {
+		_drvType = kMidiGM;
+	} else {
+
+	}
+}
+
+SoundPC98_Darkmoon::~SoundPC98_Darkmoon() {
+	delete _driver;
+}
+
+Sound::kType SoundPC98_Darkmoon::getMusicType() const {
+	return _drvType;
+}
+
+bool SoundPC98_Darkmoon::init() {
+	_driver = new CapcomPC98AudioDriver();
+	_ready = true;
+	return true;
+}
+
+void SoundPC98_Darkmoon::initAudioResourceInfo(int set, void *info) {
+	//delete _resInfo[set];
+	//_resInfo[set] = info ? new SoundResourceInfo_PC(*(SoundResourceInfo_PC*)info) : 0;
+}
+
+void SoundPC98_Darkmoon::selectAudioResourceSet(int set) {
+	if (set == _currentResourceSet || !_ready)
+		return;
+
+	//if (!_resInfo[set])
+	//	return;
+
+	_currentResourceSet = set;
+}
+
+void SoundPC98_Darkmoon::loadSoundFile(Common::String name) {
+	if (!_ready)
+		return;
+
+	//if (file >= _resInfo[_currentResourceSet]->fileListSize)
+	//	return;
+
+	//Common::SeekableReadStream *s = _vm->resource()->createReadStream(_resInfo[_currentResourceSet]->fileList[file]);
+	//_driver->loadMusicData(s);
+	//delete s;
+}
+
+void SoundPC98_Darkmoon::playTrack(uint8 track) {
+	if (!_musicEnabled || !_ready)
+		return;
+}
+
+void SoundPC98_Darkmoon::haltTrack() {
+	if (!_musicEnabled || !_ready)
+		return;
+	//playTrack(0);
+}
+
+bool SoundPC98_Darkmoon::isPlaying() const {
+	return false;
+}
+
+void SoundPC98_Darkmoon::playSoundEffect(uint16 track, uint8) {
+	if (!_sfxEnabled || !_ready || track >= 120)
+		return;
+	//_driver->startSoundEffect(track);
+}
+
+void SoundPC98_Darkmoon::stopAllSoundEffects() {
+
+}
+
+void SoundPC98_Darkmoon::beginFadeOut() {
+
+}
+
+int SoundPC98_Darkmoon::checkTrigger() {
+	return 99;
+}
+
+void SoundPC98_Darkmoon::resetTrigger() {
+
+}
+
+void SoundPC98_Darkmoon::updateVolumeSettings() {
+	if (!_driver || !_ready)
+		return;
+
+	bool mute = false;
+	if (ConfMan.hasKey("mute"))
+		mute = ConfMan.getBool("mute");
+
+	//_driver->setMusicVolume((mute ? 0 : ConfMan.getInt("music_volume")));
+	//_driver->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume")));
+}
+
+} // End of namespace Kyra
+
+#endif


Commit: 204b501841b16c5b58959110de1ea2e21ddfd99a
    https://github.com/scummvm/scummvm/commit/204b501841b16c5b58959110de1ea2e21ddfd99a
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:50:53+02:00

Commit Message:
KYRA: (EOB II/PC98) - fix intro and main menu text

Changed paths:
    engines/kyra/engine/darkmoon.cpp
    engines/kyra/sequence/sequences_darkmoon.cpp


diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index 656dc4cb9cd..52739af83c9 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -66,11 +66,14 @@ Common::Error DarkMoonEngine::init() {
 	_screen->loadPalette(_flags.platform == Common::kPlatformFMTowns ? "MENU.PAL" : "PALETTE.COL", _screen->getPalette(0));
 	_screen->setScreenPalette(_screen->getPalette(0));
 
+	// adjust menu settings for EOB II FM-Towns/PC-98 versions
 	if (_flags.platform == Common::kPlatformFMTowns) {
-		// adjust menu settings for EOB II FM-Towns
 		_screen->modifyScreenDim(6, 10, 100, 21, 40);
 		_screen->modifyScreenDim(27, 0, 0, 21, 2);
 		_vcnFilePattern = "%s.VCC";
+	} else if (_flags.platform == Common::kPlatformPC98) {
+		_screen->modifyScreenDim(6, 10, 100, 21, 40);
+		_screen->modifyScreenDim(27, 0, 0, 21, 5);
 	}
 
 	return Common::kNoError;
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index ca565e601d8..27bde4e02aa 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -1684,7 +1684,7 @@ void DarkmoonSequenceHelper::init(DarkmoonSequenceHelper::Mode mode) {
 
 	_screen->setScreenPalette(*_palettes[0]);
 	_prevFont = _screen->setFont(_vm->gameFlags().lang == Common::Language::ZH_TWN ? Screen::FID_CHINESE_FNT :
-				     _vm->gameFlags().platform == Common::kPlatformFMTowns ? Screen::FID_SJIS_LARGE_FNT : Screen::FID_8_FNT);
+				     _vm->gameFlags().platform == Common::kPlatformFMTowns ? Screen::FID_SJIS_LARGE_FNT : (_vm->gameFlags().platform == Common::kPlatformPC98 ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT));
 	_screen->hideMouse();
 
 	_vm->delay(150);
@@ -1783,8 +1783,6 @@ void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim
 	else if (_vm->sound()->getMusicType() != Sound::kAdLib && _vm->gameFlags().platform != Common::kPlatformPC98)
 		return;
 
-	debug("waitForSongNotifier %d - waiting for trigger...", index);
-
 	int seq = 0;
 
 	while (_vm->sound()->musicEnabled() && _vm->sound()->checkTrigger() < index && !(_vm->skipFlag() || _vm->shouldQuit())) {
@@ -1798,8 +1796,6 @@ void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim
 
 		_vm->updateInput();
 	}
-
-	debug("waitForSongNotifier %d - ...finished", index);
 }
 
 void DarkmoonSequenceHelper::updateAmigaSound() {


Commit: 99d8f6146c06714d7147e3227a0e04964e26c030
    https://github.com/scummvm/scummvm/commit/99d8f6146c06714d7147e3227a0e04964e26c030
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:50:56+02:00

Commit Message:
KYRA: (EOB II/PC98) - adapt file formats

(The quickstart party can now already be loaded)

Changed paths:
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/engine/scene_eob.cpp
    engines/kyra/gui/saveload.cpp


diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index aca804345e5..496ce020d6e 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -585,8 +585,8 @@ void EoBCoreEngine::loadFonts() {
 
 	if (_flags.platform == Common::kPlatformFMTowns) {
 		_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, "FONT.DMP");
-	} else if (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformPC98) {
-		_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, "FONT12.FNT");
+	} else if (_flags.platform == Common::kPlatformPC98) {
+		_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, _flags.gameID == GI_EOB1 ? "FONT12.FNT" : "FONT1206.FNT");
 		_invFont1 = Screen::FID_SJIS_SMALL_FNT;
 		_conFont = _invFont3 = Screen::FID_SJIS_FNT;
 	} else if (_flags.platform == Common::kPlatformSegaCD) {
diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp
index eb48b7ac3d5..57374139453 100644
--- a/engines/kyra/engine/scene_eob.cpp
+++ b/engines/kyra/engine/scene_eob.cpp
@@ -383,9 +383,13 @@ void EoBCoreEngine::loadBlockProperties(const char *mazFile) {
 }
 
 const uint8 *EoBCoreEngine::getBlockFileData(int) {
-	Common::SeekableReadStream *s = _res->createReadStream(_curBlockFile);
-	_screen->loadFileDataToPage(s, 15, s->size());
-	delete s;
+	if (_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformPC98) {
+		_screen->loadBitmap(_curBlockFile.c_str(), 15, 15, 0);
+	} else {
+		Common::SeekableReadStream *s = _res->createReadStream(_curBlockFile);
+		_screen->loadFileDataToPage(s, 15, s->size());
+		delete s;
+	}
 	return _screen->getCPagePtr(15);
 }
 
diff --git a/engines/kyra/gui/saveload.cpp b/engines/kyra/gui/saveload.cpp
index be322635fce..b7aa18fd89d 100644
--- a/engines/kyra/gui/saveload.cpp
+++ b/engines/kyra/gui/saveload.cpp
@@ -180,7 +180,7 @@ Common::SeekableReadStream *KyraEngine_v1::openSaveForReading(const char *filena
 
 		if (header.version < 2) {
 			warning("Make sure your savefile was from this version! (too old savefile version to detect that)");
-		} else {
+		} else if (checkID) {
 			if ((header.flags & GF_FLOPPY) && (_flags.isTalkie || _flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) {
 				warning("Can not load DOS Floppy savefile for this (non DOS Floppy) gameversion");
 				delete in;
@@ -189,7 +189,7 @@ Common::SeekableReadStream *KyraEngine_v1::openSaveForReading(const char *filena
 				warning("Can not load DOS CD-ROM savefile for this (non DOS CD-ROM) gameversion");
 				delete in;
 				return nullptr;
-			} else if (checkID && ((header.flags & GF_FMTOWNS) && !(_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98))) {
+			} else if ((header.flags & GF_FMTOWNS) && !(_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) {
 				warning("Can not load FM-TOWNS/PC98 savefile for this (non FM-TOWNS/PC98) gameversion");
 				delete in;
 				return nullptr;


Commit: 8d339d00df356b37a8cb6286632857d20c554851
    https://github.com/scummvm/scummvm/commit/8d339d00df356b37a8cb6286632857d20c554851
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:50:59+02:00

Commit Message:
KYRA: (EOB II/PC98) - font/layout fixes

Changed paths:
    engines/kyra/engine/chargen.cpp
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/engine/eobcommon.h
    engines/kyra/graphics/screen_eob.cpp
    engines/kyra/graphics/screen_eob.h
    engines/kyra/graphics/screen_eob_pc98.cpp
    engines/kyra/gui/gui_eob.cpp
    engines/kyra/gui/gui_eob.h
    engines/kyra/resource/staticres_eob.cpp


diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 8d9acc57664..704e032ba24 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -2086,7 +2086,7 @@ bool TransferPartyWiz::selectAndLoadTransferFile() {
 
 int TransferPartyWiz::selectCharactersMenu() {
 	_screen->setCurPage(2);
-	_screen->setFont(Screen::FID_6_FNT);
+	Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
 	_screen->clearCurPage();
 
 	_vm->gui_drawBox(0, 0, 320, 163, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
@@ -2166,7 +2166,7 @@ int TransferPartyWiz::selectCharactersMenu() {
 		_screen->updateScreen();
 
 		if (highlight == 6 || _vm->shouldQuit()) {
-			_screen->setFont(Screen::FID_8_FNT);
+			_screen->setFont(of);
 			return 0;
 		}
 
@@ -2184,7 +2184,7 @@ int TransferPartyWiz::selectCharactersMenu() {
 		_screen->updateScreen();
 	}
 
-	_screen->setFont(Screen::FID_8_FNT);
+	_screen->setFont(of);
 	if (_vm->shouldQuit())
 		return 0;
 	else
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 496ce020d6e..cc1f78ddb01 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -197,7 +197,7 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) : KyraRpgE
 	_buttonList3Size = _buttonList4Size = _buttonList5Size = _buttonList6Size = 0;
 	_buttonList7Size = _buttonList8Size = 0;
 	_inventorySlotsY = _mnDef = 0;
-	_invFont1 = _invFont2 = _conFont = Screen::FID_6_FNT;
+	_invFont1 = _invFont2 = _invFont4 = _conFont = _bookFont = Screen::FID_6_FNT;
 	_invFont3 = Screen::FID_8_FNT;
 	_transferStringsScummVM = 0;
 	_buttonDefs = 0;
@@ -578,6 +578,7 @@ void EoBCoreEngine::loadFonts() {
 	} else if (_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformPC98) {
 		_screen->loadFont(Screen::FID_6_FNT, "FONT6B.FNT");
 		_screen->loadFont(Screen::FID_8_FNT, "FONT8B.FNT");
+		_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, "FONT1206.FNT");
 	} else if (_flags.platform != Common::kPlatformSegaCD) {
 		_screen->loadFont(Screen::FID_6_FNT, "FONT6.FNT");
 		_screen->loadFont(Screen::FID_8_FNT, "FONT8.FNT");
@@ -586,13 +587,16 @@ void EoBCoreEngine::loadFonts() {
 	if (_flags.platform == Common::kPlatformFMTowns) {
 		_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, "FONT.DMP");
 	} else if (_flags.platform == Common::kPlatformPC98) {
-		_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, _flags.gameID == GI_EOB1 ? "FONT12.FNT" : "FONT1206.FNT");
-		_invFont1 = Screen::FID_SJIS_SMALL_FNT;
+		if (_flags.gameID == GI_EOB1) {
+			_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, "FONT12.FNT");
+			_invFont1 = _bookFont = Screen::FID_SJIS_SMALL_FNT;
+			_invFont4 = Screen::FID_SJIS_FNT;
+		}		
 		_conFont = _invFont3 = Screen::FID_SJIS_FNT;
 	} else if (_flags.platform == Common::kPlatformSegaCD) {
 		_screen->loadFont(Screen::FID_8_FNT, "FONTK12");
 		_screen->setFontStyles(Screen::FID_8_FNT, Font::kStyleNone);
-		_invFont1 = _invFont2 = _conFont = Screen::FID_8_FNT;
+		_invFont1 = _invFont2 = _invFont4 = _conFont = Screen::FID_8_FNT;
 	}
 
 	if (_flags.lang == Common::ZH_TWN) {
diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h
index df416df4feb..123c024eb1d 100644
--- a/engines/kyra/engine/eobcommon.h
+++ b/engines/kyra/engine/eobcommon.h
@@ -834,7 +834,9 @@ protected:
 	Screen::FontId _invFont1;
 	Screen::FontId _invFont2;
 	Screen::FontId _invFont3;
+	Screen::FontId _invFont4;
 	Screen::FontId _conFont;
+	Screen::FontId _bookFont;
 	const uint8 **_compassShapes;
 	uint8 _charExchangeSwap;
 	uint8 *_swapShape;
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index 39bdb50c0ea..beaec3772b6 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -1708,12 +1708,16 @@ bool Screen_EoB::loadFont(FontId fontId, const char *filename) {
 		fnt = nullptr;
 	}
 
-	if (fontId == FID_SJIS_SMALL_FNT) {
+	if (_vm->gameFlags().platform == Common::kPlatformPC98 && _vm->game() == GI_EOB2) {
+		// We use normal VGA rendering in EOB II, since we do the complete EGA dithering in updateScreen().
+		fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode, 12, 256, fontId == FID_SJIS_SMALL_FNT);
+	} else if (fontId == FID_SJIS_SMALL_FNT) {
 		if (_vm->gameFlags().platform == Common::kPlatformFMTowns)
 			fnt = new SJISFont12x12(_vm->staticres()->loadRawDataBe16(kEoB2FontDmpSearchTbl, temp));
-		else if (_vm->gameFlags().platform == Common::kPlatformPC98)
+		else if (_vm->gameFlags().platform == Common::kPlatformPC98) {
 			fnt = new Font12x12PC98(12, _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable1, temp),
 				_vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable2, temp), _vm->staticres()->loadRawData(kEoB1FontLookupTable, temp));
+		}
 	} else if (_isAmiga) {
 		fnt = new AmigaDOSFont(_vm->resource(), _vm->game() == GI_EOB2 && _vm->gameFlags().lang == Common::DE_DEU);
 	} else if (_isSegaCD) {
@@ -1728,7 +1732,7 @@ bool Screen_EoB::loadFont(FontId fontId, const char *filename) {
 		return true;
 	} else {
 		// We use normal VGA rendering in EOB II, since we do the complete EGA dithering in updateScreen().
-		fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode, 12);
+		fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode, 12, 128);
 	}
 
 	assert(fnt);
@@ -1977,7 +1981,7 @@ const uint8 Screen_EoB::_egaMatchTable[] = {
 uint16 *OldDOSFont::_cgaDitheringTable = 0;
 int OldDOSFont::_numRef = 0;
 
-OldDOSFont::OldDOSFont(Common::RenderMode mode, uint8 shadowColor) : _renderMode(mode), _shadowColor(shadowColor), _colorMap8bit(0), _colorMap16bit(0) {
+OldDOSFont::OldDOSFont(Common::RenderMode mode, uint8 shadowColor, uint16 numGlyphMax, bool useOverlay) : _renderMode(mode), _shadowColor(shadowColor), _numGlyphMax(numGlyphMax), _useOverlay(useOverlay), _colorMap8bit(0), _colorMap16bit(0) {
 	_data = 0;
 	_width = _height = _numGlyphs = 0;
 	_bitmapOffsets = 0;
@@ -2045,11 +2049,11 @@ bool OldDOSFont::load(Common::SeekableReadStream &file) {
 	if (file.size() - 2 != READ_LE_UINT16(_data))
 		return false;
 
-	_width = _data[0x103];
-	_height = _data[0x102];
+	_width = _data[_numGlyphMax * 2 + 3];
+	_height = _data[_numGlyphMax * 2 + 2];
 	_numGlyphs = (READ_LE_UINT16(_data + 2) / 2) - 2;
 
-	_bitmapOffsets = (uint16 *)(_data + 2);
+	_bitmapOffsets = (uint16*)(_data + 2);
 
 	for (int i = 0; i < _numGlyphs; ++i)
 		_bitmapOffsets[i] = READ_LE_UINT16(&_bitmapOffsets[i]);
diff --git a/engines/kyra/graphics/screen_eob.h b/engines/kyra/graphics/screen_eob.h
index 00c618e8527..4f7fc8efcf5 100644
--- a/engines/kyra/graphics/screen_eob.h
+++ b/engines/kyra/graphics/screen_eob.h
@@ -262,7 +262,7 @@ private:
 */
 class OldDOSFont : public Font {
 public:
-	OldDOSFont(Common::RenderMode mode, uint8 shadowColor);
+	OldDOSFont(Common::RenderMode mode, uint8 shadowColor, uint16 _numGlyphMax, bool _useOverlay = false);
 	~OldDOSFont() override;
 
 	bool load(Common::SeekableReadStream &file) override;
@@ -270,6 +270,7 @@ public:
 	Type getType() const override { return kASCII; }
 	int getHeight() const override { return _height; }
 	int getWidth() const override { return _width; }
+	bool usesOverlay() const override { return _useOverlay; }
 	int getCharWidth(uint16 c) const override;
 	void setColorMap(const uint8 *src) override;
 	void set16bitColorMap(const uint16 *src) override { _colorMap16bit = src; }
@@ -293,6 +294,9 @@ private:
 	Common::RenderMode _renderMode;
 	const uint16 *_colorMap16bit;
 
+	const uint16 _numGlyphMax;
+	const bool _useOverlay;
+
 	static uint16 *_cgaDitheringTable;
 	static int _numRef;
 };
diff --git a/engines/kyra/graphics/screen_eob_pc98.cpp b/engines/kyra/graphics/screen_eob_pc98.cpp
index 179ad900199..9d4f441b1dc 100644
--- a/engines/kyra/graphics/screen_eob_pc98.cpp
+++ b/engines/kyra/graphics/screen_eob_pc98.cpp
@@ -209,7 +209,7 @@ uint16 SJISFontEoB1PC98::convert(uint16 c) const {
 	return c;
 }
 
-Font12x12PC98::Font12x12PC98(uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2, const uint8 *lookupTable) : OldDOSFont(Common::kRenderDefault, 12),
+Font12x12PC98::Font12x12PC98(uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2, const uint8 *lookupTable) : OldDOSFont(Common::kRenderDefault, 12, 0),
 _convTable1(convTable1), _convTable2(convTable2) {
 	assert(convTable1);
 	assert(convTable2);
diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index 06b637b00a6..8b504b79ed2 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -218,8 +218,9 @@ void EoBCoreEngine::gui_drawCharPortraitWithStats(int index, bool screenUpdt) {
 			_screen->updateScreen();
 
 		} else {
-			_screen->setFont(cf);
+			_screen->setFont(_invFont4);
 			gui_drawCharacterStatsPage();
+			_screen->setFont(cf);
 		}
 
 		_screen->_curPage = 0;
@@ -650,7 +651,7 @@ void EoBCoreEngine::gui_drawSpellbook() {
 	int numTab = (_flags.gameID == GI_EOB1) ? 5 : 6;
 	_screen->copyRegion(64, 121, 64, 121, 112, 56, 0, 2, Screen::CR_NO_P_CHECK);
 
-	Screen::FontId of = (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformPC98) ? _screen->setFont(Screen::FID_SJIS_SMALL_FNT) : _screen->_currentFont;
+	Screen::FontId of = _screen->setFont(_bookFont);
 
 	for (int i = 0; i < numTab; i++) {
 		int col1 = 0;
@@ -1512,9 +1513,10 @@ void EoBCoreEngine::gui_processInventorySlotClick(int slot) {
 	}
 }
 
-GUI_EoB::GUI_EoB(EoBCoreEngine *vm) : GUI(vm), _vm(vm), _screen(vm->_screen), _numSlotsVisible(vm->gameFlags().platform == Common::kPlatformSegaCD ? 5 : 6) {
-	_menuStringsPrefsTemp = new char*[4]();
+GUI_EoB::GUI_EoB(EoBCoreEngine *vm) : GUI(vm), _vm(vm), _screen(vm->_screen), _numSlotsVisible(vm->gameFlags().platform == Common::kPlatformSegaCD ? 5 : 6),
+	_menuFont(_vm->gameFlags().platform == Common::kPlatformPC98 ? Screen::FID_SJIS_FNT : (_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FID_CHINESE_FNT : Screen::FID_8_FNT)) {
 
+	_menuStringsPrefsTemp = new char*[4]();
 	_saveSlotStringsTemp = new char*[6];
 	for (int i = 0; i < 6; i++) {
 		_saveSlotStringsTemp[i] = new char[52]();
@@ -2303,7 +2305,7 @@ void GUI_EoB::simpleMenu_flashSelection(const char *str, int x, int y, int color
 }
 
 void GUI_EoB::runCampMenu() {
-	Screen::FontId of = _screen->setFont(_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FID_CHINESE_FNT : _vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
+	Screen::FontId of = _screen->setFont(_menuFont);
 
 	Button *highlightButton = 0;
 	Button *prevHighlightButton = 0;
@@ -2633,7 +2635,7 @@ bool GUI_EoB::runLoadMenu(int x, int y, bool fromMainMenu) {
 
 bool GUI_EoB::confirmDialogue2(int dim, int id, int deflt) {
 	int od = _screen->curDimIndex();
-	Screen::FontId of = _screen->setFont(_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FontId::FID_CHINESE_FNT : _vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
+	Screen::FontId of = _screen->setFont(_menuFont);
 	_screen->setScreenDim(dim);
 
 	drawTextBox(dim, id);
@@ -2702,7 +2704,7 @@ bool GUI_EoB::confirmDialogue2(int dim, int id, int deflt) {
 void GUI_EoB::messageDialogue(int dim, int id, int buttonTextCol) {
 	int od = _screen->curDimIndex();
 	_screen->setScreenDim(dim);
-	Screen::FontId of = _screen->setFont(_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FontId::FID_CHINESE_FNT : _vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
+	Screen::FontId of = _screen->setFont(_menuFont);
 
 	drawTextBox(dim, id);
 	const ScreenDim *dm = _screen->getScreenDim(dim);
diff --git a/engines/kyra/gui/gui_eob.h b/engines/kyra/gui/gui_eob.h
index b9cce3bbee6..8f42fce5d50 100644
--- a/engines/kyra/gui/gui_eob.h
+++ b/engines/kyra/gui/gui_eob.h
@@ -174,6 +174,8 @@ private:
 	const uint8 *_highLightColorTable;
 	uint32 _highLightBoxTimer;
 
+	const Screen::FontId _menuFont;
+
 	const EoBRect16 *_highlightFrames;
 	static const EoBRect16 _highlightFramesDefault[];
 	static const uint8 _highlightColorTableVGA[];
diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index 3ef199dd230..63d8de46380 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -1876,6 +1876,13 @@ void DarkMoonEngine::initStaticResource() {
 			"Escoge Fichero",
 			"\r\r   Un momento\r   por favor..."
 		},
+		{
+			"\x82""d""\x82""n""\x82""a""\x82""h""\x82\xcc\x83""f""\x81""[""\x83""^""\x81""iEOBDATA.SAV""\x81""j""\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81""B""\x83""J""\x83\x8c\x83\x93\x83""g""\x83""f""\x83""B""\x83\x8c\x83""N""\x83""g""\x83\x8a\x82\xc9\x93""]""\x91\x97\x82\xb5\x82\xc4\x82\xa9\x82\xe7\x8e\xc0\x8d""s""\x82\xb5\x82\xc4\x89\xba\x82\xb3\x82\xa2\x81""B",
+			"\x83\x51\x81\x5B\x83\x80\x82\x68\x82\x63",
+			"\x82""d""\x82""n""\x82""a""\x82""h""\x82\xcc\x83""f""\x81""[""\x83""^""\x81""iEOBDATA.SAV""\x81""j""\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81""B""\x83""J""\x83\x8c\x83\x93\x83""g""\x83""f""\x83""B""\x83\x8c\x83""N""\x83""g""\x83\x8a\x82\xc9\x93""]""\x91\x97\x82\xb5\x82\xc4\x82\xa9\x82\xe7\x8e\xc0\x8d""s""\x82\xb5\x82\xc4\x89\xba\x82\xb3\x82\xa2\x81""B",
+			"\x83\x51\x81\x5B\x83\x80\x82\xf0\x91\x49\x82\xf1\x82\xc5\x89\xba\x82\xb3\x82\xa2\x81\x42",
+			"\r\r   \x82\xa8\x91\xd2\x82\xbF\x89\xba\x82\xb3\x82\xa2\x81""E""\x81""E""\x81""E"
+		}
 	};
 
 	switch(_flags.lang) {
@@ -1892,6 +1899,7 @@ void DarkMoonEngine::initStaticResource() {
 			_errorSlotNoNameString = errorSlotNoNameString[2];
 			_transferStringsScummVM = transferStringsScummVM[2];
 			break;
+		case Common::JA_JPN:
 		case Common::ZH_TWN:
 			_errorSlotNoNameString = errorSlotNoNameString[3];
 			_transferStringsScummVM = transferStringsScummVM[0];


Commit: 6ae5b0d6b39b1715de2ed41041a3e9f4960a913e
    https://github.com/scummvm/scummvm/commit/6ae5b0d6b39b1715de2ed41041a3e9f4960a913e
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:51:03+02:00

Commit Message:
KYRA: (EOB II/PC98) - more work on the text display

Changed paths:
    engines/kyra/engine/darkmoon.cpp
    engines/kyra/engine/darkmoon.h
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/engine/kyra_rpg.cpp
    engines/kyra/graphics/screen_eob.cpp
    engines/kyra/graphics/screen_eob.h
    engines/kyra/graphics/screen_eob_pc98.cpp
    engines/kyra/gui/gui_eob.cpp
    engines/kyra/gui/gui_eob.h
    engines/kyra/resource/resource.h
    engines/kyra/resource/staticres_eob.cpp
    engines/kyra/text/text_rpg.cpp


diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index 52739af83c9..e5ade431083 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -776,6 +776,8 @@ const KyraRpgGUISettings *DarkMoonEngine::guiSettings() const {
 		return &_guiSettingsAmiga;
 	else if (_flags.platform == Common::kPlatformFMTowns)
 		return &_guiSettingsFMTowns;
+	else if (_flags.platform == Common::kPlatformPC98)
+		return &_guiSettingsPC98;
 	else
 		return &_guiSettingsDOS;
 }
diff --git a/engines/kyra/engine/darkmoon.h b/engines/kyra/engine/darkmoon.h
index ed8c2b9631b..bc271ad06a4 100644
--- a/engines/kyra/engine/darkmoon.h
+++ b/engines/kyra/engine/darkmoon.h
@@ -148,6 +148,7 @@ private:
 
 	static const KyraRpgGUISettings _guiSettingsDOS;
 	static const KyraRpgGUISettings _guiSettingsFMTowns;
+	static const KyraRpgGUISettings _guiSettingsPC98;
 	static const KyraRpgGUISettings _guiSettingsAmiga;
 	static const uint8 _egaDefaultPalette[];
 };
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index cc1f78ddb01..b655d7e89d1 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -589,10 +589,11 @@ void EoBCoreEngine::loadFonts() {
 	} else if (_flags.platform == Common::kPlatformPC98) {
 		if (_flags.gameID == GI_EOB1) {
 			_screen->loadFont(Screen::FID_SJIS_SMALL_FNT, "FONT12.FNT");
-			_invFont1 = _bookFont = Screen::FID_SJIS_SMALL_FNT;
+			_bookFont = Screen::FID_SJIS_SMALL_FNT;
 			_invFont4 = Screen::FID_SJIS_FNT;
 		}		
 		_conFont = _invFont3 = Screen::FID_SJIS_FNT;
+		_invFont1 = Screen::FID_SJIS_SMALL_FNT;
 	} else if (_flags.platform == Common::kPlatformSegaCD) {
 		_screen->loadFont(Screen::FID_8_FNT, "FONTK12");
 		_screen->setFontStyles(Screen::FID_8_FNT, Font::kStyleNone);
diff --git a/engines/kyra/engine/kyra_rpg.cpp b/engines/kyra/engine/kyra_rpg.cpp
index 011e6fda42a..f43e1339450 100644
--- a/engines/kyra/engine/kyra_rpg.cpp
+++ b/engines/kyra/engine/kyra_rpg.cpp
@@ -143,7 +143,7 @@ KyraRpgEngine::KyraRpgEngine(OSystem *system, const GameFlags &flags) : KyraEngi
 	}
 
 	_buttonFont = Screen::FID_6_FNT;
-	if (_flags.use16ColorMode)
+	if (_flags.platform == Common::kPlatformPC98)
 		_buttonFont = _flags.gameID == GI_LOL ? Screen::FID_SJIS_TEXTMODE_FNT : Screen::FID_SJIS_FNT;
 	else if (_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformFMTowns)
 		_buttonFont = Screen::FID_8_FNT;
@@ -252,6 +252,7 @@ bool KyraRpgEngine::posWithinRect(int posX, int posY, int x1, int y1, int x2, in
 void KyraRpgEngine::drawDialogueButtons() {
 	int cp = screen()->setCurPage(0);
 	Screen::FontId of = screen()->setFont(_buttonFont);
+	int cs = (_flags.platform == Common::kPlatformPC98 && !_flags.use16ColorMode) ? screen()->setFontStyles(_buttonFont, Font::kStyleFat) : -1;
 
 	for (int i = 0; i < _dialogueNumButtons; i++) {
 		int x = _dialogueButtonPosX[i];
@@ -270,6 +271,8 @@ void KyraRpgEngine::drawDialogueButtons() {
 			                    (_dialogueButtonYoffs + _dialogueButtonPosY[i]) + yOffset, _dialogueHighlightedButton == i ? _dialogueButtonLabelColor1 : _dialogueButtonLabelColor2, 0);
 		}
 	}
+	if (cs != -1)
+		screen()->setFontStyles(_buttonFont, cs);
 	screen()->setFont(of);
 	screen()->setCurPage(cp);
 }
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index beaec3772b6..a766b4f0472 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -304,7 +304,7 @@ void Screen_EoB::loadFileDataToPage(Common::SeekableReadStream *s, int pageNum,
 void Screen_EoB::printShadedText(const char *string, int x, int y, int col1, int col2, int shadowCol, int pitch) {
 	if (_isSegaCD && shadowCol) {
 		printText(string, x + 1, y + 1, shadowCol, 0, pitch);
-	} else if (!_isSegaCD && _vm->gameFlags().lang != Common::JA_JPN) {
+	} else if (!_isSegaCD && !_use16ColorMode && !_useHiColorScreen && (_fonts[_currentFont]->getType() == Font::kASCII || _fonts[_currentFont]->getType() == Font::kBIG5)) {
 		printText(string, x - 1, y, shadowCol, col2);
 		printText(string, x, y + 1, shadowCol, 0);
 		printText(string, x - 1, y + 1, shadowCol, 0);
@@ -1709,12 +1709,14 @@ bool Screen_EoB::loadFont(FontId fontId, const char *filename) {
 	}
 
 	if (_vm->gameFlags().platform == Common::kPlatformPC98 && _vm->game() == GI_EOB2) {
-		// We use normal VGA rendering in EOB II, since we do the complete EGA dithering in updateScreen().
-		fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode, 12, 256, fontId == FID_SJIS_SMALL_FNT);
+		if (fontId == FID_SJIS_SMALL_FNT)
+			fnt = new PC98Font(12, true, 2, _vm->staticres()->loadRawData(kEoB2FontConvertTbl, temp));
+		else
+			fnt = new PC98Font(12, false, 1);
 	} else if (fontId == FID_SJIS_SMALL_FNT) {
-		if (_vm->gameFlags().platform == Common::kPlatformFMTowns)
-			fnt = new SJISFont12x12(_vm->staticres()->loadRawDataBe16(kEoB2FontDmpSearchTbl, temp));
-		else if (_vm->gameFlags().platform == Common::kPlatformPC98) {
+		if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
+			fnt = new SJISFont12x12(_vm->staticres()->loadRawDataBe16(kEoB2FontLookupTbl, temp));
+		} else if (_vm->gameFlags().platform == Common::kPlatformPC98) {
 			fnt = new Font12x12PC98(12, _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable1, temp),
 				_vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable2, temp), _vm->staticres()->loadRawData(kEoB1FontLookupTable, temp));
 		}
@@ -1732,7 +1734,7 @@ bool Screen_EoB::loadFont(FontId fontId, const char *filename) {
 		return true;
 	} else {
 		// We use normal VGA rendering in EOB II, since we do the complete EGA dithering in updateScreen().
-		fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode, 12, 128);
+		fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode, 12);
 	}
 
 	assert(fnt);
@@ -1981,7 +1983,7 @@ const uint8 Screen_EoB::_egaMatchTable[] = {
 uint16 *OldDOSFont::_cgaDitheringTable = 0;
 int OldDOSFont::_numRef = 0;
 
-OldDOSFont::OldDOSFont(Common::RenderMode mode, uint8 shadowColor, uint16 numGlyphMax, bool useOverlay) : _renderMode(mode), _shadowColor(shadowColor), _numGlyphMax(numGlyphMax), _useOverlay(useOverlay), _colorMap8bit(0), _colorMap16bit(0) {
+OldDOSFont::OldDOSFont(Common::RenderMode mode, uint8 shadowColor) : _renderMode(mode), _shadowColor(shadowColor), _numGlyphsMax(128), _useOverlay(false), _scaleV(1), _colorMap8bit(0), _colorMap16bit(0) {
 	_data = 0;
 	_width = _height = _numGlyphs = 0;
 	_bitmapOffsets = 0;
@@ -2049,8 +2051,8 @@ bool OldDOSFont::load(Common::SeekableReadStream &file) {
 	if (file.size() - 2 != READ_LE_UINT16(_data))
 		return false;
 
-	_width = _data[_numGlyphMax * 2 + 3];
-	_height = _data[_numGlyphMax * 2 + 2];
+	_width = _data[_numGlyphsMax * 2 + 3];
+	_height = _data[_numGlyphsMax * 2 + 2];
 	_numGlyphs = (READ_LE_UINT16(_data + 2) / 2) - 2;
 
 	_bitmapOffsets = (uint16*)(_data + 2);
@@ -2078,9 +2080,13 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch, int bpp) const {
 	uint16 color2 = _colorMap8bit[0];
 
 	if (_style == kStyleLeftShadow) {
-		drawCharIntern(c, dst + pitch, pitch, 1, _shadowColor, 0);
-		drawCharIntern(c, dst - 1, pitch, 1, _shadowColor, 0);
-		drawCharIntern(c, dst - 1 + pitch, pitch, 1, _shadowColor, 0);
+		byte *dst2 = dst;
+		for (int i = 0; i < _scaleV; ++i) {
+			drawCharIntern(c, dst2 + pitch * _scaleV, pitch * _scaleV, 1, _shadowColor, 0);
+			drawCharIntern(c, dst2 - 1, pitch * _scaleV, 1, _shadowColor, 0);
+			drawCharIntern(c, dst2 - 1 + pitch * _scaleV, pitch * _scaleV, 1, _shadowColor, 0);
+			dst2 += pitch;
+		}
 	}
 
 	if (bpp == 2) {
@@ -2088,7 +2094,10 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch, int bpp) const {
 		color2 = _colorMap16bit[0];
 	}
 
-	drawCharIntern(c, dst, pitch, bpp, color1, color2);
+	for (int i = 0; i < _scaleV; ++i) {
+		drawCharIntern(c, dst, pitch * _scaleV, bpp, color1, color2);
+		dst += pitch;
+	}
 }
 
 void OldDOSFont::drawCharIntern(uint16 c, byte *dst, int pitch, int bpp, int col1, int col2) const {
diff --git a/engines/kyra/graphics/screen_eob.h b/engines/kyra/graphics/screen_eob.h
index 4f7fc8efcf5..58caa6c7f59 100644
--- a/engines/kyra/graphics/screen_eob.h
+++ b/engines/kyra/graphics/screen_eob.h
@@ -262,7 +262,7 @@ private:
 */
 class OldDOSFont : public Font {
 public:
-	OldDOSFont(Common::RenderMode mode, uint8 shadowColor, uint16 _numGlyphMax, bool _useOverlay = false);
+	OldDOSFont(Common::RenderMode mode, uint8 shadowColor);
 	~OldDOSFont() override;
 
 	bool load(Common::SeekableReadStream &file) override;
@@ -288,15 +288,16 @@ protected:
 	int _numGlyphs;
 	uint8 _shadowColor;
 
+	uint16 _numGlyphsMax;
+	bool _useOverlay;
+	int _scaleV;
+
 private:
 	void drawCharIntern(uint16 c, byte *dst, int pitch, int bpp, int col1, int col2) const;
 	virtual uint16 convert(uint16 c) const;
 	Common::RenderMode _renderMode;
 	const uint16 *_colorMap16bit;
 
-	const uint16 _numGlyphMax;
-	const bool _useOverlay;
-
 	static uint16 *_cgaDitheringTable;
 	static int _numRef;
 };
@@ -387,7 +388,6 @@ private:
 	uint16 convert(uint16 c) const;
 	const uint16 *_convTable1, *_convTable2;
 	bool _defaultConv;
-	/*uint8 _shadowColor;*/
 };
 
 /**
@@ -411,6 +411,27 @@ private:
 	uint16 *_bmpOffs;
 };
 
+/**
+* OldDOSFont variant used in EOB II PC-98. It uses the same drawing routine, but supports weird vertical scaling, can be drawn
+* on the SJIS overlay and has some character conversion.
+*/
+class PC98Font : public OldDOSFont {
+public:
+	PC98Font(uint8 shadowColor, bool useOverlay, int scaleV, const uint8 *convTable = 0);
+	~PC98Font() override {}
+	bool load(Common::SeekableReadStream &file) override;
+	int getHeight() const override { return _outputHeight; }
+	int getWidth() const override { return _outputWidth; }
+	int getCharWidth(uint16 c) const override { return _outputWidth; };
+
+private:
+	uint16 convert(uint16 c) const override;
+	const uint8 *_convTable;
+
+	int _outputHeight;
+	int _outputWidth;
+};
+
 /**
 * SJIS Font variant used in the intro and outro of EOB II FM-Towns. It appears twice as large, since it is not rendered on the hires overlay pages.
 */
diff --git a/engines/kyra/graphics/screen_eob_pc98.cpp b/engines/kyra/graphics/screen_eob_pc98.cpp
index 9d4f441b1dc..b8eb3c388c8 100644
--- a/engines/kyra/graphics/screen_eob_pc98.cpp
+++ b/engines/kyra/graphics/screen_eob_pc98.cpp
@@ -209,8 +209,7 @@ uint16 SJISFontEoB1PC98::convert(uint16 c) const {
 	return c;
 }
 
-Font12x12PC98::Font12x12PC98(uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2, const uint8 *lookupTable) : OldDOSFont(Common::kRenderDefault, 12, 0),
-_convTable1(convTable1), _convTable2(convTable2) {
+Font12x12PC98::Font12x12PC98(uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2, const uint8 *lookupTable) : OldDOSFont(Common::kRenderDefault, 12), _convTable1(convTable1), _convTable2(convTable2) {
 	assert(convTable1);
 	assert(convTable2);
 	assert(lookupTable);
@@ -251,17 +250,15 @@ uint16 Font12x12PC98::convert(uint16 c) const {
 		c = _convTable2[l - 32];
 	} else if (l > 160 && l < 225) {
 		bool done = false;
-		if (1) {
-			if (h == 0xDE) {
-				if ((l >= 182 && l <= 196) || (l >= 202 && l <= 206)) {
-					c = _convTable1[l - 182];
-					done = true;
-				}
-			} else if (h == 0xDF) {
-				if (l >= 202 && l <= 206) {
-					c = _convTable1[l - 177];
-					done = true;
-				}
+		if (h == 0xDE) {
+			if ((l >= 182 && l <= 196) || (l >= 202 && l <= 206)) {
+				c = _convTable1[l - 182];
+				done = true;
+			}
+		} else if (h == 0xDF) {
+			if (l >= 202 && l <= 206) {
+				c = _convTable1[l - 177];
+				done = true;
 			}
 		}
 		if (!done)
@@ -283,6 +280,32 @@ uint16 Font12x12PC98::convert(uint16 c) const {
 	return c;
 }
 
+PC98Font::PC98Font(uint8 shadowColor, bool useOverlay, int scaleV, const uint8 *convTable) : OldDOSFont(Common::kRenderVGA, shadowColor), _convTable(convTable), _outputWidth(0), _outputHeight(0) {
+	_numGlyphsMax = 256;
+	_useOverlay = useOverlay;
+	_scaleV = scaleV;
+
+}
+
+bool PC98Font::load(Common::SeekableReadStream &file) {
+	bool res = OldDOSFont::load(file);
+
+	_outputWidth = _width;
+	_outputHeight = _height * _scaleV;
+
+	if (_useOverlay) {
+		_outputWidth >>= 1;
+		_outputHeight >>= 1;
+	}
+
+	return res;
+}
+
+uint16 PC98Font::convert(uint16 c) const {
+
+	return c;
+}
+
 } // End of namespace Kyra
 
 #endif // ENABLE_EOB
diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index 8b504b79ed2..035175bb40d 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -1514,7 +1514,8 @@ void EoBCoreEngine::gui_processInventorySlotClick(int slot) {
 }
 
 GUI_EoB::GUI_EoB(EoBCoreEngine *vm) : GUI(vm), _vm(vm), _screen(vm->_screen), _numSlotsVisible(vm->gameFlags().platform == Common::kPlatformSegaCD ? 5 : 6),
-	_menuFont(_vm->gameFlags().platform == Common::kPlatformPC98 ? Screen::FID_SJIS_FNT : (_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FID_CHINESE_FNT : Screen::FID_8_FNT)) {
+	_menuFont(_vm->gameFlags().platform == Common::kPlatformPC98 ? Screen::FID_SJIS_FNT : (_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FID_CHINESE_FNT : Screen::FID_8_FNT)),
+	_menuFont2(_vm->gameFlags().use16ColorMode ? Screen::FID_SJIS_FNT : (_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FID_CHINESE_FNT : Screen::FID_8_FNT)) {
 
 	_menuStringsPrefsTemp = new char*[4]();
 	_saveSlotStringsTemp = new char*[6];
@@ -2306,6 +2307,7 @@ void GUI_EoB::simpleMenu_flashSelection(const char *str, int x, int y, int color
 
 void GUI_EoB::runCampMenu() {
 	Screen::FontId of = _screen->setFont(_menuFont);
+	int cs = (_vm->gameFlags().platform == Common::kPlatformPC98 && !_vm->gameFlags().use16ColorMode) ? _screen->setFontStyles(_menuFont, Font::kStyleFat) : -1;
 
 	Button *highlightButton = 0;
 	Button *prevHighlightButton = 0;
@@ -2589,6 +2591,9 @@ void GUI_EoB::runCampMenu() {
 		}
 	}
 
+	if (cs != -1)
+		_screen->setFontStyles(_menuFont, cs);
+
 	_screen->setFont(of);
 	releaseButtons(buttonList);
 	_vm->writeSettings();
@@ -2636,6 +2641,8 @@ bool GUI_EoB::runLoadMenu(int x, int y, bool fromMainMenu) {
 bool GUI_EoB::confirmDialogue2(int dim, int id, int deflt) {
 	int od = _screen->curDimIndex();
 	Screen::FontId of = _screen->setFont(_menuFont);
+	int cs = (_vm->gameFlags().platform == Common::kPlatformPC98 && !_vm->gameFlags().use16ColorMode) ? _screen->setFontStyles(_menuFont, Font::kStyleFat) : -1;
+
 	_screen->setScreenDim(dim);
 
 	drawTextBox(dim, id);
@@ -2695,6 +2702,10 @@ bool GUI_EoB::confirmDialogue2(int dim, int id, int deflt) {
 	_screen->updateScreen();
 
 	_screen->copyRegion(0, _screen->_curDim->h, _screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->w << 3, _screen->_curDim->h, 2, 0, Screen::CR_NO_P_CHECK);
+
+	if (cs != -1)
+		_screen->setFontStyles(_menuFont, cs);
+
 	_screen->setFont(of);
 	_screen->setScreenDim(od);
 
@@ -2705,6 +2716,7 @@ void GUI_EoB::messageDialogue(int dim, int id, int buttonTextCol) {
 	int od = _screen->curDimIndex();
 	_screen->setScreenDim(dim);
 	Screen::FontId of = _screen->setFont(_menuFont);
+	int cs = (_vm->gameFlags().platform == Common::kPlatformPC98 && !_vm->gameFlags().use16ColorMode) ? _screen->setFontStyles(_menuFont, Font::kStyleFat) : -1;
 
 	drawTextBox(dim, id);
 	const ScreenDim *dm = _screen->getScreenDim(dim);
@@ -2742,6 +2754,10 @@ void GUI_EoB::messageDialogue(int dim, int id, int buttonTextCol) {
 
 	_screen->copyRegion(0, dm->h, dm->sx << 3, dm->sy, dm->w << 3, dm->h, 2, 0, Screen::CR_NO_P_CHECK);
 	_screen->setScreenDim(od);
+
+	if (cs != -1)
+		_screen->setFontStyles(_menuFont, cs);
+
 	_screen->setFont(of);
 	dm = _screen->getScreenDim(dim);
 }
@@ -4183,7 +4199,7 @@ void GUI_EoB::printScribeScrollSpellString(const int16 *menuItems, int id, bool
 
 bool GUI_EoB::confirmDialogue(int id) {
 	int od = _screen->curDimIndex();
-	Screen::FontId of = _screen->setFont(_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FontId::FID_CHINESE_FNT : _vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
+	Screen::FontId of = _screen->setFont(_menuFont);
 
 	Button *buttonList = initMenu(5);
 
@@ -4406,13 +4422,18 @@ int GUI_EoB::selectCharacterDialogue(int id) {
 void GUI_EoB::displayTextBox(int id, int, bool) {
 	int op = _screen->setCurPage(2);
 	int od = _screen->curDimIndex();
-	Screen::FontId of = _screen->setFont(_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FontId::FID_CHINESE_FNT : _vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
+	Screen::FontId of = _screen->setFont(_menuFont);
 	_screen->setClearScreenDim(11);
 	const ScreenDim *dm = _screen->getScreenDim(11);
 
 	drawMenuButtonBox(dm->sx << 3, dm->sy, dm->w << 3, dm->h, false, false);
 	_screen->setTextMarginRight((dm->sx + dm->w) << 3);
-	_screen->printShadedText(getMenuString(id), (dm->sx << 3) + 5, dm->sy + 5, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
+
+	Common::Point txtPos((dm->sx << 3) + 5, dm->sy + 5);
+	if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98)
+		txtPos = Common::Point(dm->sx << 3, (dm->sy + 16) & ~7);
+
+	_screen->printShadedText(getMenuString(id), txtPos.x, txtPos.y, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
 	_screen->setTextMarginRight(Screen::SCREEN_W);
 	_screen->copyRegion(dm->sx << 3, dm->sy, dm->sx << 3, dm->sy, dm->w << 3, dm->h, 2, 0, Screen::CR_NO_P_CHECK);
 	_screen->updateScreen();
@@ -4617,13 +4638,14 @@ void GUI_EoB::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int sp
 	int h = _vm->_flags.lang == Common::ZH_TWN ? 15 : 8;
 	int col1 = (_vm->_configRenderMode == Common::kRenderCGA) ? 1 : _vm->guiSettings()->colors.guiColorWhite;
 	_screen->set16bitShadingLevel(4);
+	Screen::FontId of = _screen->setFont(_menuFont2);
 
-	if (!spellId || _vm->_flags.lang == Common::ZH_TWN)
+	if (!spellId || (_vm->_flags.lang == Common::ZH_TWN && !noFill))
 		_screen->fillRect(x2, y, x1 + w, y + h,  _vm->guiSettings()->colors.fill);
 
 	if (spellId) {
 		Common::String s;
-		if (_vm->_flags.lang == Common::JA_JPN) {
+		if (_vm->_flags.use16ColorMode || _vm->_flags.useHiColorMode) {
 			s = spellType ? _vm->_clericSpellList[spellId] : _vm->_mageSpellList[spellId];
 			for (int i = s.size() >> 1; i < 17; ++i)
 				s.insertChar(' ', s.size());
@@ -4638,6 +4660,7 @@ void GUI_EoB::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int sp
 			_screen->printShadedText(s.c_str(), x1, y, highLight ? _vm->guiSettings()->colors.guiColorLightRed : col1, _vm->guiSettings()->colors.fill, _vm->guiSettings()->colors.guiColorBlack);
 	}
 
+	_screen->setFont(of);
 	_screen->set16bitShadingLevel(0);
 }
 
@@ -4783,7 +4806,7 @@ void GUI_EoB::sortSaveSlots() {
 }
 
 void GUI_EoB::restParty_updateRestTime(int hours, bool init) {
-	Screen::FontId of = _screen->setFont(_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FontId::FID_CHINESE_FNT : _vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
+	Screen::FontId of = _screen->setFont(_menuFont);
 	int od = _screen->curDimIndex();
 	_screen->setScreenDim(10);
 
diff --git a/engines/kyra/gui/gui_eob.h b/engines/kyra/gui/gui_eob.h
index 8f42fce5d50..acf6d4de614 100644
--- a/engines/kyra/gui/gui_eob.h
+++ b/engines/kyra/gui/gui_eob.h
@@ -175,6 +175,7 @@ private:
 	uint32 _highLightBoxTimer;
 
 	const Screen::FontId _menuFont;
+	const Screen::FontId _menuFont2;
 
 	const EoBRect16 *_highlightFrames;
 	static const EoBRect16 _highlightFramesDefault[];
diff --git a/engines/kyra/resource/resource.h b/engines/kyra/resource/resource.h
index d04fbd8ca93..48e6f38c89d 100644
--- a/engines/kyra/resource/resource.h
+++ b/engines/kyra/resource/resource.h
@@ -1144,7 +1144,8 @@ enum KyraResources {
 
 	kEoB2UtilMenuStrings,
 	kEoB2Config2431Strings,
-	kEoB2FontDmpSearchTbl,
+	kEoB2FontLookupTbl,
+	kEoB2FontConvertTbl,
 	kEoB2Ascii2SjisTables,
 	kEoB2Ascii2SjisTables2,
 	kEoB2PcmSoundEffectsIngame,
diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index 63d8de46380..25f5b5bd3eb 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -1939,6 +1939,17 @@ const KyraRpgGUISettings DarkMoonEngine::_guiSettingsFMTowns = {
 	}
 };
 
+const KyraRpgGUISettings DarkMoonEngine::_guiSettingsPC98 = {
+	{ _dlgButtonPosX_Def, _dlgButtonPosY_Def, 9, 15, 95, 11, 2, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } },
+	{ 186, 181, 183, 183, 184, 17, 23, 20, 186, 181, 183, 182, 177, 180, 15, 6, 8, 9, 2, 5, 4, 3, 12 },
+	{	{ 184, 256, -1}, { 2, 54, 106 }, 64, 50,
+		{ 8, 80, -1 }, { 11, 63, 115 }, { 181, -1, -1 }, { 3, -1, -1 },
+		{ 40, 112, -1 }, { 11, 27, 63, 79, 115, 131 },
+		{ 23, 95, -1}, { 46, 98, 150 }, 38, 3, { 250, 250, -1}, { 16, 25, -1 }, 51, 5,
+		13, 30
+	}
+};
+
 const KyraRpgGUISettings DarkMoonEngine::_guiSettingsDOS = {
 	{ _dlgButtonPosX_Def, _dlgButtonPosY_Def, 9, 15, 95, 9, 2, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } },
 	{ 186, 181, 183, 183, 184, 17, 23, 20, 186, 181, 183, 182, 177, 180, 15, 6, 8, 9, 2, 5, 4, 3, 12 },
diff --git a/engines/kyra/text/text_rpg.cpp b/engines/kyra/text/text_rpg.cpp
index 5d3f0765208..98146830989 100644
--- a/engines/kyra/text/text_rpg.cpp
+++ b/engines/kyra/text/text_rpg.cpp
@@ -50,7 +50,7 @@ TextDisplayer_rpg::TextDisplayer_rpg(KyraRpgEngine *engine, Screen *scr) : _vm(e
 		_waitButtonFont = Screen::FID_SJIS_TEXTMODE_FNT;
 	else if ((_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns))
 		_waitButtonFont = Screen::FID_8_FNT;
-	else if ((_vm->game() == GI_EOB1 && _vm->gameFlags().platform == Common::kPlatformPC98))
+	else if (_vm->gameFlags().platform == Common::kPlatformPC98)
 		_waitButtonFont = Screen::FID_SJIS_FNT;
 	else if ((_vm->game() == GI_LOL && _vm->gameFlags().lang == Common::Language::ZH_TWN))
 		_waitButtonFont = Screen::FID_CHINESE_FNT;
@@ -576,7 +576,10 @@ void TextDisplayer_rpg::printDialogueText(int stringId, const char *pageBreakStr
 	Common::strlcpy(_dialogueBuffer, str, kEoBTextBufferSize);
 
 	_screen->set16bitShadingLevel(4);
+	int cs = (_vm->gameFlags().platform == Common::kPlatformPC98 && !_vm->gameFlags().use16ColorMode) ? _screen->setFontStyles(_screen->_currentFont, Font::kStyleFat) : -1;
 	displayText(_dialogueBuffer);
+	if (cs != -1)
+		_screen->setFontStyles(_screen->_currentFont, cs);
 	_screen->set16bitShadingLevel(0);
 
 	if (pageBreakString) {
@@ -594,7 +597,10 @@ void TextDisplayer_rpg::printDialogueText(const char *str, bool wait) {
 	assert(Common::strnlen(str, kEoBTextBufferSize) < kEoBTextBufferSize);
 	Common::strlcpy(_dialogueBuffer, str, kEoBTextBufferSize);
 
+	int cs = (_vm->gameFlags().platform == Common::kPlatformPC98 && !_vm->gameFlags().use16ColorMode) ? _screen->setFontStyles(_screen->_currentFont, Font::kStyleFat) : -1;
 	displayText(_dialogueBuffer);
+	if (cs != -1)
+		_screen->setFontStyles(_screen->_currentFont, cs);
 	if (wait)
 		displayWaitButton();
 }
@@ -646,6 +652,7 @@ void TextDisplayer_rpg::textPageBreak() {
 
 	int cp = _screen->setCurPage(0);
 	Screen::FontId cf = _screen->setFont(_waitButtonFont);
+	int cs = (_vm->gameFlags().platform == Common::kPlatformPC98 && !_vm->gameFlags().use16ColorMode) ? _screen->setFontStyles(_waitButtonFont, Font::kStyleFat) : -1;
 
 	if (_vm->game() == GI_LOL)
 		_vm->_timer->pauseSingleTimer(11, true);
@@ -765,6 +772,8 @@ void TextDisplayer_rpg::textPageBreak() {
 		_vm->_updatePortraitSpeechAnimDuration = updatePortraitSpeechAnimDuration;
 	}
 
+	if (cs != -1)
+		_screen->setFontStyles(_waitButtonFont, cs);
 	_screen->setFont(cf);
 	_screen->setCurPage(cp);
 


Commit: 6380c9da0e2bb6af84f5e5d6b51a11f612a8b50f
    https://github.com/scummvm/scummvm/commit/6380c9da0e2bb6af84f5e5d6b51a11f612a8b50f
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:51:05+02:00

Commit Message:
KYRA: (EOBII) - improve intro scrolling

(make it smoother)

Changed paths:
    engines/kyra/sequence/sequences_darkmoon.cpp


diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index 27bde4e02aa..f0f41eb9fbc 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -54,6 +54,8 @@ public:
 	void fadePalette(int index, int del);
 	void copyPalette(int srcIndex, int destIndex);
 
+	int hScroll(bool restart = false);
+
 	void initDelayedPaletteFade(int palIndex, int rate);
 	bool processDelayedPaletteFade();
 
@@ -104,6 +106,9 @@ private:
 	uint16 _sndNextTrackMarker;
 	const uint16 *_sndMarkersFMTowns;
 
+	uint32 _hScrollStartTimeStamp;
+	uint32 _hScrollResumeTimeStamp;
+
 	uint8 _textColor[3];
 
 	int _platformAnimOffset;
@@ -350,14 +355,12 @@ void DarkMoonEngine::seq_playIntro() {
 
 	sq.loadScene(1, 2);
 	sq.waitForSongNotifier(++songCurPos);
+	uint32 endtime = _system->getMillis();
 
 	// intro scroll
 	if (!skipFlag() && !shouldQuit()) {
-		for (int i = 0; i < 280; ++i) {
-			uint32 endtime = _system->getMillis() + 18;
-			_screen->copyRegion(9, 8, 8, 8, 303, 128, 0, 0, Screen::CR_NO_P_CHECK);
-			_screen->copyRegion(i, 0, 311, 8, 1, 128, 2, 0, Screen::CR_NO_P_CHECK);
-			_screen->updateScreen();
+		for (int i = sq.hScroll(true); i != 279; i = sq.hScroll()) {
+			endtime += 18;
 			if (_flags.platform == Common::kPlatformAmiga) {
 				if (i == 4 || i == 24 || i == 36)
 					sq.animCommand(39);
@@ -1548,6 +1551,7 @@ void DarkmoonSequenceHelper::init(DarkmoonSequenceHelper::Mode mode) {
 	_sndNextTrack = 1;
 	_sndNextTrackMarker = 0;
 	_sndMarkersFMTowns = soundMarkersFMTowns[mode];
+	_hScrollStartTimeStamp = _hScrollResumeTimeStamp = 0;
 
 	if (mode == kIntro) {
 		_config = new Config(
@@ -1733,6 +1737,33 @@ void DarkmoonSequenceHelper::copyPalette(int srcIndex, int destIndex) {
 	_palettes[destIndex]->copy(*_palettes[srcIndex]);
 }
 
+int DarkmoonSequenceHelper::hScroll(bool restart) {
+	if (restart)
+		_hScrollStartTimeStamp = _system->getMillis();
+	else if (!_hScrollStartTimeStamp)
+		return 0;
+
+	uint32 ct = _system->getMillis();
+	int state = (ct - _hScrollStartTimeStamp) / 18;
+	if (state < 0 || state > 279) {
+		_hScrollStartTimeStamp += (ct - _hScrollResumeTimeStamp);
+		state = (ct - _hScrollStartTimeStamp) / 18;
+		if (state < 0 || state > 279)
+			state = 279;
+	}
+
+	_hScrollResumeTimeStamp = ct;
+
+	_screen->copyRegion(9, 8, 8, 8, 303, 128, 0, 0, Screen::CR_NO_P_CHECK);
+	_screen->copyRegion(state, 0, 311, 8, 1, 128, 2, 0, Screen::CR_NO_P_CHECK);
+	_screen->updateScreen();
+
+	if (state == 279)
+		_hScrollStartTimeStamp = 0;
+
+	return state;
+}
+
 void DarkmoonSequenceHelper::initDelayedPaletteFade(int palIndex, int rate) {
 	_palettes[11]->copy(*_palettes[0]);
 
@@ -1773,7 +1804,12 @@ void DarkmoonSequenceHelper::delay(uint32 ticks) {
 		processDelayedPaletteFade();
 
 	} else {
-		_vm->delayUntil(end);
+		for (uint32 ct = 0; ct < end; ) {
+			if (ct + 18 <= end)
+				hScroll();
+			ct = _system->getMillis();
+			_vm->delay(MIN<uint32>(9, end - ct));
+		}
 	}
 }
 


Commit: 4be42a4fb6d6b069f6211253f962998c42e6fe94
    https://github.com/scummvm/scummvm/commit/4be42a4fb6d6b069f6211253f962998c42e6fe94
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:51:08+02:00

Commit Message:
KYRA: (EOB) - fix text glitch

Changed paths:
    engines/kyra/gui/gui_eob.cpp


diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index 035175bb40d..83781c1424a 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -4631,8 +4631,7 @@ void GUI_EoB::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int sp
 	if (bookPageIndex < 0)
 		return;
 
-	int x1 = _vm->_flags.lang == Common::ZH_TWN ? 4 + (bookPageIndex / 4) * 80 : 8;
-	int x2 = _vm->_flags.lang == Common::ZH_TWN ? x1 : 6;
+	int x = _vm->_flags.lang == Common::ZH_TWN ? 4 + (bookPageIndex / 4) * 80 : 8;
 	int y = _vm->_flags.lang == Common::ZH_TWN ? (bookPageIndex % 4) * 16 + 58 : bookPageIndex * 9 + 50;
 	int w = _vm->_flags.lang == Common::ZH_TWN ? 80 : 160;
 	int h = _vm->_flags.lang == Common::ZH_TWN ? 15 : 8;
@@ -4641,7 +4640,7 @@ void GUI_EoB::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int sp
 	Screen::FontId of = _screen->setFont(_menuFont2);
 
 	if (!spellId || (_vm->_flags.lang == Common::ZH_TWN && !noFill))
-		_screen->fillRect(x2, y, x1 + w, y + h,  _vm->guiSettings()->colors.fill);
+		_screen->fillRect(x - (_vm->_flags.lang == Common::ZH_TWN ? 1 : 2), y, x + w, y + h,  _vm->guiSettings()->colors.fill);
 
 	if (spellId) {
 		Common::String s;
@@ -4655,9 +4654,9 @@ void GUI_EoB::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int sp
 		}
 
 		if (noFill)
-			_screen->printText(s.c_str(), x1, y, highLight ? _vm->guiSettings()->colors.guiColorLightRed : col1, 0);
+			_screen->printText(s.c_str(), x, y, highLight ? _vm->guiSettings()->colors.guiColorLightRed : col1, 0);
 		else
-			_screen->printShadedText(s.c_str(), x1, y, highLight ? _vm->guiSettings()->colors.guiColorLightRed : col1, _vm->guiSettings()->colors.fill, _vm->guiSettings()->colors.guiColorBlack);
+			_screen->printShadedText(s.c_str(), x, y, highLight ? _vm->guiSettings()->colors.guiColorLightRed : col1, _vm->guiSettings()->colors.fill, _vm->guiSettings()->colors.guiColorBlack);
 	}
 
 	_screen->setFont(of);


Commit: 57077022f2b6dc5b98bc25f1ee1029926d829c79
    https://github.com/scummvm/scummvm/commit/57077022f2b6dc5b98bc25f1ee1029926d829c79
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:51:11+02:00

Commit Message:
KYRA: (EOB) - fix level music glitch

Changed paths:
    engines/kyra/engine/darkmoon.cpp
    engines/kyra/engine/darkmoon.h
    engines/kyra/engine/eob.cpp
    engines/kyra/engine/eob.h
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/engine/eobcommon.h


diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index e5ade431083..8279173e2af 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -689,6 +689,11 @@ void DarkMoonEngine::snd_loadAmigaSounds(int level, int sub) {
 	_amigaCurSoundIndex = sndIndex;
 }
 
+void DarkMoonEngine::snd_playLevelScore() {
+	if (_flags.platform == Common::kPlatformPC98)
+		snd_playSong(0);
+}
+
 void DarkMoonEngine::useHorn(int charIndex, int weaponSlot) {
 	int v = _items[_characters[charIndex].inventory[weaponSlot]].value - 1;
 	_txt->printMessage(_hornStrings[v]);
diff --git a/engines/kyra/engine/darkmoon.h b/engines/kyra/engine/darkmoon.h
index bc271ad06a4..743459e3a40 100644
--- a/engines/kyra/engine/darkmoon.h
+++ b/engines/kyra/engine/darkmoon.h
@@ -121,6 +121,7 @@ private:
 
 	// Sound
 	void snd_loadAmigaSounds(int level, int sub) override;
+	void snd_playLevelScore() override;
 
 	const char *const *_amigaSoundFiles2;
 	const char *const *_amigaSoundMapExtra;
diff --git a/engines/kyra/engine/eob.cpp b/engines/kyra/engine/eob.cpp
index e4e47c37cbb..7dc3b51a06b 100644
--- a/engines/kyra/engine/eob.cpp
+++ b/engines/kyra/engine/eob.cpp
@@ -569,7 +569,6 @@ void EoBEngine::runNpcDialogue(int npcIndex) {
 
 	seq_segaRestoreAfterSequence();
 	setLevelPalettes(_currentLevel);
-	_levelCurTrack = -1;
 	if (_flags.platform == Common::kPlatformSegaCD)
 		snd_playLevelScore();
 }
@@ -995,6 +994,16 @@ void EoBEngine::snd_loadAmigaSounds(int level, int) {
 	_amigaCurSoundFile = level;
 }
 
+void EoBEngine::snd_playLevelScore() {
+	if (_flags.platform == Common::kPlatformPC98) {
+		snd_playSong(_currentLevel + 1);
+	} else if (_flags.platform == Common::kPlatformSegaCD) {
+		static const uint8 levelTracksSegaCD[13] = { 7, 7, 7, 7, 6, 6, 6, 4, 4, 4, 5, 5, 10 };
+		_levelCurTrack = levelTracksSegaCD[_currentLevel];
+		snd_playSong(_levelCurTrack);
+	}
+}
+
 void EoBEngine::snd_updateLevelScore() {
 	if (_flags.platform != Common::kPlatformSegaCD || _currentLevel != 5)
 		return;
diff --git a/engines/kyra/engine/eob.h b/engines/kyra/engine/eob.h
index 8471551b270..5dafc2dab9a 100644
--- a/engines/kyra/engine/eob.h
+++ b/engines/kyra/engine/eob.h
@@ -175,6 +175,7 @@ private:
 
 	// Sound
 	void snd_loadAmigaSounds(int level, int) override;
+	void snd_playLevelScore() override;
 	void snd_updateLevelScore() override;
 
 	int _levelCurTrack;
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index b655d7e89d1..82b34f42884 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -2721,16 +2721,6 @@ void EoBCoreEngine::snd_playSong(int track, bool loop) {
 	_sound->playTrack(track);
 }
 
-void EoBCoreEngine::snd_playLevelScore() {
-	if (_flags.platform == Common::kPlatformPC98) {
-		if (_flags.gameID == GI_EOB1)
-			snd_playSong(_currentLevel + 1);
-	} else if (_flags.platform == Common::kPlatformSegaCD) {
-		static const uint8 levelTracksSegaCD[13] = { 7, 7, 7, 7, 6, 6, 6, 4, 4, 4, 5, 5, 10 };
-		snd_playSong(levelTracksSegaCD[_currentLevel]);
-	}
-}
-
 void EoBCoreEngine::snd_playSoundEffect(int track, int volume) {
 	if ((track < 1) || (_flags.gameID == GI_EOB2 && track > 119) || shouldQuit())
 		return;
diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h
index 123c024eb1d..4d370be625f 100644
--- a/engines/kyra/engine/eobcommon.h
+++ b/engines/kyra/engine/eobcommon.h
@@ -1264,7 +1264,7 @@ protected:
 
 	// sound
 	void snd_playSong(int id, bool loop = true);
-	void snd_playLevelScore();
+	virtual void snd_playLevelScore() = 0;
 	void snd_playSoundEffect(int id, int volume = 0xFF) override;
 	void snd_stopSound();
 	void snd_fadeOut(int del = 160);


Commit: e1706afa1271ece1bcdd3b1fa1b60b9993099dd5
    https://github.com/scummvm/scummvm/commit/e1706afa1271ece1bcdd3b1fa1b60b9993099dd5
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:52:17+02:00

Commit Message:
KYRA: (EOB/SegaCD) - fix minor gfx glitch

Changed paths:
    engines/kyra/gui/gui_eob_segacd.cpp


diff --git a/engines/kyra/gui/gui_eob_segacd.cpp b/engines/kyra/gui/gui_eob_segacd.cpp
index bf97990c780..12f58c530bc 100644
--- a/engines/kyra/gui/gui_eob_segacd.cpp
+++ b/engines/kyra/gui/gui_eob_segacd.cpp
@@ -972,7 +972,7 @@ void GUI_EoB_SegaCD::restParty_updateRestTime(int hours, bool init) {
 	_screen->sega_loadTextBufferToVRAM(0, 0x5060, 5120);
 	r->fillRectWithTiles(0, 1, 4, 20, 2, 0x6000);
 	r->fillRectWithTiles(0, 1, 6, 20, 6, 0x6283, true);
-	r->render(0, 0, 0, 22, 16);
+	r->render(0, 0, 0, 22, 17);
 	_screen->updateScreen();
 	_vm->delay(160);
 }


Commit: 7c43617dc536c81585c418fd0503b192d93fdad0
    https://github.com/scummvm/scummvm/commit/7c43617dc536c81585c418fd0503b192d93fdad0
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:52:37+02:00

Commit Message:
KYRA: (EOB II/PC98) - more text/font related work and cleanup

Changed paths:
    engines/kyra/engine/chargen.cpp
    engines/kyra/engine/darkmoon.cpp
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/engine/eobcommon.h
    engines/kyra/graphics/screen.cpp
    engines/kyra/graphics/screen_eob.cpp
    engines/kyra/graphics/screen_eob.h
    engines/kyra/graphics/screen_eob_pc98.cpp
    engines/kyra/gui/gui_eob.cpp
    engines/kyra/resource/staticres_eob.cpp
    engines/kyra/sequence/sequences_darkmoon.cpp


diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 704e032ba24..97cb47026e6 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -183,6 +183,9 @@ CharacterGenerator::CharacterGenerator(EoBCoreEngine *vm, Screen_EoB *screen) :
 		chargenButtonDefs[37].x -= 8;
 	}
 
+	if (_vm->gameFlags().platform == Common::kPlatformPC98 && _vm->gameFlags().gameID == GI_EOB2)
+		_screen->setFont(Screen::FID_8_FNT);
+
 	_chargenButtonDefs = chargenButtonDefs;
 }
 
@@ -202,6 +205,9 @@ CharacterGenerator::~CharacterGenerator() {
 	delete[] _wndBackgrnd;
 	_vm->_wndBackgrnd = 0;
 
+	if (_vm->gameFlags().platform == Common::kPlatformPC98 && _vm->gameFlags().gameID == GI_EOB2)
+		_screen->setFont(Screen::FID_SJIS_FNT);
+
 	_screen->clearPage(2);
 }
 
@@ -479,8 +485,8 @@ void CharacterGenerator::checkForCompleteParty() {
 	_screen->copyRegion(0, 0, 160, 0, 160, 128, 2, 2, Screen::CR_NO_P_CHECK);
 	int cp = _screen->setCurPage(2);
 	int x = (_vm->gameFlags().platform == Common::kPlatformFMTowns) ? 184 : 168;
-	int y1 = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98) ? 80 : 16;
-	int y2 = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98) ? 112 : 61;
+	int y1 = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98) ? 40 : 16;
+	int y2 = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98) ? 56 : 61;
 	int cs = 0;
 
 	if (_vm->gameFlags().platform == Common::kPlatformSegaCD) {
@@ -707,12 +713,15 @@ void CharacterGenerator::createPartyMember() {
 					_screen->copyRegion(5, 33, 149, 97, 64, 21, 2, 0, Screen::CR_NO_P_CHECK);
 				_screen->printShadedText(_chargenStrings2[11], 149, 100, _vm->guiSettings()->colors.guiColorLightBlue, 0, _vm->guiSettings()->colors.guiColorBlack);
 				if (!_vm->shouldQuit()) {
-					if (_vm->game() == GI_EOB2 && _vm->gameFlags().lang == Common::Language::ZH_TWN)
+					if (_vm->game() == GI_EOB2 && _vm->gameFlags().lang == Common::Language::ZH_TWN) {
 						_vm->_gui->getTextInput(_characters[_activeBox].name, 28, 100, 9,
 									_vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorDarkRed);
-					else
+					} else {
+						Screen::FontId of = _screen->setFont(_vm->_invFont3);
 						_vm->_gui->getTextInput(_characters[_activeBox].name, 24, 100, 10,
 									_vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorDarkRed);
+						_screen->setFont(of);
+					}
 					processNameInput(_activeBox, _vm->guiSettings()->colors.guiColorBlue);
 				}
 			}
diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index 8279173e2af..0928387df79 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -66,7 +66,7 @@ Common::Error DarkMoonEngine::init() {
 	_screen->loadPalette(_flags.platform == Common::kPlatformFMTowns ? "MENU.PAL" : "PALETTE.COL", _screen->getPalette(0));
 	_screen->setScreenPalette(_screen->getPalette(0));
 
-	// adjust menu settings for EOB II FM-Towns/PC-98 versions
+	// adjust menu settings for EOB II FM-Towns/PC-98/Chinese versions
 	if (_flags.platform == Common::kPlatformFMTowns) {
 		_screen->modifyScreenDim(6, 10, 100, 21, 40);
 		_screen->modifyScreenDim(27, 0, 0, 21, 2);
@@ -74,6 +74,8 @@ Common::Error DarkMoonEngine::init() {
 	} else if (_flags.platform == Common::kPlatformPC98) {
 		_screen->modifyScreenDim(6, 10, 100, 21, 40);
 		_screen->modifyScreenDim(27, 0, 0, 21, 5);
+	} else if (_flags.lang == Common::Language::ZH_TWN) {
+		_screen->modifyScreenDim(6, 10, 72, 21, 40);
 	}
 
 	return Common::kNoError;
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 82b34f42884..55ad164347e 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -198,7 +198,7 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) : KyraRpgE
 	_buttonList7Size = _buttonList8Size = 0;
 	_inventorySlotsY = _mnDef = 0;
 	_invFont1 = _invFont2 = _invFont4 = _conFont = _bookFont = Screen::FID_6_FNT;
-	_invFont3 = Screen::FID_8_FNT;
+	_titleFont = _invFont3 = Screen::FID_8_FNT;
 	_transferStringsScummVM = 0;
 	_buttonDefs = 0;
 	_npcPreset = 0;
@@ -592,24 +592,23 @@ void EoBCoreEngine::loadFonts() {
 			_bookFont = Screen::FID_SJIS_SMALL_FNT;
 			_invFont4 = Screen::FID_SJIS_FNT;
 		}		
-		_conFont = _invFont3 = Screen::FID_SJIS_FNT;
+		_titleFont = _conFont = _invFont3 = Screen::FID_SJIS_FNT;
 		_invFont1 = Screen::FID_SJIS_SMALL_FNT;
 	} else if (_flags.platform == Common::kPlatformSegaCD) {
 		_screen->loadFont(Screen::FID_8_FNT, "FONTK12");
 		_screen->setFontStyles(Screen::FID_8_FNT, Font::kStyleNone);
 		_invFont1 = _invFont2 = _invFont4 = _conFont = Screen::FID_8_FNT;
-	}
-
-	if (_flags.lang == Common::ZH_TWN) {
+	} else if (_flags.lang == Common::ZH_TWN) {
 		_screen->loadFont(Screen::FID_CHINESE_FNT, "FONT8.FNT");
-		_conFont = Screen::FID_CHINESE_FNT;
+		_titleFont = _conFont = Screen::FID_CHINESE_FNT;
 	}
 }
 
 Common::Error EoBCoreEngine::go() {
 	static_cast<Debugger_EoB *>(getDebugger())->initialize();
 	_txt->removePageBreakFlag();
-	_screen->setFont(_flags.platform == Common::kPlatformPC98 ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
+	_screen->setFont(_titleFont);
+
 	loadItemsAndDecorationsShapes();
 
 	_screen->setMouseCursor(0, 0, _itemIconShapes[0]);
diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h
index 4d370be625f..0c30d096251 100644
--- a/engines/kyra/engine/eobcommon.h
+++ b/engines/kyra/engine/eobcommon.h
@@ -836,6 +836,7 @@ protected:
 	Screen::FontId _invFont3;
 	Screen::FontId _invFont4;
 	Screen::FontId _conFont;
+	Screen::FontId _titleFont;
 	Screen::FontId _bookFont;
 	const uint8 **_compassShapes;
 	uint8 _charExchangeSwap;
diff --git a/engines/kyra/graphics/screen.cpp b/engines/kyra/graphics/screen.cpp
index 9222ef1d480..4d8acd43e88 100644
--- a/engines/kyra/graphics/screen.cpp
+++ b/engines/kyra/graphics/screen.cpp
@@ -199,7 +199,7 @@ bool Screen::init() {
 
 			if (_use16ColorMode)
 				_fonts[FID_SJIS_TEXTMODE_FNT] = new SJISFont(_sjisFontShared, _sjisInvisibleColor, true, false, 0);
-			else
+			else if (!(_vm->gameFlags().platform == Common::kPlatformPC98 && _vm->game() != GI_EOB2))
 				_fonts[FID_SJIS_FNT] = new SJISFont(_sjisFontShared, _sjisInvisibleColor, false, _vm->game() != GI_LOL && _vm->game() != GI_EOB2, _vm->game() == GI_LOL ? 1 : 0);
 		}
 	}
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index a766b4f0472..1a1b02ff076 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -139,8 +139,14 @@ bool Screen_EoB::init() {
 			enableHiColorMode(true);
 			setFontStyles(FID_SJIS_FNT, Font::kStyleFat);
 			_fonts[FID_SJIS_LARGE_FNT] = new SJISFontLarge(_sjisFontShared);
-		} else if (_vm->game() == GI_EOB1 && _vm->gameFlags().platform == Common::kPlatformPC98) {
-			_fonts[FID_SJIS_FNT] = new SJISFontEoB1PC98(_sjisFontShared, /*12,*/ _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable1, temp), _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable2, temp));
+		} else if (_vm->gameFlags().platform == Common::kPlatformPC98) {
+			if (_vm->game() == GI_EOB1) {
+				_fonts[FID_SJIS_FNT] = new SJISFontEoB1PC98(_sjisFontShared, /*12,*/ _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable1, temp), _vm->staticres()->loadRawDataBe16(kEoB1Ascii2SjisTable2, temp));
+			} else {
+				const char *const *tbl = _vm->staticres()->loadStrings(kEoB2Ascii2SjisTables2, temp);
+				assert(temp > 1);
+				_fonts[FID_SJIS_FNT] = new SJISFontEoB2PC98(_sjisFontShared, /*12,*/ tbl[0], tbl[1]);
+			}
 		}
 
 		if (_vm->gameFlags().useHiRes && _renderMode == Common::kRenderEGA) {
diff --git a/engines/kyra/graphics/screen_eob.h b/engines/kyra/graphics/screen_eob.h
index 58caa6c7f59..e85d7de1b8f 100644
--- a/engines/kyra/graphics/screen_eob.h
+++ b/engines/kyra/graphics/screen_eob.h
@@ -390,9 +390,25 @@ private:
 	bool _defaultConv;
 };
 
+/**
+* SJIS Font variant used in EOB II PC-98. It converts 1-byte characters into 2-byte characters.
+*/
+class SJISFontEoB2PC98 : public SJISFont {
+public:
+	SJISFontEoB2PC98(Common::SharedPtr<Graphics::FontSJIS> &font, /*uint8 shadowColor,*/ const char *convTable1, const char *convTable2);
+	~SJISFontEoB2PC98() override {}
+	int getCharWidth(uint16 c) const override;
+	void drawChar(uint16 c, byte *dst, int pitch, int) const override;
+
+private:
+	uint16 convert(uint16 c) const;
+	const char *_convTable1, *_convTable2;
+	bool _defaultConv;
+};
+
 /**
 * OldDOSFont variant used in EOB I PC-98. It uses the same drawing routine, but has a different loader. It contains
-* ASCII and Katakana characters and requires several conversion tables to display these. It gets drawn on the SJIS overlay.
+* ASCII and Katakana characters and requires several conversion tables to display these. It gets drawn on the hires overlay.
 */
 class Font12x12PC98 : public OldDOSFont{
 public:
@@ -412,8 +428,8 @@ private:
 };
 
 /**
-* OldDOSFont variant used in EOB II PC-98. It uses the same drawing routine, but supports weird vertical scaling, can be drawn
-* on the SJIS overlay and has some character conversion.
+* OldDOSFont variant used in EOB II PC-98 which supports twice the number of characters. Some font files may include kana characters. The font supports
+* weird vertical scaling and can be drawn on the hires overlay.
 */
 class PC98Font : public OldDOSFont {
 public:
diff --git a/engines/kyra/graphics/screen_eob_pc98.cpp b/engines/kyra/graphics/screen_eob_pc98.cpp
index b8eb3c388c8..a69939e454f 100644
--- a/engines/kyra/graphics/screen_eob_pc98.cpp
+++ b/engines/kyra/graphics/screen_eob_pc98.cpp
@@ -209,6 +209,44 @@ uint16 SJISFontEoB1PC98::convert(uint16 c) const {
 	return c;
 }
 
+SJISFontEoB2PC98::SJISFontEoB2PC98(Common::SharedPtr<Graphics::FontSJIS> &font, /*uint8 shadowColor,*/ const char *convTable1, const char *convTable2) : SJISFont(font, 0, false, false, 0),
+/*_shadowColor(shadowColor),*/ _convTable1(convTable1), _convTable2(convTable2), _defaultConv(true) {
+	assert(_convTable1);
+	assert(_convTable2);
+}
+
+int SJISFontEoB2PC98::getCharWidth(uint16 c) const {
+	return SJISFont::getCharWidth(convert(c));
+}
+
+void SJISFontEoB2PC98::drawChar(uint16 c, byte *dst, int pitch, int) const {
+	SJISFont::drawChar(convert(c), dst, pitch, 0);
+}
+
+uint16 SJISFontEoB2PC98::convert(uint16 c) const {
+	uint8 l = c & 0xFF;
+	uint8 h = c >> 8;
+
+	if (h || l < 32 || l == 127) {
+		return c;
+	} else if (l < 127) {
+		c = (l - 32) * 2;
+		assert(c < 190);
+		l = _convTable1[c];
+		h = _convTable1[c + 1];
+	} else if (l < 212) {
+		h = l - 64;
+		l = 0x83;
+	} else {
+		c = (l - 212) * 2;
+		assert(c < 8);
+		l = _convTable2[c];
+		h = _convTable2[c + 1];
+	}
+
+	return (h << 8) | l;
+}
+
 Font12x12PC98::Font12x12PC98(uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2, const uint8 *lookupTable) : OldDOSFont(Common::kRenderDefault, 12), _convTable1(convTable1), _convTable2(convTable2) {
 	assert(convTable1);
 	assert(convTable2);
@@ -302,8 +340,27 @@ bool PC98Font::load(Common::SeekableReadStream &file) {
 }
 
 uint16 PC98Font::convert(uint16 c) const {
+	if (!_convTable || c < 128)
+		return c;
+
+	uint8 lo = c & 0xff;
+	uint8 hi = c >> 8;
+
+	if (lo == 0x81) {
+		if (hi >= 0x40 && hi <= 0xac)
+			return _convTable[hi - 0x40];
+	} else if (lo == 0x82) {
+		if (hi >= 0x4f && hi <= 0x58)
+			return hi + 0xe1;
+		if (hi >= 0x60 && hi <= 0x79)
+			return hi - 0x1f;
+		if (hi >= 0x81 && hi <= 0x9a)
+			return hi - 0x20;
+	} else if (lo == 0x83 && hi >= 0x40 && hi <= 0x93) {
+		return hi + 0x40;
+	}
 
-	return c;
+	return 0;
 }
 
 } // End of namespace Kyra
diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index 83781c1424a..4a11c626e9d 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -126,7 +126,7 @@ void EoBCoreEngine::gui_drawCharPortraitWithStats(int index, bool screenUpdt) {
 			if (index == _exchangeCharacterId)
 				_screen->printText(_characterGuiStringsSt[0], x2 + 2, y2 + 2, guiSettings()->colors.guiColorDarkRed, guiSettings()->colors.fill);
 			else
-				_screen->printText(c->name, x2 + 2, y2 + (_flags.platform == Common::kPlatformFMTowns ? 1 : 2), txtCol1, _flags.use16ColorMode ? 0 : guiSettings()->colors.fill);
+				_screen->printText(c->name, x2 + 2, y2 + (_flags.platform == Common::kPlatformFMTowns ? 1 : 2), txtCol1, _flags.platform == Common::kPlatformPC98 ? 0 : guiSettings()->colors.fill);
 		}
 
 		_screen->setFont(_invFont2);
@@ -2949,9 +2949,9 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
 
 		} else if ((in > 31 && in < 126) || (in == 0x89)) {
 			if (!(in == 32 && pos == 0)) {
-				// The PC-98 version and the English Sega-CD version of EOB I are the only versions that allow small characters.
+				// The PC-98 versions of EOB I + II and the English Sega-CD version of EOB I are the only versions that allow small characters.
 				// For all other versions we convert to capital characters.
-				if (in >= 97 && in <= 122 && !(_vm->_flags.gameID == GI_EOB1 && (_vm->_flags.platform == Common::kPlatformPC98 || (_vm->_flags.platform == Common::kPlatformSegaCD && _vm->_flags.lang != Common::JA_JPN))))
+				if (in >= 97 && in <= 122 && _vm->_flags.platform != Common::kPlatformPC98 && !(_vm->_flags.platform == Common::kPlatformSegaCD && _vm->_flags.lang != Common::EN_ANY))
 					in -= 32;
 
 				if (pos < len) {
diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index 25f5b5bd3eb..9354ac73fde 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -25,7 +25,6 @@
 
 #include "common/memstream.h"
 
-
 namespace Kyra {
 
 #ifdef ENABLE_EOB
@@ -1845,20 +1844,21 @@ void DarkMoonEngine::initStaticResource() {
 	_amigaSoundIndex2 = _staticres->loadRawData(kEoB2SoundIndex2, temp);
 	_amigaSoundPatch = _staticres->loadRawData(kEoB2MonsterSoundPatchData, _amigaSoundPatchSize);
 
-	static const char *const errorSlotNoNameString[5] = {
+	static const char *const errorSlotNoNameString[6] = {
 		" You must specify\r a name for your\r save game!",
 		" Spielst[nde m]ssen\r einen Namen haben!",
 		" Debes poner\run nombre al\rfichero!",
+		"\x83""Z""\x81""[""\x83""u""\x83""t""\x83""@""\x83""C""\x83\x8b\r\x82\xc9\x82\xcd\x96\xbc\x91""O""\x82\xaa\r\x95""K""\x97""v""\x82\xc5\x82\xb7\x81""B",
 		" \xb1\x7a\xa5\xb2\xb6\xb7\xbf\xe9\xa4\x4a\xc0\xc9\xae\xd7\xa6\x57\xba\xd9", /* " 您必須輸入檔案名稱" */
 		0
 	};
 
 	// ScummVM specific
-	static const char *const transferStringsScummVM[4][5] = {
+	static const char *const transferStringsScummVM[3][5] = {
 		{
 			"\r We cannot find any EOB save game\r file. Please make sure that the\r save game file with the party\r you wish to transfer is located\r in your ScummVM save game\r directory. If you have set up\r multiple save directories you\r have to copy the EOB save file\r into your EOB II save directory.\r Do you wish to try again?",
 			"Game ID",
-			"\r It seems that you have already\r defeated Xanathar here. Do you\r wish to transfer the party that\r finished the game? If not, you\r will be able to select a save\r game from the save game\r dialogue.",
+			"\r It seems that you have already\r defeated Xanathar here. Do you\r wish to transfer the party that\r finished the game? If not, you\r will be able to select a save\r game from the save game\r dialog.",
 			"Select File",
 			"\r\r   Please wait..."
 		},
@@ -1875,13 +1875,6 @@ void DarkMoonEngine::initStaticResource() {
 			"\r Parece que ya se ha vencido\r Xanathar aqui. Deseas transferir\r el grupo que ha finalizado el\r juego? En caso contrario puedes\r seleccionar otra partida de las\r anteriores guardadas.",
 			"Escoge Fichero",
 			"\r\r   Un momento\r   por favor..."
-		},
-		{
-			"\x82""d""\x82""n""\x82""a""\x82""h""\x82\xcc\x83""f""\x81""[""\x83""^""\x81""iEOBDATA.SAV""\x81""j""\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81""B""\x83""J""\x83\x8c\x83\x93\x83""g""\x83""f""\x83""B""\x83\x8c\x83""N""\x83""g""\x83\x8a\x82\xc9\x93""]""\x91\x97\x82\xb5\x82\xc4\x82\xa9\x82\xe7\x8e\xc0\x8d""s""\x82\xb5\x82\xc4\x89\xba\x82\xb3\x82\xa2\x81""B",
-			"\x83\x51\x81\x5B\x83\x80\x82\x68\x82\x63",
-			"\x82""d""\x82""n""\x82""a""\x82""h""\x82\xcc\x83""f""\x81""[""\x83""^""\x81""iEOBDATA.SAV""\x81""j""\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81""B""\x83""J""\x83\x8c\x83\x93\x83""g""\x83""f""\x83""B""\x83\x8c\x83""N""\x83""g""\x83\x8a\x82\xc9\x93""]""\x91\x97\x82\xb5\x82\xc4\x82\xa9\x82\xe7\x8e\xc0\x8d""s""\x82\xb5\x82\xc4\x89\xba\x82\xb3\x82\xa2\x81""B",
-			"\x83\x51\x81\x5B\x83\x80\x82\xf0\x91\x49\x82\xf1\x82\xc5\x89\xba\x82\xb3\x82\xa2\x81\x42",
-			"\r\r   \x82\xa8\x91\xd2\x82\xbF\x89\xba\x82\xb3\x82\xa2\x81""E""\x81""E""\x81""E"
 		}
 	};
 
@@ -1900,12 +1893,14 @@ void DarkMoonEngine::initStaticResource() {
 			_transferStringsScummVM = transferStringsScummVM[2];
 			break;
 		case Common::JA_JPN:
-		case Common::ZH_TWN:
 			_errorSlotNoNameString = errorSlotNoNameString[3];
 			_transferStringsScummVM = transferStringsScummVM[0];
 			break;
+		case Common::ZH_TWN:
+			_errorSlotNoNameString = errorSlotNoNameString[4];
+			_transferStringsScummVM = transferStringsScummVM[0];
+			break;
 	}
-
 }
 
 void DarkMoonEngine::initSpells() {
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index f0f41eb9fbc..e4f7fd70733 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -209,11 +209,6 @@ int DarkMoonEngine::mainMenu() {
 int DarkMoonEngine::mainMenuLoop() {
 	int sel = -1;
 
-	if (_flags.lang == Common::Language::ZH_TWN) {
-		_screen->modifyScreenDim(6, 10, 72, 21, 40);
-		_screen->setFont(Screen::FID_CHINESE_FNT);
-	}
-
 	do {
 		_screen->setScreenDim(6);
 		_gui->simpleMenu_setup(6, 0, _mainMenuStrings, -1, 0, 0, _configRenderMode == Common::kRenderCGA ? 1 : guiSettings()->colors.guiColorWhite, guiSettings()->colors.guiColorLightRed, guiSettings()->colors.guiColorBlack);


Commit: 82421879eea4d4286ab5bfe31ccf1de204044528
    https://github.com/scummvm/scummvm/commit/82421879eea4d4286ab5bfe31ccf1de204044528
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:52:39+02:00

Commit Message:
KYRA: (EOB II/PC98) - adapt keyboard mapping

Changed paths:
    engines/kyra/engine/kyra_v1.cpp


diff --git a/engines/kyra/engine/kyra_v1.cpp b/engines/kyra/engine/kyra_v1.cpp
index 3bb2a5ecb92..eceb6f9d075 100644
--- a/engines/kyra/engine/kyra_v1.cpp
+++ b/engines/kyra/engine/kyra_v1.cpp
@@ -436,7 +436,7 @@ void KyraEngine_v1::setupKeyMap() {
 		return;
 
 	for (int i = 0; i < ARRAYSIZE(keys); i++)
-		_keyMap[keys[i].kcScummVM] = (_flags.gameID != GI_EOB1 && _flags.platform == Common::kPlatformPC98) ? keys[i].kcPC98 : ((_flags.platform == Common::kPlatformFMTowns) ? keys[i].kcFMTowns : keys[i].kcDOS);
+		_keyMap[keys[i].kcScummVM] = (_flags.gameID != GI_EOB1 && _flags.gameID != GI_EOB2 && _flags.platform == Common::kPlatformPC98) ? keys[i].kcPC98 : ((_flags.platform == Common::kPlatformFMTowns) ? keys[i].kcFMTowns : keys[i].kcDOS);
 }
 
 void KyraEngine_v1::updateInput() {


Commit: 5c8e799b2292e39c077005446fe8df836e77a17d
    https://github.com/scummvm/scummvm/commit/5c8e799b2292e39c077005446fe8df836e77a17d
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:52:43+02:00

Commit Message:
KYRA: some var renames

Changed paths:
    engines/kyra/engine/kyra_rpg.cpp
    engines/kyra/engine/lol.cpp
    engines/kyra/graphics/screen.h
    engines/kyra/graphics/screen_eob.cpp
    engines/kyra/gui/gui_eob.cpp
    engines/kyra/gui/gui_lol.cpp
    engines/kyra/script/script_eob.cpp
    engines/kyra/script/script_lol.cpp
    engines/kyra/sequence/sequences_darkmoon.cpp
    engines/kyra/text/text_eob_segacd.cpp
    engines/kyra/text/text_lol.cpp
    engines/kyra/text/text_rpg.cpp


diff --git a/engines/kyra/engine/kyra_rpg.cpp b/engines/kyra/engine/kyra_rpg.cpp
index f43e1339450..df0fa5c9bf6 100644
--- a/engines/kyra/engine/kyra_rpg.cpp
+++ b/engines/kyra/engine/kyra_rpg.cpp
@@ -353,13 +353,13 @@ uint16 KyraRpgEngine::processDialogue() {
 		if (!textEnabled() && _currentControlMode) {
 			screen()->setScreenDim(5);
 			const ScreenDim *d = screen()->getScreenDim(5);
-			screen()->fillRect(d->sx, d->sy + d->h - 9, d->sx + d->w - 1, d->sy + d->h - 1, d->unkA);
+			screen()->fillRect(d->sx, d->sy + d->h - 9, d->sx + d->w - 1, d->sy + d->h - 1, d->col2);
 		} else {
 			const ScreenDim *d = screen()->_curDim;
 			if (gameFlags().use16ColorMode)
-				screen()->fillRect(d->sx, d->sy, d->sx + d->w - 3, d->sy + d->h - 2, d->unkA);
+				screen()->fillRect(d->sx, d->sy, d->sx + d->w - 3, d->sy + d->h - 2, d->col2);
 			else
-				screen()->fillRect(d->sx, d->sy, d->sx + d->w - 2, d->sy + d->h - 1, d->unkA);
+				screen()->fillRect(d->sx, d->sy, d->sx + d->w - 2, d->sy + d->h - 1, d->col2);
 			txt()->clearDim(4);
 			txt()->resetDimTextPositions(4);
 		}
diff --git a/engines/kyra/engine/lol.cpp b/engines/kyra/engine/lol.cpp
index 67fe4eb36a6..8623dfb1e1a 100644
--- a/engines/kyra/engine/lol.cpp
+++ b/engines/kyra/engine/lol.cpp
@@ -1692,7 +1692,7 @@ void LoLEngine::restoreAfterDialogueSequence(int controlMode) {
 		_updateFlags &= 0xFFFD;
 	} else {
 		const ScreenDim *d = _screen->getScreenDim(5);
-		_screen->fillRect(d->sx, d->sy, d->sx + d->w - (_flags.use16ColorMode ? 3 : 2), d->sy + d->h - 2, d->unkA);
+		_screen->fillRect(d->sx, d->sy, d->sx + d->w - (_flags.use16ColorMode ? 3 : 2), d->sy + d->h - 2, d->col2);
 		_txt->clearDim(4);
 		_txt->setupField(false);
 	}
diff --git a/engines/kyra/graphics/screen.h b/engines/kyra/graphics/screen.h
index 43aa8ef0131..ee161e88dca 100644
--- a/engines/kyra/graphics/screen.h
+++ b/engines/kyra/graphics/screen.h
@@ -49,10 +49,10 @@ struct ScreenDim {
 	uint16 sy;
 	uint16 w;
 	uint16 h;
-	uint16 unk8;
-	uint16 unkA;
-	uint16 unkC;
-	uint16 unkE;
+	uint16 col1;
+	uint16 col2;
+	uint16 line;
+	uint16 column;
 };
 
 /**
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index 1a1b02ff076..faaa91009ae 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -208,7 +208,7 @@ void Screen_EoB::setClearScreenDim(int dim) {
 
 void Screen_EoB::clearCurDim() {
 	static const uint8 amigaColorMap[16] = { 0x00, 0x06, 0x1d, 0x1b, 0x1a, 0x17, 0x18, 0x0e, 0x19, 0x1c, 0x1c, 0x1e, 0x13, 0x0a, 0x11, 0x1f };
-	fillRect(_curDim->sx << 3, _curDim->sy, ((_curDim->sx + _curDim->w) << 3) - 1, (_curDim->sy + _curDim->h) - 1, _isAmiga ? amigaColorMap[_curDim->unkA] : _use16ColorMode ? 0 : _curDim->unkA);
+	fillRect(_curDim->sx << 3, _curDim->sy, ((_curDim->sx + _curDim->w) << 3) - 1, (_curDim->sy + _curDim->h) - 1, _isAmiga ? amigaColorMap[_curDim->col2] : _use16ColorMode ? 0 : _curDim->col2);
 }
 
 void Screen_EoB::clearCurDimOvl(int pageNum) {
diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index 4a11c626e9d..e21e60e8213 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -3232,7 +3232,7 @@ void GUI_EoB::createScreenThumbnail(Graphics::Surface &dst) {
 void GUI_EoB::simpleMenu_initMenuItemsMask(int menuId, int maxItem, int32 menuItemsMask, int itemOffset) {
 	if (menuItemsMask == -1) {
 		_menuNumItems = _screen->getScreenDim(19 + menuId)->h;
-		_menuCur = _screen->getScreenDim(19 + menuId)->unk8;
+		_menuCur = _screen->getScreenDim(19 + menuId)->col1;
 		return;
 	}
 
@@ -4431,7 +4431,7 @@ void GUI_EoB::displayTextBox(int id, int, bool) {
 
 	Common::Point txtPos((dm->sx << 3) + 5, dm->sy + 5);
 	if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98)
-		txtPos = Common::Point(dm->sx << 3, (dm->sy + 16) & ~7);
+		txtPos = Common::Point(dm->column << 3, (dm->line + 16) & ~7);
 
 	_screen->printShadedText(getMenuString(id), txtPos.x, txtPos.y, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
 	_screen->setTextMarginRight(Screen::SCREEN_W);
diff --git a/engines/kyra/gui/gui_lol.cpp b/engines/kyra/gui/gui_lol.cpp
index ea0bee78ac2..4c6f549f35d 100644
--- a/engines/kyra/gui/gui_lol.cpp
+++ b/engines/kyra/gui/gui_lol.cpp
@@ -2396,9 +2396,9 @@ int GUI_LoL::runMenu(Menu &menu) {
 				fC = _screen->getTextWidth(_saveDescription);
 			}
 
-			_screen->fprintString("%s", (d->sx << 3), d->sy + 2, d->unk8, d->unkA, 0, _saveDescription);
+			_screen->fprintString("%s", (d->sx << 3), d->sy + 2, d->col1, d->col2, 0, _saveDescription);
 			f = _screen->setFont(f);
-			_screen->fillRect((d->sx << 3) + fC, d->sy, (d->sx << 3) + fC + wW, d->sy + d->h - (_vm->gameFlags().use16ColorMode ? 2 : 1), d->unk8, 0);
+			_screen->fillRect((d->sx << 3) + fC, d->sy, (d->sx << 3) + fC + wW, d->sy + d->h - (_vm->gameFlags().use16ColorMode ? 2 : 1), d->col1, 0);
 			_screen->setCurPage(pg);
 
 			// Disable keyboard keymap during text input (save menu)
@@ -2414,7 +2414,7 @@ int GUI_LoL::runMenu(Menu &menu) {
 					fC = _screen->getTextWidth(_saveDescription);
 					textCursorStatus ^= 1;
 					textCursorTimer = _vm->_system->getMillis() + 20 * _vm->_tickLength;
-					_screen->fillRect((d->sx << 3) + fC, d->sy, (d->sx << 3) + fC + wW, d->sy + d->h - (_vm->gameFlags().use16ColorMode ? 2 : 1), textCursorStatus ? d->unk8 : d->unkA, 0);
+					_screen->fillRect((d->sx << 3) + fC, d->sy, (d->sx << 3) + fC + wW, d->sy + d->h - (_vm->gameFlags().use16ColorMode ? 2 : 1), textCursorStatus ? d->col1 : d->col2, 0);
 					_screen->updateScreen();
 					f = _screen->setFont(f);
 				}
@@ -2424,14 +2424,14 @@ int GUI_LoL::runMenu(Menu &menu) {
 				if (!_newMenu) {
 					if (_currentMenu == &_savenameMenu) {
 						Screen::FontId f = _screen->setFont(Screen::FID_9_FNT);
-						_screen->fillRect((d->sx << 3) + fC, d->sy, (d->sx << 3) + fC + wW, d->sy + d->h - (_vm->gameFlags().use16ColorMode ? 2 : 1), d->unkA, 0);
+						_screen->fillRect((d->sx << 3) + fC, d->sy, (d->sx << 3) + fC + wW, d->sy + d->h - (_vm->gameFlags().use16ColorMode ? 2 : 1), d->col2, 0);
 						fC = _screen->getTextWidth(_saveDescription);
 						while (fC >= fW) {
 							_saveDescription[strlen(_saveDescription) - 1] = 0;
 							fC = _screen->getTextWidth(_saveDescription);
 						}
-						_screen->fprintString("%s", (d->sx << 3), d->sy + 2, d->unk8, d->unkA, 0, _saveDescription);
-						_screen->fillRect((d->sx << 3) + fC, d->sy, (d->sx << 3) + fC + wW, d->sy + d->h - (_vm->gameFlags().use16ColorMode ? 2 : 1), textCursorStatus ? d->unk8 : d->unkA, 0);
+						_screen->fprintString("%s", (d->sx << 3), d->sy + 2, d->col1, d->col2, 0, _saveDescription);
+						_screen->fillRect((d->sx << 3) + fC, d->sy, (d->sx << 3) + fC + wW, d->sy + d->h - (_vm->gameFlags().use16ColorMode ? 2 : 1), textCursorStatus ? d->col1 : d->col2, 0);
 						f = _screen->setFont(f);
 						textCursorTimer = 0;
 						textCursorStatus = 0;
diff --git a/engines/kyra/script/script_eob.cpp b/engines/kyra/script/script_eob.cpp
index 4159326c9e9..62e03818d61 100644
--- a/engines/kyra/script/script_eob.cpp
+++ b/engines/kyra/script/script_eob.cpp
@@ -550,8 +550,8 @@ int EoBInfProcessor::oeob_printMessage_v1(int8 *data) {
 	_vm->txt()->printMessage(col);
 	_vm->txt()->printMessage(str);
 
-	col[1] = _vm->gameFlags().platform == Common::kPlatformSegaCD ? 0xFF : _vm->txt()->colorMap()[_screen->_curDim->unk8];
-	col[3] = _vm->txt()->colorMap()[_screen->_curDim->unkA];
+	col[1] = _vm->gameFlags().platform == Common::kPlatformSegaCD ? 0xFF : _vm->txt()->colorMap()[_screen->_curDim->col1];
+	col[3] = _vm->txt()->colorMap()[_screen->_curDim->col2];
 	_vm->txt()->printMessage(col);
 
 	if (lineBreak)
diff --git a/engines/kyra/script/script_lol.cpp b/engines/kyra/script/script_lol.cpp
index 83493ac0120..a5e975b7b78 100644
--- a/engines/kyra/script/script_lol.cpp
+++ b/engines/kyra/script/script_lol.cpp
@@ -564,7 +564,7 @@ int LoLEngine::olol_clearDialogueField(EMCState *script) {
 
 	_screen->setScreenDim(5);
 	const ScreenDim *d = _screen->getScreenDim(5);
-	_screen->fillRect(d->sx, d->sy, d->sx + d->w - (_flags.use16ColorMode ? 3 : 2), d->sy + d->h - 2, d->unkA);
+	_screen->fillRect(d->sx, d->sy, d->sx + d->w - (_flags.use16ColorMode ? 3 : 2), d->sy + d->h - 2, d->col2);
 	_txt->clearDim(4);
 	_txt->resetDimTextPositions(4);
 
@@ -2530,7 +2530,7 @@ int LoLEngine::tlol_clearTextField(const TIM *tim, const uint16 *param) {
 		return 1;
 	_screen->setScreenDim(5);
 	const ScreenDim *d = _screen->_curDim;
-	_screen->fillRect(d->sx, d->sy, d->sx + d->w - (_flags.use16ColorMode ? 3 : 2), d->sy + d->h - 2, d->unkA);
+	_screen->fillRect(d->sx, d->sy, d->sx + d->w - (_flags.use16ColorMode ? 3 : 2), d->sy + d->h - 2, d->col2);
 	_txt->clearDim(4);
 	_txt->resetDimTextPositions(4);
 	return 1;
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index e4f7fd70733..960d525beb3 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -1492,7 +1492,7 @@ void DarkmoonSequenceHelper::printText(int index, int color) {
 	for (int yOffs = 0; !str.empty(); yOffs += fontHeight) {
 		uint linebrk = str.findFirstOf('\r');
 		Common::String str2 = (linebrk != Common::String::npos) ? str.substr(0, linebrk) : str;
-		_screen->printText(str2.c_str(), (dm->sx * xAlignFactor + ((dm->w * xAlignFactor - str2.size()) >> 1)) << (4 - xAlignFactor), dm->sy + yOffs, color, dm->unkA);
+		_screen->printText(str2.c_str(), (dm->sx * xAlignFactor + ((dm->w * xAlignFactor - str2.size()) >> 1)) << (4 - xAlignFactor), dm->sy + yOffs, color, dm->col2);
 		str = (linebrk != Common::String::npos) ? str.substr(linebrk + 1) : "";
 	}
 
diff --git a/engines/kyra/text/text_eob_segacd.cpp b/engines/kyra/text/text_eob_segacd.cpp
index a745322d58f..d6aece4059d 100644
--- a/engines/kyra/text/text_eob_segacd.cpp
+++ b/engines/kyra/text/text_eob_segacd.cpp
@@ -75,7 +75,7 @@ void TextDisplayer_SegaCD::printShadedText(const char *str, int x, int y, int te
 	if (y == -1)
 		y = s->sy;
 	if (textColor == -1)
-		textColor = s->unk8;
+		textColor = s->col1;
 	if (shadowColor == -1)
 		shadowColor = 0;
 	if (pitchW == -1)
@@ -89,11 +89,11 @@ void TextDisplayer_SegaCD::printShadedText(const char *str, int x, int y, int te
 	if (!screenUpdate)
 		return;
 
-	if (s->unkE) {
+	if (s->column) {
 		for (int i = 0; i < (pitchH >> 3); ++i)
-			_screen->sega_loadTextBufferToVRAM(i * (pitchW << 2), ((s->unkC & 0x7FF) + i * s->unkE) << 5, pitchW << 2);
+			_screen->sega_loadTextBufferToVRAM(i * (pitchW << 2), ((s->line & 0x7FF) + i * s->column) << 5, pitchW << 2);
 	} else {
-		_screen->sega_loadTextBufferToVRAM(0, (s->unkC & 0x7FF) << 5, (pitchW * pitchH) >> 1);
+		_screen->sega_loadTextBufferToVRAM(0, (s->line & 0x7FF) << 5, (pitchW * pitchH) >> 1);
 	}
 }
 
@@ -102,9 +102,9 @@ int TextDisplayer_SegaCD::clearDim(int dim) {
 	_curDim = dim;
 	_curPosY = _curPosX = 0;
 	const ScreenDim *s = &_dimTable[dim];
-	_renderer->memsetVRAM((s->unkC & 0x7FF) << 5, s->unkA, (s->w * s->h) >> 1);
-	_screen->sega_clearTextBuffer(s->unkA);
-	memset(_msgRenderBuffer, s->unkA, _msgRenderBufferSize);
+	_renderer->memsetVRAM((s->line & 0x7FF) << 5, s->col2, (s->w * s->h) >> 1);
+	_screen->sega_clearTextBuffer(s->col2);
+	memset(_msgRenderBuffer, s->col2, _msgRenderBufferSize);
 	return res;
 }
 
@@ -191,7 +191,7 @@ uint8 TextDisplayer_SegaCD::fetchCharacter(char *dest, const char *&src) {
 
 void TextDisplayer_SegaCD::linefeed() {
 	copyTextBufferLine(_screen->getFontHeight(), 0, (_dimTable[_curDim].h & ~7) - _screen->getFontHeight(), _dimTable[_curDim].w >> 3);
-	clearTextBufferLine(_screen->getFontHeight(), _screen->getFontHeight(), _dimTable[_curDim].w >> 3, _dimTable[_curDim].unkA);
+	clearTextBufferLine(_screen->getFontHeight(), _screen->getFontHeight(), _dimTable[_curDim].w >> 3, _dimTable[_curDim].col2);
 }
 
 void TextDisplayer_SegaCD::clearTextBufferLine(uint16 y, uint16 lineHeight, uint16 pitch, uint8 col) {
diff --git a/engines/kyra/text/text_lol.cpp b/engines/kyra/text/text_lol.cpp
index d1c870c86ee..98cb883a747 100644
--- a/engines/kyra/text/text_lol.cpp
+++ b/engines/kyra/text/text_lol.cpp
@@ -140,11 +140,11 @@ void TextDisplayer_LoL::printDialogueText2(int dim, const char *str, EMCState *s
 		if (_vm->_updateFlags & 2) {
 			oldDim = clearDim(4);
 			_textDimData[4].color1 = _vm->gameFlags().use16ColorMode ? 0x33 : 254;
-			_textDimData[4].color2 = _screen->_curDim->unkA;
+			_textDimData[4].color2 = _screen->_curDim->col2;
 		} else {
 			oldDim = clearDim(3);
 			_textDimData[3].color1 = _vm->gameFlags().use16ColorMode ? 0x33 : 192;
-			_textDimData[3].color2 = _screen->_curDim->unkA;
+			_textDimData[3].color2 = _screen->_curDim->col2;
 			if (!_vm->gameFlags().use16ColorMode)
 				_screen->copyColor(192, 254);
 			_vm->enableTimer(11);
@@ -156,7 +156,7 @@ void TextDisplayer_LoL::printDialogueText2(int dim, const char *str, EMCState *s
 		_screen->setScreenDim(dim);
 		_lineCount = 0;
 		_textDimData[dim].color1 = _vm->gameFlags().use16ColorMode ? 0x33 : 254;
-		_textDimData[dim].color2 = _screen->_curDim->unkA;
+		_textDimData[dim].color2 = _screen->_curDim->col2;
 	}
 
 	int cp = _screen->setCurPage(0);
diff --git a/engines/kyra/text/text_rpg.cpp b/engines/kyra/text/text_rpg.cpp
index 98146830989..6a98d6926fd 100644
--- a/engines/kyra/text/text_rpg.cpp
+++ b/engines/kyra/text/text_rpg.cpp
@@ -67,10 +67,10 @@ TextDisplayer_rpg::TextDisplayer_rpg(KyraRpgEngine *engine, Screen *scr) : _vm(e
 
 	for (int i = 0; i < _screen->screenDimTableCount(); i++) {
 		const ScreenDim *d = _screen->getScreenDim(i);
-		_textDimData[i].color1 = _colorMap[d->unk8];
-		_textDimData[i].color2 = _colorMap[d->unkA];
-		_textDimData[i].line = d->unkC;
-		_textDimData[i].column = d->unkE;
+		_textDimData[i].color1 = _colorMap[d->col1];
+		_textDimData[i].color2 = _colorMap[d->col2];
+		_textDimData[i].line = d->line;
+		_textDimData[i].column = d->column;
 	}
 
 	_table1 = new char[128]();
@@ -628,8 +628,8 @@ void TextDisplayer_rpg::printMessage(const char *str, int textColor, ...) {
 int TextDisplayer_rpg::clearDim(int dim) {
 	int res = _screen->curDimIndex();
 	_screen->setScreenDim(dim);
-	_textDimData[dim].color1 = _colorMap[_screen->_curDim->unk8];
-	_textDimData[dim].color2 = (_vm->game() == GI_LOL || _vm->gameFlags().platform == Common::kPlatformAmiga) ? _colorMap[_screen->_curDim->unkA] : _vm->guiSettings()->colors.fill;
+	_textDimData[dim].color1 = _colorMap[_screen->_curDim->col1];
+	_textDimData[dim].color2 = (_vm->game() == GI_LOL || _vm->gameFlags().platform == Common::kPlatformAmiga) ? _colorMap[_screen->_curDim->col2] : _vm->guiSettings()->colors.fill;
 	clearCurDim();
 	return res;
 }


Commit: b28ec9260f8ea05d126726a15aa0fc3537f61cbc
    https://github.com/scummvm/scummvm/commit/b28ec9260f8ea05d126726a15aa0fc3537f61cbc
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:52:44+02:00

Commit Message:
KYRA: (EOB II/PC98) - menu text fixes

Changed paths:
    engines/kyra/gui/gui_eob.cpp


diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index e21e60e8213..85fac61261e 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -4423,17 +4423,22 @@ void GUI_EoB::displayTextBox(int id, int, bool) {
 	int op = _screen->setCurPage(2);
 	int od = _screen->curDimIndex();
 	Screen::FontId of = _screen->setFont(_menuFont);
+
 	_screen->setClearScreenDim(11);
 	const ScreenDim *dm = _screen->getScreenDim(11);
 
 	drawMenuButtonBox(dm->sx << 3, dm->sy, dm->w << 3, dm->h, false, false);
 	_screen->setTextMarginRight((dm->sx + dm->w) << 3);
 
+	Common::String tmp(getMenuString(id));
 	Common::Point txtPos((dm->sx << 3) + 5, dm->sy + 5);
-	if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98)
-		txtPos = Common::Point(dm->column << 3, (dm->line + 16) & ~7);
+	if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformPC98) {
+		for (size_t p = tmp.find("  "); p != Common::String::npos; p = tmp.find("  "))
+			tmp.deleteChar(p);		
+		txtPos = Common::Point(dm->sx << 3, (dm->sy + 16) & ~7);
+	}
 
-	_screen->printShadedText(getMenuString(id), txtPos.x, txtPos.y, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
+	_screen->printShadedText(tmp.c_str(), txtPos.x, txtPos.y, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
 	_screen->setTextMarginRight(Screen::SCREEN_W);
 	_screen->copyRegion(dm->sx << 3, dm->sy, dm->sx << 3, dm->sy, dm->w << 3, dm->h, 2, 0, Screen::CR_NO_P_CHECK);
 	_screen->updateScreen();
@@ -4565,9 +4570,11 @@ void GUI_EoB::drawMenuButtonBox(int x, int y, int w, int h, bool clicked, bool n
 void GUI_EoB::drawTextBox(int dim, int id) {
 	int od = _screen->curDimIndex();
 	_screen->setScreenDim(dim);
-	const ScreenDim *dm = _screen->getScreenDim(dim);
-	Screen::FontId of = _screen->setFont(_vm->_flags.lang == Common::Language::ZH_TWN ? Screen::FontId::FID_CHINESE_FNT : _vm->_flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
 
+	Screen::FontId of = _screen->setFont(_menuFont);
+	int cs = (_vm->gameFlags().platform == Common::kPlatformPC98 && !_vm->gameFlags().use16ColorMode) ? _screen->setFontStyles(_menuFont, Font::kStyleFat) : -1;
+
+	const ScreenDim *dm = _screen->getScreenDim(dim);
 	if (dm->w <= 22 && dm->h <= 84)
 		_screen->copyRegion(dm->sx << 3, dm->sy, 0, dm->h, dm->w << 3, dm->h, 0, 2, Screen::CR_NO_P_CHECK);
 
@@ -4580,6 +4587,9 @@ void GUI_EoB::drawTextBox(int dim, int id) {
 	_screen->copyRegion(0, 0, dm->sx << 3, dm->sy, dm->w << 3, dm->h, 2, 0, Screen::CR_NO_P_CHECK);
 	_screen->updateScreen();
 	_screen->setScreenDim(od);
+
+	if (cs != -1)
+		_screen->setFontStyles(_screen->_currentFont, cs);
 	_screen->setFont(of);
 }
 


Commit: 67f374c798c8291ae1cd4db80a690a91e6b9c052
    https://github.com/scummvm/scummvm/commit/67f374c798c8291ae1cd4db80a690a91e6b9c052
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:52:47+02:00

Commit Message:
KYRA: (EOB II/PC98) - fix saveload strings

Changed paths:
    engines/kyra/resource/staticres_eob.cpp


diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index 9354ac73fde..8d02a530f2f 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -561,8 +561,13 @@ void EoBCoreEngine::initStaticResource() {
 		{   "Abbr.",    "Leerer Slot",		"Speichern",    "  Laden"       },
 		{	" < < ",	"Posizione Vuota",	"Salva",		"Carica"	    },
 		{	"Anular",	"Sin Uso",			"Grabar",		"Cargar"	    },
+		// SegaCD English
 		{   "Cancel",   "\x82""d""\x82\x8d\x82\x90\x82\x94\x82\x99\x81""@""\x82\x92\x82\x85\x82\x87\x82\x89\x82\x8f\x82\x8e",		"Select save area",    "Select load data"     },
+		// SegaCD Japanese
 		{   "\x82\xe2\x82\xdf\x82\xe9",   "\x8b\xf3\x82\xab\x97\xcc\x88\xe6",	"\x82\xc7\x82\xb1\x82\xc9\x83""Z""\x81""|""\x83""u""\x82\xb5\x82\xdc\x82\xb7\x82\xa9\x81""H",	"\x82\xc7\x82\xea\x82\xf0\x83\x8d\x81""|""\x83""h""\x82\xb5\x82\xdc\x82\xb7\x82\xa9\x81""H"    },
+		// PC-98 Japanese
+		{   "Cancel",   "Empty Slot",	  "\x83\x51\x81\x5B\x83\x80\x83\x5A\x81\x5B\x83\x75", "\x83\x51\x81\x5B\x83\x80\x83\x8D\x81\x5B\x83\x68" },
+		// DOS Chinese
 		{   "\xa8\xfa\xae\xf8" /* "取消"; */, "\xa9\x7c\xa5\xbc\xa8\xcf\xa5\xce" /* "尚未使用"; */, "\xa6\x73\xa9\xf1\xb6\x69\xab\xd7" /* "存放進度"; */, "\xb8\xfc\xa4\x4a\xb6\x69\xab\xd7" /* "載入進度"; */  },
 	};
 
@@ -571,10 +576,14 @@ void EoBCoreEngine::initStaticResource() {
 		"Hier ist noch kein\rSpiel gespeichert!",
 		"Non c'\x0E alcun gioco\rsalvato in quella\rposizione!",
 		"No hay partidas\rgrabadas!",
-		"\r ""\x82\xBB\x82\xCC\x83""X""\x83\x8D\x83""b""\x83""g""\x82\xC9\x82\xCD\x83""Q""\x81""[""\x83\x80\x82\xAA\x83""Z""\x81""[""\x83""u\r ""\x82\xB3\x82\xEA\x82\xC4\x82\xA2\x82\xDC\x82\xB9\x82\xF1\x81""B",
+		// SegaCD English
+		"\r  ""\x82\xBB\x82\xCC\x83""X""\x83\x8D\x83""b""\x83""g""\x82\xC9\x82\xCD\x83""Q""\x81""[""\x83\x80\x82\xAA\x83""Z""\x81""[""\x83""u\r ""\x82\xB3\x82\xEA\x82\xC4\x82\xA2\x82\xDC\x82\xB9\x82\xF1\x81""B",
+		// SegaCD + FM-Towns Japanese
 		"\x8b\xf3\x82\xab\x97\xcc\x88\xe6",
-		"\xb3\x6f\xad\xd3\xa6\xec\xb8\x6d\xa9\x7c\xa5\xbc\xc0\x78\xa6\x73\x0d\xb8\xea\xae\xc6\xc0\xc9\x2c\xbd\xd0\xad\xab\xb7\x73\xbf\xef\xbe\xdc", /* "這個位置尚未\r資料檔,請重新選擇"; */
-		0
+		// PC-98 Japanese
+		"\r \x82\xBB\x82\xCC\x83\x58\x83\x8D\x83\x62\x83\x67\x82\xC9\x82\xCD\x83\x66\x81\x5B\x83\x5E\x82\xAA\x83\x5A\x81\x5B\x83\x75\r \x82\xB3\x82\xEA\x82\xC4\x82\xA2\x82\xDC\x82\xB9\x82\xF1\x81\x42",
+		// DOS Chinese
+		"\xb3\x6f\xad\xd3\xa6\xec\xb8\x6d\xa9\x7c\xa5\xbc\xc0\x78\xa6\x73\x0d\xb8\xea\xae\xc6\xc0\xc9\x2c\xbd\xd0\xad\xab\xb7\x73\xbf\xef\xbe\xdc" /* "這個位置尚未\r資料檔,請重新選擇"; */
 	};
 
 	_menuOkString = "OK";
@@ -606,16 +615,22 @@ void EoBCoreEngine::initStaticResource() {
 		if (_flags.platform == Common::kPlatformSegaCD) {
 			_saveLoadStrings = saveLoadStrings[5];
 			_errorSlotEmptyString = errorSlotEmptyString[5];
-		} else {
+		} else if (_flags.platform == Common::kPlatformFMTowns) {
 			// EOB II FM-Towns uses English here.
 			// Only the empty slot warning is in Japanese.
 			_saveLoadStrings = saveLoadStrings[0];
 			_errorSlotEmptyString = errorSlotEmptyString[4];
+		} else if (_flags.platform == Common::kPlatformPC98) {
+			_saveLoadStrings = saveLoadStrings[6];
+			_errorSlotEmptyString = errorSlotEmptyString[6];
+		} else {
+			_saveLoadStrings = saveLoadStrings[0];
+			_errorSlotEmptyString = errorSlotEmptyString[0];
 		}
 		break;
 	case Common::ZH_TWN:
-		_saveLoadStrings = saveLoadStrings[6];
-		_errorSlotEmptyString = errorSlotEmptyString[6];
+		_saveLoadStrings = saveLoadStrings[7];
+		_errorSlotEmptyString = errorSlotEmptyString[7];
 		_menuOkString = "\xa7\xb9\xb2\xa6"; /* "完畢" */
 		break;
 


Commit: aca46ac5a476a0eea2546ef09c31520ff9798ccc
    https://github.com/scummvm/scummvm/commit/aca46ac5a476a0eea2546ef09c31520ff9798ccc
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:52:48+02:00

Commit Message:
KYRA: (EOB II/PC98) - fix party transfer dialog

Changed paths:
    engines/kyra/engine/chargen.cpp


diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 97cb47026e6..419722020dc 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -2015,6 +2015,8 @@ bool TransferPartyWiz::start() {
 		for (int i = 0; i < 6; i++)
 			delete[] _vm->_characters[i].faceShape;
 		memset(_vm->_characters, 0, sizeof(EoBCharacter) * 6);
+		_screen->clearPage(0);
+		_screen->clearPage(2);
 		return false;
 	}
 
@@ -2037,6 +2039,9 @@ bool TransferPartyWiz::start() {
 	convertInventory();
 	giveKhelbensCoin();
 
+	_screen->clearPage(0);
+	_screen->clearPage(2);
+
 	return true;
 }
 
@@ -2072,8 +2077,9 @@ bool TransferPartyWiz::selectAndLoadTransferFile() {
 		return false;
 
 	Common::String target = _vm->_gui->transferTargetMenu(eobTargets);
+	_screen->clearPage(0);
 	_screen->copyPage(12, 0);
-
+	
 	if (target.empty())
 		return true;
 
@@ -2083,35 +2089,50 @@ bool TransferPartyWiz::selectAndLoadTransferFile() {
 		delete in;
 		if (_vm->_gui->confirmDialogue2(15, -2, 1))
 			return true;
+		_screen->clearPage(0);
 	}
 
 	_screen->copyPage(12, 0);
 
 	bool result = _vm->_gui->transferFileMenu(target, dest);
+	_screen->clearPage(0);
 	_screen->copyPage(12, 0);
 
 	return result;
 }
 
 int TransferPartyWiz::selectCharactersMenu() {
+	static const int16 coordDef[] = { 0, 272, 43, 9, 288 };
+	static const int16 coordJp[] = { 2, 259, 56, 8, 280 };
+	const int16 *coord = coordDef;
+
 	_screen->setCurPage(2);
-	Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
+	Screen::FontId of = _screen->setFont(_vm->_conFont);
 	_screen->clearCurPage();
 
 	_vm->gui_drawBox(0, 0, 320, 163, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
-	_screen->printText(_strings2[0], 5, 3, _vm->guiSettings()->colors.guiColorWhite, 0);
-	_screen->printText(_strings2[1], 5, 10, _vm->guiSettings()->colors.guiColorWhite, 0);
 
+	_screen->setFont(_vm->_invFont1);
 	for (int i = 0; i < 6; i++)
 		drawCharPortraitWithStats(i, 0);
+	_screen->setFont(_vm->_conFont);
 
-	_vm->gui_drawBox(4, 148, 43, 12, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
-	_vm->gui_drawBox(272, 148, 43, 12, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
+	if (_vm->_flags.lang == Common::JA_JPN) {
+		_screen->printText(_strings2[0], 4, 4, _vm->guiSettings()->colors.guiColorWhite, 0);
+		_screen->printText(_strings2[1], 4, 12, _vm->guiSettings()->colors.guiColorWhite, 0);
+		coord = coordJp;
+	} else {
+		_screen->printText(_strings2[0], 5, 3, _vm->guiSettings()->colors.guiColorWhite, 0);
+		_screen->printText(_strings2[1], 5, 10, _vm->guiSettings()->colors.guiColorWhite, 0);
+	}
 
-	_screen->printShadedText(_labels[0], 9, 151, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
-	_screen->printShadedText(_labels[1], 288, 151, _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
+	_vm->gui_drawBox(4, 148 - coord[0], coord[2], 12 + coord[0], _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
+	_vm->gui_drawBox(coord[1], 148 - coord[0], coord[2], 12 + coord[0], _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
+	_screen->printShadedText(_labels[0], coord[3], 151 - (coord[0] >> 1), _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);
+	_screen->printShadedText(_labels[1], coord[4], 151 - (coord[0] >> 1), _vm->guiSettings()->colors.guiColorWhite, 0, _vm->guiSettings()->colors.guiColorBlack);	
 
 	_screen->setCurPage(0);
+	_screen->clearPage(0);
 	_screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK);
 	_screen->updateScreen();
 
@@ -2161,17 +2182,19 @@ int TransferPartyWiz::selectCharactersMenu() {
 		if (highlight < 6) {
 			if (_vm->_characters[highlight].flags & 1) {
 				selection ^= (1 << highlight);
+				_screen->setFont(_vm->_invFont1);
 				drawCharPortraitWithStats(highlight, (selection & (1 << highlight)) ? true : false);
+				_screen->setFont(_vm->_conFont);
 				_screen->updateScreen();
 			}
 			continue;
 		}
 
-		int x = (highlight - 6) * 268 + 4;
-		_vm->gui_drawBox(x, 148, 43, 12, _vm->guiSettings()->colors.fill, _vm->guiSettings()->colors.fill, -1);
+		int x = (highlight - 6) * (coord[1] - 4) + 4;
+		_vm->gui_drawBox(x, 148 - coord[0], coord[2], 12 + coord[0], _vm->guiSettings()->colors.fill, _vm->guiSettings()->colors.fill, -1);
 		_screen->updateScreen();
 		_vm->_system->delayMillis(80);
-		_vm->gui_drawBox(x, 148, 43, 12, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, -1);
+		_vm->gui_drawBox(x, 148 - coord[0], coord[2], 12 + coord[0], _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, -1);
 		_screen->updateScreen();
 
 		if (highlight == 6 || _vm->shouldQuit()) {
@@ -2236,9 +2259,13 @@ void TransferPartyWiz::drawCharPortraitWithStats(int charIndex, bool enabled) {
 }
 
 void TransferPartyWiz::updateHighlight(int index) {
-	static const int16 xPos[] = { 9, 288 };
+	static const int16 xPosDef[] = { 9, 288 };
+	static const int16 xPosJp[] = { 8, 280 };
+	const int16 *xPos = (_vm->_flags.lang == Common::JA_JPN) ? xPosJp : xPosDef;
+	int16 yPos = (_vm->_flags.lang == Common::JA_JPN) ? 150 : 151;
+
 	if (_highlight > 5 && _highlight != index)
-		_screen->printText(_labels[_highlight - 6], xPos[_highlight - 6], 151, _vm->guiSettings()->colors.guiColorWhite, 0);
+		_screen->printText(_labels[_highlight - 6], xPos[_highlight - 6], yPos, _vm->guiSettings()->colors.guiColorWhite, 0);
 
 	if (index < 6) {
 		_vm->_gui->updateBoxFrameHighLight(14 + index);
@@ -2252,7 +2279,7 @@ void TransferPartyWiz::updateHighlight(int index) {
 	if (_highlight < 6)
 		_vm->_gui->updateBoxFrameHighLight(-1);
 
-	_screen->printText(_labels[index - 6], xPos[index - 6], 151, _vm->guiSettings()->colors.guiColorLightRed, 0);
+	_screen->printText(_labels[index - 6], xPos[index - 6], yPos, _vm->guiSettings()->colors.guiColorLightRed, 0);
 	_screen->updateScreen();
 	_highlight = index;
 }


Commit: 77976efabe51e550fb13d400d33703c232754e94
    https://github.com/scummvm/scummvm/commit/77976efabe51e550fb13d400d33703c232754e94
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T14:52:51+02:00

Commit Message:
KYRA: (EOB II/PC98) - fix party transfer JIS font conversion

(this allow proper import from EOB I PC98 which uses a JIS X 0201 encoding)

Changed paths:
    engines/kyra/engine/chargen.cpp
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/engine/eobcommon.h
    engines/kyra/graphics/screen.cpp
    engines/kyra/graphics/screen.h
    engines/kyra/graphics/screen_eob.cpp
    engines/kyra/graphics/screen_eob.h
    engines/kyra/graphics/screen_eob_pc98.cpp


diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 419722020dc..11dada2c191 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -1965,6 +1965,8 @@ private:
 	Item convertItem(Item eob1Item);
 	void giveKhelbensCoin();
 
+	Common::String convertFromJISX0201(const Common::String &src);
+
 	EoBCoreEngine *_vm;
 	Screen_EoB *_screen;
 
@@ -2225,6 +2227,8 @@ int TransferPartyWiz::selectCharactersMenu() {
 	return selection;
 }
 
+
+
 void TransferPartyWiz::drawCharPortraitWithStats(int charIndex, bool enabled) {
 	int16 x = (charIndex % 2) * 159;
 	int16 y = (charIndex / 2) * 40;
@@ -2289,6 +2293,12 @@ void TransferPartyWiz::convertStats() {
 		EoBCharacter *c = &_vm->_characters[i];
 		uint32 aflags = 0;
 
+		if (_vm->_flags.lang == Common::JA_JPN && _vm->_flags.platform == Common::kPlatformPC98) {
+			Common::String cname(c->name);
+			cname = convertFromJISX0201(cname);
+			Common::strlcpy(c->name, cname.c_str(), cname.size() + 1);
+		}
+
 		for (int ii = 0; ii < 25; ii++) {
 			if (c->mageSpellsAvailableFlags & (1 << ii)) {
 				int8 f = (int8)_convertTable[ii + 1] - 1;
@@ -2471,6 +2481,78 @@ void TransferPartyWiz::giveKhelbensCoin() {
 	}
 }
 
+Common::String TransferPartyWiz::convertFromJISX0201(const Common::String &src) {
+	int temp;
+	const char *t1 = _vm->_ascii2SjisTables[3];
+	//Common::String t2 = _vm->_ascii2SjisTables[1];
+	//Common::String t3 = _vm->_ascii2SjisTables[2];
+	const uint8 *t4 = _vm->staticres()->loadRawData(kEoB2FontConvertTbl, temp);
+
+	char tmp[30] = "";
+	char *d = tmp;
+	uint8 last = '\0';
+
+	for (const char *s = src.c_str(); *s; ++s) {
+		if (*s != '\xde' && *s != '\xdf') {
+			uint8 c = *s;
+
+			if (c == 176) {
+				c = 45;
+			} else if (c < 32 || c > 221 || (c > 126 && c != 176 && c < 166)) {
+				continue;
+			} else if (c > 126) {
+				uint8 h = t1[(c - 166) << 1];
+				uint8 l = t1[((c - 166) << 1) + 1];
+
+				if (h == 0x81) {
+					if (l > 0xac)
+						continue;
+					c = t4[l - 64];
+
+				} else if (h == 0x82) {
+					if (l >= 0x4f && l <= 0x58)
+						c = l - 31;
+					else if (l >= 0x60 && l <= 0x79)
+						c = l - 31;
+					else if (l >= 0x81 && l <= 0x9a)
+						c = l - 32;
+					else
+						continue;
+
+				} else if (h == 0x83 && l >= 0x40 && l <= 0x93) {
+					c = l + 64;
+				} else {
+					continue;
+				}
+			}
+
+			*d++ = last = c;
+
+		} else if (last) {
+			if (last > 127) {
+				//char tb[3] = "\0\0";
+				if (*s == '\xde') {
+					//size_t p = t3.find(tb);
+					//if (p != Common::String::npos)
+						last = last + 1;
+
+				} else {
+					//size_t p = t2.find(tb);
+					//if (p != Common::String::npos)
+						last = last + 2;
+				}
+			}
+			d--;
+			*d++ = last;
+			last = '\0';
+		}
+	}
+
+	*d = '\0';
+
+	return tmp;
+}
+
 // Start functions
 
 bool EoBCoreEngine::startCharacterGeneration(bool defaultParty) {
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 55ad164347e..ab7b40d7ba0 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -2046,7 +2046,7 @@ bool EoBCoreEngine::checkPassword() {
 	return true;
 }
 
-Common::String EoBCoreEngine::convertAsciiToSjis(Common::String str) {
+Common::String EoBCoreEngine::convertAsciiToSjis(const Common::String &str) {
 	if (_flags.platform != Common::kPlatformFMTowns)
 		return str;
 
diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h
index 0c30d096251..ecce2f54990 100644
--- a/engines/kyra/engine/eobcommon.h
+++ b/engines/kyra/engine/eobcommon.h
@@ -915,7 +915,7 @@ protected:
 	virtual void seq_segaPausePlayer(bool pause) {}
 	bool checkPassword();
 
-	Common::String convertAsciiToSjis(Common::String str);
+	Common::String convertAsciiToSjis(const Common::String &str);
 
 	virtual int resurrectionSelectDialogue() = 0;
 	virtual void useHorn(int charIndex, int weaponSlot) {}
diff --git a/engines/kyra/graphics/screen.cpp b/engines/kyra/graphics/screen.cpp
index 4d8acd43e88..8aa4424cc34 100644
--- a/engines/kyra/graphics/screen.cpp
+++ b/engines/kyra/graphics/screen.cpp
@@ -1563,7 +1563,7 @@ void Screen::printText(const char *str, int x, int y, uint8 color1, uint8 color2
 
 uint16 Screen::fetchChar(const char *&s) const {
 	const int fontType = _fonts[_currentFont]->getType();
-	if (fontType == Font::kASCII)
+	if (fontType == Font::kASCII || fontType == Font::kJIS_X0201)
 		return (uint8)*s++;
 
 	uint16 ch = (uint8)*s++;
diff --git a/engines/kyra/graphics/screen.h b/engines/kyra/graphics/screen.h
index ee161e88dca..74e20c70ab8 100644
--- a/engines/kyra/graphics/screen.h
+++ b/engines/kyra/graphics/screen.h
@@ -66,6 +66,7 @@ public:
 	 */
 	enum Type {
 		kASCII = 0,
+		kJIS_X0201,
 		kSJIS,
 		kBIG5,
 		kJohab
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index faaa91009ae..1cd3c6748ad 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -1715,10 +1715,13 @@ bool Screen_EoB::loadFont(FontId fontId, const char *filename) {
 	}
 
 	if (_vm->gameFlags().platform == Common::kPlatformPC98 && _vm->game() == GI_EOB2) {
-		if (fontId == FID_SJIS_SMALL_FNT)
-			fnt = new PC98Font(12, true, 2, _vm->staticres()->loadRawData(kEoB2FontConvertTbl, temp));
-		else
+		if (fontId == FID_SJIS_SMALL_FNT) {
+			const char *const *tbl = _vm->staticres()->loadStrings(kEoB2Ascii2SjisTables2, temp);
+			assert(temp > 1);
+			fnt = new PC98Font(12, true, 2, _vm->staticres()->loadRawData(kEoB2FontConvertTbl, temp), tbl[0], tbl[1]);
+		} else {
 			fnt = new PC98Font(12, false, 1);
+		}
 	} else if (fontId == FID_SJIS_SMALL_FNT) {
 		if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
 			fnt = new SJISFont12x12(_vm->staticres()->loadRawDataBe16(kEoB2FontLookupTbl, temp));
diff --git a/engines/kyra/graphics/screen_eob.h b/engines/kyra/graphics/screen_eob.h
index e85d7de1b8f..13886ab6762 100644
--- a/engines/kyra/graphics/screen_eob.h
+++ b/engines/kyra/graphics/screen_eob.h
@@ -408,14 +408,14 @@ private:
 
 /**
 * OldDOSFont variant used in EOB I PC-98. It uses the same drawing routine, but has a different loader. It contains
-* ASCII and Katakana characters and requires several conversion tables to display these. It gets drawn on the hires overlay.
+* ASCII and Katakana characters in JIS X 0201 and requires several conversion tables to display these. It gets drawn on the hires overlay.
 */
 class Font12x12PC98 : public OldDOSFont{
 public:
 	Font12x12PC98(uint8 shadowColor, const uint16 *convTable1, const uint16 *convTable2, const uint8 *lookupTable);
 	~Font12x12PC98() override;
 	bool usesOverlay() const override { return true; }
-	Type getType() const override { return kSJIS; }
+	Type getType() const override { return kJIS_X0201; }
 	int getHeight() const override { return _height >> 1; }
 	int getWidth() const override { return _width >> 1; }
 	int getCharWidth(uint16 c) const override { return _width >> 1; };
@@ -433,19 +433,24 @@ private:
 */
 class PC98Font : public OldDOSFont {
 public:
-	PC98Font(uint8 shadowColor, bool useOverlay, int scaleV, const uint8 *convTable = 0);
+	PC98Font(uint8 shadowColor, bool useOverlay, int scaleV, const uint8 *convTable1 = 0, const char *convTable2 = 0, const char *convTable3 = 0);
 	~PC98Font() override {}
 	bool load(Common::SeekableReadStream &file) override;
 	int getHeight() const override { return _outputHeight; }
 	int getWidth() const override { return _outputWidth; }
 	int getCharWidth(uint16 c) const override { return _outputWidth; };
+	Type getType() const override { return _type; }
 
 private:
 	uint16 convert(uint16 c) const override;
-	const uint8 *_convTable;
+	uint16 makeTwoByte(uint16 c) const;
+
+	const uint8 *_convTable1;
+	const char *_convTable2, *_convTable3;
 
 	int _outputHeight;
 	int _outputWidth;
+	const Type _type;
 };
 
 /**
diff --git a/engines/kyra/graphics/screen_eob_pc98.cpp b/engines/kyra/graphics/screen_eob_pc98.cpp
index a69939e454f..4f4f7735ad1 100644
--- a/engines/kyra/graphics/screen_eob_pc98.cpp
+++ b/engines/kyra/graphics/screen_eob_pc98.cpp
@@ -318,7 +318,8 @@ uint16 Font12x12PC98::convert(uint16 c) const {
 	return c;
 }
 
-PC98Font::PC98Font(uint8 shadowColor, bool useOverlay, int scaleV, const uint8 *convTable) : OldDOSFont(Common::kRenderVGA, shadowColor), _convTable(convTable), _outputWidth(0), _outputHeight(0) {
+PC98Font::PC98Font(uint8 shadowColor, bool useOverlay, int scaleV, const uint8 *convTable1, const char *convTable2, const char *convTable3) : OldDOSFont(Common::kRenderVGA, shadowColor),
+	_convTable1(convTable1), _convTable2(convTable2), _convTable3(convTable3), _outputWidth(0), _outputHeight(0), _type(convTable1 && convTable2 && convTable3 ? kJIS_X0201 : kASCII) {
 	_numGlyphsMax = 256;
 	_useOverlay = useOverlay;
 	_scaleV = scaleV;
@@ -340,7 +341,10 @@ bool PC98Font::load(Common::SeekableReadStream &file) {
 }
 
 uint16 PC98Font::convert(uint16 c) const {
-	if (!_convTable || c < 128)
+	if (_type == kJIS_X0201)
+		c = makeTwoByte(c);
+
+	if (!_convTable1 || c < 128)
 		return c;
 
 	uint8 lo = c & 0xff;
@@ -348,21 +352,48 @@ uint16 PC98Font::convert(uint16 c) const {
 
 	if (lo == 0x81) {
 		if (hi >= 0x40 && hi <= 0xac)
-			return _convTable[hi - 0x40];
+			return _convTable1[hi - 0x40];
 	} else if (lo == 0x82) {
 		if (hi >= 0x4f && hi <= 0x58)
-			return hi + 0xe1;
+			return hi - 31;
 		if (hi >= 0x60 && hi <= 0x79)
-			return hi - 0x1f;
+			return hi - 31;
 		if (hi >= 0x81 && hi <= 0x9a)
-			return hi - 0x20;
+			return hi - 32;
 	} else if (lo == 0x83 && hi >= 0x40 && hi <= 0x93) {
-		return hi + 0x40;
+		return hi + 64;
 	}
 
 	return 0;
 }
 
+uint16 PC98Font::makeTwoByte(uint16 c) const {
+	if (!_convTable2 || !_convTable3)
+		return c;
+
+	uint8 l = c & 0xFF;
+	uint8 h = c >> 8;
+
+	if (h || l < 32 || l == 127) {
+		return c;
+	} else if (l < 127) {
+		c = (l - 32) * 2;
+		assert(c < 190);
+		l = _convTable2[c];
+		h = _convTable2[c + 1];
+	} else if (l < 212) {
+		h = l - 64;
+		l = 0x83;
+	} else {
+		c = (l - 212) * 2;
+		assert(c < 8);
+		l = _convTable3[c];
+		h = _convTable3[c + 1];
+	}
+
+	return (h << 8) | l;
+}
+
 } // End of namespace Kyra
 
 #endif // ENABLE_EOB


Commit: cf7a1e44941ea838f302b325527dabefa9ae12e2
    https://github.com/scummvm/scummvm/commit/cf7a1e44941ea838f302b325527dabefa9ae12e2
Author: athrxx (athrxx at scummvm.org)
Date: 2023-05-12T15:54:44+02:00

Commit Message:
KYRA: (EOB) - fix warnings

Changed paths:
    engines/kyra/sequence/sequences_eob.cpp
    engines/kyra/sound/sound_pc98_darkmoon.cpp


diff --git a/engines/kyra/sequence/sequences_eob.cpp b/engines/kyra/sequence/sequences_eob.cpp
index 900cd1f56cb..d45cba6465e 100644
--- a/engines/kyra/sequence/sequences_eob.cpp
+++ b/engines/kyra/sequence/sequences_eob.cpp
@@ -2473,7 +2473,7 @@ void EoBEngine::seq_segaOpeningCredits(bool jumpToTitle) {
 	r->loadToVRAM(scrollTable, 0x400, 0xD800);
 
 	Common::SeekableReadStreamEndian *containerAlt = _sres->loadContainer("CREDIT") ? 0 : _res->createEndianAwareReadStream("CREDIT");
-	Common::SeekableReadStreamEndian *in = containerAlt ? new Common::SeekableSubReadStreamEndian(containerAlt, 0, 35840, true) : _sres->resStreamEndian(1);
+	Common::SeekableReadStreamEndian *in = containerAlt ? new Common::SeekableReadStreamEndianWrapper(new Common::SeekableSubReadStream(containerAlt, 0, 35840), true, DisposeAfterUse::YES) : _sres->resStreamEndian(1);
 	r->loadStreamToVRAM(in, 32, !containerAlt);
 	delete in;
 
@@ -2491,8 +2491,7 @@ void EoBEngine::seq_segaOpeningCredits(bool jumpToTitle) {
 		updateScrollState(scrollTable, 320);
 		r->loadToVRAM(scrollTable, 0x400, 0xD800);
 		_screen->sega_selectPalette(i == 3 && _flags.lang == Common::EN_ANY ? 59 : 50, 0, true);
-
-		in = containerAlt ? new Common::SeekableSubReadStreamEndian(containerAlt, i * 35840, (i + 1) * 35840, true) : _sres->resStreamEndian(i);
+		in = containerAlt ? new Common::SeekableReadStreamEndianWrapper(new Common::SeekableSubReadStream(containerAlt, i * 35840, (i + 1) * 35840), true, DisposeAfterUse::YES) : _sres->resStreamEndian(i);
 		r->loadStreamToVRAM(in, 32, !containerAlt);
 		delete in;
 
@@ -2539,8 +2538,7 @@ void EoBEngine::seq_segaOpeningCredits(bool jumpToTitle) {
 	r->memsetVRAM(0xD800, 0, 0x400);
 	r->setPitch(64);
 	_screen->sega_selectPalette(0, 0);
-
-	in = containerAlt ? new Common::SeekableSubReadStreamEndian(containerAlt, last * 35840, (last + 1) * 35840, true) : _sres->resStreamEndian(last);
+	in = containerAlt ? new Common::SeekableReadStreamEndianWrapper(new Common::SeekableSubReadStream(containerAlt, last * 35840, (last + 1) * 35840), true, DisposeAfterUse::YES) : _sres->resStreamEndian(last);
 	r->loadStreamToVRAM(in, 32, !containerAlt);
 	delete in;
 	delete containerAlt;
diff --git a/engines/kyra/sound/sound_pc98_darkmoon.cpp b/engines/kyra/sound/sound_pc98_darkmoon.cpp
index 20a3206df7b..b7b6380d17a 100644
--- a/engines/kyra/sound/sound_pc98_darkmoon.cpp
+++ b/engines/kyra/sound/sound_pc98_darkmoon.cpp
@@ -123,9 +123,9 @@ void SoundPC98_Darkmoon::updateVolumeSettings() {
 	if (!_driver || !_ready)
 		return;
 
-	bool mute = false;
-	if (ConfMan.hasKey("mute"))
-		mute = ConfMan.getBool("mute");
+	//bool mute = false;
+	//if (ConfMan.hasKey("mute"))
+	//	mute = ConfMan.getBool("mute");
 
 	//_driver->setMusicVolume((mute ? 0 : ConfMan.getInt("music_volume")));
 	//_driver->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume")));




More information about the Scummvm-git-logs mailing list