KYRA: (EOB) - add support for FM-Towns version of EOB II

This commit is contained in:
athrxx 2016-01-09 22:00:51 +01:00
parent 61bd730bcf
commit f49eaa5654
48 changed files with 78963 additions and 681 deletions

View File

@ -323,7 +323,7 @@ const ExtractFilename extractFilenames[] = {
{ kEoBBaseWllFlagPreset, kRawData, false },
{ kEoBBaseDscShapeCoords, kRawDataBe16, false },
{ kEoBBaseDscDoorScaleOffs, kRawData, false },
{ kRpgCommonDscDoorScaleOffs, kRawData, false },
{ kEoBBaseDscDoorScaleMult1, kRawData, false },
{ kEoBBaseDscDoorScaleMult2, kRawData, false },
{ kEoBBaseDscDoorScaleMult3, kRawData, false },
@ -477,6 +477,7 @@ const ExtractFilename extractFilenames[] = {
// EYE OF THE BEHOLDER II
{ kEoB2MainMenuStrings, kStringList, true },
{ kEoB2MainMenuUtilStrings, kStringList, true },
{ kEoB2TransferPortraitFrames, kRawDataBe16, false },
{ kEoB2TransferConvertTable, kRawData, false },
@ -536,6 +537,19 @@ const ExtractFilename extractFilenames[] = {
{ kEoB2IntroShapes01, kEoB2ShapeData, false },
{ kEoB2IntroShapes04, kEoB2ShapeData, false },
{ kEoB2IntroShapes07, kEoB2ShapeData, false },
{ kEoB2IntroCpsDataStreet1, kRawData, false },
{ kEoB2IntroCpsDataStreet2, kRawData, false },
{ kEoB2IntroCpsDataDoorway1, kRawData, false },
{ kEoB2IntroCpsDataDoorway2, kRawData, false },
{ kEoB2IntroCpsDataWestwood, kRawData, false },
{ kEoB2IntroCpsDataWinding, kRawData, false },
{ kEoB2IntroCpsDataKhelban2, kRawData, false },
{ kEoB2IntroCpsDataKhelban1, kRawData, false },
{ kEoB2IntroCpsDataKhelban3, kRawData, false },
{ kEoB2IntroCpsDataKhelban4, kRawData, false },
{ kEoB2IntroCpsDataCoin, kRawData, false },
{ kEoB2IntroCpsDataKhelban5, kRawData, false },
{ kEoB2IntroCpsDataKhelban6, kRawData, false },
{ kEoB2FinaleStrings, kStringList, true },
{ kEoB2CreditsData, kRawData, true },
@ -566,6 +580,20 @@ const ExtractFilename extractFilenames[] = {
{ kEoB2FinaleShapes07, kEoB2ShapeData, false },
{ kEoB2FinaleShapes09, kEoB2ShapeData, false },
{ kEoB2FinaleShapes10, kEoB2ShapeData, false },
{ kEoB2FinaleCpsDataDragon1, kRawData, false },
{ kEoB2FinaleCpsDataDragon2, kRawData, false },
{ kEoB2FinaleCpsDataHurry1, kRawData, false },
{ kEoB2FinaleCpsDataHurry2, kRawData, false },
{ kEoB2FinaleCpsDataDestroy0, kRawData, false },
{ kEoB2FinaleCpsDataDestroy1, kRawData, false },
{ kEoB2FinaleCpsDataDestroy2, kRawData, false },
{ kEoB2FinaleCpsDataMagic, kRawData, false },
{ kEoB2FinaleCpsDataDestroy3, kRawData, false },
{ kEoB2FinaleCpsDataCredits2, kRawData, false },
{ kEoB2FinaleCpsDataCredits3, kRawData, false },
{ kEoB2FinaleCpsDataHeroes, kRawData, false },
{ kEoB2FinaleCpsDataThanks, kRawData, false },
{ kEoB2NpcShapeData, kRawData, false },
{ kEoBBaseClassModifierFlags, kRawData, false },
{ kEoBBaseMonsterStepTable01, kRawData, false },
@ -600,6 +628,230 @@ const ExtractFilename extractFilenames[] = {
{ kEoB2WallOfForceNumH, kRawData, false },
{ kEoB2WallOfForceShpId, kRawData, false },
{ kEoB2ItemIconShapeData00, kRawData, false },
{ kEoB2ItemIconShapeData01, kRawData, false },
{ kEoB2ItemIconShapeData02, kRawData, false },
{ kEoB2ItemIconShapeData03, kRawData, false },
{ kEoB2ItemIconShapeData04, kRawData, false },
{ kEoB2ItemIconShapeData05, kRawData, false },
{ kEoB2ItemIconShapeData06, kRawData, false },
{ kEoB2ItemIconShapeData07, kRawData, false },
{ kEoB2ItemIconShapeData08, kRawData, false },
{ kEoB2ItemIconShapeData09, kRawData, false },
{ kEoB2ItemIconShapeData10, kRawData, false },
{ kEoB2ItemIconShapeData11, kRawData, false },
{ kEoB2ItemIconShapeData12, kRawData, false },
{ kEoB2ItemIconShapeData13, kRawData, false },
{ kEoB2ItemIconShapeData14, kRawData, false },
{ kEoB2ItemIconShapeData15, kRawData, false },
{ kEoB2ItemIconShapeData16, kRawData, false },
{ kEoB2ItemIconShapeData17, kRawData, false },
{ kEoB2ItemIconShapeData18, kRawData, false },
{ kEoB2ItemIconShapeData19, kRawData, false },
{ kEoB2ItemIconShapeData20, kRawData, false },
{ kEoB2ItemIconShapeData21, kRawData, false },
{ kEoB2ItemIconShapeData22, kRawData, false },
{ kEoB2ItemIconShapeData23, kRawData, false },
{ kEoB2ItemIconShapeData24, kRawData, false },
{ kEoB2ItemIconShapeData25, kRawData, false },
{ kEoB2ItemIconShapeData26, kRawData, false },
{ kEoB2ItemIconShapeData27, kRawData, false },
{ kEoB2ItemIconShapeData28, kRawData, false },
{ kEoB2ItemIconShapeData29, kRawData, false },
{ kEoB2ItemIconShapeData30, kRawData, false },
{ kEoB2ItemIconShapeData31, kRawData, false },
{ kEoB2ItemIconShapeData32, kRawData, false },
{ kEoB2ItemIconShapeData33, kRawData, false },
{ kEoB2ItemIconShapeData34, kRawData, false },
{ kEoB2ItemIconShapeData35, kRawData, false },
{ kEoB2ItemIconShapeData36, kRawData, false },
{ kEoB2ItemIconShapeData37, kRawData, false },
{ kEoB2ItemIconShapeData38, kRawData, false },
{ kEoB2ItemIconShapeData39, kRawData, false },
{ kEoB2ItemIconShapeData40, kRawData, false },
{ kEoB2ItemIconShapeData41, kRawData, false },
{ kEoB2ItemIconShapeData42, kRawData, false },
{ kEoB2ItemIconShapeData43, kRawData, false },
{ kEoB2ItemIconShapeData44, kRawData, false },
{ kEoB2ItemIconShapeData45, kRawData, false },
{ kEoB2ItemIconShapeData46, kRawData, false },
{ kEoB2ItemIconShapeData47, kRawData, false },
{ kEoB2ItemIconShapeData48, kRawData, false },
{ kEoB2ItemIconShapeData49, kRawData, false },
{ kEoB2ItemIconShapeData50, kRawData, false },
{ kEoB2ItemIconShapeData51, kRawData, false },
{ kEoB2ItemIconShapeData52, kRawData, false },
{ kEoB2ItemIconShapeData53, kRawData, false },
{ kEoB2ItemIconShapeData54, kRawData, false },
{ kEoB2ItemIconShapeData55, kRawData, false },
{ kEoB2ItemIconShapeData56, kRawData, false },
{ kEoB2ItemIconShapeData57, kRawData, false },
{ kEoB2ItemIconShapeData58, kRawData, false },
{ kEoB2ItemIconShapeData59, kRawData, false },
{ kEoB2ItemIconShapeData60, kRawData, false },
{ kEoB2ItemIconShapeData61, kRawData, false },
{ kEoB2ItemIconShapeData62, kRawData, false },
{ kEoB2ItemIconShapeData63, kRawData, false },
{ kEoB2ItemIconShapeData64, kRawData, false },
{ kEoB2ItemIconShapeData65, kRawData, false },
{ kEoB2ItemIconShapeData66, kRawData, false },
{ kEoB2ItemIconShapeData67, kRawData, false },
{ kEoB2ItemIconShapeData68, kRawData, false },
{ kEoB2ItemIconShapeData69, kRawData, false },
{ kEoB2ItemIconShapeData70, kRawData, false },
{ kEoB2ItemIconShapeData71, kRawData, false },
{ kEoB2ItemIconShapeData72, kRawData, false },
{ kEoB2ItemIconShapeData73, kRawData, false },
{ kEoB2ItemIconShapeData74, kRawData, false },
{ kEoB2ItemIconShapeData75, kRawData, false },
{ kEoB2ItemIconShapeData76, kRawData, false },
{ kEoB2ItemIconShapeData77, kRawData, false },
{ kEoB2ItemIconShapeData78, kRawData, false },
{ kEoB2ItemIconShapeData79, kRawData, false },
{ kEoB2ItemIconShapeData80, kRawData, false },
{ kEoB2ItemIconShapeData81, kRawData, false },
{ kEoB2ItemIconShapeData82, kRawData, false },
{ kEoB2ItemIconShapeData83, kRawData, false },
{ kEoB2ItemIconShapeData84, kRawData, false },
{ kEoB2ItemIconShapeData85, kRawData, false },
{ kEoB2ItemIconShapeData86, kRawData, false },
{ kEoB2ItemIconShapeData87, kRawData, false },
{ kEoB2ItemIconShapeData88, kRawData, false },
{ kEoB2ItemIconShapeData89, kRawData, false },
{ kEoB2ItemIconShapeData90, kRawData, false },
{ kEoB2ItemIconShapeData91, kRawData, false },
{ kEoB2ItemIconShapeData92, kRawData, false },
{ kEoB2ItemIconShapeData93, kRawData, false },
{ kEoB2ItemIconShapeData94, kRawData, false },
{ kEoB2ItemIconShapeData95, kRawData, false },
{ kEoB2ItemIconShapeData96, kRawData, false },
{ kEoB2ItemIconShapeData97, kRawData, false },
{ kEoB2ItemIconShapeData98, kRawData, false },
{ kEoB2ItemIconShapeData99, kRawData, false },
{ kEoB2ItemIconShapeData100, kRawData, false },
{ kEoB2ItemIconShapeData101, kRawData, false },
{ kEoB2ItemIconShapeData102, kRawData, false },
{ kEoB2ItemIconShapeData103, kRawData, false },
{ kEoB2ItemIconShapeData104, kRawData, false },
{ kEoB2ItemIconShapeData105, kRawData, false },
{ kEoB2ItemIconShapeData106, kRawData, false },
{ kEoB2ItemIconShapeData107, kRawData, false },
{ kEoB2ItemIconShapeData108, kRawData, false },
{ kEoB2ItemIconShapeData109, kRawData, false },
{ kEoB2ItemIconShapeData110, kRawData, false },
{ kEoB2ItemIconShapeData111, kRawData, false },
{ kEoB2LargeItemsShapeData00, kRawData, false },
{ kEoB2LargeItemsShapeData01, kRawData, false },
{ kEoB2LargeItemsShapeData02, kRawData, false },
{ kEoB2LargeItemsShapeData03, kRawData, false },
{ kEoB2LargeItemsShapeData04, kRawData, false },
{ kEoB2LargeItemsShapeData05, kRawData, false },
{ kEoB2LargeItemsShapeData06, kRawData, false },
{ kEoB2LargeItemsShapeData07, kRawData, false },
{ kEoB2LargeItemsShapeData08, kRawData, false },
{ kEoB2LargeItemsShapeData09, kRawData, false },
{ kEoB2LargeItemsShapeData10, kRawData, false },
{ kEoB2SmallItemsShapeData00, kRawData, false },
{ kEoB2SmallItemsShapeData01, kRawData, false },
{ kEoB2SmallItemsShapeData02, kRawData, false },
{ kEoB2SmallItemsShapeData03, kRawData, false },
{ kEoB2SmallItemsShapeData04, kRawData, false },
{ kEoB2SmallItemsShapeData05, kRawData, false },
{ kEoB2SmallItemsShapeData06, kRawData, false },
{ kEoB2SmallItemsShapeData07, kRawData, false },
{ kEoB2SmallItemsShapeData08, kRawData, false },
{ kEoB2SmallItemsShapeData09, kRawData, false },
{ kEoB2SmallItemsShapeData10, kRawData, false },
{ kEoB2SmallItemsShapeData11, kRawData, false },
{ kEoB2SmallItemsShapeData12, kRawData, false },
{ kEoB2SmallItemsShapeData13, kRawData, false },
{ kEoB2SmallItemsShapeData14, kRawData, false },
{ kEoB2SmallItemsShapeData15, kRawData, false },
{ kEoB2SmallItemsShapeData16, kRawData, false },
{ kEoB2SmallItemsShapeData17, kRawData, false },
{ kEoB2SmallItemsShapeData18, kRawData, false },
{ kEoB2SmallItemsShapeData19, kRawData, false },
{ kEoB2SmallItemsShapeData20, kRawData, false },
{ kEoB2SmallItemsShapeData21, kRawData, false },
{ kEoB2SmallItemsShapeData22, kRawData, false },
{ kEoB2SmallItemsShapeData23, kRawData, false },
{ kEoB2SmallItemsShapeData24, kRawData, false },
{ kEoB2SmallItemsShapeData25, kRawData, false },
{ kEoB2ThrownShapeData00, kRawData, false },
{ kEoB2ThrownShapeData01, kRawData, false },
{ kEoB2ThrownShapeData02, kRawData, false },
{ kEoB2ThrownShapeData03, kRawData, false },
{ kEoB2ThrownShapeData04, kRawData, false },
{ kEoB2ThrownShapeData05, kRawData, false },
{ kEoB2ThrownShapeData06, kRawData, false },
{ kEoB2ThrownShapeData07, kRawData, false },
{ kEoB2ThrownShapeData08, kRawData, false },
{ kEoB2SpellShapeData00, kRawData, false },
{ kEoB2SpellShapeData01, kRawData, false },
{ kEoB2SpellShapeData02, kRawData, false },
{ kEoB2SpellShapeData03, kRawData, false },
{ kEoB2TeleporterShapeData00, kRawData, false },
{ kEoB2TeleporterShapeData01, kRawData, false },
{ kEoB2TeleporterShapeData02, kRawData, false },
{ kEoB2TeleporterShapeData03, kRawData, false },
{ kEoB2TeleporterShapeData04, kRawData, false },
{ kEoB2TeleporterShapeData05, kRawData, false },
{ kEoB2LightningColumnShapeData, kRawData, false },
{ kEoB2DeadCharShapeData, kRawData, false },
{ kEoB2DisabledCharGridShapeData, kRawData, false },
{ kEoB2WeaponSlotGridShapeData, kRawData, false },
{ kEoB2SmallGridShapeData, kRawData, false },
{ kEoB2WideGridShapeData, kRawData, false },
{ kEoB2RedSplatShapeData, kRawData, false },
{ kEoB2GreenSplatShapeData, kRawData, false },
{ kEoB2FirebeamShapeData00, kRawData, false },
{ kEoB2FirebeamShapeData01, kRawData, false },
{ kEoB2FirebeamShapeData02, kRawData, false },
{ kEoB2SparkShapeData00, kRawData, false },
{ kEoB2SparkShapeData01, kRawData, false },
{ kEoB2SparkShapeData02, kRawData, false },
{ kEoB2CompassShapeData00, kRawData, false },
{ kEoB2CompassShapeData01, kRawData, false },
{ kEoB2CompassShapeData02, kRawData, false },
{ kEoB2CompassShapeData03, kRawData, false },
{ kEoB2CompassShapeData04, kRawData, false },
{ kEoB2CompassShapeData05, kRawData, false },
{ kEoB2CompassShapeData06, kRawData, false },
{ kEoB2CompassShapeData07, kRawData, false },
{ kEoB2CompassShapeData08, kRawData, false },
{ kEoB2CompassShapeData09, kRawData, false },
{ kEoB2CompassShapeData10, kRawData, false },
{ kEoB2CompassShapeData11, kRawData, false },
{ kEoB2WallOfForceShapeData00, kRawData, false },
{ kEoB2WallOfForceShapeData01, kRawData, false },
{ kEoB2WallOfForceShapeData02, kRawData, false },
{ kEoB2WallOfForceShapeData03, kRawData, false },
{ kEoB2WallOfForceShapeData04, kRawData, false },
{ kEoB2WallOfForceShapeData05, kRawData, false },
{ kEoB2UtilMenuStrings, kStringList, true },
{ kEoB2Config2431Strings, kStringList, true },
{ kEoB2KatakanaLines, kStringList, true },
{ kEoB2KanaSelectStrings, kStringList, true },
{ kEoB2FontDmpSearchTbl, kRawDataBe16, false },
{ kEoB2Ascii2SjisTables, kStringList, false },
{ kEoB2Ascii2SjisTables2, kStringList, false },
{ kEoB2SaveNamePatterns, kStringList, false },
{ kEoB2PcmSoundEffectsIngame, kRawData, false },
{ kEoB2PcmSoundEffectsIntro, kRawData, false },
{ kEoB2PcmSoundEffectsFinale, kRawData, false },
// LANDS OF LORE
// Ingame
@ -647,7 +899,6 @@ const ExtractFilename extractFilenames[] = {
{ kRpgCommonDscX, kRawDataBe16, false },
{ kLoLBaseDscY, kRawData, false },
{ kRpgCommonDscTileIndex, kRawData, false },
{ kRpgCommonDscUnk2, kRawData, false },
{ kRpgCommonDscDoorShapeIndex, kRawData, false },
{ kRpgCommonDscDimData1, kRawData, false },
{ kRpgCommonDscDimData2, kRawData, false },

View File

@ -182,7 +182,6 @@ enum kExtractID {
kRpgCommonDscShapeIndex,
kRpgCommonDscX,
kRpgCommonDscTileIndex,
kRpgCommonDscUnk2,
kRpgCommonDscDoorShapeIndex,
kRpgCommonDscDimData1,
kRpgCommonDscDimData2,
@ -193,6 +192,7 @@ enum kExtractID {
kRpgCommonDscDoorFrameY2,
kRpgCommonDscDoorFrameIndex1,
kRpgCommonDscDoorFrameIndex2,
kRpgCommonDscDoorScaleOffs,
kRpgCommonDscBlockIndex,
kEoBBaseChargenStrings1,
@ -327,7 +327,6 @@ enum kExtractID {
kEoBBaseWllFlagPreset,
kEoBBaseDscShapeCoords,
kEoBBaseDscDoorScaleOffs,
kEoBBaseDscDoorScaleMult1,
kEoBBaseDscDoorScaleMult2,
kEoBBaseDscDoorScaleMult3,
@ -481,6 +480,7 @@ enum kExtractID {
kEoB1Npc7Strings,
kEoB2MainMenuStrings,
kEoB2MainMenuUtilStrings,
kEoB2TransferPortraitFrames,
kEoB2TransferConvertTable,
@ -536,6 +536,7 @@ enum kExtractID {
kEoB2IntroAnimData41,
kEoB2IntroAnimData42,
kEoB2IntroAnimData43,
kEoB2IntroShapes00,
kEoB2IntroShapes01,
kEoB2IntroShapes04,
@ -587,6 +588,258 @@ enum kExtractID {
kEoB2WallOfForceNumH,
kEoB2WallOfForceShpId,
// FM-Towns specific
kEoB2IntroCpsDataStreet1,
kEoB2IntroCpsDataStreet2,
kEoB2IntroCpsDataDoorway1,
kEoB2IntroCpsDataDoorway2,
kEoB2IntroCpsDataWestwood,
kEoB2IntroCpsDataWinding,
kEoB2IntroCpsDataKhelban2,
kEoB2IntroCpsDataKhelban1,
kEoB2IntroCpsDataKhelban3,
kEoB2IntroCpsDataKhelban4,
kEoB2IntroCpsDataCoin,
kEoB2IntroCpsDataKhelban5,
kEoB2IntroCpsDataKhelban6,
kEoB2FinaleCpsDataDragon1,
kEoB2FinaleCpsDataDragon2,
kEoB2FinaleCpsDataHurry1,
kEoB2FinaleCpsDataHurry2,
kEoB2FinaleCpsDataDestroy0,
kEoB2FinaleCpsDataDestroy1,
kEoB2FinaleCpsDataDestroy2,
kEoB2FinaleCpsDataMagic,
kEoB2FinaleCpsDataDestroy3,
kEoB2FinaleCpsDataCredits2,
kEoB2FinaleCpsDataCredits3,
kEoB2FinaleCpsDataHeroes,
kEoB2FinaleCpsDataThanks,
kEoB2ItemIconShapeData00,
kEoB2ItemIconShapeData01,
kEoB2ItemIconShapeData02,
kEoB2ItemIconShapeData03,
kEoB2ItemIconShapeData04,
kEoB2ItemIconShapeData05,
kEoB2ItemIconShapeData06,
kEoB2ItemIconShapeData07,
kEoB2ItemIconShapeData08,
kEoB2ItemIconShapeData09,
kEoB2ItemIconShapeData10,
kEoB2ItemIconShapeData11,
kEoB2ItemIconShapeData12,
kEoB2ItemIconShapeData13,
kEoB2ItemIconShapeData14,
kEoB2ItemIconShapeData15,
kEoB2ItemIconShapeData16,
kEoB2ItemIconShapeData17,
kEoB2ItemIconShapeData18,
kEoB2ItemIconShapeData19,
kEoB2ItemIconShapeData20,
kEoB2ItemIconShapeData21,
kEoB2ItemIconShapeData22,
kEoB2ItemIconShapeData23,
kEoB2ItemIconShapeData24,
kEoB2ItemIconShapeData25,
kEoB2ItemIconShapeData26,
kEoB2ItemIconShapeData27,
kEoB2ItemIconShapeData28,
kEoB2ItemIconShapeData29,
kEoB2ItemIconShapeData30,
kEoB2ItemIconShapeData31,
kEoB2ItemIconShapeData32,
kEoB2ItemIconShapeData33,
kEoB2ItemIconShapeData34,
kEoB2ItemIconShapeData35,
kEoB2ItemIconShapeData36,
kEoB2ItemIconShapeData37,
kEoB2ItemIconShapeData38,
kEoB2ItemIconShapeData39,
kEoB2ItemIconShapeData40,
kEoB2ItemIconShapeData41,
kEoB2ItemIconShapeData42,
kEoB2ItemIconShapeData43,
kEoB2ItemIconShapeData44,
kEoB2ItemIconShapeData45,
kEoB2ItemIconShapeData46,
kEoB2ItemIconShapeData47,
kEoB2ItemIconShapeData48,
kEoB2ItemIconShapeData49,
kEoB2ItemIconShapeData50,
kEoB2ItemIconShapeData51,
kEoB2ItemIconShapeData52,
kEoB2ItemIconShapeData53,
kEoB2ItemIconShapeData54,
kEoB2ItemIconShapeData55,
kEoB2ItemIconShapeData56,
kEoB2ItemIconShapeData57,
kEoB2ItemIconShapeData58,
kEoB2ItemIconShapeData59,
kEoB2ItemIconShapeData60,
kEoB2ItemIconShapeData61,
kEoB2ItemIconShapeData62,
kEoB2ItemIconShapeData63,
kEoB2ItemIconShapeData64,
kEoB2ItemIconShapeData65,
kEoB2ItemIconShapeData66,
kEoB2ItemIconShapeData67,
kEoB2ItemIconShapeData68,
kEoB2ItemIconShapeData69,
kEoB2ItemIconShapeData70,
kEoB2ItemIconShapeData71,
kEoB2ItemIconShapeData72,
kEoB2ItemIconShapeData73,
kEoB2ItemIconShapeData74,
kEoB2ItemIconShapeData75,
kEoB2ItemIconShapeData76,
kEoB2ItemIconShapeData77,
kEoB2ItemIconShapeData78,
kEoB2ItemIconShapeData79,
kEoB2ItemIconShapeData80,
kEoB2ItemIconShapeData81,
kEoB2ItemIconShapeData82,
kEoB2ItemIconShapeData83,
kEoB2ItemIconShapeData84,
kEoB2ItemIconShapeData85,
kEoB2ItemIconShapeData86,
kEoB2ItemIconShapeData87,
kEoB2ItemIconShapeData88,
kEoB2ItemIconShapeData89,
kEoB2ItemIconShapeData90,
kEoB2ItemIconShapeData91,
kEoB2ItemIconShapeData92,
kEoB2ItemIconShapeData93,
kEoB2ItemIconShapeData94,
kEoB2ItemIconShapeData95,
kEoB2ItemIconShapeData96,
kEoB2ItemIconShapeData97,
kEoB2ItemIconShapeData98,
kEoB2ItemIconShapeData99,
kEoB2ItemIconShapeData100,
kEoB2ItemIconShapeData101,
kEoB2ItemIconShapeData102,
kEoB2ItemIconShapeData103,
kEoB2ItemIconShapeData104,
kEoB2ItemIconShapeData105,
kEoB2ItemIconShapeData106,
kEoB2ItemIconShapeData107,
kEoB2ItemIconShapeData108,
kEoB2ItemIconShapeData109,
kEoB2ItemIconShapeData110,
kEoB2ItemIconShapeData111,
kEoB2LargeItemsShapeData00,
kEoB2LargeItemsShapeData01,
kEoB2LargeItemsShapeData02,
kEoB2LargeItemsShapeData03,
kEoB2LargeItemsShapeData04,
kEoB2LargeItemsShapeData05,
kEoB2LargeItemsShapeData06,
kEoB2LargeItemsShapeData07,
kEoB2LargeItemsShapeData08,
kEoB2LargeItemsShapeData09,
kEoB2LargeItemsShapeData10,
kEoB2SmallItemsShapeData00,
kEoB2SmallItemsShapeData01,
kEoB2SmallItemsShapeData02,
kEoB2SmallItemsShapeData03,
kEoB2SmallItemsShapeData04,
kEoB2SmallItemsShapeData05,
kEoB2SmallItemsShapeData06,
kEoB2SmallItemsShapeData07,
kEoB2SmallItemsShapeData08,
kEoB2SmallItemsShapeData09,
kEoB2SmallItemsShapeData10,
kEoB2SmallItemsShapeData11,
kEoB2SmallItemsShapeData12,
kEoB2SmallItemsShapeData13,
kEoB2SmallItemsShapeData14,
kEoB2SmallItemsShapeData15,
kEoB2SmallItemsShapeData16,
kEoB2SmallItemsShapeData17,
kEoB2SmallItemsShapeData18,
kEoB2SmallItemsShapeData19,
kEoB2SmallItemsShapeData20,
kEoB2SmallItemsShapeData21,
kEoB2SmallItemsShapeData22,
kEoB2SmallItemsShapeData23,
kEoB2SmallItemsShapeData24,
kEoB2SmallItemsShapeData25,
kEoB2ThrownShapeData00,
kEoB2ThrownShapeData01,
kEoB2ThrownShapeData02,
kEoB2ThrownShapeData03,
kEoB2ThrownShapeData04,
kEoB2ThrownShapeData05,
kEoB2ThrownShapeData06,
kEoB2ThrownShapeData07,
kEoB2ThrownShapeData08,
kEoB2SpellShapeData00,
kEoB2SpellShapeData01,
kEoB2SpellShapeData02,
kEoB2SpellShapeData03,
kEoB2TeleporterShapeData00,
kEoB2TeleporterShapeData01,
kEoB2TeleporterShapeData02,
kEoB2TeleporterShapeData03,
kEoB2TeleporterShapeData04,
kEoB2TeleporterShapeData05,
kEoB2LightningColumnShapeData,
kEoB2DeadCharShapeData,
kEoB2DisabledCharGridShapeData,
kEoB2WeaponSlotGridShapeData,
kEoB2SmallGridShapeData,
kEoB2WideGridShapeData,
kEoB2RedSplatShapeData,
kEoB2GreenSplatShapeData,
kEoB2FirebeamShapeData00,
kEoB2FirebeamShapeData01,
kEoB2FirebeamShapeData02,
kEoB2SparkShapeData00,
kEoB2SparkShapeData01,
kEoB2SparkShapeData02,
kEoB2CompassShapeData00,
kEoB2CompassShapeData01,
kEoB2CompassShapeData02,
kEoB2CompassShapeData03,
kEoB2CompassShapeData04,
kEoB2CompassShapeData05,
kEoB2CompassShapeData06,
kEoB2CompassShapeData07,
kEoB2CompassShapeData08,
kEoB2CompassShapeData09,
kEoB2CompassShapeData10,
kEoB2CompassShapeData11,
kEoB2WallOfForceShapeData00,
kEoB2WallOfForceShapeData01,
kEoB2WallOfForceShapeData02,
kEoB2WallOfForceShapeData03,
kEoB2WallOfForceShapeData04,
kEoB2WallOfForceShapeData05,
kEoB2UtilMenuStrings,
kEoB2Config2431Strings,
kEoB2KatakanaLines,
kEoB2KanaSelectStrings,
kEoB2FontDmpSearchTbl,
kEoB2Ascii2SjisTables,
kEoB2Ascii2SjisTables2,
kEoB2SaveNamePatterns,
kEoB2PcmSoundEffectsIngame,
kEoB2PcmSoundEffectsIntro,
kEoB2PcmSoundEffectsFinale,
kLoLIngamePakFiles,
kLoLCharacterDefs,
kLoLIngameSfxFiles,

File diff suppressed because it is too large Load Diff

View File

@ -95,11 +95,20 @@
#include "resources/eob1_dos_german.h"
#include "resources/eob1_dos_italian.h"
//#include "resources/eob1_pc98.h"
//#include "resources/eob1_pc98_japanese.h"
// Eye of the Beholder: The Legend of Darkmoon
#include "resources/eob2_dos.h"
#include "resources/eob2_dos_english.h"
#include "resources/eob2_dos_german.h"
//#include "resources/eob2_pc98.h"
//#include "resources/eob2_pc98_japanese.h"
#include "resources/eob2_fmtowns.h"
#include "resources/eob2_fmtowns_japanese.h"
// Lands of Lore
#include "resources/lol_dos_demo.h"
#include "resources/lol_dos_demo_english.h"
@ -1095,7 +1104,7 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscDoorShapeIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorShapeIndexDOSProvider },
{ kEoBBaseWllFlagPreset, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1WllFlagPresetDOSProvider },
{ kEoBBaseDscShapeCoords, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscShapeCoordsDOSProvider },
{ kEoBBaseDscDoorScaleOffs, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleOffsDOSProvider },
{ kRpgCommonDscDoorScaleOffs, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleOffsDOSProvider },
{ kEoBBaseDscDoorScaleMult1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult1DOSProvider },
{ kEoBBaseDscDoorScaleMult2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult2DOSProvider },
{ kEoBBaseDscDoorScaleMult3, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDoorScaleMult3DOSProvider },
@ -1138,7 +1147,6 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscShapeIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscShapeIndexDOSProvider },
{ kRpgCommonDscX, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscXDOSProvider },
{ kRpgCommonDscTileIndex, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscTileIndexDOSProvider },
{ kRpgCommonDscUnk2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscUnk2DOSProvider },
{ kRpgCommonDscDimData1, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDimData1DOSProvider },
{ kRpgCommonDscDimData2, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscDimData2DOSProvider },
{ kRpgCommonDscBlockMap, kEoB1, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB1DscBlockMapDOSProvider },
@ -1467,7 +1475,7 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscDoorShapeIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorShapeIndexDOSProvider },
{ kEoBBaseWllFlagPreset, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2WllFlagPresetDOSProvider },
{ kEoBBaseDscShapeCoords, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscShapeCoordsDOSProvider },
{ kEoBBaseDscDoorScaleOffs, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleOffsDOSProvider },
{ kRpgCommonDscDoorScaleOffs, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleOffsDOSProvider },
{ kEoBBaseDscDoorScaleMult1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult1DOSProvider },
{ kEoBBaseDscDoorScaleMult2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult2DOSProvider },
{ kEoBBaseDscDoorScaleMult3, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult3DOSProvider },
@ -1618,7 +1626,6 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscShapeIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscShapeIndexDOSProvider },
{ kRpgCommonDscX, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscXDOSProvider },
{ kRpgCommonDscTileIndex, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscTileIndexDOSProvider },
{ kRpgCommonDscUnk2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscUnk2DOSProvider },
{ kRpgCommonDscDimData1, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDimData1DOSProvider },
{ kRpgCommonDscDimData2, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscDimData2DOSProvider },
{ kRpgCommonDscBlockMap, kEoB2, kPlatformDOS, kNoSpecial, UNK_LANG, &kEoB2DscBlockMapDOSProvider },
@ -1719,11 +1726,521 @@ static const ResourceProvider resourceProviders[] = {
{ kEoB2MonsterDustStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2MonsterDustStringsDOSGermanProvider },
{ kEoB2KheldranStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2KheldranStringsDOSGermanProvider },
{ kEoB2HornStrings, kEoB2, kPlatformDOS, kNoSpecial, DE_DEU, &kEoB2HornStringsDOSGermanProvider },
{ kEoBBaseChargenStrings1, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenStrings1FMTownsJapaneseProvider },
{ kEoBBaseChargenStrings2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenStrings2FMTownsJapaneseProvider },
{ kEoBBaseChargenStartLevels, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ChargenStartLevelsFMTownsProvider },
{ kEoBBaseChargenStatStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenStatStringsFMTownsJapaneseProvider },
{ kEoBBaseChargenRaceSexStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenRaceSexStringsFMTownsJapaneseProvider },
{ kEoBBaseChargenClassStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenClassStringsFMTownsJapaneseProvider },
{ kEoBBaseChargenAlignmentStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenAlignmentStringsFMTownsJapaneseProvider },
{ kEoBBaseChargenEnterGameStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenEnterGameStringsFMTownsJapaneseProvider },
{ kEoBBaseChargenClassMinStats, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ChargenClassMinStatsFMTownsProvider },
{ kEoBBaseChargenRaceMinStats, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ChargenRaceMinStatsFMTownsProvider },
{ kEoBBaseChargenRaceMaxStats, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ChargenRaceMaxStatsFMTownsProvider },
{ kEoBBaseSaveThrowTable1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable1FMTownsProvider },
{ kEoBBaseSaveThrowTable2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable2FMTownsProvider },
{ kEoBBaseSaveThrowTable3, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable3FMTownsProvider },
{ kEoBBaseSaveThrowTable4, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable4FMTownsProvider },
{ kEoBBaseSaveThrwLvlIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SaveThrwLvlIndexFMTownsProvider },
{ kEoBBaseSaveThrwModDiv, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SaveThrwModDivFMTownsProvider },
{ kEoBBaseSaveThrwModExt, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SaveThrwModExtFMTownsProvider },
{ kEoBBasePryDoorStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2PryDoorStringsFMTownsJapaneseProvider },
{ kEoBBaseWarningStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2WarningStringsFMTownsJapaneseProvider },
{ kEoBBaseItemSuffixStringsRings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ItemSuffixStringsRingsFMTownsJapaneseProvider },
{ kEoBBaseItemSuffixStringsPotions, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ItemSuffixStringsPotionsFMTownsJapaneseProvider },
{ kEoBBaseItemSuffixStringsWands, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ItemSuffixStringsWandsFMTownsJapaneseProvider },
{ kEoBBaseRipItemStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2RipItemStringsFMTownsJapaneseProvider },
{ kEoBBaseCursedString, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CursedStringFMTownsJapaneseProvider },
{ kEoBBaseEnchantedString, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2EnchantedStringFMTownsProvider },
{ kEoBBaseMagicObjectStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicObjectStringsFMTownsJapaneseProvider },
{ kEoBBaseMagicObjectString5, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicObjectString5FMTownsJapaneseProvider },
{ kEoBBasePatternSuffix, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2PatternSuffixFMTownsJapaneseProvider },
{ kEoBBasePatternGrFix1, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2PatternGrFix1FMTownsJapaneseProvider },
{ kEoBBasePatternGrFix2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2PatternGrFix2FMTownsJapaneseProvider },
{ kEoBBaseValidateArmorString, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ValidateArmorStringFMTownsJapaneseProvider },
{ kEoBBaseValidateCursedString, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ValidateCursedStringFMTownsJapaneseProvider },
{ kEoBBaseValidateNoDropString, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ValidateNoDropStringFMTownsJapaneseProvider },
{ kEoBBasePotionStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2PotionStringsFMTownsJapaneseProvider },
{ kEoBBaseWandStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2WandStringsFMTownsJapaneseProvider },
{ kEoBBaseItemMisuseStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ItemMisuseStringsFMTownsJapaneseProvider },
{ kEoBBaseTakenStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2TakenStringsFMTownsJapaneseProvider },
{ kEoBBasePotionEffectStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2PotionEffectStringsFMTownsJapaneseProvider },
{ kEoBBaseYesNoStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2YesNoStringsFMTownsJapaneseProvider },
{ kRpgCommonMoreStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MoreStringsFMTownsJapaneseProvider },
{ kEoBBaseNpcMaxStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2NpcMaxStringsFMTownsJapaneseProvider },
{ kEoBBaseOkStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2OkStringsFMTownsJapaneseProvider },
{ kEoBBaseNpcJoinStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2NpcJoinStringsFMTownsJapaneseProvider },
{ kEoBBaseCancelStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CancelStringsFMTownsJapaneseProvider },
{ kEoBBaseAbortStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2AbortStringsFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsMain, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsMainFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsSaveLoad, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsSaveLoadFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsOnOff, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsOnOffFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsSpells, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsSpellsFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsRest, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsRestFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsDrop, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsDropFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsExit, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsExitFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsStarve, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsStarveFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsScribe, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsScribeFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsDrop2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsDrop2FMTownsJapaneseProvider },
{ kEoBBaseMenuStringsHead, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsHeadFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsPoison, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsPoisonFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsMgc, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsMgcFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsPrefs, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsPrefsFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsRest2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsRest2FMTownsJapaneseProvider },
{ kEoBBaseMenuStringsRest3, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsRest3FMTownsJapaneseProvider },
{ kEoBBaseMenuStringsRest4, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsRest4FMTownsJapaneseProvider },
{ kEoBBaseMenuStringsDefeat, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsDefeatFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsSpec, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuStringsSpecFMTownsJapaneseProvider },
{ kEoBBaseMenuStringsSpellNo, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MenuStringsSpellNoFMTownsProvider },
{ kEoBBaseMenuYesNoStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MenuYesNoStringsFMTownsJapaneseProvider },
{ kEoBBaseSpellLevelsMage, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SpellLevelsMageFMTownsProvider },
{ kEoBBaseSpellLevelsCleric, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SpellLevelsClericFMTownsProvider },
{ kEoBBaseNumSpellsCleric, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2NumSpellsClericFMTownsProvider },
{ kEoBBaseNumSpellsWisAdj, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2NumSpellsWisAdjFMTownsProvider },
{ kEoBBaseNumSpellsPal, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2NumSpellsPalFMTownsProvider },
{ kEoBBaseNumSpellsMage, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2NumSpellsMageFMTownsProvider },
{ kEoBBaseCharGuiStringsHp, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsHpFMTownsJapaneseProvider },
{ kEoBBaseCharGuiStringsWp2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsWp2FMTownsJapaneseProvider },
{ kEoBBaseCharGuiStringsWr, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsWrFMTownsJapaneseProvider },
{ kEoBBaseCharGuiStringsSt2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsSt2FMTownsJapaneseProvider },
{ kEoBBaseCharGuiStringsIn, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharGuiStringsInFMTownsJapaneseProvider },
{ kEoBBaseCharStatusStrings7, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings7FMTownsJapaneseProvider },
{ kEoBBaseCharStatusStrings82, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings82FMTownsJapaneseProvider },
{ kEoBBaseCharStatusStrings9, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings9FMTownsJapaneseProvider },
{ kEoBBaseCharStatusStrings12, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings12FMTownsJapaneseProvider },
{ kEoBBaseCharStatusStrings132, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2CharStatusStrings132FMTownsJapaneseProvider },
{ kEoBBaseLevelGainStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2LevelGainStringsFMTownsJapaneseProvider },
{ kEoBBaseExperienceTable0, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable0FMTownsProvider },
{ kEoBBaseExperienceTable1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable1FMTownsProvider },
{ kEoBBaseExperienceTable2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable2FMTownsProvider },
{ kEoBBaseExperienceTable3, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable3FMTownsProvider },
{ kEoBBaseExperienceTable4, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable4FMTownsProvider },
{ kEoBBaseBookNumbers, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2BookNumbersFMTownsJapaneseProvider },
{ kEoBBaseMageSpellsList, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MageSpellsListFMTownsJapaneseProvider },
{ kEoBBaseClericSpellsList, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ClericSpellsListFMTownsJapaneseProvider },
{ kEoBBaseSpellNames, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2SpellNamesFMTownsJapaneseProvider },
{ kEoBBaseMagicStrings1, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicStrings1FMTownsJapaneseProvider },
{ kEoBBaseMagicStrings2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicStrings2FMTownsJapaneseProvider },
{ kEoBBaseMagicStrings3, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicStrings3FMTownsJapaneseProvider },
{ kEoBBaseMagicStrings4, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicStrings4FMTownsJapaneseProvider },
{ kEoBBaseMagicStrings6, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicStrings6FMTownsJapaneseProvider },
{ kEoBBaseMagicStrings7, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicStrings7FMTownsJapaneseProvider },
{ kEoBBaseMagicStrings8, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MagicStrings8FMTownsJapaneseProvider },
{ kEoBBaseExpObjectTlMode, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTlModeFMTownsProvider },
{ kEoBBaseExpObjectTblIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTblIndexFMTownsProvider },
{ kEoBBaseExpObjectShpStart, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExpObjectShpStartFMTownsProvider },
{ kEoBBaseExpObjectTbl1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl1FMTownsProvider },
{ kEoBBaseExpObjectTbl2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl2FMTownsProvider },
{ kEoBBaseExpObjectTbl3, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl3FMTownsProvider },
{ kEoBBaseExpObjectY, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ExpObjectYFMTownsProvider },
{ kEoBBaseSparkDefSteps, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkDefStepsFMTownsProvider },
{ kEoBBaseSparkDefSubSteps, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkDefSubStepsFMTownsProvider },
{ kEoBBaseSparkDefShift, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkDefShiftFMTownsProvider },
{ kEoBBaseSparkDefAdd, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkDefAddFMTownsProvider },
{ kEoBBaseSparkDefX, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkDefXFMTownsProvider },
{ kEoBBaseSparkDefY, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkDefYFMTownsProvider },
{ kEoBBaseSparkOfFlags1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkOfFlags1FMTownsProvider },
{ kEoBBaseSparkOfFlags2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkOfFlags2FMTownsProvider },
{ kEoBBaseSparkOfShift, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkOfShiftFMTownsProvider },
{ kEoBBaseSparkOfX, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkOfXFMTownsProvider },
{ kEoBBaseSparkOfY, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkOfYFMTownsProvider },
{ kEoBBaseSpellProperties, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SpellPropertiesFMTownsProvider },
{ kEoBBaseMagicFlightProps, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MagicFlightPropsFMTownsProvider },
{ kEoBBaseTurnUndeadEffect, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2TurnUndeadEffectFMTownsProvider },
{ kEoBBaseBurningHandsDest, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2BurningHandsDestFMTownsProvider },
{ kEoBBaseConeOfColdDest1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest1FMTownsProvider },
{ kEoBBaseConeOfColdDest2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest2FMTownsProvider },
{ kEoBBaseConeOfColdDest3, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest3FMTownsProvider },
{ kEoBBaseConeOfColdDest4, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest4FMTownsProvider },
{ kEoBBaseConeOfColdGfxTbl, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdGfxTblFMTownsProvider },
{ kRpgCommonDscDoorShapeIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorShapeIndexFMTownsProvider },
{ kEoBBaseWllFlagPreset, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WllFlagPresetFMTownsProvider },
{ kEoBBaseDscShapeCoords, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscShapeCoordsFMTownsProvider },
{ kRpgCommonDscDoorScaleOffs, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleOffsFMTownsProvider },
{ kEoBBaseDscDoorScaleMult1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult1FMTownsProvider },
{ kEoBBaseDscDoorScaleMult2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult2FMTownsProvider },
{ kEoBBaseDscDoorScaleMult3, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult3FMTownsProvider },
{ kEoBBaseDscDoorType5Offs, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorType5OffsFMTownsProvider },
{ kEoBBaseDscDoorY1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorY1FMTownsProvider },
{ kRpgCommonDscDoorY2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorY2FMTownsProvider },
{ kRpgCommonDscDoorFrameY1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorFrameY1FMTownsProvider },
{ kRpgCommonDscDoorFrameY2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDoorFrameY2FMTownsProvider },
{ kEoBBaseDscItemPosIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscItemPosIndexFMTownsProvider },
{ kEoBBaseDscItemShpX, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscItemShpXFMTownsProvider },
{ kEoBBaseDscItemScaleIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscItemScaleIndexFMTownsProvider },
{ kEoBBaseDscItemTileIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscItemTileIndexFMTownsProvider },
{ kEoBBaseDscItemShapeMap, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscItemShapeMapFMTownsProvider },
{ kEoBBaseDscTelptrShpCoords, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscTelptrShpCoordsFMTownsProvider },
{ kEoBBasePortalSeqData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2PortalSeqDataFMTownsProvider },
{ kEoBBaseDscMonsterFrmOffsTbl1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscMonsterFrmOffsTbl1FMTownsProvider },
{ kEoBBaseDscMonsterFrmOffsTbl2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscMonsterFrmOffsTbl2FMTownsProvider },
{ kEoBBaseInvSlotX, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2InvSlotXFMTownsProvider },
{ kEoBBaseInvSlotY, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2InvSlotYFMTownsProvider },
{ kEoBBaseSlotValidationFlags, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SlotValidationFlagsFMTownsProvider },
{ kEoBBaseProjectileWeaponTypes, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ProjectileWeaponTypesFMTownsProvider },
{ kEoBBaseWandTypes, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WandTypesFMTownsProvider },
{ kEoBBaseDrawObjPosIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DrawObjPosIndexFMTownsProvider },
{ kEoBBaseFlightObjFlipIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FlightObjFlipIndexFMTownsProvider },
{ kEoBBaseFlightObjShpMap, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FlightObjShpMapFMTownsProvider },
{ kEoBBaseFlightObjSclIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FlightObjSclIndexFMTownsProvider },
{ kEoB2MainMenuStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MainMenuStringsFMTownsJapaneseProvider },
{ kEoB2MainMenuUtilStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MainMenuUtilStringsFMTownsJapaneseProvider },
{ kEoB2IntroStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroStringsFMTownsJapaneseProvider },
{ kEoB2IntroCpsDataStreet1, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataStreet1FMTownsProvider },
{ kEoB2IntroCpsDataStreet2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataStreet2FMTownsProvider },
{ kEoB2IntroCpsDataDoorway1, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataDoorway1FMTownsProvider },
{ kEoB2IntroCpsDataDoorway2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataDoorway2FMTownsProvider },
{ kEoB2IntroCpsDataWestwood, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataWestwoodFMTownsProvider },
{ kEoB2IntroCpsDataWinding, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataWindingFMTownsProvider },
{ kEoB2IntroCpsDataKhelban2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataKhelban2FMTownsProvider },
{ kEoB2IntroCpsDataKhelban1, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataKhelban1FMTownsProvider },
{ kEoB2IntroCpsDataKhelban3, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataKhelban3FMTownsProvider },
{ kEoB2IntroCpsDataKhelban4, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataKhelban4FMTownsProvider },
{ kEoB2IntroCpsDataCoin, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataCoinFMTownsProvider },
{ kEoB2IntroCpsDataKhelban5, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataKhelban5FMTownsProvider },
{ kEoB2IntroCpsDataKhelban6, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2IntroCpsDataKhelban6FMTownsProvider },
{ kEoB2IntroAnimData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData00FMTownsProvider },
{ kEoB2IntroAnimData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData01FMTownsProvider },
{ kEoB2IntroAnimData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData02FMTownsProvider },
{ kEoB2IntroAnimData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData03FMTownsProvider },
{ kEoB2IntroAnimData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData04FMTownsProvider },
{ kEoB2IntroAnimData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData05FMTownsProvider },
{ kEoB2IntroAnimData06, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData06FMTownsProvider },
{ kEoB2IntroAnimData07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData07FMTownsProvider },
{ kEoB2IntroAnimData08, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData08FMTownsProvider },
{ kEoB2IntroAnimData09, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData09FMTownsProvider },
{ kEoB2IntroAnimData10, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData10FMTownsProvider },
{ kEoB2IntroAnimData11, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData11FMTownsProvider },
{ kEoB2IntroAnimData12, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData12FMTownsProvider },
{ kEoB2IntroAnimData13, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData13FMTownsProvider },
{ kEoB2IntroAnimData14, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData14FMTownsProvider },
{ kEoB2IntroAnimData15, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData15FMTownsProvider },
{ kEoB2IntroAnimData16, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData16FMTownsProvider },
{ kEoB2IntroAnimData17, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData17FMTownsProvider },
{ kEoB2IntroAnimData18, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData18FMTownsProvider },
{ kEoB2IntroAnimData19, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData19FMTownsProvider },
{ kEoB2IntroAnimData20, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData20FMTownsProvider },
{ kEoB2IntroAnimData21, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData21FMTownsProvider },
{ kEoB2IntroAnimData22, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData22FMTownsProvider },
{ kEoB2IntroAnimData23, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData23FMTownsProvider },
{ kEoB2IntroAnimData24, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData24FMTownsProvider },
{ kEoB2IntroAnimData25, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData25FMTownsProvider },
{ kEoB2IntroAnimData26, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData26FMTownsProvider },
{ kEoB2IntroAnimData27, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData27FMTownsProvider },
{ kEoB2IntroAnimData28, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData28FMTownsProvider },
{ kEoB2IntroAnimData29, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData29FMTownsProvider },
{ kEoB2IntroAnimData30, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData30FMTownsProvider },
{ kEoB2IntroAnimData31, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData31FMTownsProvider },
{ kEoB2IntroAnimData32, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData32FMTownsProvider },
{ kEoB2IntroAnimData33, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData33FMTownsProvider },
{ kEoB2IntroAnimData34, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData34FMTownsProvider },
{ kEoB2IntroAnimData35, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData35FMTownsProvider },
{ kEoB2IntroAnimData36, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData36FMTownsProvider },
{ kEoB2IntroAnimData37, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData37FMTownsProvider },
{ kEoB2IntroAnimData38, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData38FMTownsProvider },
{ kEoB2IntroAnimData39, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData39FMTownsProvider },
{ kEoB2IntroAnimData40, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData40FMTownsProvider },
{ kEoB2IntroAnimData41, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData41FMTownsProvider },
{ kEoB2IntroAnimData42, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData42FMTownsProvider },
{ kEoB2IntroAnimData43, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData43FMTownsProvider },
{ kEoB2IntroShapes00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroShapes00FMTownsProvider },
{ kEoB2IntroShapes01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroShapes01FMTownsProvider },
{ kEoB2IntroShapes04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroShapes04FMTownsProvider },
{ kEoB2IntroShapes07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2IntroShapes07FMTownsProvider },
{ kEoB2FinaleStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2FinaleStringsFMTownsJapaneseProvider },
{ kEoB2FinaleCpsDataDragon1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataDragon1FMTownsProvider },
{ kEoB2FinaleCpsDataDragon2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataDragon2FMTownsProvider },
{ kEoB2FinaleCpsDataHurry1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataHurry1FMTownsProvider },
{ kEoB2FinaleCpsDataHurry2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataHurry2FMTownsProvider },
{ kEoB2FinaleCpsDataDestroy0, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataDestroy0FMTownsProvider },
{ kEoB2FinaleCpsDataDestroy1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataDestroy1FMTownsProvider },
{ kEoB2FinaleCpsDataDestroy2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataDestroy2FMTownsProvider },
{ kEoB2FinaleCpsDataMagic, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataMagicFMTownsProvider },
{ kEoB2FinaleCpsDataDestroy3, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataDestroy3FMTownsProvider },
{ kEoB2FinaleCpsDataCredits2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataCredits2FMTownsProvider },
{ kEoB2FinaleCpsDataCredits3, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataCredits3FMTownsProvider },
{ kEoB2FinaleCpsDataHeroes, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataHeroesFMTownsProvider },
{ kEoB2FinaleCpsDataThanks, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleCpsDataThanksFMTownsProvider },
{ kEoB2FinaleAnimData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData00FMTownsProvider },
{ kEoB2FinaleAnimData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData01FMTownsProvider },
{ kEoB2FinaleAnimData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData02FMTownsProvider },
{ kEoB2FinaleAnimData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData03FMTownsProvider },
{ kEoB2FinaleAnimData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData04FMTownsProvider },
{ kEoB2FinaleAnimData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData05FMTownsProvider },
{ kEoB2FinaleAnimData06, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData06FMTownsProvider },
{ kEoB2FinaleAnimData07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData07FMTownsProvider },
{ kEoB2FinaleAnimData08, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData08FMTownsProvider },
{ kEoB2FinaleAnimData09, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData09FMTownsProvider },
{ kEoB2FinaleAnimData10, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData10FMTownsProvider },
{ kEoB2FinaleAnimData11, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData11FMTownsProvider },
{ kEoB2FinaleAnimData12, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData12FMTownsProvider },
{ kEoB2FinaleAnimData13, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData13FMTownsProvider },
{ kEoB2FinaleAnimData14, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData14FMTownsProvider },
{ kEoB2FinaleAnimData15, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData15FMTownsProvider },
{ kEoB2FinaleAnimData16, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData16FMTownsProvider },
{ kEoB2FinaleAnimData17, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData17FMTownsProvider },
{ kEoB2FinaleAnimData18, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData18FMTownsProvider },
{ kEoB2FinaleAnimData19, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData19FMTownsProvider },
{ kEoB2FinaleAnimData20, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData20FMTownsProvider },
{ kEoB2FinaleShapes00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes00FMTownsProvider },
{ kEoB2FinaleShapes03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes03FMTownsProvider },
{ kEoB2FinaleShapes07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes07FMTownsProvider },
{ kEoB2FinaleShapes09, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes09FMTownsProvider },
{ kEoB2FinaleShapes10, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes10FMTownsProvider },
{ kEoB2NpcShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2NpcShapeDataFMTownsProvider },
{ kEoBBaseClassModifierFlags, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ClassModifierFlagsFMTownsProvider },
{ kEoBBaseMonsterStepTable02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable02FMTownsProvider },
{ kEoBBaseMonsterStepTable1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable1FMTownsProvider },
{ kEoBBaseMonsterStepTable2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable2FMTownsProvider },
{ kEoBBaseMonsterStepTable3, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable3FMTownsProvider },
{ kEoBBaseMonsterCloseAttPosTable1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttPosTable1FMTownsProvider },
{ kEoBBaseMonsterCloseAttPosTable22, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttPosTable22FMTownsProvider },
{ kEoBBaseMonsterCloseAttUnkTable, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttUnkTableFMTownsProvider },
{ kEoBBaseMonsterCloseAttChkTable1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttChkTable1FMTownsProvider },
{ kEoBBaseMonsterCloseAttChkTable2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttChkTable2FMTownsProvider },
{ kEoBBaseMonsterCloseAttDstTable1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttDstTable1FMTownsProvider },
{ kEoBBaseMonsterCloseAttDstTable2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttDstTable2FMTownsProvider },
{ kEoBBaseMonsterProximityTable, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterProximityTableFMTownsProvider },
{ kEoBBaseFindBlockMonstersTable, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FindBlockMonstersTableFMTownsProvider },
{ kEoBBaseMonsterDirChangeTable, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2MonsterDirChangeTableFMTownsProvider },
{ kEoBBaseMonsterDistAttStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MonsterDistAttStringsFMTownsJapaneseProvider },
{ kEoBBaseNpcPresets, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2NpcPresetsFMTownsProvider },
{ kEoB2Npc1Strings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2Npc1StringsFMTownsJapaneseProvider },
{ kEoB2Npc2Strings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2Npc2StringsFMTownsJapaneseProvider },
{ kEoB2MonsterDustStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2MonsterDustStringsFMTownsJapaneseProvider },
{ kEoB2DreamSteps, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DreamStepsFMTownsProvider },
{ kEoB2KheldranStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2KheldranStringsFMTownsJapaneseProvider },
{ kEoB2HornStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2HornStringsFMTownsJapaneseProvider },
{ kEoB2HornSounds, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2HornSoundsFMTownsProvider },
{ kEoB2WallOfForceDsX, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceDsXFMTownsProvider },
{ kEoB2WallOfForceDsY, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceDsYFMTownsProvider },
{ kEoB2WallOfForceNumW, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceNumWFMTownsProvider },
{ kEoB2WallOfForceNumH, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceNumHFMTownsProvider },
{ kEoB2WallOfForceShpId, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShpIdFMTownsProvider },
{ kRpgCommonDscShapeIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscShapeIndexFMTownsProvider },
{ kRpgCommonDscX, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscXFMTownsProvider },
{ kRpgCommonDscTileIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscTileIndexFMTownsProvider },
{ kRpgCommonDscDimData1, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDimData1FMTownsProvider },
{ kRpgCommonDscDimData2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDimData2FMTownsProvider },
{ kRpgCommonDscBlockMap, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscBlockMapFMTownsProvider },
{ kRpgCommonDscDimMap, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscDimMapFMTownsProvider },
{ kRpgCommonDscBlockIndex, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DscBlockIndexFMTownsProvider },
{ k2SeqplayPakFiles, kLoL, kPlatformDOS, kDemoVersion, UNK_LANG, &kLoLSeqplayPakFilesDOSDemoProvider },
{ k2SeqplayStrings, kLoL, kPlatformDOS, kDemoVersion, EN_ANY, &kLoLSeqplayStringsDOSDemoEnglishProvider },
{ k2SeqplaySeqData, kLoL, kPlatformDOS, kDemoVersion, UNK_LANG, &kLoLSeqplaySeqDataDOSDemoProvider },
{ k2SeqplaySfxFiles, kLoL, kPlatformDOS, kDemoVersion, UNK_LANG, &kLoLSeqplaySfxFilesDOSDemoProvider },
{ k2SeqplayIntroTracks, kLoL, kPlatformDOS, kDemoVersion, UNK_LANG, &kLoLSeqplayIntroTracksDOSDemoProvider },
{ kEoB2ItemIconShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData00FMTownsProvider },
{ kEoB2ItemIconShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData01FMTownsProvider },
{ kEoB2ItemIconShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData02FMTownsProvider },
{ kEoB2ItemIconShapeData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData03FMTownsProvider },
{ kEoB2ItemIconShapeData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData04FMTownsProvider },
{ kEoB2ItemIconShapeData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData05FMTownsProvider },
{ kEoB2ItemIconShapeData06, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData06FMTownsProvider },
{ kEoB2ItemIconShapeData07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData07FMTownsProvider },
{ kEoB2ItemIconShapeData08, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData08FMTownsProvider },
{ kEoB2ItemIconShapeData09, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData09FMTownsProvider },
{ kEoB2ItemIconShapeData10, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData10FMTownsProvider },
{ kEoB2ItemIconShapeData11, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData11FMTownsProvider },
{ kEoB2ItemIconShapeData12, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData12FMTownsProvider },
{ kEoB2ItemIconShapeData13, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData13FMTownsProvider },
{ kEoB2ItemIconShapeData14, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData14FMTownsProvider },
{ kEoB2ItemIconShapeData15, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData15FMTownsProvider },
{ kEoB2ItemIconShapeData16, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData16FMTownsProvider },
{ kEoB2ItemIconShapeData17, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData17FMTownsProvider },
{ kEoB2ItemIconShapeData18, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData18FMTownsProvider },
{ kEoB2ItemIconShapeData19, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData19FMTownsProvider },
{ kEoB2ItemIconShapeData20, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData20FMTownsProvider },
{ kEoB2ItemIconShapeData21, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData21FMTownsProvider },
{ kEoB2ItemIconShapeData22, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData22FMTownsProvider },
{ kEoB2ItemIconShapeData23, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData23FMTownsProvider },
{ kEoB2ItemIconShapeData24, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData24FMTownsProvider },
{ kEoB2ItemIconShapeData25, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData25FMTownsProvider },
{ kEoB2ItemIconShapeData26, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData26FMTownsProvider },
{ kEoB2ItemIconShapeData27, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData27FMTownsProvider },
{ kEoB2ItemIconShapeData28, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData28FMTownsProvider },
{ kEoB2ItemIconShapeData29, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData29FMTownsProvider },
{ kEoB2ItemIconShapeData30, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData30FMTownsProvider },
{ kEoB2ItemIconShapeData31, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData31FMTownsProvider },
{ kEoB2ItemIconShapeData32, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData32FMTownsProvider },
{ kEoB2ItemIconShapeData33, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData33FMTownsProvider },
{ kEoB2ItemIconShapeData34, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData34FMTownsProvider },
{ kEoB2ItemIconShapeData35, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData35FMTownsProvider },
{ kEoB2ItemIconShapeData36, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData36FMTownsProvider },
{ kEoB2ItemIconShapeData37, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData37FMTownsProvider },
{ kEoB2ItemIconShapeData38, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData38FMTownsProvider },
{ kEoB2ItemIconShapeData39, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData39FMTownsProvider },
{ kEoB2ItemIconShapeData40, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData40FMTownsProvider },
{ kEoB2ItemIconShapeData41, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData41FMTownsProvider },
{ kEoB2ItemIconShapeData42, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData42FMTownsProvider },
{ kEoB2ItemIconShapeData43, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData43FMTownsProvider },
{ kEoB2ItemIconShapeData44, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData44FMTownsProvider },
{ kEoB2ItemIconShapeData45, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData45FMTownsProvider },
{ kEoB2ItemIconShapeData46, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData46FMTownsProvider },
{ kEoB2ItemIconShapeData47, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData47FMTownsProvider },
{ kEoB2ItemIconShapeData48, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData48FMTownsProvider },
{ kEoB2ItemIconShapeData49, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData49FMTownsProvider },
{ kEoB2ItemIconShapeData50, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData50FMTownsProvider },
{ kEoB2ItemIconShapeData51, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData51FMTownsProvider },
{ kEoB2ItemIconShapeData52, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData52FMTownsProvider },
{ kEoB2ItemIconShapeData53, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData53FMTownsProvider },
{ kEoB2ItemIconShapeData54, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData54FMTownsProvider },
{ kEoB2ItemIconShapeData55, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData55FMTownsProvider },
{ kEoB2ItemIconShapeData56, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData56FMTownsProvider },
{ kEoB2ItemIconShapeData57, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData57FMTownsProvider },
{ kEoB2ItemIconShapeData58, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData58FMTownsProvider },
{ kEoB2ItemIconShapeData59, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData59FMTownsProvider },
{ kEoB2ItemIconShapeData60, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData60FMTownsProvider },
{ kEoB2ItemIconShapeData61, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData61FMTownsProvider },
{ kEoB2ItemIconShapeData62, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData62FMTownsProvider },
{ kEoB2ItemIconShapeData63, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData63FMTownsProvider },
{ kEoB2ItemIconShapeData64, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData64FMTownsProvider },
{ kEoB2ItemIconShapeData65, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData65FMTownsProvider },
{ kEoB2ItemIconShapeData66, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData66FMTownsProvider },
{ kEoB2ItemIconShapeData67, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData67FMTownsProvider },
{ kEoB2ItemIconShapeData68, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData68FMTownsProvider },
{ kEoB2ItemIconShapeData69, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData69FMTownsProvider },
{ kEoB2ItemIconShapeData70, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData70FMTownsProvider },
{ kEoB2ItemIconShapeData71, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData71FMTownsProvider },
{ kEoB2ItemIconShapeData72, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData72FMTownsProvider },
{ kEoB2ItemIconShapeData73, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData73FMTownsProvider },
{ kEoB2ItemIconShapeData74, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData74FMTownsProvider },
{ kEoB2ItemIconShapeData75, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData75FMTownsProvider },
{ kEoB2ItemIconShapeData76, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData76FMTownsProvider },
{ kEoB2ItemIconShapeData77, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData77FMTownsProvider },
{ kEoB2ItemIconShapeData78, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData78FMTownsProvider },
{ kEoB2ItemIconShapeData79, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData79FMTownsProvider },
{ kEoB2ItemIconShapeData80, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData80FMTownsProvider },
{ kEoB2ItemIconShapeData81, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData81FMTownsProvider },
{ kEoB2ItemIconShapeData82, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData82FMTownsProvider },
{ kEoB2ItemIconShapeData83, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData83FMTownsProvider },
{ kEoB2ItemIconShapeData84, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData84FMTownsProvider },
{ kEoB2ItemIconShapeData85, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData85FMTownsProvider },
{ kEoB2ItemIconShapeData86, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData86FMTownsProvider },
{ kEoB2ItemIconShapeData87, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData87FMTownsProvider },
{ kEoB2ItemIconShapeData88, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData88FMTownsProvider },
{ kEoB2ItemIconShapeData89, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData89FMTownsProvider },
{ kEoB2ItemIconShapeData90, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData90FMTownsProvider },
{ kEoB2ItemIconShapeData91, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData91FMTownsProvider },
{ kEoB2ItemIconShapeData92, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData92FMTownsProvider },
{ kEoB2ItemIconShapeData93, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData93FMTownsProvider },
{ kEoB2ItemIconShapeData94, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData94FMTownsProvider },
{ kEoB2ItemIconShapeData95, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData95FMTownsProvider },
{ kEoB2ItemIconShapeData96, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData96FMTownsProvider },
{ kEoB2ItemIconShapeData97, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData97FMTownsProvider },
{ kEoB2ItemIconShapeData98, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData98FMTownsProvider },
{ kEoB2ItemIconShapeData99, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData99FMTownsProvider },
{ kEoB2ItemIconShapeData100, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData100FMTownsProvider },
{ kEoB2ItemIconShapeData101, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData101FMTownsProvider },
{ kEoB2ItemIconShapeData102, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData102FMTownsProvider },
{ kEoB2ItemIconShapeData103, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData103FMTownsProvider },
{ kEoB2ItemIconShapeData104, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData104FMTownsProvider },
{ kEoB2ItemIconShapeData105, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData105FMTownsProvider },
{ kEoB2ItemIconShapeData106, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData106FMTownsProvider },
{ kEoB2ItemIconShapeData107, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData107FMTownsProvider },
{ kEoB2ItemIconShapeData108, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData108FMTownsProvider },
{ kEoB2ItemIconShapeData109, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData109FMTownsProvider },
{ kEoB2ItemIconShapeData110, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData110FMTownsProvider },
{ kEoB2ItemIconShapeData111, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ItemIconShapeData111FMTownsProvider },
{ kEoB2LargeItemsShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData00FMTownsProvider },
{ kEoB2LargeItemsShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData01FMTownsProvider },
{ kEoB2LargeItemsShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData02FMTownsProvider },
{ kEoB2LargeItemsShapeData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData03FMTownsProvider },
{ kEoB2LargeItemsShapeData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData04FMTownsProvider },
{ kEoB2LargeItemsShapeData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData05FMTownsProvider },
{ kEoB2LargeItemsShapeData06, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData06FMTownsProvider },
{ kEoB2LargeItemsShapeData07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData07FMTownsProvider },
{ kEoB2LargeItemsShapeData08, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData08FMTownsProvider },
{ kEoB2LargeItemsShapeData09, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData09FMTownsProvider },
{ kEoB2LargeItemsShapeData10, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LargeItemsShapeData10FMTownsProvider },
{ kEoB2SmallItemsShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData00FMTownsProvider },
{ kEoB2SmallItemsShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData01FMTownsProvider },
{ kEoB2SmallItemsShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData02FMTownsProvider },
{ kEoB2SmallItemsShapeData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData03FMTownsProvider },
{ kEoB2SmallItemsShapeData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData04FMTownsProvider },
{ kEoB2SmallItemsShapeData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData05FMTownsProvider },
{ kEoB2SmallItemsShapeData06, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData06FMTownsProvider },
{ kEoB2SmallItemsShapeData07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData07FMTownsProvider },
{ kEoB2SmallItemsShapeData08, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData08FMTownsProvider },
{ kEoB2SmallItemsShapeData09, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData09FMTownsProvider },
{ kEoB2SmallItemsShapeData10, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData10FMTownsProvider },
{ kEoB2SmallItemsShapeData11, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData11FMTownsProvider },
{ kEoB2SmallItemsShapeData12, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData12FMTownsProvider },
{ kEoB2SmallItemsShapeData13, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData13FMTownsProvider },
{ kEoB2SmallItemsShapeData14, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData14FMTownsProvider },
{ kEoB2SmallItemsShapeData15, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData15FMTownsProvider },
{ kEoB2SmallItemsShapeData16, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData16FMTownsProvider },
{ kEoB2SmallItemsShapeData17, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData17FMTownsProvider },
{ kEoB2SmallItemsShapeData18, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData18FMTownsProvider },
{ kEoB2SmallItemsShapeData19, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData19FMTownsProvider },
{ kEoB2SmallItemsShapeData20, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData20FMTownsProvider },
{ kEoB2SmallItemsShapeData21, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData21FMTownsProvider },
{ kEoB2SmallItemsShapeData22, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData22FMTownsProvider },
{ kEoB2SmallItemsShapeData23, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData23FMTownsProvider },
{ kEoB2SmallItemsShapeData24, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData24FMTownsProvider },
{ kEoB2SmallItemsShapeData25, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallItemsShapeData25FMTownsProvider },
{ kEoB2ThrownShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData00FMTownsProvider },
{ kEoB2ThrownShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData01FMTownsProvider },
{ kEoB2ThrownShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData02FMTownsProvider },
{ kEoB2ThrownShapeData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData03FMTownsProvider },
{ kEoB2ThrownShapeData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData04FMTownsProvider },
{ kEoB2ThrownShapeData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData05FMTownsProvider },
{ kEoB2ThrownShapeData06, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData06FMTownsProvider },
{ kEoB2ThrownShapeData07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData07FMTownsProvider },
{ kEoB2ThrownShapeData08, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ThrownShapeData08FMTownsProvider },
{ kEoB2SpellShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SpellShapeData00FMTownsProvider },
{ kEoB2SpellShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SpellShapeData01FMTownsProvider },
{ kEoB2SpellShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SpellShapeData02FMTownsProvider },
{ kEoB2SpellShapeData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SpellShapeData03FMTownsProvider },
{ kEoB2TeleporterShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2TeleporterShapeData00FMTownsProvider },
{ kEoB2TeleporterShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2TeleporterShapeData01FMTownsProvider },
{ kEoB2TeleporterShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2TeleporterShapeData02FMTownsProvider },
{ kEoB2TeleporterShapeData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2TeleporterShapeData03FMTownsProvider },
{ kEoB2TeleporterShapeData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2TeleporterShapeData04FMTownsProvider },
{ kEoB2TeleporterShapeData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2TeleporterShapeData05FMTownsProvider },
{ kEoB2LightningColumnShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2LightningColumnShapeDataFMTownsProvider },
{ kEoB2DeadCharShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DeadCharShapeDataFMTownsProvider },
{ kEoB2DisabledCharGridShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2DisabledCharGridShapeDataFMTownsProvider },
{ kEoB2WeaponSlotGridShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WeaponSlotGridShapeDataFMTownsProvider },
{ kEoB2SmallGridShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SmallGridShapeDataFMTownsProvider },
{ kEoB2WideGridShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WideGridShapeDataFMTownsProvider },
{ kEoB2RedSplatShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2RedSplatShapeDataFMTownsProvider },
{ kEoB2GreenSplatShapeData, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2GreenSplatShapeDataFMTownsProvider },
{ kEoB2FirebeamShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FirebeamShapeData00FMTownsProvider },
{ kEoB2FirebeamShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FirebeamShapeData01FMTownsProvider },
{ kEoB2FirebeamShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FirebeamShapeData02FMTownsProvider },
{ kEoB2SparkShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkShapeData00FMTownsProvider },
{ kEoB2SparkShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkShapeData01FMTownsProvider },
{ kEoB2SparkShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SparkShapeData02FMTownsProvider },
{ kEoB2CompassShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData00FMTownsProvider },
{ kEoB2CompassShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData01FMTownsProvider },
{ kEoB2CompassShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData02FMTownsProvider },
{ kEoB2CompassShapeData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData03FMTownsProvider },
{ kEoB2CompassShapeData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData04FMTownsProvider },
{ kEoB2CompassShapeData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData05FMTownsProvider },
{ kEoB2CompassShapeData06, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData06FMTownsProvider },
{ kEoB2CompassShapeData07, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData07FMTownsProvider },
{ kEoB2CompassShapeData08, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData08FMTownsProvider },
{ kEoB2CompassShapeData09, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData09FMTownsProvider },
{ kEoB2CompassShapeData10, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData10FMTownsProvider },
{ kEoB2CompassShapeData11, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2CompassShapeData11FMTownsProvider },
{ kEoB2WallOfForceShapeData00, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShapeData00FMTownsProvider },
{ kEoB2WallOfForceShapeData01, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShapeData01FMTownsProvider },
{ kEoB2WallOfForceShapeData02, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShapeData02FMTownsProvider },
{ kEoB2WallOfForceShapeData03, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShapeData03FMTownsProvider },
{ kEoB2WallOfForceShapeData04, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShapeData04FMTownsProvider },
{ kEoB2WallOfForceShapeData05, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShapeData05FMTownsProvider },
{ kEoB2UtilMenuStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2UtilMenuStringsFMTownsProvider },
{ kEoB2Config2431Strings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2Config2431StringsFMTownsProvider },
{ kEoB2KatakanaLines, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2KatakanaLinesFMTownsProvider },
{ kEoB2KanaSelectStrings, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2KanaSelectStringsFMTownsProvider },
{ kEoB2FontDmpSearchTbl, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2FontDmpSearchTblFMTownsProvider },
{ kEoB2Ascii2SjisTables, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2Ascii2SjisTablesFMTownsProvider },
{ kEoB2Ascii2SjisTables2, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2Ascii2SjisTables2FMTownsProvider },
{ kEoB2SaveNamePatterns, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2SaveNamePatternsFMTownsProvider },
{ kEoB2PcmSoundEffectsIngame, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2PcmSoundEffectsIngameFMTownsProvider },
{ kEoB2PcmSoundEffectsIntro, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2PcmSoundEffectsIntroFMTownsProvider },
{ kEoB2PcmSoundEffectsFinale, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2PcmSoundEffectsFinaleFMTownsProvider },
{ kLoLIngamePakFiles, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngamePakFilesDOSProvider },
{ kLoLCharacterDefs, kLoL, kPlatformDOS, kNoSpecial, EN_ANY, &kLoLCharacterDefsDOSEnglishProvider },
{ kLoLIngameSfxFiles, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLIngameSfxFilesDOSProvider },
@ -1764,7 +2281,6 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscX, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscXDOSProvider },
{ kLoLBaseDscY, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLBaseDscYDOSProvider },
{ kRpgCommonDscTileIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscTileIndexDOSProvider },
{ kRpgCommonDscUnk2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscUnk2DOSProvider },
{ kRpgCommonDscDoorShapeIndex, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorShapeIndexDOSProvider },
{ kRpgCommonDscDimData1, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDimData1DOSProvider },
{ kRpgCommonDscDimData2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDimData2DOSProvider },
@ -1775,6 +2291,7 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscDoorY2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorY2DOSProvider },
{ kRpgCommonDscDoorFrameY1, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY1DOSProvider },
{ kRpgCommonDscDoorFrameY2, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY2DOSProvider },
{ kRpgCommonDscDoorScaleOffs, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorScaleOffsDOSProvider },
{ kLoLDscDoorScale, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorScaleDOSProvider },
{ kLoLDscDoor4, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoor4DOSProvider },
{ kLoLDscDoorX, kLoL, kPlatformDOS, kNoSpecial, UNK_LANG, &kLoLDscDoorXDOSProvider },
@ -1839,7 +2356,6 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscX, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscXPC98Provider },
{ kLoLBaseDscY, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLBaseDscYPC98Provider },
{ kRpgCommonDscTileIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscTileIndexPC98Provider },
{ kRpgCommonDscUnk2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscUnk2PC98Provider },
{ kRpgCommonDscDoorShapeIndex, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorShapeIndexPC98Provider },
{ kRpgCommonDscDimData1, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDimData1PC98Provider },
{ kRpgCommonDscDimData2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDimData2PC98Provider },
@ -1850,6 +2366,7 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscDoorY2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorY2PC98Provider },
{ kRpgCommonDscDoorFrameY1, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY1PC98Provider },
{ kRpgCommonDscDoorFrameY2, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY2PC98Provider },
{ kRpgCommonDscDoorScaleOffs, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorScaleOffsPC98Provider },
{ kLoLDscDoorScale, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorScalePC98Provider },
{ kLoLDscDoor4, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoor4PC98Provider },
{ kLoLDscDoorX, kLoL, kPlatformPC98, kNoSpecial, UNK_LANG, &kLoLDscDoorXPC98Provider },
@ -1911,7 +2428,6 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscX, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscXFMTownsProvider },
{ kLoLBaseDscY, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLBaseDscYFMTownsProvider },
{ kRpgCommonDscTileIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscTileIndexFMTownsProvider },
{ kRpgCommonDscUnk2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscUnk2FMTownsProvider },
{ kRpgCommonDscDoorShapeIndex, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorShapeIndexFMTownsProvider },
{ kRpgCommonDscDimData1, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDimData1FMTownsProvider },
{ kRpgCommonDscDimData2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDimData2FMTownsProvider },
@ -1922,6 +2438,7 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscDoorY2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorY2FMTownsProvider },
{ kRpgCommonDscDoorFrameY1, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY1FMTownsProvider },
{ kRpgCommonDscDoorFrameY2, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorFrameY2FMTownsProvider },
{ kRpgCommonDscDoorScaleOffs, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorScaleOffsFMTownsProvider },
{ kLoLDscDoorScale, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorScaleFMTownsProvider },
{ kLoLDscDoor4, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoor4FMTownsProvider },
{ kLoLDscDoorX, kLoL, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kLoLDscDoorXFMTownsProvider },
@ -1989,7 +2506,6 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscX, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscXDOSCDProvider },
{ kLoLBaseDscY, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLBaseDscYDOSCDProvider },
{ kRpgCommonDscTileIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscTileIndexDOSCDProvider },
{ kRpgCommonDscUnk2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscUnk2DOSCDProvider },
{ kRpgCommonDscDoorShapeIndex, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorShapeIndexDOSCDProvider },
{ kRpgCommonDscDimData1, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDimData1DOSCDProvider },
{ kRpgCommonDscDimData2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDimData2DOSCDProvider },
@ -2000,6 +2516,7 @@ static const ResourceProvider resourceProviders[] = {
{ kRpgCommonDscDoorY2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorY2DOSCDProvider },
{ kRpgCommonDscDoorFrameY1, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorFrameY1DOSCDProvider },
{ kRpgCommonDscDoorFrameY2, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorFrameY2DOSCDProvider },
{ kRpgCommonDscDoorScaleOffs, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorScaleOffsDOSCDProvider },
{ kLoLDscDoorScale, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorScaleDOSCDProvider },
{ kLoLDscDoor4, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoor4DOSCDProvider },
{ kLoLDscDoorX, kLoL, kPlatformDOS, kTalkieVersion, UNK_LANG, &kLoLDscDoorXDOSCDProvider },

View File

@ -1389,14 +1389,6 @@ static const byte kEoB1DscTileIndexDOS[18] = {
static const ByteProvider kEoB1DscTileIndexDOSProvider = { ARRAYSIZE(kEoB1DscTileIndexDOS), kEoB1DscTileIndexDOS };
static const byte kEoB1DscUnk2DOS[23] = {
0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
};
static const ByteProvider kEoB1DscUnk2DOSProvider = { ARRAYSIZE(kEoB1DscUnk2DOS), kEoB1DscUnk2DOS };
static const byte kEoB1DscDimData1DOS[324] = {
0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,

View File

@ -2330,14 +2330,6 @@ static const byte kEoB2DscTileIndexDOS[18] = {
static const ByteProvider kEoB2DscTileIndexDOSProvider = { ARRAYSIZE(kEoB2DscTileIndexDOS), kEoB2DscTileIndexDOS };
static const byte kEoB2DscUnk2DOS[23] = {
0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
};
static const ByteProvider kEoB2DscUnk2DOSProvider = { ARRAYSIZE(kEoB2DscUnk2DOS), kEoB2DscUnk2DOS };
static const byte kEoB2DscDimData1DOS[324] = {
0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,
0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7,

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,938 @@
static const char *const kEoB2ChargenStrings1FMTownsJapanese[9] = {
"\x83""p""\x81""[""\x83""e""\x83""B""\x82\xCC\x83\x81\x83\x93\x83""o""\x81""[""\x82\xAA\x91""S""\x88\xF5""\r""\x82\xBB\x82\xEB\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 kEoB2ChargenStrings1FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ChargenStrings1FMTownsJapanese), kEoB2ChargenStrings1FMTownsJapanese };
static const char *const kEoB2ChargenStrings2FMTownsJapanese[12] = {
"%s",
"%d",
"%s",
"%d",
"%d",
"%d",
"%s",
"%d",
"SELECT RACE:",
"SELECT CLASS:",
"SELECT ALIGNMENT:",
"Name:"
};
static const StringListProvider kEoB2ChargenStrings2FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ChargenStrings2FMTownsJapanese), kEoB2ChargenStrings2FMTownsJapanese };
static const char *const kEoB2ChargenStatStringsFMTownsJapanese[12] = {
"STR",
"INT",
"WIS",
"DEX",
"CON",
"CHA",
"STR",
"INT",
"WIS",
"DEX",
"CON",
"CHA"
};
static const StringListProvider kEoB2ChargenStatStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ChargenStatStringsFMTownsJapanese), kEoB2ChargenStatStringsFMTownsJapanese };
static const char *const kEoB2ChargenRaceSexStringsFMTownsJapanese[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 kEoB2ChargenRaceSexStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ChargenRaceSexStringsFMTownsJapanese), kEoB2ChargenRaceSexStringsFMTownsJapanese };
static const char *const kEoB2ChargenClassStringsFMTownsJapanese[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 kEoB2ChargenClassStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ChargenClassStringsFMTownsJapanese), kEoB2ChargenClassStringsFMTownsJapanese };
static const char *const kEoB2ChargenAlignmentStringsFMTownsJapanese[9] = {
"LAWFUL GOOD",
"NEUTRAL GOOD",
"CHAOTIC GOOD",
"LAWFUL NEUTRAL",
"TRUE NEUTRAL",
"CHAOTIC NEUTRAL",
"LAWFUL EVIL",
"NEUTRAL EVIL",
"CHAOTIC EVIL"
};
static const StringListProvider kEoB2ChargenAlignmentStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ChargenAlignmentStringsFMTownsJapanese), kEoB2ChargenAlignmentStringsFMTownsJapanese };
static const char *const kEoB2ChargenEnterGameStringsFMTownsJapanese[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 kEoB2ChargenEnterGameStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ChargenEnterGameStringsFMTownsJapanese), kEoB2ChargenEnterGameStringsFMTownsJapanese };
static const char *const kEoB2PryDoorStringsFMTownsJapanese[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 kEoB2PryDoorStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2PryDoorStringsFMTownsJapanese), kEoB2PryDoorStringsFMTownsJapanese };
static const char *const kEoB2WarningStringsFMTownsJapanese[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 kEoB2WarningStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2WarningStringsFMTownsJapanese), kEoB2WarningStringsFMTownsJapanese };
static const char *const kEoB2ItemSuffixStringsRingsFMTownsJapanese[4] = {
"\x83""A""\x83""h""\x81""[""\x83\x93\x83\x81\x83\x93\x83""g",
"\x83""E""\x83""C""\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 kEoB2ItemSuffixStringsRingsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsRingsFMTownsJapanese), kEoB2ItemSuffixStringsRingsFMTownsJapanese };
static const char *const kEoB2ItemSuffixStringsPotionsFMTownsJapanese[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 kEoB2ItemSuffixStringsPotionsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsPotionsFMTownsJapanese), kEoB2ItemSuffixStringsPotionsFMTownsJapanese };
static const char *const kEoB2ItemSuffixStringsWandsFMTownsJapanese[8] = {
"\x82""r""\x82\x94\x82\x89\x82\x83\x82\x8B",
"\x82""k""\x82\x89\x82\x87\x82\x88\x82\x94\x82\x8E\x82\x89\x82\x8E\x82\x87",
"\x82""e""\x82\x92\x82\x8F\x82\x93\x82\x94",
"\x82""b""\x82\x95\x82\x92\x82\x89\x82\x8E\x82\x87",
"\x82""e""\x82\x89\x82\x92\x82\x85\x82\x82\x82\x81\x82\x8C\x82\x8C",
"\x82""r""\x82\x94\x82\x81\x82\x92\x82\x86\x82\x89\x82\x92\x82\x85",
"\x82""l""\x82\x81\x82\x87\x82\x89\x82\x83\x81""@""\x82""l""\x82\x89\x82\x93\x82\x93\x82\x89\x82\x8C\x82\x85",
"\x82""c""\x82\x89\x82\x93\x82\x90\x82\x85\x82\x8C\x81""@""\x82""l""\x82\x81\x82\x87\x82\x89\x82\x83"
};
static const StringListProvider kEoB2ItemSuffixStringsWandsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsWandsFMTownsJapanese), kEoB2ItemSuffixStringsWandsFMTownsJapanese };
static const char *const kEoB2RipItemStringsFMTownsJapanese[3] = {
"%s""\x82\xCC",
"%s""\x82\xCC",
"\x82\xCD\x96\xB3\x82\xAD\x82\xC8\x82\xC1\x82\xBD\x81""B\r"
};
static const StringListProvider kEoB2RipItemStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2RipItemStringsFMTownsJapanese), kEoB2RipItemStringsFMTownsJapanese };
static const char *const kEoB2CursedStringFMTownsJapanese[1] = {
"%d""\x82\xCC\x8E\xF4\x82\xED\x82\xEA\x82\xBD""%s"
};
static const StringListProvider kEoB2CursedStringFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CursedStringFMTownsJapanese), kEoB2CursedStringFMTownsJapanese };
static const char *const kEoB2MagicObjectStringsFMTownsJapanese[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 kEoB2MagicObjectStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicObjectStringsFMTownsJapanese), kEoB2MagicObjectStringsFMTownsJapanese };
static const char *const kEoB2MagicObjectString5FMTownsJapanese[1] = {
"\x82""r""\x82\x94\x82\x89\x82\x83\x82\x8B"
};
static const StringListProvider kEoB2MagicObjectString5FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicObjectString5FMTownsJapanese), kEoB2MagicObjectString5FMTownsJapanese };
static const char *const kEoB2PatternSuffixFMTownsJapanese[1] = {
"%s""\x82\xCC""%s"
};
static const StringListProvider kEoB2PatternSuffixFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2PatternSuffixFMTownsJapanese), kEoB2PatternSuffixFMTownsJapanese };
static const char *const kEoB2PatternGrFix1FMTownsJapanese[1] = {
"%s""\x82\xCC""%s"
};
static const StringListProvider kEoB2PatternGrFix1FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2PatternGrFix1FMTownsJapanese), kEoB2PatternGrFix1FMTownsJapanese };
static const char *const kEoB2PatternGrFix2FMTownsJapanese[1] = {
"%s""\x82\xCC""%s"
};
static const StringListProvider kEoB2PatternGrFix2FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2PatternGrFix2FMTownsJapanese), kEoB2PatternGrFix2FMTownsJapanese };
static const char *const kEoB2ValidateArmorStringFMTownsJapanese[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 kEoB2ValidateArmorStringFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ValidateArmorStringFMTownsJapanese), kEoB2ValidateArmorStringFMTownsJapanese };
static const char *const kEoB2ValidateCursedStringFMTownsJapanese[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 kEoB2ValidateCursedStringFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ValidateCursedStringFMTownsJapanese), kEoB2ValidateCursedStringFMTownsJapanese };
static const char *const kEoB2ValidateNoDropStringFMTownsJapanese[1] = {
"\x82\xB1\x82\xCC\x83""A""\x83""C""\x83""e""\x83\x80\x82\xCD\x82\xBB\x82\xB1\x82\xC9\x92""u""\x82\xAF\x82\xC8\x82\xA2\x81""B\r"
};
static const StringListProvider kEoB2ValidateNoDropStringFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ValidateNoDropStringFMTownsJapanese), kEoB2ValidateNoDropStringFMTownsJapanese };
static const char *const kEoB2PotionStringsFMTownsJapanese[2] = {
"\x93\xC5\x82\xF0\x8E\xF3\x82\xAF\x82\xBD",
"%s""\x82\xCD""%s""\x81""I\r"
};
static const StringListProvider kEoB2PotionStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2PotionStringsFMTownsJapanese), kEoB2PotionStringsFMTownsJapanese };
static const char *const kEoB2WandStringsFMTownsJapanese[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 kEoB2WandStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2WandStringsFMTownsJapanese), kEoB2WandStringsFMTownsJapanese };
static const char *const kEoB2ItemMisuseStringsFMTownsJapanese[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 kEoB2ItemMisuseStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ItemMisuseStringsFMTownsJapanese), kEoB2ItemMisuseStringsFMTownsJapanese };
static const char *const kEoB2TakenStringsFMTownsJapanese[1] = {
"\x82\xF0\x8E\xE6\x82\xC1\x82\xBD\x81""B\r"
};
static const StringListProvider kEoB2TakenStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2TakenStringsFMTownsJapanese), kEoB2TakenStringsFMTownsJapanese };
static const char *const kEoB2PotionEffectStringsFMTownsJapanese[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 kEoB2PotionEffectStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2PotionEffectStringsFMTownsJapanese), kEoB2PotionEffectStringsFMTownsJapanese };
static const char *const kEoB2YesNoStringsFMTownsJapanese[2] = {
"\x82\xCD\x82\xA2",
"\x82\xA2\x82\xA2\x82\xA6"
};
static const StringListProvider kEoB2YesNoStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2YesNoStringsFMTownsJapanese), kEoB2YesNoStringsFMTownsJapanese };
static const char *const kEoB2MoreStringsFMTownsJapanese[1] = {
"\x82""l""\x82""n""\x82""q""\x82""d"
};
static const StringListProvider kEoB2MoreStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MoreStringsFMTownsJapanese), kEoB2MoreStringsFMTownsJapanese };
static const char *const kEoB2NpcMaxStringsFMTownsJapanese[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 kEoB2NpcMaxStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2NpcMaxStringsFMTownsJapanese), kEoB2NpcMaxStringsFMTownsJapanese };
static const char *const kEoB2OkStringsFMTownsJapanese[1] = {
"\x82""n""\x82""j"
};
static const StringListProvider kEoB2OkStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2OkStringsFMTownsJapanese), kEoB2OkStringsFMTownsJapanese };
static const char *const kEoB2NpcJoinStringsFMTownsJapanese[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 kEoB2NpcJoinStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2NpcJoinStringsFMTownsJapanese), kEoB2NpcJoinStringsFMTownsJapanese };
static const char *const kEoB2CancelStringsFMTownsJapanese[1] = {
"\x92\x86\x8E""~"
};
static const StringListProvider kEoB2CancelStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CancelStringsFMTownsJapanese), kEoB2CancelStringsFMTownsJapanese };
static const char *const kEoB2AbortStringsFMTownsJapanese[1] = {
"\x92\x86\x8E""~"
};
static const StringListProvider kEoB2AbortStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2AbortStringsFMTownsJapanese), kEoB2AbortStringsFMTownsJapanese };
static const char *const kEoB2MenuStringsMainFMTownsJapanese[8] = {
"\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",
"EXIT",
};
static const StringListProvider kEoB2MenuStringsMainFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsMainFMTownsJapanese), kEoB2MenuStringsMainFMTownsJapanese };
static const char *const kEoB2MenuStringsSaveLoadFMTownsJapanese[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""^""\x81""[""\x82\xF0\x8A""O""\x82\xB7",
"\x83""Q""\x81""[""\x83\x80\x82\xF0\x8F""I""\x97\xB9\x82\xB7\x82\xE9",
"\x83""I""\x83""v""\x83""V""\x83\x87\x83\x93"":",
"\r ""\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\r",
};
static const StringListProvider kEoB2MenuStringsSaveLoadFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsSaveLoadFMTownsJapanese), kEoB2MenuStringsSaveLoadFMTownsJapanese };
static const char *const kEoB2MenuStringsOnOffFMTownsJapanese[2] = {
"\x82""n""\x82""m",
"\x82""n""\x82""e""\x82""e"
};
static const StringListProvider kEoB2MenuStringsOnOffFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsOnOffFMTownsJapanese), kEoB2MenuStringsOnOffFMTownsJapanese };
static const char *const kEoB2MenuStringsSpellsFMTownsJapanese[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""\r ""\x82\xC4\x8E\xF4\x95\xB6\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\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""\r ""\x82\xC8\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""\r ""\x83""L""\x83\x83\x83\x89\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""\r ""\x8A""o""\x82\xA6\x82\xE9\x82\xB1\x82\xC6\x82\xAA\x82\xC5\x82\xAB\x82\xE9\x8E\xD2\x82\xAA\x82\xA2\x82\xC8\x82\xA2\x81""B",
" ""\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",
" ""\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",
"1",
"2",
"3",
"4",
"5",
"\x83""N""\x83\x8A\x83""A",
"\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 kEoB2MenuStringsSpellsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsSpellsFMTownsJapanese), kEoB2MenuStringsSpellsFMTownsJapanese };
static const char *const kEoB2MenuStringsRestFMTownsJapanese[5] = {
"\r ""\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",
" ""\x82\xDC\x82\xBE\x89\xF6\x89\xE4\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""\x81""@""\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",
" ""\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\r ""\x8B""x""\x91\xA7\x82\xAA\x95""K""\x97""v""\x82\xC5\x82\xB7\x81""B\r"
};
static const StringListProvider kEoB2MenuStringsRestFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsRestFMTownsJapanese), kEoB2MenuStringsRestFMTownsJapanese };
static const char *const kEoB2MenuStringsDropFMTownsJapanese[1] = {
" ""\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""\r""\x82\xC9\x82\xB7\x82\xE9\x82\xB1\x82\xC6\x82\xCD\x82\xC5\x82\xAB\x82\xDC\x82\xB9\x82\xF1\x81""B"
};
static const StringListProvider kEoB2MenuStringsDropFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsDropFMTownsJapanese), kEoB2MenuStringsDropFMTownsJapanese };
static const char *const kEoB2MenuStringsExitFMTownsJapanese[1] = {
"\r""\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 kEoB2MenuStringsExitFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsExitFMTownsJapanese), kEoB2MenuStringsExitFMTownsJapanese };
static const char *const kEoB2MenuStringsStarveFMTownsJapanese[1] = {
"\r ""\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 kEoB2MenuStringsStarveFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsStarveFMTownsJapanese), kEoB2MenuStringsStarveFMTownsJapanese };
static const char *const kEoB2MenuStringsScribeFMTownsJapanese[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 ""\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",
" ""\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""\r ""\x82\xF0\x8E\x9D\x82\xC1\x82\xC4\x82\xA2\x82\xC8\x82\xA2\x81""B",
" ""\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""\r ""\x82\xF0\x8E\x9D\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""\r ""\x83\x81\x83""C""\x83""W""\x82\xAA\x82\xA2\x82\xC8\x82\xA2\x81""B"
};
static const StringListProvider kEoB2MenuStringsScribeFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsScribeFMTownsJapanese), kEoB2MenuStringsScribeFMTownsJapanese };
static const char *const kEoB2MenuStringsDrop2FMTownsJapanese[3] = {
" ""\x95\xCA\x82\xEA\x82\xE9\x83""L""\x83\x83\x83\x89\x83""N""\x83""^""\x81""[""\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 kEoB2MenuStringsDrop2FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsDrop2FMTownsJapanese), kEoB2MenuStringsDrop2FMTownsJapanese };
static const char *const kEoB2MenuStringsHeadFMTownsJapanese[3] = {
"\x83""L""\x83\x83\x83\x93\x83""v:",
"\x8A\xC2\x8B\xAB\x90\xDD\x92\xE8"":",
"\x83""I""\x83""v""\x83""V""\x83\x87\x83\x93"":"
};
static const StringListProvider kEoB2MenuStringsHeadFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsHeadFMTownsJapanese), kEoB2MenuStringsHeadFMTownsJapanese };
static const char *const kEoB2MenuStringsPoisonFMTownsJapanese[1] = {
"\x81""@""\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""\r""\x82\xB5\x82\xDC\x82\xA2\x82\xDC\x82\xB7\x81""I\r""\x81""@""\x82\xBB\x82\xEA\x82\xC5\x82\xE0\x8B""x""\x82\xDD\x82\xDC\x82\xB7\x82\xA9\x81""H"
};
static const StringListProvider kEoB2MenuStringsPoisonFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsPoisonFMTownsJapanese), kEoB2MenuStringsPoisonFMTownsJapanese };
static const char *const kEoB2MenuStringsMgcFMTownsJapanese[2] = {
"",
"%d""\x8C\xC2\x92\x86\x81""@%d""\x8C\xC2\x8E""g""\x97""p""\x89\xC2\x94""\\"
};
static const StringListProvider kEoB2MenuStringsMgcFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsMgcFMTownsJapanese), kEoB2MenuStringsMgcFMTownsJapanese };
static const char *const kEoB2MenuStringsPrefsFMTownsJapanese[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",
"\x89\xE6\x96\xCA\x83\x82\x81""[""\x83""h""\x81""@%-10s"
};
static const StringListProvider kEoB2MenuStringsPrefsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsPrefsFMTownsJapanese), kEoB2MenuStringsPrefsFMTownsJapanese };
static const char *const kEoB2MenuStringsRest2FMTownsJapanese[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\x81""F %-4d",
"\r%s\r"
};
static const StringListProvider kEoB2MenuStringsRest2FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsRest2FMTownsJapanese), kEoB2MenuStringsRest2FMTownsJapanese };
static const char *const kEoB2MenuStringsRest3FMTownsJapanese[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 kEoB2MenuStringsRest3FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsRest3FMTownsJapanese), kEoB2MenuStringsRest3FMTownsJapanese };
static const char *const kEoB2MenuStringsRest4FMTownsJapanese[1] = {
"\x06\x06\x83\x82\x83\x93\x83""X""\x83""^""\x81""[""\x82\xAA\x8B\xDF\x82\xAD\x82\xC9\x82\xA2\x82\xC4\x8B""x""\x82\xDF\x82\xC8\x82\xA2\x81""B"
};
static const StringListProvider kEoB2MenuStringsRest4FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsRest4FMTownsJapanese), kEoB2MenuStringsRest4FMTownsJapanese };
static const char *const kEoB2MenuStringsDefeatFMTownsJapanese[1] = {
"\r ""\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""Q""\x81""[""\x83\x80\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 kEoB2MenuStringsDefeatFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsDefeatFMTownsJapanese), kEoB2MenuStringsDefeatFMTownsJapanese };
static const char *const kEoB2MenuStringsSpecFMTownsJapanese[2] = {
"\r ""\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 kEoB2MenuStringsSpecFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuStringsSpecFMTownsJapanese), kEoB2MenuStringsSpecFMTownsJapanese };
static const char *const kEoB2MenuYesNoStringsFMTownsJapanese[2] = {
"\x82\xCD\x82\xA2",
"\x82\xA2\x82\xA2\x82\xA6"
};
static const StringListProvider kEoB2MenuYesNoStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MenuYesNoStringsFMTownsJapanese), kEoB2MenuYesNoStringsFMTownsJapanese };
static const char *const kEoB2CharGuiStringsHpFMTownsJapanese[2] = {
"HP",
"%3d of %-3d"
};
static const StringListProvider kEoB2CharGuiStringsHpFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsHpFMTownsJapanese), kEoB2CharGuiStringsHpFMTownsJapanese };
static const char *const kEoB2CharGuiStringsWp2FMTownsJapanese[3] = {
"MISS",
"HACK",
"BASH"
};
static const StringListProvider kEoB2CharGuiStringsWp2FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsWp2FMTownsJapanese), kEoB2CharGuiStringsWp2FMTownsJapanese };
static const char *const kEoB2CharGuiStringsWrFMTownsJapanese[4] = {
"CAN'T",
"REACH",
"NO",
"AMMO"
};
static const StringListProvider kEoB2CharGuiStringsWrFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsWrFMTownsJapanese), kEoB2CharGuiStringsWrFMTownsJapanese };
static const char *const kEoB2CharGuiStringsSt2FMTownsJapanese[7] = {
"Swapping",
"\x8E\x80\x96""S",
"\x8B""C""\x90\xE2",
"\x93\xC5\x81""i""\x92""x""\x82\xA2\x81""j",
"\x93\xC5",
"\x96\x83\xE1\x83",
"\x90\xCE\x89\xBB"
};
static const StringListProvider kEoB2CharGuiStringsSt2FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsSt2FMTownsJapanese), kEoB2CharGuiStringsSt2FMTownsJapanese };
static const char *const kEoB2CharGuiStringsInFMTownsJapanese[4] = {
"CHARACTER INFO",
"AC",
"EXP",
"LVL"
};
static const StringListProvider kEoB2CharGuiStringsInFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharGuiStringsInFMTownsJapanese), kEoB2CharGuiStringsInFMTownsJapanese };
static const char *const kEoB2CharStatusStrings7FMTownsJapanese[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 kEoB2CharStatusStrings7FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings7FMTownsJapanese), kEoB2CharStatusStrings7FMTownsJapanese };
static const char *const kEoB2CharStatusStrings82FMTownsJapanese[1] = {
"\x06\x06""%s""\x82\xCD\x93\xC5\x82\xAA\x89\xF1\x82\xC1\x82\xBD\x81""I\r"
};
static const StringListProvider kEoB2CharStatusStrings82FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings82FMTownsJapanese), kEoB2CharStatusStrings82FMTownsJapanese };
static const char *const kEoB2CharStatusStrings9FMTownsJapanese[1] = {
"\x06\x04""%s""\x82\xCC\x96\x83\xE1\x83\x82\xCD\x8E\xA1\x82\xC1\x82\xBD\x81""I\r"
};
static const StringListProvider kEoB2CharStatusStrings9FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings9FMTownsJapanese), kEoB2CharStatusStrings9FMTownsJapanese };
static const char *const kEoB2CharStatusStrings12FMTownsJapanese[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 kEoB2CharStatusStrings12FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings12FMTownsJapanese), kEoB2CharStatusStrings12FMTownsJapanese };
static const char *const kEoB2CharStatusStrings132FMTownsJapanese[1] = {
"\x06\x06""%s""\x82\xCD""%s""\x81""I\r"
};
static const StringListProvider kEoB2CharStatusStrings132FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2CharStatusStrings132FMTownsJapanese), kEoB2CharStatusStrings132FMTownsJapanese };
static const char *const kEoB2LevelGainStringsFMTownsJapanese[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 kEoB2LevelGainStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2LevelGainStringsFMTownsJapanese), kEoB2LevelGainStringsFMTownsJapanese };
static const char *const kEoB2BookNumbersFMTownsJapanese[5] = {
"First",
"Second",
"Third",
"Fourth",
"Fifth"
};
static const StringListProvider kEoB2BookNumbersFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2BookNumbersFMTownsJapanese), kEoB2BookNumbersFMTownsJapanese };
static const char *const kEoB2MageSpellsListFMTownsJapanese[33] = {
"",
"\x82""`""\x82""q""\x82""l""\x82""n""\x82""q",
"\x82""a""\x82""t""\x82""q""\x82""m""\x82""h""\x82""m""\x82""f""\x81""@""\x82""g""\x82""`""\x82""m""\x82""c""\x82""r",
"\x82""c""\x82""d""\x82""s""\x82""d""\x82""b""\x82""s""\x81""@""\x82""l""\x82""`""\x82""f""\x82""h""\x82""b",
"\x82""l""\x82""`""\x82""f""\x82""h""\x82""b""\x81""@""\x82""l""\x82""h""\x82""r""\x82""r""\x82""h""\x82""k""\x82""d",
"\x82""r""\x82""g""\x82""h""\x82""d""\x82""k""\x82""c",
"\x82""r""\x82""g""\x82""n""\x82""b""\x82""j""\x82""h""\x82""m""\x82""f""\x81""@""\x82""f""\x82""q""\x82""`""\x82""r""\x82""o",
"\x82""a""\x82""k""\x82""t""\x82""q",
"\x82""c""\x82""d""\x82""s""\x82""d""\x82""b""\x82""s""\x81""@""\x82""h""\x82""m""\x82""u""\x82""h""\x82""r""\x82""h""\x82""a""\x82""k""\x82""d",
"\x82""h""\x82""l""\x82""o""\x81""@""\x82""h""\x82""c""\x82""d""\x82""m""\x82""s""\x82""h""\x82""e""\x82""x",
"\x82""h""\x82""m""\x82""u""\x82""h""\x82""r""\x82""h""\x82""a""\x82""h""\x82""k""\x82""h""\x82""s""\x82""x",
"\x82""l""\x81""f""\x82""r""\x81""@""\x82""`""\x82""b""\x82""h""\x82""c""\x81""@""\x82""`""\x82""q""\x82""q""\x82""n""\x82""v",
"\x82""c""\x82""h""\x82""r""\x82""o""\x82""d""\x82""k""\x81""@""\x82""l""\x82""`""\x82""f""\x82""h""\x82""b",
"\x82""e""\x82""h""\x82""q""\x82""d""\x81""@""\x82""a""\x82""`""\x82""k""\x82""k",
"\x82""g""\x82""`""\x82""r""\x82""s""\x82""d",
"\x82""g""\x82""n""\x82""k""\x82""c""\x81""@""\x82""o""\x82""d""\x82""q""\x82""r""\x82""n""\x82""m",
"\x82""h""\x82""m""\x82""u""\x82""h""\x82""r""\x82""h""\x82""a""\x82""h""\x82""k""\x82""h""\x82""s""\x82""x""\x81""@""\x82""P""\x82""O""\x81""f",
"\x82""k""\x82""h""\x82""f""\x82""g""\x82""s""\x82""m""\x82""h""\x82""m""\x82""f""\x81""@""\x82""a""\x82""n""\x82""k""\x82""s",
"\x82""u""\x82""`""\x82""l""\x82""o""\x82""h""\x82""q""\x82""h""\x82""b""\x81""@""\x82""s""\x82""n""\x82""t""\x82""b""\x82""g",
"\x82""e""\x82""d""\x82""`""\x82""q",
"\x82""h""\x82""b""\x82""d""\x81""@""\x82""r""\x82""s""\x82""n""\x82""q""\x82""l",
"\x82""h""\x82""l""\x82""o""\x81""@""\x82""h""\x82""m""\x82""u""\x82""h""\x82""r""\x82""h""\x82""a""\x82""h""\x82""k""\x82""h""\x82""s""\x82""x",
"\x82""q""\x82""d""\x82""l""\x82""n""\x82""u""\x82""d""\x81""@""\x82""b""\x82""t""\x82""q""\x82""r""\x82""d",
"\x82""b""\x82""n""\x82""m""\x82""d""\x81""@""\x82""n""\x82""e""\x81""@""\x82""b""\x82""n""\x82""k""\x82""c",
"\x82""g""\x82""n""\x82""k""\x82""c""\x81""@""\x82""l""\x82""n""\x82""m""\x82""r""\x82""s""\x82""d""\x82""q",
"\x82""v""\x82""`""\x82""k""\x82""k""\x81""@""\x82""n""\x82""e""\x81""@""\x82""e""\x82""n""\x82""q""\x82""b""\x82""d",
"\x82""c""\x82""h""\x82""r""\x82""h""\x82""m""\x82""s""\x82""d""\x82""f""\x82""q""\x82""`""\x82""s""\x82""d",
"\x82""e""\x82""k""\x82""d""\x82""r""\x82""g""\x81""@""\x82""s""\x82""n""\x81""@""\x82""r""\x82""s""\x82""n""\x82""m""\x82""d",
"\x82""r""\x82""s""\x82""n""\x82""m""\x82""d""\x81""@""\x82""s""\x82""n""\x81""@""\x82""e""\x82""k""\x82""d""\x82""r""\x82""g",
"\x82""s""\x82""q""\x82""t""\x82""d""\x81""@""\x82""r""\x82""d""\x82""d""\x82""h""\x82""m""\x82""f",
"\x82""e""\x82""h""\x82""m""\x82""f""\x82""d""\x82""q""\x81""@""\x82""n""\x82""e""\x81""@""\x82""c""\x82""d""\x82""`""\x82""s""\x82""g",
"\x82""o""\x82""n""\x82""v""\x82""d""\x82""q""\x81""@""\x82""v""\x82""n""\x82""q""\x82""c""\x81""@""\x82""r""\x82""s""\x82""t""\x82""m",
"\x82""a""\x82""h""\x82""f""\x82""a""\x82""x""\x81""f""\x82""r""\x81""@""\x82""e""\x82""h""\x82""r""\x82""s"
};
static const StringListProvider kEoB2MageSpellsListFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MageSpellsListFMTownsJapanese), kEoB2MageSpellsListFMTownsJapanese };
static const char *const kEoB2ClericSpellsListFMTownsJapanese[30] = {
"",
"\x82""a""\x82""k""\x82""d""\x82""r""\x82""r",
"\x82""b""\x82""`""\x82""t""\x82""r""\x82""d""\x81""@""\x82""k""\x82""h""\x82""f""\x82""g""\x82""s""\x81""@""\x82""v""\x82""m""\x82""c""\x82""r",
"\x82""b""\x82""t""\x82""q""\x82""d""\x81""@""\x82""k""\x82""h""\x82""f""\x82""g""\x82""s""\x81""@""\x82""v""\x82""m""\x82""c""\x82""r",
"\x82""c""\x82""d""\x82""s""\x82""d""\x82""b""\x82""s""\x81""@""\x82""l""\x82""`""\x82""f""\x82""h""\x82""b",
"\x82""o""\x82""q""\x82""n""\x82""s""\x82""d""\x82""b""\x82""s""\x81""|""\x82""d""\x82""u""\x82""h""\x82""k",
"\x82""`""\x82""h""\x82""c",
"\x82""e""\x82""k""\x82""`""\x82""l""\x82""d""\x81""@""\x82""a""\x82""k""\x82""`""\x82""c""\x82""d",
"\x82""g""\x82""n""\x82""k""\x82""c""\x81""@""\x82""o""\x82""d""\x82""q""\x82""r""\x82""n""\x82""m",
"\x82""r""\x82""k""\x82""n""\x82""v""\x81""@""\x82""o""\x82""n""\x82""h""\x82""r""\x82""n""\x82""m",
"\x82""b""\x82""q""\x82""d""\x82""`""\x82""s""\x82""d""\x81""@""\x82""e""\x82""n""\x82""n""\x82""c",
"\x82""c""\x82""h""\x82""r""\x82""o""\x82""d""\x82""k""\x81""@""\x82""l""\x82""`""\x82""f""\x82""h""\x82""b",
"\x82""l""\x82""`""\x82""f""\x82""h""\x82""b""\x82""`""\x82""k""\x81""@""\x82""u""\x82""d""\x82""r""\x82""s""\x82""l""\x82""d""\x82""m""\x82""s",
"\x82""o""\x82""q""\x82""`""\x82""x""\x82""d""\x82""q",
"\x82""q""\x82""d""\x82""l""\x82""n""\x82""u""\x82""d""\x81""@""\x82""o""\x82""`""\x82""q""\x82""`""\x82""k""\x82""x""\x82""r""\x82""h""\x82""r",
"\x82""b""\x82""`""\x82""t""\x82""r""\x82""d""\x81""@""\x82""r""\x82""d""\x82""q""\x82""h""\x82""n""\x82""t""\x82""r",
"\x82""b""\x82""t""\x82""q""\x82""d""\x81""@""\x82""r""\x82""d""\x82""q""\x82""h""\x82""n""\x82""t""\x82""r",
"\x82""m""\x82""d""\x82""t""\x82""s""\x82""q""\x82""`""\x82""k""\x81""|""\x82""o""\x82""n""\x82""h""\x82""r""\x82""n""\x82""m",
"\x82""o""\x82""q""\x82""n""\x82""s""\x82""d""\x82""b""\x82""s""\x81""|""\x82""d""\x82""u""\x82""h""\x82""k""\x81""@""\x82""P""\x82""O""\x81""f",
"\x82""b""\x82""`""\x82""t""\x82""r""\x82""d""\x81""@""\x82""b""\x82""q""\x82""h""\x82""s""\x82""h""\x82""b""\x82""`""\x82""k",
"\x82""b""\x82""t""\x82""q""\x82""d""\x81""@""\x82""b""\x82""q""\x82""h""\x82""s""\x82""h""\x82""b""\x82""`""\x82""k",
"\x82""e""\x82""k""\x82""`""\x82""l""\x82""d""\x81""@""\x82""r""\x82""s""\x82""q""\x82""h""\x82""j""\x82""d",
"\x82""q""\x82""`""\x82""h""\x82""r""\x82""d""\x81""@""\x82""c""\x82""d""\x82""`""\x82""c",
"\x82""r""\x82""k""\x82""`""\x82""x""\x81""@""\x82""k""\x82""h""\x82""u""\x82""h""\x82""m""\x82""f",
"\x82""s""\x82""q""\x82""t""\x82""d""\x81""@""\x82""r""\x82""d""\x82""d""\x82""h""\x82""m""\x82""f",
"\x82""g""\x82""`""\x82""q""\x82""l",
"\x82""g""\x82""d""\x82""`""\x82""k",
"\x82""q""\x82""d""\x82""r""\x82""r""\x82""t""\x82""q""\x82""d""\x82""b""\x82""s""\x82""h""\x82""n""\x82""m",
"\x82""k""\x82""`""\x82""x""\x81""@""\x82""n""\x82""m""\x81""@""\x82""g""\x82""`""\x82""m""\x82""c""\x82""r",
"\x82""s""\x82""t""\x82""q""\x82""m""\x81""@""\x82""t""\x82""m""\x82""c""\x82""d""\x82""`""\x82""c"
};
static const StringListProvider kEoB2ClericSpellsListFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2ClericSpellsListFMTownsJapanese), kEoB2ClericSpellsListFMTownsJapanese };
static const char *const kEoB2SpellNamesFMTownsJapanese[68] = {
"\x82""`""\x82\x92\x82\x8D\x82\x8F\x82\x92",
"\x82""a""\x82\x95\x82\x92\x82\x8E\x82\x89\x82\x8E\x82\x87\x81""@""\x82""g""\x82\x81\x82\x8E\x82\x84\x82\x93",
"\x82""c""\x82\x85\x82\x94\x82\x85\x82\x83\x82\x94\x81""@""\x82""l""\x82\x81\x82\x87\x82\x89\x82\x83",
"\x82""l""\x82\x81\x82\x87\x82\x89\x82\x83\x81""@""\x82""l""\x82\x89\x82\x93\x82\x93\x82\x89\x82\x8C\x82\x85",
"\x82""r""\x82\x88\x82\x89\x82\x85\x82\x8C\x82\x84",
"\x82""r""\x82\x88\x82\x8F\x82\x83\x82\x8B\x82\x89\x82\x8E\x82\x87\x81""@""\x82""f""\x82\x92\x82\x81\x82\x93\x82\x90",
"\x82""a""\x82\x8C\x82\x95\x82\x92",
"\x82""c""\x82\x85\x82\x94\x82\x85\x82\x83\x82\x94\x81""@""\x82""h""\x82\x8E\x82\x96\x82\x89\x82\x93\x82\x89\x82\x82\x82\x89\x82\x8C\x82\x89\x82\x94\x82\x99",
"\x82""h""\x82\x8D\x82\x90\x82\x92\x82\x8F\x82\x96\x82\x85\x82\x84\x81""@""\x82""h""\x82\x84\x82\x85\x82\x8E\x82\x94\x82\x89\x82\x86\x82\x99",
"\x82""h""\x82\x8E\x82\x96\x82\x89\x82\x93\x82\x89\x82\x82\x82\x89\x82\x8C\x82\x89\x82\x94\x82\x99",
"\x82""l""\x82\x85\x82\x8C\x82\x86\x81""f""\x82\x93\x81""@""\x82""`""\x82\x83\x82\x89\x82\x84\x81""@""\x82""`""\x82\x92\x82\x92\x82\x8F\x82\x97",
"\x82""c""\x82\x89\x82\x93\x82\x90\x82\x85\x82\x8C\x81""@""\x82""l""\x82\x81\x82\x87\x82\x89\x82\x83",
"\x82""e""\x82\x89\x82\x92\x82\x85\x82\x82\x82\x81\x82\x8C\x82\x8C",
"\x82""g""\x82\x81\x82\x93\x82\x94\x82\x85",
"\x82""g""\x82\x8F\x82\x8C\x82\x84\x81""@""\x82""o""\x82\x85\x82\x92\x82\x93\x82\x8F\x82\x8E",
"\x82""h""\x82\x8E\x82\x96\x82\x89\x82\x93\x82\x89\x82\x82\x82\x89\x82\x8C\x82\x89\x82\x94\x82\x99\x81""@""\x82""P""\x82""O""\x81""f""\x82\x93\x81""@""\x82\x92\x82\x81\x82\x84\x82\x89\x82\x95\x82\x93",
"\x82""k""\x82\x89\x82\x87\x82\x88\x82\x94\x82\x8E\x82\x89\x82\x8E\x82\x87\x81""@""\x82""a""\x82\x8F\x82\x8C\x82\x94",
"\x82""u""\x82\x81\x82\x8D\x82\x90\x82\x89\x82\x92\x82\x89\x82\x83\x81""@""\x82""s""\x82\x8F\x82\x95\x82\x83\x82\x88",
"\x82""e""\x82\x85\x82\x81\x82\x92",
"\x82""h""\x82\x83\x82\x85\x81""@""\x82""r""\x82\x94\x82\x8F\x82\x92\x82\x8D",
"\x82""h""\x82\x8D\x82\x90\x82\x92\x82\x8F\x82\x96\x82\x85\x82\x84\x81""@""\x82""h""\x82\x8E\x82\x96\x82\x89\x82\x93\x82\x89\x82\x82\x82\x89\x82\x8C\x82\x89\x82\x94\x82\x99",
"\x82""q""\x82\x85\x82\x8D\x82\x8F\x82\x96\x82\x85\x81""@""\x82""b""\x82\x95\x82\x92\x82\x93\x82\x85",
"\x82""b""\x82\x8F\x82\x8E\x82\x85\x81""@""\x82\x8F\x82\x86\x81""@""\x82""b""\x82\x8F\x82\x8C\x82\x84",
"\x82""g""\x82\x8F\x82\x8C\x82\x84\x81""@""\x82""l""\x82\x8F\x82\x8E\x82\x93\x82\x94\x82\x85\x82\x92",
"\x82""v""\x82\x81\x82\x8C\x82\x8C\x81""@""\x82\x8F\x82\x86\x81""@""\x82""e""\x82\x8F\x82\x92\x82\x83\x82\x85",
"\x82""c""\x82\x89\x82\x93\x82\x89\x82\x8E\x82\x94\x82\x85\x82\x87\x82\x92\x82\x81\x82\x94\x82\x85",
"\x82""e""\x82\x8C\x82\x85\x82\x93\x82\x88\x81""@""\x82\x94\x82\x8F\x81""@""\x82""r""\x82\x94\x82\x8F\x82\x8E\x82\x85",
"\x82""r""\x82\x94\x82\x8F\x82\x8E\x82\x85\x81""@""\x82\x94\x82\x8F\x81""@""\x82""e""\x82\x8C\x82\x85\x82\x93\x82\x88",
"\x82""s""\x82\x92\x82\x95\x82\x85\x81""@""\x82""r""\x82\x85\x82\x85\x82\x89\x82\x8E\x82\x87",
"\x82""e""\x82\x89\x82\x8E\x82\x87\x82\x85\x82\x92\x81""@""\x82\x8F\x82\x86\x81""@""\x82\x84\x82\x85\x82\x81\x82\x94\x82\x88",
"\x82""o""\x82\x8F\x82\x97\x82\x85\x82\x92\x81""@""\x82""v""\x82\x8F\x82\x92\x82\x84\x81""@""\x82""r""\x82\x94\x82\x95\x82\x8E",
"\x82""a""\x82\x89\x82\x87\x82\x82\x82\x99\x81""f""\x82\x93\x81""@""\x82""b""\x82\x8C\x82\x85\x82\x8E\x82\x83\x82\x88\x82\x85\x82\x84\x81""@""\x82""e""\x82\x89\x82\x93\x82\x94",
"\x82""a""\x82\x8C\x82\x85\x82\x93\x82\x93",
"\x82""b""\x82\x81\x82\x95\x82\x93\x82\x85\x81""@""\x82""k""\x82\x89\x82\x87\x82\x88\x82\x94\x81""@""\x82""v""\x82\x8F\x82\x95\x82\x8E\x82\x84\x82\x93",
"\x82""b""\x82\x95\x82\x92\x82\x85\x81""@""\x82""k""\x82\x89\x82\x87\x82\x88\x82\x94\x81""@""\x82""v""\x82\x8F\x82\x95\x82\x8E\x82\x84\x82\x93",
"\x82""c""\x82\x85\x82\x94\x82\x85\x82\x83\x82\x94\x81""@""\x82""l""\x82\x81\x82\x87\x82\x89\x82\x83",
"\x82""o""\x82\x92\x82\x8F\x82\x94\x82\x85\x82\x83\x82\x94\x82\x89\x82\x8F\x82\x8E\x81""@""\x82\x86\x82\x92\x82\x8F\x82\x8D\x81""@""\x82""d""\x82\x96\x82\x89\x82\x8C",
"\x82""`""\x82\x89\x82\x84",
"\x82""e""\x82\x8C\x82\x81\x82\x8D\x82\x85\x81""@""\x82""a""\x82\x8C\x82\x81\x82\x84\x82\x85",
"\x82""g""\x82\x8F\x82\x8C\x82\x84\x81""@""\x82""o""\x82\x85\x82\x92\x82\x93\x82\x8F\x82\x8E",
"\x82""r""\x82\x8C\x82\x8F\x82\x97\x81""@""\x82""o""\x82\x8F\x82\x89\x82\x93\x82\x8F\x82\x8E",
"\x82""b""\x82\x92\x82\x85\x82\x81\x82\x94\x82\x85\x81""@""\x82""e""\x82\x8F\x82\x8F\x82\x84",
"\x82""c""\x82\x89\x82\x93\x82\x90\x82\x85\x82\x8C\x81""@""\x82""l""\x82\x81\x82\x87\x82\x89\x82\x83",
"\x82""l""\x82\x81\x82\x87\x82\x89\x82\x83\x82\x81\x82\x8C\x81""@""\x82""u""\x82\x85\x82\x93\x82\x94\x82\x8D\x82\x85\x82\x8E\x82\x94",
"\x82""o""\x82\x92\x82\x81\x82\x99\x82\x85\x82\x92",
"\x82""q""\x82\x85\x82\x8D\x82\x8F\x82\x96\x82\x85\x81""@""\x82""o""\x82\x81\x82\x92\x82\x81\x82\x8C\x82\x99\x82\x93\x82\x89\x82\x93",
"\x82""b""\x82\x81\x82\x95\x82\x93\x82\x85\x81""@""\x82""r""\x82\x85\x82\x92\x82\x89\x82\x8F\x82\x95\x82\x93\x81""@""\x82""v""\x82\x8F\x82\x95\x82\x8E\x82\x84\x82\x93",
"\x82""b""\x82\x95\x82\x92\x82\x85\x81""@""\x82""r""\x82\x85\x82\x92\x82\x89\x82\x8F\x82\x95\x82\x93\x81""@""\x82""v""\x82\x8F\x82\x95\x82\x8E\x82\x84\x82\x93",
"\x82""m""\x82\x85\x82\x95\x82\x94\x82\x92\x82\x81\x82\x8C\x82\x89\x82\x9A\x82\x85\x81""@""\x82""o""\x82\x8F\x82\x89\x82\x93\x82\x8F\x82\x8E",
"\x82""o""\x82\x92\x82\x8F\x82\x94\x82\x85\x82\x83\x82\x94\x82\x89\x82\x8F\x82\x8E\x81""@""\x82\x86\x82\x92\x82\x8F\x82\x8D\x81""@""\x82\x85\x82\x96\x82\x89\x82\x8C\x81""@""\x82""P""\x82""O""\x81""f""\x82\x93\x81""@""\x82\x92\x82\x81\x82\x84\x82\x89\x82\x95\x82\x93",
"\x82""b""\x82\x81\x82\x95\x82\x93\x82\x85\x81""@""\x82""b""\x82\x92\x82\x89\x82\x94\x82\x89\x82\x83\x82\x81\x82\x8C\x81""@""\x82""v""\x82\x8F\x82\x95\x82\x8E\x82\x84\x82\x93",
"\x82""b""\x82\x95\x82\x92\x82\x85\x81""@""\x82""b""\x82\x92\x82\x89\x82\x94\x82\x89\x82\x83\x82\x81\x82\x8C\x81""@""\x82""v""\x82\x8F\x82\x95\x82\x8E\x82\x84\x82\x93",
"\x82""e""\x82\x8C\x82\x81\x82\x8D\x82\x85\x81""@""\x82""r""\x82\x94\x82\x92\x82\x89\x82\x8B\x82\x85",
"\x82""q""\x82\x81\x82\x89\x82\x93\x82\x85\x81""@""\x82""c""\x82\x85\x82\x81\x82\x84",
"\x82""r""\x82\x8C\x82\x81\x82\x99\x81""@""\x82""k""\x82\x89\x82\x96\x82\x89\x82\x8E\x82\x87",
"\x82""s""\x82\x92\x82\x95\x82\x85\x81""@""\x82""r""\x82\x85\x82\x85\x82\x89\x82\x8E\x82\x87",
"\x82""g""\x82\x81\x82\x92\x82\x8D",
"\x82""g""\x82\x85\x82\x81\x82\x8C",
"\x82""q""\x82\x85\x82\x93\x82\x93\x82\x95\x82\x92\x82\x85\x82\x83\x82\x94\x82\x89\x82\x8F\x82\x8E",
"\x82""k""\x82\x81\x82\x99\x81""@""\x82\x8F\x82\x8E\x81""@""\x82""g""\x82\x81\x82\x8E\x82\x84\x82\x93",
"\x82""s""\x82\x95\x82\x92\x82\x8E\x81""@""\x82""t""\x82\x8E\x82\x84\x82\x85\x82\x81\x82\x84",
"",
"\x82""l""\x82\x99\x82\x93\x82\x94\x82\x89\x82\x83\x81""@""\x82""c""\x82\x85\x82\x86\x82\x85\x82\x8E\x82\x83\x82\x85",
"",
"",
"",
"",
""
};
static const StringListProvider kEoB2SpellNamesFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2SpellNamesFMTownsJapanese), kEoB2SpellNamesFMTownsJapanese };
static const char *const kEoB2MagicStrings1FMTownsJapanese[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",
"\rok\r"
};
static const StringListProvider kEoB2MagicStrings1FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings1FMTownsJapanese), kEoB2MagicStrings1FMTownsJapanese };
static const char *const kEoB2MagicStrings2FMTownsJapanese[5] = {
"\x8E\xF4\x95\xB6\x82\xCD\x8E\xB8\x94""s""\x82\xB5\x82\xBD\x81""I\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\x83""f""\x83""X""\x82\xCC\x8E\xF4\x95\xB6\x82\xF0\x8E\xF3\x82\xAF\x82\xBD\x81""I\r",
"\x06\x06""%s""\x82\xCD\x83""R""\x81""[""\x83""Y""\x81""E""\x83""V""\x83\x8A\x83""A""\x83""X""\x81""E""\x83""E""\x81""[""\x83\x93\x83""Y""\x82\xCC\x8E\xF4\x95\xB6\x82\xF0\x8E\xF3\x82\xAF\x82\xBD\x81""I\r",
"\x90\xCE\x89\xBB"
};
static const StringListProvider kEoB2MagicStrings2FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings2FMTownsJapanese), kEoB2MagicStrings2FMTownsJapanese };
static const char *const kEoB2MagicStrings3FMTownsJapanese[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 kEoB2MagicStrings3FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings3FMTownsJapanese), kEoB2MagicStrings3FMTownsJapanese };
static const char *const kEoB2MagicStrings4FMTownsJapanese[1] = {
"\x8C\xF8\x89\xCA\x82\xAA\x82\xC8\x82\xA9\x82\xC1\x82\xBD\x81""B\r"
};
static const StringListProvider kEoB2MagicStrings4FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings4FMTownsJapanese), kEoB2MagicStrings4FMTownsJapanese };
static const char *const kEoB2MagicStrings6FMTownsJapanese[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 kEoB2MagicStrings6FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings6FMTownsJapanese), kEoB2MagicStrings6FMTownsJapanese };
static const char *const kEoB2MagicStrings7FMTownsJapanese[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 kEoB2MagicStrings7FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings7FMTownsJapanese), kEoB2MagicStrings7FMTownsJapanese };
static const char *const kEoB2MagicStrings8FMTownsJapanese[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""I\r",
"\x8E\xF4\x95\xB6\x82\xCD\x8E\xB8\x94""s""\x82\xB5\x82\xBD""\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\x83""G""\x83""C""\x83""h""\x82\xCC\x8E\xF4\x95\xB6\x82\xCC\x8C\xF8\x89\xCA\x82\xAA\x82\xA0\x82\xE9\x81""B\r"
};
static const StringListProvider kEoB2MagicStrings8FMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MagicStrings8FMTownsJapanese), kEoB2MagicStrings8FMTownsJapanese };
static const char *const kEoB2MainMenuStringsFMTownsJapanese[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",
"\x83\x86\x81""[""\x83""e""\x83""B""\x83\x8A\x83""e""\x83""B""\x81""[\r",
"\x83""C""\x83\x93\x83""g""\x83\x8D\x83""_""\x83""N""\x83""V""\x83\x87\x83\x93""\r",
"\x83""Q""\x81""[""\x83\x80\x82\xF0\x8F""I""\x97\xB9\x82\xB7\x82\xE9""\r"
};
static const StringListProvider kEoB2MainMenuStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MainMenuStringsFMTownsJapanese), kEoB2MainMenuStringsFMTownsJapanese };
static const char *const kEoB2MainMenuUtilStringsFMTownsJapanese[2] = {
"\x89\xE6\x96\xCA\x83\x82\x81""[""\x83""h""\x82\xCC\x95\xCF\x8D""X\r",
"\x83\x81\x83""C""\x83\x93\x83\x81\x83""j""\x83\x85\x81""[""\x82\xC9\x96\xDF\x82\xE9""\r"
};
static const StringListProvider kEoB2MainMenuUtilStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MainMenuUtilStringsFMTownsJapanese), kEoB2MainMenuUtilStringsFMTownsJapanese };
static const char *const kEoB2IntroStringsFMTownsJapanese[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""\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""\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""\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""\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""\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""\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""\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 kEoB2IntroStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2IntroStringsFMTownsJapanese), kEoB2IntroStringsFMTownsJapanese };
static const char *const kEoB2FinaleStringsFMTownsJapanese[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""\r""\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""\r""\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""\r""\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\r""\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""\r""\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""\r""\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 kEoB2FinaleStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2FinaleStringsFMTownsJapanese), kEoB2FinaleStringsFMTownsJapanese };
static const char *const kEoB2MonsterDistAttStringsFMTownsJapanese[5] = {
"\x83""p""\x81""[""\x83""e""\x83""B""\x82\xCD\x83""T""\x83""C""\x83""L""\x83""b""\x83""N""\x83""}""\x83""C""\x83\x93\x83""h""\x83""u""\x83\x89\x83""X""\x83""g""\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 kEoB2MonsterDistAttStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MonsterDistAttStringsFMTownsJapanese), kEoB2MonsterDistAttStringsFMTownsJapanese };
static const char *const kEoB2Npc1StringsFMTownsJapanese[2] = {
"\x98""b""\x82\xB7",
"\x8B\x8E\x82\xE9"
};
static const StringListProvider kEoB2Npc1StringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2Npc1StringsFMTownsJapanese), kEoB2Npc1StringsFMTownsJapanese };
static const char *const kEoB2Npc2StringsFMTownsJapanese[2] = {
"\x8D\xBD\x82\xF0\x8A""O""\x82\xB7",
"\x8B\x8E\x82\xE9"
};
static const StringListProvider kEoB2Npc2StringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2Npc2StringsFMTownsJapanese), kEoB2Npc2StringsFMTownsJapanese };
static const char *const kEoB2MonsterDustStringsFMTownsJapanese[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 kEoB2MonsterDustStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2MonsterDustStringsFMTownsJapanese), kEoB2MonsterDustStringsFMTownsJapanese };
static const char *const kEoB2KheldranStringsFMTownsJapanese[1] = {
" ""\x82\xB1\x82\xCC\x8F\xAC\x91""m""\x82\xDF\x82\xAA\x81""I"
};
static const StringListProvider kEoB2KheldranStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2KheldranStringsFMTownsJapanese), kEoB2KheldranStringsFMTownsJapanese };
static const char *const kEoB2HornStringsFMTownsJapanese[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 kEoB2HornStringsFMTownsJapaneseProvider = { ARRAYSIZE(kEoB2HornStringsFMTownsJapanese), kEoB2HornStringsFMTownsJapanese };
static const char *const kEoB2UtilMenuStringsFMTowns[2] = {
"\x89\xE6\x96\xCA\x83\x82\x81\x5B\x83\x68\x82\xCC\x95\xCF\x8D\x58\r",
"\x83\x81\x83\x43\x83\x93\x83\x81\x83\x6A\x83\x85\x81\x5B\x82\xC9\x96\xDF\x82\xE9\r"
};
static const StringListProvider kEoB2UtilMenuStringsFMTownsProvider = { ARRAYSIZE(kEoB2UtilMenuStringsFMTowns), kEoB2UtilMenuStringsFMTowns };
static const char *const kEoB2Config2431StringsFMTowns[2] = {
"\x82\x51\x82\x53\x82\x6A\x82\x67\x82\x9A",
"\x82\x52\x82\x50\x82\x6A\x82\x67\x82\x9A"
};
static const StringListProvider kEoB2Config2431StringsFMTownsProvider = { ARRAYSIZE(kEoB2Config2431StringsFMTowns), kEoB2Config2431StringsFMTowns };
static const char *const kEoB2KatakanaLinesFMTowns[12] = {
"\x83""A""\x83""C""\x83""E""\x83""G""\x83""I""\x81""@""\x83""J""\x83""L""\x83""N""\x83""P""\x83""R""\x81""@""\x83""T""\x83""V""\x83""X""\x83""Z""\x83""\\",
"\x83""^""\x83""`""\x83""c""\x83""e""\x83""g""\x81""@""\x83""i""\x83""j""\x83""k""\x83""l""\x83""m""\x81""@""\x83""n""\x83""q""\x83""t""\x83""w""\x83""z",
"\x83""}""\x83""~""\x83\x80\x83\x81\x83\x82\x81""@""\x83\x84\x81""@""\x83\x86\x81""@""\x83\x88\x81""@""\x83\x89\x83\x8a\x83\x8b\x83\x8c\x83\x8d",
"\x83\x8f\x83\x92\x83\x93\x81""@""\x81""[""\x81""@""\x81""Q""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@",
"\x83""K""\x83""M""\x83""O""\x83""Q""\x83""S""\x81""@""\x83""U""\x83""W""\x83""Y""\x83""[""\x83""]""\x81""@""\x83""_""\x83""a""\x83""Y""\x83""f""\x83""h",
"\x83""o""\x83""r""\x83""u""\x83""x""\x83""{""\x81""@""\x83""p""\x83""s""\x83""v""\x83""y""\x83""|""\x81""@""\x83""@""\x83""B""\x83""D""\x83""F""\x83""H",
"\x83\x83\x83\x85\x83\x87\x81""@""\x83""b""\x81""@""\x81""Q""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@",
"\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@",
"\x82""`""\x82""a""\x82""b""\x82""c""\x82""d""\x81""@""\x82""e""\x82""f""\x82""g""\x82""h""\x82""i""\x81""@""\x82""j""\x82""k""\x82""l""\x82""m""\x82""n",
"\x82""o""\x82""p""\x82""q""\x82""r""\x82""s""\x81""@""\x82""t""\x82""u""\x82""v""\x82""w""\x82""x""\x81""@""\x82""y""\x81""@""\x81""D""\x81""C""\x81""Q",
"\x82""O""\x82""P""\x82""Q""\x82""R""\x82""S""\x82""T""\x82""U""\x82""V""\x82""W""\x82""X""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@",
"\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@""\x81""@"
};
static const StringListProvider kEoB2KatakanaLinesFMTownsProvider = { ARRAYSIZE(kEoB2KatakanaLinesFMTowns), kEoB2KatakanaLinesFMTowns };
static const char *const kEoB2KanaSelectStringsFMTowns[3] = {
"NEXT",
"END",
"DEL"
};
static const StringListProvider kEoB2KanaSelectStringsFMTownsProvider = { ARRAYSIZE(kEoB2KanaSelectStringsFMTowns), kEoB2KanaSelectStringsFMTowns };

View File

@ -812,13 +812,13 @@ static const byte kLoLDscTileIndexDOS[18] = {
static const ByteProvider kLoLDscTileIndexDOSProvider = { ARRAYSIZE(kLoLDscTileIndexDOS), kLoLDscTileIndexDOS };
static const byte kLoLDscUnk2DOS[23] = {
static const byte kLoLDscDoorScaleOffsDOS[23] = {
0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
};
static const ByteProvider kLoLDscUnk2DOSProvider = { ARRAYSIZE(kLoLDscUnk2DOS), kLoLDscUnk2DOS };
static const ByteProvider kLoLDscDoorScaleOffsDOSProvider = { ARRAYSIZE(kLoLDscDoorScaleOffsDOS), kLoLDscDoorScaleOffsDOS };
static const byte kLoLDscDoorShapeIndexDOS[23] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

View File

@ -877,13 +877,13 @@ static const byte kLoLDscTileIndexDOSCD[18] = {
static const ByteProvider kLoLDscTileIndexDOSCDProvider = { ARRAYSIZE(kLoLDscTileIndexDOSCD), kLoLDscTileIndexDOSCD };
static const byte kLoLDscUnk2DOSCD[23] = {
static const byte kLoLDscDoorScaleOffsDOSCD[23] = {
0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
};
static const ByteProvider kLoLDscUnk2DOSCDProvider = { ARRAYSIZE(kLoLDscUnk2DOSCD), kLoLDscUnk2DOSCD };
static const ByteProvider kLoLDscDoorScaleOffsDOSCDProvider = { ARRAYSIZE(kLoLDscDoorScaleOffsDOSCD), kLoLDscDoorScaleOffsDOSCD };
static const byte kLoLDscDoorShapeIndexDOSCD[23] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

View File

@ -666,13 +666,13 @@ static const byte kLoLDscTileIndexFMTowns[18] = {
static const ByteProvider kLoLDscTileIndexFMTownsProvider = { ARRAYSIZE(kLoLDscTileIndexFMTowns), kLoLDscTileIndexFMTowns };
static const byte kLoLDscUnk2FMTowns[23] = {
static const byte kLoLDscDoorScaleOffsFMTowns[23] = {
0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
};
static const ByteProvider kLoLDscUnk2FMTownsProvider = { ARRAYSIZE(kLoLDscUnk2FMTowns), kLoLDscUnk2FMTowns };
static const ByteProvider kLoLDscDoorScaleOffsFMTownsProvider = { ARRAYSIZE(kLoLDscDoorScaleOffsFMTowns), kLoLDscDoorScaleOffsFMTowns };
static const byte kLoLDscDoorShapeIndexFMTowns[23] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

View File

@ -665,13 +665,13 @@ static const byte kLoLDscTileIndexPC98[18] = {
static const ByteProvider kLoLDscTileIndexPC98Provider = { ARRAYSIZE(kLoLDscTileIndexPC98), kLoLDscTileIndexPC98 };
static const byte kLoLDscUnk2PC98[23] = {
static const byte kLoLDscDoorScaleOffsPC98[23] = {
0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12
};
static const ByteProvider kLoLDscUnk2PC98Provider = { ARRAYSIZE(kLoLDscUnk2PC98), kLoLDscUnk2PC98 };
static const ByteProvider kLoLDscDoorScaleOffsPC98Provider = { ARRAYSIZE(kLoLDscDoorScaleOffsPC98), kLoLDscDoorScaleOffsPC98 };
static const byte kLoLDscDoorShapeIndexPC98[23] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

Binary file not shown.

View File

@ -66,7 +66,7 @@ private:
int getNextFreeFaceShape(int shpIndex, int charSex, int step, int8 *selectedPortraits);
void processFaceMenuSelection(int index);
void printStats(int index, int mode);
void processNameInput(int index, int len, int textColor);
void processNameInput(int index, int textColor);
int rollDice();
int modifyStat(int index, int8 *stat1, int8 *stat2);
int getMaxHp(int cclass, int constitution, int level1, int level2, int level3);
@ -99,7 +99,10 @@ private:
const uint8 *_chargenRaceMinStats;
const uint16 *_chargenRaceMaxStats;
static const EoBChargenButtonDef _chargenButtonDefs[];
const EoBChargenButtonDef *_chargenButtonDefs;
static const EoBChargenButtonDef _chargenButtonDefsDOS[];
static const uint16 _chargenButtonKeyCodesFMTOWNS[];
static const CreatePartyModButton _chargenModButtons[];
static const EoBRect8 _chargenButtonBodyCoords[];
static const int16 _chargenBoxX[];
@ -141,6 +144,19 @@ CharacterGenerator::CharacterGenerator(EoBCoreEngine *vm, Screen_EoB *screen) :
_chargenClassMinStats = _vm->staticres()->loadRawData(kEoBBaseChargenClassMinStats, temp);
_chargenRaceMinStats = _vm->staticres()->loadRawData(kEoBBaseChargenRaceMinStats, temp);
_chargenRaceMaxStats = _vm->staticres()->loadRawDataBe16(kEoBBaseChargenRaceMaxStats, temp);
EoBChargenButtonDef *chargenButtonDefs = new EoBChargenButtonDef[41];
memcpy(chargenButtonDefs, _chargenButtonDefsDOS, 41 * sizeof(EoBChargenButtonDef));
if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
const uint16 *c = _chargenButtonKeyCodesFMTOWNS;
for (int i = 0; i < 41; ++i) {
if (chargenButtonDefs[i].keyCode)
chargenButtonDefs[i].keyCode = *c++;
}
}
_chargenButtonDefs = chargenButtonDefs;
}
CharacterGenerator::~CharacterGenerator() {
@ -152,6 +168,10 @@ CharacterGenerator::~CharacterGenerator() {
for (int i = 0; i < 17; i++)
delete[] _chargenButtonLabels[i];
delete[] _chargenButtonDefs;
_screen->clearPage(2);
}
bool CharacterGenerator::start(EoBCharacter *characters, uint8 ***faceShapes) {
@ -241,6 +261,10 @@ bool CharacterGenerator::start(EoBCharacter *characters, uint8 ***faceShapes) {
}
void CharacterGenerator::init() {
/*_screen->loadEoBBitmap("MENU", 0, 3, 3, 2);
Common::SeekableReadStream *s = _res->createReadStream("facedat.dmp");
_screen->loadFileDataToPage(s, 2, 64000);*/
_screen->loadShapeSetBitmap("CHARGENA", 3, 3);
if (_faceShapes) {
for (int i = 0; i < 44; i++)
@ -272,6 +296,8 @@ void CharacterGenerator::init() {
_screen->convertPage(3, 2, _vm->_cgaMappingDefault);
_screen->_curPage = 0;
_screen->convertToHiColor(2);
_screen->shadeRect(142, 63, 306, 193, 4);
_screen->copyRegion(144, 64, 0, 0, 180, 128, 0, 2, Screen::CR_NO_P_CHECK);
_screen->updateScreen();
}
@ -323,7 +349,8 @@ void CharacterGenerator::initButton(int index, int x, int y, int w, int h, int k
void CharacterGenerator::checkForCompleteParty() {
_screen->copyRegion(0, 0, 160, 0, 160, 128, 2, 2, Screen::CR_NO_P_CHECK);
int cp = _screen->setCurPage(2);
_screen->printShadedText(_chargenStrings1[8], 168, 16, 15, 0);
int x = (_vm->gameFlags().platform == Common::kPlatformFMTowns) ? 184 : 168;
_screen->printShadedText(_chargenStrings1[8], x, 16, 15, 0);
_screen->setCurPage(cp);
_screen->copyRegion(160, 0, 144, 64, 160, 128, 2, 0, Screen::CR_NO_P_CHECK);
@ -335,7 +362,7 @@ void CharacterGenerator::checkForCompleteParty() {
if (numChars == 4) {
_screen->setCurPage(2);
_screen->printShadedText(_chargenStrings1[0], 168, 61, 15, 0);
_screen->printShadedText(_chargenStrings1[0], x, 61, 15, 0);
_screen->setCurPage(0);
_screen->copyRegion(168, 61, 152, 125, 136, 40, 2, 0, Screen::CR_NO_P_CHECK);
toggleSpecialButton(15, 0, 0);
@ -416,7 +443,7 @@ int CharacterGenerator::viewDeleteCharacter() {
if (_characters[_activeBox].name[0]) {
processSpecialButton(16);
_characters[_activeBox].name[0] = 0;
processNameInput(_activeBox, 1, 12);
processNameInput(_activeBox, 12);
processFaceMenuSelection(_activeBox + 50);
}
} else {
@ -478,8 +505,10 @@ void CharacterGenerator::createPartyMember() {
processFaceMenuSelection(_chargenMinStats[6]);
printStats(_activeBox, 0);
_screen->printShadedText(_chargenStrings2[11], 149, 100, 9, 0);
if (!_vm->shouldQuit())
processNameInput(_activeBox, _vm->_gui->getTextInput(_characters[_activeBox].name, 24, 100, 10, 15, 0, 8), 2);
if (!_vm->shouldQuit()) {
_vm->_gui->getTextInput(_characters[_activeBox].name, 24, 100, 10, 15, 0, 8);
processNameInput(_activeBox, 2);
}
}
}
}
@ -887,7 +916,7 @@ void CharacterGenerator::printStats(int index, int mode) {
if (mode != 4)
_screen->drawShape(2, c->faceShape, 224, 2, 0);
_screen->printShadedText(c->name, 160 + ((20 - strlen(c->name)) << 2), 35, 15, 0);
_screen->printShadedText(c->name, 160 + ((160 - _screen->getTextWidth(c->name)) / 2), 35, 15, 0);
_screen->printShadedText(_chargenRaceSexStrings[c->raceSex], 160 + ((20 - strlen(_chargenRaceSexStrings[c->raceSex])) << 2), 45, 15, 0);
_screen->printShadedText(_chargenClassStrings[c->cClass], 160 + ((20 - strlen(_chargenClassStrings[c->cClass])) << 2), 54, 15, 0);
@ -937,14 +966,10 @@ void CharacterGenerator::printStats(int index, int mode) {
_screen->_curPage = 0;
}
void CharacterGenerator::processNameInput(int index, int len, int textColor) {
void CharacterGenerator::processNameInput(int index, int textColor) {
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
// WORKAROUND for bug in original code:
len = strlen(_characters[index].name);
int xOffs = (60 - _screen->getFontWidth() * len) >> 1;
_screen->printText(_chargenStrings1[1], _chargenNameFieldX[index], _chargenNameFieldY[index], 12, 12);
_screen->fillRect(_chargenNameFieldX[index], _chargenNameFieldY[index], _chargenNameFieldX[index] + 59, _chargenNameFieldY[index] + 5, 12);
int xOffs = (60 - _screen->getTextWidth(_characters[index].name)) >> 1;
_screen->printText(_characters[index].name, _chargenNameFieldX[index] + xOffs, _chargenNameFieldY[index], textColor, 0);
_screen->updateScreen();
_screen->setFont(of);
@ -1140,7 +1165,7 @@ int CharacterGenerator::getMinHp(int cclass, int constitution, int level1, int l
void CharacterGenerator::finish() {
_screen->copyRegion(0, 0, 160, 0, 160, 128, 2, 2, Screen::CR_NO_P_CHECK);
int cp = _screen->setCurPage(2);
_screen->printShadedText(_chargenEnterGameStrings[0], 168, 32, 15, 0);
_screen->printShadedText(_chargenEnterGameStrings[0], (_vm->gameFlags().platform == Common::kPlatformFMTowns) ? 184 : 168, 32, 15, 0);
_screen->setCurPage(cp);
_screen->copyRegion(160, 0, 144, 64, 160, 128, 2, 0, Screen::CR_NO_P_CHECK);
_screen->updateScreen();
@ -1341,7 +1366,7 @@ void CharacterGenerator::finish() {
}
}
const EoBChargenButtonDef CharacterGenerator::_chargenButtonDefs[] = {
const EoBChargenButtonDef CharacterGenerator::_chargenButtonDefsDOS[] = {
{ 0x01, 0x37, 0x31, 0x32, 0x70 },
{ 0x09, 0x37, 0x31, 0x32, 0x71 },
{ 0x01, 0x77, 0x31, 0x32, 0x72 },
@ -1385,6 +1410,10 @@ const EoBChargenButtonDef CharacterGenerator::_chargenButtonDefs[] = {
{ 0x21, 0xAC, 0x25, 0x10, 0x19 }
};
const uint16 CharacterGenerator::_chargenButtonKeyCodesFMTOWNS[] = {
93, 94, 95, 96, 80, 79, 68, 66, 82, 77, 70, 75, 43, 45, 79
};
const CreatePartyModButton CharacterGenerator::_chargenModButtons[] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x40 },

View File

@ -29,23 +29,17 @@
namespace Kyra {
DarkMoonEngine::DarkMoonEngine(OSystem *system, const GameFlags &flags) : EoBCoreEngine(system, flags) {
_animIntro = _animFinale = 0;
_shapesIntro = _shapesFinale = 0;
_dscDoorType5Offs = 0;
_numSpells = 70;
_menuChoiceInit = 4;
_introStrings = _cpsFilesIntro = _cpsFilesFinale = _finaleStrings = _kheldranStrings = _npcStrings[0] = _npcStrings[1] = _hornStrings = 0;
_shapesIntro = _shapesFinale = 0;
_creditsData = _npcShpData = _dscDoorType5Offs = _hornSounds = 0;
_kheldranStrings = _npcStrings[0] = _npcStrings[1] = _hornStrings = 0;
_utilMenuStrings = _ascii2SjisTables = _ascii2SjisTables2 = 0;
_npcShpData = _dscDoorType5Offs = _hornSounds = 0;
_dreamSteps = 0;
}
DarkMoonEngine::~DarkMoonEngine() {
delete[] _animIntro;
delete[] _animFinale;
delete[] _shapesIntro;
delete[] _shapesFinale;
}
Common::Error DarkMoonEngine::init() {
@ -63,9 +57,15 @@ Common::Error DarkMoonEngine::init() {
_screen->setScreenPalette(pal);
}
_screen->loadPalette("PALETTE.COL", _screen->getPalette(0));
_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
if (_flags.platform == Common::kPlatformFMTowns) {
_screen->modifyScreenDim(6, 10, 100, 21, 40);
_screen->modifyScreenDim(27, 0, 0, 21, 2);
}
return Common::kNoError;
}
@ -193,29 +193,32 @@ void DarkMoonEngine::generateMonsterPalettes(const char *file, int16 monsterInde
_screen->setCurPage(cp);
}
void DarkMoonEngine::loadMonsterDecoration(const char *file, int16 monsterIndex) {
Common::SeekableReadStream *s = _res->createReadStream(Common::String::format("%s.dcr", file));
if (!s)
return;
int len = s->readUint16LE();
void DarkMoonEngine::loadMonsterDecoration(Common::SeekableReadStream *stream, int16 monsterIndex) {
int len = stream->readUint16LE();
Common::List<SpriteDecoration*> activeDecorations;
for (int i = 0; i < len; i++) {
for (int ii = 0; ii < 6; ii++) {
uint8 dc[6];
s->read(dc, 6);
stream->read(dc, 6);
if (!dc[2] || !dc[3])
continue;
SpriteDecoration *m = &_monsterDecorations[i * 6 + ii + monsterIndex];
if (_flags.platform != Common::kPlatformFMTowns)
m->shp = _screen->encodeShape(dc[0], dc[1], dc[2], dc[3]);
m->x = (int8)dc[4];
m->y = (int8)dc[5];
activeDecorations.push_back(m);
}
}
delete s;
if (_flags.platform == Common::kPlatformFMTowns) {
while (!activeDecorations.empty()) {
activeDecorations.front()->shp = loadTownsShape(stream);
activeDecorations.pop_front();
}
}
}
void DarkMoonEngine::replaceMonster(int unit, uint16 block, int pos, int dir, int type, int shpIndex, int mode, int h2, int randItem, int fixedItem) {
@ -382,6 +385,10 @@ void DarkMoonEngine::restParty_npc() {
gui_drawAllCharPortraitsWithStats();
_screen->setClearScreenDim(10);
_screen->set16bitShadingLevel(4);
gui_drawBox(_screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->w << 3, _screen->_curDim->h, guiSettings()->colors.frame1, guiSettings()->colors.frame2, -1);
gui_drawBox((_screen->_curDim->sx << 3) + 1, _screen->_curDim->sy + 1, (_screen->_curDim->w << 3) - 2, _screen->_curDim->h - 2, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
_gui->messageDialogue2(11, 63, 6);
_gui->messageDialogue2(11, 64, 6);
}
@ -478,7 +485,7 @@ void DarkMoonEngine::characterLevelGain(int charIndex) {
}
const KyraRpgGUISettings *DarkMoonEngine::guiSettings() {
return &_guiSettings;
return (_flags.platform == Common::kPlatformFMTowns) ? &_guiSettingsFMTowns : &_guiSettingsDOS;
}
} // End of namespace Kyra

View File

@ -60,6 +60,7 @@ private:
// Main Menu
int mainMenu();
int mainMenuLoop();
void townsUtilitiesMenu();
int _menuChoiceInit;
@ -72,22 +73,6 @@ private:
void seq_playFinale();
void seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *data, int sd, int backupPage, int tempPage, int speed);
const char *const *_introStrings;
const char *const *_cpsFilesIntro;
const DarkMoonAnimCommand **_animIntro;
const DarkMoonShapeDef **_shapesIntro;
const char *const *_finaleStrings;
const uint8 *_creditsData;
const char *const *_cpsFilesFinale;
const DarkMoonAnimCommand **_animFinale;
const DarkMoonShapeDef **_shapesFinale;
static const char *const _palFilesIntroVGA[];
static const char *const _palFilesIntroEGA[];
static const char *const _palFilesFinaleVGA[];
static const char *const _palFilesFinaleEGA[];
// Ingame sequence
void seq_nightmare();
void seq_kheldran();
@ -108,7 +93,7 @@ private:
// Monsters
void generateMonsterPalettes(const char *file, int16 monsterIndex);
void loadMonsterDecoration(const char *file, int16 monsterIndex);
void loadMonsterDecoration(Common::SeekableReadStream *stream, int16 monsterIndex);
void replaceMonster(int unit, uint16 block, int d, int dir, int type, int shpIndex, int mode, int h2, int randItem, int fixedItem);
bool killMonsterExtra(EoBMonsterInPlay *m);
@ -140,7 +125,10 @@ private:
const char *const *_hornStrings;
const uint8 *_hornSounds;
static const KyraRpgGUISettings _guiSettings;
const char *const *_utilMenuStrings;
static const KyraRpgGUISettings _guiSettingsDOS;
static const KyraRpgGUISettings _guiSettingsFMTowns;
static const uint8 _egaDefaultPalette[];
};

View File

@ -206,6 +206,10 @@ bool KyraMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGame
flags.lang = Common::EN_ANY;
}
#ifndef USE_RGB_COLOR
flags.useHiColorMode = false;
#endif
switch (flags.gameID) {
case Kyra::GI_KYRA1:
*engine = new Kyra::KyraEngine_LoK(syst, flags);
@ -228,6 +232,8 @@ bool KyraMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGame
case Kyra::GI_EOB2:
if (Common::parseRenderMode(ConfMan.get("render_mode")) == Common::kRenderEGA)
flags.useHiRes = true;
if (platform == Common::kPlatformFMTowns && !flags.useHiColorMode)
error("EOB ÌI FM-TOWNS requires support of 16bit color modes which has not been activated in your ScummVM build (The 'USE_RGB_COLOR' define has not been set).");
*engine = new Kyra::DarkMoonEngine(syst, flags);
break;
#endif // ENABLE_EOB

View File

@ -22,7 +22,6 @@
namespace {
#define EOB2_SJIS_FLAGS FLAGS(false, false, false, false, true, false, false, false, Kyra::GI_EOB2)
#define FLAGS(x, y, z, a, b, c, d, e, f, id) { Common::UNK_LANG, Common::UNK_LANG, Common::UNK_LANG, Common::kPlatformUnknown, x, y, z, a, b, c, d, e, f, id }
#define FLAGS_FAN(fanLang, repLang, x, y, z, a, b, c, d, e, f, id) { Common::UNK_LANG, fanLang, repLang, Common::kPlatformUnknown, x, y, z, a, b, c, d, e, f, id }
@ -62,6 +61,7 @@ namespace {
#define EOB_FLAGS FLAGS(false, false, false, false, false, false, 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 GAMEOPTION_KYRA3_AUDIENCE GUIO_GAMEOPTIONS1
#define GAMEOPTION_KYRA3_SKIP GUIO_GAMEOPTIONS2
@ -1684,6 +1684,22 @@ const KYRAGameDescription adGameDescs[] = {
},
EOB2_FLAGS
},
{
{
"eob2",
0,
{
{ "AZURE.SDT", 0, "2915098f2d1bdcfa518f857a26bb3324", -1 },
{ 0, 0, 0, 0 }
},
Common::JA_JPN,
Common::kPlatformFMTowns,
ADGF_NO_FLAGS,
GUIO4(GUIO_NOSPEECH, GUIO_MIDITOWNS, GUIO_RENDERFMTOWNS, GAMEOPTION_EOB_HPGRAPHS)
},
EOB2_FMTOWNS_FLAGS
},
#endif // ENABLE_EOB
{ AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) }

View File

@ -24,7 +24,7 @@
#include "kyra/kyra_rpg.h"
#include "kyra/resource.h"
#include "engines/kyra/sound.h"
#include "engines/kyra/sound_intern.h"
#include "engines/kyra/sound_adlib.h"
#include "kyra/script_eob.h"
#include "kyra/timer.h"
@ -52,7 +52,7 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags)
_playFinale = false;
_runFlag = true;
_configMouse = true;
_configMouse = _config2431 = true;
_loading = false;
_enableHiResDithering = false;
@ -195,7 +195,7 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags)
_abortStrings = _saveLoadStrings = _mnWord = _mnPrompt = _bookNumbers = 0;
_mageSpellList = _clericSpellList = _spellNames = _magicStrings1 = 0;
_magicStrings2 = _magicStrings3 = _magicStrings4 = _magicStrings6 = 0;
_magicStrings7 = _magicStrings8 = 0;
_magicStrings7 = _magicStrings8 = _saveNamePatterns = 0;
_spellAnimBuffer = 0;
_sparkEffectDefSteps = _sparkEffectDefSubSteps = _sparkEffectDefShift = 0;
_sparkEffectDefAdd = _sparkEffectDefX = _sparkEffectDefY = _sparkEffectOfShift = 0;
@ -211,7 +211,7 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags)
_menuStringsScribe = _menuStringsDrop2 = _menuStringsHead = _menuStringsPoison = 0;
_menuStringsMgc = _menuStringsPrefs = _menuStringsRest2 = _menuStringsRest3 = 0;
_menuStringsRest4 = _menuStringsDefeat = _menuStringsTransfer = _menuStringsSpec = 0;
_menuStringsSpellNo = _menuYesNoStrings = 0;
_menuStringsSpellNo = _menuYesNoStrings = _2431Strings = _katakanaLines = _katakanaSelectStrings = 0;
_errorSlotEmptyString = _errorSlotNoNameString = _menuOkString = 0;
_spellLevelsMage = _spellLevelsCleric = _numSpellsCleric = _numSpellsWisAdj = _numSpellsPal = _numSpellsMage = 0;
_mnNumWord = _numSpells = _mageSpellListSize = _spellLevelsMageSize = _spellLevelsClericSize = 0;
@ -308,6 +308,7 @@ EoBCoreEngine::~EoBCoreEngine() {
delete[] _spells;
delete[] _spellAnimBuffer;
delete[] _wallsOfForce;
delete[] _buttonDefs;
delete _gui;
_gui = 0;
@ -385,14 +386,6 @@ Common::Error EoBCoreEngine::init() {
assert(_screen);
_screen->setResolution();
//MidiDriverType midiDriver = MidiDriver::detectDevice(MDT_PCSPK | MDT_ADLIB);
_sound = new SoundAdLibPC(this, _mixer);
assert(_sound);
_sound->init();
// Setup volume settings (and read in all ConfigManager settings)
syncSoundSettings();
_res = new Resource(this);
assert(_res);
_res->reset();
@ -402,6 +395,22 @@ Common::Error EoBCoreEngine::init() {
if (!_staticres->init())
error("_staticres->init() failed");
// SoundTowns_Darkmoon requires initialized _staticres
if (_flags.platform == Common::kPlatformDOS) {
//MidiDriverType midiDriver = MidiDriver::detectDevice(MDT_PCSPK | MDT_ADLIB);
_sound = new SoundAdLibPC(this, _mixer);
} else if (_flags.platform == Common::kPlatformFMTowns) {
_sound = new SoundTowns_Darkmoon(this, _mixer);
} else if (_flags.platform == Common::kPlatformPC98) {
}
assert(_sound);
_sound->init();
// Setup volume settings (and read in all ConfigManager settings)
syncSoundSettings();
if (!_screen->init())
error("screen()->init() failed");
@ -453,13 +462,14 @@ Common::Error EoBCoreEngine::init() {
memset(&_wllShapeMap[3], -1, 5);
memset(&_wllShapeMap[13], -1, 5);
_wllVcnOffset = 16;
_wllVcnOffset = (_flags.platform == Common::kPlatformFMTowns) ? 0 : 16;
int bpp = (_flags.platform == Common::kPlatformFMTowns) ? 2 : 1;
_greenFadingTable = new uint8[256];
_blueFadingTable = new uint8[256];
_lightBlueFadingTable = new uint8[256];
_blackFadingTable = new uint8[256];
_greyFadingTable = new uint8[256];
_greenFadingTable = new uint8[256 * bpp];
_blueFadingTable = new uint8[256 * bpp];
_lightBlueFadingTable = new uint8[256 * bpp];
_blackFadingTable = new uint8[256 * bpp];
_greyFadingTable = new uint8[256 * bpp];
_monsters = new EoBMonsterInPlay[30];
memset(_monsters, 0, 30 * sizeof(EoBMonsterInPlay));
@ -480,8 +490,9 @@ Common::Error EoBCoreEngine::init() {
_flyingObjectsPtr = _flyingObjects;
memset(_flyingObjects, 0, _numFlyingObjects * sizeof(EoBFlyingObject));
_spellAnimBuffer = new uint8[4096];
memset(_spellAnimBuffer, 0, 4096);
int bufferSize = _flags.useHiColorMode ? 8192 : 4096;
_spellAnimBuffer = new uint8[bufferSize];
memset(_spellAnimBuffer, 0, bufferSize);
_wallsOfForce = new WallOfForce[5];
memset(_wallsOfForce, 0, 5 * sizeof(WallOfForce));
@ -518,11 +529,8 @@ Common::Error EoBCoreEngine::init() {
Common::Error EoBCoreEngine::go() {
_debugger->initialize();
_txt->removePageBreakFlag();
_screen->setFont(Screen::FID_8_FNT);
loadItemsAndDecorationsShapes();
_screen->setMouseCursor(0, 0, _itemIconShapes[0]);
@ -540,6 +548,7 @@ Common::Error EoBCoreEngine::go() {
action = 0;
if (_gameToLoad != -1) {
_sound->selectAudioResourceSet(kMusicIngame);
if (loadGameState(_gameToLoad).getCode() != Common::kNoError)
error("Couldn't load game slot %d on startup", _gameToLoad);
startupLoad();
@ -549,6 +558,8 @@ Common::Error EoBCoreEngine::go() {
action = mainMenu();
}
_sound->selectAudioResourceSet(kMusicIngame);
if (action == -1) {
// load game
repeatLoop = _gui->runLoadMenu(72, 14);
@ -573,6 +584,7 @@ Common::Error EoBCoreEngine::go() {
if (_playFinale) {
// make final save for party transfer
saveGameStateIntern(-1, 0, 0);
_sound->selectAudioResourceSet(kMusicFinale);
seq_playFinale();
}
}
@ -601,7 +613,7 @@ void EoBCoreEngine::writeSettings() {
if (_sound) {
if (!_configSounds)
_sound->beginFadeOut();
_sound->haltTrack();
_sound->enableMusic(_configSounds ? 1 : 0);
_sound->enableSFX(_configSounds);
}
@ -683,54 +695,100 @@ bool EoBCoreEngine::checkPartyStatus(bool handleDeath) {
void EoBCoreEngine::loadItemsAndDecorationsShapes() {
releaseItemsAndDecorationsShapes();
_screen->loadShapeSetBitmap("ITEML1", 5, 3);
_largeItemShapes = new const uint8*[_numLargeItemShapes];
int div = (_flags.gameID == GI_EOB1) ? 3 : 8;
int mul = (_flags.gameID == GI_EOB1) ? 64 : 24;
int size = 0;
_largeItemShapes = new const uint8*[_numLargeItemShapes];
if (_flags.platform == Common::kPlatformFMTowns && _flags.gameID == GI_EOB2) {
for (int i = 0; i < _numLargeItemShapes; i++)
_largeItemShapes[i] = _staticres->loadRawData(kEoB2LargeItemsShapeData00 + i, size);
} else {
_screen->loadShapeSetBitmap("ITEML1", 5, 3);
for (int i = 0; i < _numLargeItemShapes; i++)
_largeItemShapes[i] = _screen->encodeShape((i / div) << 3, (i % div) * mul, 8, 24, false, _cgaMappingItemsL);
}
_screen->loadShapeSetBitmap("ITEMS1", 5, 3);
_smallItemShapes = new const uint8*[_numSmallItemShapes];
if (_flags.platform == Common::kPlatformFMTowns && _flags.gameID == GI_EOB2) {
for (int i = 0; i < _numSmallItemShapes; i++)
_smallItemShapes[i] = _staticres->loadRawData(kEoB2SmallItemsShapeData00 + i, size);
} else {
_screen->loadShapeSetBitmap("ITEMS1", 5, 3);
for (int i = 0; i < _numSmallItemShapes; i++)
_smallItemShapes[i] = _screen->encodeShape((i / div) << 2, (i % div) * mul, 4, 24, false, _cgaMappingItemsS);
}
_screen->loadShapeSetBitmap("THROWN", 5, 3);
_thrownItemShapes = new const uint8*[_numThrownItemShapes];
_spellShapes = new const uint8*[4];
_firebeamShapes = new const uint8*[3];
if (_flags.platform == Common::kPlatformFMTowns && _flags.gameID == GI_EOB2) {
for (int i = 0; i < _numThrownItemShapes; i++)
_thrownItemShapes[i] = _staticres->loadRawData(kEoB2ThrownShapeData00 + i, size);
for (int i = 0; i < 4; i++)
_spellShapes[i] = _staticres->loadRawData(kEoB2SpellShapeData00 + i, size);
for (int i = 0; i < 3; i++)
_firebeamShapes[i] = _staticres->loadRawData(kEoB2FirebeamShapeData00 + i, size);
_redSplatShape = _staticres->loadRawData(kEoB2RedSplatShapeData, size);
_greenSplatShape = _staticres->loadRawData(kEoB2GreenSplatShapeData, size);
} else {
_screen->loadShapeSetBitmap("THROWN", 5, 3);
for (int i = 0; i < _numThrownItemShapes; i++)
_thrownItemShapes[i] = _screen->encodeShape((i / div) << 2, (i % div) * mul, 4, 24, false, _cgaMappingThrown);
_spellShapes = new const uint8*[4];
for (int i = 0; i < 4; i++)
_spellShapes[i] = _screen->encodeShape(8, i << 5, 6, 32, false, _cgaMappingThrown);
_firebeamShapes = new const uint8*[3];
_firebeamShapes[0] = _screen->encodeShape(16, 0, 4, 24, false, _cgaMappingThrown);
_firebeamShapes[1] = _screen->encodeShape(16, 24, 4, 24, false, _cgaMappingThrown);
_firebeamShapes[2] = _screen->encodeShape(16, 48, 3, 24, false, _cgaMappingThrown);
_redSplatShape = _screen->encodeShape(16, _flags.gameID == GI_EOB1 ? 144 : 72, 5, 24, false, _cgaMappingThrown);
_greenSplatShape = _screen->encodeShape(16, _flags.gameID == GI_EOB1 ? 168 : 96, 5, 16, false, _cgaMappingThrown);
}
_screen->loadShapeSetBitmap("ITEMICN", 5, 3);
_itemIconShapes = new const uint8*[_numItemIconShapes];
if (_flags.platform == Common::kPlatformFMTowns && _flags.gameID == GI_EOB2) {
for (int i = 0; i < _numItemIconShapes; i++)
_itemIconShapes[i] = _staticres->loadRawData(kEoB2ItemIconShapeData00 + i, size);
} else {
_screen->loadShapeSetBitmap("ITEMICN", 5, 3);
for (int i = 0; i < _numItemIconShapes; i++)
_itemIconShapes[i] = _screen->encodeShape((i % 0x14) << 1, (i / 0x14) << 4, 2, 0x10, false, _cgaMappingIcons);
}
_teleporterShapes = new const uint8*[6];
_sparkShapes = new const uint8*[3];
_compassShapes = new const uint8*[12];
if (_flags.gameID == GI_EOB2)
_wallOfForceShapes = new const uint8*[6];
if (_flags.platform == Common::kPlatformFMTowns && _flags.gameID == GI_EOB2) {
_lightningColumnShape = _staticres->loadRawData(kEoB2LightningColumnShapeData, size);
for (int i = 0; i < 6; i++)
_wallOfForceShapes[i] = _staticres->loadRawData(kEoB2WallOfForceShapeData00 + i, size);
for (int i = 0; i < 6; i++)
_teleporterShapes[i] = _staticres->loadRawData(kEoB2TeleporterShapeData00 + i, size);
for (int i = 0; i < 3; i++)
_sparkShapes[i] = _staticres->loadRawData(kEoB2SparkShapeData00 + i, size);
for (int i = 0; i < 12; i++)
_compassShapes[i] = _staticres->loadRawData(kEoB2CompassShapeData00 + i, size);
_deadCharShape = _staticres->loadRawData(kEoB2DeadCharShapeData, size);
_disabledCharGrid = _staticres->loadRawData(kEoB2DisabledCharGridShapeData, size);
_blackBoxSmallGrid = _staticres->loadRawData(kEoB2SmallGridShapeData, size);
_weaponSlotGrid = _staticres->loadRawData(kEoB2WeaponSlotGridShapeData, size);
_blackBoxWideGrid = _staticres->loadRawData(kEoB2WideGridShapeData, size);
} else {
_screen->loadShapeSetBitmap("DECORATE", 5, 3);
if (_flags.gameID == GI_EOB2) {
_lightningColumnShape = _screen->encodeShape(18, 88, 4, 64);
_wallOfForceShapes = new const uint8*[6];
for (int i = 0; i < 6; i++)
_wallOfForceShapes[i] = _screen->encodeShape(_wallOfForceShapeDefs[(i << 2)], _wallOfForceShapeDefs[(i << 2) + 1], _wallOfForceShapeDefs[(i << 2) + 2], _wallOfForceShapeDefs[(i << 2) + 3]);
}
_teleporterShapes = new const uint8*[6];
for (int i = 0; i < 6; i++)
_teleporterShapes[i] = _screen->encodeShape(_teleporterShapeDefs[(i << 2)], _teleporterShapeDefs[(i << 2) + 1], _teleporterShapeDefs[(i << 2) + 2], _teleporterShapeDefs[(i << 2) + 3], false, _cgaMappingDefault);
_sparkShapes = new const uint8*[3];
_sparkShapes[0] = _screen->encodeShape(29, 0, 2, 16, false, _cgaMappingDeco);
_sparkShapes[1] = _screen->encodeShape(31, 0, 2, 16, false, _cgaMappingDeco);
_sparkShapes[2] = _screen->encodeShape(33, 0, 2, 16, false, _cgaMappingDeco);
@ -743,20 +801,20 @@ void EoBCoreEngine::loadItemsAndDecorationsShapes() {
static const uint8 dHeight[] = { 17, 10, 10 };
static const uint8 dY[] = { 120, 137, 147 };
_compassShapes = new const uint8*[12];
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 4; x++)
_compassShapes[(y << 2) + x] = _screen->encodeShape(x * 3, dY[y], 3, dHeight[y], false, _cgaMappingDeco);
}
}
}
void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_flags.platform != Common::kPlatformFMTowns || _flags.gameID != GI_EOB2) {
if (_largeItemShapes) {
for (int i = 0; i < _numLargeItemShapes; i++) {
if (_largeItemShapes[i])
delete[] _largeItemShapes[i];
}
delete[] _largeItemShapes;
}
if (_smallItemShapes) {
@ -764,7 +822,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_smallItemShapes[i])
delete[] _smallItemShapes[i];
}
delete[] _smallItemShapes;
}
if (_thrownItemShapes) {
@ -772,7 +829,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_thrownItemShapes[i])
delete[] _thrownItemShapes[i];
}
delete[] _thrownItemShapes;
}
if (_spellShapes) {
@ -780,7 +836,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_spellShapes[i])
delete[] _spellShapes[i];
}
delete[] _spellShapes;
}
if (_itemIconShapes) {
@ -788,7 +843,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_itemIconShapes[i])
delete[] _itemIconShapes[i];
}
delete[] _itemIconShapes;
}
if (_sparkShapes) {
@ -796,7 +850,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_sparkShapes[i])
delete[] _sparkShapes[i];
}
delete[] _sparkShapes;
}
if (_wallOfForceShapes) {
@ -804,7 +857,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_wallOfForceShapes[i])
delete[] _wallOfForceShapes[i];
}
delete[] _wallOfForceShapes;
}
if (_teleporterShapes) {
@ -812,7 +864,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_teleporterShapes[i])
delete[] _teleporterShapes[i];
}
delete[] _teleporterShapes;
}
if (_compassShapes) {
@ -820,7 +871,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_compassShapes[i])
delete[] _compassShapes[i];
}
delete[] _compassShapes;
}
if (_firebeamShapes) {
@ -828,7 +878,6 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
if (_firebeamShapes[i])
delete[] _firebeamShapes[i];
}
delete[] _firebeamShapes;
}
delete[] _redSplatShape;
@ -839,11 +888,26 @@ void EoBCoreEngine::releaseItemsAndDecorationsShapes() {
delete[] _weaponSlotGrid;
delete[] _blackBoxWideGrid;
delete[] _lightningColumnShape;
}
delete[] _largeItemShapes;
delete[] _smallItemShapes;
delete[] _thrownItemShapes;
delete[] _spellShapes;
delete[] _itemIconShapes;
delete[] _sparkShapes;
delete[] _wallOfForceShapes;
delete[] _teleporterShapes;
delete[] _compassShapes;
delete[] _firebeamShapes;
}
void EoBCoreEngine::setHandItem(Item itemIndex) {
if (itemIndex == -1)
if (itemIndex == -1) {
if (_flags.platform == Common::kPlatformFMTowns)
_screen->setMouseCursor(8, 8, _itemIconShapes[37], 0);
return;
}
if (_screen->curDimIndex() == 7 && itemIndex) {
printFullItemName(itemIndex);
@ -860,6 +924,11 @@ void EoBCoreEngine::setHandItem(Item itemIndex) {
int mouseOffs = itemIndex ? 8 : 0;
_screen->setMouseCursor(mouseOffs, mouseOffs, shp, ovl);
if (_flags.useHiColorMode) {
_screen->setFadeTable(_greyFadingTable);
_screen->setShapeFadingLevel(0);
}
}
int EoBCoreEngine::getDexterityArmorClassModifier(int dexterity) {
@ -1247,7 +1316,9 @@ int EoBCoreEngine::prepareForNewPartyMember(int16 itemType, int16 itemValue) {
deletePartyItems(itemType, itemValue);
} else {
gui_drawDialogueBox();
_screen->set16bitShadingLevel(4);
_txt->printDialogueText(_npcMaxStrings[0]);
_screen->set16bitShadingLevel(0);
int r = runDialogue(-1, 7, _characters[0].name, _characters[1].name, _characters[2].name, _characters[3].name,
_characters[4].name, _characters[5].name, _abortStrings[0]) - 1;
@ -1376,6 +1447,8 @@ void EoBCoreEngine::setupDialogueButtons(int presetfirst, int numStr, va_list &a
_dialogueNumButtons = numStr;
_dialogueHighlightedButton = 0;
Screen::FontId of = _screen->setFont((_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformFMTowns) ? Screen::FID_8_FNT : _screen->_currentFont);
for (int i = 0; i < numStr; i++) {
const char *s = va_arg(args, const char *);
if (s)
@ -1396,6 +1469,8 @@ void EoBCoreEngine::setupDialogueButtons(int presetfirst, int numStr, va_list &a
drawDialogueButtons();
_screen->setFont(of);
if (!shouldQuit())
removeInputTop();
}
@ -1448,6 +1523,7 @@ void EoBCoreEngine::drawSequenceBitmap(const char *file, int destRect, int x1, i
int page = ((flags & 2) || destRect) ? 0 : 6;
if (scumm_stricmp(_dialogueLastBitmap, file)) {
_screen->clearPage(2);
if (!destRect) {
if (!(flags & 1)) {
_screen->loadEoBBitmap("BORDER", 0, 3, 3, 2);
@ -1622,7 +1698,9 @@ void EoBCoreEngine::displayParchment(int id) {
// display text
Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
_screen->loadFileDataToPage(s, 5, 32000);
_screen->set16bitShadingLevel(4);
gui_drawBox(0, 0, 176, 175, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
_txt->setupField(12, 1);
if (_flags.gameID == GI_EOB2)
id++;
@ -1792,6 +1870,30 @@ bool EoBCoreEngine::checkPassword() {
return true;
}
Common::String EoBCoreEngine::convertAsciiToSjis(Common::String str) {
if (_flags.platform != Common::kPlatformFMTowns)
return str;
Common::String n;
const char *src = str.c_str();
int pos = 0;
for (uint32 i = 0; i < str.size(); ++i) {
if (src[i] & 0x80) {
n.insertChar(src[i++], pos++);
n.insertChar(src[i], pos++);
} else if (src[i] >= 32 && src[i] <= 64) {
n.insertChar(_ascii2SjisTables[1][(src[i] - 32) * 2], pos++);
n.insertChar(_ascii2SjisTables[1][(src[i] - 32) * 2 + 1], pos++);
} else if ((src[i] >= 97 && src[i] <= 122) || (src[i] >= 65 && src[i] <= 90)) {
char c = (src[i] >= 97) ? src[i] - 97 : src[i] - 65;
n.insertChar(_ascii2SjisTables2[0][c * 2], pos++);
n.insertChar(_ascii2SjisTables2[0][c * 2 + 1], pos++);
}
}
return n;
}
void EoBCoreEngine::useSlotWeapon(int charIndex, int slotIndex, Item item) {
EoBCharacter *c = &_characters[charIndex];
int tp = item ? _items[item].type : 0;

View File

@ -77,7 +77,7 @@ struct EoBGuiButtonDef {
struct EoBCharacter {
uint8 id;
uint8 flags;
char name[11];
char name[21];
int8 strengthCur;
int8 strengthMax;
int8 strengthExtCur;
@ -476,11 +476,15 @@ protected:
const uint8 *_expObjectAnimTbl3;
int _expObjectAnimTbl3Size;
const char *const *_ascii2SjisTables;
const char *const *_ascii2SjisTables2;
// Monsters
void loadMonsterShapes(const char *filename, int monsterIndex, bool hasDecorations, int encodeTableIndex);
void releaseMonsterShapes(int first, int num);
uint8 *loadTownsShape(Common::SeekableReadStream *stream);
virtual void generateMonsterPalettes(const char *file, int16 monsterIndex) {}
virtual void loadMonsterDecoration(const char *file, int16 monsterIndex) {}
virtual void loadMonsterDecoration(Common::SeekableReadStream *stream, int16 monsterIndex) {}
const uint8 *loadMonsterProperties(const uint8 *data);
const uint8 *loadActiveMonsterData(const uint8 *data, int level);
void initMonster(int index, int unit, uint16 block, int pos, int dir, int type, int shpIndex, int mode, int i, int randItem, int fixedItem);
@ -632,7 +636,6 @@ protected:
const uint8 *_dscItemTileIndex;
const uint8 *_dscItemShapeMap;
const uint8 *_dscDoorScaleOffs;
const uint8 *_dscDoorScaleMult1;
const uint8 *_dscDoorScaleMult2;
const uint8 *_dscDoorScaleMult3;
@ -745,7 +748,7 @@ protected:
static const uint8 _buttonList8[];
int _buttonList8Size;
const EoBGuiButtonDef *_buttonDefs;
EoBGuiButtonDef *_buttonDefs;
const char *const *_characterGuiStringsHp;
const char *const *_characterGuiStringsWp;
@ -832,6 +835,8 @@ protected:
void seq_portal();
bool checkPassword();
Common::String convertAsciiToSjis(Common::String str);
virtual int resurrectionSelectDialogue() = 0;
virtual void useHorn(int charIndex, int weaponSlot) {}
virtual bool checkPartyStatusExtra() = 0;
@ -1120,6 +1125,7 @@ protected:
const EoBMenuButtonDef *_menuButtonDefs;
bool _configMouse;
bool _config2431;
const char *const *_menuStringsMain;
const char *const *_menuStringsSaveLoad;
@ -1142,12 +1148,15 @@ protected:
const char *_errorSlotEmptyString;
const char *_errorSlotNoNameString;
const char *_menuOkString;
const char *const *_2431Strings;
const char *const *_katakanaLines;
const char *const *_katakanaSelectStrings;
const char *const *_menuStringsTransfer;
const char *const *_transferStringsScummVM;
const char *const *_menuStringsSpec;
const char *const *_menuStringsSpellNo;
const char *const *_menuYesNoStrings;
const char *const *_saveNamePatterns;
const uint8 *_spellLevelsMage;
int _spellLevelsMageSize;

View File

@ -103,7 +103,7 @@ void EoBCoreEngine::gui_drawCharPortraitWithStats(int index) {
if (index == _exchangeCharacterId)
_screen->printText(_characterGuiStringsSt[0], x2 + 2, y2 + 2, 8, guiSettings()->colors.fill);
else
_screen->printText(c->name, x2 + 2, y2 + 2, txtCol1, guiSettings()->colors.fill);
_screen->printText(c->name, x2 + 2, y2 + (_flags.platform == Common::kPlatformFMTowns ? 1 : 2), txtCol1, guiSettings()->colors.fill);
gui_drawFaceShape(index);
gui_drawWeaponSlot(index, 0);
@ -256,8 +256,10 @@ void EoBCoreEngine::gui_drawFaceShape(int index) {
if (c->hitPointsCur < 1)
_screen->drawShape(_screen->_curPage, _disabledCharGrid, x, y, 0);
if (c->flags & 8 || c->flags & 2 || c->effectFlags & 0x140) {
_screen->setFadeTable(_greyFadingTable);
_screen->setShapeFadingLevel(0);
}
}
void EoBCoreEngine::gui_drawWeaponSlot(int charIndex, int slot) {
@ -527,8 +529,10 @@ void EoBCoreEngine::gui_drawCompass(bool force) {
}
void EoBCoreEngine::gui_drawDialogueBox() {
_screen->set16bitShadingLevel(4);
gui_drawBox(0, 121, 320, 79, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
txt()->clearCurDim();
_screen->set16bitShadingLevel(0);
}
void EoBCoreEngine::gui_drawSpellbook() {
@ -563,7 +567,9 @@ void EoBCoreEngine::gui_drawSpellbook() {
gui_drawBox(i * 21 + 71, 122, 21, 9, col1, col2, col3);
_screen->printText(_magicStrings7[i], i * 21 + 73, 123, 12, 0);
} else {
_screen->set16bitShadingLevel(4);
gui_drawBox(i * 18 + 68, 121, 18, 9, col1, col2, col3);
_screen->set16bitShadingLevel(0);
_screen->printText(Common::String::format("%d", i + 1).c_str(), i * 18 + 75, 123, 12, 0);
}
}
@ -571,7 +577,9 @@ void EoBCoreEngine::gui_drawSpellbook() {
if (_flags.gameID == GI_EOB1)
gui_drawBox(71, 131, 105, 44, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
else {
_screen->set16bitShadingLevel(4);
gui_drawBox(68, 130, 108, 47, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
gui_drawBox(68, 168, 78, 9, guiSettings()->colors.extraFrame1, guiSettings()->colors.extraFrame2, guiSettings()->colors.extraFill);
gui_drawBox(146, 168, 14, 9, guiSettings()->colors.extraFrame1, guiSettings()->colors.extraFrame2, guiSettings()->colors.extraFill);
gui_drawBox(160, 168, 16, 9, guiSettings()->colors.extraFrame1, guiSettings()->colors.extraFrame2, guiSettings()->colors.extraFill);
@ -600,6 +608,7 @@ void EoBCoreEngine::gui_drawSpellbook() {
int d = _openBookAvailableSpells[_openBookSpellLevel * 10 + _openBookSpellListOffset + i];
if (_openBookSpellSelectedItem == i) {
if (d >= 0 && i < 6 && (i + _openBookSpellListOffset) < 9) {
_screen->fillRect(textXs, 132 + 6 * i, textXs + _screen->getTextWidth(_openBookSpellList[d]) - 1, 137 + 6 * i, textCol2);
_screen->printText(_openBookSpellList[d], textXs, 132 + 6 * i, textCol1, textCol2);
} else if (i == 6) {
if (_flags.gameID == GI_EOB2)
@ -1073,6 +1082,7 @@ int EoBCoreEngine::clickedInventoryNextPage(Button *button) {
int EoBCoreEngine::clickedPortraitRestore(Button *button) {
_currentControlMode = 0;
_screen->_curPage = 2;
_screen->fillRect(0, 0, 143, 167, 0);
_screen->copyRegion(0, 0, 0, 0, 144, 168, 5, _screen->_curPage, Screen::CR_NO_P_CHECK);
gui_drawAllCharPortraitsWithStats();
_screen->_curPage = 0;
@ -1178,6 +1188,8 @@ int EoBCoreEngine::clickedSceneSpecial(Button *button) {
int EoBCoreEngine::clickedSpellbookAbort(Button *button) {
_updateFlags = 0;
_screen->fillRect(64, 121, 175, 176, 0, 0);
_screen->fillRect(64, 121, 175, 176, 0, 2);
_screen->copyRegion(0, 0, 64, 121, 112, 56, 10, 0, Screen::CR_NO_P_CHECK);
_screen->updateScreen();
gui_drawCompass(true);
@ -1372,8 +1384,8 @@ GUI_EoB::GUI_EoB(EoBCoreEngine *vm) : GUI(vm), _vm(vm), _screen(vm->_screen) {
_saveSlotStringsTemp = new char*[6];
for (int i = 0; i < 6; i++) {
_saveSlotStringsTemp[i] = new char[20];
memset(_saveSlotStringsTemp[i], 0, 20);
_saveSlotStringsTemp[i] = new char[26];
memset(_saveSlotStringsTemp[i], 0, 26);
}
_saveSlotIdTemp = new int16[6];
_savegameOffset = 0;
@ -2030,6 +2042,7 @@ void GUI_EoB::runCampMenu() {
int newMenu = 0;
int lastMenu = -1;
bool redrawPortraits = false;
bool keepButtons = false;
_charSelectRedraw = false;
_needRest = false;
@ -2040,6 +2053,7 @@ void GUI_EoB::runCampMenu() {
updateOptionsStrings();
if (newMenu != -1) {
if (!keepButtons) {
releaseButtons(buttonList);
_vm->_menuDefs[0].titleStrId = newMenu ? 1 : 56;
@ -2054,9 +2068,11 @@ void GUI_EoB::runCampMenu() {
highlightButton = buttonList;
prevHighlightButton = 0;
}
}
lastMenu = newMenu;
newMenu = -1;
keepButtons = false;
}
int inputFlag = _vm->checkInput(buttonList, false, 0) & 0x80FF;
@ -2089,6 +2105,8 @@ void GUI_EoB::runCampMenu() {
if (prevHighlightButton) {
int dir = (inputFlag == _vm->_keyMap[Common::KEYCODE_UP]) ? -1 : 1;
int s = prevHighlightButton->index + dir;
if (lastMenu == 2 && _vm->gameFlags().platform == Common::kPlatformFMTowns)
s += 32;
int a = _vm->_menuDefs[lastMenu].firstButtonStrId + 1;
int b = a + _vm->_menuDefs[lastMenu].numButtons - 1;
@ -2102,10 +2120,12 @@ void GUI_EoB::runCampMenu() {
s += dir;
} while (!_vm->shouldQuit());
if (lastMenu == 2 && _vm->gameFlags().platform == Common::kPlatformFMTowns)
s -= 32;
highlightButton = _vm->gui_getButton(buttonList, s);
}
} else if (inputFlag > 0x8000 && inputFlag < 0x8010) {
} else if (inputFlag > 0x8000 && inputFlag < 0x8011) {
int i = 0;
int cnt = 0;
@ -2148,7 +2168,7 @@ void GUI_EoB::runCampMenu() {
// fall through
case 0x800C:
case 0x800F:
case 0x8010:
if (lastMenu == 1 || lastMenu == 2)
newMenu = 0;
else if (inputFlag == _vm->_keyMap[Common::KEYCODE_ESCAPE])
@ -2199,13 +2219,24 @@ void GUI_EoB::runCampMenu() {
case 0x800D:
_vm->_configSounds ^= true;
_vm->_configMusic = _vm->_configSounds ? 1 : 0;
keepButtons = true;
newMenu = 2;
break;
case 0x800E:
_vm->_configHpBarGraphs ^= true;
newMenu = 2;
redrawPortraits = true;
redrawPortraits = keepButtons = true;
break;
case 0x800F:
if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
_vm->_config2431 ^= true;
newMenu = 2;
redrawPortraits = keepButtons = true;
} else {
newMenu = 0;
}
break;
default:
@ -2233,7 +2264,7 @@ void GUI_EoB::runCampMenu() {
if (prevHighlightButton != highlightButton && newMenu == -1 && runLoop) {
drawMenuButton(prevHighlightButton, false, false, true);
drawMenuButton(highlightButton, false, true, true);
drawMenuButton(highlightButton, false, true, false);
_screen->updateScreen();
prevHighlightButton = highlightButton;
}
@ -2322,7 +2353,7 @@ bool GUI_EoB::confirmDialogue2(int dim, int id, int deflt) {
if (newHighlight != lastHighlight) {
for (int i = 0; i < 2; i++)
_screen->printShadedText(_vm->_menuYesNoStrings[i], x[i] + 16 - (strlen(_vm->_menuYesNoStrings[i]) << 2) + 1, y + 3, i == newHighlight ? 6 : 15, 0);
_screen->printShadedText(_vm->_menuYesNoStrings[i], x[i] + 16 - (_screen->getTextWidth(_vm->_menuYesNoStrings[i]) / 2) + 1, y + 3, i == newHighlight ? 6 : 15, 0);
_screen->updateScreen();
lastHighlight = newHighlight;
}
@ -2349,9 +2380,9 @@ void GUI_EoB::messageDialogue(int dim, int id, int buttonTextCol) {
drawTextBox(dim, id);
const ScreenDim *dm = _screen->getScreenDim(dim);
int bx = ((dm->sx + dm->w) << 3) - ((strlen(_vm->_menuOkString) << 3) + 16);
int bx = ((dm->sx + dm->w) << 3) - (_screen->getTextWidth(_vm->_menuOkString) + 16);
int by = dm->sy + dm->h - 19;
int bw = (strlen(_vm->_menuOkString) << 3) + 7;
int bw = _screen->getTextWidth(_vm->_menuOkString) + 7;
drawMenuButtonBox(bx, by, bw, 14, false, false);
_screen->printShadedText(_vm->_menuOkString, bx + 4, by + 3, buttonTextCol, 0);
@ -2382,8 +2413,6 @@ void GUI_EoB::messageDialogue(int dim, int id, int buttonTextCol) {
}
void GUI_EoB::messageDialogue2(int dim, int id, int buttonTextCol) {
drawMenuButtonBox(_screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->w << 3, _screen->_curDim->h, false, false);
_screen->_curPage = 2;
_screen->setClearScreenDim(dim);
drawMenuButtonBox(_screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->w << 3, _screen->_curDim->h, false, false);
@ -2391,9 +2420,9 @@ void GUI_EoB::messageDialogue2(int dim, int id, int buttonTextCol) {
_screen->_curPage = 0;
_screen->copyRegion(_screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->w << 3, _screen->_curDim->h, 2, 0, Screen::CR_NO_P_CHECK);
int x = (_screen->_curDim->sx << 3) + (_screen->_curDim->w << 2) - (strlen(_vm->_menuOkString) << 2);
int x = (_screen->_curDim->sx << 3) + (_screen->_curDim->w << 2) - (_screen->getTextWidth(_vm->_menuOkString) / 2);
int y = _screen->_curDim->sy + _screen->_curDim->h - 21;
int w = (strlen(_vm->_menuOkString) << 3) + 8;
int w = _screen->getTextWidth(_vm->_menuOkString) + 8;
drawMenuButtonBox(x, y, w, 14, false, false);
_screen->printShadedText(_vm->_menuOkString, x + 4, y + 3, buttonTextCol, 0);
_screen->updateScreen();
@ -2410,7 +2439,9 @@ void GUI_EoB::messageDialogue2(int dim, int id, int buttonTextCol) {
}
}
_screen->set16bitShadingLevel(4);
_vm->gui_drawBox(x, y, w, 14, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill, -1);
_screen->set16bitShadingLevel(0);
_screen->updateScreen();
_vm->_system->delayMillis(80);
drawMenuButtonBox(x, y, w, 14, false, false);
@ -2456,7 +2487,7 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
#endif
uint8 cursorState = 1;
char sufx[] = " ";
char sufx[3] = " \0";
int len = strlen(dest);
if (len > destMaxLen) {
@ -2469,12 +2500,17 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
pos--;
_screen->copyRegion((x - 1) << 3, y, 0, 191, (destMaxLen + 2) << 3, 9, 0, 2, Screen::CR_NO_P_CHECK);
if (_vm->gameFlags().platform == Common::kPlatformFMTowns)
_screen->copyRegion(0, 0, 160, 0, 160, 128, 2, 2, Screen::CR_NO_P_CHECK);
_screen->printShadedText(dest, x << 3, y, textColor1, textColor2);
uint32 next = _vm->_system->getMillis() + 2 * _vm->_tickLength;
sufx[0] = (pos < len) ? dest[pos] : 32;
_screen->printText(sufx, (x + pos) << 3, y, textColor1, cursorColor);
_menuCur = -1;
printKatakanaOptions(0);
int in = 0;
do {
@ -2487,32 +2523,57 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
_screen->copyRegion((pos + 1) << 3, 191, (x + pos) << 3, y, 8, 9, 2, 0, Screen::CR_NO_P_CHECK);
_screen->printShadedText(sufx, (x + pos) << 3, y, textColor1, textColor2);
} else {
_screen->fillRect((x + pos) << 3, y, ((x + pos) << 3) + 7, y + 7, cursorColor);
_screen->printText(sufx, (x + pos) << 3, y, textColor1, cursorColor);
}
_screen->updateScreen();
cursorState ^= 1;
next = _vm->_system->getMillis() + 2 * _vm->_tickLength;
next = _vm->_system->getMillis() + 4 * _vm->_tickLength;
}
_vm->updateInput();
in = checkKatakanaSelection();
for (Common::List<KyraEngine_v1::Event>::const_iterator evt = _vm->_eventList.begin(); evt != _vm->_eventList.end(); ++evt) {
if (evt->event.type == Common::EVENT_KEYDOWN) {
_keyPressed = evt->event.kbd;
in = _keyPressed.ascii;
if (_vm->_flags.platform == Common::kPlatformFMTowns && _keyPressed.ascii > 31 && _keyPressed.ascii < 123) {
Common::String s;
s.insertChar(in & 0xff, 0);
s = _vm->convertAsciiToSjis(s);
if (s.empty()) {
in = 0;
} else {
_csjis[0] = s[0];
_csjis[1] = s[1];
_csjis[2] = 0;
in = 0x89;
}
}
}
}
_vm->removeInputTop();
}
if (_keyPressed.keycode == Common::KEYCODE_BACKSPACE) {
if (pos >= len && len > 0) {
dest[--len] = 0;
pos--;
} else if (pos > 0) {
for (int i = pos; i < destMaxLen; i++)
if (pos > 0 && pos < len ) {
for (int i = pos; i < len; i++) {
if (dest[i * 2] & 0x80) {
dest[(i - 1) * 2] = dest[i * 2];
dest[(i - 1) * 2 + 1] = dest[i * 2 + 1];
} else {
dest[i - 1] = dest[i];
}
}
}
if (pos > 0) {
if (dest[(len - 1) * 2] & 0x80)
dest[--len * 2] = 0;
else
dest[--len] = 0;
pos--;
}
@ -2525,29 +2586,46 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
if (pos < len && pos < (destMaxLen - 1))
pos++;
} else if (in > 31 && in < 126) {
} else if ((in > 31 && in < 126) || (in == 0x89)) {
if (!(in == 32 && pos == 0)) {
if (in >= 97 && in <= 122)
in -= 32;
if (pos < len) {
for (int i = destMaxLen - 1; i >= pos; i--)
for (int i = destMaxLen - 2; i >= pos; i--) {
if (in == 0x89) {
dest[(i + 1) * 2] = dest[i * 2];
dest[(i + 1) * 2 + 1] = dest[i * 2 + 1];
} else {
dest[i + 1] = dest[i];
}
}
if (in == 0x89) {
dest[pos * 2] = _csjis[0];
dest[pos++ * 2 + 1] = _csjis[1];
if (len == destMaxLen)
dest[len * 2] = 0;
} else {
dest[pos++] = in;
if (len == destMaxLen)
dest[len] = 0;
}
} else {
if (pos == destMaxLen) {
pos--;
len--;
}
if (in == 0x89) {
dest[pos * 2] = _csjis[0];
dest[pos * 2 + 1] = _csjis[1];
dest[++pos * 2] = 0;
} else {
dest[pos++] = in;
dest[pos] = 0;
}
}
if (++len > destMaxLen)
len = destMaxLen;
@ -2559,7 +2637,18 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
_screen->copyRegion(0, 191, (x - 1) << 3, y, (destMaxLen + 2) << 3, 9, 2, 0, Screen::CR_NO_P_CHECK);
_screen->printShadedText(dest, x << 3, y, textColor1, textColor2);
if (_vm->_flags.platform == Common::kPlatformFMTowns) {
if (pos < len) {
sufx[0] = dest[pos * 2];
sufx[1] = dest[pos * 2 + 1];
} else {
sufx[0] = 32;
sufx[1] = 0;
}
} else {
sufx[0] = (pos < len) ? dest[pos] : 32;
}
if (cursorState)
_screen->printText(sufx, (x + pos) << 3, y, textColor1, cursorColor);
@ -2576,6 +2665,108 @@ int GUI_EoB::getTextInput(char *dest, int x, int y, int destMaxLen, int textColo
return _keyPressed.keycode == Common::KEYCODE_ESCAPE ? -1 : len;
}
int GUI_EoB::checkKatakanaSelection() {
if (_vm->_flags.platform != Common::kPlatformFMTowns)
return 0;
static uint16 kanaSelXCrds[] = { 224, 272, 186 };
Common::Point mousePos = _vm->getMousePos();
int highlight = -1;
_csjis[0] = _csjis[2] = 0;
for (int y = 112; y < 168; y += 16) {
for (int x = 152; x < 288; x += 8) {
if (!_vm->posWithinRect(mousePos.x, mousePos.y, x, y, x + 9, y + 9))
continue;
int lineOffs = (y - 112) >> 4;
int column = (x - 152) >> 2;
_csjis[0] = _vm->_katakanaLines[_currentKanaPage * 4 + lineOffs][column];
_csjis[1] = _vm->_katakanaLines[_currentKanaPage * 4 + lineOffs][column + 1];
if (_csjis[0] != '\x81' || _csjis[1] != '\x40') {
highlight = lineOffs << 8 | column;
_screen->printShadedText(_csjis, x & ~7, y & ~15, 6, 0);
}
x = 288; y = 168;
}
}
if (highlight == -1) {
for (int i = 0; i < 3; i++) {
if (!_vm->posWithinRect(mousePos.x, mousePos.y, kanaSelXCrds[i], 176, kanaSelXCrds[i] + _screen->getTextWidth(_vm->_katakanaSelectStrings[i]), 184))
continue;
highlight = 0x400 | i;
_screen->printShadedText(_vm->_katakanaSelectStrings[i], kanaSelXCrds[i], 176, 6, 0);
i = 3;
}
}
int in = 0;
for (Common::List<KyraEngine_v1::Event>::const_iterator evt = _vm->_eventList.begin(); evt != _vm->_eventList.end(); ++evt) {
if (evt->event.type == Common::EVENT_LBUTTONDOWN)
in = 1;
}
if ((highlight == -1 || highlight == _menuCur) && !in)
return 0;
if (_menuCur != -1) {
if (_menuCur & 0x400) {
_screen->printShadedText(_vm->_katakanaSelectStrings[_menuCur & 3], kanaSelXCrds[_menuCur & 3], 176, 15, 0);
} else {
char osjis[3];
osjis[0] = _vm->_katakanaLines[_currentKanaPage * 4 + (_menuCur >> 8)][_menuCur & 0xFF];
osjis[1] = _vm->_katakanaLines[_currentKanaPage * 4 + (_menuCur >> 8)][(_menuCur & 0xFF) + 1];
osjis[2] = 0;
_screen->printShadedText(osjis, 152 + ((_menuCur & 0xFF) << 2), 112 + ((_menuCur >> 4) & ~0x0F), 15, 0);
}
}
_menuCur = highlight;
if (in && highlight != -1) {
if (highlight & 0x400) {
switch (highlight & 3) {
case 0:
printKatakanaOptions((_currentKanaPage + 1) % 3);
break;
case 1:
_keyPressed.keycode = Common::KEYCODE_RETURN;
break;
case 2:
_keyPressed.keycode = Common::KEYCODE_BACKSPACE;
break;
default:
break;
}
} else if (_csjis[0]) {
if (_csjis[0] == '\x81' && _csjis[1] == '\x51')
_csjis[1] = '\x40';
return 0x89;
}
}
return in;
}
void GUI_EoB::printKatakanaOptions(int page) {
if (_vm->_flags.platform != Common::kPlatformFMTowns)
return;
_currentKanaPage = page;
_screen->copyRegion(160, 44, 144, 108, 160, 84, 2, 0, Screen::CR_NO_P_CHECK);
for (int i = 0; i < 4; i++)
_screen->printShadedText(_vm->_katakanaLines[page * 4 + i], 152, (i << 4) + 112, 15, 0);
static uint16 kanaSelCrds[] = { 224, 272, 186 };
for (int i = 0; i < 3; i++)
_screen->printShadedText(_vm->_katakanaSelectStrings[i], kanaSelCrds[i], 176, 15, 0);
}
void GUI_EoB::transferWaitBox() {
const ScreenDim *dm = _screen->getScreenDim(11);
int xo = dm->sx;
@ -2698,10 +2889,21 @@ bool GUI_EoB::runSaveMenu(int x, int y) {
int fx = (x + 1) << 3;
int fy = y + slot * 17 + 23;
Screen::FontId of = _screen->_currentFont;
_screen->set16bitShadingLevel(4);
for (int in = -1; in == -1 && !_vm->shouldQuit();) {
_screen->fillRect(fx - 2, fy, fx + 160, fy + 8, _vm->guiSettings()->colors.fill);
if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
TimeDate td;
_vm->_system->getTimeAndDate(td);
Common::strlcpy(_saveSlotStringsTemp[slot], Common::String::format(_vm->_saveNamePatterns[_vm->_currentLevel * 2 + _vm->_currentSub], td.tm_mon + 1, td.tm_mday, td.tm_hour, td.tm_min).c_str(), 25);
in = strlen(_saveSlotStringsTemp[slot]);
of = _vm->screen()->setFont(Screen::FID_6_FNT);
y++;
} else {
in = getTextInput(_saveSlotStringsTemp[slot], x + 1, fy, 19, 2, 0, 8);
}
if (in == -1) {
useSlot = false;
break;
@ -2719,6 +2921,9 @@ bool GUI_EoB::runSaveMenu(int x, int y) {
_screen->fillRect(fx - 2, fy, fx + 160, fy + 8, _vm->guiSettings()->colors.fill);
_screen->printShadedText(_saveSlotStringsTemp[slot], (x + 1) << 3, fy, 15, 0);
_screen->set16bitShadingLevel(0);
_screen->setFont(of);
_screen->updateScreen();
Graphics::Surface thumb;
createScreenThumbnail(thumb);
@ -2831,7 +3036,9 @@ int GUI_EoB::selectSaveSlotDialogue(int x, int y, int id) {
// Display highlighted slot index in the bottom left corner to avoid people getting lost with the 990 save slots
_screen->setFont(Screen::FID_6_FNT);
int sli = (newHighlight == 6) ? _savegameOffset : (_savegameOffset + newHighlight);
_screen->set16bitShadingLevel(4);
_screen->printText(Common::String::format("%03d/989", sli).c_str(), _saveSlotX + 5, _saveSlotY + 135, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
_screen->setFont(Screen::FID_8_FNT);
_screen->updateScreen();
@ -2990,7 +3197,9 @@ void GUI_EoB::runMemorizePrayMenu(int charIndex, int spellType) {
if (updateDesc) {
updateDesc = false;
_screen->set16bitShadingLevel(4);
_screen->printShadedText(Common::String::format(_vm->_menuStringsMgc[1], np[lastHighLightButton] - numAssignedSpellsPerBookPage[lastHighLightButton], np[lastHighLightButton]).c_str(), 8, 38, 9, _vm->guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
}
if (newHighLightText < 0)
@ -3664,6 +3873,13 @@ int GUI_EoB::selectCharacterDialogue(int id) {
result = -2;
int hlCur = -1;
for (int i = 0; i < 6; ++i) {
if (found[i] != -1) {
hlCur = i;
break;
}
}
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
while (result == -2 && !_vm->shouldQuit()) {
@ -3788,6 +4004,8 @@ Button *GUI_EoB::initMenu(int id) {
b->index = m->firstButtonStrId + i + 1;
if (id == 4 && _vm->game() == GI_EOB1)
b->index -= 14;
else if (id == 2 && _vm->gameFlags().platform == Common::kPlatformFMTowns)
b->index -= 32;
b->data0Val2 = 12;
b->data1Val2 = b->data2Val2 = 15;
@ -3830,7 +4048,7 @@ void GUI_EoB::drawMenuButton(Button *b, bool clicked, bool highlight, bool noFil
int yOffs = 3;
if (d->flags & 4) {
xOffs = ((b->width - (strlen(s) << 3)) >> 1) + 1;
xOffs = ((b->width - _screen->getTextWidth(s)) >> 1) + 1;
yOffs = (b->height - 7) >> 1;
}
@ -3850,8 +4068,10 @@ void GUI_EoB::drawMenuButtonBox(int x, int y, int w, int h, bool clicked, bool n
if (clicked)
col1 = col2 = _vm->guiSettings()->colors.fill;
_screen->set16bitShadingLevel(4);
_vm->gui_drawBox(x, y, w, h, col1, col2, -1);
_vm->gui_drawBox(x + 1, y + 1, w - 2, h - 2, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, noFill ? -1 : _vm->guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
}
void GUI_EoB::drawTextBox(int dim, int id) {
@ -3893,7 +4113,14 @@ void GUI_EoB::drawSaveSlotButton(int slot, int redrawBox, int textCol) {
if (redrawBox)
drawMenuButtonBox(x, y, w, 14, (redrawBox - 1) ? true : false, false);
Screen::FontId fnt = _screen->_currentFont;
if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
fnt = _vm->screen()->setFont(Screen::FID_6_FNT);
y++;
}
_screen->printShadedText(s, x + 4, y + 3, textCol, 0);
_vm->screen()->setFont(fnt);
}
void GUI_EoB::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int spellType, bool noFill, bool highLight) {
@ -3902,17 +4129,28 @@ void GUI_EoB::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int sp
int y = bookPageIndex * 9 + 50;
int col1 = (_vm->_configRenderMode == Common::kRenderCGA) ? 1 : 15;
_screen->set16bitShadingLevel(4);
if (spellId) {
Common::String s(Common::String::format(_vm->_menuStringsMgc[0], spellType ? _vm->_clericSpellList[spellId] : _vm->_mageSpellList[spellId], _numAssignedSpellsOfType[spellId * 2 - 2]));
Common::String s;
if (_vm->_flags.platform == Common::kPlatformFMTowns) {
s = spellType ? _vm->_clericSpellList[spellId] : _vm->_mageSpellList[spellId];
for (int i = s.size() >> 1; i < 17; ++i)
s.insertChar(' ', s.size());
s.insertChar((char)(_numAssignedSpellsOfType[spellId * 2 - 2] + 48), s.size());
} else {
s = Common::String::format(_vm->_menuStringsMgc[0], spellType ? _vm->_clericSpellList[spellId] : _vm->_mageSpellList[spellId], _numAssignedSpellsOfType[spellId * 2 - 2]);
}
if (noFill)
_screen->printText(s.c_str(), 8, y, highLight ? 6 : col1, 0);
else
_screen->printShadedText(s.c_str(), 8, y, highLight ? 6 : col1, _vm->guiSettings()->colors.fill);
} else {
_screen->fillRect(6, y, 168, y + 8, _vm->guiSettings()->colors.fill);
}
_screen->set16bitShadingLevel(0);
}
void GUI_EoB::updateOptionsStrings() {
@ -3924,7 +4162,7 @@ void GUI_EoB::updateOptionsStrings() {
Common::strlcpy(_menuStringsPrefsTemp[0], Common::String::format(_vm->_menuStringsPrefs[0], _vm->_menuStringsOnOff[_vm->_configMusic ? 0 : 1]).c_str(), strlen(_vm->_menuStringsPrefs[0]) + 8);
Common::strlcpy(_menuStringsPrefsTemp[1], Common::String::format(_vm->_menuStringsPrefs[1], _vm->_menuStringsOnOff[_vm->_configSounds ? 0 : 1]).c_str(), strlen(_vm->_menuStringsPrefs[1]) + 8);
Common::strlcpy(_menuStringsPrefsTemp[2], Common::String::format(_vm->_menuStringsPrefs[2], _vm->_menuStringsOnOff[_vm->_configHpBarGraphs ? 0 : 1]).c_str(), strlen(_vm->_menuStringsPrefs[2]) + 8);
Common::strlcpy(_menuStringsPrefsTemp[3], Common::String::format(_vm->_menuStringsPrefs[3], _vm->_menuStringsOnOff[_vm->_configMouse ? 0 : 1]).c_str(), strlen(_vm->_menuStringsPrefs[3]) + 8);
Common::strlcpy(_menuStringsPrefsTemp[3], Common::String::format(_vm->_menuStringsPrefs[3], _vm->gameFlags().platform == Common::kPlatformFMTowns ? _vm->_2431Strings[_vm->_config2431 ? 0 : 1] : _vm->_menuStringsOnOff[_vm->_configMouse ? 0 : 1]).c_str(), strlen(_vm->_menuStringsPrefs[3]) + 8);
}
const char *GUI_EoB::getMenuString(int id) {
@ -4010,12 +4248,12 @@ void GUI_EoB::setupSaveMenuSlots() {
for (int i = 0; i < 6; ++i) {
if (_savegameOffset + i < _savegameListSize) {
if (_savegameList[i + _savegameOffset]) {
Common::strlcpy(_saveSlotStringsTemp[i], _savegameList[i + _savegameOffset], 20);
Common::strlcpy(_saveSlotStringsTemp[i], _savegameList[i + _savegameOffset], 25);
_saveSlotIdTemp[i] = i + _savegameOffset;
continue;
}
}
Common::strlcpy(_saveSlotStringsTemp[i], _vm->_saveLoadStrings[1], 20);
Common::strlcpy(_saveSlotStringsTemp[i], _vm->_saveLoadStrings[1], 25);
_saveSlotIdTemp[i] = -1;
}
}
@ -4055,14 +4293,13 @@ void GUI_EoB::restParty_updateRestTime(int hours, bool init) {
_screen->printShadedText(getMenuString(42), (_screen->_curDim->sx + 1) << 3, _screen->_curDim->sy + 5, 9, 0);
}
_screen->setCurPage(2);
_screen->printShadedText(Common::String::format(_vm->_menuStringsRest2[3], hours).c_str(), (_screen->_curDim->sx + 1) << 3, _screen->_curDim->sy + 20, 15, _vm->guiSettings()->colors.fill);
_screen->setCurPage(0);
_screen->copyRegion(((_screen->_curDim->sx + 1) << 3) - 1, _screen->_curDim->sy + 20, ((_screen->_curDim->sx + 1) << 3) - 1, _screen->_curDim->sy + 20, 144, 8, 2, 0, Screen::CR_NO_P_CHECK);
_screen->set16bitShadingLevel(4);
_screen->fillRect((_screen->_curDim->sx + 1) << 3, _screen->_curDim->sy + 20, ((_screen->_curDim->sx + 19) << 3) + 1, _screen->_curDim->sy + 29, _vm->guiSettings()->colors.fill);
_screen->printShadedText(Common::String::format(_vm->_menuStringsRest2[3], hours).c_str(), (_screen->_curDim->sx + 1) << 3, _screen->_curDim->sy + 20, 15, _vm->guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
_screen->updateScreen();
_vm->delay(160);
_screen->setScreenDim(od);
_screen->setFont(of);
}

View File

@ -154,6 +154,13 @@ private:
static const EoBRect16 _highlightFrames[];
static const uint8 _highlightColorTableVGA[];
static const uint8 _highlightColorTableEGA[];
// FM-Towns specific
int checkKatakanaSelection();
void printKatakanaOptions(int page);
int _currentKanaPage;
char _csjis[3];
};
} // End of namespace Kyra

View File

@ -444,7 +444,7 @@ void EoBCoreEngine::printFullItemName(Item item) {
tmpString = (itm->flags & 0x40) ? nameId : nameUnid;
}
_txt->printMessage(tmpString.c_str());
_txt->printMessage(convertAsciiToSjis(tmpString).c_str());
}
void EoBCoreEngine::identifyQueuedItems(Item itemQueue) {

View File

@ -46,6 +46,7 @@ KyraRpgEngine::KyraRpgEngine(OSystem *system, const GameFlags &flags) : KyraEngi
_vcnTransitionMask = 0;
_vcnShift = 0;
_vcnColTable = 0;
_vcnBpp = flags.useHiColorMode ? 2 : 1;
_vmpPtr = 0;
_blockBrightness = _wllVcnOffset = 0;
_blockDrawingBuffer = 0;
@ -84,7 +85,7 @@ KyraRpgEngine::KyraRpgEngine(OSystem *system, const GameFlags &flags) : KyraEngi
_dscShapeX = 0;
_dscTileIndex = 0;
_dscUnk2 = 0;
_dscDoorScaleOffs = 0;
_dscDim1 = 0;
_dscDim2 = 0;
_dscBlockMap = 0;
@ -168,8 +169,9 @@ Common::Error KyraRpgEngine::init() {
_blockDrawingBuffer = new uint16[1320];
memset(_blockDrawingBuffer, 0, 1320 * sizeof(uint16));
_sceneWindowBuffer = new uint8[21120];
memset(_sceneWindowBuffer, 0, 21120);
int windowBufferSize = _flags.useHiColorMode ? 42240 : 21120;
_sceneWindowBuffer = new uint8[windowBufferSize];
memset(_sceneWindowBuffer, 0, windowBufferSize);
_lvlShapeTop = new int16[18];
memset(_lvlShapeTop, 0, 18 * sizeof(int16));
@ -187,7 +189,7 @@ Common::Error KyraRpgEngine::init() {
initStaticResource();
_envSfxDistThreshold = (_sound->getSfxType() == Sound::kAdLib || _sound->getSfxType() == Sound::kPCSpkr) ? 15 : 3;
_envSfxDistThreshold = (_flags.gameID == GI_EOB2 || _sound->getSfxType() == Sound::kAdLib || _sound->getSfxType() == Sound::kPCSpkr) ? 15 : 3;
_dialogueButtonLabelColor1 = guiSettings()->buttons.labelColor1;
_dialogueButtonLabelColor2 = guiSettings()->buttons.labelColor2;
@ -204,7 +206,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(_flags.lang == Common::JA_JPN && _flags.use16ColorMode ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
Screen::FontId of = screen()->setFont((_flags.lang == Common::JA_JPN && _flags.use16ColorMode) ? Screen::FID_SJIS_FNT : ((_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformFMTowns) ? Screen::FID_8_FNT : Screen::FID_6_FNT));
for (int i = 0; i < _dialogueNumButtons; i++) {
int x = _dialogueButtonPosX[i];
@ -213,8 +215,10 @@ void KyraRpgEngine::drawDialogueButtons() {
screen()->printText(_dialogueButtonString[i], (x + 37 - (screen()->getTextWidth(_dialogueButtonString[i])) / 2) & ~3,
((_dialogueButtonYoffs + _dialogueButtonPosY[i]) + 2) & ~7, _dialogueHighlightedButton == i ? 0xC1 : 0xE1, 0);
} else {
int sjisYOffset = (_flags.lang == Common::JA_JPN && (_dialogueButtonString[i][0] & 0x80)) ? 2 : 0;
int sjisYOffset = (_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformFMTowns) ? 1 : ((_flags.lang == Common::JA_JPN && (_dialogueButtonString[i][0] & 0x80)) ? 2 : 0);
screen()->set16bitShadingLevel(4);
gui_drawBox(x, (_dialogueButtonYoffs + _dialogueButtonPosY[i]), _dialogueButtonWidth, guiSettings()->buttons.height, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
screen()->set16bitShadingLevel(0);
screen()->printText(_dialogueButtonString[i], x + (_dialogueButtonWidth >> 1) - (screen()->getTextWidth(_dialogueButtonString[i])) / 2,
(_dialogueButtonYoffs + _dialogueButtonPosY[i]) + 2 - sjisYOffset, _dialogueHighlightedButton == i ? _dialogueButtonLabelColor1 : _dialogueButtonLabelColor2, 0);
}
@ -348,7 +352,7 @@ bool KyraRpgEngine::snd_processEnvironmentalSoundEffect(int soundId, int block)
}
_environmentSfx = soundId;
_environmentSfxVol = (15 - ((block || (_flags.gameID == GI_LOL && dist < 2)) ? dist : 0)) << 4;
_environmentSfxVol = (_flags.gameID == GI_EOB2 && _flags.platform == Common::kPlatformFMTowns) ? (dist ? (16 - dist) * 8 - 1 : 127) : ((15 - ((block || (_flags.gameID == GI_LOL && dist < 2)) ? dist : 0)) << 4);
return true;
}

View File

@ -227,6 +227,7 @@ protected:
uint8 *_vcnTransitionMask;
uint8 *_vcnShift;
uint8 *_vcnColTable;
uint8 _vcnBpp;
uint16 *_blockDrawingBuffer;
uint8 *_sceneWindowBuffer;
uint8 _blockBrightness;
@ -263,7 +264,7 @@ protected:
const int8 *_dscDim1;
const int8 *_dscDim2;
const int16 *_dscShapeX;
const uint8 *_dscUnk2;
const uint8 *_dscDoorScaleOffs;
const uint8 *_dscBlockMap;
const int8 *_dscBlockIndex;
const uint8 *_dscTileIndex;

View File

@ -378,21 +378,21 @@ void KyraEngine_v1::setupKeyMap() {
{ KC(KP1), 93, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(PAGEDOWN), 103, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(KP3), 103, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(F1), 112, 99, UNKNOWN_KEYCODE },
{ KC(F2), 113, 100, UNKNOWN_KEYCODE },
{ KC(F3), 114, 101, UNKNOWN_KEYCODE },
{ KC(F4), 115, 102, UNKNOWN_KEYCODE },
{ KC(F5), 116, 103, UNKNOWN_KEYCODE },
{ KC(F6), 117, 104, UNKNOWN_KEYCODE },
{ KC(F1), 112, 99, 93 },
{ KC(F2), 113, 100, 94 },
{ KC(F3), 114, 101, 95 },
{ KC(F4), 115, 102, 96 },
{ KC(F5), 116, 103, 97 },
{ KC(F6), 117, 104, 98 },
{ KC(a), 31, 31, UNKNOWN_KEYCODE },
{ KC(b), 50, 50, UNKNOWN_KEYCODE },
{ KC(b), 50, 50, 66 },
{ KC(c), 48, 48, 67 },
{ KC(d), 33, 33, UNKNOWN_KEYCODE },
{ KC(d), 33, 33, 68 },
{ KC(e), 19, 19, UNKNOWN_KEYCODE },
{ KC(f), 34, 34, UNKNOWN_KEYCODE },
{ KC(i), 24, 24, UNKNOWN_KEYCODE },
{ KC(k), 38, 38, UNKNOWN_KEYCODE },
{ KC(m), 52, 52, UNKNOWN_KEYCODE },
{ KC(f), 34, 34, 70 },
{ KC(i), 24, 24, 24 },
{ KC(k), 38, 38, 75 },
{ KC(m), 52, 52, 77 },
{ KC(n), 51, 51, UNKNOWN_KEYCODE },
{ KC(o), 25, 25, 79 },
{ KC(p), 26, 26, 80 },
@ -411,22 +411,22 @@ void KyraEngine_v1::setupKeyMap() {
{ KC(7), 8, UNKNOWN_KEYCODE, 55 },
{ KC(SLASH), 55, 55, 47 },
{ KC(ESCAPE), 110, 1, 27 },
{ KC(MINUS), 12, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(KP_MINUS), 105, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(PLUS), 13, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(KP_PLUS), 106, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(MINUS), 12, UNKNOWN_KEYCODE, 45 },
{ KC(KP_MINUS), 105, UNKNOWN_KEYCODE, 45 },
{ KC(PLUS), 13, UNKNOWN_KEYCODE, 43 },
{ KC(KP_PLUS), 106, UNKNOWN_KEYCODE, 43 },
// Multiple mappings for the keys to the right of the 'M' key,
// since these are different for QWERTZ, QWERTY and AZERTY keyboards.
// QWERTZ
{ KC(COMMA), 53, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(PERIOD), 54, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(COMMA), 53, UNKNOWN_KEYCODE, 60 },
{ KC(PERIOD), 54, UNKNOWN_KEYCODE, 62 },
// AZERTY
{ KC(SEMICOLON), 53, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(COLON), 54, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(SEMICOLON), 53, UNKNOWN_KEYCODE, 60 },
{ KC(COLON), 54, UNKNOWN_KEYCODE, 62 },
// QWERTY
{ KC(LESS), 53, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE },
{ KC(GREATER), 54, UNKNOWN_KEYCODE, UNKNOWN_KEYCODE }
{ KC(LESS), 53, UNKNOWN_KEYCODE, 60 },
{ KC(GREATER), 54, UNKNOWN_KEYCODE, 62 }
};
#undef KC
#undef UNKNOWN_KEYCODE

View File

@ -420,14 +420,14 @@ void EoBCoreEngine::sparkEffectDefensive(int charIndex) {
void EoBCoreEngine::sparkEffectOffensive() {
disableSysTimer(2);
_screen->copyRegion(0, 0, 0, 0, 176, 120, 0, 2, Screen::CR_NO_P_CHECK);
int sh = _flags.useHiColorMode ? 9 : 8;
for (int i = 0; i < 16; i++)
_screen->copyRegionToBuffer(0, _sparkEffectOfX[i], _sparkEffectOfY[i], 16, 16, &_spellAnimBuffer[i << 8]);
_screen->updateScreen();
_screen->copyRegionToBuffer(0, _sparkEffectOfX[i], _sparkEffectOfY[i], 16, 16, &_spellAnimBuffer[i << sh]);
for (int i = 0; i < 11; i++) {
for (int ii = 0; ii < 16; ii++)
_screen->copyBlockToPage(2, _sparkEffectOfX[ii], _sparkEffectOfY[ii], 16, 16, &_spellAnimBuffer[ii << 8]);
_screen->copyBlockToPage(2, _sparkEffectOfX[ii], _sparkEffectOfY[ii], 16, 16, &_spellAnimBuffer[ii << sh]);
for (int ii = 0; ii < 16; ii++) {
int shpIndex = (_sparkEffectOfFlags1[i] & _sparkEffectOfFlags2[ii]) >> _sparkEffectOfShift[ii];
@ -440,7 +440,7 @@ void EoBCoreEngine::sparkEffectOffensive() {
}
for (int i = 0; i < 16; i++)
_screen->copyBlockToPage(0, _sparkEffectOfX[i], _sparkEffectOfY[i], 16, 16, &_spellAnimBuffer[i << 8]);
_screen->copyBlockToPage(0, _sparkEffectOfX[i], _sparkEffectOfY[i], 16, 16, &_spellAnimBuffer[i << sh]);
_screen->updateScreen();
enableSysTimer(2);

View File

@ -120,6 +120,7 @@ MODULE_OBJS += \
script_eob.o \
sequences_eob.o \
sequences_darkmoon.o \
sound_towns_darkmoon.o \
sprites_eob.o \
staticres_eob.o \
timer_eob.o

View File

@ -255,7 +255,6 @@ enum KyraResources {
kRpgCommonDscShapeIndex,
kRpgCommonDscX,
kRpgCommonDscTileIndex,
kRpgCommonDscUnk2,
kRpgCommonDscDoorShapeIndex,
kRpgCommonDscDimData1,
kRpgCommonDscDimData2,
@ -266,6 +265,7 @@ enum KyraResources {
kRpgCommonDscDoorFrameY2,
kRpgCommonDscDoorFrameIndex1,
kRpgCommonDscDoorFrameIndex2,
kRpgCommonDscDoorScaleOffs,
kRpgCommonDscBlockIndex,
kEoBBaseChargenStrings1,
@ -400,7 +400,6 @@ enum KyraResources {
kEoBBaseWllFlagPreset,
kEoBBaseDscShapeCoords,
kEoBBaseDscDoorScaleOffs,
kEoBBaseDscDoorScaleMult1,
kEoBBaseDscDoorScaleMult2,
kEoBBaseDscDoorScaleMult3,
@ -554,6 +553,7 @@ enum KyraResources {
kEoB1Npc7Strings,
kEoB2MainMenuStrings,
kEoB2MainMenuUtilStrings,
kEoB2TransferPortraitFrames,
kEoB2TransferConvertTable,
@ -609,6 +609,7 @@ enum KyraResources {
kEoB2IntroAnimData41,
kEoB2IntroAnimData42,
kEoB2IntroAnimData43,
kEoB2IntroShapes00,
kEoB2IntroShapes01,
kEoB2IntroShapes04,
@ -660,6 +661,257 @@ enum KyraResources {
kEoB2WallOfForceNumH,
kEoB2WallOfForceShpId,
kEoB2IntroCpsDataStreet1,
kEoB2IntroCpsDataStreet2,
kEoB2IntroCpsDataDoorway1,
kEoB2IntroCpsDataDoorway2,
kEoB2IntroCpsDataWestwood,
kEoB2IntroCpsDataWinding,
kEoB2IntroCpsDataKhelban2,
kEoB2IntroCpsDataKhelban1,
kEoB2IntroCpsDataKhelban3,
kEoB2IntroCpsDataKhelban4,
kEoB2IntroCpsDataCoin,
kEoB2IntroCpsDataKhelban5,
kEoB2IntroCpsDataKhelban6,
kEoB2FinaleCpsDataDragon1,
kEoB2FinaleCpsDataDragon2,
kEoB2FinaleCpsDataHurry1,
kEoB2FinaleCpsDataHurry2,
kEoB2FinaleCpsDataDestroy0,
kEoB2FinaleCpsDataDestroy1,
kEoB2FinaleCpsDataDestroy2,
kEoB2FinaleCpsDataMagic,
kEoB2FinaleCpsDataDestroy3,
kEoB2FinaleCpsDataCredits2,
kEoB2FinaleCpsDataCredits3,
kEoB2FinaleCpsDataHeroes,
kEoB2FinaleCpsDataThanks,
kEoB2ItemIconShapeData00,
kEoB2ItemIconShapeData01,
kEoB2ItemIconShapeData02,
kEoB2ItemIconShapeData03,
kEoB2ItemIconShapeData04,
kEoB2ItemIconShapeData05,
kEoB2ItemIconShapeData06,
kEoB2ItemIconShapeData07,
kEoB2ItemIconShapeData08,
kEoB2ItemIconShapeData09,
kEoB2ItemIconShapeData10,
kEoB2ItemIconShapeData11,
kEoB2ItemIconShapeData12,
kEoB2ItemIconShapeData13,
kEoB2ItemIconShapeData14,
kEoB2ItemIconShapeData15,
kEoB2ItemIconShapeData16,
kEoB2ItemIconShapeData17,
kEoB2ItemIconShapeData18,
kEoB2ItemIconShapeData19,
kEoB2ItemIconShapeData20,
kEoB2ItemIconShapeData21,
kEoB2ItemIconShapeData22,
kEoB2ItemIconShapeData23,
kEoB2ItemIconShapeData24,
kEoB2ItemIconShapeData25,
kEoB2ItemIconShapeData26,
kEoB2ItemIconShapeData27,
kEoB2ItemIconShapeData28,
kEoB2ItemIconShapeData29,
kEoB2ItemIconShapeData30,
kEoB2ItemIconShapeData31,
kEoB2ItemIconShapeData32,
kEoB2ItemIconShapeData33,
kEoB2ItemIconShapeData34,
kEoB2ItemIconShapeData35,
kEoB2ItemIconShapeData36,
kEoB2ItemIconShapeData37,
kEoB2ItemIconShapeData38,
kEoB2ItemIconShapeData39,
kEoB2ItemIconShapeData40,
kEoB2ItemIconShapeData41,
kEoB2ItemIconShapeData42,
kEoB2ItemIconShapeData43,
kEoB2ItemIconShapeData44,
kEoB2ItemIconShapeData45,
kEoB2ItemIconShapeData46,
kEoB2ItemIconShapeData47,
kEoB2ItemIconShapeData48,
kEoB2ItemIconShapeData49,
kEoB2ItemIconShapeData50,
kEoB2ItemIconShapeData51,
kEoB2ItemIconShapeData52,
kEoB2ItemIconShapeData53,
kEoB2ItemIconShapeData54,
kEoB2ItemIconShapeData55,
kEoB2ItemIconShapeData56,
kEoB2ItemIconShapeData57,
kEoB2ItemIconShapeData58,
kEoB2ItemIconShapeData59,
kEoB2ItemIconShapeData60,
kEoB2ItemIconShapeData61,
kEoB2ItemIconShapeData62,
kEoB2ItemIconShapeData63,
kEoB2ItemIconShapeData64,
kEoB2ItemIconShapeData65,
kEoB2ItemIconShapeData66,
kEoB2ItemIconShapeData67,
kEoB2ItemIconShapeData68,
kEoB2ItemIconShapeData69,
kEoB2ItemIconShapeData70,
kEoB2ItemIconShapeData71,
kEoB2ItemIconShapeData72,
kEoB2ItemIconShapeData73,
kEoB2ItemIconShapeData74,
kEoB2ItemIconShapeData75,
kEoB2ItemIconShapeData76,
kEoB2ItemIconShapeData77,
kEoB2ItemIconShapeData78,
kEoB2ItemIconShapeData79,
kEoB2ItemIconShapeData80,
kEoB2ItemIconShapeData81,
kEoB2ItemIconShapeData82,
kEoB2ItemIconShapeData83,
kEoB2ItemIconShapeData84,
kEoB2ItemIconShapeData85,
kEoB2ItemIconShapeData86,
kEoB2ItemIconShapeData87,
kEoB2ItemIconShapeData88,
kEoB2ItemIconShapeData89,
kEoB2ItemIconShapeData90,
kEoB2ItemIconShapeData91,
kEoB2ItemIconShapeData92,
kEoB2ItemIconShapeData93,
kEoB2ItemIconShapeData94,
kEoB2ItemIconShapeData95,
kEoB2ItemIconShapeData96,
kEoB2ItemIconShapeData97,
kEoB2ItemIconShapeData98,
kEoB2ItemIconShapeData99,
kEoB2ItemIconShapeData100,
kEoB2ItemIconShapeData101,
kEoB2ItemIconShapeData102,
kEoB2ItemIconShapeData103,
kEoB2ItemIconShapeData104,
kEoB2ItemIconShapeData105,
kEoB2ItemIconShapeData106,
kEoB2ItemIconShapeData107,
kEoB2ItemIconShapeData108,
kEoB2ItemIconShapeData109,
kEoB2ItemIconShapeData110,
kEoB2ItemIconShapeData111,
kEoB2LargeItemsShapeData00,
kEoB2LargeItemsShapeData01,
kEoB2LargeItemsShapeData02,
kEoB2LargeItemsShapeData03,
kEoB2LargeItemsShapeData04,
kEoB2LargeItemsShapeData05,
kEoB2LargeItemsShapeData06,
kEoB2LargeItemsShapeData07,
kEoB2LargeItemsShapeData08,
kEoB2LargeItemsShapeData09,
kEoB2LargeItemsShapeData10,
kEoB2SmallItemsShapeData00,
kEoB2SmallItemsShapeData01,
kEoB2SmallItemsShapeData02,
kEoB2SmallItemsShapeData03,
kEoB2SmallItemsShapeData04,
kEoB2SmallItemsShapeData05,
kEoB2SmallItemsShapeData06,
kEoB2SmallItemsShapeData07,
kEoB2SmallItemsShapeData08,
kEoB2SmallItemsShapeData09,
kEoB2SmallItemsShapeData10,
kEoB2SmallItemsShapeData11,
kEoB2SmallItemsShapeData12,
kEoB2SmallItemsShapeData13,
kEoB2SmallItemsShapeData14,
kEoB2SmallItemsShapeData15,
kEoB2SmallItemsShapeData16,
kEoB2SmallItemsShapeData17,
kEoB2SmallItemsShapeData18,
kEoB2SmallItemsShapeData19,
kEoB2SmallItemsShapeData20,
kEoB2SmallItemsShapeData21,
kEoB2SmallItemsShapeData22,
kEoB2SmallItemsShapeData23,
kEoB2SmallItemsShapeData24,
kEoB2SmallItemsShapeData25,
kEoB2ThrownShapeData00,
kEoB2ThrownShapeData01,
kEoB2ThrownShapeData02,
kEoB2ThrownShapeData03,
kEoB2ThrownShapeData04,
kEoB2ThrownShapeData05,
kEoB2ThrownShapeData06,
kEoB2ThrownShapeData07,
kEoB2ThrownShapeData08,
kEoB2SpellShapeData00,
kEoB2SpellShapeData01,
kEoB2SpellShapeData02,
kEoB2SpellShapeData03,
kEoB2TeleporterShapeData00,
kEoB2TeleporterShapeData01,
kEoB2TeleporterShapeData02,
kEoB2TeleporterShapeData03,
kEoB2TeleporterShapeData04,
kEoB2TeleporterShapeData05,
kEoB2LightningColumnShapeData,
kEoB2DeadCharShapeData,
kEoB2DisabledCharGridShapeData,
kEoB2WeaponSlotGridShapeData,
kEoB2SmallGridShapeData,
kEoB2WideGridShapeData,
kEoB2RedSplatShapeData,
kEoB2GreenSplatShapeData,
kEoB2FirebeamShapeData00,
kEoB2FirebeamShapeData01,
kEoB2FirebeamShapeData02,
kEoB2SparkShapeData00,
kEoB2SparkShapeData01,
kEoB2SparkShapeData02,
kEoB2CompassShapeData00,
kEoB2CompassShapeData01,
kEoB2CompassShapeData02,
kEoB2CompassShapeData03,
kEoB2CompassShapeData04,
kEoB2CompassShapeData05,
kEoB2CompassShapeData06,
kEoB2CompassShapeData07,
kEoB2CompassShapeData08,
kEoB2CompassShapeData09,
kEoB2CompassShapeData10,
kEoB2CompassShapeData11,
kEoB2WallOfForceShapeData00,
kEoB2WallOfForceShapeData01,
kEoB2WallOfForceShapeData02,
kEoB2WallOfForceShapeData03,
kEoB2WallOfForceShapeData04,
kEoB2WallOfForceShapeData05,
kEoB2UtilMenuStrings,
kEoB2Config2431Strings,
kEoB2KatakanaLines,
kEoB2KanaSelectStrings,
kEoB2FontDmpSearchTbl,
kEoB2Ascii2SjisTables,
kEoB2Ascii2SjisTables2,
kEoB2SaveNamePatterns,
kEoB2PcmSoundEffectsIngame,
kEoB2PcmSoundEffectsIntro,
kEoB2PcmSoundEffectsFinale,
kLoLIngamePakFiles,
kLoLCharacterDefs,
kLoLIngameSfxFiles,

View File

@ -29,7 +29,7 @@
#include "graphics/thumbnail.h"
#include "graphics/surface.h"
#define CURRENT_SAVE_VERSION 17
#define CURRENT_SAVE_VERSION 18
#define GF_FLOPPY (1 << 0)
#define GF_TALKIE (1 << 1)

View File

@ -38,6 +38,7 @@ namespace Kyra {
Common::Error EoBCoreEngine::loadGameState(int slot) {
// Special slot id -1 for EOB1 party transfer
const char *fileName = (slot == -1) ? _savegameFilename.c_str() : getSavegameFilename(slot);
setHandItem(-1);
SaveHeader header;
Common::InSaveFile *saveFile = openSaveForReading(fileName, header, (slot != -1));
@ -54,7 +55,7 @@ Common::Error EoBCoreEngine::loadGameState(int slot) {
EoBCharacter *c = &_characters[i];
c->id = in.readByte();
c->flags = in.readByte();
in.read(c->name, 11);
in.read(c->name, (header.version < 18) ? 11 : 21);
c->strengthCur = in.readSByte();
c->strengthMax = in.readSByte();
c->strengthExtCur = in.readSByte();
@ -273,6 +274,9 @@ Common::Error EoBCoreEngine::loadGameState(int slot) {
}
loadLevel(_currentLevel, _currentSub);
if (_flags.platform == Common::kPlatformFMTowns && _gameToLoad != -1)
_screen->setScreenPalette(_screen->getPalette(0));
_sceneUpdateRequired = true;
_screen->setFont(Screen::FID_6_FNT);
@ -283,6 +287,9 @@ Common::Error EoBCoreEngine::loadGameState(int slot) {
}
}
if (!_updateFlags)
_screen->fillRect(64, 121, 175, 176, 0, 2);
_screen->setCurPage(0);
gui_drawPlayField(false);
@ -316,6 +323,7 @@ Common::Error EoBCoreEngine::loadGameState(int slot) {
Common::Error EoBCoreEngine::saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail) {
Common::String saveNameTmp;
const char *fileName = 0;
setHandItem(-1);
// Special slot id -1 to create final save for party transfer
if (slot == -1) {
@ -345,7 +353,7 @@ Common::Error EoBCoreEngine::saveGameStateIntern(int slot, const char *saveName,
out->writeByte(c->id);
out->writeByte(c->flags);
out->write(c->name, 11);
out->write(c->name, 21);
out->writeSByte(c->strengthCur);
out->writeSByte(c->strengthMax);
out->writeSByte(c->strengthExtCur);
@ -525,6 +533,8 @@ Common::Error EoBCoreEngine::saveGameStateIntern(int slot, const char *saveName,
_gui->notifyUpdateSaveSlotsList();
setHandItem(_itemInHand);
return Common::kNoError;
}
@ -636,13 +646,27 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
Common::SeekableSubReadStreamEndian in(fs, 0, fs->size(), _flags.platform == Common::kPlatformAmiga, DisposeAfterUse::YES);
// detect source platform
Common::Platform sourcePlatform = Common::kPlatformDOS;
in.seek(32);
uint16 testSJIS = in.readByte();
in.seek(53);
int8 testStr = in.readSByte();
in.seek(66);
int8 testChr = in.readSByte();
in.seek(0);
if (testStr >= 0 && testStr <= 25 && testChr >= 0 && testChr <= 25) {
if (testSJIS >= 0xE0 || (testSJIS > 0x80 && testSJIS < 0xA0))
sourcePlatform = Common::kPlatformFMTowns;
}
if (_flags.gameID == GI_EOB1) {
// Nothing to read here for EOB 1. Original EOB 1 has
// only one save slot without save file description.
desc = "<IMPORTED GAME>";
} else {
char tempStr[20];
in.read(tempStr, 20);
char tempStr[30];
in.read(tempStr, sourcePlatform == Common::kPlatformFMTowns ? 30 : 20);
desc = tempStr;
}
@ -650,7 +674,9 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
EoBCharacter *c = &_characters[i];
c->id = in.readByte();
c->flags = in.readByte();
in.read(c->name, 11);
in.read(c->name, sourcePlatform == Common::kPlatformFMTowns ? 21 : 11);
if (_flags.platform != sourcePlatform)
c->name[10] = '\0';
c->strengthCur = in.readSByte();
c->strengthMax = in.readSByte();
c->strengthExtCur = in.readSByte();
@ -696,7 +722,7 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
c->effectFlags = in.readUint32();
if (c->effectFlags && _flags.gameID == GI_EOB1) {
// Spell effect flags are completely different in EOB I. We only use EOB II style flags in ScummVM.
// Doesn't matter much, since these are the temporary spell effects only anyway.
// Doesn't matter much, since these are only temporary spell effects.
warning("EoBCoreEngine::readOriginalSaveFile(): Unhandled character effect flags encountered in original EOB1 save file '%s' ('%s')", file.c_str(), desc.c_str());
c->effectFlags = 0;
}
@ -716,7 +742,7 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
_partyEffectFlags = (_flags.gameID == GI_EOB1) ? in.readUint16() : in.readUint32();
if (_partyEffectFlags && _flags.gameID == GI_EOB1) {
// Spell effect flags are completely different in EOB I. We only use EOB II style flags in ScummVM.
// Doesn't matter much, since these are the temporary spell effects only anyway.
// Doesn't matter much, since these are only temporary spell effects.
warning("EoBCoreEngine::readOriginalSaveFile(): Unhandled party effect flags encountered in original EOB1 save file '%s' ('%s')", file.c_str(), desc.c_str());
_partyEffectFlags = 0;
}
@ -742,7 +768,7 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
}
int numParts = (_flags.gameID == GI_EOB1) ? 12 : 17;
int partSize = (_flags.gameID == GI_EOB1) ? 2040 : 2130;
int partSize = (sourcePlatform == Common::kPlatformFMTowns) ? 5030 : (_flags.gameID == GI_EOB1 ? 2040 : 2130);
uint32 nextPart = in.pos();
uint8 *cmpData = new uint8[1200];
@ -777,8 +803,12 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
memset(lw, 0, 5 * sizeof(WallOfForce));
l->wallsOfForce = lw;
if (sourcePlatform == Common::kPlatformFMTowns) {
in.read(l->wallsXorData, 4096);
} else {
in.read(cmpData, 1200);
_screen->decodeFrame4(cmpData, l->wallsXorData, 4096);
}
_curBlockFile = getBlockFileName(i + 1, 0);
const uint8 *p = getBlockFileData();
uint16 len = READ_LE_UINT16(p + 4);
@ -790,6 +820,9 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
*d++ ^= p[ii * len + iii];
}
if (sourcePlatform == Common::kPlatformFMTowns)
in.skip(4);
for (int ii = 0; ii < 30; ii++) {
EoBMonsterInPlay *m = &lm[ii];
m->type = in.readByte();
@ -998,8 +1031,8 @@ bool EoBCoreEngine::saveAsOriginalSaveFile(int slot) {
Common::OutSaveFile *out = new Common::OutSaveFile(nf.createWriteStream());
if (_flags.gameID == GI_EOB2) {
static const char tempStr[20] = "SCUMMVM EXPORT ";
out->write(tempStr, 20);
static const char tempStr[31] = "SCUMMVM EXPORT ";
out->write(tempStr, (_flags.platform == Common::kPlatformFMTowns) ? 30 : 20);
}
completeDoorOperations();
@ -1014,7 +1047,7 @@ bool EoBCoreEngine::saveAsOriginalSaveFile(int slot) {
EoBCharacter *c = &_characters[i];
out->writeByte(c->id);
out->writeByte(c->flags);
out->write(c->name, 11);
out->write(c->name, (_flags.platform == Common::kPlatformFMTowns) ? 21 : 11);
out->writeSByte(c->strengthCur);
out->writeSByte(c->strengthMax);
out->writeSByte(c->strengthExtCur);
@ -1110,13 +1143,14 @@ bool EoBCoreEngine::saveAsOriginalSaveFile(int slot) {
}
int numParts = (_flags.gameID == GI_EOB1) ? 12 : 17;
int partSize = (_flags.gameID == GI_EOB1) ? 2040 : 2130;
uint8 *tempData = new uint8[4096];
int partSize = (_flags.platform == Common::kPlatformFMTowns) ? 5030 :(_flags.gameID == GI_EOB1) ? 2040 : 2130;
uint8 *tempData = new uint8[5030];
uint8 *cmpData = new uint8[1200];
for (int i = 0; i < numParts; i++) {
LevelTempData *l = _lvlTempData[i];
memset(tempData, 0, 4096);
memset(tempData, 0, 5030);
memset(cmpData, 0, 1200);
if (!l || !(_hasTempDataFlags & (1 << i))) {
@ -1135,11 +1169,18 @@ bool EoBCoreEngine::saveAsOriginalSaveFile(int slot) {
*d++ = l->wallsXorData[ii * len + iii] ^ p[ii * len + iii];
}
if (_flags.platform == Common::kPlatformFMTowns) {
out->write(tempData, 4096);
} else {
uint32 outsize = encodeFrame4(tempData, cmpData, 4096);
if (outsize > 1200)
error("Map compression failure: size of map = %d", outsize);
out->write(cmpData, 1200);
}
if (_flags.platform == Common::kPlatformFMTowns)
out->writeUint32BE(0);
for (int ii = 0; ii < 30; ii++) {
EoBMonsterInPlay *m = &((EoBMonsterInPlay*)l->monsters)[ii];

View File

@ -36,6 +36,8 @@ namespace Kyra {
void EoBCoreEngine::loadLevel(int level, int sub) {
_currentLevel = level;
_currentSub = sub;
if (!_loading)
setHandItem(-1);
uint32 end = _system->getMillis() + 500;
readLevelFileData(level);
@ -99,12 +101,13 @@ void EoBCoreEngine::loadLevel(int level, int sub) {
_sceneDrawPage1 = 2;
_sceneDrawPage2 = 1;
_screen->setCurPage(0);
setHandItem(_itemInHand);
}
void EoBCoreEngine::readLevelFileData(int level) {
Common::String file;
Common::SeekableReadStream *s = 0;
static const char *const suffix[] = { "INF", "DRO", "ELO", 0 };
static const char *const suffix[] = { "INF", "DRO", "ELO", "JOT", 0 };
for (const char *const *sf = suffix; *sf && !s; sf++) {
file = Common::String::format("LEVEL%d.%s", level, *sf);
@ -112,7 +115,7 @@ void EoBCoreEngine::readLevelFileData(int level) {
}
if (!s)
error("Failed to load level file LEVEL%d.INF/DRO/ELO", level);
error("Failed to load level file LEVEL%d.INF/DRO/ELO/JOT", level);
if (s->readUint16LE() + 2 == s->size()) {
if (s->readUint16LE() == 4) {
@ -148,7 +151,7 @@ Common::String EoBCoreEngine::initLevelData(int sub) {
const char *vmpPattern = (_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.EMP" : "%s.VMP";
Common::SeekableReadStream *s = _res->createReadStream(Common::String::format(vmpPattern, (const char *)pos));
uint16 size = s->readUint16LE();
uint16 size = (_flags.platform == Common::kPlatformFMTowns) ? 2916 : s->readUint16LE();
delete[] _vmpPtr;
_vmpPtr = new uint16[size];
for (int i = 0; i < size; i++)
@ -175,7 +178,15 @@ Common::String EoBCoreEngine::initLevelData(int sub) {
if (_flags.gameID == GI_EOB2 || _configRenderMode != Common::kRenderEGA)
_screen->loadPalette(tmpStr.c_str(), _screen->getPalette(0));
if (_configRenderMode != Common::kRenderCGA) {
if (_flags.platform == Common::kPlatformFMTowns) {
uint16 *src = (uint16*)_screen->getPalette(0).getData();
_screen->createFadeTable16bit(src, (uint16*)_greenFadingTable, 4, 75);
_screen->createFadeTable16bit(src, (uint16*)_blackFadingTable, 12, 200);
_screen->createFadeTable16bit(src, (uint16*)_blueFadingTable, 10, 85);
_screen->createFadeTable16bit(src, (uint16*)_lightBlueFadingTable, 11, 125);
_screen->createFadeTable16bit(src, (uint16*)_greyFadingTable, 0, 85);
_screen->setScreenPalette(_screen->getPalette(0));
} else if (_configRenderMode != Common::kRenderCGA) {
Palette backupPal(256);
backupPal.copy(_screen->getPalette(0), 224, 32, 224);
_screen->getPalette(0).fill(224, 32, 0x3F);
@ -283,7 +294,14 @@ void EoBCoreEngine::loadVcnData(const char *file, const uint8 *cgaMapping) {
if (file)
strcpy(_lastBlockDataFile, file);
const char *filePattern = (_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.ECN" : "%s.VCN";
if (_flags.platform == Common::kPlatformFMTowns) {
uint32 size;
delete[] _vcnBlocks;
_vcnBlocks = _res->fileData(Common::String::format("%s.VCC", _lastBlockDataFile).c_str(), &size);
return;
}
const char *filePattern = ((_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.ECN" : "%s.VCN");
_screen->loadBitmap(Common::String::format(filePattern, _lastBlockDataFile).c_str(), 3, 3, 0);
const uint8 *pos = _screen->getCPagePtr(3);

View File

@ -1425,7 +1425,7 @@ void LoLEngine::drawSceneShapes(int) {
if (!(w & 8))
continue;
uint16 v = 20 * (s - (s < 23 ? _dscUnk2[s] : 0));
uint16 v = 20 * (s - (s < 23 ? _dscDoorScaleOffs[s] : 0));
if (v > 80)
v = 80;

View File

@ -348,6 +348,7 @@ bool KyraRpgEngine::checkSceneUpdateNeed(int block) {
void KyraRpgEngine::drawVcnBlocks() {
uint8 *d = _sceneWindowBuffer;
uint16 *bdb = _blockDrawingBuffer;
uint16 *hiColorPal = screen()->get16bitPalette();
for (int y = 0; y < 15; y++) {
for (int x = 0; x < 22; x++) {
@ -369,9 +370,9 @@ void KyraRpgEngine::drawVcnBlocks() {
vcnOffset &= 0x3FFF;
}
uint8 *src = 0;
const uint8 *src = 0;
if (vcnOffset) {
src = &_vcnBlocks[vcnOffset << 5];
src = &_vcnBlocks[vcnOffset << (4 + _vcnBpp)];
wllVcnOffset = _wllVcnOffset;
} else {
// floor/ceiling blocks
@ -381,36 +382,46 @@ void KyraRpgEngine::drawVcnBlocks() {
vcnOffset &= 0x3FFF;
}
src = (_vcfBlocks ? _vcfBlocks : _vcnBlocks) + (vcnOffset << 5);
src = (_vcfBlocks ? _vcfBlocks : _vcnBlocks) + (vcnOffset << (4 + _vcnBpp));
}
uint8 shift = _vcnShift ? _vcnShift[vcnOffset] : _blockBrightness;
if (horizontalFlip) {
for (int blockY = 0; blockY < 8; blockY++) {
src += 3;
for (int blockX = 0; blockX < 4; blockX++) {
src += ((_vcnBpp << 2) - 1);
for (int blockX = 0; blockX < 4 * _vcnBpp; blockX++) {
if (_vcnBpp == 2) {
*(uint16*)d = hiColorPal[*src--];
d += 2;
} else {
uint8 bl = *src--;
*d++ = _vcnColTable[((bl & 0x0F) + wllVcnOffset) | shift];
*d++ = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift];
}
src += 5;
d += 168;
}
src += ((_vcnBpp << 2) + 1);
d += 168 * _vcnBpp;
}
} else {
for (int blockY = 0; blockY < 8; blockY++) {
for (int blockX = 0; blockX < 4; blockX++) {
for (int blockX = 0; blockX < 4 * _vcnBpp; blockX++) {
if (_vcnBpp == 2) {
*(uint16*)d = hiColorPal[*src++];
d += 2;
} else {
uint8 bl = *src++;
*d++ = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift];
*d++ = _vcnColTable[((bl & 0x0F) + wllVcnOffset) | shift];
}
d += 168;
}
d += 168 * _vcnBpp;
}
}
d -= 1400;
d -= 1400 * _vcnBpp;
if (vcnExtraOffsetWll) {
d -= 8;
d -= 8 * _vcnBpp;
horizontalFlip = false;
if (vcnExtraOffsetWll & 0x4000) {
@ -419,14 +430,20 @@ void KyraRpgEngine::drawVcnBlocks() {
}
shift = _vcnShift ? _vcnShift[vcnExtraOffsetWll] : _blockBrightness;
src = &_vcnBlocks[vcnExtraOffsetWll << 5];
src = &_vcnBlocks[vcnExtraOffsetWll << (4 + _vcnBpp)];
uint8 *maskTable = _vcnTransitionMask ? &_vcnTransitionMask[vcnExtraOffsetWll << 5] : 0;
if (horizontalFlip) {
for (int blockY = 0; blockY < 8; blockY++) {
src += 3;
src += ((_vcnBpp << 2) - 1);
maskTable += 3;
for (int blockX = 0; blockX < 4; blockX++) {
for (int blockX = 0; blockX < 4 * _vcnBpp; blockX++) {
if (_vcnBpp == 2) {
uint8 bl = *src--;
if (bl)
*(uint16*)d = hiColorPal[bl];
d += 2;
} else {
uint8 bl = *src--;
uint8 mask = _vcnTransitionMask ? *maskTable-- : 0;
uint8 h = _vcnColTable[((bl & 0x0F) + wllVcnRmdOffset) | shift];
@ -444,13 +461,20 @@ void KyraRpgEngine::drawVcnBlocks() {
*d = l;
d++;
}
src += 5;
}
src += ((_vcnBpp << 2) + 1);
maskTable += 5;
d += 168;
d += 168 * _vcnBpp;
}
} else {
for (int blockY = 0; blockY < 8; blockY++) {
for (int blockX = 0; blockX < 4; blockX++) {
for (int blockX = 0; blockX < 4 * _vcnBpp; blockX++) {
if (_vcnBpp == 2) {
uint8 bl = *src++;
if (bl)
*(uint16*)d = hiColorPal[bl];
d += 2;
} else {
uint8 bl = *src++;
uint8 mask = _vcnTransitionMask ? *maskTable++ : 0;
uint8 h = _vcnColTable[((bl >> 4) + wllVcnRmdOffset) | shift];
@ -468,13 +492,14 @@ void KyraRpgEngine::drawVcnBlocks() {
*d = l;
d++;
}
d += 168;
}
d += 168 * _vcnBpp;
}
}
d -= 1400;
d -= 1400 * _vcnBpp;
}
}
d += 1232;
d += 1232 * _vcnBpp;
}
screen()->copyBlockToPage(_sceneDrawPage1, _sceneXoffset, 0, 176, 120, _sceneWindowBuffer);

View File

@ -739,10 +739,13 @@ void Screen::copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc,
}
}
uint8 Screen::getPagePixel(int pageNum, int x, int y) {
int Screen::getPagePixel(int pageNum, int x, int y) {
assert(pageNum < SCREEN_PAGE_NUM);
assert(x >= 0 && x < SCREEN_W && y >= 0 && y < SCREEN_H);
if (_bytesPerPixel == 1)
return _pagePtrs[pageNum][y * SCREEN_W + x];
else
return ((uint16*)_pagePtrs[pageNum])[y * SCREEN_W + x];
}
void Screen::setPagePixel(int pageNum, int x, int y, uint8 color) {
@ -762,7 +765,7 @@ void Screen::setPagePixel(int pageNum, int x, int y, uint8 color) {
}
if (_bytesPerPixel == 2) {
*(uint16*)(&_pagePtrs[pageNum][y * SCREEN_W * 2 + x * 2]) = _16bitPalette[color];
((uint16*)_pagePtrs[pageNum])[y * SCREEN_W + x] = _16bitPalette[color];
} else {
_pagePtrs[pageNum][y * SCREEN_W + x] = color;
}
@ -781,12 +784,12 @@ void Screen::fadeToBlack(int delay, const UpdateFunctor *upFunc) {
}
void Screen::fadePalette(const Palette &pal, int delay, const UpdateFunctor *upFunc) {
if (_renderMode == Common::kRenderEGA)
if (_renderMode == Common::kRenderEGA || _bytesPerPixel == 2)
setScreenPalette(pal);
updateScreen();
if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderEGA)
if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderEGA || _bytesPerPixel == 2)
return;
int diff = 0, delayInc = 0;
@ -1056,7 +1059,7 @@ void Screen::copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPag
void Screen::copyRegionToBuffer(int pageNum, int x, int y, int w, int h, uint8 *dest) {
if (y < 0) {
dest += (-y) * w;
dest += (-y) * w * _bytesPerPixel;
h += y;
y = 0;
} else if (y + h > SCREEN_H) {
@ -1064,7 +1067,7 @@ void Screen::copyRegionToBuffer(int pageNum, int x, int y, int w, int h, uint8 *
}
if (x < 0) {
dest += -x;
dest += -x * _bytesPerPixel;
w += x;
x = 0;
} else if (x + w > SCREEN_W) {
@ -1093,7 +1096,7 @@ void Screen::copyPage(uint8 srcPage, uint8 dstPage) {
void Screen::copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint8 *src) {
if (y < 0) {
src += (-y) * w;
src += (-y) * w * _bytesPerPixel;
h += y;
y = 0;
} else if (y + h > SCREEN_H) {
@ -1101,7 +1104,7 @@ void Screen::copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint
}
if (x < 0) {
src += -x;
src += -x * _bytesPerPixel;
w += x;
x = 0;
} else if (x + w > SCREEN_W) {
@ -1398,7 +1401,7 @@ int Screen::getFontWidth() const {
int Screen::getCharWidth(uint16 c) const {
const int width = _fonts[_currentFont]->getCharWidth(c);
return width + ((_currentFont != FID_SJIS_FNT) ? _charWidth : 0);
return width + ((_currentFont != FID_SJIS_FNT && _currentFont != FID_SJIS_LARGE_FNT && _currentFont != FID_SJIS_SMALL_FNT) ? _charWidth : 0);
}
int Screen::getTextWidth(const char *str) {
@ -1408,8 +1411,8 @@ int Screen::getTextWidth(const char *str) {
FontId curFont = _currentFont;
while (1) {
if (_sjisMixedFontMode)
setFont((*str & 0x80) ? FID_SJIS_FNT : curFont);
if (_sjisMixedFontMode && curFont != FID_SJIS_FNT && curFont != FID_SJIS_LARGE_FNT && curFont != FID_SJIS_SMALL_FNT)
setFont((*str & 0x80) ? ((_vm->game() == GI_EOB2 && curFont == FID_6_FNT) ? FID_SJIS_SMALL_FNT : FID_SJIS_FNT) : curFont);
uint c = fetchChar(str);
@ -1455,8 +1458,8 @@ void Screen::printText(const char *str, int x, int y, uint8 color1, uint8 color2
return;
while (1) {
if (_sjisMixedFontMode)
setFont((*str & 0x80) ? FID_SJIS_FNT : curFont);
if (_sjisMixedFontMode && curFont != FID_SJIS_FNT && curFont != FID_SJIS_LARGE_FNT && curFont != FID_SJIS_SMALL_FNT)
setFont((*str & 0x80) ? ((_vm->game() == GI_EOB2 && curFont == FID_6_FNT) ? FID_SJIS_SMALL_FNT : FID_SJIS_FNT) : curFont);
uint8 charHeightFnt = getFontHeight();
@ -1483,7 +1486,7 @@ void Screen::printText(const char *str, int x, int y, uint8 color1, uint8 color2
}
uint16 Screen::fetchChar(const char *&s) const {
if (_currentFont != FID_SJIS_FNT)
if (_currentFont != FID_SJIS_FNT && _currentFont != FID_SJIS_LARGE_FNT && _currentFont != FID_SJIS_SMALL_FNT)
return (uint8)*s++;
uint16 ch = (uint8)*s++;
@ -1515,7 +1518,7 @@ void Screen::drawChar(uint16 c, int x, int y) {
return;
}
int bpp = (_currentFont == Screen::FID_SJIS_FNT) ? 1 : 2;
int bpp = (_currentFont == Screen::FID_SJIS_FNT || _currentFont == Screen::FID_SJIS_SMALL_FNT) ? 1 : 2;
destPage += (y * 2) * 640 * bpp + (x * 2 * bpp);
fnt->drawChar(c, destPage, 640, bpp);
@ -3472,7 +3475,7 @@ void Screen::copyOverlayRegion(int x, int y, int x2, int y2, int w, int h, int s
while (h--) {
for (x = 0; x < w; ++x)
memcpy(dst, src, w);
memmove(dst, src, w);
dst += 640;
src += 640;
}
@ -3486,7 +3489,7 @@ void Screen::crossFadeRegion(int x1, int y1, int x2, int y2, int w, int h, int s
hideMouse();
uint16 *wB = (uint16 *)_pagePtrs[14];
uint8 *hB = _pagePtrs[14] + 640;
uint8 *hB = _pagePtrs[14] + 640 * _bytesPerPixel;
for (int i = 0; i < w; i++)
wB[i] = i;
@ -3515,6 +3518,9 @@ void Screen::crossFadeRegion(int x1, int y1, int x2, int y2, int w, int h, int s
if (++iH >= h)
iH = 0;
if (_bytesPerPixel == 2)
((uint16*)d)[dY * 320 + dX] = ((uint16*)s)[sY * 320 + sX];
else
d[dY * 320 + dX] = s[sY * 320 + sX];
addDirtyRect(dX, dY, 1, 1);
}
@ -3815,16 +3821,6 @@ void SJISFont::drawChar(uint16 c, byte *dst, int pitch, int) const {
_font->drawChar(dst, c, 640, 1, color1, color2, 640, 400);
}
SJISFontLarge::SJISFontLarge(Graphics::FontSJIS *font) : SJISFont(font, 0, false, false, false, 0) {
_sjisWidth = _font->getMaxFontWidth();
_fontHeight = _font->getFontHeight();
_asciiWidth = _font->getCharWidth('a');
}
void SJISFontLarge::drawChar(uint16 c, byte *dst, int pitch) const {
_font->drawChar(dst, c, 320, 1, _colorMap[1], _colorMap[0], 320, 200);
}
#pragma mark -
Palette::Palette(const int numColors) : _palData(0), _numColors(numColors) {

View File

@ -145,10 +145,10 @@ private:
#ifdef ENABLE_EOB
/**
* Implementation of the Font interface for old DOS fonts used
* in EOB and EOB II.
*
*/
* Implementation of the Font interface for old DOS fonts used
* in EOB and EOB II.
*
*/
class OldDOSFont : public Font {
public:
OldDOSFont(Common::RenderMode mode);
@ -249,18 +249,6 @@ private:
const int _sjisWidthOffset;
};
/**
* SJISFont 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
*/
class SJISFontLarge : public SJISFont {
public:
SJISFontLarge(Graphics::FontSJIS *font);
virtual ~SJISFontLarge() { unload(); }
virtual bool usesOverlay() const { return false; }
virtual void drawChar(uint16 c, byte *dst, int pitch) const;
};
/**
* A class that manages KYRA palettes.
*
@ -426,6 +414,7 @@ public:
FID_INTRO_FNT,
FID_SJIS_FNT,
FID_SJIS_LARGE_FNT,
FID_SJIS_SMALL_FNT,
FID_NUM
};
@ -466,7 +455,7 @@ public:
void clearPage(int pageNum);
uint8 getPagePixel(int pageNum, int x, int y);
int getPagePixel(int pageNum, int x, int y);
void setPagePixel(int pageNum, int x, int y, uint8 color);
const uint8 *getCPagePtr(int pageNum) const;
@ -499,7 +488,7 @@ public:
void drawBox(int x1, int y1, int x2, int y2, int color);
// font/text handling
bool loadFont(FontId fontId, const char *filename);
virtual bool loadFont(FontId fontId, const char *filename);
FontId setFont(FontId fontId);
int getFontHeight() const;
@ -584,6 +573,7 @@ public:
// RPG specific, this does not belong here
void crossFadeRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage);
uint16 *get16bitPalette() { return _16bitPalette; }
void set16bitShadingLevel(int lvl) { _16bitShadingLevel = lvl; }
protected:

View File

@ -34,6 +34,7 @@
#include "graphics/cursorman.h"
#include "graphics/palette.h"
#include "graphics/sjis.h"
namespace Kyra {
@ -46,7 +47,7 @@ Screen_EoB::Screen_EoB(EoBCoreEngine *vm, OSystem *system) : Screen(vm, system,
_gfxX = _gfxY = 0;
_gfxCol = 0;
_dsTempPage = 0;
_convertHiColorBuffer = 0;
_shpBuffer = _convertHiColorBuffer = 0;
_dsDiv = 0;
_dsRem = 0;
_dsScaleTrans = 0;
@ -61,6 +62,7 @@ Screen_EoB::Screen_EoB(EoBCoreEngine *vm, OSystem *system) : Screen(vm, system,
Screen_EoB::~Screen_EoB() {
delete[] _dsTempPage;
delete[] _shpBuffer;
delete[] _convertHiColorBuffer;
delete[] _cgaScaleTable;
delete[] _egaDitheringTable;
@ -73,12 +75,21 @@ bool Screen_EoB::init() {
if (Screen::init()) {
int temp;
_gfxMaxY = _vm->staticres()->loadRawData(kEoBBaseExpObjectY, temp);
_dsTempPage = new uint8[12000];
if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
_shpBuffer = new uint8[SCREEN_H * SCREEN_W];
_convertHiColorBuffer = new uint8[SCREEN_H * SCREEN_W];
enableHiColorMode(true);
Graphics::FontSJIS *font = Graphics::FontSJIS::createFont(Common::kPlatformFMTowns);
if (!font)
error("Could not load any SJIS font, neither the original nor ScummVM's 'SJIS.FNT'");
_fonts[FID_SJIS_LARGE_FNT] = new SJISFontLarge(font);
loadFont(FID_SJIS_SMALL_FNT, "FONT.DMP");
}
if (_vm->gameFlags().useHiRes && _renderMode == Common::kRenderEGA) {
_useHiResEGADithering = true;
_egaDitheringTable = new uint8[256];
@ -124,19 +135,28 @@ void Screen_EoB::setMouseCursor(int x, int y, const byte *shape, const uint8 *ov
int mouseH = (shape[3]);
int colorKey = (_renderMode == Common::kRenderCGA) ? 0 : _cursorColorKey;
int scaleFactor = _useHiResEGADithering ? 2 : 1;
int scaleFactor = _vm->gameFlags().useHiRes ? 2 : 1;
int bpp = _useHiColorScreen ? 2 : 1;
uint8 *cursor = new uint8[mouseW * scaleFactor * bpp * mouseH * scaleFactor];
// We use memset and copyBlockToPage instead of fillRect to make sure that the
// color key 0xFF doesn't get converted into EGA color
if (_bytesPerPixel == 2) {
colorKey = _16bitPalette[colorKey];
for (int s = mouseW * scaleFactor * bpp * mouseH * scaleFactor; s; s -= 2)
*(uint16*)(cursor + s - 2) = colorKey;
} else {
// We don't use fillRect here to make sure that the color key 0xFF doesn't get converted into EGA color
memset(cursor, colorKey, mouseW * scaleFactor * bpp * mouseH * scaleFactor);
}
copyBlockToPage(6, 0, 0, mouseW * scaleFactor, mouseH * scaleFactor, cursor);
drawShape(6, shape, 0, 0, 0, 2, ovl);
CursorMan.showMouse(false);
if (_useHiResEGADithering)
ditherRect(getCPagePtr(6), cursor, mouseW * scaleFactor, mouseW, mouseH, colorKey);
else if (_vm->gameFlags().useHiRes)
scale2x(cursor, mouseW * scaleFactor, getCPagePtr(6), SCREEN_W, mouseW, mouseH);
else
copyRegionToBuffer(6, 0, 0, mouseW, mouseH, cursor);
@ -185,9 +205,13 @@ void Screen_EoB::loadFileDataToPage(Common::SeekableReadStream *s, int pageNum,
}
void Screen_EoB::printShadedText(const char *string, int x, int y, int col1, int col2) {
if (_vm->gameFlags().platform != Common::kPlatformFMTowns) {
printText(string, x - 1, y, 12, col2);
printText(string, x, y + 1, 12, 0);
printText(string, x - 1, y + 1, 12, 0);
} else if (col2) {
fillRect(x, y, x + getTextWidth(string) - 1, y + getFontHeight() - 1, col2);
}
printText(string, x, y, col1, 0);
}
@ -197,22 +221,28 @@ void Screen_EoB::loadShapeSetBitmap(const char *file, int tempPage, int destPage
}
void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int tempPage, int destPage, int convertToPage) {
const char *filePattern = (_vm->game() == GI_EOB1 && (_renderMode == Common::kRenderEGA || _renderMode == Common::kRenderCGA)) ? "%s.EGA" : "%s.CPS";
const char *filePattern = _vm->gameFlags().platform == Common::kPlatformFMTowns ? "%s.SHP" : ((_vm->game() == GI_EOB1 && (_renderMode == Common::kRenderEGA || _renderMode == Common::kRenderCGA)) ? "%s.EGA" : "%s.CPS");
Common::String tmp = Common::String::format(filePattern, file);
Common::SeekableReadStream *s = _vm->resource()->createReadStream(tmp);
bool loadAlternative = false;
if (s) {
if (_vm->gameFlags().platform == Common::kPlatformFMTowns) {
if (!s)
error("Screen_EoB::loadEoBBitmap(): Failed to load file '%s'", file);
s->read(_shpBuffer, s->size());
decodeSHP(_shpBuffer, destPage);
} else if (s) {
// This additional check is necessary since some localized versions of EOB II seem to contain invalid (size zero) cps files
if (s->size())
loadBitmap(tmp.c_str(), tempPage, destPage, 0);
else
loadAlternative = true;
delete s;
} else {
loadAlternative = true;
}
delete s;
if (loadAlternative) {
if (_vm->game() == GI_EOB1) {
tmp.insertChar('1', tmp.size() - 4);
@ -279,7 +309,7 @@ void Screen_EoB::convertPage(int srcPage, int dstPage, const uint8 *cgaMapping)
void Screen_EoB::setScreenPalette(const Palette &pal) {
if (_bytesPerPixel == 2) {
for (int i = 0; i < 4; i++)
createFadeTable16bit((const uint16*)(pal.getData()), &_16bitPalette[i * 256], 0, i * 53);
createFadeTable16bit((const uint16*)(pal.getData()), &_16bitPalette[i * 256], 0, i * 85);
}else if (_useHiResEGADithering && pal.getNumColors() != 16) {
generateEGADitheringTable(pal);
} else if (_renderMode == Common::kRenderEGA && pal.getNumColors() == 16) {
@ -315,7 +345,7 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco
if (_renderMode == Common::kRenderEGA && !_useHiResEGADithering)
encode8bit = false;
if (_bytesPerPixel == 2) {
if (_bytesPerPixel == 2 && encode8bit) {
shapesize = h * (w << 3) + 4;
shp = new uint8[shapesize];
memset(shp, 0, shapesize);
@ -890,6 +920,12 @@ const uint8 *Screen_EoB::generateShapeOverlay(const uint8 *shp, const uint8 *fad
if (*shp != 2)
return 0;
if (_bytesPerPixel == 2) {
setFadeTable(fadingTable);
setShapeFadingLevel(1);
return 0;
}
shp += 4;
for (int i = 0; i < 16; i++)
_shapeOverlay[i] = fadingTable[shp[i]];
@ -963,10 +999,14 @@ void Screen_EoB::drawExplosion(int scale, int radius, int numElements, int stepS
int16 py = ((ptr3[i] >> 6) >> scale) + gy2;
if (py > ymax)
py = ymax;
if (posWithinRect(px, py, rX1, rY1, rX2, rY2))
if (posWithinRect(px, py, rX1, rY1, rX2, rY2)) {
if (_bytesPerPixel == 2)
setPagePixel16bit(0, px, py, ptr6[i]);
else
setPagePixel(0, px, py, ptr6[i]);
}
}
}
l = 0;
@ -1094,6 +1134,9 @@ void Screen_EoB::drawVortex(int numElements, int radius, int stepSize, int, int
for (int ii = numElements - 1; ii >= 0; ii--) {
int16 px = CLIP((xCoords[ii] >> 6) + cx, 0, SCREEN_W - 1);
int16 py = CLIP((yCoords[ii] >> 6) + cy, 0, SCREEN_H - 1);
if (_bytesPerPixel == 2)
setPagePixel16bit(0, px, py, pixBackup[ii]);
else
setPagePixel(0, px, py, pixBackup[ii]);
}
}
@ -1219,6 +1262,8 @@ int Screen_EoB::getRectSize(int w, int h) {
void Screen_EoB::setFadeTable(const uint8 *table) {
_dsShapeFadingTable = table;
if (_bytesPerPixel == 2)
memcpy(&_16bitPalette[0x100], table, 512);
}
void Screen_EoB::createFadeTable(const uint8 *palData, uint8 *dst, uint8 rootColor, uint8 weight) {
@ -1265,6 +1310,7 @@ void Screen_EoB::createFadeTable(const uint8 *palData, uint8 *dst, uint8 rootCol
}
void Screen_EoB::createFadeTable16bit(const uint16 *palData, uint16 *dst, uint16 rootColor, uint8 weight) {
rootColor = palData[rootColor];
uint8 r8 = (rootColor & 0x1f);
uint8 g8 = (rootColor & 0x3E0) >> 5;
uint8 b8 = (rootColor & 0x7C00) >> 10;
@ -1320,7 +1366,6 @@ void Screen_EoB::createFadeTable16bit(const uint16 *palData, uint16 *dst, uint16
*dst++ = (b8 << 10) | (g8 << 5) | r8;
}
}
const uint16 *Screen_EoB::getCGADitheringTable(int index) {
@ -1331,10 +1376,69 @@ const uint8 *Screen_EoB::getEGADitheringTable() {
return _egaDitheringTable;
}
bool Screen_EoB::loadFont(FontId fontId, const char *filename) {
if (scumm_stricmp(filename, "FONT.DMP"))
return Screen::loadFont(fontId, filename);
Font *&fnt = _fonts[fontId];
int temp;
const uint16 *tbl = _vm->staticres()->loadRawDataBe16(kEoB2FontDmpSearchTbl, temp);
assert(tbl);
if (!fnt) {
fnt = new SJISFont12x12(tbl);
assert(fnt);
}
Common::SeekableReadStream *file = _vm->resource()->createReadStream(filename);
if (!file)
error("Font file '%s' is missing", filename);
bool ret = fnt->load(*file);
fnt->setColorMap(_textColorsMap);
delete file;
return ret;
}
void Screen_EoB::decodeSHP(const uint8 *data, int dstPage) {
int32 bytesLeft = READ_LE_UINT32(data);
const uint8 *src = data + 4;
uint8 *dst = getPagePtr(dstPage);
if (bytesLeft < 0) {
memcpy(dst, data, 64000);
return;
}
while (bytesLeft > 0) {
uint8 code = *src++;
bytesLeft--;
for (int i = 8; i; i--) {
if (code & 0x80) {
uint16 copyOffs = (src[0] << 4) | (src[1] >> 4);
uint8 count = (src[1] & 0x0F) + 3;
src += 2;
bytesLeft -= 2;
const uint8 *copySrc = dst - 1 - copyOffs;
while (count--)
*dst++ = *copySrc++;
} else if (bytesLeft) {
*dst++ = *src++;
bytesLeft--;
} else {
break;
}
code <<= 1;
}
}
}
void Screen_EoB::convertToHiColor(int page) {
if (!_16bitPalette)
return;
uint16 *dst = (uint16 *)getCPagePtr(page);
uint16 *dst = (uint16 *)getPagePtr(page);
memcpy(_convertHiColorBuffer, dst, SCREEN_H * SCREEN_W);
uint8 *src = _convertHiColorBuffer;
for (int s = SCREEN_H * SCREEN_W; s; --s)
@ -1483,6 +1587,17 @@ bool Screen_EoB::posWithinRect(int posX, int posY, int x1, int y1, int x2, int y
return true;
}
void Screen_EoB::setPagePixel16bit(int pageNum, int x, int y, uint16 color) {
assert(pageNum < SCREEN_PAGE_NUM);
assert(x >= 0 && x < SCREEN_W && y >= 0 && y < SCREEN_H);
assert(_bytesPerPixel == 2);
if (pageNum == 0 || pageNum == 1)
addDirtyRect(x, y, 1, 1);
((uint16*)_pagePtrs[pageNum])[y * SCREEN_W + x] = color;
}
void Screen_EoB::generateEGADitheringTable(const Palette &pal) {
assert(_egaDitheringTable);
const uint8 *src = pal.getData();
@ -1795,6 +1910,66 @@ void OldDOSFont::unload() {
_bitmapOffsets = 0;
}
SJISFontLarge::SJISFontLarge(Graphics::FontSJIS *font) : SJISFont(font, 0, false, false, false, 0) {
_sjisWidth = _font->getMaxFontWidth();
_fontHeight = _font->getFontHeight();
_asciiWidth = _font->getCharWidth('a');
}
void SJISFontLarge::drawChar(uint16 c, byte *dst, int pitch, int) const {
_font->drawChar(dst, c, 320, 1, _colorMap[1], _colorMap[0], 320, 200);
}
SJISFont12x12::SJISFont12x12(const uint16 *searchTable) : _height(6), _width(6), _data(0) {
assert(searchTable);
for (int i = 0; i < 148; i++)
_searchTable[searchTable[i]] = i + 1;
}
bool SJISFont12x12::load(Common::SeekableReadStream &file) {
delete[] _data;
int size = 148 * 24;
if (file.size() < size)
return false;
_data = new uint8[size];
file.read(_data, size);
return true;
}
void SJISFont12x12::unload() {
delete[] _data;
_data = 0;
_searchTable.clear();
}
void SJISFont12x12::drawChar(uint16 c, byte *dst, int pitch, int) const {
int offs = _searchTable[c];
if (!offs)
return;
const uint8 *src = _data + (offs - 1) * 24;
uint8 color1 = _colorMap[1];
int bt = 0;
uint16 chr = 0;
for (int i = 0; i < 192; ++i) {
if (!bt) {
chr = *src++;
bt = 8;
}
if (chr & 0x80)
*dst = color1;
dst++;
if (--bt)
chr <<= 1;
else if (i & 8)
dst += (pitch - 16);
}
}
} // End of namespace Kyra
#endif // ENABLE_EOB

View File

@ -82,8 +82,13 @@ public:
const uint16 *getCGADitheringTable(int index);
const uint8 *getEGADitheringTable();
bool loadFont(FontId fontId, const char *filename);
// FM-Towns specific
void decodeSHP(const uint8 *data, int dstPage);
void convertToHiColor(int page);
void shadeRect(int x1, int y1, int x2, int y2, int shadingLevel);
private:
void updateDirtyRects();
void ditherRect(const uint8 *src, uint8 *dst, int dstPitch, int srcW, int srcH, int colorKey = -1);
@ -93,13 +98,15 @@ private:
void scaleShapeProcessLine4Bit(uint8 *&dst, const uint8 *&src);
bool posWithinRect(int posX, int posY, int x1, int y1, int x2, int y2);
void setPagePixel16bit(int pageNum, int x, int y, uint16 color);
void generateEGADitheringTable(const Palette &pal);
void generateCGADitheringTables(const uint8 *mappingData);
int _dsDiv, _dsRem, _dsScaleTrans;
uint8 *_cgaScaleTable;
int16 _gfxX, _gfxY;
uint8 _gfxCol;
uint16 _gfxCol;
const uint8 *_gfxMaxY;
int16 _dsX1, _dsX2, _dsY1, _dsY2;
@ -109,6 +116,7 @@ private:
uint8 _shapeOverlay[16];
uint8 *_dsTempPage;
uint8 *_shpBuffer;
uint8 *_convertHiColorBuffer;
uint16 *_cgaDitheringTables[2];
@ -122,6 +130,44 @@ private:
static const int _screenDimTableCount;
};
/**
* 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
*/
class SJISFontLarge : public SJISFont {
public:
SJISFontLarge(Graphics::FontSJIS *font);
virtual ~SJISFontLarge() { unload(); }
virtual bool usesOverlay() const { return false; }
virtual void drawChar(uint16 c, byte *dst, int pitch, int) const;
};
/**
* 12 x 12 SJIS font for EOB II FM-Towns. The data for this font comes from a file, not from the font rom.
*/
class SJISFont12x12 : public Font {
public:
SJISFont12x12(const uint16 *searchTable);
virtual ~SJISFont12x12() { unload(); }
virtual bool load(Common::SeekableReadStream &file);
virtual bool usesOverlay() const { return true; }
virtual int getHeight() const { return _height; }
virtual int getWidth() const { return _width; }
virtual int getCharWidth(uint16 c) const { return _width; }
virtual void setColorMap(const uint8 *src) { _colorMap = src; }
virtual void drawChar(uint16 c, byte *dst, int pitch, int) const;
private:
void unload();
uint8 *_data;
Common::HashMap<uint16, uint8> _searchTable;
const uint8 *_colorMap;
const int _height, _width;
};
} // End of namespace Kyra
#endif // ENABLE_EOB

View File

@ -1495,6 +1495,7 @@ int EoBInfProcessor::oeob_sequence(int8 *data) {
break;
case -1:
if (_vm->gameFlags().platform == Common::kPlatformDOS)
_vm->_runFlag = _vm->checkPassword();
break;

View File

@ -41,18 +41,7 @@ public:
kFinale
};
struct Config {
Config(Mode m, const char *const *str, const char *const *cps, const char *const *pal, const DarkMoonShapeDef **shp, const DarkMoonAnimCommand **anim, bool paletteFading) : mode(m), strings(str), cpsFiles(cps), palFiles(pal), shapeDefs(shp), animData(anim), palFading(paletteFading) {}
Mode mode;
const char *const *strings;
const char *const *cpsFiles;
const char *const *palFiles;
const DarkMoonShapeDef **shapeDefs;
const DarkMoonAnimCommand **animData;
bool palFading;
};
DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, const Config *config);
DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, Mode mode);
~DarkmoonSequenceHelper();
void loadScene(int index, int pageNum);
@ -79,9 +68,28 @@ private:
OSystem *_system;
DarkMoonEngine *_vm;
Screen_EoB *_screen;
struct Config {
Config(const char *const *str, const char *const *cpsfiles, const uint8 **cpsdata, const char *const *pal, const DarkMoonShapeDef **shp, const DarkMoonAnimCommand **anim, bool loadScenePalette, bool paletteFading, bool animCmdRestorePalette, bool shapeBackgroundFading, int animPalOffset, int animType1ShapeDim, bool animCmd5SetPalette, int animCmd5ExtraPage) : strings(str), cpsFiles(cpsfiles), cpsData(cpsdata), palFiles(pal), shapeDefs(shp), animData(anim), loadScenePal(loadScenePalette), palFading(paletteFading), animCmdRestorePal(animCmdRestorePalette), shpBackgroundFading(shapeBackgroundFading), animPalOffs(animPalOffset), animCmd1ShapeFrame(animType1ShapeDim), animCmd5SetPal(animCmd5SetPalette), animCmd5AltPage(animCmd5ExtraPage) {}
const char *const *strings;
const char *const *cpsFiles;
const uint8 **cpsData;
const char *const *palFiles;
const DarkMoonShapeDef **shapeDefs;
const DarkMoonAnimCommand **animData;
bool loadScenePal;
bool palFading;
bool animCmdRestorePal;
bool shpBackgroundFading;
int animPalOffs;
int animCmd1ShapeFrame;
bool animCmd5SetPal;
int animCmd5AltPage;
};
const Config *_config;
Palette *_palettes[12];
Palette *_palettes[13];
uint8 *_fadingTables[7];
const uint8 **_shapes;
@ -89,13 +97,22 @@ private:
uint32 _fadePalTimer;
int _fadePalRate;
int _fadePalIndex;
Screen::FontId _prevFont;
static const char *const _palFilesIntroVGA[];
static const char *const _palFilesIntroEGA[];
static const char *const _palFilesFinaleVGA[];
static const char *const _palFilesFinaleEGA[];
};
int DarkMoonEngine::mainMenu() {
int menuChoice = _menuChoiceInit;
_menuChoiceInit = 0;
_sound->selectAudioResourceSet(kMusicIntro);
_sound->loadSoundFile("INTRO");
Screen::FontId of = _screen->_currentFont;
int op = 0;
Common::SeekableReadStream *s = 0;
@ -103,6 +120,11 @@ int DarkMoonEngine::mainMenu() {
while (menuChoice >= 0 && !shouldQuit()) {
switch (menuChoice) {
case 0: {
if (_flags.platform == Common::kPlatformFMTowns) {
_screen->loadPalette("MENU.PAL", _screen->getPalette(0));
_screen->setScreenPalette(_screen->getPalette(0));
_screen->loadEoBBitmap("MENU", 0, 3, 3, 2);
} else {
s = _res->createReadStream("XENU.CPS");
if (s) {
s->read(_screen->getPalette(0).getData(), 768);
@ -114,6 +136,7 @@ int DarkMoonEngine::mainMenu() {
if (_configRenderMode == Common::kRenderEGA)
_screen->loadPalette("MENU.EGA", _screen->getPalette(0));
}
_screen->setScreenPalette(_screen->getPalette(0));
_screen->convertPage(3, 2, 0);
@ -121,10 +144,11 @@ int DarkMoonEngine::mainMenu() {
of = _screen->setFont(Screen::FID_6_FNT);
op = _screen->setCurPage(2);
Common::String versionString(Common::String::format("ScummVM %s", gScummVMVersion));
_screen->printText(versionString.c_str(), 267 - versionString.size() * 6, 160, 13, 0);
_screen->printText(versionString.c_str(), 267 - versionString.size() * 6, _flags.platform == Common::kPlatformFMTowns ? 152 : 160, 13, 0);
_screen->setFont(of);
_screen->_curPage = op;
_screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK);
_screen->shadeRect(78, 99, 249, 141, 4);
_screen->updateScreen();
_allowImport = true;
menuChoice = mainMenuLoop();
@ -172,12 +196,30 @@ int DarkMoonEngine::mainMenuLoop() {
sel = _gui->simpleMenu_process(6, _mainMenuStrings, 0, -1, 0);
} while ((sel < 0 || sel > 5) && !shouldQuit());
if (_flags.platform == Common::kPlatformFMTowns && sel == 2) {
townsUtilitiesMenu();
sel = -1;
}
return sel + 1;
}
void DarkMoonEngine::townsUtilitiesMenu() {
_screen->copyRegion(78, 99, 78, 99, 172, 43, 2, 0, Screen::CR_NO_P_CHECK);
int sel = -1;
do {
_gui->simpleMenu_setup(8, 0, _utilMenuStrings, -1, 0, 0);
while (sel == -1 && !shouldQuit())
sel = _gui->simpleMenu_process(8, _utilMenuStrings, 0, -1, 0);
if (sel == 0) {
_config2431 ^= true;
sel = -1;
}
} while ((sel < 0 || sel > 1) && !shouldQuit());
}
void DarkMoonEngine::seq_playIntro() {
DarkmoonSequenceHelper::Config config(DarkmoonSequenceHelper::kIntro, _introStrings, _cpsFilesIntro, _configRenderMode == Common::kRenderEGA ? _palFilesIntroEGA : _palFilesIntroVGA, _shapesIntro, _animIntro, false);
DarkmoonSequenceHelper sq(_system, this, _screen, &config);
DarkmoonSequenceHelper sq(_system, this, _screen, DarkmoonSequenceHelper::kIntro);
_screen->setCurPage(0);
_screen->clearCurPage();
@ -206,13 +248,13 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(6, 18);
sq.animCommand(0);
sq.waitForSongNotifier(1);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 229 : 1);
sq.animCommand(_configRenderMode == Common::kRenderEGA ? 12 : 11);
sq.animCommand(7, 6);
sq.animCommand(2, 6);
sq.waitForSongNotifier(2);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 447 : 2);
sq.animCommand(_configRenderMode == Common::kRenderEGA ? 39 : 38);
sq.animCommand(3);
@ -221,7 +263,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(0, 6);
sq.animCommand(2);
sq.waitForSongNotifier(3);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 670 : 3);
_screen->setClearScreenDim(17);
_screen->setCurPage(2);
@ -249,7 +291,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.printText(3, 16); // The message was urgent.
sq.loadScene(1, 2);
sq.waitForSongNotifier(4);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 1380 : 4);
// intro scroll
if (!skipFlag() && !shouldQuit()) {
@ -310,7 +352,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(14);
sq.loadScene(5, 2);
sq.waitForSongNotifier(5);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 2037 : 5);
sq.fadeText();
_screen->clearCurPage();
@ -365,7 +407,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.loadScene(9, 2);
sq.fadeText();
sq.waitForSongNotifier(6);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 3000 : 6);
sq.update(2);
sq.animCommand(34);
@ -470,12 +512,12 @@ void DarkMoonEngine::seq_playIntro() {
sq.fadeText();
sq.animCommand(29);
sq.waitForSongNotifier(7);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 4475 : 7);
sq.animCommand(30);
sq.animCommand(31);
sq.waitForSongNotifier(8, true);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 4825 : 8, true);
if (skipFlag() || shouldQuit()) {
snd_fadeOut();
@ -496,17 +538,16 @@ void DarkMoonEngine::seq_playIntro() {
}
void DarkMoonEngine::seq_playFinale() {
DarkmoonSequenceHelper::Config config(DarkmoonSequenceHelper::kFinale, _finaleStrings, _cpsFilesFinale, _configRenderMode == Common::kRenderEGA ? _palFilesFinaleEGA : _palFilesFinaleVGA, _shapesFinale, _animFinale, true);
DarkmoonSequenceHelper sq(_system, this, _screen, &config);
DarkmoonSequenceHelper sq(_system, this, _screen, DarkmoonSequenceHelper::kFinale);
_screen->setCurPage(0);
_screen->setFont(Screen::FID_8_FNT);
_sound->loadSoundFile("FINALE1");
_sound->loadSoundFile(_flags.platform == Common::kPlatformFMTowns ? "FINALE" : "FINALE1");
snd_stopSound();
sq.delay(3);
_screen->clearCurPage();
_screen->clearPage(2);
_screen->updateScreen();
sq.loadScene(0, 2);
@ -532,7 +573,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.fadeText();
sq.animCommand(2);
sq.waitForSongNotifier(1);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 475 : 1);
sq.printText(1, 10); // Suddenly, your friend Khelben appears
sq.animCommand(4);
@ -624,7 +665,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.loadScene(4, 2);
sq.waitForSongNotifier(2);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 2030 : 2);
_screen->clearCurPage();
sq.update(2);
@ -637,7 +678,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(90);
sq.fadeText();
sq.waitForSongNotifier(3);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 2200 : 3);
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(7);
@ -669,7 +710,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(72);
sq.fadeText();
sq.waitForSongNotifier(4);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 2752 : 4);
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(7);
@ -703,7 +744,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.fadeText();
sq.loadScene(12, 2);
sq.waitForSongNotifier(5);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 3475 : 5);
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(6);
@ -782,16 +823,24 @@ void DarkMoonEngine::seq_playFinale() {
sq.loadScene(10, 2);
sq.loadScene(9, 2);
snd_stopSound();
sq.delay(3);
if (_flags.platform != Common::kPlatformFMTowns)
_sound->loadSoundFile("FINALE2");
sq.delay(18);
if (!skipFlag() && !shouldQuit())
snd_playSong(1);
snd_playSong(_flags.platform == Common::kPlatformFMTowns ? 16 : 1);
seq_playCredits(&sq, _creditsData, 18, 2, 6, 2);
int temp = 0;
const uint8 *creditsData = (_flags.platform == Common::kPlatformFMTowns) ? _res->fileData("CREDITS.TXT", 0) : _staticres->loadRawData(kEoB2CreditsData, temp);
seq_playCredits(&sq, creditsData, 18, 2, 6, 2);
if (_flags.platform == Common::kPlatformFMTowns)
delete[] creditsData;
sq.delay(90);
@ -817,6 +866,9 @@ void DarkMoonEngine::seq_playFinale() {
_screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK);
if (_flags.platform == Common::kPlatformFMTowns)
sq.copyPalette(12, 0);
sq.setPalette(9);
sq.fadePalette(0, 18);
@ -831,7 +883,9 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da
if (!data)
return;
_screen->setFont(Screen::FID_8_FNT);
_screen->setScreenDim(sd);
const ScreenDim *dm = _screen->_curDim;
_screen->copyRegion(dm->sx << 3, dm->sy, dm->sx << 3, dm->sy, dm->w << 3, dm->h, 0, backupPage, Screen::CR_NO_P_CHECK);
@ -955,8 +1009,74 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da
delete[] items[i].str;
}
DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, const Config *config) :
_system(system), _vm(vm), _screen(screen), _config(config) {
DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, Mode mode) :
_system(system), _vm(vm), _screen(screen) {
int size = 0;
if (mode == kIntro) {
_config = new Config(
_vm->staticres()->loadStrings(kEoB2IntroStrings, size),
_vm->staticres()->loadStrings(kEoB2IntroCPSFiles, size),
new const uint8*[13],
_vm->_configRenderMode == Common::kRenderEGA ? _palFilesIntroEGA : _palFilesIntroVGA,
new const DarkMoonShapeDef*[13],
new const DarkMoonAnimCommand *[44],
false,
false,
true,
true,
0,
0,
false,
2
);
for (int i = 0; i < 44; i++)
_config->animData[i] = _vm->staticres()->loadEoB2SeqData(kEoB2IntroAnimData00 + i, size);
for (int i = 0; i < 13; i++)
_config->cpsData[i] = _vm->staticres()->loadRawData(kEoB2IntroCpsDataStreet1 + i, size);
memset(_config->shapeDefs, 0, 13 * sizeof(DarkMoonShapeDef*));
_config->shapeDefs[0] = _vm->staticres()->loadEoB2ShapeData(kEoB2IntroShapes00, size);
_config->shapeDefs[1] = _vm->staticres()->loadEoB2ShapeData(kEoB2IntroShapes01, size);
_config->shapeDefs[4] = _vm->staticres()->loadEoB2ShapeData(kEoB2IntroShapes04, size);
_config->shapeDefs[7] = _vm->staticres()->loadEoB2ShapeData(kEoB2IntroShapes07, size);
} else {
_config = new Config(
_vm->staticres()->loadStrings(kEoB2FinaleStrings, size),
_vm->staticres()->loadStrings(kEoB2FinaleCPSFiles, size),
new const uint8*[13],
_vm->_configRenderMode == Common::kRenderEGA ? _palFilesFinaleEGA : _palFilesFinaleVGA,
new const DarkMoonShapeDef*[13],
new const DarkMoonAnimCommand *[21],
true,
true,
false,
false,
1,
18,
true,
6
);
for (int i = 0; i < 21; i++)
_config->animData[i] = _vm->staticres()->loadEoB2SeqData(kEoB2FinaleAnimData00 + i, size);
for (int i = 0; i < 13; i++)
_config->cpsData[i] = _vm->staticres()->loadRawData(kEoB2FinaleCpsDataDragon1 + i, size);
memset(_config->shapeDefs, 0, 13 * sizeof(DarkMoonShapeDef*));
_config->shapeDefs[0] = _vm->staticres()->loadEoB2ShapeData(kEoB2FinaleShapes00, size);
_config->shapeDefs[3] = _vm->staticres()->loadEoB2ShapeData(kEoB2FinaleShapes03, size);
_config->shapeDefs[7] = _vm->staticres()->loadEoB2ShapeData(kEoB2FinaleShapes07, size);
_config->shapeDefs[9] = _vm->staticres()->loadEoB2ShapeData(kEoB2FinaleShapes09, size);
_config->shapeDefs[10] = _vm->staticres()->loadEoB2ShapeData(kEoB2FinaleShapes10, size);
}
_screen->enableHiColorMode(false);
for (int i = 0; _config->palFiles[i]; i++) {
if (i < 4)
@ -966,13 +1086,16 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
_screen->loadPalette(_config->palFiles[i], *_palettes[i]);
}
_palettes[9] = new Palette(256);
for (int i = 9; i < 13; ++i)
_palettes[i] = new Palette(256);
_palettes[9]->fill(0, 256, 0);
_palettes[10] = new Palette(256);
_palettes[10]->fill(0, 256, 63);
_palettes[11] = new Palette(256);
_palettes[11]->fill(0, 256, 0);
if (_vm->gameFlags().platform == Common::kPlatformFMTowns)
_screen->loadPalette("PALETTE.COL", *_palettes[12]);
for (int i = 0; i < 7; i++)
_fadingTables[i] = 0;
@ -1001,7 +1124,7 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
_fadePalRate = 0;
_screen->setScreenPalette(*_palettes[0]);
_screen->setFont(Screen::FID_8_FNT);
_prevFont = _screen->setFont(_vm->gameFlags().platform == Common::kPlatformFMTowns ? Screen::FID_SJIS_LARGE_FNT : Screen::FID_8_FNT);
_screen->hideMouse();
_vm->delay(150);
@ -1012,9 +1135,8 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
DarkmoonSequenceHelper::~DarkmoonSequenceHelper() {
for (int i = 4; _config->palFiles[i]; i++)
delete _palettes[i];
delete _palettes[9];
delete _palettes[10];
delete _palettes[11];
for (int i = 9; i < 13; ++i)
delete _palettes[i];
for (int i = 0; i < 7; i++)
delete[] _fadingTables[i];
@ -1023,7 +1145,14 @@ DarkmoonSequenceHelper::~DarkmoonSequenceHelper() {
delete[] _shapes[i];
delete[] _shapes;
delete[] _config->animData;
delete[] _config->shapeDefs;
delete[] _config->cpsData;
delete _config;
_screen->enableHiColorMode(true);
_screen->clearCurPage();
_screen->setFont(_prevFont);
_screen->showMouse();
_screen->updateScreen();
@ -1033,17 +1162,23 @@ DarkmoonSequenceHelper::~DarkmoonSequenceHelper() {
}
void DarkmoonSequenceHelper::loadScene(int index, int pageNum) {
char file[13];
strcpy(file, _config->cpsFiles[index]);
Common::SeekableReadStream *s = _vm->resource()->createReadStream(file);
char file[13] = "";
Common::SeekableReadStream *s = 0;
uint32 chunkID = 0;
if (_config->cpsFiles) {
strcpy(file, _config->cpsFiles[index]);
s = _vm->resource()->createReadStream(file);
}
if (s) {
chunkID = s->readUint32LE();
s->seek(0);
}
if (s && chunkID == MKTAG('F', 'O', 'R', 'M')) {
if (_config->cpsData[index]) {
_screen->decodeSHP(_config->cpsData[index], pageNum);
} else if (s && chunkID == MKTAG('F', 'O', 'R', 'M')) {
// The original code also handles files with FORM chunks and ILBM and PBM sub chunks. This will probably be necessary for Amiga versions.
// The DOS versions do not need this, but still have the code for it. We error out for now.
error("DarkmoonSequenceHelper::loadScene(): CPS file loading failure in scene %d - unhandled FORM chunk encountered", index);
@ -1059,7 +1194,7 @@ void DarkmoonSequenceHelper::loadScene(int index, int pageNum) {
if (!s)
error("DarkmoonSequenceHelper::loadScene(): CPS file loading failure in scene %d", index);
if (_config->mode == kFinale)
if (_config->loadScenePal)
s->read(_palettes[0]->getData(), 768);
else
s->seek(768);
@ -1096,8 +1231,10 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
uint32 end = 0;
for (const DarkMoonAnimCommand *s = _config->animData[index]; s->command != 0xFF && !_vm->skipFlag() && !_vm->shouldQuit(); s++) {
int palIndex = _config->mode == kFinale ? (s->pal + 1) : s->pal;
int palIndex = s->pal + _config->animPalOffs;
int x = s->x1;
if (x >= Screen::SCREEN_W)
x >>= 1;
int y = s->y1;
int x2 = 0;
uint16 shapeW = 0;
@ -1109,7 +1246,7 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
if (_vm->_configRenderMode != Common::kRenderEGA && s->pal)
setPaletteWithoutTextColor(palIndex);
delay(s->delay);
if (_vm->_configRenderMode != Common::kRenderEGA && _config->mode == kIntro && s->pal)
if (_vm->_configRenderMode != Common::kRenderEGA && _config->animCmdRestorePal && s->pal)
setPaletteWithoutTextColor(0);
break;
@ -1118,7 +1255,7 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
shapeW = _shapes[s->obj][2];
shapeH = _shapes[s->obj][3];
if (_config->mode == kFinale) {
if (_config->animCmd1ShapeFrame == 18) {
_screen->setScreenDim(18);
x -= (_screen->_curDim->sx << 3);
y -= _screen->_curDim->sy;
@ -1128,7 +1265,7 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
x2 = x;
}
_screen->drawShape(0, _shapes[s->obj], x, y, _config->mode == kIntro ? 0 : 18);
_screen->drawShape(0, _shapes[s->obj], x, y, _config->animCmd1ShapeFrame);
if (_vm->_configRenderMode != Common::kRenderEGA && s->pal)
setPaletteWithoutTextColor(palIndex);
@ -1137,7 +1274,7 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
delay(s->delay);
if (_config->mode == kIntro) {
if (_config->animCmd1ShapeFrame == 0) {
if (_vm->_configRenderMode != Common::kRenderEGA && s->pal)
setPaletteWithoutTextColor(0);
_screen->copyRegion(x - 8, y - 8, x, y, (shapeW + 1) << 3, shapeH, 2, 0, Screen::CR_NO_P_CHECK);
@ -1159,14 +1296,14 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
delay(s->delay);
if (_vm->_configRenderMode != Common::kRenderEGA && _config->mode == kIntro && s->pal)
if (_vm->_configRenderMode != Common::kRenderEGA && _config->animCmdRestorePal && s->pal)
setPaletteWithoutTextColor(0);
break;
case 3:
case 4:
// fade shape in or out or restore background
if (_config->mode == kFinale)
if (!_config->shpBackgroundFading)
break;
if (_vm->_configRenderMode == Common::kRenderEGA) {
@ -1201,10 +1338,10 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
case 5:
// copy region
if (_config->mode == kFinale && s->pal)
if (_config->animCmd5SetPal && s->pal)
setPaletteWithoutTextColor(palIndex);
_screen->copyRegion(s->x2 << 3, s->y2, s->x1, s->y1, s->w << 3, s->h, (s->obj && _config->mode == kFinale) ? 6 : 2, 0, Screen::CR_NO_P_CHECK);
_screen->copyRegion(s->x2 << 3, s->y2, s->x1, s->y1, s->w << 3, s->h, s->obj ? _config->animCmd5AltPage : 2, 0, Screen::CR_NO_P_CHECK);
_screen->updateScreen();
delay(s->delay);
break;
@ -1250,8 +1387,9 @@ void DarkmoonSequenceHelper::printText(int index, int color) {
strcpy(str, _config->strings[index]);
const ScreenDim *dm = _screen->_curDim;
int fontHeight = _screen->getFontHeight() + 1;
for (int yOffs = 0; *str; yOffs += 9) {
for (int yOffs = 0; *str; yOffs += fontHeight) {
char *cr = strchr(str, 13);
if (cr)
@ -1383,8 +1521,52 @@ void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim
}
}
const char *const DarkmoonSequenceHelper::_palFilesIntroVGA[] = {
"PALETTE1.PAL",
"PALETTE3.PAL",
"PALETTE2.PAL",
"PALETTE4.PAL",
0
};
const char *const DarkmoonSequenceHelper::_palFilesIntroEGA[] = {
"PALETTE0.PAL",
"PALETTE3.PAL",
"PALETTE2.PAL",
"PALETTE4.PAL",
0
};
const char *const DarkmoonSequenceHelper::_palFilesFinaleVGA[] = {
"FINALE_0.PAL",
"FINALE_0.PAL",
"FINALE_1.PAL",
"FINALE_2.PAL",
"FINALE_3.PAL",
"FINALE_4.PAL",
"FINALE_5.PAL",
"FINALE_6.PAL",
"FINALE_7.PAL",
0
};
const char *const DarkmoonSequenceHelper::_palFilesFinaleEGA[] = {
"FINALE_0.PAL",
"FINALE_0.PAL",
"FINALE_1.PAL",
"FINALE_2.PAL",
"FINALE_3.PAL",
"FINALE_4.PAL",
"FINALE_5.PAL",
"FINALE_0.PAL",
"FINALE_0.PAL",
0
};
void DarkMoonEngine::seq_nightmare() {
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
if (_flags.lang == Common::JA_JPN)
_screen->clearCurDim();
_screen->copyRegion(0, 0, 0, 120, 176, 24, 12, 2, Screen::CR_NO_P_CHECK);
initDialogueSequence();
@ -1416,6 +1598,7 @@ void DarkMoonEngine::seq_kheldran() {
gui_drawDialogueBox();
static const char file[] = "KHELDRAN";
_screen->set16bitShadingLevel(4);
_txt->printDialogueText(_kheldranStrings[0]);
drawSequenceBitmap(file, 0, 0, 0, 0);
_txt->printDialogueText(20, _moreStrings[0]);

View File

@ -66,6 +66,13 @@ struct SoundResourceInfo_TownsPC98V2 {
uint cdaTableSize;
};
struct SoundResourceInfo_TownsEoB {
SoundResourceInfo_TownsEoB(const uint8 *pcmdata, uint dataSize, int pcmvolume) : pcmData(pcmdata), pcmDataSize(dataSize), pcmVolume(pcmvolume) {}
const uint8 *pcmData;
uint pcmDataSize;
int pcmVolume;
};
/**
* Analog audio output device API for Kyrandia games.
* It contains functionality to play music tracks,

View File

@ -349,6 +349,59 @@ protected:
int _tableSfxGame_Size;
};
class SoundTowns_Darkmoon : public Sound, public TownsAudioInterfacePluginDriver {
public:
SoundTowns_Darkmoon(KyraEngine_v1 *vm, Audio::Mixer *mixer);
virtual ~SoundTowns_Darkmoon();
virtual kType getMusicType() const { return kTowns; }
virtual bool init();
void timerCallback(int timerId);
virtual void initAudioResourceInfo(int set, void *info);
virtual void selectAudioResourceSet(int set);
virtual bool hasSoundFile(uint file) const;
virtual void loadSoundFile(uint file) {}
virtual void loadSoundFile(Common::String name);
virtual void playTrack(uint8 track);
virtual void haltTrack();
virtual bool isPlaying() const;
virtual void playSoundEffect(uint8 track, uint8 volume = 0xFF);
virtual void stopAllSoundEffects();
virtual void beginFadeOut();
virtual void updateVolumeSettings();
virtual int checkTrigger();
virtual void resetTrigger();
private:
struct SoundTableEntry {
int8 type;
int32 para1;
int16 para2;
} _soundTable[120];
uint8 _lastSfxChan;
uint8 _lastEnvChan;
uint8 *_pcmData;
uint32 _pcmDataSize;
uint8 _pcmVol;
int _timer;
int _timerSwitch;
SoundResourceInfo_TownsEoB *_pcmResource[3];
TownsAudioInterface *_intf;
};
} // End of namespace Kyra
#endif

View File

@ -0,0 +1,276 @@
/* 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 2
* 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "kyra/sound_intern.h"
#include "kyra/resource.h"
#include "common/config-manager.h"
#include "common/system.h"
#include "backends/audiocd/audiocd.h"
#include "audio/audiostream.h"
#include "audio/decoders/raw.h"
namespace Kyra {
SoundTowns_Darkmoon::SoundTowns_Darkmoon(KyraEngine_v1 *vm, Audio::Mixer *mixer) : Sound(vm, mixer) {
_intf = new TownsAudioInterface(mixer, this, false);
_pcmData = 0;
_pcmVol = 0;
_timer = 0;
_timerSwitch = 0;
memset(_pcmResource, 0, sizeof(_pcmResource));
}
SoundTowns_Darkmoon::~SoundTowns_Darkmoon() {
for (int i = 0; i < 3; i++)
initAudioResourceInfo(i, 0);
delete _intf;
delete[] _pcmData;
}
bool SoundTowns_Darkmoon::init() {
if (!_intf->init())
return false;
_intf->callback(21, 255, 1);
_intf->callback(21, 0, 1);
_intf->callback(22, 255, 221);
_intf->callback(70, 0x31);
_intf->callback(33, 1);
_intf->callback(8, 0x47, 127);
_intf->callback(67, 1, 127, 127);
_lastSfxChan = 0x46;
_lastEnvChan = 0x40;
updateVolumeSettings();
return true;
}
void SoundTowns_Darkmoon::timerCallback(int timerId) {
switch (timerId) {
case 1:
_timerSwitch = (_timerSwitch + 1) % 4;
if (!_timerSwitch)
_timer++;
break;
default:
break;
}
}
void SoundTowns_Darkmoon::initAudioResourceInfo(int set, void *info) {
delete _pcmResource[set];
_pcmResource[set] = info ? new SoundResourceInfo_TownsEoB(*(SoundResourceInfo_TownsEoB*)info) : 0;
}
void SoundTowns_Darkmoon::selectAudioResourceSet(int set) {
delete[] _pcmData;
if (!_pcmResource[set] || !_pcmResource[kMusicIngame])
return;
_pcmDataSize = _pcmResource[kMusicIngame]->pcmDataSize;
_pcmData = new uint8[_pcmDataSize];
_pcmVol = _pcmResource[set]->pcmVolume;
memcpy(_pcmData, _pcmResource[kMusicIngame]->pcmData, _pcmDataSize);
if (set == kMusicIngame)
return;
memcpy(_pcmData, _pcmResource[set]->pcmData, _pcmResource[set]->pcmDataSize);
}
bool SoundTowns_Darkmoon::hasSoundFile(uint file) const {
return true;
}
void SoundTowns_Darkmoon::loadSoundFile(Common::String name) {
Common::SeekableReadStream *s = _vm->resource()->createReadStream(Common::String::format("%s.SDT", name.c_str()));
if (!s)
error("Failed to load sound file '%s.SDT'", name.c_str());
for (int i = 0; i < 120; i++) {
_soundTable[i].type = s->readSByte();
_soundTable[i].para1 = s->readSint32LE();
_soundTable[i].para2 = s->readSint16LE();
}
delete s;
uint32 bytesLeft;
uint8 *pmb = _vm->resource()->fileData(Common::String::format("%s.PMB", name.c_str()).c_str(), &bytesLeft);
_vm->delay(300);
if (pmb) {
uint8 *src = pmb + 8;
for (int i = 0; i < 32; i++)
_intf->callback(5, 0x40, i, &src[i << 7]);
_intf->callback(35, -1);
src += 0x1000;
bytesLeft -= 0x1008;
while (bytesLeft) {
_intf->callback(34, src);
uint32 len = READ_LE_UINT16(&src[12]) + 32;
src = src + len;
bytesLeft -= len;
}
delete[] pmb;
} else {
warning("Sound file '%s.PMB' not found.", name.c_str());
// TODO
}
}
void SoundTowns_Darkmoon::playTrack(uint8 track) {
if (track >= 120 || !_sfxEnabled)
return;
uint8 *pcm = 0;
switch (_soundTable[track].type) {
case -1:
if (track == 0)
haltTrack();
else if (track == 2)
beginFadeOut();
break;
case 0:
if (_soundTable[track].para1 == -1 || (uint32)_soundTable[track].para1 > _pcmDataSize)
return;
pcm = _pcmData + _soundTable[track].para1;
WRITE_LE_UINT16(&pcm[24], _soundTable[track].para2 * 98 / 1000);
_intf->callback(39, 0x47);
_intf->callback(37, 0x47, 60, track == 11 ? 127 : _pcmVol, pcm);
break;
case 2:
resetTrigger();
g_system->getAudioCDManager()->play(_soundTable[track].para1 - 1, 1, 0, 0);
break;
case 3:
_lastSfxChan ^= 3;
_intf->callback(39, _lastSfxChan);
_intf->callback(4, _lastSfxChan, _soundTable[track].para1);
_intf->callback(1, _lastSfxChan, _soundTable[track].para2, 127);
break;
default:
break;
}
}
void SoundTowns_Darkmoon::haltTrack() {
_intf->callback(39, 0x47);
_intf->callback(39, 0x46);
_intf->callback(39, 0x45);
g_system->getAudioCDManager()->stop();
}
bool SoundTowns_Darkmoon::isPlaying() const {
return g_system->getAudioCDManager()->isPlaying();
}
void SoundTowns_Darkmoon::playSoundEffect(uint8 track, uint8 volume) {
if (!_sfxEnabled)
return;
if (volume == 255)
return playTrack(track);
uint8 *pcm = 0;
switch (_soundTable[track].type) {
case 0:
if (_soundTable[track].para1 == -1 || (uint32)_soundTable[track].para1 > _pcmDataSize)
return;
pcm = _pcmData + _soundTable[track].para1;
WRITE_LE_UINT16(&pcm[24], _soundTable[track].para2 * 98 / 1000);
_intf->callback(39, 0x47);
_intf->callback(37, 0x47, 60, volume, pcm);
break;
case 3:
_intf->callback(2, _lastEnvChan);
_intf->callback(4, _lastEnvChan, _soundTable[track].para1);
_intf->callback(1, _lastEnvChan, _soundTable[track].para2, volume);
break;
default:
break;
}
if (++_lastEnvChan == 0x43)
_lastEnvChan = 0x40;
}
void SoundTowns_Darkmoon::stopAllSoundEffects() {
_intf->callback(39, 0x42);
_intf->callback(39, 0x41);
_intf->callback(39, 0x40);
}
void SoundTowns_Darkmoon::beginFadeOut() {
for (int vol = 127; vol >= 0; vol -= 2) {
_intf->callback(67, 1, vol, vol);
_vm->delay(16);
}
_intf->callback(67, 1, 0, 0);
_intf->callback(70, 1);
g_system->getAudioCDManager()->stop();
_intf->callback(70, 0x31);
_intf->callback(67, 1, 127, 127);
}
void SoundTowns_Darkmoon::updateVolumeSettings() {
bool mute = (ConfMan.hasKey("mute")) ? ConfMan.getBool("mute") : false;
_intf->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume")));
}
int SoundTowns_Darkmoon::checkTrigger() {
return _timer;
}
void SoundTowns_Darkmoon::resetTrigger() {
_timer = 0;
_timerSwitch = 0;
}
} // End of namespace Kyra

View File

@ -33,6 +33,25 @@
namespace Kyra {
void EoBCoreEngine::loadMonsterShapes(const char *filename, int monsterIndex, bool hasDecorations, int encodeTableIndex) {
if (_flags.platform == Common::kPlatformFMTowns) {
Common::String tmp = Common::String::format("%s.MNT", filename);
Common::SeekableReadStream *s = _res->createReadStream(tmp);
if (!s)
error("Screen_EoB::loadMonsterShapes(): Failed to load file '%s'", tmp.c_str());
for (int i = 0; i < 6; i++)
_monsterShapes[monsterIndex + i] = loadTownsShape(s);
for (int i = 0; i < 6; i++) {
for (int ii = 0; ii < 2; ii++)
s->read(_monsterPalettes[(monsterIndex >= 18 ? i + 6 : i) * 2 + ii], 16);
}
if (hasDecorations)
loadMonsterDecoration(s, monsterIndex);
delete s;
} else {
_screen->loadShapeSetBitmap(filename, 3, 3);
const uint16 *enc = &_encodeMonsterShpTable[encodeTableIndex << 2];
@ -41,9 +60,13 @@ void EoBCoreEngine::loadMonsterShapes(const char *filename, int monsterIndex, bo
generateMonsterPalettes(filename, monsterIndex);
if (hasDecorations)
loadMonsterDecoration(filename, monsterIndex);
if (hasDecorations) {
Common::SeekableReadStream *s = _res->createReadStream(Common::String::format("%s.DCR", filename));
if (s)
loadMonsterDecoration(s, monsterIndex);
delete s;
}
}
_screen->_curPage = 0;
}
@ -56,6 +79,15 @@ void EoBCoreEngine::releaseMonsterShapes(int first, int num) {
}
}
uint8 *EoBCoreEngine::loadTownsShape(Common::SeekableReadStream *stream) {
uint32 size = stream->readUint32LE();
uint8 *shape= new uint8[size];
stream->read(shape, size);
if (shape[0] == 1)
shape[0]++;
return shape;
}
const uint8 *EoBCoreEngine::loadMonsterProperties(const uint8 *data) {
uint8 cmd = *data++;
while (cmd != 0xFF) {

View File

@ -39,7 +39,7 @@
namespace Kyra {
#define RESFILE_VERSION 90
#define RESFILE_VERSION 91
namespace {
bool checkKyraDat(Common::SeekableReadStream *file) {

View File

@ -22,6 +22,7 @@
#include "kyra/eob.h"
#include "kyra/resource.h"
#include "kyra/sound_intern.h"
namespace Kyra {
@ -164,7 +165,7 @@ const ScreenDim Screen_EoB::_screenDimTable[] = {
{ 0x01, 0x14, 0x14, 0x58, 0x0F, 0x02, 0x00, 0x00 },
{ 0x02, 0x06, 0x23, 0x78, 0x0F, 0x02, 0x00, 0x00 },
{ 0x09, 0x14, 0x16, 0x38, 0x0F, 0x02, 0x00, 0x00 },
{ 0x01, 0x96, 0x26, 0x31, 0x0F, 0x00, 0x00, 0x00 },
{ 0x01, 0x96, 0x26, 0x32, 0x0F, 0x00, 0x00, 0x00 },
{ 0x01, 0x08, 0x26, 0x80, 0x0C, 0x0F, 0x00, 0x00 },
{ 0x01, 0x10, 0x26, 0x14, 0x00, 0x0F, 0x06, 0x00 },
{ 0x00, 0x10, 0x10, 0x0C, 0x00, 0x0F, 0x06, 0x00 },
@ -407,7 +408,6 @@ void EoBCoreEngine::initStaticResource() {
_wllFlagPreset = _staticres->loadRawData(kEoBBaseWllFlagPreset, _wllFlagPresetSize);
_dscShapeCoords = (const int16 *)_staticres->loadRawDataBe16(kEoBBaseDscShapeCoords, temp);
_dscDoorScaleOffs = _staticres->loadRawData(kEoBBaseDscDoorScaleOffs, temp);
_dscDoorScaleMult1 = _staticres->loadRawData(kEoBBaseDscDoorScaleMult1, temp);
_dscDoorScaleMult2 = _staticres->loadRawData(kEoBBaseDscDoorScaleMult2, temp);
_dscDoorScaleMult3 = _staticres->loadRawData(kEoBBaseDscDoorScaleMult3, temp);
@ -471,10 +471,11 @@ void EoBCoreEngine::initStaticResource() {
{ 0, 0, 0, 0 }
};
static const char *const errorSlotEmptyString[4] = {
static const char *const errorSlotEmptyString[5] = {
"There is no game\rsaved in that slot!",
"Hier ist noch kein\rSpiel gespeichert!",
"Non c'\x0E alcun gioco\rsalvato in quella\rposizione!",
"\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",
0
};
@ -487,9 +488,14 @@ void EoBCoreEngine::initStaticResource() {
} else if (_flags.lang == Common::IT_ITA) {
_saveLoadStrings = saveLoadStrings[2];
_errorSlotEmptyString = errorSlotEmptyString[2];
} else {
_saveLoadStrings = saveLoadStrings[3];
} else if (_flags.lang == Common::JA_JPN) {
// EOB II FM-Towns uses English here.
// Only the empty slot warning is in Japanese.
_saveLoadStrings = saveLoadStrings[0];
_errorSlotEmptyString = errorSlotEmptyString[3];
} else {
_saveLoadStrings = saveLoadStrings[4];
_errorSlotEmptyString = errorSlotEmptyString[4];
}
_menuOkString = "OK";
@ -602,7 +608,24 @@ void EoBCoreEngine::initButtonData() {
{ 110, 0, 0x1100, 75, 168, 97, 6, 0 }
};
_buttonDefs = buttonDefs;
_buttonDefs = new EoBGuiButtonDef[ARRAYSIZE(buttonDefs)];
memcpy(_buttonDefs, buttonDefs, sizeof(buttonDefs));
if (_flags.platform == Common::kPlatformFMTowns) {
static const uint16 keyCodesFMTowns[] = {
93, 94, 95, 96, 67, 27, 24, 349, 350, 351, 352, 80, 27, 24, 30, 0, 31, 0, 29, 0, 28, 0, 127, 18, 27, 93, 94, 95, 96,
49, 50, 51, 52, 53, 93, 94, 95, 96, 60, 62, 32, 353, 354, 97, 98, 27, 27, 97, 98, 97, 98, 54, 49, 50, 51, 52, 53, 27
};
const uint16 *c = keyCodesFMTowns;
for (int i = 0; i < ARRAYSIZE(buttonDefs); ++i) {
if (_buttonDefs[i].keyCode)
_buttonDefs[i].keyCode = *c++;
if (_buttonDefs[i].keyCode2)
_buttonDefs[i].keyCode2 = *c++;
}
}
_buttonCallbacks.clear();
_buttonCallbacks.reserve(ARRAYSIZE(buttonDefs));
@ -696,7 +719,12 @@ void EoBCoreEngine::initMenus() {
{ 32, 40, 16, 24, 20, 3, 5 },
{ 33, 72, 16, 24, 20, 4, 5 },
{ 34, 104, 16, 24, 20, 5, 5 },
{ 35, 136, 16, 24, 20, 6, 5 }
{ 35, 136, 16, 24, 20, 6, 5 },
// FM-Towns options menu
{ 18, 12, 20, 158, 14, 32, 3 },
{ 19, 12, 37, 158, 14, 50, 3 },
{ 20, 12, 54, 158, 14, 21, 3 },
{ 8, 128, 122, 40, 14, 19, 7 }
};
_menuButtonDefs = buttonDefs;
@ -720,6 +748,12 @@ void EoBCoreEngine::initMenus() {
_menuDefs[4].numButtons = 8;
_menuDefs[4].firstButtonStrId = 36;
}
if (_flags.platform == Common::kPlatformFMTowns) {
// assign FM-Towns style options menu
_menuDefs[2].numButtons = 4;
_menuDefs[2].firstButtonStrId = 44;
}
}
@ -1226,35 +1260,6 @@ const uint8 EoBEngine::_monsterAcHitChanceTbl2[] = {
void DarkMoonEngine::initStaticResource() {
int temp;
_mainMenuStrings = _staticres->loadStrings(kEoB2MainMenuStrings, temp);
_introStrings = _staticres->loadStrings(kEoB2IntroStrings, temp);
_cpsFilesIntro = _staticres->loadStrings(kEoB2IntroCPSFiles, temp);
_animIntro = new const DarkMoonAnimCommand*[44];
for (int i = 0; i < 44; i++)
_animIntro[i] = _staticres->loadEoB2SeqData(kEoB2IntroAnimData00 + i, temp);
_shapesIntro = new const DarkMoonShapeDef*[13];
memset(_shapesIntro, 0, sizeof(DarkMoonShapeDef *) * 13);
_shapesIntro[0] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes00, temp);
_shapesIntro[1] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes01, temp);
_shapesIntro[4] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes04, temp);
_shapesIntro[7] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes07, temp);
_finaleStrings = _staticres->loadStrings(kEoB2FinaleStrings, temp);
_creditsData = _staticres->loadRawData(kEoB2CreditsData, temp);
_cpsFilesFinale = _staticres->loadStrings(kEoB2FinaleCPSFiles, temp);
_animFinale = new const DarkMoonAnimCommand*[21];
for (int i = 0; i < 21; i++)
_animFinale[i] = _staticres->loadEoB2SeqData(kEoB2FinaleAnimData00 + i, temp);
_shapesFinale = new const DarkMoonShapeDef*[13];
memset(_shapesFinale, 0, sizeof(DarkMoonShapeDef *) * 13);
_shapesFinale[0] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes00, temp);
_shapesFinale[3] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes03, temp);
_shapesFinale[7] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes07, temp);
_shapesFinale[9] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes09, temp);
_shapesFinale[10] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes10, temp);
_dscDoorType5Offs = _staticres->loadRawData(kEoBBaseDscDoorType5Offs, temp);
@ -1273,6 +1278,26 @@ void DarkMoonEngine::initStaticResource() {
_wallOfForceDsNumH = _staticres->loadRawData(kEoB2WallOfForceNumH, temp);
_wallOfForceShpId = _staticres->loadRawData(kEoB2WallOfForceShpId, temp);
_utilMenuStrings = _staticres->loadStrings(kEoB2UtilMenuStrings, temp);
_2431Strings = _staticres->loadStrings(kEoB2Config2431Strings, temp);
_katakanaLines = _staticres->loadStrings(kEoB2KatakanaLines, temp);
_katakanaSelectStrings = _staticres->loadStrings(kEoB2KanaSelectStrings, temp);
_ascii2SjisTables = _staticres->loadStrings(kEoB2Ascii2SjisTables, temp);
_ascii2SjisTables2 = _staticres->loadStrings(kEoB2Ascii2SjisTables2, temp);
_saveNamePatterns = _staticres->loadStrings(kEoB2SaveNamePatterns, temp);
const uint8 *data = _staticres->loadRawData(kEoB2PcmSoundEffectsIngame, temp);
SoundResourceInfo_TownsEoB ingame(data, temp, 127);
data = _staticres->loadRawData(kEoB2PcmSoundEffectsIntro, temp);
SoundResourceInfo_TownsEoB intro(data, temp, 40);
data = _staticres->loadRawData(kEoB2PcmSoundEffectsFinale, temp);
SoundResourceInfo_TownsEoB finale(data, temp, 40);
_sound->initAudioResourceInfo(kMusicIngame, &ingame);
_sound->initAudioResourceInfo(kMusicIntro, &intro);
_sound->initAudioResourceInfo(kMusicFinale, &finale);
_monsterAcHitChanceTable1 = _monsterAcHitChanceTbl1;
_monsterAcHitChanceTable2 = _monsterAcHitChanceTbl2;
@ -1327,49 +1352,12 @@ void DarkMoonEngine::initSpells() {
}
}
const char *const DarkMoonEngine::_palFilesIntroVGA[] = {
"PALETTE1.PAL",
"PALETTE3.PAL",
"PALETTE2.PAL",
"PALETTE4.PAL",
0
const KyraRpgGUISettings DarkMoonEngine::_guiSettingsFMTowns = {
{ 9, 15, 95, 11, 7, { 221, 76 }, { 187, 162 }, { 95, 95 } },
{ 186, 181, 183, 133, 184, 17, 23, 20, 186, 181, 183, 182, 177, 180 }
};
const char *const DarkMoonEngine::_palFilesIntroEGA[] = {
"PALETTE0.PAL",
"PALETTE3.PAL",
"PALETTE2.PAL",
"PALETTE4.PAL",
0
};
const char *const DarkMoonEngine::_palFilesFinaleVGA[] = {
"FINALE_0.PAL",
"FINALE_0.PAL",
"FINALE_1.PAL",
"FINALE_2.PAL",
"FINALE_3.PAL",
"FINALE_4.PAL",
"FINALE_5.PAL",
"FINALE_6.PAL",
"FINALE_7.PAL",
0
};
const char *const DarkMoonEngine::_palFilesFinaleEGA[] = {
"FINALE_0.PAL",
"FINALE_0.PAL",
"FINALE_1.PAL",
"FINALE_2.PAL",
"FINALE_3.PAL",
"FINALE_4.PAL",
"FINALE_5.PAL",
"FINALE_0.PAL",
"FINALE_0.PAL",
0
};
const KyraRpgGUISettings DarkMoonEngine::_guiSettings = {
const KyraRpgGUISettings DarkMoonEngine::_guiSettingsDOS = {
{ 9, 15, 95, 9, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } },
{ 186, 181, 183, 133, 184, 17, 23, 20, 186, 181, 183, 182, 177, 180 }
};

View File

@ -81,7 +81,7 @@ void KyraRpgEngine::initStaticResource() {
_dscTileIndex = _staticres->loadRawData(kRpgCommonDscTileIndex, temp);
_dscDim1 = (const int8 *)_staticres->loadRawData(kRpgCommonDscDimData1, temp);
_dscDim2 = (const int8 *)_staticres->loadRawData(kRpgCommonDscDimData2, temp);
_dscUnk2 = _staticres->loadRawData(kRpgCommonDscUnk2, temp);
_dscDoorScaleOffs = _staticres->loadRawData(kRpgCommonDscDoorScaleOffs, temp);
_dscBlockMap = _staticres->loadRawData(kRpgCommonDscBlockMap, temp);
_dscBlockIndex = (const int8 *)_staticres->loadRawData(kRpgCommonDscBlockIndex, temp);
_dscDimMap = _staticres->loadRawData(kRpgCommonDscDimMap, temp);

View File

@ -75,10 +75,13 @@ void TextDisplayer_rpg::setupField(int dim, bool mode) {
_textDimData[dim].color2 = _vm->guiSettings()->colors.fill;
_screen->setScreenDim(dim);
if (mode)
if (mode) {
_screen->set16bitShadingLevel(4);
clearCurDim();
else
_screen->set16bitShadingLevel(0);
} else {
resetDimTextPositions(dim);
}
}
void TextDisplayer_rpg::resetDimTextPositions(int dim) {
@ -123,7 +126,8 @@ void TextDisplayer_rpg::displayText(char *str, ...) {
int sdx = _screen->curDimIndex();
bool sjisTextMode = (_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false;
int sjisOffs = sjisTextMode ? 8 : 9;
int sjisOffs = (sjisTextMode || _vm->game() == GI_EOB2) ? 8 : 9;
Screen::FontId of = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns) ? _screen->setFont(Screen::FID_8_FNT) : _screen->_currentFont;
uint16 charsPerLine = (sd->w << 3) / (_screen->getFontWidth() + _screen->_charWidth);
@ -225,6 +229,8 @@ void TextDisplayer_rpg::displayText(char *str, ...) {
if (_numCharsLeft)
printLine(_currentLine);
_screen->setFont(of);
}
char TextDisplayer_rpg::parseCommand() {
@ -283,7 +289,7 @@ void TextDisplayer_rpg::readNextPara() {
void TextDisplayer_rpg::printLine(char *str) {
const ScreenDim *sd = _screen->_curDim;
int sdx = _screen->curDimIndex();
bool sjisTextMode = (_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false;
bool sjisTextMode = _vm->gameFlags().lang == Common::JA_JPN && (_vm->gameFlags().use16ColorMode && (sdx == 3 || sdx == 4 || sdx == 5 || sdx == 15)) ? true : false;
int fh = (_screen->_currentFont == Screen::FID_SJIS_FNT) ? 9 : (_screen->getFontHeight() + _screen->_charOffset);
int lines = (sd->h - _screen->_charOffset) / fh;
@ -301,7 +307,10 @@ void TextDisplayer_rpg::printLine(char *str) {
if (h2)
_screen->copyRegion(sd->sx << 3, sd->sy + fh, sd->sx << 3, sd->sy, sd->w << 3, h2, _screen->_curPage, _screen->_curPage, Screen::CR_NO_P_CHECK);
_screen->set16bitShadingLevel(4);
_screen->fillRect(sd->sx << 3, sd->sy + h1, ((sd->sx + sd->w) << 3) - 1, sd->sy + sd->h - 1, _textDimData[sdx].color2);
_screen->set16bitShadingLevel(0);
if (_textDimData[sdx].line)
_textDimData[sdx].line--;
}
@ -482,7 +491,7 @@ void TextDisplayer_rpg::printLine(char *str) {
str[len] = 0;
_numCharsLeft = strlen(str);
_lineWidth = sjisTextMode ? (_numCharsLeft << 2) : (_screen->_currentFont == Screen::FID_SJIS_FNT ? _numCharsLeft * 9: _screen->getTextWidth(str));
_lineWidth = sjisTextMode ? (_numCharsLeft << 2) : (_screen->_currentFont == Screen::FID_SJIS_FNT ? _numCharsLeft * 9 : _screen->getTextWidth(str));
if (!_numCharsLeft && (_textDimData[sdx].column + twoByteCharOffs) <= (sd->w << 3))
return;
@ -499,7 +508,9 @@ void TextDisplayer_rpg::printDialogueText(int stringId, const char *pageBreakStr
assert(strlen(str) < kEoBTextBufferSize);
Common::strlcpy(_dialogueBuffer, str, kEoBTextBufferSize);
_screen->set16bitShadingLevel(4);
displayText(_dialogueBuffer);
_screen->set16bitShadingLevel(0);
if (pageBreakString) {
if (pageBreakString[0]) {
@ -566,7 +577,7 @@ void TextDisplayer_rpg::textPageBreak() {
SWAP(_vm->_dialogueButtonLabelColor1, _vm->_dialogueButtonLabelColor2);
int cp = _screen->setCurPage(0);
Screen::FontId cf = _screen->setFont((_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode) ? Screen::FID_SJIS_FNT : Screen::FID_6_FNT);
Screen::FontId cf = _screen->setFont((_vm->gameFlags().lang == Common::JA_JPN && _vm->gameFlags().use16ColorMode) ? Screen::FID_SJIS_FNT : ((_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns) ? Screen::FID_8_FNT : Screen::FID_6_FNT));
if (_vm->game() == GI_LOL)
_vm->_timer->pauseSingleTimer(11, true);
@ -614,8 +625,11 @@ void TextDisplayer_rpg::textPageBreak() {
_vm->gui_drawBox(x + 8, (y & ~7) - 1, 66, 10, 0xEE, 0xCC, -1);
_screen->printText(_pageBreakString, (x + 37 - (strlen(_pageBreakString) << 1) + 4) & ~3, (y + 2) & ~7, 0xC1, 0);
} else {
int yOffs = (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformFMTowns) ? 1 : 2;
_screen->set16bitShadingLevel(4);
_vm->gui_drawBox(x, y, w, _vm->guiSettings()->buttons.height, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
_screen->printText(_pageBreakString, x + (w >> 1) - (_vm->screen()->getTextWidth(_pageBreakString) >> 1), y + 2, _vm->_dialogueButtonLabelColor1, 0);
_screen->set16bitShadingLevel(0);
_screen->printText(_pageBreakString, x + (w >> 1) - (_vm->screen()->getTextWidth(_pageBreakString) >> 1), y + yOffs, _vm->_dialogueButtonLabelColor1, 0);
}
_vm->removeInputTop();
@ -659,12 +673,14 @@ void TextDisplayer_rpg::textPageBreak() {
}
} while (loop && !_vm->shouldQuit());
_screen->set16bitShadingLevel(4);
if (_vm->gameFlags().use16ColorMode)
_screen->fillRect(x + 8, y, x + 57, y + 9, _textDimData[_screen->curDimIndex()].color2);
else
_screen->fillRect(x, y, x + w - 1, y + 8, _textDimData[_screen->curDimIndex()].color2);
_screen->fillRect(x, y, x + w - 1, y + _vm->guiSettings()->buttons.height - 1, _textDimData[_screen->curDimIndex()].color2);
clearCurDim();
_screen->set16bitShadingLevel(0);
_screen->updateScreen();
if (_vm->game() == GI_LOL)
@ -709,7 +725,9 @@ void TextDisplayer_rpg::displayWaitButton() {
while (!_vm->processDialogue() && !_vm->shouldQuit()) {}
_screen->set16bitShadingLevel(4);
_screen->fillRect(_vm->_dialogueButtonPosX[0], _vm->_dialogueButtonPosY[0], _vm->_dialogueButtonPosX[0] + _vm->_dialogueButtonWidth - 1, _vm->_dialogueButtonPosY[0] + _vm->guiSettings()->buttons.height - 1, _vm->guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
_screen->updateScreen();
_vm->_dialogueButtonWidth = 95;
SWAP(_vm->_dialogueButtonLabelColor1, _vm->_dialogueButtonLabelColor2);