[Scummvm-git-logs] scummvm master -> b7552e46ea71be70c6f21831750c9ae39caca737
athrxx
athrxx at scummvm.org
Sat Apr 13 21:31:27 CEST 2019
This automated email contains information about 25 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
d3c783457d KYRA: (EOB2/Amiga) - add detection entries
02ecc7abb7 KYRA: (EOB2/Amiga) - add static resources
8c92e045ce KYRA: (EOB2/Amiga) - fix load up and intro sequence
b809279928 KYRA: (EOB2/Amiga) - update sound driver
3f1c47f3a0 KYRA: (EOB2/Amiga) - fix ending sequence
463cf48e2a KYRA: (EOB) - minor sequence code cleanup
5462d42363 KYRA: (EOB2/Amiga) - improve font file warnings
82b288a510 KYRA: (EOB2/Amiga) - fix vcn block drawing
4b15576fcb KYRA: (EOB2/Amiga) - fix monster shape encoding
5f20702ce8 KYRA: (EOB2/Amiga) - fix main menu version string color
ba9a4cd6e1 KYRA: (EOB2/Amiga) - fix detect magic blue shapes
c94b6a4389 KYRA: (EOB2/Amiga) - fix text resource loading
02000cfe37 KYRA: (EOB2/Amiga) - add special gfx decoder for localized version
cbe81aa021 KYRA: (EOB2/Amiga) - fix GUI colors
69f2e0caaa KYRA: (EOB2/Amiga) - fix ingame colors
d56cea770b KYRA: (EOB2/Amiga) - fix sequence dialogue field
b01fd0e1df KYRA: (EOB2/Amiga) - fix original save file handling
f96310dec6 KYRA: (EOB) - fix saveload menu glitch
2692702892 KYRA: (EOB) - fix party transfer glitch
d7e6b46814 KYRA: (EOB2/Amiga) - fix German version text
972f4e201a KYRA: (EOB2/Amiga) - fix flesh to stone spell colors
0ea6650837 KYRA: (EOB2/Amiga) - implement proper sound file loading
d84061c036 KYRA: (EOB2/Amiga) - fix German version monster sound
6c496af5af KYRA: (EOB2/Amiga) - final glitches fix
b7552e46ea KYRA: (EOB2/Amiga) - update news file
Commit: d3c783457d458e6e03401366d75ac291a9a0b70e
https://github.com/scummvm/scummvm/commit/d3c783457d458e6e03401366d75ac291a9a0b70e
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:57+02:00
Commit Message:
KYRA: (EOB2/Amiga) - add detection entries
Changed paths:
engines/kyra/detection_tables.h
diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h
index 0da2dea..7ff8f36 100644
--- a/engines/kyra/detection_tables.h
+++ b/engines/kyra/detection_tables.h
@@ -1733,6 +1733,38 @@ const KYRAGameDescription adGameDescs[] = {
},
EOB2_FMTOWNS_FLAGS
},
+
+ {
+ {
+ "eob2",
+ 0,
+ {
+ { "TEXT.CPS", 0, "e7350914bd7ca68039a4bc6aa42c43d4", -1 },
+ { 0, 0, 0, 0 }
+ },
+ Common::EN_ANY,
+ Common::kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIAMIGA, GUIO_RENDERAMIGA, GAMEOPTION_EOB_HPGRAPHS)
+ },
+ EOB2_FLAGS
+ },
+
+ {
+ {
+ "eob2",
+ 0,
+ {
+ { "TEXT.CPS", 0, "562adb7c1780481205b4d86ce1a54f20", -1 },
+ { 0, 0, 0, 0 }
+ },
+ Common::DE_DEU,
+ Common::kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ GUIO4(GUIO_NOSPEECH, GUIO_MIDIAMIGA, GUIO_RENDERAMIGA, GAMEOPTION_EOB_HPGRAPHS)
+ },
+ EOB2_FLAGS
+ },
#endif // ENABLE_EOB
{ AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) }
Commit: 02ecc7abb7ab53e88ae2edec332a38d8c85f1beb
https://github.com/scummvm/scummvm/commit/02ecc7abb7ab53e88ae2edec332a38d8c85f1beb
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:57+02:00
Commit Message:
KYRA: (EOB2/Amiga) - add static resources
Changed paths:
A devtools/create_kyradat/resources/eob2_amiga.h
A devtools/create_kyradat/resources/eob2_amiga_english.h
A devtools/create_kyradat/resources/eob2_amiga_german.h
devtools/create_kyradat/create_kyradat.cpp
devtools/create_kyradat/create_kyradat.h
devtools/create_kyradat/games.cpp
devtools/create_kyradat/resources.cpp
devtools/create_kyradat/resources/eob2_dos_english.h
devtools/create_kyradat/resources/eob2_dos_german.h
dists/engine-data/kyra.dat
engines/kyra/resource/resource.h
engines/kyra/resource/staticres.cpp
engines/kyra/resource/staticres_eob.cpp
engines/kyra/sequence/sequences_darkmoon.cpp
engines/kyra/sound/sound_amiga_eob.cpp
diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp
index 0c43b4f..8f5b7b6 100644
--- a/devtools/create_kyradat/create_kyradat.cpp
+++ b/devtools/create_kyradat/create_kyradat.cpp
@@ -45,7 +45,7 @@
enum {
- kKyraDatVersion = 93
+ kKyraDatVersion = 94
};
const ExtractFilename extractFilenames[] = {
@@ -414,10 +414,10 @@ const ExtractFilename extractFilenames[] = {
{ kEoBBaseSoundFilesIntro, kStringList, false },
{ kEoBBaseSoundFilesIngame, kStringList, false },
{ kEoBBaseSoundFilesFinale, kStringList, false },
+ { kEoBBaseLevelSoundFiles1, kStringList, false },
+ { kEoBBaseLevelSoundFiles2, kStringList, false },
// EYE OF THE BEHOLDER I
- { kEoB1LevelSoundFiles1, kStringList, false },
- { kEoB1LevelSoundFiles2, kStringList, false },
{ kEoB1MainMenuStrings, kStringList, true },
{ kEoB1BonusStrings, kStringList, true },
@@ -552,6 +552,9 @@ const ExtractFilename extractFilenames[] = {
{ kEoB2IntroShapes01, kEoB2ShapeData, false },
{ kEoB2IntroShapes04, kEoB2ShapeData, false },
{ kEoB2IntroShapes07, kEoB2ShapeData, false },
+ { kEoB2IntroShapes13, kEoB2ShapeData, false },
+ { kEoB2IntroShapes14, kEoB2ShapeData, false },
+ { kEoB2IntroShapes15, kEoB2ShapeData, false },
{ kEoB2IntroCpsDataStreet1, kRawData, false },
{ kEoB2IntroCpsDataStreet2, kRawData, false },
{ kEoB2IntroCpsDataDoorway1, kRawData, false },
@@ -867,6 +870,12 @@ const ExtractFilename extractFilenames[] = {
{ kEoB2PcmSoundEffectsIntro, kRawData, false },
{ kEoB2PcmSoundEffectsFinale, kRawData, false },
+ { kEoB2SoundMapExtra, kStringList, false },
+ { kEoB2SoundIndex1, kRawData, false },
+ { kEoB2SoundIndex2, kRawData, false },
+ { kEoB2SoundFilesIngame2, kStringList, false },
+ { kEoB2MonsterSoundPatchData, kRawData, false },
+
// LANDS OF LORE
// Ingame
diff --git a/devtools/create_kyradat/create_kyradat.h b/devtools/create_kyradat/create_kyradat.h
index a37fab3..40c7255 100644
--- a/devtools/create_kyradat/create_kyradat.h
+++ b/devtools/create_kyradat/create_kyradat.h
@@ -418,9 +418,9 @@ enum kExtractID {
kEoBBaseSoundFilesIntro,
kEoBBaseSoundFilesIngame,
kEoBBaseSoundFilesFinale,
+ kEoBBaseLevelSoundFiles1,
+ kEoBBaseLevelSoundFiles2,
- kEoB1LevelSoundFiles1,
- kEoB1LevelSoundFiles2,
kEoB1MainMenuStrings,
kEoB1BonusStrings,
@@ -558,6 +558,9 @@ enum kExtractID {
kEoB2IntroShapes01,
kEoB2IntroShapes04,
kEoB2IntroShapes07,
+ kEoB2IntroShapes13,
+ kEoB2IntroShapes14,
+ kEoB2IntroShapes15,
kEoB2FinaleStrings,
kEoB2CreditsData,
@@ -857,6 +860,12 @@ enum kExtractID {
kEoB2PcmSoundEffectsIntro,
kEoB2PcmSoundEffectsFinale,
+ kEoB2SoundMapExtra,
+ kEoB2SoundIndex1,
+ kEoB2SoundIndex2,
+ kEoB2SoundFilesIngame2,
+ kEoB2MonsterSoundPatchData,
+
kLoLIngamePakFiles,
kLoLCharacterDefs,
kLoLIngameSfxFiles,
diff --git a/devtools/create_kyradat/games.cpp b/devtools/create_kyradat/games.cpp
index 9457416..fe7b45f 100644
--- a/devtools/create_kyradat/games.cpp
+++ b/devtools/create_kyradat/games.cpp
@@ -113,8 +113,8 @@ const Game eob2Games[] = {
{ kEoB2, kPlatformDOS, kNoSpecial, EN_ANY },
{ kEoB2, kPlatformDOS, kNoSpecial, DE_DEU },
- //{ kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY },
- //{ kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU },
+ { kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY },
+ { kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU },
//{ kEoB2, kPlatformPC98, kNoSpecial, JA_JPN },
@@ -1703,8 +1703,8 @@ const int eob1AmigaNeed[] = {
kEoBBaseNpcPresets,
kEoBBaseSoundMap,
- kEoB1LevelSoundFiles1,
- kEoB1LevelSoundFiles2,
+ kEoBBaseLevelSoundFiles1,
+ kEoBBaseLevelSoundFiles2,
kEoBBaseSoundFilesIntro,
kEoBBaseSoundFilesIngame,
kEoBBaseSoundFilesFinale,
@@ -2322,6 +2322,341 @@ const int eob2FloppyNeed[] = {
-1
};
+const int eob2AmigaNeed[] = {
+ kEoBBaseChargenStrings1,
+ kEoBBaseChargenStrings2,
+ kEoBBaseChargenStartLevels,
+ kEoBBaseChargenStatStrings,
+ kEoBBaseChargenRaceSexStrings,
+ kEoBBaseChargenClassStrings,
+ kEoBBaseChargenAlignmentStrings,
+ kEoBBaseChargenEnterGameStrings,
+ kEoBBaseChargenClassMinStats,
+ kEoBBaseChargenRaceMinStats,
+ kEoBBaseChargenRaceMaxStats,
+
+ kEoBBaseSaveThrowTable1,
+ kEoBBaseSaveThrowTable2,
+ kEoBBaseSaveThrowTable3,
+ kEoBBaseSaveThrowTable4,
+ kEoBBaseSaveThrwLvlIndex,
+ kEoBBaseSaveThrwModDiv,
+ kEoBBaseSaveThrwModExt,
+
+ kEoBBasePryDoorStrings,
+ kEoBBaseWarningStrings,
+
+ kEoBBaseItemSuffixStringsRings,
+ kEoBBaseItemSuffixStringsPotions,
+ kEoBBaseItemSuffixStringsWands,
+
+ kEoBBaseRipItemStrings,
+ kEoBBaseCursedString,
+ kEoBBaseEnchantedString,
+ kEoBBaseMagicObjectStrings,
+ kEoBBaseMagicObjectString5,
+ kEoBBasePatternSuffix,
+ kEoBBasePatternGrFix1,
+ kEoBBasePatternGrFix2,
+ kEoBBaseValidateArmorString,
+ kEoBBaseValidateCursedString,
+ kEoBBaseValidateNoDropString,
+ kEoBBasePotionStrings,
+ kEoBBaseWandStrings,
+ kEoBBaseItemMisuseStrings,
+
+ kEoBBaseTakenStrings,
+ kEoBBasePotionEffectStrings,
+
+ kEoBBaseYesNoStrings,
+ kRpgCommonMoreStrings,
+ kEoBBaseNpcMaxStrings,
+ kEoBBaseOkStrings,
+ kEoBBaseNpcJoinStrings,
+ kEoBBaseCancelStrings,
+ kEoBBaseAbortStrings,
+
+ kEoBBaseMenuStringsMain,
+ kEoBBaseMenuStringsSaveLoad,
+ kEoBBaseMenuStringsOnOff,
+ kEoBBaseMenuStringsSpells,
+ kEoBBaseMenuStringsRest,
+ kEoBBaseMenuStringsDrop,
+ kEoBBaseMenuStringsExit,
+ kEoBBaseMenuStringsStarve,
+ kEoBBaseMenuStringsScribe,
+ kEoBBaseMenuStringsDrop2,
+ kEoBBaseMenuStringsHead,
+ kEoBBaseMenuStringsPoison,
+ kEoBBaseMenuStringsMgc,
+ kEoBBaseMenuStringsPrefs,
+ kEoBBaseMenuStringsRest2,
+ kEoBBaseMenuStringsRest3,
+ kEoBBaseMenuStringsRest4,
+ kEoBBaseMenuStringsDefeat,
+ kEoBBaseMenuStringsTransfer,
+ kEoBBaseMenuStringsSpec,
+ kEoBBaseMenuStringsSpellNo,
+ kEoBBaseMenuYesNoStrings,
+
+ kEoBBaseSpellLevelsMage,
+ kEoBBaseSpellLevelsCleric,
+ kEoBBaseNumSpellsCleric,
+ kEoBBaseNumSpellsWisAdj,
+ kEoBBaseNumSpellsPal,
+ kEoBBaseNumSpellsMage,
+
+ kEoBBaseCharGuiStringsHp,
+ kEoBBaseCharGuiStringsWp2,
+ kEoBBaseCharGuiStringsWr,
+ kEoBBaseCharGuiStringsSt2,
+ kEoBBaseCharGuiStringsIn,
+
+ kEoBBaseCharStatusStrings7,
+ kEoBBaseCharStatusStrings82,
+ kEoBBaseCharStatusStrings9,
+ kEoBBaseCharStatusStrings12,
+ kEoBBaseCharStatusStrings132,
+
+ kEoBBaseLevelGainStrings,
+ kEoBBaseExperienceTable0,
+ kEoBBaseExperienceTable1,
+ kEoBBaseExperienceTable2,
+ kEoBBaseExperienceTable3,
+ kEoBBaseExperienceTable4,
+
+ kEoBBaseBookNumbers,
+ kEoBBaseMageSpellsList,
+ kEoBBaseClericSpellsList,
+ kEoBBaseSpellNames,
+ kEoBBaseMagicStrings1,
+ kEoBBaseMagicStrings2,
+ kEoBBaseMagicStrings3,
+ kEoBBaseMagicStrings4,
+ kEoBBaseMagicStrings6,
+ kEoBBaseMagicStrings7,
+ kEoBBaseMagicStrings8,
+
+ kEoBBaseExpObjectTlMode,
+ kEoBBaseExpObjectTblIndex,
+ kEoBBaseExpObjectShpStart,
+ kEoBBaseExpObjectTbl1,
+ kEoBBaseExpObjectTbl2,
+ kEoBBaseExpObjectTbl3,
+ kEoBBaseExpObjectY,
+
+ kEoBBaseSparkDefSteps,
+ kEoBBaseSparkDefSubSteps,
+ kEoBBaseSparkDefShift,
+ kEoBBaseSparkDefAdd,
+ kEoBBaseSparkDefX,
+ kEoBBaseSparkDefY,
+ kEoBBaseSparkOfFlags1,
+ kEoBBaseSparkOfFlags2,
+ kEoBBaseSparkOfShift,
+ kEoBBaseSparkOfX,
+ kEoBBaseSparkOfY,
+
+ kEoBBaseSpellProperties,
+ kEoBBaseMagicFlightProps,
+ kEoBBaseTurnUndeadEffect,
+ kEoBBaseBurningHandsDest,
+ kEoBBaseConeOfColdDest1,
+ kEoBBaseConeOfColdDest2,
+ kEoBBaseConeOfColdDest3,
+ kEoBBaseConeOfColdDest4,
+ kEoBBaseConeOfColdGfxTbl,
+
+ kRpgCommonDscDoorShapeIndex,
+ kEoBBaseWllFlagPreset,
+ kEoBBaseDscShapeCoords,
+
+ kRpgCommonDscDoorScaleOffs,
+ kEoBBaseDscDoorScaleMult1,
+ kEoBBaseDscDoorScaleMult2,
+ kEoBBaseDscDoorScaleMult3,
+ kEoBBaseDscDoorType5Offs,
+ kEoBBaseDscDoorY1,
+ kRpgCommonDscDoorY2,
+ kRpgCommonDscDoorFrameY1,
+ kRpgCommonDscDoorFrameY2,
+
+ kEoBBaseDscItemPosIndex,
+ kEoBBaseDscItemShpX,
+ kEoBBaseDscItemScaleIndex,
+ kEoBBaseDscItemTileIndex,
+ kEoBBaseDscItemShapeMap,
+ kEoBBaseDscTelptrShpCoords,
+
+ kEoBBasePortalSeqData,
+ kEoBBaseManDef,
+ kEoBBaseManWord,
+ kEoBBaseManPrompt,
+
+ kEoBBaseDscMonsterFrmOffsTbl1,
+ kEoBBaseDscMonsterFrmOffsTbl2,
+
+ kEoBBaseInvSlotX,
+ kEoBBaseInvSlotY,
+ kEoBBaseSlotValidationFlags,
+
+ kEoBBaseProjectileWeaponTypes,
+ kEoBBaseWandTypes,
+
+ kEoBBaseDrawObjPosIndex,
+ kEoBBaseFlightObjFlipIndex,
+ kEoBBaseFlightObjShpMap,
+ kEoBBaseFlightObjSclIndex,
+
+ kEoB2MainMenuStrings,
+
+ kEoB2TransferPortraitFrames,
+ kEoB2TransferConvertTable,
+ kEoB2TransferItemTable,
+ kEoB2TransferExpTable,
+ kEoB2TransferStrings1,
+ kEoB2TransferStrings2,
+ kEoB2TransferLabels,
+
+ kEoB2IntroStrings,
+ kEoB2IntroCPSFiles,
+ kEoB2IntroAnimData00,
+ kEoB2IntroAnimData01,
+ kEoB2IntroAnimData02,
+ kEoB2IntroAnimData03,
+ kEoB2IntroAnimData04,
+ kEoB2IntroAnimData05,
+ kEoB2IntroAnimData06,
+ kEoB2IntroAnimData07,
+ kEoB2IntroAnimData08,
+ kEoB2IntroAnimData09,
+ kEoB2IntroAnimData10,
+ kEoB2IntroAnimData11,
+ kEoB2IntroAnimData12,
+ kEoB2IntroAnimData13,
+ kEoB2IntroAnimData14,
+ kEoB2IntroAnimData15,
+ kEoB2IntroAnimData16,
+ kEoB2IntroAnimData17,
+ kEoB2IntroAnimData18,
+ kEoB2IntroAnimData19,
+ kEoB2IntroAnimData20,
+ kEoB2IntroAnimData21,
+ kEoB2IntroAnimData22,
+ kEoB2IntroAnimData23,
+ kEoB2IntroAnimData24,
+ kEoB2IntroAnimData25,
+ kEoB2IntroAnimData26,
+ kEoB2IntroAnimData27,
+ kEoB2IntroAnimData28,
+ kEoB2IntroAnimData29,
+ kEoB2IntroAnimData30,
+ kEoB2IntroAnimData31,
+ kEoB2IntroAnimData32,
+ kEoB2IntroAnimData33,
+ kEoB2IntroAnimData34,
+ kEoB2IntroAnimData35,
+ kEoB2IntroAnimData36,
+ kEoB2IntroAnimData37,
+ kEoB2IntroAnimData38,
+ kEoB2IntroAnimData39,
+ kEoB2IntroAnimData40,
+
+ kEoB2IntroShapes00,
+ kEoB2IntroShapes01,
+ kEoB2IntroShapes04,
+ kEoB2IntroShapes07,
+ kEoB2IntroShapes13,
+ kEoB2IntroShapes14,
+ kEoB2IntroShapes15,
+
+ kEoB2FinaleStrings,
+ kEoB2FinaleCPSFiles,
+ kEoB2FinaleAnimData00,
+ kEoB2FinaleAnimData01,
+ kEoB2FinaleAnimData02,
+ kEoB2FinaleAnimData03,
+ kEoB2FinaleAnimData04,
+ kEoB2FinaleAnimData05,
+ kEoB2FinaleAnimData06,
+ kEoB2FinaleAnimData07,
+ kEoB2FinaleAnimData08,
+ kEoB2FinaleAnimData09,
+ kEoB2FinaleAnimData10,
+ kEoB2FinaleAnimData11,
+ kEoB2FinaleAnimData12,
+ kEoB2FinaleAnimData13,
+ kEoB2FinaleAnimData14,
+ kEoB2FinaleAnimData15,
+ kEoB2FinaleAnimData16,
+ kEoB2FinaleAnimData17,
+ kEoB2FinaleAnimData18,
+ kEoB2FinaleAnimData19,
+ kEoB2FinaleAnimData20,
+ kEoB2FinaleShapes00,
+ kEoB2FinaleShapes03,
+ kEoB2FinaleShapes07,
+ kEoB2FinaleShapes09,
+ kEoB2FinaleShapes10,
+
+ kEoB2NpcShapeData,
+ kEoBBaseClassModifierFlags,
+
+ kEoBBaseMonsterStepTable02,
+ kEoBBaseMonsterStepTable1,
+ kEoBBaseMonsterStepTable2,
+ kEoBBaseMonsterStepTable3,
+ kEoBBaseMonsterCloseAttPosTable1,
+ kEoBBaseMonsterCloseAttPosTable22,
+ kEoBBaseMonsterCloseAttUnkTable,
+ kEoBBaseMonsterCloseAttChkTable1,
+ kEoBBaseMonsterCloseAttChkTable2,
+ kEoBBaseMonsterCloseAttDstTable1,
+ kEoBBaseMonsterCloseAttDstTable2,
+
+ kEoBBaseMonsterProximityTable,
+ kEoBBaseFindBlockMonstersTable,
+ kEoBBaseMonsterDirChangeTable,
+ kEoBBaseMonsterDistAttStrings,
+ kEoBBaseEncodeMonsterDefs,
+ kEoBBaseNpcPresets,
+ kEoB2Npc1Strings,
+ kEoB2Npc2Strings,
+ kEoB2MonsterDustStrings,
+ kEoB2DreamSteps,
+ kEoB2KheldranStrings,
+ kEoB2HornStrings,
+ kEoB2HornSounds,
+ kEoB2WallOfForceDsX,
+ kEoB2WallOfForceDsY,
+ kEoB2WallOfForceNumW,
+ kEoB2WallOfForceNumH,
+ kEoB2WallOfForceShpId,
+
+ kRpgCommonDscShapeIndex,
+ kRpgCommonDscX,
+ kRpgCommonDscTileIndex,
+ kRpgCommonDscDimData1,
+ kRpgCommonDscDimData2,
+ kRpgCommonDscBlockMap,
+ kRpgCommonDscDimMap,
+ kRpgCommonDscBlockIndex,
+
+ kEoBBaseSoundMap,
+ kEoB2SoundMapExtra,
+ kEoB2SoundIndex1,
+ kEoB2SoundIndex2,
+ kEoB2SoundFilesIngame2,
+ kEoB2MonsterSoundPatchData,
+ kEoBBaseLevelSoundFiles1,
+ kEoBBaseLevelSoundFiles2,
+ kEoBBaseSoundFilesIntro,
+ kEoBBaseSoundFilesIngame,
+ kEoBBaseSoundFilesFinale,
+
+ -1
+};
+
const int eob2PC98Need[] = {
kEoBBaseChargenStrings1,
kEoBBaseChargenStrings2,
@@ -3263,7 +3598,7 @@ const GameNeed gameNeedTable[] = {
//{ kEoB1, kPlatformPC98, kNoSpecial, eob1PC98Need },
{ kEoB2, kPlatformDOS, kNoSpecial, eob2FloppyNeed },
- //{ kEoB2, kPlatformAmiga, kNoSpecial, eob2AmigaNeed },
+ { kEoB2, kPlatformAmiga, kNoSpecial, eob2AmigaNeed },
//{ kEoB2, kPlatformPC98, kNoSpecial, eob2PC98Need },
{ kEoB2, kPlatformFMTowns, kNoSpecial, eob2FMTownsNeed },
diff --git a/devtools/create_kyradat/resources.cpp b/devtools/create_kyradat/resources.cpp
index 4de1d41..36e6b0b 100644
--- a/devtools/create_kyradat/resources.cpp
+++ b/devtools/create_kyradat/resources.cpp
@@ -104,9 +104,9 @@
#include "resources/eob2_dos.h"
#include "resources/eob2_dos_english.h"
#include "resources/eob2_dos_german.h"
-//#include "resources/eob2_amiga.h"
-//#include "resources/eob2_amiga_english.h"
-//#include "resources/eob2_amiga_german.h"
+#include "resources/eob2_amiga.h"
+#include "resources/eob2_amiga_english.h"
+#include "resources/eob2_amiga_german.h"
//#include "resources/eob2_pc98.h"
//#include "resources/eob2_pc98_japanese.h"
#include "resources/eob2_fmtowns.h"
@@ -1595,8 +1595,8 @@ static const ResourceProvider resourceProviders[] = {
{ kEoBBaseEncodeMonsterDefs, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1EncodeMonsterDefsAmigaProvider },
{ kEoBBaseNpcPresets, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1NpcPresetsAmigaProvider },
{ kEoBBaseSoundMap, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1SoundMapAmigaProvider },
- { kEoB1LevelSoundFiles1, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1LevelSoundFiles1AmigaProvider },
- { kEoB1LevelSoundFiles2, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1LevelSoundFiles2AmigaProvider },
+ { kEoBBaseLevelSoundFiles1, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1LevelSoundFiles1AmigaProvider },
+ { kEoBBaseLevelSoundFiles2, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1LevelSoundFiles2AmigaProvider },
{ kEoBBaseSoundFilesIntro, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1SoundFilesIntroAmigaProvider },
{ kEoBBaseSoundFilesIngame, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1SoundFilesIngameAmigaProvider },
{ kEoBBaseSoundFilesFinale, kEoB1, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB1SoundFilesFinaleAmigaProvider },
@@ -2073,6 +2073,407 @@ 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, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ChargenStrings1AmigaEnglishProvider },
+ { kEoBBaseChargenStrings2, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ChargenStrings2AmigaEnglishProvider },
+ { kEoBBaseChargenStartLevels, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ChargenStartLevelsAmigaProvider },
+ { kEoBBaseChargenStatStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ChargenStatStringsAmigaEnglishProvider },
+ { kEoBBaseChargenRaceSexStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ChargenRaceSexStringsAmigaEnglishProvider },
+ { kEoBBaseChargenClassStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ChargenClassStringsAmigaEnglishProvider },
+ { kEoBBaseChargenAlignmentStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ChargenAlignmentStringsAmigaEnglishProvider },
+ { kEoBBaseChargenEnterGameStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ChargenEnterGameStringsAmigaEnglishProvider },
+ { kEoBBaseChargenClassMinStats, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ChargenClassMinStatsAmigaProvider },
+ { kEoBBaseChargenRaceMinStats, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ChargenRaceMinStatsAmigaProvider },
+ { kEoBBaseChargenRaceMaxStats, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ChargenRaceMaxStatsAmigaProvider },
+ { kEoBBaseSaveThrowTable1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable1AmigaProvider },
+ { kEoBBaseSaveThrowTable2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable2AmigaProvider },
+ { kEoBBaseSaveThrowTable3, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable3AmigaProvider },
+ { kEoBBaseSaveThrowTable4, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SaveThrowTable4AmigaProvider },
+ { kEoBBaseSaveThrwLvlIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SaveThrwLvlIndexAmigaProvider },
+ { kEoBBaseSaveThrwModDiv, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SaveThrwModDivAmigaProvider },
+ { kEoBBaseSaveThrwModExt, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SaveThrwModExtAmigaProvider },
+ { kEoBBasePryDoorStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2PryDoorStringsAmigaEnglishProvider },
+ { kEoBBaseWarningStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2WarningStringsAmigaEnglishProvider },
+ { kEoBBaseItemSuffixStringsRings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ItemSuffixStringsRingsAmigaEnglishProvider },
+ { kEoBBaseItemSuffixStringsPotions, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ItemSuffixStringsPotionsAmigaEnglishProvider },
+ { kEoBBaseItemSuffixStringsWands, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ItemSuffixStringsWandsAmigaEnglishProvider },
+ { kEoBBaseRipItemStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2RipItemStringsAmigaEnglishProvider },
+ { kEoBBaseCursedString, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CursedStringAmigaEnglishProvider },
+ { kEoBBaseEnchantedString, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2EnchantedStringAmigaProvider },
+ { kEoBBaseMagicObjectStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicObjectStringsAmigaEnglishProvider },
+ { kEoBBaseMagicObjectString5, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicObjectString5AmigaEnglishProvider },
+ { kEoBBasePatternSuffix, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2PatternSuffixAmigaEnglishProvider },
+ { kEoBBasePatternGrFix1, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2PatternGrFix1AmigaEnglishProvider },
+ { kEoBBasePatternGrFix2, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2PatternGrFix2AmigaEnglishProvider },
+ { kEoBBaseValidateArmorString, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ValidateArmorStringAmigaEnglishProvider },
+ { kEoBBaseValidateCursedString, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ValidateCursedStringAmigaEnglishProvider },
+ { kEoBBaseValidateNoDropString, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ValidateNoDropStringAmigaEnglishProvider },
+ { kEoBBasePotionStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2PotionStringsAmigaEnglishProvider },
+ { kEoBBaseWandStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2WandStringsAmigaEnglishProvider },
+ { kEoBBaseItemMisuseStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ItemMisuseStringsAmigaEnglishProvider },
+ { kEoBBaseTakenStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2TakenStringsAmigaEnglishProvider },
+ { kEoBBasePotionEffectStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2PotionEffectStringsAmigaEnglishProvider },
+ { kEoBBaseYesNoStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2YesNoStringsAmigaEnglishProvider },
+ { kRpgCommonMoreStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MoreStringsAmigaEnglishProvider },
+ { kEoBBaseNpcMaxStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2NpcMaxStringsAmigaEnglishProvider },
+ { kEoBBaseOkStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2OkStringsAmigaEnglishProvider },
+ { kEoBBaseNpcJoinStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2NpcJoinStringsAmigaEnglishProvider },
+ { kEoBBaseCancelStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CancelStringsAmigaEnglishProvider },
+ { kEoBBaseAbortStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2AbortStringsAmigaEnglishProvider },
+ { kEoBBaseMenuStringsMain, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsMainAmigaEnglishProvider },
+ { kEoBBaseMenuStringsSaveLoad, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsSaveLoadAmigaEnglishProvider },
+ { kEoBBaseMenuStringsOnOff, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsOnOffAmigaEnglishProvider },
+ { kEoBBaseMenuStringsSpells, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsSpellsAmigaEnglishProvider },
+ { kEoBBaseMenuStringsRest, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsRestAmigaEnglishProvider },
+ { kEoBBaseMenuStringsDrop, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsDropAmigaEnglishProvider },
+ { kEoBBaseMenuStringsExit, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsExitAmigaEnglishProvider },
+ { kEoBBaseMenuStringsStarve, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsStarveAmigaEnglishProvider },
+ { kEoBBaseMenuStringsScribe, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsScribeAmigaEnglishProvider },
+ { kEoBBaseMenuStringsDrop2, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsDrop2AmigaEnglishProvider },
+ { kEoBBaseMenuStringsHead, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsHeadAmigaEnglishProvider },
+ { kEoBBaseMenuStringsPoison, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsPoisonAmigaEnglishProvider },
+ { kEoBBaseMenuStringsMgc, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsMgcAmigaEnglishProvider },
+ { kEoBBaseMenuStringsPrefs, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsPrefsAmigaEnglishProvider },
+ { kEoBBaseMenuStringsRest2, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsRest2AmigaEnglishProvider },
+ { kEoBBaseMenuStringsRest3, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsRest3AmigaEnglishProvider },
+ { kEoBBaseMenuStringsRest4, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsRest4AmigaEnglishProvider },
+ { kEoBBaseMenuStringsDefeat, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsDefeatAmigaEnglishProvider },
+ { kEoBBaseMenuStringsTransfer, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsTransferAmigaEnglishProvider },
+ { kEoBBaseMenuStringsSpec, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuStringsSpecAmigaEnglishProvider },
+ { kEoBBaseMenuStringsSpellNo, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MenuStringsSpellNoAmigaProvider },
+ { kEoBBaseMenuYesNoStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MenuYesNoStringsAmigaEnglishProvider },
+ { kEoBBaseSpellLevelsMage, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SpellLevelsMageAmigaProvider },
+ { kEoBBaseSpellLevelsCleric, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SpellLevelsClericAmigaProvider },
+ { kEoBBaseNumSpellsCleric, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2NumSpellsClericAmigaProvider },
+ { kEoBBaseNumSpellsWisAdj, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2NumSpellsWisAdjAmigaProvider },
+ { kEoBBaseNumSpellsPal, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2NumSpellsPalAmigaProvider },
+ { kEoBBaseNumSpellsMage, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2NumSpellsMageAmigaProvider },
+ { kEoBBaseCharGuiStringsHp, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsHpAmigaEnglishProvider },
+ { kEoBBaseCharGuiStringsWp2, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsWp2AmigaEnglishProvider },
+ { kEoBBaseCharGuiStringsWr, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsWrAmigaEnglishProvider },
+ { kEoBBaseCharGuiStringsSt2, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsSt2AmigaEnglishProvider },
+ { kEoBBaseCharGuiStringsIn, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharGuiStringsInAmigaEnglishProvider },
+ { kEoBBaseCharStatusStrings7, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings7AmigaEnglishProvider },
+ { kEoBBaseCharStatusStrings82, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings82AmigaEnglishProvider },
+ { kEoBBaseCharStatusStrings9, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings9AmigaEnglishProvider },
+ { kEoBBaseCharStatusStrings12, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings12AmigaEnglishProvider },
+ { kEoBBaseCharStatusStrings132, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2CharStatusStrings132AmigaEnglishProvider },
+ { kEoBBaseLevelGainStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2LevelGainStringsAmigaEnglishProvider },
+ { kEoBBaseExperienceTable0, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable0AmigaProvider },
+ { kEoBBaseExperienceTable1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable1AmigaProvider },
+ { kEoBBaseExperienceTable2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable2AmigaProvider },
+ { kEoBBaseExperienceTable3, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable3AmigaProvider },
+ { kEoBBaseExperienceTable4, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExperienceTable4AmigaProvider },
+ { kEoBBaseBookNumbers, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2BookNumbersAmigaEnglishProvider },
+ { kEoBBaseMageSpellsList, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MageSpellsListAmigaEnglishProvider },
+ { kEoBBaseClericSpellsList, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ClericSpellsListAmigaEnglishProvider },
+ { kEoBBaseSpellNames, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2SpellNamesAmigaEnglishProvider },
+ { kEoBBaseMagicStrings1, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicStrings1AmigaEnglishProvider },
+ { kEoBBaseMagicStrings2, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicStrings2AmigaEnglishProvider },
+ { kEoBBaseMagicStrings3, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicStrings3AmigaEnglishProvider },
+ { kEoBBaseMagicStrings4, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicStrings4AmigaEnglishProvider },
+ { kEoBBaseMagicStrings6, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicStrings6AmigaEnglishProvider },
+ { kEoBBaseMagicStrings7, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicStrings7AmigaEnglishProvider },
+ { kEoBBaseMagicStrings8, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MagicStrings8AmigaEnglishProvider },
+ { kEoBBaseExpObjectTlMode, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTlModeAmigaProvider },
+ { kEoBBaseExpObjectTblIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTblIndexAmigaProvider },
+ { kEoBBaseExpObjectShpStart, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExpObjectShpStartAmigaProvider },
+ { kEoBBaseExpObjectTbl1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl1AmigaProvider },
+ { kEoBBaseExpObjectTbl2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl2AmigaProvider },
+ { kEoBBaseExpObjectTbl3, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExpObjectTbl3AmigaProvider },
+ { kEoBBaseExpObjectY, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ExpObjectYAmigaProvider },
+ { kEoBBaseSparkDefSteps, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkDefStepsAmigaProvider },
+ { kEoBBaseSparkDefSubSteps, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkDefSubStepsAmigaProvider },
+ { kEoBBaseSparkDefShift, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkDefShiftAmigaProvider },
+ { kEoBBaseSparkDefAdd, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkDefAddAmigaProvider },
+ { kEoBBaseSparkDefX, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkDefXAmigaProvider },
+ { kEoBBaseSparkDefY, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkDefYAmigaProvider },
+ { kEoBBaseSparkOfFlags1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkOfFlags1AmigaProvider },
+ { kEoBBaseSparkOfFlags2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkOfFlags2AmigaProvider },
+ { kEoBBaseSparkOfShift, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkOfShiftAmigaProvider },
+ { kEoBBaseSparkOfX, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkOfXAmigaProvider },
+ { kEoBBaseSparkOfY, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SparkOfYAmigaProvider },
+ { kEoBBaseSpellProperties, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SpellPropertiesAmigaProvider },
+ { kEoBBaseMagicFlightProps, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MagicFlightPropsAmigaProvider },
+ { kEoBBaseTurnUndeadEffect, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2TurnUndeadEffectAmigaProvider },
+ { kEoBBaseBurningHandsDest, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2BurningHandsDestAmigaProvider },
+ { kEoBBaseConeOfColdDest1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest1AmigaProvider },
+ { kEoBBaseConeOfColdDest2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest2AmigaProvider },
+ { kEoBBaseConeOfColdDest3, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest3AmigaProvider },
+ { kEoBBaseConeOfColdDest4, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdDest4AmigaProvider },
+ { kEoBBaseConeOfColdGfxTbl, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ConeOfColdGfxTblAmigaProvider },
+ { kRpgCommonDscDoorShapeIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorShapeIndexAmigaProvider },
+ { kEoBBaseWllFlagPreset, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2WllFlagPresetAmigaProvider },
+ { kEoBBaseDscShapeCoords, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscShapeCoordsAmigaProvider },
+ { kRpgCommonDscDoorScaleOffs, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleOffsAmigaProvider },
+ { kEoBBaseDscDoorScaleMult1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult1AmigaProvider },
+ { kEoBBaseDscDoorScaleMult2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult2AmigaProvider },
+ { kEoBBaseDscDoorScaleMult3, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorScaleMult3AmigaProvider },
+ { kEoBBaseDscDoorType5Offs, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorType5OffsAmigaProvider },
+ { kEoBBaseDscDoorY1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorY1AmigaProvider },
+ { kRpgCommonDscDoorY2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorY2AmigaProvider },
+ { kRpgCommonDscDoorFrameY1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorFrameY1AmigaProvider },
+ { kRpgCommonDscDoorFrameY2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDoorFrameY2AmigaProvider },
+ { kEoBBaseDscItemPosIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscItemPosIndexAmigaProvider },
+ { kEoBBaseDscItemShpX, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscItemShpXAmigaProvider },
+ { kEoBBaseDscItemScaleIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscItemScaleIndexAmigaProvider },
+ { kEoBBaseDscItemTileIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscItemTileIndexAmigaProvider },
+ { kEoBBaseDscItemShapeMap, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscItemShapeMapAmigaProvider },
+ { kEoBBaseDscTelptrShpCoords, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscTelptrShpCoordsAmigaProvider },
+ { kEoBBasePortalSeqData, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2PortalSeqDataAmigaProvider },
+ { kEoBBaseManDef, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ManDefAmigaEnglishProvider },
+ { kEoBBaseManWord, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ManWordAmigaEnglishProvider },
+ { kEoBBaseManPrompt, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2ManPromptAmigaEnglishProvider },
+ { kEoBBaseDscMonsterFrmOffsTbl1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscMonsterFrmOffsTbl1AmigaProvider },
+ { kEoBBaseDscMonsterFrmOffsTbl2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscMonsterFrmOffsTbl2AmigaProvider },
+ { kEoBBaseInvSlotX, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2InvSlotXAmigaProvider },
+ { kEoBBaseInvSlotY, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2InvSlotYAmigaProvider },
+ { kEoBBaseSlotValidationFlags, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SlotValidationFlagsAmigaProvider },
+ { kEoBBaseProjectileWeaponTypes, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ProjectileWeaponTypesAmigaProvider },
+ { kEoBBaseWandTypes, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2WandTypesAmigaProvider },
+ { kEoBBaseDrawObjPosIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DrawObjPosIndexAmigaProvider },
+ { kEoBBaseFlightObjFlipIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FlightObjFlipIndexAmigaProvider },
+ { kEoBBaseFlightObjShpMap, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FlightObjShpMapAmigaProvider },
+ { kEoBBaseFlightObjSclIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FlightObjSclIndexAmigaProvider },
+ { kEoB2MainMenuStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MainMenuStringsAmigaEnglishProvider },
+ { kEoB2TransferPortraitFrames, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2TransferPortraitFramesAmigaProvider },
+ { kEoB2TransferConvertTable, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2TransferConvertTableAmigaProvider },
+ { kEoB2TransferItemTable, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2TransferItemTableAmigaProvider },
+ { kEoB2TransferExpTable, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2TransferExpTableAmigaProvider },
+ { kEoB2TransferStrings1, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2TransferStrings1AmigaEnglishProvider },
+ { kEoB2TransferStrings2, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2TransferStrings2AmigaEnglishProvider },
+ { kEoB2TransferLabels, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2TransferLabelsAmigaEnglishProvider },
+ { kEoB2IntroStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2IntroStringsAmigaEnglishProvider },
+ { kEoB2IntroCPSFiles, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2IntroCPSFilesAmigaEnglishProvider },
+ { kEoB2IntroAnimData00, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData00AmigaProvider },
+ { kEoB2IntroAnimData01, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData01AmigaProvider },
+ { kEoB2IntroAnimData02, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData02AmigaProvider },
+ { kEoB2IntroAnimData03, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData03AmigaProvider },
+ { kEoB2IntroAnimData04, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData04AmigaProvider },
+ { kEoB2IntroAnimData05, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData05AmigaProvider },
+ { kEoB2IntroAnimData06, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData06AmigaProvider },
+ { kEoB2IntroAnimData07, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData07AmigaProvider },
+ { kEoB2IntroAnimData08, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData08AmigaProvider },
+ { kEoB2IntroAnimData09, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData09AmigaProvider },
+ { kEoB2IntroAnimData10, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData10AmigaProvider },
+ { kEoB2IntroAnimData11, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData11AmigaProvider },
+ { kEoB2IntroAnimData12, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData12AmigaProvider },
+ { kEoB2IntroAnimData13, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData13AmigaProvider },
+ { kEoB2IntroAnimData14, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData14AmigaProvider },
+ { kEoB2IntroAnimData15, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData15AmigaProvider },
+ { kEoB2IntroAnimData16, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData16AmigaProvider },
+ { kEoB2IntroAnimData17, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData17AmigaProvider },
+ { kEoB2IntroAnimData18, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData18AmigaProvider },
+ { kEoB2IntroAnimData19, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData19AmigaProvider },
+ { kEoB2IntroAnimData20, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData20AmigaProvider },
+ { kEoB2IntroAnimData21, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData21AmigaProvider },
+ { kEoB2IntroAnimData22, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData22AmigaProvider },
+ { kEoB2IntroAnimData23, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData23AmigaProvider },
+ { kEoB2IntroAnimData24, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData24AmigaProvider },
+ { kEoB2IntroAnimData25, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData25AmigaProvider },
+ { kEoB2IntroAnimData26, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData26AmigaProvider },
+ { kEoB2IntroAnimData27, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData27AmigaProvider },
+ { kEoB2IntroAnimData28, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData28AmigaProvider },
+ { kEoB2IntroAnimData29, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData29AmigaProvider },
+ { kEoB2IntroAnimData30, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData30AmigaProvider },
+ { kEoB2IntroAnimData31, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData31AmigaProvider },
+ { kEoB2IntroAnimData32, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData32AmigaProvider },
+ { kEoB2IntroAnimData33, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData33AmigaProvider },
+ { kEoB2IntroAnimData34, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData34AmigaProvider },
+ { kEoB2IntroAnimData35, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData35AmigaProvider },
+ { kEoB2IntroAnimData36, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData36AmigaProvider },
+ { kEoB2IntroAnimData37, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData37AmigaProvider },
+ { kEoB2IntroAnimData38, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData38AmigaProvider },
+ { kEoB2IntroAnimData39, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData39AmigaProvider },
+ { kEoB2IntroAnimData40, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroAnimData40AmigaProvider },
+ { kEoB2IntroShapes00, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroShapes00AmigaProvider },
+ { kEoB2IntroShapes01, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroShapes01AmigaProvider },
+ { kEoB2IntroShapes04, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroShapes04AmigaProvider },
+ { kEoB2IntroShapes07, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroShapes07AmigaProvider },
+ { kEoB2IntroShapes13, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroShapes13AmigaProvider },
+ { kEoB2IntroShapes14, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroShapes14AmigaProvider },
+ { kEoB2IntroShapes15, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2IntroShapes15AmigaProvider },
+ { kEoB2FinaleStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2FinaleStringsAmigaEnglishProvider },
+ { kEoB2FinaleCPSFiles, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2FinaleCPSFilesAmigaEnglishProvider },
+ { kEoB2FinaleAnimData00, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData00AmigaProvider },
+ { kEoB2FinaleAnimData01, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData01AmigaProvider },
+ { kEoB2FinaleAnimData02, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData02AmigaProvider },
+ { kEoB2FinaleAnimData03, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData03AmigaProvider },
+ { kEoB2FinaleAnimData04, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData04AmigaProvider },
+ { kEoB2FinaleAnimData05, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData05AmigaProvider },
+ { kEoB2FinaleAnimData06, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData06AmigaProvider },
+ { kEoB2FinaleAnimData07, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData07AmigaProvider },
+ { kEoB2FinaleAnimData08, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData08AmigaProvider },
+ { kEoB2FinaleAnimData09, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData09AmigaProvider },
+ { kEoB2FinaleAnimData10, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData10AmigaProvider },
+ { kEoB2FinaleAnimData11, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData11AmigaProvider },
+ { kEoB2FinaleAnimData12, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData12AmigaProvider },
+ { kEoB2FinaleAnimData13, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData13AmigaProvider },
+ { kEoB2FinaleAnimData14, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData14AmigaProvider },
+ { kEoB2FinaleAnimData15, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData15AmigaProvider },
+ { kEoB2FinaleAnimData16, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData16AmigaProvider },
+ { kEoB2FinaleAnimData17, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData17AmigaProvider },
+ { kEoB2FinaleAnimData18, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData18AmigaProvider },
+ { kEoB2FinaleAnimData19, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData19AmigaProvider },
+ { kEoB2FinaleAnimData20, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleAnimData20AmigaProvider },
+ { kEoB2FinaleShapes00, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes00AmigaProvider },
+ { kEoB2FinaleShapes03, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes03AmigaProvider },
+ { kEoB2FinaleShapes07, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes07AmigaProvider },
+ { kEoB2FinaleShapes09, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes09AmigaProvider },
+ { kEoB2FinaleShapes10, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FinaleShapes10AmigaProvider },
+ { kEoB2NpcShapeData, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2NpcShapeDataAmigaProvider },
+ { kEoBBaseClassModifierFlags, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2ClassModifierFlagsAmigaProvider },
+ { kEoBBaseMonsterStepTable02, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable02AmigaProvider },
+ { kEoBBaseMonsterStepTable1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable1AmigaProvider },
+ { kEoBBaseMonsterStepTable2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable2AmigaProvider },
+ { kEoBBaseMonsterStepTable3, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterStepTable3AmigaProvider },
+ { kEoBBaseMonsterCloseAttPosTable1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttPosTable1AmigaProvider },
+ { kEoBBaseMonsterCloseAttPosTable22, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttPosTable22AmigaProvider },
+ { kEoBBaseMonsterCloseAttUnkTable, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttUnkTableAmigaProvider },
+ { kEoBBaseMonsterCloseAttChkTable1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttChkTable1AmigaProvider },
+ { kEoBBaseMonsterCloseAttChkTable2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttChkTable2AmigaProvider },
+ { kEoBBaseMonsterCloseAttDstTable1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttDstTable1AmigaProvider },
+ { kEoBBaseMonsterCloseAttDstTable2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterCloseAttDstTable2AmigaProvider },
+ { kEoBBaseMonsterProximityTable, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterProximityTableAmigaProvider },
+ { kEoBBaseFindBlockMonstersTable, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2FindBlockMonstersTableAmigaProvider },
+ { kEoBBaseMonsterDirChangeTable, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterDirChangeTableAmigaProvider },
+ { kEoBBaseMonsterDistAttStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MonsterDistAttStringsAmigaEnglishProvider },
+ { kEoBBaseEncodeMonsterDefs, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2EncodeMonsterDefsAmigaProvider },
+ { kEoBBaseNpcPresets, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2NpcPresetsAmigaProvider },
+ { kEoBBaseSoundMap, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SoundMapAmigaProvider },
+ { kEoB2SoundMapExtra, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SoundMapExtraAmigaProvider },
+ { kEoB2SoundIndex1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SoundIndex1AmigaProvider },
+ { kEoB2SoundIndex2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SoundIndex2AmigaProvider },
+ { kEoB2SoundFilesIngame2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SoundFilesIngame2AmigaProvider },
+ { kEoB2MonsterSoundPatchData, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2MonsterSoundPatchDataAmigaProvider },
+ { kEoBBaseLevelSoundFiles1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2LevelSoundFiles1AmigaProvider },
+ { kEoBBaseLevelSoundFiles2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2LevelSoundFiles2AmigaProvider },
+ { kEoBBaseSoundFilesIntro, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SoundFilesIntroAmigaProvider },
+ { kEoBBaseSoundFilesIngame, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SoundFilesIngameAmigaProvider },
+ { kEoBBaseSoundFilesFinale, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2SoundFilesFinaleAmigaProvider },
+ { kEoB2Npc1Strings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2Npc1StringsAmigaEnglishProvider },
+ { kEoB2Npc2Strings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2Npc2StringsAmigaEnglishProvider },
+ { kEoB2MonsterDustStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2MonsterDustStringsAmigaEnglishProvider },
+ { kEoB2DreamSteps, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DreamStepsAmigaProvider },
+ { kEoB2KheldranStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2KheldranStringsAmigaEnglishProvider },
+ { kEoB2HornStrings, kEoB2, kPlatformAmiga, kNoSpecial, EN_ANY, &kEoB2HornStringsAmigaEnglishProvider },
+ { kEoB2HornSounds, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2HornSoundsAmigaProvider },
+ { kEoB2WallOfForceDsX, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2WallOfForceDsXAmigaProvider },
+ { kEoB2WallOfForceDsY, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2WallOfForceDsYAmigaProvider },
+ { kEoB2WallOfForceNumW, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2WallOfForceNumWAmigaProvider },
+ { kEoB2WallOfForceNumH, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2WallOfForceNumHAmigaProvider },
+ { kEoB2WallOfForceShpId, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2WallOfForceShpIdAmigaProvider },
+ { kRpgCommonDscShapeIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscShapeIndexAmigaProvider },
+ { kRpgCommonDscX, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscXAmigaProvider },
+ { kRpgCommonDscTileIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscTileIndexAmigaProvider },
+ { kRpgCommonDscDimData1, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDimData1AmigaProvider },
+ { kRpgCommonDscDimData2, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDimData2AmigaProvider },
+ { kRpgCommonDscBlockMap, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscBlockMapAmigaProvider },
+ { kRpgCommonDscDimMap, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscDimMapAmigaProvider },
+ { kRpgCommonDscBlockIndex, kEoB2, kPlatformAmiga, kNoSpecial, UNK_LANG, &kEoB2DscBlockIndexAmigaProvider },
+ { kEoBBaseChargenStrings1, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ChargenStrings1AmigaGermanProvider },
+ { kEoBBaseChargenStrings2, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ChargenStrings2AmigaGermanProvider },
+ { kEoBBaseChargenStatStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ChargenStatStringsAmigaGermanProvider },
+ { kEoBBaseChargenRaceSexStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ChargenRaceSexStringsAmigaGermanProvider },
+ { kEoBBaseChargenClassStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ChargenClassStringsAmigaGermanProvider },
+ { kEoBBaseChargenAlignmentStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ChargenAlignmentStringsAmigaGermanProvider },
+ { kEoBBaseChargenEnterGameStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ChargenEnterGameStringsAmigaGermanProvider },
+ { kEoBBasePryDoorStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2PryDoorStringsAmigaGermanProvider },
+ { kEoBBaseWarningStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2WarningStringsAmigaGermanProvider },
+ { kEoBBaseItemSuffixStringsRings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ItemSuffixStringsRingsAmigaGermanProvider },
+ { kEoBBaseItemSuffixStringsPotions, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ItemSuffixStringsPotionsAmigaGermanProvider },
+ { kEoBBaseItemSuffixStringsWands, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ItemSuffixStringsWandsAmigaGermanProvider },
+ { kEoBBaseRipItemStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2RipItemStringsAmigaGermanProvider },
+ { kEoBBaseCursedString, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CursedStringAmigaGermanProvider },
+ { kEoBBaseMagicObjectStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicObjectStringsAmigaGermanProvider },
+ { kEoBBaseMagicObjectString5, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicObjectString5AmigaGermanProvider },
+ { kEoBBasePatternSuffix, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2PatternSuffixAmigaGermanProvider },
+ { kEoBBasePatternGrFix1, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2PatternGrFix1AmigaGermanProvider },
+ { kEoBBasePatternGrFix2, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2PatternGrFix2AmigaGermanProvider },
+ { kEoBBaseValidateArmorString, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ValidateArmorStringAmigaGermanProvider },
+ { kEoBBaseValidateCursedString, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ValidateCursedStringAmigaGermanProvider },
+ { kEoBBaseValidateNoDropString, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ValidateNoDropStringAmigaGermanProvider },
+ { kEoBBasePotionStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2PotionStringsAmigaGermanProvider },
+ { kEoBBaseWandStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2WandStringsAmigaGermanProvider },
+ { kEoBBaseItemMisuseStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ItemMisuseStringsAmigaGermanProvider },
+ { kEoBBaseTakenStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2TakenStringsAmigaGermanProvider },
+ { kEoBBasePotionEffectStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2PotionEffectStringsAmigaGermanProvider },
+ { kEoBBaseYesNoStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2YesNoStringsAmigaGermanProvider },
+ { kRpgCommonMoreStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MoreStringsAmigaGermanProvider },
+ { kEoBBaseNpcMaxStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2NpcMaxStringsAmigaGermanProvider },
+ { kEoBBaseOkStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2OkStringsAmigaGermanProvider },
+ { kEoBBaseNpcJoinStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2NpcJoinStringsAmigaGermanProvider },
+ { kEoBBaseCancelStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CancelStringsAmigaGermanProvider },
+ { kEoBBaseAbortStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2AbortStringsAmigaGermanProvider },
+ { kEoBBaseMenuStringsMain, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsMainAmigaGermanProvider },
+ { kEoBBaseMenuStringsSaveLoad, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsSaveLoadAmigaGermanProvider },
+ { kEoBBaseMenuStringsOnOff, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsOnOffAmigaGermanProvider },
+ { kEoBBaseMenuStringsSpells, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsSpellsAmigaGermanProvider },
+ { kEoBBaseMenuStringsRest, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsRestAmigaGermanProvider },
+ { kEoBBaseMenuStringsDrop, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsDropAmigaGermanProvider },
+ { kEoBBaseMenuStringsExit, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsExitAmigaGermanProvider },
+ { kEoBBaseMenuStringsStarve, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsStarveAmigaGermanProvider },
+ { kEoBBaseMenuStringsScribe, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsScribeAmigaGermanProvider },
+ { kEoBBaseMenuStringsDrop2, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsDrop2AmigaGermanProvider },
+ { kEoBBaseMenuStringsHead, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsHeadAmigaGermanProvider },
+ { kEoBBaseMenuStringsPoison, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsPoisonAmigaGermanProvider },
+ { kEoBBaseMenuStringsMgc, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsMgcAmigaGermanProvider },
+ { kEoBBaseMenuStringsPrefs, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsPrefsAmigaGermanProvider },
+ { kEoBBaseMenuStringsRest2, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsRest2AmigaGermanProvider },
+ { kEoBBaseMenuStringsRest3, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsRest3AmigaGermanProvider },
+ { kEoBBaseMenuStringsRest4, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsRest4AmigaGermanProvider },
+ { kEoBBaseMenuStringsDefeat, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsDefeatAmigaGermanProvider },
+ { kEoBBaseMenuStringsTransfer, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsTransferAmigaGermanProvider },
+ { kEoBBaseMenuStringsSpec, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuStringsSpecAmigaGermanProvider },
+ { kEoBBaseMenuYesNoStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MenuYesNoStringsAmigaGermanProvider },
+ { kEoBBaseCharGuiStringsHp, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsHpAmigaGermanProvider },
+ { kEoBBaseCharGuiStringsWp2, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsWp2AmigaGermanProvider },
+ { kEoBBaseCharGuiStringsWr, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsWrAmigaGermanProvider },
+ { kEoBBaseCharGuiStringsSt2, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsSt2AmigaGermanProvider },
+ { kEoBBaseCharGuiStringsIn, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharGuiStringsInAmigaGermanProvider },
+ { kEoBBaseCharStatusStrings7, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings7AmigaGermanProvider },
+ { kEoBBaseCharStatusStrings82, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings82AmigaGermanProvider },
+ { kEoBBaseCharStatusStrings9, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings9AmigaGermanProvider },
+ { kEoBBaseCharStatusStrings12, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings12AmigaGermanProvider },
+ { kEoBBaseCharStatusStrings132, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2CharStatusStrings132AmigaGermanProvider },
+ { kEoBBaseLevelGainStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2LevelGainStringsAmigaGermanProvider },
+ { kEoBBaseBookNumbers, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2BookNumbersAmigaGermanProvider },
+ { kEoBBaseMageSpellsList, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MageSpellsListAmigaGermanProvider },
+ { kEoBBaseClericSpellsList, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ClericSpellsListAmigaGermanProvider },
+ { kEoBBaseSpellNames, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2SpellNamesAmigaGermanProvider },
+ { kEoBBaseMagicStrings1, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicStrings1AmigaGermanProvider },
+ { kEoBBaseMagicStrings2, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicStrings2AmigaGermanProvider },
+ { kEoBBaseMagicStrings3, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicStrings3AmigaGermanProvider },
+ { kEoBBaseMagicStrings4, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicStrings4AmigaGermanProvider },
+ { kEoBBaseMagicStrings6, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicStrings6AmigaGermanProvider },
+ { kEoBBaseMagicStrings7, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicStrings7AmigaGermanProvider },
+ { kEoBBaseMagicStrings8, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MagicStrings8AmigaGermanProvider },
+ { kEoBBaseManDef, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ManDefAmigaGermanProvider },
+ { kEoBBaseManWord, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ManWordAmigaGermanProvider },
+ { kEoBBaseManPrompt, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2ManPromptAmigaGermanProvider },
+ { kEoB2MainMenuStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MainMenuStringsAmigaGermanProvider },
+ { kEoB2TransferStrings1, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2TransferStrings1AmigaGermanProvider },
+ { kEoB2TransferStrings2, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2TransferStrings2AmigaGermanProvider },
+ { kEoB2TransferLabels, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2TransferLabelsAmigaGermanProvider },
+ { kEoB2IntroStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2IntroStringsAmigaGermanProvider },
+ { kEoB2IntroCPSFiles, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2IntroCPSFilesAmigaGermanProvider },
+ { kEoB2FinaleStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2FinaleStringsAmigaGermanProvider },
+ { kEoB2FinaleCPSFiles, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2FinaleCPSFilesAmigaGermanProvider },
+ { kEoBBaseMonsterDistAttStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MonsterDistAttStringsAmigaGermanProvider },
+ { kEoB2Npc1Strings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2Npc1StringsAmigaGermanProvider },
+ { kEoB2Npc2Strings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2Npc2StringsAmigaGermanProvider },
+ { kEoB2MonsterDustStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2MonsterDustStringsAmigaGermanProvider },
+ { kEoB2KheldranStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2KheldranStringsAmigaGermanProvider },
+ { kEoB2HornStrings, kEoB2, kPlatformAmiga, kNoSpecial, DE_DEU, &kEoB2HornStringsAmigaGermanProvider },
+
+
+
+
+
+
{ kEoBBaseChargenStrings1, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenStrings1FMTownsJapaneseProvider },
{ kEoBBaseChargenStrings2, kEoB2, kPlatformFMTowns, kNoSpecial, JA_JPN, &kEoB2ChargenStrings2FMTownsJapaneseProvider },
{ kEoBBaseChargenStartLevels, kEoB2, kPlatformFMTowns, kNoSpecial, UNK_LANG, &kEoB2ChargenStartLevelsFMTownsProvider },
diff --git a/devtools/create_kyradat/resources/eob2_amiga.h b/devtools/create_kyradat/resources/eob2_amiga.h
new file mode 100644
index 0000000..16cb440
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob2_amiga.h
@@ -0,0 +1,2775 @@
+static const byte kEoB2ChargenStartLevelsAmiga[60] = {
+ 0x07, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01,
+ 0x06, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01,
+ 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01,
+ 0x06, 0x06, 0x00, 0x02, 0x06, 0x06, 0x00, 0x02,
+ 0x06, 0x05, 0x00, 0x02, 0x05, 0x05, 0x06, 0x03,
+ 0x06, 0x05, 0x00, 0x02, 0x06, 0x06, 0x00, 0x02,
+ 0x05, 0x05, 0x05, 0x03, 0x05, 0x06, 0x00, 0x02,
+ 0x06, 0x05, 0x00, 0x02
+};
+
+static const ByteProvider kEoB2ChargenStartLevelsAmigaProvider = { ARRAYSIZE(kEoB2ChargenStartLevelsAmiga), kEoB2ChargenStartLevelsAmiga };
+
+static const byte kEoB2ChargenClassMinStatsAmiga[90] = {
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00,
+ 0x0e, 0x0d, 0x0e, 0x00, 0x0c, 0x00, 0x0d, 0x00,
+ 0x09, 0x11, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00,
+ 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09,
+ 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09,
+ 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00,
+ 0x09, 0x09, 0x09, 0x00, 0x00, 0x00, 0x0d, 0x00,
+ 0x0e, 0x0d, 0x0e, 0x00, 0x00, 0x09, 0x09, 0x00,
+ 0x00, 0x00
+};
+
+static const ByteProvider kEoB2ChargenClassMinStatsAmigaProvider = { ARRAYSIZE(kEoB2ChargenClassMinStatsAmiga), kEoB2ChargenClassMinStatsAmiga };
+
+static const byte kEoB2ChargenRaceMinStatsAmiga[36] = {
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x08,
+ 0x03, 0x07, 0x06, 0x08, 0x03, 0x04, 0x03, 0x06,
+ 0x06, 0x03, 0x08, 0x03, 0x03, 0x03, 0x0c, 0x02,
+ 0x06, 0x07, 0x02, 0x03, 0x08, 0x03, 0x07, 0x06,
+ 0x03, 0x08, 0x0a, 0x06
+};
+
+static const ByteProvider kEoB2ChargenRaceMinStatsAmigaProvider = { ARRAYSIZE(kEoB2ChargenRaceMinStatsAmiga), kEoB2ChargenRaceMinStatsAmiga };
+
+static const uint16 kEoB2ChargenRaceMaxStatsAmiga[36] = {
+ 0x6412, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x6412, 0x0012,
+ 0x0012, 0x0013, 0x0011, 0x0012, 0x6412, 0x0012, 0x0012, 0x0012,
+ 0x0012, 0x0012, 0x6412, 0x0012, 0x0012, 0x0011, 0x0013, 0x0010,
+ 0x6412, 0x0013, 0x0011, 0x0012, 0x0012, 0x0012, 0x0011, 0x0012,
+ 0x0011, 0x0013, 0x0012, 0x0012
+};
+
+static const Uint16Provider kEoB2ChargenRaceMaxStatsAmigaProvider = { ARRAYSIZE(kEoB2ChargenRaceMaxStatsAmiga), kEoB2ChargenRaceMaxStatsAmiga };
+
+static const byte kEoB2SaveThrowTable1Amiga[50] = {
+ 0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x08, 0x07, 0x05,
+ 0x04, 0x03, 0x12, 0x10, 0x0F, 0x0D, 0x0C, 0x0A,
+ 0x09, 0x07, 0x06, 0x05, 0x11, 0x0F, 0x0E, 0x0C,
+ 0x0B, 0x09, 0x08, 0x06, 0x05, 0x04, 0x14, 0x11,
+ 0x10, 0x0D, 0x0C, 0x09, 0x08, 0x05, 0x04, 0x04,
+ 0x13, 0x11, 0x10, 0x0E, 0x0D, 0x0B, 0x0A, 0x08,
+ 0x07, 0x06
+};
+
+static const ByteProvider kEoB2SaveThrowTable1AmigaProvider = { ARRAYSIZE(kEoB2SaveThrowTable1Amiga), kEoB2SaveThrowTable1Amiga };
+
+static const byte kEoB2SaveThrowTable2Amiga[25] = {
+ 0x0e, 0x0d, 0x0b, 0x0a, 0x08, 0x0b, 0x09, 0x07,
+ 0x05, 0x03, 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x0f,
+ 0x0d, 0x0b, 0x09, 0x07, 0x0c, 0x0a, 0x08, 0x06,
+ 0x04
+};
+
+static const ByteProvider kEoB2SaveThrowTable2AmigaProvider = { ARRAYSIZE(kEoB2SaveThrowTable2Amiga), kEoB2SaveThrowTable2Amiga };
+
+static const byte kEoB2SaveThrowTable3Amiga[35] = {
+ 0x0a, 0x09, 0x07, 0x06, 0x05, 0x04, 0x02, 0x0e,
+ 0x0d, 0x0b, 0x0a, 0x09, 0x08, 0x06, 0x0d, 0x0c,
+ 0x0a, 0x09, 0x08, 0x07, 0x05, 0x10, 0x0f, 0x0d,
+ 0x0c, 0x0b, 0x0a, 0x08, 0x0f, 0x0e, 0x0c, 0x0b,
+ 0x0a, 0x09, 0x07
+};
+
+static const ByteProvider kEoB2SaveThrowTable3AmigaProvider = { ARRAYSIZE(kEoB2SaveThrowTable3Amiga), kEoB2SaveThrowTable3Amiga };
+
+static const byte kEoB2SaveThrowTable4Amiga[30] = {
+ 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0e, 0x0c,
+ 0x0a, 0x08, 0x06, 0x07, 0x0c, 0x0b, 0x0a, 0x09,
+ 0x08, 0x04, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b,
+ 0x0f, 0x0d, 0x0b, 0x09, 0x07, 0x05
+};
+
+static const ByteProvider kEoB2SaveThrowTable4AmigaProvider = { ARRAYSIZE(kEoB2SaveThrowTable4Amiga), kEoB2SaveThrowTable4Amiga };
+
+static const byte kEoB2SaveThrwLvlIndexAmiga[6] = {
+ 0x11, 0x15, 0x13, 0x15, 0x11, 0x11
+};
+
+static const ByteProvider kEoB2SaveThrwLvlIndexAmigaProvider = { ARRAYSIZE(kEoB2SaveThrwLvlIndexAmiga), kEoB2SaveThrwLvlIndexAmiga };
+
+static const byte kEoB2SaveThrwModDivAmiga[6] = {
+ 0x02, 0x05, 0x03, 0x04, 0x02, 0x02
+};
+
+static const ByteProvider kEoB2SaveThrwModDivAmigaProvider = { ARRAYSIZE(kEoB2SaveThrwModDivAmiga), kEoB2SaveThrwModDivAmiga };
+
+static const byte kEoB2SaveThrwModExtAmiga[6] = {
+ 0x0A, 0x05, 0x07, 0x06, 0x0A, 0x0A
+};
+
+static const ByteProvider kEoB2SaveThrwModExtAmigaProvider = { ARRAYSIZE(kEoB2SaveThrwModExtAmiga), kEoB2SaveThrwModExtAmiga };
+
+static const char *const kEoB2EnchantedStringAmiga[1] = {
+ "+%d %s"
+};
+
+static const StringListProvider kEoB2EnchantedStringAmigaProvider = { ARRAYSIZE(kEoB2EnchantedStringAmiga), kEoB2EnchantedStringAmiga };
+
+static const char *const kEoB2MenuStringsSpellNoAmiga[3] = {
+ "6",
+ "7",
+ "8"
+};
+
+static const StringListProvider kEoB2MenuStringsSpellNoAmigaProvider = { ARRAYSIZE(kEoB2MenuStringsSpellNoAmiga), kEoB2MenuStringsSpellNoAmiga };
+
+static const byte kEoB2SpellLevelsMageAmiga[35] = {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05,
+ 0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08,
+ 0x00, 0x01, 0x01
+};
+
+static const ByteProvider kEoB2SpellLevelsMageAmigaProvider = { ARRAYSIZE(kEoB2SpellLevelsMageAmiga), kEoB2SpellLevelsMageAmiga };
+
+static const byte kEoB2SpellLevelsClericAmiga[29] = {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02,
+ 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04,
+ 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06,
+ 0x06, 0x06, 0x08, 0x08, 0x00
+};
+
+static const ByteProvider kEoB2SpellLevelsClericAmigaProvider = { ARRAYSIZE(kEoB2SpellLevelsClericAmiga), kEoB2SpellLevelsClericAmiga };
+
+static const byte kEoB2NumSpellsClericAmiga[136] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x05, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00,
+ 0x06, 0x05, 0x05, 0x03, 0x02, 0x02, 0x00, 0x00,
+ 0x06, 0x06, 0x06, 0x04, 0x02, 0x02, 0x00, 0x00,
+ 0x06, 0x06, 0x06, 0x05, 0x03, 0x02, 0x01, 0x00,
+ 0x06, 0x06, 0x06, 0x06, 0x04, 0x02, 0x01, 0x00,
+ 0x07, 0x07, 0x07, 0x06, 0x04, 0x03, 0x01, 0x00,
+ 0x07, 0x07, 0x07, 0x07, 0x05, 0x03, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsClericAmigaProvider = { ARRAYSIZE(kEoB2NumSpellsClericAmiga), kEoB2NumSpellsClericAmiga };
+
+static const byte kEoB2NumSpellsWisAdjAmiga[64] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsWisAdjAmigaProvider = { ARRAYSIZE(kEoB2NumSpellsWisAdjAmiga), kEoB2NumSpellsWisAdjAmiga };
+
+static const byte kEoB2NumSpellsPalAmiga[136] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2NumSpellsPalAmigaProvider = { ARRAYSIZE(kEoB2NumSpellsPalAmiga), kEoB2NumSpellsPalAmiga };
+
+static const byte kEoB2NumSpellsMageAmiga[136] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x03, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x00, 0x00,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x00, 0x00,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x02, 0x01, 0x00,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x01, 0x00,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x02, 0x01,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x02
+};
+
+static const ByteProvider kEoB2NumSpellsMageAmigaProvider = { ARRAYSIZE(kEoB2NumSpellsMageAmiga), kEoB2NumSpellsMageAmiga };
+
+static const uint32 kEoB2ExperienceTable0Amiga[14] = {
+ 0x00000000, 0x000007D0, 0x00000FA0, 0x00001F40, 0x00003E80, 0x00007D00, 0x0000FA00, 0x0001E848,
+ 0x0003D090, 0x0007A120, 0x000B71B0, 0x000F4240, 0x001312D0, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable0AmigaProvider = { ARRAYSIZE(kEoB2ExperienceTable0Amiga), kEoB2ExperienceTable0Amiga };
+
+static const uint32 kEoB2ExperienceTable1Amiga[14] = {
+ 0x00000000, 0x000009C4, 0x00001388, 0x00002710, 0x00004E20, 0x00009C40, 0x0000EA60, 0x00015F90,
+ 0x00020F58, 0x0003D090, 0x0005B8D8, 0x000B71B0, 0x00112A88, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable1AmigaProvider = { ARRAYSIZE(kEoB2ExperienceTable1Amiga), kEoB2ExperienceTable1Amiga };
+
+static const uint32 kEoB2ExperienceTable2Amiga[14] = {
+ 0x00000000, 0x000005DC, 0x00000BB8, 0x00001770, 0x000032C8, 0x00006B6C, 0x0000D6D8, 0x0001ADB0,
+ 0x00036EE8, 0x0006DDD0, 0x000A4CB8, 0x000DBBA0, 0x00112A88, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable2AmigaProvider = { ARRAYSIZE(kEoB2ExperienceTable2Amiga), kEoB2ExperienceTable2Amiga };
+
+static const uint32 kEoB2ExperienceTable3Amiga[14] = {
+ 0x00000000, 0x000004E2, 0x000009C4, 0x00001388, 0x00002710, 0x00004E20, 0x00009C40, 0x00011170,
+ 0x0001ADB0, 0x00027100, 0x00035B60, 0x0006B6C0, 0x000A1220, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable3AmigaProvider = { ARRAYSIZE(kEoB2ExperienceTable3Amiga), kEoB2ExperienceTable3Amiga };
+
+static const uint32 kEoB2ExperienceTable4Amiga[14] = {
+ 0x00000000, 0x000008CA, 0x00001194, 0x00002328, 0x00004650, 0x00008CA0, 0x000124F8, 0x000249F0,
+ 0x000493E0, 0x000927C0, 0x000DBBA0, 0x00124F80, 0x0016E360, 0xFFFFFFFF
+};
+
+static const Uint32Provider kEoB2ExperienceTable4AmigaProvider = { ARRAYSIZE(kEoB2ExperienceTable4Amiga), kEoB2ExperienceTable4Amiga };
+
+static const byte kEoB2ExpObjectTlModeAmiga[18] = {
+ 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x02, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTlModeAmigaProvider = { ARRAYSIZE(kEoB2ExpObjectTlModeAmiga), kEoB2ExpObjectTlModeAmiga };
+
+static const byte kEoB2ExpObjectTblIndexAmiga[14] = {
+ 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTblIndexAmigaProvider = { ARRAYSIZE(kEoB2ExpObjectTblIndexAmiga), kEoB2ExpObjectTblIndexAmiga };
+
+static const byte kEoB2ExpObjectShpStartAmiga[4] = {
+ 0x07, 0x0C, 0x0F, 0x12
+};
+
+static const ByteProvider kEoB2ExpObjectShpStartAmigaProvider = { ARRAYSIZE(kEoB2ExpObjectShpStartAmiga), kEoB2ExpObjectShpStartAmiga };
+
+static const byte kEoB2ExpObjectTbl1Amiga[13] = {
+ 0x1f, 0x17, 0x1f, 0x17, 0x18, 0x17, 0x18, 0x19,
+ 0x18, 0x19, 0x18, 0x19, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl1AmigaProvider = { ARRAYSIZE(kEoB2ExpObjectTbl1Amiga), kEoB2ExpObjectTbl1Amiga };
+
+static const byte kEoB2ExpObjectTbl2Amiga[10] = {
+ 0x1f, 0x1c, 0x1f, 0x1c, 0x1d, 0x1d, 0x1e, 0x1d,
+ 0x1e, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl2AmigaProvider = { ARRAYSIZE(kEoB2ExpObjectTbl2Amiga), kEoB2ExpObjectTbl2Amiga };
+
+static const byte kEoB2ExpObjectTbl3Amiga[11] = {
+ 0x17, 0x1b, 0x17, 0x1b, 0x08, 0x1b, 0x08, 0x1e,
+ 0x08, 0x1e, 0x00
+};
+
+static const ByteProvider kEoB2ExpObjectTbl3AmigaProvider = { ARRAYSIZE(kEoB2ExpObjectTbl3Amiga), kEoB2ExpObjectTbl3Amiga };
+
+static const byte kEoB2ExpObjectYAmiga[4] = {
+ 0x77, 0x67, 0x4F, 0x3F
+};
+
+static const ByteProvider kEoB2ExpObjectYAmigaProvider = { ARRAYSIZE(kEoB2ExpObjectYAmiga), kEoB2ExpObjectYAmiga };
+
+static const byte kEoB2SparkDefStepsAmiga[8] = {
+ 0x40, 0x90, 0xE4, 0xB9, 0x6E, 0x1B, 0x06, 0x01
+};
+
+static const ByteProvider kEoB2SparkDefStepsAmigaProvider = { ARRAYSIZE(kEoB2SparkDefStepsAmiga), kEoB2SparkDefStepsAmiga };
+
+static const byte kEoB2SparkDefSubStepsAmiga[4] = {
+ 0xC0, 0x30, 0x0C, 0x03
+};
+
+static const ByteProvider kEoB2SparkDefSubStepsAmigaProvider = { ARRAYSIZE(kEoB2SparkDefSubStepsAmiga), kEoB2SparkDefSubStepsAmiga };
+
+static const byte kEoB2SparkDefShiftAmiga[4] = {
+ 0x06, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2SparkDefShiftAmigaProvider = { ARRAYSIZE(kEoB2SparkDefShiftAmiga), kEoB2SparkDefShiftAmiga };
+
+static const byte kEoB2SparkDefAddAmiga[8] = {
+ 0x08, 0x06, 0x1C, 0x14, 0x0D, 0x18, 0x0D, 0x0F
+};
+
+static const ByteProvider kEoB2SparkDefAddAmigaProvider = { ARRAYSIZE(kEoB2SparkDefAddAmiga), kEoB2SparkDefAddAmiga };
+
+static const byte kEoB2SparkDefXAmiga[6] = {
+ 0x17, 0x20, 0x17, 0x20, 0x17, 0x20
+};
+
+static const ByteProvider kEoB2SparkDefXAmigaProvider = { ARRAYSIZE(kEoB2SparkDefXAmiga), kEoB2SparkDefXAmiga };
+
+static const byte kEoB2SparkDefYAmiga[6] = {
+ 0x02, 0x02, 0x34, 0x34, 0x66, 0x66
+};
+
+static const ByteProvider kEoB2SparkDefYAmigaProvider = { ARRAYSIZE(kEoB2SparkDefYAmiga), kEoB2SparkDefYAmiga };
+
+static const uint32 kEoB2SparkOfFlags1Amiga[11] = {
+ 0x40000000, 0x95000000, 0xEA550000, 0xBFAA5400, 0x6AFFA954, 0x15AAFEA9, 0x0055ABFE, 0x000056AB,
+ 0x00000156, 0x00000001, 0x00000000
+};
+
+static const Uint32Provider kEoB2SparkOfFlags1AmigaProvider = { ARRAYSIZE(kEoB2SparkOfFlags1Amiga), kEoB2SparkOfFlags1Amiga };
+
+static const uint32 kEoB2SparkOfFlags2Amiga[16] = {
+ 0xC0000000, 0x30000000, 0x0C000000, 0x03000000, 0x00C00000, 0x00300000, 0x000C0000, 0x00030000,
+ 0x0000C000, 0x00003000, 0x00000C00, 0x00000300, 0x000000C0, 0x00000030, 0x0000000C, 0x00000003
+};
+
+static const Uint32Provider kEoB2SparkOfFlags2AmigaProvider = { ARRAYSIZE(kEoB2SparkOfFlags2Amiga), kEoB2SparkOfFlags2Amiga };
+
+static const byte kEoB2SparkOfShiftAmiga[16] = {
+ 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x14, 0x12, 0x10,
+ 0x0E, 0x0C, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2SparkOfShiftAmigaProvider = { ARRAYSIZE(kEoB2SparkOfShiftAmiga), kEoB2SparkOfShiftAmiga };
+
+static const byte kEoB2SparkOfXAmiga[16] = {
+ 0x50, 0x70, 0x30, 0x68, 0x20, 0x60, 0x38, 0x78,
+ 0x80, 0x48, 0x58, 0x28, 0x60, 0x40, 0x70, 0x48
+};
+
+static const ByteProvider kEoB2SparkOfXAmigaProvider = { ARRAYSIZE(kEoB2SparkOfXAmiga), kEoB2SparkOfXAmiga };
+
+static const byte kEoB2SparkOfYAmiga[16] = {
+ 0x31, 0x2B, 0x48, 0x17, 0x16, 0x48, 0x35, 0x1B,
+ 0x43, 0x2E, 0x24, 0x28, 0x38, 0x1C, 0x16, 0x44
+};
+
+static const ByteProvider kEoB2SparkOfYAmigaProvider = { ARRAYSIZE(kEoB2SparkOfYAmiga), kEoB2SparkOfYAmiga };
+
+static const byte kEoB2SpellPropertiesAmiga[1820] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0b, 0xc6, 0x00, 0x01,
+ 0xb6, 0xbe, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0b, 0xcc,
+ 0x00, 0x01, 0xb7, 0x2a, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03,
+ 0x0b, 0xda, 0x00, 0x01, 0xb8, 0x52, 0x00, 0x4c,
+ 0x00, 0x03, 0x0b, 0x3e, 0x00, 0x01, 0xb8, 0x78,
+ 0x5f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x03, 0x0b, 0xe8, 0x00, 0x01, 0xb8, 0x9e,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0xb8, 0xd6, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x03, 0x0b, 0xf6, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x8b, 0x00, 0x03, 0x0b, 0x46,
+ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x0b, 0xfe,
+ 0x00, 0x01, 0xb9, 0x16, 0x04, 0x88, 0x00, 0x03,
+ 0x0b, 0x4e, 0x00, 0x01, 0xb9, 0xe2, 0x58, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03,
+ 0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89,
+ 0x00, 0x03, 0x0b, 0x56, 0x00, 0x00, 0x00, 0x00,
+ 0x4b, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x03, 0x0c, 0x14, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4c, 0x00, 0x03, 0x0b, 0x66, 0x00, 0x00,
+ 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0x03, 0x0c, 0x28, 0x00, 0x01,
+ 0xb6, 0x74, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x3a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03,
+ 0x0c, 0x48, 0x00, 0x01, 0xba, 0x44, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xba, 0x82,
+ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x03, 0x0c, 0x5a, 0x00, 0x01, 0xb6, 0x18,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0c, 0x68, 0x00, 0x01,
+ 0xba, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0xbb, 0x02, 0x63, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x0c, 0x72,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x03,
+ 0x0b, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0c, 0x78, 0x00, 0x01, 0xbb, 0x3e, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbb, 0x7c,
+ 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0c, 0x84, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x40,
+ 0x00, 0x00, 0x00, 0x03, 0x0c, 0x9c, 0x00, 0x01,
+ 0xbc, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0xbc, 0xbc, 0x47, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x0c, 0xac,
+ 0x00, 0x01, 0xbc, 0xf8, 0x04, 0x88, 0x00, 0x03,
+ 0x0b, 0x6e, 0x00, 0x01, 0xbd, 0xc6, 0x66, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
+ 0x0c, 0xbc, 0x00, 0x01, 0xbd, 0xf2, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0c, 0xc2, 0x00, 0x01, 0xbe, 0x54,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0xbe, 0x92, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x41, 0x00, 0x03, 0x0c, 0xcc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x29, 0x00, 0x03, 0x0b, 0x76,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0c, 0xe2,
+ 0x00, 0x01, 0xbf, 0x18, 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0c, 0xf0, 0x00, 0x01, 0xbf, 0x96, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41,
+ 0x00, 0x03, 0x0c, 0xfe, 0x00, 0x01, 0xc0, 0x82,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0xc0, 0xc0, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0d, 0x0c, 0x00, 0x01,
+ 0xc2, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0d, 0x1a,
+ 0x00, 0x01, 0xc3, 0x58, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
+ 0x0d, 0x28, 0x00, 0x01, 0xc3, 0xce, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x03, 0x0d, 0x38, 0x00, 0x01, 0xc4, 0x48,
+ 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0d, 0x48, 0x00, 0x01,
+ 0xc4, 0x78, 0x00, 0x4c, 0x00, 0x03, 0x0b, 0x7e,
+ 0x00, 0x01, 0xc4, 0x92, 0x49, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0d, 0x54,
+ 0x00, 0x01, 0xc4, 0xac, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
+ 0x0d, 0x64, 0x00, 0x01, 0xc5, 0x22, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0d, 0x74, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0d, 0x8a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x03,
+ 0x0b, 0x86, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00,
+ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0d, 0x90, 0x00, 0x01, 0xc5, 0x7c, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x03, 0x0d, 0xa4, 0x00, 0x01, 0xc5, 0x9a,
+ 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0d, 0xb6, 0x00, 0x01,
+ 0xb8, 0x52, 0x00, 0x4c, 0x00, 0x03, 0x0b, 0x3e,
+ 0x00, 0x01, 0xb8, 0x78, 0x5f, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x0d, 0xc4,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x03,
+ 0x0b, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00,
+ 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0d, 0xda, 0x00, 0x01, 0xc5, 0xda, 0x00, 0x39,
+ 0x00, 0x03, 0x0b, 0x96, 0x00, 0x01, 0xc6, 0xbc,
+ 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0d, 0xde, 0x00, 0x01, 0xc6, 0xe4,
+ 0x24, 0x08, 0x00, 0x03, 0x0b, 0x9e, 0x00, 0x01,
+ 0xb9, 0xe2, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x21, 0x00, 0x03, 0x0d, 0xea, 0x00, 0x01,
+ 0xbb, 0x3e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0xbb, 0x7c, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0d, 0xf6,
+ 0x00, 0x01, 0xc7, 0x9e, 0x00, 0x28, 0x00, 0x03,
+ 0x0b, 0xa6, 0x00, 0x01, 0xc8, 0x14, 0x6f, 0x00,
+ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0e, 0x02, 0x00, 0x01, 0xc8, 0x2e, 0x00, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0e, 0x0e, 0x00, 0x01, 0xb6, 0x18,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0e, 0x1c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x99, 0x00, 0x03, 0x0b, 0xae,
+ 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x2e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x03,
+ 0x0b, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00,
+ 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0e, 0x36, 0x00, 0x01, 0xc8, 0x6e, 0x00, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0e, 0x48, 0x00, 0x01, 0xc9, 0x02,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x03, 0x0e, 0x5e, 0x00, 0x01,
+ 0xc8, 0xbc, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x72,
+ 0x00, 0x01, 0xc9, 0x26, 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00, 0x02, 0x48,
+ 0x00, 0x03, 0x0b, 0x8e, 0x00, 0x00, 0x00, 0x00,
+ 0x6e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0e, 0xa4, 0x00, 0x01, 0xc9, 0x5a,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x03, 0x0e, 0xba, 0x00, 0x01,
+ 0xc9, 0x78, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e, 0xd0,
+ 0x00, 0x01, 0xc9, 0xb8, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xc9, 0xf6, 0x62, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03,
+ 0x0e, 0xde, 0x00, 0x01, 0xca, 0x26, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0e, 0xea, 0x00, 0x01, 0xc4, 0xac,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x03, 0x0e, 0xf6, 0x00, 0x01,
+ 0xc4, 0x78, 0x00, 0x4c, 0x00, 0x03, 0x0b, 0x7e,
+ 0x00, 0x01, 0xc4, 0x92, 0x49, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x02,
+ 0x00, 0x01, 0xca, 0x6a, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
+ 0x0f, 0x08, 0x00, 0x01, 0xca, 0x86, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0f, 0x1c, 0x00, 0x01,
+ 0xcd, 0xf6, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x2a,
+ 0x00, 0x01, 0xca, 0xea, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0f, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xce, 0x30,
+ 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0f, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4c, 0x00, 0x03, 0x0b, 0xbe, 0x00, 0x00,
+ 0x00, 0x00, 0x5b, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0f, 0x48, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0xce, 0x9a, 0x62, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x4a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0xcc, 0x7e, 0x65, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0f, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcb, 0xfa,
+ 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0x0f, 0x4e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0xcd, 0x0c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x0f, 0x50, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0xcd, 0x7e, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2SpellPropertiesAmigaProvider = { ARRAYSIZE(kEoB2SpellPropertiesAmiga), kEoB2SpellPropertiesAmiga };
+
+static const byte kEoB2MagicFlightPropsAmiga[56] = {
+ 0x04, 0xff, 0x41, 0x0c, 0x0b, 0xff, 0x04, 0x06,
+ 0x0d, 0xff, 0x7a, 0x09, 0x0f, 0xff, 0x4a, 0x08,
+ 0x11, 0x06, 0x38, 0x0a, 0x14, 0x06, 0x7a, 0x0b,
+ 0x18, 0xff, 0x4a, 0x08, 0x36, 0xff, 0x4b, 0x09,
+ 0x3f, 0xff, 0x4b, 0x09, 0x41, 0x06, 0x4b, 0x09,
+ 0x42, 0x06, 0x4b, 0x08, 0x43, 0x06, 0x4b, 0x08,
+ 0x44, 0x06, 0x4b, 0x08, 0x45, 0x06, 0x4b, 0x08
+};
+
+static const ByteProvider kEoB2MagicFlightPropsAmigaProvider = { ARRAYSIZE(kEoB2MagicFlightPropsAmiga), kEoB2MagicFlightPropsAmiga };
+
+static const byte kEoB2TurnUndeadEffectAmiga[140] = {
+ 0x0a, 0x07, 0x04, 0x00, 0x00, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0d, 0x0a,
+ 0x07, 0x04, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x10, 0x0d, 0x0a, 0x07,
+ 0x04, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x13, 0x10, 0x0d, 0x0a, 0x07, 0x04,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x14, 0x13, 0x10, 0x0d, 0x0a, 0x07, 0x04, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0x14,
+ 0x13, 0x10, 0x0d, 0x0a, 0x07, 0x04, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0x00, 0x63, 0x63, 0x14, 0x13,
+ 0x10, 0x0d, 0x0a, 0x07, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x63, 0x63, 0x63, 0x14, 0x13, 0x10,
+ 0x0d, 0x0a, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00,
+ 0x63, 0x63, 0x63, 0x63, 0x14, 0x13, 0x10, 0x0d,
+ 0x0a, 0x07, 0x07, 0x04, 0x04, 0x00, 0x63, 0x63,
+ 0x63, 0x63, 0x63, 0x14, 0x13, 0x10, 0x0d, 0x0a,
+ 0x0a, 0x07, 0x07, 0x04
+};
+
+static const ByteProvider kEoB2TurnUndeadEffectAmigaProvider = { ARRAYSIZE(kEoB2TurnUndeadEffectAmiga), kEoB2TurnUndeadEffectAmiga };
+
+static const byte kEoB2BurningHandsDestAmiga[32] = {
+ 0x02, 0x03, 0x04, 0x01, 0x02, 0x05, 0x00, 0x00,
+ 0x00, 0x02, 0x04, 0x01, 0x03, 0x05, 0x00, 0x00,
+ 0x00, 0x01, 0x04, 0x02, 0x03, 0x05, 0x00, 0x00,
+ 0x01, 0x03, 0x04, 0x00, 0x02, 0x05, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2BurningHandsDestAmigaProvider = { ARRAYSIZE(kEoB2BurningHandsDestAmiga), kEoB2BurningHandsDestAmiga };
+
+static const byte kEoB2ConeOfColdDest1Amiga[7] = {
+ 0xE0, 0xC0, 0xC1, 0xBF, 0xA0, 0x9F, 0xA1
+};
+
+static const ByteProvider kEoB2ConeOfColdDest1AmigaProvider = { ARRAYSIZE(kEoB2ConeOfColdDest1Amiga), kEoB2ConeOfColdDest1Amiga };
+
+static const byte kEoB2ConeOfColdDest2Amiga[7] = {
+ 0x01, 0x02, 0xE2, 0x22, 0x03, 0xE3, 0x23
+};
+
+static const ByteProvider kEoB2ConeOfColdDest2AmigaProvider = { ARRAYSIZE(kEoB2ConeOfColdDest2Amiga), kEoB2ConeOfColdDest2Amiga };
+
+static const byte kEoB2ConeOfColdDest3Amiga[7] = {
+ 0x20, 0x40, 0x3F, 0x41, 0x60, 0x5F, 0x61
+};
+
+static const ByteProvider kEoB2ConeOfColdDest3AmigaProvider = { ARRAYSIZE(kEoB2ConeOfColdDest3Amiga), kEoB2ConeOfColdDest3Amiga };
+
+static const byte kEoB2ConeOfColdDest4Amiga[7] = {
+ 0xFF, 0xFE, 0x1E, 0xDE, 0xFD, 0x1D, 0xDD
+};
+
+static const ByteProvider kEoB2ConeOfColdDest4AmigaProvider = { ARRAYSIZE(kEoB2ConeOfColdDest4Amiga), kEoB2ConeOfColdDest4Amiga };
+
+static const byte kEoB2ConeOfColdGfxTblAmiga[8] = {
+ 0x1f, 0x1c, 0x1f, 0x1c, 0x1d, 0x1d, 0x1d, 0x00
+};
+
+static const ByteProvider kEoB2ConeOfColdGfxTblAmigaProvider = { ARRAYSIZE(kEoB2ConeOfColdGfxTblAmiga), kEoB2ConeOfColdGfxTblAmiga };
+
+static const byte kEoB2DscDoorShapeIndexAmiga[53] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01
+};
+
+static const ByteProvider kEoB2DscDoorShapeIndexAmigaProvider = { ARRAYSIZE(kEoB2DscDoorShapeIndexAmiga), kEoB2DscDoorShapeIndexAmiga };
+
+static const byte kEoB2WllFlagPresetAmiga[25] = {
+ 0x07, 0x00, 0x40, 0xA8, 0x88, 0x88, 0x88, 0x9F,
+ 0xA8, 0x88, 0x88, 0x88, 0x9F, 0xA8, 0x88, 0x88,
+ 0x88, 0x9F, 0xA8, 0x88, 0x88, 0x88, 0x9F, 0x03,
+ 0x03
+};
+
+static const ByteProvider kEoB2WllFlagPresetAmigaProvider = { ARRAYSIZE(kEoB2WllFlagPresetAmiga), kEoB2WllFlagPresetAmiga };
+
+static const uint16 kEoB2DscShapeCoordsAmiga[180] = {
+ 0xff91, 0xffc1, 0xffa1, 0xffc1, 0xff75, 0xffc5, 0xff8b, 0xffc5,
+ 0xff88, 0xffc3, 0xffb4, 0xffc1, 0xffc4, 0xffc1, 0xffa1, 0xffc5,
+ 0xffb6, 0xffc5, 0xffb0, 0xffc3, 0xffd5, 0xffc1, 0xffe5, 0xffc1,
+ 0xffcb, 0xffc5, 0xffe1, 0xffc5, 0xffd8, 0xffc3, 0xfff8, 0xffc1,
+ 0x0008, 0xffc1, 0xfff6, 0xffc5, 0x000a, 0xffc5, 0x0000, 0xffc3,
+ 0x001b, 0xffc1, 0x002b, 0xffc1, 0x001f, 0xffc5, 0x0035, 0xffc5,
+ 0x0028, 0xffc3, 0x003c, 0xffc1, 0x004c, 0xffc1, 0x004a, 0xffc5,
+ 0x005f, 0xffc5, 0x0050, 0xffc3, 0x005f, 0xffc1, 0x006f, 0xffc1,
+ 0x0075, 0xffc5, 0x008b, 0xffc5, 0x0078, 0xffc3, 0xff8a, 0xffcb,
+ 0xffa4, 0xffcb, 0xff68, 0xffd3, 0xff88, 0xffd3, 0xff8a, 0xffce,
+ 0xffbe, 0xffcb, 0xffd8, 0xffcb, 0xffac, 0xffd3, 0xffcd, 0xffd3,
+ 0xffc5, 0xffce, 0xfff3, 0xffcb, 0x000d, 0xffcb, 0xfff0, 0xffd3,
+ 0x0010, 0xffd3, 0x0000, 0xffce, 0x0028, 0xffcb, 0x0042, 0xffcb,
+ 0x0033, 0xffd3, 0x0054, 0xffd3, 0x003b, 0xffce, 0x005c, 0xffcb,
+ 0x0076, 0xffcb, 0x0078, 0xffd3, 0x0098, 0xffd3, 0x0076, 0xffce,
+ 0xff92, 0xffdd, 0xffbd, 0xffdd, 0xff74, 0xffea, 0xffad, 0xffea,
+ 0xff9e, 0xffe2, 0xffea, 0xffdd, 0x0016, 0xffdd, 0xffe5, 0xffea,
+ 0x001b, 0xffea, 0x0000, 0xffe2, 0x0043, 0xffdd, 0x006e, 0xffdd,
+ 0x0053, 0xffea, 0x008c, 0xffea, 0x0062, 0xffe2, 0xff80, 0xfffc,
+ 0x0080, 0xfffc, 0xff80, 0xffbe, 0x0080, 0xffbe, 0x0080, 0x0000,
+ 0xffda, 0xfffc, 0x0026, 0xfffc, 0xffda, 0xffbe, 0x0026, 0xffbe,
+ 0x0000, 0x0000, 0xff80, 0xfffc, 0x0080, 0xfffc, 0xff80, 0xffbe,
+ 0x0080, 0xffbe, 0x0080, 0x0000
+};
+
+static const Uint16Provider kEoB2DscShapeCoordsAmigaProvider = { ARRAYSIZE(kEoB2DscShapeCoordsAmiga), kEoB2DscShapeCoordsAmiga };
+
+static const byte kEoB2DscDoorScaleOffsAmiga[53] = {
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0D, 0x0D, 0x0D,
+ 0x0D, 0x0D, 0x12, 0x12, 0x12, 0x12, 0x12, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x33, 0x34
+};
+
+static const ByteProvider kEoB2DscDoorScaleOffsAmigaProvider = { ARRAYSIZE(kEoB2DscDoorScaleOffsAmiga), kEoB2DscDoorScaleOffsAmiga };
+
+static const byte kEoB2DscDoorScaleMult1Amiga[4] = {
+ 0x08, 0x0C, 0x12, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult1AmigaProvider = { ARRAYSIZE(kEoB2DscDoorScaleMult1Amiga), kEoB2DscDoorScaleMult1Amiga };
+
+static const byte kEoB2DscDoorScaleMult2Amiga[4] = {
+ 0x00, 0x02, 0x04, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult2AmigaProvider = { ARRAYSIZE(kEoB2DscDoorScaleMult2Amiga), kEoB2DscDoorScaleMult2Amiga };
+
+static const byte kEoB2DscDoorScaleMult3Amiga[4] = {
+ 0x05, 0x08, 0x0C, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorScaleMult3AmigaProvider = { ARRAYSIZE(kEoB2DscDoorScaleMult3Amiga), kEoB2DscDoorScaleMult3Amiga };
+
+static const byte kEoB2DscDoorType5OffsAmiga[6] = {
+ 0x05, 0x03, 0x01, 0x05, 0x03, 0x01
+};
+
+static const ByteProvider kEoB2DscDoorType5OffsAmigaProvider = { ARRAYSIZE(kEoB2DscDoorType5OffsAmiga), kEoB2DscDoorType5OffsAmiga };
+
+static const byte kEoB2DscDoorY1Amiga[4] = {
+ 0x3B, 0x47, 0x56, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorY1AmigaProvider = { ARRAYSIZE(kEoB2DscDoorY1Amiga), kEoB2DscDoorY1Amiga };
+
+static const byte kEoB2DscDoorY2Amiga[4] = {
+ 0x1F, 0x18, 0x0F, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorY2AmigaProvider = { ARRAYSIZE(kEoB2DscDoorY2Amiga), kEoB2DscDoorY2Amiga };
+
+static const byte kEoB2DscDoorFrameY1Amiga[4] = {
+ 0x1E, 0x18, 0x10, 0x00
+};
+
+static const ByteProvider kEoB2DscDoorFrameY1AmigaProvider = { ARRAYSIZE(kEoB2DscDoorFrameY1Amiga), kEoB2DscDoorFrameY1Amiga };
+
+static const byte kEoB2DscDoorFrameY2Amiga[4] = {
+ 0x3B, 0x47, 0x56, 0x78
+};
+
+static const ByteProvider kEoB2DscDoorFrameY2AmigaProvider = { ARRAYSIZE(kEoB2DscDoorFrameY2Amiga), kEoB2DscDoorFrameY2Amiga };
+
+static const byte kEoB2DscItemPosIndexAmiga[16] = {
+ 0x00, 0x01, 0x02, 0x03, 0x02, 0x00, 0x03, 0x01,
+ 0x03, 0x02, 0x01, 0x00, 0x01, 0x03, 0x00, 0x02
+};
+
+static const ByteProvider kEoB2DscItemPosIndexAmigaProvider = { ARRAYSIZE(kEoB2DscItemPosIndexAmiga), kEoB2DscItemPosIndexAmiga };
+
+static const uint16 kEoB2DscItemShpXAmiga[18] = {
+ 0xFFC8, 0xFFF8, 0x0028, 0x0058, 0x0088, 0x00B8, 0x00E8, 0xFFB8,
+ 0x0008, 0x0058, 0x00A8, 0x00F8, 0xFFD8, 0x0058, 0x00D8, 0xFFA8,
+ 0x0058, 0x0108
+};
+
+static const Uint16Provider kEoB2DscItemShpXAmigaProvider = { ARRAYSIZE(kEoB2DscItemShpXAmiga), kEoB2DscItemShpXAmiga };
+
+static const byte kEoB2DscItemScaleIndexAmiga[18] = {
+ 0xFF, 0xFF, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02,
+ 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF,
+ 0x25, 0x00
+};
+
+static const ByteProvider kEoB2DscItemScaleIndexAmigaProvider = { ARRAYSIZE(kEoB2DscItemScaleIndexAmiga), kEoB2DscItemScaleIndexAmiga };
+
+static const byte kEoB2DscItemTileIndexAmiga[18] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0x0B,
+ 0x0C, 0x0D
+};
+
+static const ByteProvider kEoB2DscItemTileIndexAmigaProvider = { ARRAYSIZE(kEoB2DscItemTileIndexAmiga), kEoB2DscItemTileIndexAmiga };
+
+static const byte kEoB2DscItemShapeMapAmiga[113] = {
+ 0x00, 0x00, 0x00, 0x05, 0x01, 0x02, 0x03, 0x04,
+ 0x03, 0x05, 0x06, 0x06, 0x12, 0x05, 0x0f, 0x12,
+ 0x14, 0x08, 0x13, 0x11, 0x15, 0x18, 0x07, 0x07,
+ 0x07, 0x1f, 0x09, 0x23, 0x09, 0x09, 0x09, 0x09,
+ 0x08, 0x1c, 0x1c, 0x1a, 0x1b, 0x21, 0x1d, 0x1d,
+ 0x22, 0x22, 0x22, 0x00, 0x16, 0x00, 0x00, 0x17,
+ 0x17, 0x17, 0x17, 0x17, 0x22, 0x21, 0x19, 0x23,
+ 0x10, 0x1e, 0x17, 0x25, 0x17, 0x26, 0x12, 0x21,
+ 0x17, 0x23, 0x1c, 0x00, 0x20, 0x25, 0x12, 0x18,
+ 0x1f, 0x07, 0x07, 0x15, 0x15, 0x0f, 0x03, 0x09,
+ 0x1e, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b,
+ 0x1b, 0x17, 0x17, 0x16, 0x16, 0x21, 0x08, 0x25,
+ 0x25, 0x25, 0x25, 0x28, 0x03, 0x04, 0x21, 0x00,
+ 0x17, 0x00, 0x20, 0x24, 0x27, 0x27, 0x1c, 0x27,
+ 0x00
+};
+
+static const ByteProvider kEoB2DscItemShapeMapAmigaProvider = { ARRAYSIZE(kEoB2DscItemShapeMapAmiga), kEoB2DscItemShapeMapAmiga };
+
+static const byte kEoB2DscTelptrShpCoordsAmiga[156] = {
+ 0x0c, 0x07, 0x1a, 0x01, 0x3e, 0x03, 0x0c, 0x1a,
+ 0x2a, 0x13, 0x40, 0x18, 0x02, 0x2d, 0x16, 0x25,
+ 0x28, 0x32, 0x36, 0x27, 0x0a, 0x3e, 0x16, 0x49,
+ 0x3e, 0x44, 0x06, 0x06, 0x2a, 0x04, 0x37, 0x0a,
+ 0x04, 0x1b, 0x1a, 0x16, 0x37, 0x1d, 0x0e, 0x2a,
+ 0x1b, 0x35, 0x2e, 0x28, 0x42, 0x30, 0x06, 0x47,
+ 0x06, 0x47, 0x2d, 0x4c, 0x0a, 0x04, 0x14, 0x00,
+ 0x2e, 0x01, 0x0c, 0x10, 0x1f, 0x10, 0x2f, 0x10,
+ 0x12, 0x18, 0x28, 0x1d, 0x01, 0x21, 0x08, 0x2a,
+ 0x11, 0x32, 0x2f, 0x2e, 0x1f, 0x25, 0x02, 0x02,
+ 0x01, 0x11, 0x01, 0x2f, 0x08, 0x1e, 0x11, 0x0e,
+ 0x11, 0x26, 0x1c, 0x01, 0x1e, 0x19, 0x1f, 0x33,
+ 0x24, 0x11, 0x26, 0x05, 0x28, 0x2b, 0x2f, 0x22,
+ 0x00, 0x13, 0x05, 0x01, 0x06, 0x08, 0x09, 0x0c,
+ 0x04, 0x1a, 0x08, 0x1f, 0x12, 0x05, 0x12, 0x15,
+ 0x16, 0x10, 0x1a, 0x08, 0x1a, 0x1d, 0x0a, 0x00,
+ 0x0a, 0x00, 0x00, 0x09, 0x00, 0x1e, 0x04, 0x11,
+ 0x08, 0x16, 0x08, 0x06, 0x10, 0x00, 0x11, 0x0d,
+ 0x12, 0x20, 0x15, 0x02, 0x14, 0x09, 0x16, 0x1b,
+ 0x1a, 0x14, 0x1a, 0x14
+};
+
+static const ByteProvider kEoB2DscTelptrShpCoordsAmigaProvider = { ARRAYSIZE(kEoB2DscTelptrShpCoordsAmiga), kEoB2DscTelptrShpCoordsAmiga };
+
+static const byte kEoB2PortalSeqDataAmiga[126] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00,
+ 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04,
+ 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x03, 0x02,
+ 0x02, 0x03, 0x01, 0x04, 0x00, 0x02, 0x01, 0x03,
+ 0x02, 0x04, 0x03, 0x02, 0x04, 0x03, 0x03, 0x04,
+ 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
+ 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x03, 0x07,
+ 0x02, 0x08, 0x02, 0x08, 0x01, 0x09, 0x01, 0x09,
+ 0x01, 0x09, 0x00, 0x0a, 0xff, 0xff
+};
+
+static const ByteProvider kEoB2PortalSeqDataAmigaProvider = { ARRAYSIZE(kEoB2PortalSeqDataAmiga), kEoB2PortalSeqDataAmiga };
+
+static const byte kEoB2DscMonsterFrmOffsTbl1Amiga[32] = {
+ 0x04, 0xfe, 0x01, 0x03, 0x03, 0x04, 0xfe, 0x01,
+ 0x01, 0x03, 0x04, 0xfe, 0xfe, 0x01, 0x03, 0x04,
+ 0xfc, 0xfd, 0xff, 0x02, 0x02, 0xfc, 0xfd, 0xff,
+ 0xff, 0x02, 0xfc, 0xfd, 0xfd, 0xff, 0x02, 0xfc
+};
+
+static const ByteProvider kEoB2DscMonsterFrmOffsTbl1AmigaProvider = { ARRAYSIZE(kEoB2DscMonsterFrmOffsTbl1Amiga), kEoB2DscMonsterFrmOffsTbl1Amiga };
+
+static const byte kEoB2DscMonsterFrmOffsTbl2Amiga[32] = {
+ 0x04, 0xfe, 0x01, 0x03, 0x03, 0x04, 0xfe, 0x01,
+ 0x01, 0x03, 0x04, 0xfe, 0xfe, 0x01, 0x03, 0x04,
+ 0x04, 0xfd, 0x01, 0x02, 0x02, 0x04, 0xfd, 0x01,
+ 0x01, 0x02, 0x04, 0xfd, 0xfd, 0x01, 0x02, 0x04
+};
+
+static const ByteProvider kEoB2DscMonsterFrmOffsTbl2AmigaProvider = { ARRAYSIZE(kEoB2DscMonsterFrmOffsTbl2Amiga), kEoB2DscMonsterFrmOffsTbl2Amiga };
+
+static const uint16 kEoB2InvSlotXAmiga[27] = {
+ 0x00e6, 0x0116, 0x00b5, 0x00c7, 0x00b5, 0x00c7, 0x00b5, 0x00c7,
+ 0x00b5, 0x00c7, 0x00b5, 0x00c7, 0x00b5, 0x00c7, 0x00b5, 0x00c7,
+ 0x00e1, 0x00e0, 0x00e1, 0x012a, 0x011f, 0x0115, 0x012c, 0x012c,
+ 0x012c, 0x00e4, 0x00f0
+};
+
+static const Uint16Provider kEoB2InvSlotXAmigaProvider = { ARRAYSIZE(kEoB2InvSlotXAmiga), kEoB2InvSlotXAmiga };
+
+static const byte kEoB2InvSlotYAmiga[27] = {
+ 0x74, 0x74, 0x28, 0x28, 0x3a, 0x3a, 0x4c, 0x4c,
+ 0x5e, 0x5e, 0x70, 0x70, 0x82, 0x82, 0x94, 0x94,
+ 0x38, 0x4c, 0x60, 0x37, 0x4b, 0x89, 0x5e, 0x70,
+ 0x82, 0x88, 0x88
+};
+
+static const ByteProvider kEoB2InvSlotYAmigaProvider = { ARRAYSIZE(kEoB2InvSlotYAmiga), kEoB2InvSlotYAmiga };
+
+static const uint16 kEoB2SlotValidationFlagsAmiga[27] = {
+ 0x0008, 0x0008, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x0001, 0x0002, 0x0004, 0x0020, 0x0040, 0x0010, 0xffff, 0x0080,
+ 0x0080, 0x0100, 0x0100
+};
+
+static const Uint16Provider kEoB2SlotValidationFlagsAmigaProvider = { ARRAYSIZE(kEoB2SlotValidationFlagsAmiga), kEoB2SlotValidationFlagsAmiga };
+
+static const byte kEoB2ProjectileWeaponTypesAmiga[15] = {
+ 0xFF, 0x01, 0xFF, 0x02, 0x04, 0x03, 0x05, 0x10,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x12
+};
+
+static const ByteProvider kEoB2ProjectileWeaponTypesAmigaProvider = { ARRAYSIZE(kEoB2ProjectileWeaponTypesAmiga), kEoB2ProjectileWeaponTypesAmiga };
+
+static const byte kEoB2WandTypesAmiga[8] = {
+ 0x00, 0x11, 0x17, 0x31, 0x0D, 0xFF, 0x04, 0x0C
+};
+
+static const ByteProvider kEoB2WandTypesAmigaProvider = { ARRAYSIZE(kEoB2WandTypesAmiga), kEoB2WandTypesAmiga };
+
+static const byte kEoB2DrawObjPosIndexAmiga[20] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x02, 0x00, 0x03,
+ 0x01, 0x04, 0x02, 0x03, 0x00, 0x01, 0x04, 0x01,
+ 0x03, 0x00, 0x02, 0x04
+};
+
+static const ByteProvider kEoB2DrawObjPosIndexAmigaProvider = { ARRAYSIZE(kEoB2DrawObjPosIndexAmiga), kEoB2DrawObjPosIndexAmiga };
+
+static const byte kEoB2FlightObjFlipIndexAmiga[16] = {
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2FlightObjFlipIndexAmigaProvider = { ARRAYSIZE(kEoB2FlightObjFlipIndexAmiga), kEoB2FlightObjFlipIndexAmiga };
+
+static const byte kEoB2FlightObjShpMapAmiga[45] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02,
+ 0xFF, 0xFF, 0x04, 0xFF, 0x06, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2FlightObjShpMapAmigaProvider = { ARRAYSIZE(kEoB2FlightObjShpMapAmiga), kEoB2FlightObjShpMapAmiga };
+
+static const byte kEoB2FlightObjSclIndexAmiga[72] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
+ 0xff, 0xff, 0x03, 0x03, 0xff, 0xff, 0x03, 0x03,
+ 0xff, 0xff, 0x03, 0x03, 0xff, 0xff, 0x03, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x01, 0xff, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
+static const ByteProvider kEoB2FlightObjSclIndexAmigaProvider = { ARRAYSIZE(kEoB2FlightObjSclIndexAmiga), kEoB2FlightObjSclIndexAmiga };
+
+static const uint16 kEoB2TransferPortraitFramesAmiga[32] = {
+ 0x0004, 0x0018, 0x009d, 0x0038, 0x00a2, 0x0018, 0x013c, 0x0039,
+ 0x0004, 0x0040, 0x009d, 0x0060, 0x00a2, 0x0040, 0x013c, 0x0060,
+ 0x0004, 0x0068, 0x009d, 0x0089, 0x00a2, 0x0068, 0x013c, 0x0089,
+ 0x0004, 0x0094, 0x002e, 0x009e, 0x0110, 0x0094, 0x013a, 0x009e
+};
+
+static const Uint16Provider kEoB2TransferPortraitFramesAmigaProvider = { ARRAYSIZE(kEoB2TransferPortraitFramesAmiga), kEoB2TransferPortraitFramesAmiga };
+
+static const byte kEoB2TransferConvertTableAmiga[49] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x05, 0x06,
+ 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x0D, 0x00, 0x0E,
+ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x00, 0x00,
+ 0x17, 0x18, 0x22, 0x24, 0x23, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x31, 0x30, 0x32, 0x33, 0x00, 0x35, 0x34, 0x36,
+ 0x37
+};
+
+static const ByteProvider kEoB2TransferConvertTableAmigaProvider = { ARRAYSIZE(kEoB2TransferConvertTableAmiga), kEoB2TransferConvertTableAmiga };
+
+static const byte kEoB2TransferItemTableAmiga[60] = {
+ 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
+ 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2TransferItemTableAmigaProvider = { ARRAYSIZE(kEoB2TransferItemTableAmiga), kEoB2TransferItemTableAmiga };
+
+static const uint32 kEoB2TransferExpTableAmiga[6] = {
+ 0x000F423F, 0x000B71AF, 0x000DBB9F, 0x0006B6BF, 0x000DBB9F, 0x000DBB9F
+};
+
+static const Uint32Provider kEoB2TransferExpTableAmigaProvider = { ARRAYSIZE(kEoB2TransferExpTableAmiga), kEoB2TransferExpTableAmiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData00Amiga[5] = {
+ { 0x01, 0, 208, 16, 1, 1, 0, 0, 0, 0 },
+ { 0x01, 0, 208, 16, 1, 1, 0, 0, 0, 0 },
+ { 0x00, 0, 216, 51, 8, 0, 0, 0, 0, 0 },
+ { 0x06, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData00AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData00Amiga), kEoB2IntroAnimData00Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData01Amiga[5] = {
+ { 0x01, 1, 184, 8, 1, 1, 0, 0, 0, 0 },
+ { 0x01, 1, 184, 8, 1, 1, 0, 0, 0, 0 },
+ { 0x00, 0, 216, 51, 7, 0, 0, 0, 0, 0 },
+ { 0x06, 4, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData01AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData01Amiga), kEoB2IntroAnimData01Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData02Amiga[5] = {
+ { 0x01, 2, 216, 51, 1, 0, 0, 0, 0, 0 },
+ { 0x01, 2, 216, 51, 1, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 216, 51, 18, 0, 0, 0, 0, 0 },
+ { 0x06, 6, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData02AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData02Amiga), kEoB2IntroAnimData02Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData03Amiga[4] = {
+ { 0x00, 0, 0, 0, 1, 2, 0, 0, 0, 0 },
+ { 0x06, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 2, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData03AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData03Amiga), kEoB2IntroAnimData03Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData04Amiga[3] = {
+ { 0x01, 0, 282, 8, 1, 0, 0, 0, 0, 0 },
+ { 0x01, 0, 282, 8, 1, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData04AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData04Amiga), kEoB2IntroAnimData04Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData05Amiga[4] = {
+ { 0x00, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData05AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData05Amiga), kEoB2IntroAnimData05Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData06Amiga[16] = {
+ { 0x01, 12, 170, 11, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 188, 38, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 203, 63, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 218, 85, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 232, 107, 2, 0, 0, 0, 0, 0 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x01, 3, 242, 125, 1, 0, 0, 0, 0, 0 },
+ { 0x01, 4, 240, 125, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 5, 238, 124, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 6, 236, 123, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 7, 232, 121, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 8, 226, 120, 3, 0, 0, 0, 0, 0 },
+ { 0x01, 9, 220, 119, 3, 0, 0, 0, 0, 0 },
+ { 0x01, 10, 241, 115, 3, 0, 0, 0, 0, 0 },
+ { 0x01, 11, 241, 115, 3, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData06AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData06Amiga), kEoB2IntroAnimData06Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData07Amiga[5] = {
+ { 0x01, 12, 54, 17, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 80, 53, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 104, 87, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 130, 124, 2, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData07AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData07Amiga), kEoB2IntroAnimData07Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData08Amiga[6] = {
+ { 0x01, 12, 112, 8, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 126, 34, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 142, 60, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 12, 170, 109, 2, 0, 0, 0, 0, 0 },
+ { 0x06, 8, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData08AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData08Amiga), kEoB2IntroAnimData08Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData09Amiga[4] = {
+ { 0x05, 0, 184, 64, 6, 0, 30, 8, 3, 16 },
+ { 0x05, 0, 184, 64, 6, 0, 33, 8, 3, 16 },
+ { 0x05, 0, 184, 64, 6, 0, 36, 8, 3, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData09AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData09Amiga), kEoB2IntroAnimData09Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData10Amiga[10] = {
+ { 0x05, 0, 184, 64, 0, 0, 30, 8, 3, 16 },
+ { 0x05, 0, 128, 88, 3, 0, 30, 32, 4, 24 },
+ { 0x05, 0, 128, 88, 3, 0, 34, 32, 4, 24 },
+ { 0x05, 0, 184, 64, 0, 0, 33, 8, 3, 16 },
+ { 0x05, 0, 128, 88, 3, 0, 30, 32, 4, 24 },
+ { 0x05, 0, 128, 88, 3, 0, 34, 32, 4, 24 },
+ { 0x05, 0, 184, 64, 0, 0, 36, 8, 3, 16 },
+ { 0x05, 0, 128, 88, 3, 0, 30, 32, 4, 24 },
+ { 0x05, 0, 128, 88, 3, 0, 34, 32, 4, 24 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData10AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData10Amiga), kEoB2IntroAnimData10Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData11Amiga[10] = {
+ { 0x03, 15, 36, 48, 2, 1, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 2, 2, 0, 0, 0, 0 },
+ { 0x06, 11, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 2, 3, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 90, 4, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 2, 3, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 2, 2, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 2, 1, 0, 0, 0, 0 },
+ { 0x03, 15, 36, 48, 2, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData11AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData11Amiga), kEoB2IntroAnimData11Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData12Amiga[4] = {
+ { 0x06, 10, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 104, 24, 5, 0, 0, 8, 15, 112 },
+ { 0x05, 0, 104, 24, 5, 0, 15, 8, 15, 112 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData12AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData12Amiga), kEoB2IntroAnimData12Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData13Amiga[6] = {
+ { 0x05, 0, 184, 64, 0, 0, 30, 8, 3, 16 },
+ { 0x05, 0, 104, 72, 5, 0, 10, 120, 10, 64 },
+ { 0x05, 0, 184, 64, 0, 0, 33, 8, 3, 16 },
+ { 0x05, 0, 104, 72, 5, 0, 20, 120, 10, 64 },
+ { 0x05, 0, 184, 64, 0, 0, 36, 8, 3, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData13AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData13Amiga), kEoB2IntroAnimData13Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData14Amiga[4] = {
+ { 0x05, 0, 104, 0, 8, 0, 0, 0, 13, 200 },
+ { 0x05, 0, 104, 0, 8, 0, 13, 0, 13, 200 },
+ { 0x05, 0, 104, 0, 8, 0, 26, 0, 13, 200 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData14AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData14Amiga), kEoB2IntroAnimData14Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData15Amiga[11] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 6, 112, 72, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 7, 112, 72, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 8, 112, 72, 6, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData15AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData15Amiga), kEoB2IntroAnimData15Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData16Amiga[12] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData16AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData16Amiga), kEoB2IntroAnimData16Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData17Amiga[8] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 6, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData17AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData17Amiga), kEoB2IntroAnimData17Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData18Amiga[14] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 10, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 11, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 12, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 13, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 10, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 13, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData18AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData18Amiga), kEoB2IntroAnimData18Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData19Amiga[14] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 11, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 10, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 13, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 12, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 11, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 13, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData19AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData19Amiga), kEoB2IntroAnimData19Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData20Amiga[14] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 14, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 9, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 15, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 16, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 4, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 17, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 14, 136, 40, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 224, 72, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 5, 240, 40, 3, 0, 0, 0, 0, 0 },
+ { 0x02, 17, 136, 40, 3, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData20AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData20Amiga), kEoB2IntroAnimData20Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData21Amiga[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 10, 0, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData21AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData21Amiga), kEoB2IntroAnimData21Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData22Amiga[2] = {
+ { 0x05, 0, 104, 32, 3, 0, 20, 0, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData22AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData22Amiga), kEoB2IntroAnimData22Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData23Amiga[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 30, 0, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData23AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData23Amiga), kEoB2IntroAnimData23Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData24Amiga[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 0, 96, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData24AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData24Amiga), kEoB2IntroAnimData24Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData25Amiga[2] = {
+ { 0x05, 0, 104, 32, 3, 0, 10, 96, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData25AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData25Amiga), kEoB2IntroAnimData25Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData26Amiga[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 20, 96, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData26AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData26Amiga), kEoB2IntroAnimData26Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData27Amiga[2] = {
+ { 0x05, 0, 104, 32, 0, 0, 0, 0, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData27AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData27Amiga), kEoB2IntroAnimData27Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData28Amiga[2] = {
+ { 0x05, 0, 104, 32, 3, 0, 0, 0, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData28AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData28Amiga), kEoB2IntroAnimData28Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData29Amiga[2] = {
+ { 0x05, 0, 104, 32, 4, 0, 10, 0, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData29AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData29Amiga), kEoB2IntroAnimData29Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData30Amiga[2] = {
+ { 0x05, 0, 104, 32, 8, 0, 20, 0, 10, 96 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData30AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData30Amiga), kEoB2IntroAnimData30Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData31Amiga[5] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 176, 56, 3, 0, 19, 136, 2, 8 },
+ { 0x05, 0, 176, 56, 3, 0, 21, 136, 2, 8 },
+ { 0x05, 0, 176, 56, 3, 0, 23, 136, 2, 8 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData31AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData31Amiga), kEoB2IntroAnimData31Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData32Amiga[14] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 176, 56, 0, 0, 19, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 5, 0, 1, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 0, 0, 21, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 3, 0, 7, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 2, 0, 23, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 3, 0, 13, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 0, 0, 19, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 6, 0, 1, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 0, 0, 21, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 3, 0, 7, 136, 6, 40 },
+ { 0x05, 0, 176, 56, 0, 0, 23, 136, 2, 8 },
+ { 0x05, 0, 144, 88, 3, 0, 1, 136, 6, 40 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData32AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData32Amiga), kEoB2IntroAnimData32Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData33Amiga[8] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 80, 64, 0, 0, 1, 136, 2, 16 },
+ { 0x05, 0, 248, 64, 3, 0, 7, 136, 2, 16 },
+ { 0x05, 0, 80, 64, 0, 0, 3, 136, 2, 16 },
+ { 0x05, 0, 248, 64, 3, 0, 9, 136, 2, 16 },
+ { 0x05, 0, 80, 64, 0, 0, 5, 136, 2, 16 },
+ { 0x05, 0, 248, 64, 3, 0, 11, 136, 2, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData33AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData33Amiga), kEoB2IntroAnimData33Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData34Amiga[5] = {
+ { 0x06, 255, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 16, 48, 0, 0, 0, 152, 14, 48 },
+ { 0x05, 0, 192, 48, 4, 0, 14, 128, 13, 48 },
+ { 0x05, 0, 16, 48, 0, 0, 1, 40, 35, 48 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData34AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData34Amiga), kEoB2IntroAnimData34Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData35Amiga[6] = {
+ { 0x06, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 24, 3, 0, 0, 128, 2, 32 },
+ { 0x05, 0, 152, 16, 3, 0, 0, 88, 5, 40 },
+ { 0x05, 0, 128, 0, 3, 0, 0, 0, 10, 88 },
+ { 0x05, 0, 104, 0, 3, 0, 13, 0, 14, 88 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData35AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData35Amiga), kEoB2IntroAnimData35Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData36Amiga[2] = {
+ { 0x05, 0, 104, 0, 0, 0, 13, 0, 13, 200 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData36AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData36Amiga), kEoB2IntroAnimData36Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData37Amiga[25] = {
+ { 0x03, 17, 36, 48, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 2, 1, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 2, 2, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 2, 3, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 54, 4, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 2, 3, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 2, 2, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 2, 1, 0, 0, 0, 0 },
+ { 0x03, 17, 36, 48, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 16, 142, 80, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 19, 151, 28, 2, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData37AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData37Amiga), kEoB2IntroAnimData37Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData38Amiga[22] = {
+ { 0x03, 22, 13, 32, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 0, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 1, 0, 0, 0, 0 },
+ { 0x06, 11, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 2, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 3, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 90, 4, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 4, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 3, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 3, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 2, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 2, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 1, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 1, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 0, 0, 0, 0, 0 },
+ { 0x03, 22, 13, 32, 0, 0, 0, 0, 0, 0 },
+ { 0x03, 23, 67, 80, 1, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData38AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData38Amiga), kEoB2IntroAnimData38Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData39Amiga[3] = {
+ { 0x06, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 2, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData39AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData39Amiga), kEoB2IntroAnimData39Amiga };
+
+static const DarkMoonAnimCommand kEoB2IntroAnimData40Amiga[5] = {
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0x00, 0, 0, 0, 1, 3, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2IntroAnimData40AmigaProvider = { ARRAYSIZE(kEoB2IntroAnimData40Amiga), kEoB2IntroAnimData40Amiga };
+
+static const DarkMoonShapeDef kEoB2IntroShapes00Amiga[15] = {
+ { 0, 1, 137, 4, 43 },
+ { 1, 5, 137, 4, 54 },
+ { 2, 9, 140, 4, 8 },
+ { 3, 1, 181, 1, 3 },
+ { 4, 9, 154, 1, 3 },
+ { 5, 9, 158, 2, 5 },
+ { 6, 9, 164, 3, 7 },
+ { 7, 9, 172, 3, 11 },
+ { 8, 9, 184, 5, 13 },
+ { 9, 15, 137, 6, 15 },
+ { 10, 15, 153, 2, 21 },
+ { 11, 17, 153, 2, 21 },
+ { 12, 1, 185, 1, 4 },
+ { 13, 1, 190, 1, 1 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes00AmigaProvider = { ARRAYSIZE(kEoB2IntroShapes00Amiga), kEoB2IntroShapes00Amiga };
+
+static const DarkMoonShapeDef kEoB2IntroShapes01Amiga[2] = {
+ { 0, 1, 137, 1, 16 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes01AmigaProvider = { ARRAYSIZE(kEoB2IntroShapes01Amiga), kEoB2IntroShapes01Amiga };
+
+static const DarkMoonShapeDef kEoB2IntroShapes04Amiga[10] = {
+ { 15, 2, 0, 32, 14 },
+ { 16, 5, 16, 5, 8 },
+ { 17, 2, 26, 32, 19 },
+ { 18, 0, 140, 35, 10 },
+ { 19, 21, 16, 3, 8 },
+ { 20, 0, 47, 22, 10 },
+ { 21, 0, 59, 31, 10 },
+ { 22, 0, 71, 36, 39 },
+ { 23, 0, 119, 24, 15 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes04AmigaProvider = { ARRAYSIZE(kEoB2IntroShapes04Amiga), kEoB2IntroShapes04Amiga };
+
+static const DarkMoonShapeDef kEoB2IntroShapes07Amiga[18] = {
+ { -9, 1, 136, 6, 40 },
+ { -1, 7, 136, 6, 40 },
+ { -2, 13, 136, 6, 40 },
+ { 3, 19, 136, 2, 16 },
+ { 4, 21, 136, 2, 16 },
+ { 5, 23, 136, 2, 16 },
+ { 6, 19, 152, 1, 8 },
+ { 7, 20, 152, 1, 8 },
+ { 8, 21, 152, 1, 8 },
+ { -10, 25, 136, 2, 16 },
+ { -11, 27, 136, 2, 16 },
+ { -12, 29, 136, 2, 16 },
+ { -13, 31, 136, 2, 16 },
+ { -14, 25, 152, 2, 16 },
+ { -15, 27, 152, 2, 16 },
+ { -16, 29, 152, 2, 16 },
+ { -17, 31, 152, 2, 16 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes07AmigaProvider = { ARRAYSIZE(kEoB2IntroShapes07Amiga), kEoB2IntroShapes07Amiga };
+
+static const DarkMoonShapeDef kEoB2IntroShapes13Amiga[10] = {
+ { 25, 2, 0, 32, 14 },
+ { 26, 5, 16, 5, 8 },
+ { 27, 2, 26, 32, 19 },
+ { 28, 0, 140, 35, 10 },
+ { 29, 21, 16, 3, 8 },
+ { 30, 0, 47, 22, 10 },
+ { 31, 0, 59, 31, 10 },
+ { 32, 0, 71, 36, 39 },
+ { 33, 0, 119, 24, 15 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes13AmigaProvider = { ARRAYSIZE(kEoB2IntroShapes13Amiga), kEoB2IntroShapes13Amiga };
+
+static const DarkMoonShapeDef kEoB2IntroShapes14Amiga[10] = {
+ { 35, 2, 0, 32, 14 },
+ { 36, 5, 16, 5, 8 },
+ { 37, 2, 26, 32, 19 },
+ { 38, 0, 140, 35, 10 },
+ { 39, 21, 16, 3, 8 },
+ { 40, 0, 47, 22, 10 },
+ { 41, 0, 59, 31, 10 },
+ { 42, 0, 71, 36, 39 },
+ { 43, 0, 119, 24, 15 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes14AmigaProvider = { ARRAYSIZE(kEoB2IntroShapes14Amiga), kEoB2IntroShapes14Amiga };
+
+static const DarkMoonShapeDef kEoB2IntroShapes15Amiga[10] = {
+ { 45, 2, 0, 32, 14 },
+ { 46, 5, 16, 5, 8 },
+ { 47, 2, 26, 32, 19 },
+ { 48, 0, 140, 35, 10 },
+ { 49, 21, 16, 3, 8 },
+ { 50, 0, 47, 22, 10 },
+ { 51, 0, 59, 31, 10 },
+ { 52, 0, 71, 36, 39 },
+ { 53, 0, 119, 24, 15 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2IntroShapes15AmigaProvider = { ARRAYSIZE(kEoB2IntroShapes15Amiga), kEoB2IntroShapes15Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData00Amiga[11] = {
+ { 0x06, 4, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 136, 8, 8, 0, 5, 136, 11, 48 },
+ { 0x02, 1, 136, 8, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 80, 8, 0, 0, 0, 136, 5, 40 },
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 232, 88, 4, 0, 0, 88, 8, 48 },
+ { 0x02, 3, 80, 8, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 232, 88, 4, 0, 8, 88, 8, 48 },
+ { 0x05, 0, 232, 88, 4, 0, 16, 88, 8, 48 },
+ { 0x02, 2, 232, 88, 4, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData00AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData00Amiga), kEoB2FinaleAnimData00Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData01Amiga[9] = {
+ { 0x06, 4, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 136, 8, 12, 0, 5, 136, 11, 48 },
+ { 0x02, 1, 136, 8, 0, 0, 0, 0, 0, 0 },
+ { 0x06, 5, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 232, 88, 6, 0, 0, 88, 8, 48 },
+ { 0x05, 0, 232, 88, 6, 0, 8, 88, 8, 48 },
+ { 0x05, 0, 232, 88, 6, 0, 16, 88, 8, 48 },
+ { 0x02, 2, 232, 88, 6, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData01AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData01Amiga), kEoB2FinaleAnimData01Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData02Amiga[4] = {
+ { 0x05, 0, 232, 112, 6, 0, 24, 176, 3, 16 },
+ { 0x05, 0, 232, 112, 6, 0, 27, 176, 3, 16 },
+ { 0x05, 0, 232, 112, 6, 0, 30, 176, 3, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData02AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData02Amiga), kEoB2FinaleAnimData02Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData03Amiga[6] = {
+ { 0x05, 0, 80, 8, 0, 0, 0, 136, 5, 40 },
+ { 0x05, 0, 232, 112, 3, 0, 24, 176, 3, 16 },
+ { 0x02, 3, 80, 8, 3, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 232, 112, 3, 0, 27, 176, 3, 16 },
+ { 0x05, 0, 232, 112, 3, 0, 30, 176, 3, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData03AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData03Amiga), kEoB2FinaleAnimData03Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData04Amiga[8] = {
+ { 0x06, 6, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 104, 40, 3, 0, 32, 88, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 32, 0, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 24, 0, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 16, 0, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 0, 0, 8, 88 },
+ { 0x05, 0, 104, 40, 3, 0, 24, 88, 8, 88 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData04AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData04Amiga), kEoB2FinaleAnimData04Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData05Amiga[7] = {
+ { 0x05, 0, 232, 112, 0, 0, 24, 176, 3, 16 },
+ { 0x05, 0, 128, 40, 4, 0, 33, 176, 2, 16 },
+ { 0x05, 0, 232, 112, 0, 0, 27, 176, 3, 16 },
+ { 0x05, 0, 128, 40, 4, 0, 35, 176, 2, 16 },
+ { 0x05, 0, 232, 112, 0, 0, 30, 176, 3, 16 },
+ { 0x05, 0, 128, 40, 4, 0, 37, 176, 2, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData05AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData05Amiga), kEoB2FinaleAnimData05Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData06Amiga[2] = {
+ { 0x05, 0, 104, 40, 0, 0, 16, 136, 8, 48 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData06AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData06Amiga), kEoB2FinaleAnimData06Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData07Amiga[6] = {
+ { 0x05, 0, 208, 80, 4, 0, 0, 128, 6, 56 },
+ { 0x05, 0, 208, 80, 4, 0, 6, 128, 6, 56 },
+ { 0x05, 0, 208, 80, 4, 0, 12, 128, 6, 56 },
+ { 0x05, 0, 208, 80, 4, 0, 18, 128, 6, 56 },
+ { 0x05, 0, 208, 80, 4, 0, 24, 128, 6, 56 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData07AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData07Amiga), kEoB2FinaleAnimData07Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData08Amiga[3] = {
+ { 0x05, 0, 224, 56, 3, 0, 0, 184, 4, 16 },
+ { 0x05, 0, 224, 56, 0, 0, 4, 184, 4, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData08AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData08Amiga), kEoB2FinaleAnimData08Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData09Amiga[8] = {
+ { 0x01, 1, -10, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 0, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 10, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 20, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 30, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x01, 1, 40, 40, 2, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 48, 40, 2, 0, 0, 0, 0, 0 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData09AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData09Amiga), kEoB2FinaleAnimData09Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData10Amiga[14] = {
+ { 0x05, 1, 8, 40, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 24, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 12, 80, 1, 16 },
+ { 0x05, 1, 8, 40, 0, 0, 32, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 28, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 13, 80, 1, 16 },
+ { 0x05, 1, 8, 40, 0, 0, 24, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 32, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 14, 80, 1, 16 },
+ { 0x06, 8, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 12, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 128, 12, 24 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData10AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData10Amiga), kEoB2FinaleAnimData10Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData11Amiga[18] = {
+ { 0x05, 1, 40, 32, 0, 0, 16, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 18, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 0, 0, 0, 152, 12, 24 },
+ { 0x05, 1, 8, 40, 0, 0, 24, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 32, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 0, 0, 14, 80, 1, 16 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x05, 1, 8, 40, 0, 0, 24, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 32, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 14, 80, 1, 16 },
+ { 0x05, 1, 8, 40, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 24, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 12, 80, 1, 16 },
+ { 0x05, 1, 8, 40, 0, 0, 16, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 36, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 15, 80, 1, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData11AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData11Amiga), kEoB2FinaleAnimData11Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData12Amiga[23] = {
+ { 0x05, 1, 40, 32, 0, 0, 16, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 18, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 0, 0, 0, 152, 12, 24 },
+ { 0x05, 1, 8, 40, 0, 0, 24, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 32, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 0, 0, 14, 80, 1, 16 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 8, 40, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 24, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 12, 80, 1, 16 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 8, 40, 0, 0, 16, 80, 8, 80 },
+ { 0x05, 1, 280, 96, 0, 0, 36, 160, 4, 40 },
+ { 0x05, 1, 96, 96, 3, 0, 15, 80, 1, 16 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData12AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData12Amiga), kEoB2FinaleAnimData12Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData13Amiga[23] = {
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 0, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 80, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 16, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 6, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 104, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 12, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 128, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData13AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData13Amiga), kEoB2FinaleAnimData13Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData14Amiga[24] = {
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 0, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 80, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 16, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 6, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 104, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 12, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 128, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData14AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData14Amiga), kEoB2FinaleAnimData14Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData15Amiga[19] = {
+ { 0x05, 1, 40, 32, 0, 0, 0, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 0, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 80, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 16, 0, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 6, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 104, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 9, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 1, 40, 32, 0, 0, 0, 40, 16, 40 },
+ { 0x05, 1, 248, 88, 0, 0, 12, 176, 6, 24 },
+ { 0x05, 1, 96, 80, 3, 0, 0, 128, 12, 24 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData15AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData15Amiga), kEoB2FinaleAnimData15Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData16Amiga[13] = {
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 1, 168, 16, 3, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 2, 168, 16, 3, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0x06, 15, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x02, 3, 168, 16, 3, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 16, 0, 0, 32, 0, 8, 80 },
+ { 0x05, 0, 232, 16, 0, 0, 32, 80, 8, 80 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData16AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData16Amiga), kEoB2FinaleAnimData16Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData17Amiga[20] = {
+ { 0x05, 0, 168, 16, 1, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x06, 10, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData17AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData17Amiga), kEoB2FinaleAnimData17Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData18Amiga[28] = {
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 3, 0, 16, 0, 16, 80 },
+ { 0x05, 0, 168, 16, 1, 0, 0, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 2, 0, 16, 80, 16, 80 },
+ { 0x05, 0, 168, 16, 0, 0, 16, 80, 16, 80 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData18AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData18Amiga), kEoB2FinaleAnimData18Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData19Amiga[7] = {
+ { 0x05, 0, 80, 80, 4, 0, 0, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 6, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 12, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 18, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 24, 128, 6, 56 },
+ { 0x05, 0, 80, 80, 4, 0, 30, 128, 6, 56 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData19AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData19Amiga), kEoB2FinaleAnimData19Amiga };
+
+static const DarkMoonAnimCommand kEoB2FinaleAnimData20Amiga[3] = {
+ { 0x05, 0, 96, 56, 3, 0, 0, 184, 4, 16 },
+ { 0x05, 0, 96, 56, 0, 0, 4, 184, 4, 16 },
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonAnimCommandProvider kEoB2FinaleAnimData20AmigaProvider = { ARRAYSIZE(kEoB2FinaleAnimData20Amiga), kEoB2FinaleAnimData20Amiga };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes00Amiga[4] = {
+ { -1, 16, 0, 11, 48 },
+ { -2, 28, 80, 8, 48 },
+ { -3, 9, 0, 5, 40 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes00AmigaProvider = { ARRAYSIZE(kEoB2FinaleShapes00Amiga), kEoB2FinaleShapes00Amiga };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes03Amiga[3] = {
+ { -1, 30, 0, 8, 96 },
+ { -2, 30, 104, 10, 96 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes03AmigaProvider = { ARRAYSIZE(kEoB2FinaleShapes03Amiga), kEoB2FinaleShapes03Amiga };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes07Amiga[4] = {
+ { 1, 0, 0, 16, 72 },
+ { 2, 16, 0, 16, 72 },
+ { 3, 0, 72, 16, 72 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes07AmigaProvider = { ARRAYSIZE(kEoB2FinaleShapes07Amiga), kEoB2FinaleShapes07Amiga };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes09Amiga[9] = {
+ { 0, 0, 0, 32, 16 },
+ { 2, 0, 36, 35, 41 },
+ { 3, 0, 77, 24, 17 },
+ { 4, 0, 94, 15, 33 },
+ { 5, 24, 77, 10, 17 },
+ { 6, 16, 99, 23, 69 },
+ { -10, 0, 136, 8, 64 },
+ { -11, 8, 136, 8, 64 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes09AmigaProvider = { ARRAYSIZE(kEoB2FinaleShapes09Amiga), kEoB2FinaleShapes09Amiga };
+
+static const DarkMoonShapeDef kEoB2FinaleShapes10Amiga[4] = {
+ { 1, 0, 0, 40, 30 },
+ { 15, 9, 37, 21, 48 },
+ { 16, 16, 88, 6, 56 },
+ { 0, 0, 0, 0, 0 }
+};
+
+static const DarkMoonShapeDefProvider kEoB2FinaleShapes10AmigaProvider = { ARRAYSIZE(kEoB2FinaleShapes10Amiga), kEoB2FinaleShapes10Amiga };
+
+static const byte kEoB2NpcShapeDataAmiga[24] = {
+ 0x00, 0x00, 0x00, 0x05, 0x39, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x64, 0x05, 0x4f, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x39, 0x06, 0x2b, 0x00, 0x00, 0xff
+};
+
+static const ByteProvider kEoB2NpcShapeDataAmigaProvider = { ARRAYSIZE(kEoB2NpcShapeDataAmiga), kEoB2NpcShapeDataAmiga };
+
+static const byte kEoB2ClassModifierFlagsAmiga[15] = {
+ 0x01, 0x20, 0x10, 0x02, 0x04, 0x08, 0x05, 0x09,
+ 0x03, 0x0B, 0x0A, 0x0C, 0x07, 0x05, 0x06
+};
+
+static const ByteProvider kEoB2ClassModifierFlagsAmigaProvider = { ARRAYSIZE(kEoB2ClassModifierFlagsAmiga), kEoB2ClassModifierFlagsAmiga };
+
+static const byte kEoB2MonsterStepTable02Amiga[8] = {
+ 0xE0, 0xE1, 0x01, 0x21, 0x20, 0x1F, 0xFF, 0xDF
+};
+
+static const ByteProvider kEoB2MonsterStepTable02AmigaProvider = { ARRAYSIZE(kEoB2MonsterStepTable02Amiga), kEoB2MonsterStepTable02Amiga };
+
+static const byte kEoB2MonsterStepTable1Amiga[16] = {
+ 0x01, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00,
+ 0x00, 0x00, 0xFF, 0x20, 0xFF, 0x00, 0x00, 0xE0
+};
+
+static const ByteProvider kEoB2MonsterStepTable1AmigaProvider = { ARRAYSIZE(kEoB2MonsterStepTable1Amiga), kEoB2MonsterStepTable1Amiga };
+
+static const byte kEoB2MonsterStepTable2Amiga[8] = {
+ 0x07, 0xFA, 0x05, 0xFC, 0x03, 0xFE, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2MonsterStepTable2AmigaProvider = { ARRAYSIZE(kEoB2MonsterStepTable2Amiga), kEoB2MonsterStepTable2Amiga };
+
+static const byte kEoB2MonsterStepTable3Amiga[8] = {
+ 0xF9, 0x06, 0xFB, 0x04, 0xFD, 0x02, 0xFF, 0x00
+};
+
+static const ByteProvider kEoB2MonsterStepTable3AmigaProvider = { ARRAYSIZE(kEoB2MonsterStepTable3Amiga), kEoB2MonsterStepTable3Amiga };
+
+static const byte kEoB2MonsterCloseAttPosTable1Amiga[4] = {
+ 0x00, 0x01, 0x03, 0x02
+};
+
+static const ByteProvider kEoB2MonsterCloseAttPosTable1AmigaProvider = { ARRAYSIZE(kEoB2MonsterCloseAttPosTable1Amiga), kEoB2MonsterCloseAttPosTable1Amiga };
+
+static const byte kEoB2MonsterCloseAttPosTable22Amiga[16] = {
+ 0x00, 0x01, 0x02, 0x03, 0x00, 0x02, 0x01, 0x03,
+ 0x00, 0x01, 0x02, 0x03, 0x03, 0x01, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttPosTable22AmigaProvider = { ARRAYSIZE(kEoB2MonsterCloseAttPosTable22Amiga), kEoB2MonsterCloseAttPosTable22Amiga };
+
+static const byte kEoB2MonsterCloseAttUnkTableAmiga[10] = {
+ 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttUnkTableAmigaProvider = { ARRAYSIZE(kEoB2MonsterCloseAttUnkTableAmiga), kEoB2MonsterCloseAttUnkTableAmiga };
+
+static const byte kEoB2MonsterCloseAttChkTable1Amiga[16] = {
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttChkTable1AmigaProvider = { ARRAYSIZE(kEoB2MonsterCloseAttChkTable1Amiga), kEoB2MonsterCloseAttChkTable1Amiga };
+
+static const byte kEoB2MonsterCloseAttChkTable2Amiga[16] = {
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00
+};
+
+static const ByteProvider kEoB2MonsterCloseAttChkTable2AmigaProvider = { ARRAYSIZE(kEoB2MonsterCloseAttChkTable2Amiga), kEoB2MonsterCloseAttChkTable2Amiga };
+
+static const byte kEoB2MonsterCloseAttDstTable1Amiga[16] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kEoB2MonsterCloseAttDstTable1AmigaProvider = { ARRAYSIZE(kEoB2MonsterCloseAttDstTable1Amiga), kEoB2MonsterCloseAttDstTable1Amiga };
+
+static const byte kEoB2MonsterCloseAttDstTable2Amiga[48] = {
+ 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x00, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x05, 0x03, 0x01, 0x04,
+ 0x02, 0x00, 0x01, 0x03, 0x05, 0x00, 0x02, 0x04,
+ 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x05, 0x04,
+ 0x03, 0x02, 0x01, 0x00, 0x00, 0x02, 0x04, 0x01,
+ 0x03, 0x05, 0x04, 0x02, 0x00, 0x05, 0x03, 0x01
+};
+
+static const ByteProvider kEoB2MonsterCloseAttDstTable2AmigaProvider = { ARRAYSIZE(kEoB2MonsterCloseAttDstTable2Amiga), kEoB2MonsterCloseAttDstTable2Amiga };
+
+static const byte kEoB2MonsterProximityTableAmiga[32] = {
+ 0x02, 0x03, 0x00, 0x01, 0x03, 0x02, 0x01, 0x00,
+ 0x00, 0x02, 0x01, 0x03, 0x02, 0x00, 0x03, 0x01,
+ 0x01, 0x00, 0x03, 0x02, 0x00, 0x01, 0x02, 0x03,
+ 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2MonsterProximityTableAmigaProvider = { ARRAYSIZE(kEoB2MonsterProximityTableAmiga), kEoB2MonsterProximityTableAmiga };
+
+static const byte kEoB2FindBlockMonstersTableAmiga[64] = {
+ 0x04, 0x02, 0x01, 0x03, 0x04, 0x03, 0x00, 0x02,
+ 0x04, 0x00, 0x03, 0x01, 0x04, 0x01, 0x02, 0x00,
+ 0x04, 0x01, 0x02, 0x03, 0x04, 0x00, 0x03, 0x02,
+ 0x04, 0x03, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00,
+ 0x04, 0x02, 0x01, 0x03, 0x04, 0x03, 0x00, 0x02,
+ 0x04, 0x00, 0x03, 0x01, 0x04, 0x01, 0x02, 0x00,
+ 0x04, 0x01, 0x02, 0x03, 0x04, 0x00, 0x03, 0x02,
+ 0x04, 0x03, 0x00, 0x01, 0x04, 0x02, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2FindBlockMonstersTableAmigaProvider = { ARRAYSIZE(kEoB2FindBlockMonstersTableAmiga), kEoB2FindBlockMonstersTableAmiga };
+
+static const byte kEoB2MonsterDirChangeTableAmiga[16] = {
+ 0xff, 0x06, 0x02, 0xff, 0x00, 0x07, 0x01, 0xff,
+ 0x04, 0x05, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
+static const ByteProvider kEoB2MonsterDirChangeTableAmigaProvider = { ARRAYSIZE(kEoB2MonsterDirChangeTableAmiga), kEoB2MonsterDirChangeTableAmiga };
+
+static const uint16 kEoB2EncodeMonsterDefsAmiga[72] = {
+ 0x0000, 0x0000, 0x0007, 0x0060, 0x0007, 0x0028, 0x000c, 0x0038,
+ 0x0013, 0x0028, 0x000c, 0x0038, 0x001f, 0x0000, 0x0007, 0x0060,
+ 0x0000, 0x0060, 0x0007, 0x0060, 0x0007, 0x0060, 0x0007, 0x0060,
+ 0x0000, 0x0000, 0x0007, 0x0060, 0x0007, 0x0000, 0x0007, 0x0060,
+ 0x000e, 0x0000, 0x0007, 0x0060, 0x0015, 0x0000, 0x0007, 0x0060,
+ 0x001c, 0x0000, 0x0007, 0x0060, 0x0000, 0x0060, 0x0007, 0x0060,
+ 0x0000, 0x0000, 0x000a, 0x0058, 0x000a, 0x0000, 0x000a, 0x0058,
+ 0x0014, 0x0000, 0x000a, 0x0058, 0x001e, 0x0000, 0x000a, 0x0058,
+ 0x0000, 0x0058, 0x000a, 0x0058, 0x000a, 0x0058, 0x000a, 0x0058
+};
+
+static const Uint16Provider kEoB2EncodeMonsterDefsAmigaProvider = { ARRAYSIZE(kEoB2EncodeMonsterDefsAmiga), kEoB2EncodeMonsterDefsAmiga };
+
+static const EoBCharacter kEoB2NpcPresetsAmiga[6] = {
+ { 0x00, 0x01, "Insal",
+ 15, 15, 0, 0, 13, 13, 11, 11, 17, 17, 16, 16, 9, 9,
+ 3, 39, 10, 0, 10, 5, 5, -1, 8, { 6, 0, 0 },
+ { 0x00006ADA, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Calandra",
+ 18, 18, 36, 36, 13, 13, 8, 8, 15, 15, 16, 16, 14, 14,
+ 4, 76, 10, 0, 1, 0, 2, -2, 12, { 9, 0, 0 },
+ { 0x0003DF35, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Shorn",
+ 15, 15, 0, 0, 14, 14, 13, 13, 14, 14, 13, 13, 16, 16,
+ 40, 40, 10, 0, 6, 4, 3, -3, 100, { 8, 0, 0 },
+ { 0x00021730, 0x00000000, 0x00000000 }, 0x00000000,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "San-raal",
+ 11, 11, 0, 0, 18, 18, 13, 13, 14, 14, 16, 16, 9, 9,
+ 28, 28, 10, 0, 2, 3, 5, -4, 100, { 8, 0, 0 },
+ { 0x00017AF0, 0x00000000, 0x00000000 }, 0x096B4566,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Tanglor",
+ 16, 16, 0, 0, 13, 13, 16, 16, 15, 15, 11, 11, 12, 12,
+ 53, 53, 9, 0, 4, 6, 1, -5, 100, { 7, 7, 0 },
+ { 0x00010FC2, 0x00010FC2, 0x00000000 }, 0xFFFFFFFF,
+ { 0x0004, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } },
+ { 0x00, 0x01, "Amber",
+ 14, 14, 0, 0, 17, 17, 12, 12, 18, 18, 9, 9, 17, 17,
+ 36, 36, 10, 0, 3, 10, 1, -6, 100, { 7, 7, 0 },
+ { 0x0000FAE6, 0x0000FAE6, 0x00000000 }, 0x00294566,
+ { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000 } }
+};
+
+static const EoBCharacterProvider kEoB2NpcPresetsAmigaProvider = { ARRAYSIZE(kEoB2NpcPresetsAmiga), kEoB2NpcPresetsAmiga };
+
+static const byte kEoB2DreamStepsAmiga[14] = {
+ 0x01, 0x02, 0x03, 0x02, 0x01, 0x00, 0x01, 0x02,
+ 0x03, 0x03, 0x02, 0x01, 0x00, 0xFF
+};
+
+static const ByteProvider kEoB2DreamStepsAmigaProvider = { ARRAYSIZE(kEoB2DreamStepsAmiga), kEoB2DreamStepsAmiga };
+
+static const byte kEoB2HornSoundsAmiga[4] = {
+ 0x40, 0x41, 0x42, 0x43
+};
+
+static const ByteProvider kEoB2HornSoundsAmigaProvider = { ARRAYSIZE(kEoB2HornSoundsAmiga), kEoB2HornSoundsAmiga };
+
+static const uint16 kEoB2WallOfForceDsXAmiga[18] = {
+ 0xFFCC, 0xFFF4, 0x001C, 0x0044, 0x006C, 0x0094, 0x00BC, 0xFFB8,
+ 0xFFF8, 0x0038, 0x0078, 0x00B8, 0xFFC8, 0x0028, 0x0088, 0x0000,
+ 0x0000, 0x0000
+};
+
+static const Uint16Provider kEoB2WallOfForceDsXAmigaProvider = { ARRAYSIZE(kEoB2WallOfForceDsXAmiga), kEoB2WallOfForceDsXAmiga };
+
+static const byte kEoB2WallOfForceDsYAmiga[3] = {
+ 0x20, 0x18, 0x10
+};
+
+static const ByteProvider kEoB2WallOfForceDsYAmigaProvider = { ARRAYSIZE(kEoB2WallOfForceDsYAmiga), kEoB2WallOfForceDsYAmiga };
+
+static const byte kEoB2WallOfForceNumWAmiga[3] = {
+ 0x01, 0x02, 0x03
+};
+
+static const ByteProvider kEoB2WallOfForceNumWAmigaProvider = { ARRAYSIZE(kEoB2WallOfForceNumWAmiga), kEoB2WallOfForceNumWAmiga };
+
+static const byte kEoB2WallOfForceNumHAmiga[3] = {
+ 0x02, 0x06, 0x09
+};
+
+static const ByteProvider kEoB2WallOfForceNumHAmigaProvider = { ARRAYSIZE(kEoB2WallOfForceNumHAmiga), kEoB2WallOfForceNumHAmiga };
+
+static const byte kEoB2WallOfForceShpIdAmiga[3] = {
+ 0x04, 0x02, 0x00
+};
+
+static const ByteProvider kEoB2WallOfForceShpIdAmigaProvider = { ARRAYSIZE(kEoB2WallOfForceShpIdAmiga), kEoB2WallOfForceShpIdAmiga };
+
+static const byte kEoB2DscShapeIndexAmiga[36] = {
+ 0x01, 0x01, 0x04, 0x0A, 0x04, 0x08, 0x04, 0x01,
+ 0x04, 0xF8, 0x04, 0xF6, 0x00, 0x00, 0x03, 0x09,
+ 0x03, 0x07, 0x03, 0x01, 0x03, 0xF9, 0x03, 0xF7,
+ 0x02, 0x06, 0x02, 0x01, 0x02, 0xFA, 0x01, 0x05,
+ 0x01, 0x01, 0x01, 0xFB
+};
+
+static const ByteProvider kEoB2DscShapeIndexAmigaProvider = { ARRAYSIZE(kEoB2DscShapeIndexAmiga), kEoB2DscShapeIndexAmiga };
+
+static const uint16 kEoB2DscXAmiga[18] = {
+ 0xFF70, 0xFFA0, 0xFFD0, 0x0000, 0x0030, 0x0060, 0x0090, 0xFF60,
+ 0xFFB0, 0x0000, 0x0050, 0x00A0, 0xFF80, 0x0000, 0x0080, 0x0000,
+ 0x0000, 0x0000
+};
+
+static const Uint16Provider kEoB2DscXAmigaProvider = { ARRAYSIZE(kEoB2DscXAmiga), kEoB2DscXAmiga };
+
+static const byte kEoB2DscTileIndexAmiga[18] = {
+ 0x00, 0x06, 0x01, 0x05, 0x02, 0x04, 0x03, 0x07,
+ 0x0B, 0x08, 0x0A, 0x09, 0x0C, 0x0E, 0x0D, 0x0F,
+ 0x11, 0x10
+};
+
+static const ByteProvider kEoB2DscTileIndexAmigaProvider = { ARRAYSIZE(kEoB2DscTileIndexAmiga), kEoB2DscTileIndexAmiga };
+
+static const byte kEoB2DscDimData1Amiga[324] = {
+ 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7,
+ 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7,
+ 0xd8, 0xd7, 0xd8, 0xd8, 0x02, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xfe, 0xd7, 0xd8, 0xd8, 0xd8, 0xd7, 0x03,
+ 0xd8, 0xfd, 0xd8, 0xd8, 0xd8, 0xfe, 0xd8, 0x08,
+ 0xd8, 0xd8, 0xd8, 0xfe, 0xd7, 0x06, 0xd8, 0xd8,
+ 0xfa, 0x03, 0xd8, 0xfd, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xfa, 0xd7,
+ 0x10, 0xd8, 0xfd, 0xd7, 0x13, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xf2, 0xd8, 0x14, 0xd8, 0xd8,
+ 0xd8, 0xf0, 0xd7, 0x14, 0xd8, 0xed, 0x10, 0xd8,
+ 0xd8, 0x13, 0xd8, 0xd8, 0xd8, 0xd8, 0xec, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0x14, 0xd8, 0xed,
+ 0xd7, 0xd8, 0xd8, 0x13, 0xd7, 0xd7, 0xd7, 0xd7,
+ 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7,
+ 0xd7, 0xd7, 0xd7, 0xd7, 0xd8, 0xd7, 0xd7, 0xd7,
+ 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7,
+ 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd8, 0xd7,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0x06, 0xd8, 0xd8, 0xfa, 0x03, 0xd8, 0xfd,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xfa, 0xd8, 0x10, 0xd8, 0xfd, 0xd7,
+ 0x13, 0xfd, 0xd8, 0x13, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xf0, 0xd8, 0xd8,
+ 0xd8, 0xed, 0x10, 0xd8, 0xd8, 0x13, 0xd7, 0xd7,
+ 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7,
+ 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd8, 0xd7,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x03, 0xd8, 0xfd,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xfd, 0xd8,
+ 0x13, 0xfd, 0xd8, 0x13, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xed, 0xd8, 0xd8, 0xd8, 0x13, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8,
+ 0xd8, 0xd8, 0xd8, 0xd8
+};
+
+static const ByteProvider kEoB2DscDimData1AmigaProvider = { ARRAYSIZE(kEoB2DscDimData1Amiga), kEoB2DscDimData1Amiga };
+
+static const byte kEoB2DscDimData2Amiga[648] = {
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x02, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x04, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x03,
+ 0x00, 0x16, 0x03, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x02, 0x16, 0x00, 0x16, 0x00, 0x08,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02,
+ 0x16, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x08, 0x0e,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x06, 0x10,
+ 0x00, 0x13, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x0e, 0x16,
+ 0x00, 0x16, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x16, 0x00, 0x00, 0x14,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x14, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x12, 0x16, 0x14, 0x16, 0x00, 0x16, 0x13, 0x16,
+ 0x16, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16,
+ 0x06, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x06, 0x16, 0x00, 0x16,
+ 0x00, 0x10, 0x00, 0x16, 0x03, 0x16, 0x07, 0x0f,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x10, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x10, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00,
+ 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x03, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x03, 0x16, 0x00, 0x16,
+ 0x00, 0x13, 0x03, 0x16, 0x00, 0x16, 0x00, 0x13,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x13, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x13, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16
+};
+
+static const ByteProvider kEoB2DscDimData2AmigaProvider = { ARRAYSIZE(kEoB2DscDimData2Amiga), kEoB2DscDimData2Amiga };
+
+static const byte kEoB2DscBlockMapAmiga[12] = {
+ 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x03, 0x00,
+ 0x03, 0x00, 0x01, 0x02
+};
+
+static const ByteProvider kEoB2DscBlockMapAmigaProvider = { ARRAYSIZE(kEoB2DscBlockMapAmiga), kEoB2DscBlockMapAmiga };
+
+static const byte kEoB2DscDimMapAmiga[18] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
+ 0x03, 0x03
+};
+
+static const ByteProvider kEoB2DscDimMapAmigaProvider = { ARRAYSIZE(kEoB2DscDimMapAmiga), kEoB2DscDimMapAmiga };
+
+static const byte kEoB2DscBlockIndexAmiga[72] = {
+ 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xbe,
+ 0xbf, 0xc0, 0xc1, 0xc2, 0xdf, 0xe0, 0xe1, 0xff,
+ 0x00, 0x01, 0xa3, 0xc3, 0xe3, 0x03, 0x23, 0x43,
+ 0x63, 0xc2, 0xe2, 0x02, 0x22, 0x42, 0xe1, 0x01,
+ 0x21, 0xe0, 0x00, 0x20, 0x63, 0x62, 0x61, 0x60,
+ 0x5f, 0x5e, 0x5d, 0x42, 0x41, 0x40, 0x3f, 0x3e,
+ 0x21, 0x20, 0x1f, 0x01, 0x00, 0xff, 0x5d, 0x3d,
+ 0x1d, 0xfd, 0xdd, 0xbd, 0x9d, 0x3e, 0x1e, 0xfe,
+ 0xde, 0xbe, 0x1f, 0xff, 0xdf, 0x20, 0x00, 0xe0
+};
+
+static const ByteProvider kEoB2DscBlockIndexAmigaProvider = { ARRAYSIZE(kEoB2DscBlockIndexAmiga), kEoB2DscBlockIndexAmiga };
+
+static const char *const kEoB2SoundMapAmiga[120] = {
+ "",
+ "button",
+ "",
+ "door",
+ "door",
+ "slam",
+ "button",
+ "button",
+ "",
+ "eat",
+ "magica",
+ "throw",
+ "plate",
+ "passage",
+ "unlock",
+ "teleport",
+ "undead",
+ "pit",
+ "itemland",
+ "",
+ "",
+ "playhit",
+ "death",
+ "text",
+ "electric",
+ "transmute",
+ "dart",
+ "",
+ "",
+ "bump",
+ "",
+ "electric",
+ "playswing",
+ "",
+ "panel",
+ "explode",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "magicb",
+ "magicb",
+ "magicb",
+ "magicb",
+ "magicb",
+ "magicb",
+ "magicb",
+ "magicb",
+ "button",
+ "",
+ "drop",
+ "text",
+ "magicb",
+ "lock",
+ "",
+ "magicb",
+ "magicb",
+ "Missile",
+ "",
+ "burnhands",
+ "electric",
+ "fireball",
+ "",
+ "magica",
+ "magica",
+ "magica",
+ "magicb",
+ "magicb",
+ "acid",
+ "magicb",
+ "fireball",
+ "acid",
+ "magica",
+ "magicb",
+ "magicb",
+ "undead",
+ "magica",
+ "magica",
+ "magica",
+ "magicb",
+ "cause",
+ "magicb",
+ "magicb",
+ "magica",
+ "magicb",
+ "magica",
+ "magica",
+ "magica",
+ "magica",
+ "cause",
+ "fireball",
+ "magica"
+};
+
+static const StringListProvider kEoB2SoundMapAmigaProvider = { ARRAYSIZE(kEoB2SoundMapAmiga), kEoB2SoundMapAmiga };
+
+static const char *const kEoB2SoundMapExtraAmiga[63] = {
+ "",
+ "2Guards",
+ "Calandra",
+ "Dream",
+ "Dwarf",
+ "GrdInsal",
+ "Insal",
+ "x",
+ "Kheban",
+ "",
+ "OldLady",
+ "MagicMth",
+ "Castle1",
+ "BdrTrick",
+ "",
+ "2Cleric",
+ "Calandra",
+ "1Cleric",
+ "MagicMth",
+ "MagicMth",
+ "2Clerics",
+ "4WindDr",
+ "x",
+ "BloodDr",
+ "",
+ "Beholder",
+ "BdrTrick",
+ "MagicMth",
+ "DranSilv",
+ "MagicMth",
+ "1Cleric",
+ "Mantis2",
+ "Priest",
+ "Kheban",
+ "Tanglor1",
+ "Tanglor2",
+ "",
+ "MagicMth",
+ "MagicMth",
+ "Dran1Azr",
+ "x",
+ "x",
+ "FrostGt",
+ "FrostDed",
+ "Dran2Azr",
+ "Dran3Azr",
+ "BdrTrick",
+ "x",
+ "MagicMth",
+ "",
+ "Dran1Crm",
+ "Dran2Crm",
+ "Dran3Crm",
+ "Dran4Crm",
+ "DranDrag",
+ "EndTheme",
+ "DyingMan",
+ "Insal",
+ "Ojel",
+ "StoneGt",
+ "Implode",
+ "x",
+ ""
+};
+
+static const StringListProvider kEoB2SoundMapExtraAmigaProvider = { ARRAYSIZE(kEoB2SoundMapExtraAmiga), kEoB2SoundMapExtraAmiga };
+
+static const byte kEoB2SoundIndex1Amiga[98] = {
+ 0xff, 0x01, 0xfd, 0x07, 0xfd, 0x04, 0xfe, 0x0a,
+ 0xfe, 0xff, 0x01, 0xfd, 0x07, 0x08, 0xff, 0x03,
+ 0x05, 0x09, 0x0b, 0x04, 0xfe, 0x0a, 0xfe, 0xff,
+ 0x00, 0xfd, 0x0c, 0xfd, 0xff, 0x01, 0xfd, 0x0d,
+ 0xfd, 0xff, 0x01, 0xfd, 0x08, 0xfd, 0xff, 0x06,
+ 0xfe, 0x07, 0xfe, 0x05, 0xfe, 0x0e, 0xfe, 0xff,
+ 0x05, 0xfe, 0x0f, 0xfe, 0xff, 0xfe, 0xfe, 0x0d,
+ 0xfe, 0xff, 0xff, 0x00, 0xfd, 0x0d, 0x0c, 0x00,
+ 0xfe, 0x0b, 0xfe, 0xff, 0x00, 0xfe, 0x0b, 0xfe,
+ 0xff, 0xfe, 0x01, 0x0b, 0x0d, 0xff, 0x02, 0xfd,
+ 0x10, 0xfd, 0xff, 0x00, 0x01, 0x11, 0xfe, 0xff,
+ 0x00, 0x01, 0x0e, 0x12, 0x02, 0x01, 0x11, 0xfe,
+ 0xff, 0x00
+};
+
+static const ByteProvider kEoB2SoundIndex1AmigaProvider = { ARRAYSIZE(kEoB2SoundIndex1Amiga), kEoB2SoundIndex1Amiga };
+
+static const byte kEoB2SoundIndex2Amiga[17] = {
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x03,
+ 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05,
+ 0x05
+};
+
+static const ByteProvider kEoB2SoundIndex2AmigaProvider = { ARRAYSIZE(kEoB2SoundIndex2Amiga), kEoB2SoundIndex2Amiga };
+
+static const char *const kEoB2SoundFilesIngame2Amiga[6] = {
+ "DUNG.OUT",
+ "FOREST.OUT",
+ "MEZZ.OUT",
+ "SILVER.OUT",
+ "AZURE.OUT",
+ "CRIMSON.OUT"
+};
+
+static const StringListProvider kEoB2SoundFilesIngame2AmigaProvider = { ARRAYSIZE(kEoB2SoundFilesIngame2Amiga), kEoB2SoundFilesIngame2Amiga };
+
+static const char *const kEoB2LevelSoundFiles1Amiga[19] = {
+ "Move",
+ "Move2",
+ "Move3",
+ "LeechMov",
+ "SpiderMov",
+ "Flap",
+ "MantisMov",
+ "Blade",
+ "FlindAtk",
+ "Rustatk",
+ "SloshSuck",
+ "Claw",
+ "BeastAtk",
+ "Magick",
+ "Spear",
+ "Growl",
+ "Punch",
+ "HoundAtk",
+ "FlayerAtk"
+};
+
+static const StringListProvider kEoB2LevelSoundFiles1AmigaProvider = { ARRAYSIZE(kEoB2LevelSoundFiles1Amiga), kEoB2LevelSoundFiles1Amiga };
+
+static const char *const kEoB2LevelSoundFiles2Amiga[19] = {
+ "Walk1m",
+ "Walk2m",
+ "Walk3m",
+ "Leechm",
+ "Spiderm",
+ "Flapm",
+ "Mantism",
+ "Blade",
+ "Flind",
+ "Rust",
+ "Slosh",
+ "Claw",
+ "Beast",
+ "Magick",
+ "Spear",
+ "Growl",
+ "Punch",
+ "Hound",
+ "Flayer"
+};
+
+static const StringListProvider kEoB2LevelSoundFiles2AmigaProvider = { ARRAYSIZE(kEoB2LevelSoundFiles2Amiga), kEoB2LevelSoundFiles2Amiga };
+
+static const char *const kEoB2SoundFilesIntroAmiga[10] = {
+ "TELEPORT.CPS",
+ "BIGPIPE3A.CPS",
+ "PANFLUTE5.CPS",
+ "OUTTAKES1.CPS",
+ "OUTTAKES2.CPS",
+ "FIN.SAM",
+ "INTRO.SAM",
+ "FLUTE3C.CPS",
+ "CHARGEN2.CPS",
+ "CHARGEN3.CPS"
+};
+
+static const StringListProvider kEoB2SoundFilesIntroAmigaProvider = { ARRAYSIZE(kEoB2SoundFilesIntroAmiga), kEoB2SoundFilesIntroAmiga };
+
+static const char *const kEoB2SoundFilesIngameAmiga[7] = {
+ "OUTTAKES1.CPS",
+ "OUTTAKES2.CPS",
+ "SFX1.CPS",
+ "SFX2.CPS",
+ "SFX3.CPS",
+ "SFX4.CPS",
+ "OUTTAKES3.CPS"
+};
+
+static const StringListProvider kEoB2SoundFilesIngameAmigaProvider = { ARRAYSIZE(kEoB2SoundFilesIngameAmiga), kEoB2SoundFilesIngameAmiga };
+
+static const char *const kEoB2SoundFilesFinaleAmiga[5] = {
+ "BIGPIPE3A.CPS",
+ "OUTTAKES1.CPS",
+ "OUTTAKES2.CPS",
+ "FIN.SAM",
+ "FINALE.SAM"
+};
+
+static const StringListProvider kEoB2SoundFilesFinaleAmigaProvider = { ARRAYSIZE(kEoB2SoundFilesFinaleAmiga), kEoB2SoundFilesFinaleAmiga };
+
+static const byte kEoB2MonsterSoundPatchDataAmiga[60] = {
+ 0x61, 0x27, 0x24, 0x22, 0x27, 0x25, 0x32, 0x27, 0x25,
+ 0x87, 0x27, 0x25, 0xa7, 0x27, 0x25, 0x97, 0x27, 0x25,
+ 0xb7, 0x27, 0x25, 0x08, 0x27, 0x25, 0x28, 0x27, 0x25,
+ 0x48, 0x27, 0x25, 0x68, 0x27, 0x25, 0x0a, 0x27, 0x25,
+ 0x1a, 0x27, 0x25, 0x0c, 0x27, 0x25, 0x4e, 0x27, 0x25,
+ 0x6e, 0x27, 0x25, 0x8e, 0x27, 0x25, 0xae, 0x27, 0x25,
+ 0x0f, 0x27, 0x25, 0x1f, 0x27, 0x25
+};
+
+static const ByteProvider kEoB2MonsterSoundPatchDataAmigaProvider = { ARRAYSIZE(kEoB2MonsterSoundPatchDataAmiga), kEoB2MonsterSoundPatchDataAmiga };
diff --git a/devtools/create_kyradat/resources/eob2_amiga_english.h b/devtools/create_kyradat/resources/eob2_amiga_english.h
new file mode 100644
index 0000000..12c6e61
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob2_amiga_english.h
@@ -0,0 +1,1055 @@
+static const char *const kEoB2ChargenStrings1AmigaEnglish[9] = {
+ "Your party is\rcomplete. Select\rthe PLAY button\ror press 'P' to\rstart the game.",
+ " ",
+ "AC\rHP\rLVL",
+ "%s\r%d\r%d\r%d\r%d\r%d",
+ "%d\r%d",
+ "%d",
+ "%d/%d",
+ "%d/%d/%d",
+ "Select the box of\rthe character you\rwish to create or\rview."
+};
+
+static const StringListProvider kEoB2ChargenStrings1AmigaEnglishProvider = { ARRAYSIZE(kEoB2ChargenStrings1AmigaEnglish), kEoB2ChargenStrings1AmigaEnglish };
+
+static const char *const kEoB2ChargenStrings2AmigaEnglish[12] = {
+ "%s",
+ "%d",
+ "%s",
+ "%d",
+ "%d",
+ "%d",
+ "%s",
+ "%d",
+ "SELECT RACE:",
+ "SELECT CLASS:",
+ "SELECT ALIGNMENT:",
+ "Name:"
+};
+
+static const StringListProvider kEoB2ChargenStrings2AmigaEnglishProvider = { ARRAYSIZE(kEoB2ChargenStrings2AmigaEnglish), kEoB2ChargenStrings2AmigaEnglish };
+
+static const char *const kEoB2ChargenStatStringsAmigaEnglish[12] = {
+ "STR",
+ "INT",
+ "WIS",
+ "DEX",
+ "CON",
+ "CHA",
+ "STRENGTH",
+ "INTELLIGENCE",
+ "WISDOM",
+ "DEXTERITY",
+ "CONSTITUTION",
+ "CHARISMA"
+};
+
+static const StringListProvider kEoB2ChargenStatStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ChargenStatStringsAmigaEnglish), kEoB2ChargenStatStringsAmigaEnglish };
+
+static const char *const kEoB2ChargenRaceSexStringsAmigaEnglish[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 kEoB2ChargenRaceSexStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ChargenRaceSexStringsAmigaEnglish), kEoB2ChargenRaceSexStringsAmigaEnglish };
+
+static const char *const kEoB2ChargenClassStringsAmigaEnglish[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 kEoB2ChargenClassStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ChargenClassStringsAmigaEnglish), kEoB2ChargenClassStringsAmigaEnglish };
+
+static const char *const kEoB2ChargenAlignmentStringsAmigaEnglish[9] = {
+ "LAWFUL GOOD",
+ "NEUTRAL GOOD",
+ "CHAOTIC GOOD",
+ "LAWFUL NEUTRAL",
+ "TRUE NEUTRAL",
+ "CHAOTIC NEUTRAL",
+ "LAWFUL EVIL",
+ "NEUTRAL EVIL",
+ "CHAOTIC EVIL"
+};
+
+static const StringListProvider kEoB2ChargenAlignmentStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ChargenAlignmentStringsAmigaEnglish), kEoB2ChargenAlignmentStringsAmigaEnglish };
+
+static const char *const kEoB2ChargenEnterGameStringsAmigaEnglish[1] = {
+ " Entering game.\r Please wait."
+};
+
+static const StringListProvider kEoB2ChargenEnterGameStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ChargenEnterGameStringsAmigaEnglish), kEoB2ChargenEnterGameStringsAmigaEnglish };
+
+static const char *const kEoB2PryDoorStringsAmigaEnglish[8] = {
+ "\r",
+ "You are not capable of forcing the door.\r",
+ "\x06\x04""You force the door.\r",
+ "\x06\x06""You try to force the door but fail.\r",
+ "You can't put that item there.\r",
+ "The item is too large to fit.\r",
+ "No one is able to pry this door open.\r",
+ "\r"
+};
+
+static const StringListProvider kEoB2PryDoorStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2PryDoorStringsAmigaEnglish), kEoB2PryDoorStringsAmigaEnglish };
+
+static const char *const kEoB2WarningStringsAmigaEnglish[4] = {
+ "You can't go that way.\r",
+ "%s isn't capable of eating food!\r",
+ "That food is rotten! You don't want to eat that!\r",
+ "You may only eat food!\r"
+};
+
+static const StringListProvider kEoB2WarningStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2WarningStringsAmigaEnglish), kEoB2WarningStringsAmigaEnglish };
+
+static const char *const kEoB2ItemSuffixStringsRingsAmigaEnglish[4] = {
+ "Adornment",
+ "Wizardry",
+ "Sustenance",
+ "Feather Fall"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsRingsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsRingsAmigaEnglish), kEoB2ItemSuffixStringsRingsAmigaEnglish };
+
+static const char *const kEoB2ItemSuffixStringsPotionsAmigaEnglish[8] = {
+ "Giant Strength",
+ "Healing",
+ "Extra Healing",
+ "Poison",
+ "Vitality",
+ "Speed",
+ "Invisibility",
+ "Cure Poison"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsPotionsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsPotionsAmigaEnglish), kEoB2ItemSuffixStringsPotionsAmigaEnglish };
+
+static const char *const kEoB2ItemSuffixStringsWandsAmigaEnglish[8] = {
+ "Stick",
+ "Lightning",
+ "Frost",
+ "Curing",
+ "Fireball",
+ "Starfire",
+ "Magic Missile",
+ "Dispel Magic"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsWandsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsWandsAmigaEnglish), kEoB2ItemSuffixStringsWandsAmigaEnglish };
+
+static const char *const kEoB2RipItemStringsAmigaEnglish[3] = {
+ "%s has lost her ",
+ "%s has lost his ",
+ ".\r"
+};
+
+static const StringListProvider kEoB2RipItemStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2RipItemStringsAmigaEnglish), kEoB2RipItemStringsAmigaEnglish };
+
+static const char *const kEoB2CursedStringAmigaEnglish[1] = {
+ "%d Cursed %s"
+};
+
+static const StringListProvider kEoB2CursedStringAmigaEnglishProvider = { ARRAYSIZE(kEoB2CursedStringAmigaEnglish), kEoB2CursedStringAmigaEnglish };
+
+static const char *const kEoB2MagicObjectStringsAmigaEnglish[5] = {
+ "Mage Scroll",
+ "Cleric Scroll",
+ "Ring",
+ "Potion",
+ "Wand"
+};
+
+static const StringListProvider kEoB2MagicObjectStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicObjectStringsAmigaEnglish), kEoB2MagicObjectStringsAmigaEnglish };
+
+static const char *const kEoB2MagicObjectString5AmigaEnglish[1] = {
+ "Stick"
+};
+
+static const StringListProvider kEoB2MagicObjectString5AmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicObjectString5AmigaEnglish), kEoB2MagicObjectString5AmigaEnglish };
+
+static const char *const kEoB2PatternSuffixAmigaEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB2PatternSuffixAmigaEnglishProvider = { ARRAYSIZE(kEoB2PatternSuffixAmigaEnglish), kEoB2PatternSuffixAmigaEnglish };
+
+static const char *const kEoB2PatternGrFix1AmigaEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB2PatternGrFix1AmigaEnglishProvider = { ARRAYSIZE(kEoB2PatternGrFix1AmigaEnglish), kEoB2PatternGrFix1AmigaEnglish };
+
+static const char *const kEoB2PatternGrFix2AmigaEnglish[1] = {
+ "%s of %s"
+};
+
+static const StringListProvider kEoB2PatternGrFix2AmigaEnglishProvider = { ARRAYSIZE(kEoB2PatternGrFix2AmigaEnglish), kEoB2PatternGrFix2AmigaEnglish };
+
+static const char *const kEoB2ValidateArmorStringAmigaEnglish[1] = {
+ "%s can't wear that type of armor.\r"
+};
+
+static const StringListProvider kEoB2ValidateArmorStringAmigaEnglishProvider = { ARRAYSIZE(kEoB2ValidateArmorStringAmigaEnglish), kEoB2ValidateArmorStringAmigaEnglish };
+
+static const char *const kEoB2ValidateCursedStringAmigaEnglish[1] = {
+ "%s cannot release the weapon! It is cursed!\r"
+};
+
+static const StringListProvider kEoB2ValidateCursedStringAmigaEnglishProvider = { ARRAYSIZE(kEoB2ValidateCursedStringAmigaEnglish), kEoB2ValidateCursedStringAmigaEnglish };
+
+static const char *const kEoB2ValidateNoDropStringAmigaEnglish[1] = {
+ "You can't put that item there.\r"
+};
+
+static const StringListProvider kEoB2ValidateNoDropStringAmigaEnglishProvider = { ARRAYSIZE(kEoB2ValidateNoDropStringAmigaEnglish), kEoB2ValidateNoDropStringAmigaEnglish };
+
+static const char *const kEoB2PotionStringsAmigaEnglish[2] = {
+ "poisoned",
+ "%s feels %s!\r"
+};
+
+static const StringListProvider kEoB2PotionStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2PotionStringsAmigaEnglish), kEoB2PotionStringsAmigaEnglish };
+
+static const char *const kEoB2WandStringsAmigaEnglish[1] = {
+ "The wand has no apparent magical effect\r"
+};
+
+static const StringListProvider kEoB2WandStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2WandStringsAmigaEnglish), kEoB2WandStringsAmigaEnglish };
+
+static const char *const kEoB2ItemMisuseStringsAmigaEnglish[3] = {
+ "%s can not use this item.\r",
+ "This item automatically used when worn.\r",
+ "This item is not used in this way.\r"
+};
+
+static const StringListProvider kEoB2ItemMisuseStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2ItemMisuseStringsAmigaEnglish), kEoB2ItemMisuseStringsAmigaEnglish };
+
+static const char *const kEoB2TakenStringsAmigaEnglish[1] = {
+ " taken.\r"
+};
+
+static const StringListProvider kEoB2TakenStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2TakenStringsAmigaEnglish), kEoB2TakenStringsAmigaEnglish };
+
+static const char *const kEoB2PotionEffectStringsAmigaEnglish[8] = {
+ "much stronger",
+ "better",
+ "much better",
+ "ill for a moment",
+ "satiated",
+ "fast and agile",
+ "transparent",
+ "better"
+};
+
+static const StringListProvider kEoB2PotionEffectStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2PotionEffectStringsAmigaEnglish), kEoB2PotionEffectStringsAmigaEnglish };
+
+static const char *const kEoB2YesNoStringsAmigaEnglish[2] = {
+ "yes",
+ "no"
+};
+
+static const StringListProvider kEoB2YesNoStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2YesNoStringsAmigaEnglish), kEoB2YesNoStringsAmigaEnglish };
+
+static const char *const kEoB2MoreStringsAmigaEnglish[1] = {
+ "MORE"
+};
+
+static const StringListProvider kEoB2MoreStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MoreStringsAmigaEnglish), kEoB2MoreStringsAmigaEnglish };
+
+static const char *const kEoB2NpcMaxStringsAmigaEnglish[1] = {
+ "You may only have six characters in your party. Select the one you wish to drop."
+};
+
+static const StringListProvider kEoB2NpcMaxStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2NpcMaxStringsAmigaEnglish), kEoB2NpcMaxStringsAmigaEnglish };
+
+static const char *const kEoB2OkStringsAmigaEnglish[1] = {
+ "OK"
+};
+
+static const StringListProvider kEoB2OkStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2OkStringsAmigaEnglish), kEoB2OkStringsAmigaEnglish };
+
+static const char *const kEoB2NpcJoinStringsAmigaEnglish[1] = {
+ "%s joins the party.\r"
+};
+
+static const StringListProvider kEoB2NpcJoinStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2NpcJoinStringsAmigaEnglish), kEoB2NpcJoinStringsAmigaEnglish };
+
+static const char *const kEoB2CancelStringsAmigaEnglish[1] = {
+ "CANCEL"
+};
+
+static const StringListProvider kEoB2CancelStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2CancelStringsAmigaEnglish), kEoB2CancelStringsAmigaEnglish };
+
+static const char *const kEoB2AbortStringsAmigaEnglish[1] = {
+ "ABORT"
+};
+
+static const StringListProvider kEoB2AbortStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2AbortStringsAmigaEnglish), kEoB2AbortStringsAmigaEnglish };
+
+static const char *const kEoB2MenuStringsMainAmigaEnglish[8] = {
+ "Select Option:",
+ "Rest Party",
+ "Memorize Spells",
+ "Pray for Spells",
+ "Scribe Scrolls",
+ "Preferences",
+ "Game Options",
+ "Exit"
+};
+
+static const StringListProvider kEoB2MenuStringsMainAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsMainAmigaEnglish), kEoB2MenuStringsMainAmigaEnglish };
+
+static const char *const kEoB2MenuStringsSaveLoadAmigaEnglish[8] = {
+ "Load Game",
+ "Save Game",
+ "Drop Character",
+ "Quit Game",
+ "Game Options:",
+ "\r Game saved.",
+ "Attempts to save\ryour game have\rfailed!",
+ "Cannot load your\rsave game. The\rfile may be corrupt!"
+};
+
+static const StringListProvider kEoB2MenuStringsSaveLoadAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsSaveLoadAmigaEnglish), kEoB2MenuStringsSaveLoadAmigaEnglish };
+
+static const char *const kEoB2MenuStringsOnOffAmigaEnglish[2] = {
+ "ON",
+ "OFF"
+};
+
+static const StringListProvider kEoB2MenuStringsOnOffAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsOnOffAmigaEnglish), kEoB2MenuStringsOnOffAmigaEnglish };
+
+static const char *const kEoB2MenuStringsSpellsAmigaEnglish[17] = {
+ "\r\r Select a character\r from your party who\r would like to learn\r spells.",
+ "\r Your Paladin is \r too low a level\r for spells.",
+ "\r\r The Mage has no\r Spell Book!",
+ "\r\r\r Select a character\r from your party\r who would like to\r pray for spells.",
+ "\r No party members\r are capable of\r praying for new\r spells.",
+ "\r No party members\r are capable of\r memorizing new\r spells.",
+ " An unconscious\r or dead Mage\r cannot memorize\r spells.",
+ " An unconscious\r or dead Cleric\r cannot pray for\r spells.",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "Clear",
+ "Spells Available:",
+ "Yes",
+ "No"
+};
+
+static const StringListProvider kEoB2MenuStringsSpellsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsSpellsAmigaEnglish), kEoB2MenuStringsSpellsAmigaEnglish };
+
+static const char *const kEoB2MenuStringsRestAmigaEnglish[5] = {
+ "\rWill your healers\rheal the party?",
+ " Someone is still\r injured. Rest\r until healed?",
+ "Resting party.",
+ "\r All characters\r are fully\r rested.",
+ " Your party needs\r to rest to gain\r spells."
+};
+
+static const StringListProvider kEoB2MenuStringsRestAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsRestAmigaEnglish), kEoB2MenuStringsRestAmigaEnglish };
+
+static const char *const kEoB2MenuStringsDropAmigaEnglish[1] = {
+ " You cannot have\r less than four\r characters."
+};
+
+static const StringListProvider kEoB2MenuStringsDropAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsDropAmigaEnglish), kEoB2MenuStringsDropAmigaEnglish };
+
+static const char *const kEoB2MenuStringsExitAmigaEnglish[1] = {
+ " Are you sure you\r wish to exit the\r game?"
+};
+
+static const StringListProvider kEoB2MenuStringsExitAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsExitAmigaEnglish), kEoB2MenuStringsExitAmigaEnglish };
+
+static const char *const kEoB2MenuStringsStarveAmigaEnglish[1] = {
+ " Your party is\r starving. Do you\r wish to continue\r resting?"
+};
+
+static const StringListProvider kEoB2MenuStringsStarveAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsStarveAmigaEnglish), kEoB2MenuStringsStarveAmigaEnglish };
+
+static const char *const kEoB2MenuStringsScribeAmigaEnglish[5] = {
+ "Select the scroll(s)\ryou wish to scribe.",
+ "\r\r\r Select a Mage\r from your party\r who would like to\r scribe spells.",
+ " You don't have\r any scolls to be\r scribed.",
+ " You don't have\r any scrolls that\r this Mage needs.",
+ "\r You don't have\r any Mage able to\r scribe scrolls."
+};
+
+static const StringListProvider kEoB2MenuStringsScribeAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsScribeAmigaEnglish), kEoB2MenuStringsScribeAmigaEnglish };
+
+static const char *const kEoB2MenuStringsDrop2AmigaEnglish[3] = {
+ " Select the\r character you\r wish to drop.",
+ " You must specify\r a name for your\r save game!",
+ " Are you sure you\r wish to replace\r your saved game?"
+};
+
+static const StringListProvider kEoB2MenuStringsDrop2AmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsDrop2AmigaEnglish), kEoB2MenuStringsDrop2AmigaEnglish };
+
+static const char *const kEoB2MenuStringsHeadAmigaEnglish[3] = {
+ "Camp:",
+ "Preferences:",
+ "Game Options:"
+};
+
+static const StringListProvider kEoB2MenuStringsHeadAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsHeadAmigaEnglish), kEoB2MenuStringsHeadAmigaEnglish };
+
+static const char *const kEoB2MenuStringsPoisonAmigaEnglish[1] = {
+ "Poisoned party\rmembers may die!\rRest anyway?"
+};
+
+static const StringListProvider kEoB2MenuStringsPoisonAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsPoisonAmigaEnglish), kEoB2MenuStringsPoisonAmigaEnglish };
+
+static const char *const kEoB2MenuStringsMgcAmigaEnglish[2] = {
+ "%-18s %1d",
+ "%d of %d Remaining. "
+};
+
+static const StringListProvider kEoB2MenuStringsMgcAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsMgcAmigaEnglish), kEoB2MenuStringsMgcAmigaEnglish };
+
+static const char *const kEoB2MenuStringsPrefsAmigaEnglish[4] = {
+ "Tunes are %-3s",
+ "Sounds are %-3s",
+ "Bar Graphs are %-3s",
+ ""
+};
+
+static const StringListProvider kEoB2MenuStringsPrefsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsPrefsAmigaEnglish), kEoB2MenuStringsPrefsAmigaEnglish };
+
+static const char *const kEoB2MenuStringsRest2AmigaEnglish[5] = {
+ "%s gained %s.\r",
+ "%s memorized %s.\r",
+ "%s casts healing on %s.\r",
+ "Hours rested: %-4d",
+ "\r%s\r"
+};
+
+static const StringListProvider kEoB2MenuStringsRest2AmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsRest2AmigaEnglish), kEoB2MenuStringsRest2AmigaEnglish };
+
+static const char *const kEoB2MenuStringsRest3AmigaEnglish[1] = {
+ "\x06\x06""You do not feel it is safe to rest here."
+};
+
+static const StringListProvider kEoB2MenuStringsRest3AmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsRest3AmigaEnglish), kEoB2MenuStringsRest3AmigaEnglish };
+
+static const char *const kEoB2MenuStringsRest4AmigaEnglish[1] = {
+ "\x06\x06""You can't rest here, monsters are near."
+};
+
+static const StringListProvider kEoB2MenuStringsRest4AmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsRest4AmigaEnglish), kEoB2MenuStringsRest4AmigaEnglish };
+
+static const char *const kEoB2MenuStringsDefeatAmigaEnglish[1] = {
+ "\rYour entire party\rhas been defeated!\rWould you like to\rload a previously\rsaved game?"
+};
+
+static const StringListProvider kEoB2MenuStringsDefeatAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsDefeatAmigaEnglish), kEoB2MenuStringsDefeatAmigaEnglish };
+
+static const char *const kEoB2MenuStringsTransferAmigaEnglish[5] = {
+ "You must transfer\rfour party members\rbefore you may play!",
+ "You may only transfer\rfour party members to\rEOB II!",
+ "Items which are not\ruseful or unbalance\rthe game will be\rdeleted.",
+ " \r You do not have\r a mage in your\r party.",
+ " \r You do not have\r a cleric or\r paladin in your\r party."
+};
+
+static const StringListProvider kEoB2MenuStringsTransferAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsTransferAmigaEnglish), kEoB2MenuStringsTransferAmigaEnglish };
+
+static const char *const kEoB2MenuStringsSpecAmigaEnglish[2] = {
+ "As you awaken, you\rdiscover that Insal\rthe thief is gone!",
+ "A quick inventory\rreveals equipment\rhas been stolen!"
+};
+
+static const StringListProvider kEoB2MenuStringsSpecAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuStringsSpecAmigaEnglish), kEoB2MenuStringsSpecAmigaEnglish };
+
+static const char *const kEoB2MenuYesNoStringsAmigaEnglish[2] = {
+ "Yes",
+ "No"
+};
+
+static const StringListProvider kEoB2MenuYesNoStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MenuYesNoStringsAmigaEnglish), kEoB2MenuYesNoStringsAmigaEnglish };
+
+static const char *const kEoB2CharGuiStringsHpAmigaEnglish[2] = {
+ "HP",
+ "%3d of %-3d"
+};
+
+static const StringListProvider kEoB2CharGuiStringsHpAmigaEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsHpAmigaEnglish), kEoB2CharGuiStringsHpAmigaEnglish };
+
+static const char *const kEoB2CharGuiStringsWp2AmigaEnglish[3] = {
+ "MISS",
+ "HACK",
+ "BASH"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWp2AmigaEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsWp2AmigaEnglish), kEoB2CharGuiStringsWp2AmigaEnglish };
+
+static const char *const kEoB2CharGuiStringsWrAmigaEnglish[4] = {
+ "CAN'T",
+ "REACH",
+ "NO",
+ "AMMO"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWrAmigaEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsWrAmigaEnglish), kEoB2CharGuiStringsWrAmigaEnglish };
+
+static const char *const kEoB2CharGuiStringsSt2AmigaEnglish[7] = {
+ "Swapping",
+ "DEAD",
+ "UNCONSCIOUS",
+ "POISON (SLOW)",
+ "POISONED",
+ "PARALYZED",
+ "PETRIFIED"
+};
+
+static const StringListProvider kEoB2CharGuiStringsSt2AmigaEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsSt2AmigaEnglish), kEoB2CharGuiStringsSt2AmigaEnglish };
+
+static const char *const kEoB2CharGuiStringsInAmigaEnglish[4] = {
+ "CHARACTER INFO",
+ "ARMOR CLASS",
+ "EXP",
+ "LVL"
+};
+
+static const StringListProvider kEoB2CharGuiStringsInAmigaEnglishProvider = { ARRAYSIZE(kEoB2CharGuiStringsInAmigaEnglish), kEoB2CharGuiStringsInAmigaEnglish };
+
+static const char *const kEoB2CharStatusStrings7AmigaEnglish[1] = {
+ "%s no longer has giant strength.\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings7AmigaEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings7AmigaEnglish), kEoB2CharStatusStrings7AmigaEnglish };
+
+static const char *const kEoB2CharStatusStrings82AmigaEnglish[1] = {
+ "\x06\x06""%s feels the effects of poison!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings82AmigaEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings82AmigaEnglish), kEoB2CharStatusStrings82AmigaEnglish };
+
+static const char *const kEoB2CharStatusStrings9AmigaEnglish[1] = {
+ "\x06\x04""%s is no longer paralyzed!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings9AmigaEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings9AmigaEnglish), kEoB2CharStatusStrings9AmigaEnglish };
+
+static const char *const kEoB2CharStatusStrings12AmigaEnglish[1] = {
+ "%s slows down.\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings12AmigaEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings12AmigaEnglish), kEoB2CharStatusStrings12AmigaEnglish };
+
+static const char *const kEoB2CharStatusStrings132AmigaEnglish[1] = {
+ "\x06\x06""%s is %s!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings132AmigaEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings132AmigaEnglish), kEoB2CharStatusStrings132AmigaEnglish };
+
+static const char *const kEoB2LevelGainStringsAmigaEnglish[1] = {
+ "\x06\x01""%s has gained a level.""\x06\x0f""\r"
+};
+
+static const StringListProvider kEoB2LevelGainStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2LevelGainStringsAmigaEnglish), kEoB2LevelGainStringsAmigaEnglish };
+
+static const char *const kEoB2BookNumbersAmigaEnglish[5] = {
+ "First",
+ "Second",
+ "Third",
+ "Fourth",
+ "Fifth"
+};
+
+static const StringListProvider kEoB2BookNumbersAmigaEnglishProvider = { ARRAYSIZE(kEoB2BookNumbersAmigaEnglish), kEoB2BookNumbersAmigaEnglish };
+
+static const char *const kEoB2MageSpellsListAmigaEnglish[33] = {
+ "",
+ "Armor",
+ "Burning Hands",
+ "Detect Magic",
+ "Magic Missile",
+ "Shield",
+ "Shocking Grasp",
+ "Blur",
+ "Detect Invisible",
+ "Imp Identify",
+ "Invisibility",
+ "M's Acid Arrow",
+ "Dispel Magic",
+ "Fireball",
+ "Haste",
+ "Hold Person",
+ "Invisibility 10'",
+ "Lightning Bolt",
+ "Vampiric Touch",
+ "Fear",
+ "Ice Storm",
+ "Imp Invisibility",
+ "Remove Curse",
+ "Cone of Cold",
+ "Hold Monster",
+ "Wall of Force",
+ "Disintegrate",
+ "Flesh to Stone",
+ "Stone to Flesh",
+ "True Seeing",
+ "Finger of Death",
+ "Power Word Stun",
+ "Bigby's Fist"
+};
+
+static const StringListProvider kEoB2MageSpellsListAmigaEnglishProvider = { ARRAYSIZE(kEoB2MageSpellsListAmigaEnglish), kEoB2MageSpellsListAmigaEnglish };
+
+static const char *const kEoB2ClericSpellsListAmigaEnglish[30] = {
+ "",
+ "Bless",
+ "Cause Light Wnds",
+ "Cure Light Wnds",
+ "Detect Magic",
+ "Protect-Evil",
+ "Aid",
+ "Flame Blade",
+ "Hold Person",
+ "Slow Poison",
+ "Create Food",
+ "Dispel Magic",
+ "Magical Vestment",
+ "Prayer",
+ "Remove Paralysis",
+ "Cause Serious",
+ "Cure Serious",
+ "Neutral-Poison",
+ "Protect-Evil 10'",
+ "Cause Critical",
+ "Cure Critical",
+ "Flame Strike",
+ "Raise Dead",
+ "Slay Living",
+ "True Seeing",
+ "Harm",
+ "Heal",
+ "Ressurection",
+ "Lay on Hands",
+ "Turn undead"
+};
+
+static const StringListProvider kEoB2ClericSpellsListAmigaEnglishProvider = { ARRAYSIZE(kEoB2ClericSpellsListAmigaEnglish), kEoB2ClericSpellsListAmigaEnglish };
+
+static const char *const kEoB2SpellNamesAmigaEnglish[68] = {
+ "armor",
+ "burning hands",
+ "detect magic",
+ "magic missile",
+ "shield",
+ "shocking grasp",
+ "blur",
+ "detect invisibility",
+ "improved identify",
+ "invisibility",
+ "melf's acid arrow",
+ "dispel magic",
+ "fireball",
+ "haste",
+ "Hold Person",
+ "invisibility 10' radius",
+ "lightning bolt",
+ "vampiric touch",
+ "fear",
+ "ice storm",
+ "improved invisibility",
+ "remove curse",
+ "cone of cold",
+ "hold monster",
+ "wall of force",
+ "disintegrate",
+ "flesh to stone",
+ "stone to flesh",
+ "true seeing",
+ "finger of death",
+ "power word stun",
+ "bigby's clenched fist",
+ "bless",
+ "cause light wounds",
+ "cure light wounds",
+ "detect magic",
+ "protection from evil",
+ "aid",
+ "flame blade",
+ "hold person",
+ "slow poison",
+ "create food",
+ "dispel magic",
+ "magical vestment",
+ "prayer",
+ "remove paralysis",
+ "cause serious wounds",
+ "cure serious wounds",
+ "neutralize poison",
+ "protection from evil 10' radius",
+ "cause critical wounds",
+ "cure critical wounds",
+ "flame strike",
+ "raise dead",
+ "slay living",
+ "true seeing",
+ "harm",
+ "heal",
+ "ressurection",
+ "lay on hands",
+ "turn undead",
+ "",
+ "mystic defense",
+ "",
+ "",
+ "",
+ "",
+ ""
+};
+
+static const StringListProvider kEoB2SpellNamesAmigaEnglishProvider = { ARRAYSIZE(kEoB2SpellNamesAmigaEnglish), kEoB2SpellNamesAmigaEnglish };
+
+static const char *const kEoB2MagicStrings1AmigaEnglish[6] = {
+ "ABORT SPELL",
+ "ABORT SPELL",
+ "You must have a free hand for this spell.\r",
+ "You can't have two of this spell type active.\r",
+ "%s casts %s.\r",
+ "\rok\r"
+};
+
+static const StringListProvider kEoB2MagicStrings1AmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings1AmigaEnglish), kEoB2MagicStrings1AmigaEnglish };
+
+static const char *const kEoB2MagicStrings2AmigaEnglish[5] = {
+ "The spell fails!\r",
+ "%s has been disintegrated!\r",
+ "\x06\x06""The party has been hit by a death spell!\r",
+ "\x06\x06""%s has been hit by cause serious wounds.\r",
+ "PETRIFIED"
+};
+
+static const StringListProvider kEoB2MagicStrings2AmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings2AmigaEnglish), kEoB2MagicStrings2AmigaEnglish };
+
+static const char *const kEoB2MagicStrings3AmigaEnglish[5] = {
+ "Cast spell on which character? ",
+ "\rSpell aborted.\r",
+ "%s's %s spell expires.\r",
+ "%s missed the monster.\r",
+ "%s must be in the front ranks to hit!\r"
+};
+
+static const StringListProvider kEoB2MagicStrings3AmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings3AmigaEnglish), kEoB2MagicStrings3AmigaEnglish };
+
+static const char *const kEoB2MagicStrings4AmigaEnglish[1] = {
+ "no effect.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings4AmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings4AmigaEnglish), kEoB2MagicStrings4AmigaEnglish };
+
+static const char *const kEoB2MagicStrings6AmigaEnglish[1] = {
+ "%s already has an armor class better than AC 6."
+};
+
+static const StringListProvider kEoB2MagicStrings6AmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings6AmigaEnglish), kEoB2MagicStrings6AmigaEnglish };
+
+static const char *const kEoB2MagicStrings7AmigaEnglish[2] = {
+ "%s is already under the effect of a %s spell.\r",
+ "The party is already under the effect of a %s spell.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings7AmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings7AmigaEnglish), kEoB2MagicStrings7AmigaEnglish };
+
+static const char *const kEoB2MagicStrings8AmigaEnglish[6] = {
+ "The spell fails!\r",
+ "held",
+ "The spell fails!\r",
+ "The spell fails\r",
+ "No monster within reach!\r",
+ "%s is already under the effect of an aid spell.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings8AmigaEnglishProvider = { ARRAYSIZE(kEoB2MagicStrings8AmigaEnglish), kEoB2MagicStrings8AmigaEnglish };
+
+static const byte kEoB2ManDefAmigaEnglish[200] = {
+ 0x09, 0x03, 0x04, 0x00, 0x09, 0x0d, 0x02, 0x00,
+ 0x09, 0x07, 0x07, 0x00, 0x14, 0x06, 0x05, 0x00,
+ 0x14, 0x10, 0x06, 0x00, 0x14, 0x1c, 0x03, 0x00,
+ 0x1a, 0x04, 0x06, 0x00, 0x1a, 0x0a, 0x05, 0x00,
+ 0x1a, 0x0c, 0x05, 0x00, 0x15, 0x03, 0x04, 0x00,
+ 0x15, 0x05, 0x05, 0x00, 0x15, 0x0f, 0x02, 0x00,
+ 0x15, 0x14, 0x03, 0x00, 0x15, 0x1b, 0x02, 0x00,
+ 0x15, 0x1d, 0x03, 0x00, 0x23, 0x01, 0x03, 0x00,
+ 0x23, 0x03, 0x03, 0x00, 0x23, 0x08, 0x03, 0x00,
+ 0x23, 0x19, 0x02, 0x00, 0x23, 0x1f, 0x04, 0x00,
+ 0x23, 0x26, 0x04, 0x00, 0x26, 0x03, 0x02, 0x00,
+ 0x26, 0x05, 0x06, 0x00, 0x26, 0x12, 0x03, 0x00,
+ 0x26, 0x18, 0x01, 0x00, 0x26, 0x1e, 0x01, 0x00,
+ 0x26, 0x21, 0x04, 0x00, 0x17, 0x01, 0x03, 0x00,
+ 0x17, 0x03, 0x06, 0x00, 0x17, 0x06, 0x02, 0x00,
+ 0x17, 0x0f, 0x05, 0x00, 0x17, 0x1b, 0x01, 0x00,
+ 0x17, 0x21, 0x06, 0x00, 0x12, 0x03, 0x02, 0x00,
+ 0x12, 0x05, 0x04, 0x00, 0x12, 0x09, 0x02, 0x00,
+ 0x12, 0x0b, 0x04, 0x00, 0x12, 0x0d, 0x06, 0x00,
+ 0x12, 0x0f, 0x03, 0x00, 0x12, 0x11, 0x05, 0x00,
+ 0x12, 0x12, 0x02, 0x00, 0x1f, 0x02, 0x04, 0x00,
+ 0x1f, 0x02, 0x07, 0x00, 0x1f, 0x04, 0x03, 0x00,
+ 0x1f, 0x06, 0x03, 0x00, 0x1f, 0x09, 0x03, 0x00,
+ 0x1f, 0x0a, 0x01, 0x00, 0x1c, 0x03, 0x03, 0x00,
+ 0x1c, 0x04, 0x02, 0x00, 0x1c, 0x05, 0x06, 0x00
+};
+
+static const ByteProvider kEoB2ManDefAmigaEnglishProvider = { ARRAYSIZE(kEoB2ManDefAmigaEnglish), kEoB2ManDefAmigaEnglish };
+
+static const char *const kEoB2ManWordAmigaEnglish[51] = {
+ "cursor",
+ "majority",
+ "right",
+ "unusable",
+ "greyed",
+ "thrown",
+ "spellcasters",
+ "button",
+ "characters",
+ "carefree",
+ "practical",
+ "inherit",
+ "while",
+ "combinations",
+ "charm",
+ "individuals",
+ "gestures",
+ "pummel",
+ "paladins",
+ "skill",
+ "advancement",
+ "also",
+ "counters",
+ "knowledge",
+ "greater",
+ "assume",
+ "several",
+ "laying",
+ "reach",
+ "swiftly",
+ "allows",
+ "limited",
+ "jack",
+ "thrown",
+ "weapons",
+ "note",
+ "certain",
+ "damage",
+ "done",
+ "bonus",
+ "may",
+ "over",
+ "box",
+ "put",
+ "portrait",
+ "backpack",
+ "inside",
+ "causes",
+ "until",
+ "outright",
+ ""
+};
+
+static const StringListProvider kEoB2ManWordAmigaEnglishProvider = { ARRAYSIZE(kEoB2ManWordAmigaEnglish), kEoB2ManWordAmigaEnglish };
+
+static const char *const kEoB2ManPromptAmigaEnglish[1] = {
+ "\r\r\r\rOn the page with this symbol...\r\rFind line %d\rEnter word %d\r"
+};
+
+static const StringListProvider kEoB2ManPromptAmigaEnglishProvider = { ARRAYSIZE(kEoB2ManPromptAmigaEnglish), kEoB2ManPromptAmigaEnglish };
+
+static const char *const kEoB2MainMenuStringsAmigaEnglish[5] = {
+ "LOAD GAME IN PROGRESS\r",
+ "START A NEW PARTY\r",
+ "TRANSFER EOB I PARTY\r",
+ "RUN INTRODUCTION\r",
+ "FORMAT SAVE GAME DISK\r"
+};
+
+static const StringListProvider kEoB2MainMenuStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MainMenuStringsAmigaEnglish), kEoB2MainMenuStringsAmigaEnglish };
+
+static const char *const kEoB2TransferStrings1AmigaEnglish[2] = {
+ "Level: %d",
+ " / %d"
+};
+
+static const StringListProvider kEoB2TransferStrings1AmigaEnglishProvider = { ARRAYSIZE(kEoB2TransferStrings1AmigaEnglish), kEoB2TransferStrings1AmigaEnglish };
+
+static const char *const kEoB2TransferStrings2AmigaEnglish[2] = {
+ "You may only take four characters on your adventure.",
+ "Select OK when you are finished choosing your party."
+};
+
+static const StringListProvider kEoB2TransferStrings2AmigaEnglishProvider = { ARRAYSIZE(kEoB2TransferStrings2AmigaEnglish), kEoB2TransferStrings2AmigaEnglish };
+
+static const char *const kEoB2TransferLabelsAmigaEnglish[2] = {
+ "CANCEL",
+ "OK"
+};
+
+static const StringListProvider kEoB2TransferLabelsAmigaEnglishProvider = { ARRAYSIZE(kEoB2TransferLabelsAmigaEnglish), kEoB2TransferLabelsAmigaEnglish };
+
+static const char *const kEoB2IntroStringsAmigaEnglish[20] = {
+ "You were settling in for an evening \rby the fire.",
+ "Then a note was slipped to you.",
+ "It was from your friend Khelben \rBlackstaff, Archmage of the city.",
+ "The message was urgent.",
+ "What could Khelben want?",
+ "Welcome, please come in.",
+ "Khelben awaits you in his study.",
+ "Thank you for coming so quickly.",
+ "I am troubled my friend.",
+ "Ancient Evil stirs in the \rTemple Darkmoon.",
+ "I fear for the safety of our city.",
+ "I need your help.",
+ "Three nights ago \rI sent forth a scout.",
+ "She has not yet returned.",
+ "I fear for her safety.",
+ "Take this coin.",
+ "I will use it to contact you.",
+ "You must act quickly.",
+ "I will teleport you near Darkmoon.",
+ "May luck be with you, my friend."
+};
+
+static const StringListProvider kEoB2IntroStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2IntroStringsAmigaEnglish), kEoB2IntroStringsAmigaEnglish };
+
+static const char *const kEoB2IntroCPSFilesAmigaEnglish[16] = {
+ "STREET1.CPS",
+ "STREET2.CPS",
+ "DOORWAY1.CPS",
+ "DOORWAY2.CPS",
+ "WESTWOOD1.CPS",
+ "WINDING.CPS",
+ "KHELBAN2.CPS",
+ "KHELBAN1.CPS",
+ "KHELBAN3.CPS",
+ "KHELBAN4.CPS",
+ "COIN.CPS",
+ "KHELBAN5.CPS",
+ "KHELBAN6.CPS",
+ "WESTWOOD2.CPS",
+ "WESTWOOD3.CPS",
+ "WESTWOOD4.CPS"
+};
+
+static const StringListProvider kEoB2IntroCPSFilesAmigaEnglishProvider = { ARRAYSIZE(kEoB2IntroCPSFilesAmigaEnglish), kEoB2IntroCPSFilesAmigaEnglish };
+
+static const char *const kEoB2FinaleStringsAmigaEnglish[20] = {
+ "Finally, Dran has been defeated.",
+ "Suddenly, your friend Khelben appears.",
+ "Greetings, my victorious friends.",
+ "You have defeated Dran!",
+ "I did not know Dran was a dragon.",
+ "He must have been over 300 years old!",
+ "His power is gone.",
+ "But Darkmoon is still a source\rof great evil.",
+ "And many of his minions remain.",
+ "Now we must leave this place.",
+ "So my forces can destroy it\ronce and for all.",
+ "Follow me.",
+ "Powerful mages stand ready\rfor the final assault\ron Darkmoon.",
+ "The Temple's evil is very strong.",
+ "It must not be allowed to survive!",
+ "The Temple ceases to exist.",
+ "My friends, our work is done.",
+ "Thank you.",
+ "You have earned my deepest respect.",
+ "We will remember you always."
+};
+
+static const StringListProvider kEoB2FinaleStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2FinaleStringsAmigaEnglish), kEoB2FinaleStringsAmigaEnglish };
+
+static const char *const kEoB2FinaleCPSFilesAmigaEnglish[13] = {
+ "DRAGON1.CPS",
+ "DRAGON2.CPS",
+ "HURRY1.CPS",
+ "HURRY2.CPS",
+ "DESTROY0.CPS",
+ "DESTROY1.CPS",
+ "DESTROY2.CPS",
+ "MAGIC.CPS",
+ "DESTROY3.CPS",
+ "CREDITS2.CPS",
+ "CREDITS3.CPS",
+ "HEROES.CPS",
+ "THANKS.CPS"
+};
+
+static const StringListProvider kEoB2FinaleCPSFilesAmigaEnglishProvider = { ARRAYSIZE(kEoB2FinaleCPSFilesAmigaEnglish), kEoB2FinaleCPSFilesAmigaEnglish };
+
+static const char *const kEoB2MonsterDistAttStringsAmigaEnglish[5] = {
+ "The party is hit with a psychic mind blast!\r",
+ "paralyzed",
+ "poisoned",
+ "paralyzed",
+ "PETRIFIED"
+};
+
+static const StringListProvider kEoB2MonsterDistAttStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MonsterDistAttStringsAmigaEnglish), kEoB2MonsterDistAttStringsAmigaEnglish };
+
+static const char *const kEoB2Npc1StringsAmigaEnglish[2] = {
+ "talk",
+ "leave"
+};
+
+static const StringListProvider kEoB2Npc1StringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2Npc1StringsAmigaEnglish), kEoB2Npc1StringsAmigaEnglish };
+
+static const char *const kEoB2Npc2StringsAmigaEnglish[2] = {
+ "release him",
+ "leave"
+};
+
+static const StringListProvider kEoB2Npc2StringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2Npc2StringsAmigaEnglish), kEoB2Npc2StringsAmigaEnglish };
+
+static const char *const kEoB2MonsterDustStringsAmigaEnglish[1] = {
+ "The monster crumbles to dust!\r"
+};
+
+static const StringListProvider kEoB2MonsterDustStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2MonsterDustStringsAmigaEnglish), kEoB2MonsterDustStringsAmigaEnglish };
+
+static const char *const kEoB2KheldranStringsAmigaEnglish[1] = {
+ " Such trusting whelps!"
+};
+
+static const StringListProvider kEoB2KheldranStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2KheldranStringsAmigaEnglish), kEoB2KheldranStringsAmigaEnglish };
+
+static const char *const kEoB2HornStringsAmigaEnglish[4] = {
+ "A bellowing sound comes from the horn.\r",
+ "A hollow sound comes from the horn.\r",
+ "A melodious sound comes from the horn.\r",
+ "An eerie sound comes from the horn.\r"
+};
+
+static const StringListProvider kEoB2HornStringsAmigaEnglishProvider = { ARRAYSIZE(kEoB2HornStringsAmigaEnglish), kEoB2HornStringsAmigaEnglish };
+
diff --git a/devtools/create_kyradat/resources/eob2_amiga_german.h b/devtools/create_kyradat/resources/eob2_amiga_german.h
new file mode 100644
index 0000000..df609f2
--- /dev/null
+++ b/devtools/create_kyradat/resources/eob2_amiga_german.h
@@ -0,0 +1,1057 @@
+static const char *const kEoB2ChargenStrings1AmigaGerman[9] = {
+ "Die Party ist\rkomplett. W""\xe4""hle\rSPIEL oder\rdr""\xfc""cke 'P', um\rzu starten.",
+ " ",
+ "RK\rTP\rSTF",
+ "%s\r%d\r%d\r%d\r%d\r%d",
+ "%d\r%d",
+ "%d",
+ "%d/%d",
+ "%d/%d/%d",
+ "W""\xe4""hle die Box des\rCharakters, den du\rerschaffen oder\ransehen willst."
+};
+
+static const StringListProvider kEoB2ChargenStrings1AmigaGermanProvider = { ARRAYSIZE(kEoB2ChargenStrings1AmigaGerman), kEoB2ChargenStrings1AmigaGerman };
+
+static const char *const kEoB2ChargenStrings2AmigaGerman[12] = {
+ "%s",
+ "%d",
+ "%s",
+ "%d",
+ "%d",
+ "%d",
+ "%s",
+ "%d",
+ "W""\xc4""HLE RASSE:",
+ "W""\xc4""HLE KLASSE:",
+ "W""\xc4""HLE GESINNUNG:",
+ "Name:"
+};
+
+static const StringListProvider kEoB2ChargenStrings2AmigaGermanProvider = { ARRAYSIZE(kEoB2ChargenStrings2AmigaGerman), kEoB2ChargenStrings2AmigaGerman };
+
+static const char *const kEoB2ChargenStatStringsAmigaGerman[12] = {
+ "ST""\xc4",
+ "INT",
+ "WEI",
+ "GES",
+ "KON",
+ "CHA",
+ "ST""\xc4""RKE",
+ "INTELLIGENZ",
+ "WEISHEIT",
+ "GESCHICK",
+ "KONSTITUTION",
+ "CHARISMA"
+};
+
+static const StringListProvider kEoB2ChargenStatStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2ChargenStatStringsAmigaGerman), kEoB2ChargenStatStringsAmigaGerman };
+
+static const char *const kEoB2ChargenRaceSexStringsAmigaGerman[12] = {
+ "MENSCH, MANN",
+ "MENSCH, FRAU",
+ "ELF, MANN",
+ "ELF, FRAU",
+ "HALBELF, MANN",
+ "HALBELF, FRAU",
+ "ZWERG, MANN",
+ "ZWERG, FRAU",
+ "GNOM, MANN",
+ "GNOM, FRAU",
+ "HALBLING, MANN",
+ "HALBLING, FRAU"
+};
+
+static const StringListProvider kEoB2ChargenRaceSexStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2ChargenRaceSexStringsAmigaGerman), kEoB2ChargenRaceSexStringsAmigaGerman };
+
+static const char *const kEoB2ChargenClassStringsAmigaGerman[21] = {
+ "K""\xc4""MPFER",
+ "WALDL""\xc4""UFER",
+ "PALADIN",
+ "MAGIER",
+ "KLERIKER",
+ "DIEB",
+ "K""\xc4""MPFER/KLERIKER",
+ "K""\xc4""MPFER/DIEB",
+ "K""\xc4""MPFER/MAGIER",
+ "K""\xc4""MPFER/MAGIER/DIEB",
+ "DIEB/MAGIER",
+ "KLERIKER/DIEB",
+ "K""\xc4""MPFER/KLER./MAG.",
+ "WALDL./KLER.",
+ "KLER./MAGIER",
+ "K""\xc4""MPFER",
+ "MAGIER",
+ "KLERIKER",
+ "DIEB",
+ "PALADIN",
+ "WALDL."
+};
+
+static const StringListProvider kEoB2ChargenClassStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2ChargenClassStringsAmigaGerman), kEoB2ChargenClassStringsAmigaGerman };
+
+static const char *const kEoB2ChargenAlignmentStringsAmigaGerman[9] = {
+ "RECHTSCH. GUT",
+ "NEUTRAL GUT",
+ "CHAOTISCH GUT",
+ "RECHTSCH. NEUTRAL",
+ "NEUTRAL",
+ "CHAOTISCH NEUTRAL",
+ "RECHTSCH. B""\xd6""SE",
+ "NEUTRAL B""\xd6""SE",
+ "CHAOTISCH B""\xd6""SE"
+};
+
+static const StringListProvider kEoB2ChargenAlignmentStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2ChargenAlignmentStringsAmigaGerman), kEoB2ChargenAlignmentStringsAmigaGerman };
+
+static const char *const kEoB2ChargenEnterGameStringsAmigaGerman[1] = {
+ " Lade Spiel.\r Bitte warten."
+};
+
+static const StringListProvider kEoB2ChargenEnterGameStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2ChargenEnterGameStringsAmigaGerman), kEoB2ChargenEnterGameStringsAmigaGerman };
+
+static const char *const kEoB2PryDoorStringsAmigaGerman[9] = {
+ "\r",
+ "Ihr k""\xf6""nnt die T""\xfc""r nicht aufbrechen.\r",
+ "\x06\x04""Ihr brecht die T""\xfc""r auf.\r",
+ "\x06\x06""Ihr versucht vergeblich die T""\xfc""r gewaltsam zu\r""\xf6""ffnen.\r",
+ "Das kann man hier nicht ablegen.\r",
+ "Das passt hier nicht.\r",
+ "Niemand kann die T""\xfc""r aufbrechen.\r",
+ "\r",
+ "\r"
+};
+
+static const StringListProvider kEoB2PryDoorStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2PryDoorStringsAmigaGerman), kEoB2PryDoorStringsAmigaGerman };
+
+static const char *const kEoB2WarningStringsAmigaGerman[4] = {
+ "Da geht's nicht lang.\r",
+ "%s kann nichts zu sich nehmen!\r",
+ "Das Zeug ist vergammelt! das will doch kein Mensch essen!\r",
+ "Euch bekommt nur richtige Nahrung!\r"
+};
+
+static const StringListProvider kEoB2WarningStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2WarningStringsAmigaGerman), kEoB2WarningStringsAmigaGerman };
+
+static const char *const kEoB2ItemSuffixStringsRingsAmigaGerman[4] = {
+ "s Schmuckes",
+ "r Zauberei",
+ "r Nahrung",
+ "s Federfalls"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsRingsAmigaGermanProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsRingsAmigaGerman), kEoB2ItemSuffixStringsRingsAmigaGerman };
+
+static const char *const kEoB2ItemSuffixStringsPotionsAmigaGerman[8] = {
+ "r Riesenkraft",
+ "r Heilung",
+ "r Extra Heilung",
+ "s Giftes",
+ "r Lebenskraft",
+ "r Geschwindigkeit",
+ "r Unsichtbarkeit",
+ "r Entgiftung"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsPotionsAmigaGermanProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsPotionsAmigaGerman), kEoB2ItemSuffixStringsPotionsAmigaGerman };
+
+static const char *const kEoB2ItemSuffixStringsWandsAmigaGerman[8] = {
+ "r L""\xe4""hmung",
+ "s Gewitters",
+ "r K""\xe4""lte",
+ "r Heilung",
+ "s Feuerballs",
+ "Sternenfeuer",
+ "r Magischen Geschosse",
+ "r gebannten magie"
+};
+
+static const StringListProvider kEoB2ItemSuffixStringsWandsAmigaGermanProvider = { ARRAYSIZE(kEoB2ItemSuffixStringsWandsAmigaGerman), kEoB2ItemSuffixStringsWandsAmigaGerman };
+
+static const char *const kEoB2RipItemStringsAmigaGerman[4] = {
+ "%s verlor: ",
+ "%s verlor: ",
+ ".\r",
+ "%d %s (verflucht)"
+};
+
+static const StringListProvider kEoB2RipItemStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2RipItemStringsAmigaGerman), kEoB2RipItemStringsAmigaGerman };
+
+static const char *const kEoB2CursedStringAmigaGerman[1] = {
+ "%d %s (verflucht) "
+};
+
+static const StringListProvider kEoB2CursedStringAmigaGermanProvider = { ARRAYSIZE(kEoB2CursedStringAmigaGerman), kEoB2CursedStringAmigaGerman };
+
+static const char *const kEoB2MagicObjectStringsAmigaGerman[5] = {
+ "Magierrolle",
+ "Klerikerrolle",
+ "Ring",
+ "Trank",
+ "Stab"
+};
+
+static const StringListProvider kEoB2MagicObjectStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2MagicObjectStringsAmigaGerman), kEoB2MagicObjectStringsAmigaGerman };
+
+static const char *const kEoB2MagicObjectString5AmigaGerman[1] = {
+ "Zepter"
+};
+
+static const StringListProvider kEoB2MagicObjectString5AmigaGermanProvider = { ARRAYSIZE(kEoB2MagicObjectString5AmigaGerman), kEoB2MagicObjectString5AmigaGerman };
+
+static const char *const kEoB2PatternSuffixAmigaGerman[1] = {
+ "%s de%s"
+};
+
+static const StringListProvider kEoB2PatternSuffixAmigaGermanProvider = { ARRAYSIZE(kEoB2PatternSuffixAmigaGerman), kEoB2PatternSuffixAmigaGerman };
+
+static const char *const kEoB2PatternGrFix1AmigaGerman[1] = {
+ "%s: %s"
+};
+
+static const StringListProvider kEoB2PatternGrFix1AmigaGermanProvider = { ARRAYSIZE(kEoB2PatternGrFix1AmigaGerman), kEoB2PatternGrFix1AmigaGerman };
+
+static const char *const kEoB2PatternGrFix2AmigaGerman[1] = {
+ "%s %s"
+};
+
+static const StringListProvider kEoB2PatternGrFix2AmigaGermanProvider = { ARRAYSIZE(kEoB2PatternGrFix2AmigaGerman), kEoB2PatternGrFix2AmigaGerman };
+
+static const char *const kEoB2ValidateArmorStringAmigaGerman[1] = {
+ "%s kann diese r""\xfc""stungsart nicht tragen.\r"
+};
+
+static const StringListProvider kEoB2ValidateArmorStringAmigaGermanProvider = { ARRAYSIZE(kEoB2ValidateArmorStringAmigaGerman), kEoB2ValidateArmorStringAmigaGerman };
+
+static const char *const kEoB2ValidateCursedStringAmigaGerman[1] = {
+ "%s kann die Waffe nicht loslassen! Sie ist verflucht!\r"
+};
+
+static const StringListProvider kEoB2ValidateCursedStringAmigaGermanProvider = { ARRAYSIZE(kEoB2ValidateCursedStringAmigaGerman), kEoB2ValidateCursedStringAmigaGerman };
+
+static const char *const kEoB2ValidateNoDropStringAmigaGerman[1] = {
+ "Diesen Gegenstand hier nicht ablegen.\r"
+};
+
+static const StringListProvider kEoB2ValidateNoDropStringAmigaGermanProvider = { ARRAYSIZE(kEoB2ValidateNoDropStringAmigaGerman), kEoB2ValidateNoDropStringAmigaGerman };
+
+static const char *const kEoB2PotionStringsAmigaGerman[2] = {
+ "vergiftet",
+ "%s f""\xfc""hlt sich %s!\r"
+};
+
+static const StringListProvider kEoB2PotionStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2PotionStringsAmigaGerman), kEoB2PotionStringsAmigaGerman };
+
+static const char *const kEoB2WandStringsAmigaGerman[1] = {
+ "Der Stab hat offenbar keinen magischen Effekt\r"
+};
+
+static const StringListProvider kEoB2WandStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2WandStringsAmigaGerman), kEoB2WandStringsAmigaGerman };
+
+static const char *const kEoB2ItemMisuseStringsAmigaGerman[3] = {
+ "%s kann diesen Gegenstand nicht nutzen.\r",
+ "Dieser Gegenstand wird automatisch beim Tragen benutzt.\r",
+ "Das kann man so nicht benutzen.\r"
+};
+
+static const StringListProvider kEoB2ItemMisuseStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2ItemMisuseStringsAmigaGerman), kEoB2ItemMisuseStringsAmigaGerman };
+
+static const char *const kEoB2TakenStringsAmigaGerman[1] = {
+ " aufgenommen.\r"
+};
+
+static const StringListProvider kEoB2TakenStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2TakenStringsAmigaGerman), kEoB2TakenStringsAmigaGerman };
+
+static const char *const kEoB2PotionEffectStringsAmigaGerman[8] = {
+ "viel st""\xe4""rker",
+ "besser",
+ "viel besser",
+ "etwas krank",
+ "pappsatt",
+ "schnell und agil",
+ "transparent",
+ "besser"
+};
+
+static const StringListProvider kEoB2PotionEffectStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2PotionEffectStringsAmigaGerman), kEoB2PotionEffectStringsAmigaGerman };
+
+static const char *const kEoB2YesNoStringsAmigaGerman[2] = {
+ "ja",
+ "nein"
+};
+
+static const StringListProvider kEoB2YesNoStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2YesNoStringsAmigaGerman), kEoB2YesNoStringsAmigaGerman };
+
+static const char *const kEoB2MoreStringsAmigaGerman[1] = {
+ "MEHR"
+};
+
+static const StringListProvider kEoB2MoreStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2MoreStringsAmigaGerman), kEoB2MoreStringsAmigaGerman };
+
+static const char *const kEoB2NpcMaxStringsAmigaGerman[1] = {
+ "Maximal sechs Charaktere pro Party. Wen wollt Ihr entlassen."
+};
+
+static const StringListProvider kEoB2NpcMaxStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2NpcMaxStringsAmigaGerman), kEoB2NpcMaxStringsAmigaGerman };
+
+static const char *const kEoB2OkStringsAmigaGerman[1] = {
+ "OK"
+};
+
+static const StringListProvider kEoB2OkStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2OkStringsAmigaGerman), kEoB2OkStringsAmigaGerman };
+
+static const char *const kEoB2NpcJoinStringsAmigaGerman[1] = {
+ "%s wird Partymitglied.\r"
+};
+
+static const StringListProvider kEoB2NpcJoinStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2NpcJoinStringsAmigaGerman), kEoB2NpcJoinStringsAmigaGerman };
+
+static const char *const kEoB2CancelStringsAmigaGerman[1] = {
+ "ABBR."
+};
+
+static const StringListProvider kEoB2CancelStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2CancelStringsAmigaGerman), kEoB2CancelStringsAmigaGerman };
+
+static const char *const kEoB2AbortStringsAmigaGerman[1] = {
+ "ABBR."
+};
+
+static const StringListProvider kEoB2AbortStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2AbortStringsAmigaGerman), kEoB2AbortStringsAmigaGerman };
+
+static const char *const kEoB2MenuStringsMainAmigaGerman[8] = {
+ "W""\xe4""hle Option:",
+ "Rasten",
+ "Spr""\xfc""che merken",
+ "Um Spr""\xfc""che beten",
+ "Rollen notieren",
+ "Voreinstellungen",
+ "Spieloptionen",
+ "Ende"
+};
+
+static const StringListProvider kEoB2MenuStringsMainAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsMainAmigaGerman), kEoB2MenuStringsMainAmigaGerman };
+
+static const char *const kEoB2MenuStringsSaveLoadAmigaGerman[8] = {
+ "Spiel laden",
+ "Spiel speichern",
+ "Charakter entl.",
+ "Beenden",
+ "Spieloptionen:",
+ "\r Gespeichert.",
+ "Speicherversuch\rfehlgeschlagen!",
+ "Ladeversuch\rfehlgeschlagen.\rEvtl. Disk-Error!"
+};
+
+static const StringListProvider kEoB2MenuStringsSaveLoadAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsSaveLoadAmigaGerman), kEoB2MenuStringsSaveLoadAmigaGerman };
+
+static const char *const kEoB2MenuStringsOnOffAmigaGerman[2] = {
+ "AN",
+ "AUS"
+};
+
+static const StringListProvider kEoB2MenuStringsOnOffAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsOnOffAmigaGerman), kEoB2MenuStringsOnOffAmigaGerman };
+
+static const char *const kEoB2MenuStringsSpellsAmigaGerman[17] = {
+ "\r\r W""\xe4""hlt einen Charak-\r ter aus der Party,\r der Spr""\xfc""che lernen\r soll.",
+ "\r Der Paladin ist\r eine Stufe zu nied-\r rig zum zaubern.",
+ "\r\r Der magier hat\r kein Spruchbuch!",
+ "\r\r\r W""\xe4""hlt einen Charak-\r ter aus der Party,\r der f""\xfc""r Spr""\xfc""che\r beten will.",
+ "\r Niemand in der\r Party ist in der\r Lage, f""\xfc""r Spr""\xfc""che\r zu beten.",
+ "\r Niemand in der\r Party ist in der\r Lage, sich Spr""\xfc""che\r zu merken.",
+ " Jemand der bewu""\xdf""t-\r los oder tot ist\r kann keine Spr""\xfc""che\r merken.",
+ " Jemand der bewu""\xdf""t-\r los oder tot ist\r kann nicht um\r Spr""\xfc""che beten.",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "Neu",
+ "Verf""\xfc""gbare Zauber:",
+ "Ja",
+ "Nein"
+};
+
+static const StringListProvider kEoB2MenuStringsSpellsAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsSpellsAmigaGerman), kEoB2MenuStringsSpellsAmigaGerman };
+
+static const char *const kEoB2MenuStringsRestAmigaGerman[5] = {
+ "\rWerden eure Heiler\rdie Party heilen?",
+ " Jemand ist noch\r verletzt. Weiter-\r rasten?",
+ "Die Party rastet.",
+ "\r Alle Spieler\r sind voll\r ausgeruht.",
+ " Eure Party braucht\r Rast, um Spr""\xfc""che\r zu erhalten."
+};
+
+static const StringListProvider kEoB2MenuStringsRestAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsRestAmigaGerman), kEoB2MenuStringsRestAmigaGerman };
+
+static const char *const kEoB2MenuStringsDropAmigaGerman[1] = {
+ " Weniger als vier\r Charaktere sind\r nicht erlaubt."
+};
+
+static const StringListProvider kEoB2MenuStringsDropAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsDropAmigaGerman), kEoB2MenuStringsDropAmigaGerman };
+
+static const char *const kEoB2MenuStringsExitAmigaGerman[1] = {
+ " Ganz bestimmt\r das Spiel\r abbrechen?"
+};
+
+static const StringListProvider kEoB2MenuStringsExitAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsExitAmigaGerman), kEoB2MenuStringsExitAmigaGerman };
+
+static const char *const kEoB2MenuStringsStarveAmigaGerman[1] = {
+ " Eure Party hungert.\r Wollt Ihr weiter\r rasten?"
+};
+
+static const StringListProvider kEoB2MenuStringsStarveAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsStarveAmigaGerman), kEoB2MenuStringsStarveAmigaGerman };
+
+static const char *const kEoB2MenuStringsScribeAmigaGerman[5] = {
+ "W""\xe4""hlt die Rolle(n)\rzum notieren.",
+ "\r\r\r W""\xe4""hlt den Magier\r aus der Party,\r der Spr""\xfc""che\r notieren m""\xf6""chte.",
+ " Ihr habt keine\r ""\xfc""bertragbaren\r Schriftrollen.",
+ " Ihr habt keine\r Rollen, die dieser\r Magier braucht.",
+ "\r Ihr habt keinen\r Magier, der Rollen\r ""\xfc""bertragen kann."
+};
+
+static const StringListProvider kEoB2MenuStringsScribeAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsScribeAmigaGerman), kEoB2MenuStringsScribeAmigaGerman };
+
+static const char *const kEoB2MenuStringsDrop2AmigaGerman[3] = {
+ " W""\xe4""hlt den Charak-\r ter, den Ihr\r entfernen m""\xf6""chtet.",
+ " Spielst""\xe4""nde m""\xfc""ssen\r einen Namen haben!",
+ " Ganz sicher den\r alten Spielstand\r ""\xfc""berschreiben?"
+};
+
+static const StringListProvider kEoB2MenuStringsDrop2AmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsDrop2AmigaGerman), kEoB2MenuStringsDrop2AmigaGerman };
+
+static const char *const kEoB2MenuStringsHeadAmigaGerman[3] = {
+ "Rast:",
+ "Voreinstellung:",
+ "Spieloptionen:"
+};
+
+static const StringListProvider kEoB2MenuStringsHeadAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsHeadAmigaGerman), kEoB2MenuStringsHeadAmigaGerman };
+
+static const char *const kEoB2MenuStringsPoisonAmigaGerman[1] = {
+ "Vergiftete Spieler\rk""\xf6""nnten sterben!\rTrotzdem rasten?"
+};
+
+static const StringListProvider kEoB2MenuStringsPoisonAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsPoisonAmigaGerman), kEoB2MenuStringsPoisonAmigaGerman };
+
+static const char *const kEoB2MenuStringsMgcAmigaGerman[2] = {
+ "%-18s %1d",
+ "%d von %d verf""\xfc""gbar. "
+};
+
+static const StringListProvider kEoB2MenuStringsMgcAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsMgcAmigaGerman), kEoB2MenuStringsMgcAmigaGerman };
+
+static const char *const kEoB2MenuStringsPrefsAmigaGerman[4] = {
+ "Musik ist %-3s",
+ "FX sind %-3s",
+ "Balkengrafik: %-3s",
+ ""
+};
+
+static const StringListProvider kEoB2MenuStringsPrefsAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsPrefsAmigaGerman), kEoB2MenuStringsPrefsAmigaGerman };
+
+static const char *const kEoB2MenuStringsRest2AmigaGerman[5] = {
+ "%s erhielt %s.\r",
+ "%s merkt sich %s.\r",
+ "%s heilt %s.\r",
+ "Raststunden: %-4d ",
+ "\r%s\r"
+};
+
+static const StringListProvider kEoB2MenuStringsRest2AmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsRest2AmigaGerman), kEoB2MenuStringsRest2AmigaGerman };
+
+static const char *const kEoB2MenuStringsRest3AmigaGerman[1] = {
+ "\x06\x06""Es scheint, als sei es nicht sicher hier zu rasten."
+};
+
+static const StringListProvider kEoB2MenuStringsRest3AmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsRest3AmigaGerman), kEoB2MenuStringsRest3AmigaGerman };
+
+static const char *const kEoB2MenuStringsRest4AmigaGerman[1] = {
+ "\x06\x06""In der N""\xe4""he von Monstern k""\xf6""nnt Ihr nicht rasten."
+};
+
+static const StringListProvider kEoB2MenuStringsRest4AmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsRest4AmigaGerman), kEoB2MenuStringsRest4AmigaGerman };
+
+static const char *const kEoB2MenuStringsDefeatAmigaGerman[1] = {
+ "\rDie gesamte Party\rwurde besiegt!\rEinen alten Spiel-\rstand laden?"
+};
+
+static const StringListProvider kEoB2MenuStringsDefeatAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsDefeatAmigaGerman), kEoB2MenuStringsDefeatAmigaGerman };
+
+static const char *const kEoB2MenuStringsTransferAmigaGerman[5] = {
+ "Mindestens vier\rSpieler vor Spiel-\rbeginn transferieren!",
+ "Nur vier Spieler\rtransferieren!",
+ "Bestimmte Habselig-\rkeiten werden\rgel""\xf6""scht.",
+ " \r Kein Magier in\r der Party.",
+ " \r Kein Kleriker\r oder Paladin\r in der Party."
+};
+
+static const StringListProvider kEoB2MenuStringsTransferAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsTransferAmigaGerman), kEoB2MenuStringsTransferAmigaGerman };
+
+static const char *const kEoB2MenuStringsSpecAmigaGerman[2] = {
+ "Beim Aufwachen bem-\rerkt Ihr die Ab-\rwesenheit von Insal!",
+ "Eine kurzer Blick\rzeigt, das Ausr""\xfc""st-\rung gestohlen wurde!"
+};
+
+static const StringListProvider kEoB2MenuStringsSpecAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuStringsSpecAmigaGerman), kEoB2MenuStringsSpecAmigaGerman };
+
+static const char *const kEoB2MenuYesNoStringsAmigaGerman[2] = {
+ "Ja",
+ "Nein"
+};
+
+static const StringListProvider kEoB2MenuYesNoStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2MenuYesNoStringsAmigaGerman), kEoB2MenuYesNoStringsAmigaGerman };
+
+static const char *const kEoB2CharGuiStringsHpAmigaGerman[2] = {
+ "TP",
+ "%3d / %-3d"
+};
+
+static const StringListProvider kEoB2CharGuiStringsHpAmigaGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsHpAmigaGerman), kEoB2CharGuiStringsHpAmigaGerman };
+
+static const char *const kEoB2CharGuiStringsWp2AmigaGerman[3] = {
+ "WUSCH",
+ "HACK",
+ "FATZ"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWp2AmigaGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsWp2AmigaGerman), kEoB2CharGuiStringsWp2AmigaGerman };
+
+static const char *const kEoB2CharGuiStringsWrAmigaGerman[4] = {
+ " ZU ",
+ "WEIT",
+ "OHNE",
+ "MUN"
+};
+
+static const StringListProvider kEoB2CharGuiStringsWrAmigaGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsWrAmigaGerman), kEoB2CharGuiStringsWrAmigaGerman };
+
+static const char *const kEoB2CharGuiStringsSt2AmigaGerman[7] = {
+ "TAUSCHE",
+ "TOT",
+ "BEWUSSTLOS",
+ "GIFT (LANGSAM)",
+ "VERGIFTET",
+ "BET""\xc4""UBT",
+ "AUS STEIN"
+};
+
+static const StringListProvider kEoB2CharGuiStringsSt2AmigaGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsSt2AmigaGerman), kEoB2CharGuiStringsSt2AmigaGerman };
+
+static const char *const kEoB2CharGuiStringsInAmigaGerman[4] = {
+ "CHARAKTER INFO",
+ "R""\xdc""STUNGSKL.",
+ "ERF",
+ "STF"
+};
+
+static const StringListProvider kEoB2CharGuiStringsInAmigaGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsInAmigaGerman), kEoB2CharGuiStringsInAmigaGerman };
+
+static const char *const kEoB2CharStatusStrings7AmigaGerman[1] = {
+ "%s hat nicht l""\xe4""nger riesenkr""\xe4""fte.\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings7AmigaGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings7AmigaGerman), kEoB2CharStatusStrings7AmigaGerman };
+
+static const char *const kEoB2CharStatusStrings82AmigaGerman[1] = {
+ "\x06\x06""%s f""\xfc""hlt Gift in sich!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings82AmigaGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings82AmigaGerman), kEoB2CharStatusStrings82AmigaGerman };
+
+static const char *const kEoB2CharStatusStrings9AmigaGerman[1] = {
+ "\x06\x04""%s ist nicht l""\xe4""nger bet""\xe4""ubt!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings9AmigaGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings9AmigaGerman), kEoB2CharStatusStrings9AmigaGerman };
+
+static const char *const kEoB2CharStatusStrings12AmigaGerman[1] = {
+ "%s wird langsamer.\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings12AmigaGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings12AmigaGerman), kEoB2CharStatusStrings12AmigaGerman };
+
+static const char *const kEoB2CharStatusStrings132AmigaGerman[1] = {
+ "\x06\x06""%s %s!\r"
+};
+
+static const StringListProvider kEoB2CharStatusStrings132AmigaGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings132AmigaGerman), kEoB2CharStatusStrings132AmigaGerman };
+
+static const char *const kEoB2LevelGainStringsAmigaGerman[1] = {
+ "\x06\x01""%s steigt eine Stufe auf.""\x06\x0f""\r"
+};
+
+static const StringListProvider kEoB2LevelGainStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2LevelGainStringsAmigaGerman), kEoB2LevelGainStringsAmigaGerman };
+
+static const char *const kEoB2BookNumbersAmigaGerman[5] = {
+ "Erste",
+ "Zweite",
+ "Dritte",
+ "Vierte",
+ "F""\xfc""nfte"
+};
+
+static const StringListProvider kEoB2BookNumbersAmigaGermanProvider = { ARRAYSIZE(kEoB2BookNumbersAmigaGerman), kEoB2BookNumbersAmigaGerman };
+
+static const char *const kEoB2MageSpellsListAmigaGerman[33] = {
+ "",
+ "Panzer",
+ "Brennende H""\xe4""nde",
+ "Magie entdecken",
+ "Magisch. Geschoss",
+ "Schild",
+ "Schockgriff",
+ "Verschwimmen",
+ "Unsichtb. entd.",
+ "Identifiziern+",
+ "Unsichtbarkeit",
+ "M's S""\xe4""urepfeil",
+ "Magie bannen",
+ "Feuerball",
+ "Hast",
+ "Person halten",
+ "Unsichtb. 3m",
+ "Blitzstrahl",
+ "Vampirgriff",
+ "Furcht",
+ "Eissturm",
+ "Unsichtbarkeit+",
+ "Fluch brechen",
+ "K""\xe4""ltekegel",
+ "Monster halten",
+ "Kraftfeld",
+ "Aufl""\xf6""sung",
+ "Fleisch zu Stein",
+ "Stein zu Fleisch",
+ "Wahrer Blick",
+ "Todesfinger",
+ "Wort:Bet""\xe4""ubung",
+ "Bigbys Faust"
+};
+
+static const StringListProvider kEoB2MageSpellsListAmigaGermanProvider = { ARRAYSIZE(kEoB2MageSpellsListAmigaGerman), kEoB2MageSpellsListAmigaGerman };
+
+static const char *const kEoB2ClericSpellsListAmigaGerman[30] = {
+ "",
+ "Segen",
+ "Leicht verwunden",
+ "L. Wunden heilen",
+ "Magie entdecken",
+ "Schutz v. B""\xf6""sem",
+ "St""\xe4""rkung",
+ "Flammenklinge",
+ "Person halten",
+ "Gift verlangs.",
+ "Nahr. erschaffen",
+ "Magie bannen",
+ "Schutzgewand",
+ "Gebet",
+ "L""\xe4""hmung aufheben",
+ "Schwer verwunden",
+ "S. Wunden heilen",
+ "Gift neutr.",
+ "Schutz-B""\xf6""ses 3m",
+ "Kritisch verw.",
+ "K. Wunden heilen",
+ "Flammenschlag",
+ "Tote erwecken",
+ "Schneller Tod",
+ "Wahrer Blick",
+ "Leid",
+ "Heilung",
+ "Auferstehung",
+ "Handauflegen",
+ "Untote abwenden"
+};
+
+static const StringListProvider kEoB2ClericSpellsListAmigaGermanProvider = { ARRAYSIZE(kEoB2ClericSpellsListAmigaGerman), kEoB2ClericSpellsListAmigaGerman };
+
+static const char *const kEoB2SpellNamesAmigaGerman[68] = {
+ "panzer",
+ "brennende H""\xe4""nde",
+ "magie entdecken",
+ "magisches Geschoss",
+ "schild",
+ "schockgriff",
+ "verschwimmen",
+ "unsichtbares entdecken",
+ "verbessertes identifizieren",
+ "unsichtbarkeit",
+ "melfs S""\xe4""urepfeil",
+ "magie bannen",
+ "feuerball",
+ "hast",
+ "person halten",
+ "unsichtbarkeit 3m",
+ "blitzschlag",
+ "vampirgriff",
+ "furcht",
+ "eissturm",
+ "verbesserte Unsichtbarkeit",
+ "fluch brechen",
+ "k""\xe4""ltekegel",
+ "monster halten",
+ "kraftfeld",
+ "aufl""\xf6""sung",
+ "fleisch zu stein",
+ "stein zu fleisch",
+ "wahrer Blick",
+ "Todesfinger",
+ "wort der Macht: Bet""\xe4""ubung",
+ "bigbys geballte Faust",
+ "segen",
+ "leichte Wunden verursachen",
+ "leichte Wunden heilen",
+ "magie entdecken",
+ "schutz vor B""\xf6""sem",
+ "st""\xe4""rkung",
+ "flammenklinge",
+ "person halten",
+ "gift verlangsamen",
+ "nahrung erschaffen",
+ "magie bannen",
+ "schutzgewand",
+ "gebet",
+ "l""\xe4""hmung aufheben",
+ "schwere wunden verursachen",
+ "schwere wunden heilen",
+ "gift neutralisieren",
+ "schutz vor b""\xf6""sem 3m",
+ "kritische wunden verursachen",
+ "kritische wunden heilen",
+ "flammenschlag",
+ "tote erwecken",
+ "schneller tot",
+ "wahrer blick",
+ "leid",
+ "heilung",
+ "auferstehung",
+ "hand auflegen",
+ "untote abwenden",
+ "",
+ "mystische abwehr",
+ "",
+ "",
+ "",
+ "",
+ ""
+};
+
+static const StringListProvider kEoB2SpellNamesAmigaGermanProvider = { ARRAYSIZE(kEoB2SpellNamesAmigaGerman), kEoB2SpellNamesAmigaGerman };
+
+static const char *const kEoB2MagicStrings1AmigaGerman[6] = {
+ "ABBRECHEN",
+ "ABBRECHEN",
+ "Man braucht eine freie Hand f""\xfc""r diesen Zauber.\r",
+ "Von diesen Zaubern kann man nur einen aktivieren.\r",
+ "%s zaubert %s.\r",
+ "\rok\r"
+};
+
+static const StringListProvider kEoB2MagicStrings1AmigaGermanProvider = { ARRAYSIZE(kEoB2MagicStrings1AmigaGerman), kEoB2MagicStrings1AmigaGerman };
+
+static const char *const kEoB2MagicStrings2AmigaGerman[5] = {
+ "Der Zauber versagt!\r",
+ "%s wurde aufgel""\xf6""st!\r",
+ "\x06\x06""Die Party wurde von einem Todeszauber getroffen!\r",
+ "\x06\x06""%s wurde von einem schwer verwunden Zauber getroffen.\r",
+ "AUS STEIN"
+};
+
+static const StringListProvider kEoB2MagicStrings2AmigaGermanProvider = { ARRAYSIZE(kEoB2MagicStrings2AmigaGerman), kEoB2MagicStrings2AmigaGerman };
+
+static const char *const kEoB2MagicStrings3AmigaGerman[5] = {
+ "Wen verzaubern? ",
+ "\rSpruch abgebrochen.\r",
+ "%s's %s Zauber l""\xe4""sst nach.\r",
+ "%s verfehlt das Monster.\r",
+ "%s muss vorn stehen um zu treffen!\r"
+};
+
+static const StringListProvider kEoB2MagicStrings3AmigaGermanProvider = { ARRAYSIZE(kEoB2MagicStrings3AmigaGerman), kEoB2MagicStrings3AmigaGerman };
+
+static const char *const kEoB2MagicStrings4AmigaGerman[1] = {
+ "keine Wirkung.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings4AmigaGermanProvider = { ARRAYSIZE(kEoB2MagicStrings4AmigaGerman), kEoB2MagicStrings4AmigaGerman };
+
+static const char *const kEoB2MagicStrings6AmigaGerman[1] = {
+ "%s hat schon eine R""\xfc""stungklasse ""\xfc""ber 6."
+};
+
+static const StringListProvider kEoB2MagicStrings6AmigaGermanProvider = { ARRAYSIZE(kEoB2MagicStrings6AmigaGerman), kEoB2MagicStrings6AmigaGerman };
+
+static const char *const kEoB2MagicStrings7AmigaGerman[2] = {
+ "%s steht schon unter dem effekt eines %s spruches.\r",
+ "die party steht schon unter dem effekt eines %s spruches.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings7AmigaGermanProvider = { ARRAYSIZE(kEoB2MagicStrings7AmigaGerman), kEoB2MagicStrings7AmigaGerman };
+
+static const char *const kEoB2MagicStrings8AmigaGerman[6] = {
+ "Der Zauber versagt!\r",
+ "ist gel""\xe4""hmt",
+ "Der Zauber versagt!\r",
+ "Der Zauber versagt!\r",
+ "Kein Monster in Reichweite!\r",
+ "%s steht bereits unter einem St""\xe4""rkungszauber.\r"
+};
+
+static const StringListProvider kEoB2MagicStrings8AmigaGermanProvider = { ARRAYSIZE(kEoB2MagicStrings8AmigaGerman), kEoB2MagicStrings8AmigaGerman };
+
+static const byte kEoB2ManDefAmigaGerman[200] = {
+ 0x09, 0x01, 0x03, 0x00, 0x09, 0x01, 0x06, 0x00,
+ 0x09, 0x02, 0x07, 0x00, 0x14, 0x01, 0x01, 0x00,
+ 0x14, 0x02, 0x01, 0x00, 0x14, 0x04, 0x02, 0x00,
+ 0x1A, 0x01, 0x03, 0x00, 0x1A, 0x02, 0x02, 0x00,
+ 0x1A, 0x07, 0x04, 0x00, 0x15, 0x01, 0x02, 0x00,
+ 0x15, 0x01, 0x05, 0x00, 0x15, 0x02, 0x01, 0x00,
+ 0x15, 0x03, 0x04, 0x00, 0x15, 0x04, 0x01, 0x00,
+ 0x15, 0x05, 0x05, 0x00, 0x23, 0x01, 0x02, 0x00,
+ 0x23, 0x01, 0x05, 0x00, 0x23, 0x02, 0x03, 0x00,
+ 0x23, 0x03, 0x01, 0x00, 0x23, 0x06, 0x03, 0x00,
+ 0x23, 0x0A, 0x06, 0x00, 0x26, 0x01, 0x01, 0x00,
+ 0x26, 0x01, 0x03, 0x00, 0x26, 0x01, 0x05, 0x00,
+ 0x26, 0x02, 0x04, 0x00, 0x26, 0x03, 0x02, 0x00,
+ 0x26, 0x04, 0x01, 0x00, 0x17, 0x01, 0x02, 0x00,
+ 0x17, 0x01, 0x04, 0x00, 0x17, 0x01, 0x05, 0x00,
+ 0x17, 0x02, 0x02, 0x00, 0x17, 0x03, 0x03, 0x00,
+ 0x17, 0x07, 0x01, 0x00, 0x12, 0x01, 0x02, 0x00,
+ 0x12, 0x01, 0x07, 0x00, 0x12, 0x03, 0x01, 0x00,
+ 0x12, 0x04, 0x02, 0x00, 0x12, 0x05, 0x02, 0x00,
+ 0x12, 0x06, 0x05, 0x00, 0x12, 0x07, 0x03, 0x00,
+ 0x12, 0x08, 0x01, 0x00, 0x1F, 0x01, 0x05, 0x00,
+ 0x1F, 0x02, 0x06, 0x00, 0x1F, 0x03, 0x02, 0x00,
+ 0x1F, 0x03, 0x01, 0x00, 0x1F, 0x04, 0x01, 0x00,
+ 0x1F, 0x04, 0x03, 0x00, 0x1C, 0x01, 0x01, 0x00,
+ 0x1C, 0x01, 0x03, 0x00, 0x1C, 0x02, 0x01, 0x00
+};
+
+static const ByteProvider kEoB2ManDefAmigaGermanProvider = { ARRAYSIZE(kEoB2ManDefAmigaGerman), kEoB2ManDefAmigaGerman };
+
+static const char *const kEoB2ManWordAmigaGerman[51] = {
+ "teil",
+ "geht",
+ "maus",
+ "um",
+ "einer",
+ "kann",
+ "das",
+ "schalter",
+ "der",
+ "einem",
+ "gnome",
+ "magieresistent",
+ "intelligenz",
+ "weisheit",
+ "dieb",
+ "weiter",
+ "setzen",
+ "ein",
+ "magier",
+ "diese",
+ "sind",
+ "eines",
+ "wodurch",
+ "schwerer",
+ "gute",
+ "bonus",
+ "bogen",
+ "und",
+ "dadurch",
+ "oft",
+ "raubt",
+ "keine",
+ "schrift",
+ "waffen",
+ "unterteilt",
+ "vordersten",
+ "nur",
+ "sie",
+ "klassen",
+ "zeigt",
+ "gegen",
+ "mausknopf",
+ "nahrungsbalken",
+ "charakters",
+ "des",
+ "um",
+ "gegenstand",
+ "durch",
+ "spruch",
+ "unsichtbar",
+ ""
+};
+
+static const StringListProvider kEoB2ManWordAmigaGermanProvider = { ARRAYSIZE(kEoB2ManWordAmigaGerman), kEoB2ManWordAmigaGerman };
+
+static const char *const kEoB2ManPromptAmigaGerman[1] = {
+ "\r\r\r\rAuf der Seite mit diesem Symbol...\r\rFinde Zeile %d\rGib Wort %d ein\r"
+};
+
+static const StringListProvider kEoB2ManPromptAmigaGermanProvider = { ARRAYSIZE(kEoB2ManPromptAmigaGerman), kEoB2ManPromptAmigaGerman };
+
+static const char *const kEoB2MainMenuStringsAmigaGerman[5] = {
+ "ALTES SPIEL LADEN\r",
+ "NEUE PARTY ERSTELLEN\r",
+ "EOB I PARTY TRANSFER\r",
+ "INTRO ANSEHEN\r",
+ "FORMATIEREN\r"
+};
+
+static const StringListProvider kEoB2MainMenuStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2MainMenuStringsAmigaGerman), kEoB2MainMenuStringsAmigaGerman };
+
+static const char *const kEoB2TransferStrings1AmigaGerman[2] = {
+ "Stufe: %d",
+ " / %d"
+};
+
+static const StringListProvider kEoB2TransferStrings1AmigaGermanProvider = { ARRAYSIZE(kEoB2TransferStrings1AmigaGerman), kEoB2TransferStrings1AmigaGerman };
+
+static const char *const kEoB2TransferStrings2AmigaGerman[2] = {
+ "Dieses Abenteuer ist nur f""\xfc""r vier Charaktere.",
+ "OK w""\xe4""hlen, wenn Partyerstellung beendet."
+};
+
+static const StringListProvider kEoB2TransferStrings2AmigaGermanProvider = { ARRAYSIZE(kEoB2TransferStrings2AmigaGerman), kEoB2TransferStrings2AmigaGerman };
+
+static const char *const kEoB2TransferLabelsAmigaGerman[2] = {
+ "ABBR.",
+ "OK"
+};
+
+static const StringListProvider kEoB2TransferLabelsAmigaGermanProvider = { ARRAYSIZE(kEoB2TransferLabelsAmigaGerman), kEoB2TransferLabelsAmigaGerman };
+
+static const char *const kEoB2IntroStringsAmigaGerman[20] = {
+ "Ihr hattet euch gerade gem""\xfc""tlich am \rKamin niedergelassen.",
+ "Da wurde euch eine Botschaft\rzugespielt.",
+ "Sie war von eurem Freund Khelben \rBlackstaff, dem Erzmagier der Stadt.",
+ "Die Mitteilung war dringend.",
+ "Was konnte Khelben nur wollen?",
+ "Willkommen, bitte tretet ein.",
+ "Khelben erwartet euch im Studierzimmer.",
+ "Danke f""\xfc""r euer schnelles Kommen.",
+ "Meine Freunde, ich bin besorgt.",
+ "Uralte, b""\xf6""se M""\xe4""chte rumoren im \rTempel Darkmoon.",
+ "Ich f""\xfc""rchte um die Sicherheit \runserer Stadt.",
+ "Ich brauche eure Hilfe...",
+ "Vor drei N""\xe4""chten \rentsandte ich einen Kundschafter.",
+ "Sie kam niemals zur""\xfc""ck.",
+ "Ich f""\xfc""rchte um ihr Leben.",
+ "Nehmt diese M""\xfc""nze.",
+ "Mit ihrer Hilfe werde \rich euch erreichen.",
+ "Ihr m""\xfc\xdf""t schnell handeln.",
+ "Ich teleportiere euch nun in \rdie N""\xe4""he von Darkmoon.",
+ "M""\xf6""ge das Gl""\xfc""ck auf eurer Seite\rsein, Freunde."
+};
+
+static const StringListProvider kEoB2IntroStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2IntroStringsAmigaGerman), kEoB2IntroStringsAmigaGerman };
+
+static const char *const kEoB2IntroCPSFilesAmigaGerman[16] = {
+ "STREET1.CPS",
+ "STREET2.CPS",
+ "DOORWAY1.CPS",
+ "DOORWAY2.CPS",
+ "WESTWOOD1.CPS",
+ "WINDING.CPS",
+ "KHELBAN2.CPS",
+ "KHELBAN1.CPS",
+ "KHELBAN3.CPS",
+ "KHELBAN4.CPS",
+ "COIN.CPS",
+ "KHELBAN5.CPS",
+ "KHELBAN6.CPS",
+ "WESTWOOD1.CPS",
+ "WESTWOOD3.CPS",
+ "WESTWOOD3.CPS"
+};
+
+static const StringListProvider kEoB2IntroCPSFilesAmigaGermanProvider = { ARRAYSIZE(kEoB2IntroCPSFilesAmigaGerman), kEoB2IntroCPSFilesAmigaGerman };
+
+static const char *const kEoB2FinaleStringsAmigaGerman[20] = {
+ "Nun endlich wurde Dran besiegt.",
+ "Pl""\xf6""tzlich erscheint euer Freund \rKhelben.",
+ "Seid gegr""\xfc\xdf""t, meine siegreichen \rFreunde.",
+ "Ihr seid die Bezwinger von Dran!",
+ "Ich hatte keine Ahnung, da""\xdf"" \rDran ein Drache war.",
+ "Er mu""\xdf"" ""\xfc""ber 300 Jahre alt \rgewesen sein!",
+ "Seine Macht ist vergangen.",
+ "Noch immer ist Darkmoon\reine Quelle des B""\xf6""sen.",
+ "Und ein Teil seines Gefolges\rexistiert noch.",
+ "Daher m""\xfc""ssen wir diesen Platz\rnun verlassen.",
+ "So da""\xdf"" meine Kr""\xe4""fte ihn ein\r f""\xfc""r allemal\rzerst""\xf6""ren k""\xf6""nnen.",
+ "Folgt mir.",
+ "M""\xe4""chtige Magier sind bereit\rf""\xfc""r den letzten Schlag\rgegen Darkmoon.",
+ "Das B""\xf6""se im Tempel ist sehr stark.",
+ "Es darf keinesfalls weiter\rbestehen!",
+ "Der Tempel h""\xf6""rt auf zu\rexistieren.",
+ "Unsere Arbeit ist nun getan,\rmeine Freunde.",
+ "Seid bedankt.",
+ "Ihr habt Euch meinen tiefen\r Respekt erk""\xe4""mpft.",
+ "Wir werden Euch nie vergessen."
+};
+
+static const StringListProvider kEoB2FinaleStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2FinaleStringsAmigaGerman), kEoB2FinaleStringsAmigaGerman };
+
+static const char *const kEoB2FinaleCPSFilesAmigaGerman[13] = {
+ "DRAGON1.CPS",
+ "DRAGON2.CPS",
+ "HURRY1.CPS",
+ "HURRY2.CPS",
+ "DESTROY0.CPS",
+ "DESTROY1.CPS",
+ "DESTROY2.CPS",
+ "MAGIC.CPS",
+ "DESTROY3.CPS",
+ "CREDITS2.CPS",
+ "CREDITS3.CPS",
+ "HEROES.CPS",
+ "THANKS.CPS"
+};
+
+static const StringListProvider kEoB2FinaleCPSFilesAmigaGermanProvider = { ARRAYSIZE(kEoB2FinaleCPSFilesAmigaGerman), kEoB2FinaleCPSFilesAmigaGerman };
+
+static const char *const kEoB2MonsterDistAttStringsAmigaGerman[5] = {
+ "Die Party wurde von einem psychischen Angriff getroffen!\r",
+ "paralysiert",
+ "vergiftet",
+ "bet""\xe4""ubt",
+ "versteinert"
+};
+
+static const StringListProvider kEoB2MonsterDistAttStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2MonsterDistAttStringsAmigaGerman), kEoB2MonsterDistAttStringsAmigaGerman };
+
+static const char *const kEoB2Npc1StringsAmigaGerman[2] = {
+ "reden",
+ "weiter"
+};
+
+static const StringListProvider kEoB2Npc1StringsAmigaGermanProvider = { ARRAYSIZE(kEoB2Npc1StringsAmigaGerman), kEoB2Npc1StringsAmigaGerman };
+
+static const char *const kEoB2Npc2StringsAmigaGerman[2] = {
+ "freilassen",
+ "weiterziehen"
+};
+
+static const StringListProvider kEoB2Npc2StringsAmigaGermanProvider = { ARRAYSIZE(kEoB2Npc2StringsAmigaGerman), kEoB2Npc2StringsAmigaGerman };
+
+static const char *const kEoB2MonsterDustStringsAmigaGerman[1] = {
+ "Das Monster vergeht zu staub!\r"
+};
+
+static const StringListProvider kEoB2MonsterDustStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2MonsterDustStringsAmigaGerman), kEoB2MonsterDustStringsAmigaGerman };
+
+static const char *const kEoB2KheldranStringsAmigaGerman[1] = {
+ " Diese Narren!"
+};
+
+static const StringListProvider kEoB2KheldranStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2KheldranStringsAmigaGerman), kEoB2KheldranStringsAmigaGerman };
+
+static const char *const kEoB2HornStringsAmigaGerman[4] = {
+ "Ein br""\xfc""llendes Ger""\xe4""usch kommt aus dem Horn.\r",
+ "Ein hohler Ton dringt aus dem Horn.\r",
+ "Ein melodischer Ton klingt aus dem Horn.\r",
+ "Ein unheimliches Ger""\xe4""usch entweicht dem Horn.\r"
+};
+
+static const StringListProvider kEoB2HornStringsAmigaGermanProvider = { ARRAYSIZE(kEoB2HornStringsAmigaGerman), kEoB2HornStringsAmigaGerman };
+
diff --git a/devtools/create_kyradat/resources/eob2_dos_english.h b/devtools/create_kyradat/resources/eob2_dos_english.h
index 3fdf26d..fb82783 100644
--- a/devtools/create_kyradat/resources/eob2_dos_english.h
+++ b/devtools/create_kyradat/resources/eob2_dos_english.h
@@ -556,7 +556,7 @@ static const char *const kEoB2CharStatusStrings82DOSEnglish[1] = {
static const StringListProvider kEoB2CharStatusStrings82DOSEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings82DOSEnglish), kEoB2CharStatusStrings82DOSEnglish };
static const char *const kEoB2CharStatusStrings9DOSEnglish[1] = {
- "%s is no longer paralyzed!\r"
+ "\x06\x04""%s is no longer paralyzed!\r"
};
static const StringListProvider kEoB2CharStatusStrings9DOSEnglishProvider = { ARRAYSIZE(kEoB2CharStatusStrings9DOSEnglish), kEoB2CharStatusStrings9DOSEnglish };
diff --git a/devtools/create_kyradat/resources/eob2_dos_german.h b/devtools/create_kyradat/resources/eob2_dos_german.h
index 6445d13..ef9199d 100644
--- a/devtools/create_kyradat/resources/eob2_dos_german.h
+++ b/devtools/create_kyradat/resources/eob2_dos_german.h
@@ -516,7 +516,7 @@ static const char *const kEoB2CharGuiStringsWp2DOSGerman[3] = {
static const StringListProvider kEoB2CharGuiStringsWp2DOSGermanProvider = { ARRAYSIZE(kEoB2CharGuiStringsWp2DOSGerman), kEoB2CharGuiStringsWp2DOSGerman };
static const char *const kEoB2CharGuiStringsWrDOSGerman[4] = {
- "ZU",
+ " ZU ",
"WEIT",
"OHNE",
"MUN"
@@ -558,7 +558,7 @@ static const char *const kEoB2CharStatusStrings82DOSGerman[1] = {
static const StringListProvider kEoB2CharStatusStrings82DOSGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings82DOSGerman), kEoB2CharStatusStrings82DOSGerman };
static const char *const kEoB2CharStatusStrings9DOSGerman[1] = {
- "%s ist nicht l""\x84""nger bet""\x84""ubt!\r"
+ "\x06\x04""%s ist nicht l""\x84""nger bet""\x84""ubt!\r"
};
static const StringListProvider kEoB2CharStatusStrings9DOSGermanProvider = { ARRAYSIZE(kEoB2CharStatusStrings9DOSGerman), kEoB2CharStatusStrings9DOSGerman };
diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat
index 20114e5..4c65122 100644
Binary files a/dists/engine-data/kyra.dat and b/dists/engine-data/kyra.dat differ
diff --git a/engines/kyra/resource/resource.h b/engines/kyra/resource/resource.h
index 02415cf..cbd442f 100644
--- a/engines/kyra/resource/resource.h
+++ b/engines/kyra/resource/resource.h
@@ -492,9 +492,9 @@ enum KyraResources {
kEoBBaseSoundFilesIntro,
kEoBBaseSoundFilesIngame,
kEoBBaseSoundFilesFinale,
+ kEoBBaseLevelSounds1,
+ kEoBBaseLevelSounds2,
- kEoB1BaseLevelSounds1,
- kEoB1BaseLevelSounds2,
kEoB1MainMenuStrings,
kEoB1BonusStrings,
@@ -632,6 +632,9 @@ enum KyraResources {
kEoB2IntroShapes01,
kEoB2IntroShapes04,
kEoB2IntroShapes07,
+ kEoB2IntroShapes13,
+ kEoB2IntroShapes14,
+ kEoB2IntroShapes15,
kEoB2FinaleStrings,
kEoB2CreditsData,
@@ -930,6 +933,12 @@ enum KyraResources {
kEoB2PcmSoundEffectsIntro,
kEoB2PcmSoundEffectsFinale,
+ kEoB2SoundMapExtra,
+ kEoB2SoundIndex1,
+ kEoB2SoundIndex2,
+ kEoB2SoundFilesIngame2,
+ kEoB2MonsterSoundPatchData,
+
kLoLIngamePakFiles,
kLoLCharacterDefs,
kLoLIngameSfxFiles,
diff --git a/engines/kyra/resource/staticres.cpp b/engines/kyra/resource/staticres.cpp
index e569cf1..fcf3158 100644
--- a/engines/kyra/resource/staticres.cpp
+++ b/engines/kyra/resource/staticres.cpp
@@ -39,7 +39,7 @@
namespace Kyra {
-#define RESFILE_VERSION 93
+#define RESFILE_VERSION 94
namespace {
bool checkKyraDat(Common::SeekableReadStream *file) {
diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index 7ff439d..a75c464 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -24,6 +24,8 @@
#include "kyra/resource/resource.h"
#include "kyra/sound/sound_intern.h"
+#include "common/memstream.h"
+
namespace Kyra {
@@ -1390,18 +1392,19 @@ void DarkMoonEngine::initSpells() {
EoBCoreEngine::initSpells();
int temp;
- const uint8 *src = _staticres->loadRawData(kEoBBaseSpellProperties, temp);
+ const uint8 *data = _staticres->loadRawData(kEoBBaseSpellProperties, temp);
+ Common::MemoryReadStreamEndian *src = new Common::MemoryReadStreamEndian(data, temp, _flags.platform == Common::kPlatformAmiga);
for (int i = 0; i < _numSpells; i++) {
EoBSpell *s = &_spells[i];
- src += 8;
- s->flags = READ_LE_UINT16(src);
- src += 10;
- s->sound = *src++;
- s->effectFlags = READ_LE_UINT32(src);
- src += 4;
- s->damageFlags = READ_LE_UINT16(src);
- src += 2;
+ src->skip(8);
+ s->flags = src->readUint16();
+ src->skip(8);
+ s->sound = src->readByte();
+ if (_flags.platform == Common::kPlatformAmiga)
+ src->skip(1);
+ s->effectFlags = src->readUint32();
+ s->damageFlags = src->readUint16();
}
}
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index 56bcbba..c1fd9e6 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -833,11 +833,11 @@ void DarkMoonEngine::seq_playFinale() {
snd_playSong(_flags.platform == Common::kPlatformFMTowns ? 16 : 1);
int temp = 0;
- const uint8 *creditsData = (_flags.platform == Common::kPlatformFMTowns) ? _res->fileData("CREDITS.TXT", 0) : _staticres->loadRawData(kEoB2CreditsData, temp);
+ const uint8 *creditsData = (_flags.platform != Common::kPlatformDOS) ? _res->fileData("CREDITS.TXT", 0) : _staticres->loadRawData(kEoB2CreditsData, temp);
seq_playCredits(&sq, creditsData, 18, 2, 6, 2);
- if (_flags.platform == Common::kPlatformFMTowns)
+ if (_flags.platform != Common::kPlatformDOS)
delete[] creditsData;
sq.delay(90);
diff --git a/engines/kyra/sound/sound_amiga_eob.cpp b/engines/kyra/sound/sound_amiga_eob.cpp
index d2cf976..eccf380 100644
--- a/engines/kyra/sound/sound_amiga_eob.cpp
+++ b/engines/kyra/sound/sound_amiga_eob.cpp
@@ -52,8 +52,8 @@ bool SoundAmiga_EoB::init() {
return false;
int temp = 0;
- _levelSoundList1 = _vm->staticres()->loadStrings(kEoB1BaseLevelSounds1, temp);
- _levelSoundList2 = _vm->staticres()->loadStrings(kEoB1BaseLevelSounds2, temp);
+ _levelSoundList1 = _vm->staticres()->loadStrings(kEoBBaseLevelSounds1, temp);
+ _levelSoundList2 = _vm->staticres()->loadStrings(kEoBBaseLevelSounds2, temp);
_ready = true;
return true;
Commit: 8c92e045ce59f456be5b2a3f51b558f9abc9d472
https://github.com/scummvm/scummvm/commit/8c92e045ce59f456be5b2a3f51b558f9abc9d472
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:57+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix load up and intro sequence
Changed paths:
engines/kyra/engine/chargen.cpp
engines/kyra/engine/eobcommon.cpp
engines/kyra/engine/eobcommon.h
engines/kyra/graphics/screen.cpp
engines/kyra/graphics/screen_eob.cpp
engines/kyra/graphics/screen_eob.h
engines/kyra/sequence/sequences_darkmoon.cpp
engines/kyra/sequence/sequences_eob.cpp
diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 7adca7f..2fc1586 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -637,7 +637,7 @@ int CharacterGenerator::getInput(Button *buttonList) {
if (_vm->game() == GI_EOB1 && _vm->sound()->checkTrigger()) {
_vm->sound()->resetTrigger();
_vm->snd_playSong(20);
- } else if (_vm->game() == GI_EOB2 && !_vm->sound()->isPlaying()) {
+ } else if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform != Common::kPlatformAmiga && !_vm->sound()->isPlaying()) {
// WORKAROUND for EOB II: The original implements the same sound trigger check as in EOB I.
// However, Westwood seems to have forgotten to set the trigger at the end of the AdLib song,
// so that the music will not loop. We simply check whether the sound driver is still playing.
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 7bd187e..26a23aa 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -2630,8 +2630,8 @@ void EoBCoreEngine::snd_stopSound() {
_sound->stopAllSoundEffects();
}
-void EoBCoreEngine::snd_fadeOut() {
- _sound->beginFadeOut();
+void EoBCoreEngine::snd_fadeOut(int delay) {
+ _sound->beginFadeOut(delay);
}
} // End of namespace Kyra
diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h
index c7f3fbc..3566ea4 100644
--- a/engines/kyra/engine/eobcommon.h
+++ b/engines/kyra/engine/eobcommon.h
@@ -1179,7 +1179,7 @@ protected:
void snd_playSong(int id);
void snd_playSoundEffect(int id, int volume=0xFF);
void snd_stopSound();
- void snd_fadeOut();
+ void snd_fadeOut(int speed = 160);
// keymap
static const char *const kKeymapName;
diff --git a/engines/kyra/graphics/screen.cpp b/engines/kyra/graphics/screen.cpp
index 44b6fad..5717319 100644
--- a/engines/kyra/graphics/screen.cpp
+++ b/engines/kyra/graphics/screen.cpp
@@ -3349,11 +3349,13 @@ bool Screen::loadPaletteTable(const char *filename, int firstPalette) {
void Screen::loadPalette(const byte *data, Palette &pal, int bytes) {
Common::MemoryReadStream stream(data, bytes, DisposeAfterUse::NO);
- if (_isAmiga)
- pal.loadAmigaPalette(stream, 0, stream.size() / Palette::kAmigaBytesPerColor);
- else if (_vm->gameFlags().platform == Common::kPlatformPC98 && _use16ColorMode)
+ if (_isAmiga) {
+ // EOB II Amiga sometimes has multiple palettes here one after
+ // the other (64 bytes each). We only load the first one here.
+ pal.loadAmigaPalette(stream, 0, MIN(32, stream.size() / Palette::kAmigaBytesPerColor));
+ } else if (_vm->gameFlags().platform == Common::kPlatformPC98 && _use16ColorMode) {
pal.loadPC98Palette(stream, 0, stream.size() / Palette::kPC98BytesPerColor);
- else if (_renderMode == Common::kRenderEGA) {
+ } else if (_renderMode == Common::kRenderEGA) {
// EOB II checks the number of palette bytes to distinguish between real EGA palettes
// and normal palettes (which are used to generate a color map).
if (stream.size() == 16)
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index 4cd471e..33f4bab 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -228,16 +228,25 @@ void Screen_EoB::loadBitmap(const char *filename, int tempPage, int dstPage, Pal
Common::SeekableReadStream *str = _vm->resource()->createReadStream(filename);
str->skip(4);
uint32 imgSize = str->readUint32LE();
- delete str;
if (_isAmiga && !skip) {
- if ((dstPage == 3 || dstPage == 4) && imgSize == 40064) {
+ if (_vm->game() == GI_EOB1 && (dstPage == 3 || dstPage == 4) && imgSize == 40064) {
// Yay, this is where EOB1 Amiga hides the palette data
loadPalette(_pagePtrs[dstPage] + 40000, *_palettes[0], 64);
_palettes[0]->fill(0, 1, 0);
+ } else if (_vm->game() == GI_EOB2) {
+ uint16 palSize = str->readUint16LE();
+ // EOB II Amiga CPS files may contain more than one palette (each one 64 bytes,
+ // one after the other). We load them all...
+ if (pal && palSize) {
+ for (int i = 1; i <= palSize >> 6; ++i)
+ _palettes[i]->loadAmigaPalette(*str, 0, 32);
+ }
}
Screen::convertAmigaGfx(getPagePtr(dstPage), 320, 200);
}
+
+ delete str;
}
void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int tempPage, int destPage, int convertToPage) {
@@ -251,12 +260,24 @@ void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int te
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
+ if (s->size() == 0) {
loadAlternative = true;
+
+ // This check is due to EOB II Amiga German.That version simply checks
+ // for certain file names which aren't actual CPS files. The files contain
+ // raw data. I check the header size info to identify these.
+ } else if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ // Tolerance for diffenrences up to 2 bytes is needed in some cases
+ if ((((s->readUint16LE()) + 5) & ~3) != (((s->size()) + 3) & ~3))
+ loadAlternative = true;
+ }
+
+ if (!loadAlternative)
+ loadBitmap(tmp.c_str(), tempPage, destPage, 0);
+
} else {
loadAlternative = true;
}
@@ -267,11 +288,28 @@ void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int te
if (_vm->game() == GI_EOB1) {
tmp.insertChar('1', tmp.size() - 4);
loadBitmap(tmp.c_str(), tempPage, destPage, 0);
+
+ } else if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ s = _vm->resource()->createReadStream(tmp);
+ if (!s)
+ error("Screen_EoB::loadEoBBitmap(): Failed to load file '%s'", file);
+
+ // See comment above. In addition to checking for certain file names which
+ // aren't real CPS files the EOB II Amiga German makes a specific check for CHARGEN.CPS
+ // which contains palette data at the beginning. For now I haven't come up
+ // with a way of avoiding this hack.
+ if (tmp.equals("CHARGEN.CPS"))
+ _palettes[0]->loadAmigaPalette(*s, 0, 32);
+
+ loadFileDataToPage(s, destPage, 40000);
+
} else {
tmp.setChar('X', 0);
s = _vm->resource()->createReadStream(tmp);
+
if (!s)
error("Screen_EoB::loadEoBBitmap(): Failed to load file '%s'", file);
+
s->seek(768);
loadFileDataToPage(s, destPage, 64000);
delete s;
@@ -1218,21 +1256,21 @@ void Screen_EoB::drawVortex(int numElements, int radius, int stepSize, int, int
showMouse();
}
-void Screen_EoB::fadeTextColor(Palette *pal, int color1, int rate) {
+void Screen_EoB::fadeTextColor(Palette *pal, int color, int rate) {
+ assert(rate);
uint8 *col = pal->getData();
for (bool loop = true; loop;) {
- loop = true;
uint32 end = _system->getMillis() + _vm->tickLength();
loop = false;
for (int ii = 0; ii < 3; ii++) {
- uint8 c = col[color1 * 3 + ii];
+ uint8 c = col[color * 3 + ii];
if (c > rate) {
- col[color1 * 3 + ii] -= rate;
+ col[color * 3 + ii] -= rate;
loop = true;
} else if (c) {
- col[color1 * 3 + ii] = 0;
+ col[color * 3 + ii] = 0;
loop = true;
}
}
@@ -1252,8 +1290,9 @@ bool Screen_EoB::delayedFadePalStep(Palette *fadePal, Palette *destPal, int rate
uint8 *s = fadePal->getData();
uint8 *d = destPal->getData();
+ int numBytes = (fadePal->getNumColors() - 1) * 3;
- for (int i = 0; i < 765; i++) {
+ for (int i = 0; i < numBytes; i++) {
int fadeVal = *s++;
int dstCur = *d;
int diff = ABS(fadeVal - dstCur);
diff --git a/engines/kyra/graphics/screen_eob.h b/engines/kyra/graphics/screen_eob.h
index 6889755..42a03ca 100644
--- a/engines/kyra/graphics/screen_eob.h
+++ b/engines/kyra/graphics/screen_eob.h
@@ -70,7 +70,7 @@ public:
void drawExplosion(int scale, int radius, int numElements, int stepSize, int aspectRatio, const uint8 *colorTable, int colorTableSize);
void drawVortex(int numElements, int radius, int stepSize, int, int disorder, const uint8 *colorTable, int colorTableSize);
- void fadeTextColor(Palette *pal, int color1, int fadeTextColor);
+ void fadeTextColor(Palette *pal, int color, int rate);
bool delayedFadePalStep(Palette *fadePal, Palette *destPal, int rate);
void setTextColorMap(const uint8 *cmap) {}
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index c1fd9e6..629cf81 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -44,8 +44,9 @@ public:
DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, Mode mode);
~DarkmoonSequenceHelper();
- void loadScene(int index, int pageNum);
+ void loadScene(int index, int pageNum, bool ignorePalette = false);
void animCommand(int index, int del = -1);
+ void setPlatformAnimIndexOffset(int offset);
void printText(int index, int color);
void fadeText();
@@ -98,6 +99,10 @@ private:
int _fadePalRate;
int _fadePalIndex;
+ uint8 _textColor[3];
+
+ int _platformAnimOffset;
+
Screen::FontId _prevFont;
static const char *const _palFilesIntroVGA[];
@@ -227,6 +232,19 @@ void DarkMoonEngine::seq_playIntro() {
snd_stopSound();
sq.loadScene(4, 2);
+
+ uint8 textColor1 = 16;
+ uint8 textColor2 = 15;
+
+ if (_flags.platform == Common::kPlatformAmiga) {
+ textColor1 = textColor2 = 31;
+ sq.loadScene(13, 2);
+ sq.loadScene(14, 2);
+ sq.loadScene(15, 2);
+ } else if (_configRenderMode == Common::kRenderEGA) {
+ textColor1 = 15;
+ }
+
sq.loadScene(0, 2);
sq.delay(1);
@@ -256,7 +274,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 447 : 2);
- sq.animCommand(_configRenderMode == Common::kRenderEGA ? 39 : 38);
+ sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 37 : (_configRenderMode == Common::kRenderEGA ? 39 : 38));
sq.animCommand(3);
sq.animCommand(8);
sq.animCommand(1, 10);
@@ -269,26 +287,29 @@ void DarkMoonEngine::seq_playIntro() {
_screen->setCurPage(2);
_screen->setClearScreenDim(17);
_screen->setCurPage(0);
-
- sq.animCommand(_configRenderMode == Common::kRenderEGA ? 41 : 40);
+
+ sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 38 : (_configRenderMode == Common::kRenderEGA ? 41 : 40));
sq.animCommand(7, 18);
- sq.printText(0, 16); // You were settling...
+ if (_flags.platform == Common::kPlatformAmiga)
+ sq.fadeText();
+
+ sq.printText(0, textColor1); // You were settling...
sq.animCommand(7, 90);
sq.fadeText();
- sq.printText(1, 16); // Then a note was slipped to you
+ sq.printText(1, textColor1); // Then a note was slipped to you
sq.animCommand(8);
sq.animCommand(2, 72);
sq.fadeText();
- sq.printText(2, 16); // It was from your friend Khelben Blackstaff...
+ sq.printText(2, textColor1); // It was from your friend Khelben Blackstaff...
sq.animCommand(2);
sq.animCommand(6, 36);
sq.animCommand(3);
sq.fadeText();
- sq.printText(3, 16); // The message was urgent.
+ sq.printText(3, textColor1); // The message was urgent.
sq.loadScene(1, 2);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 1380 : 4);
@@ -313,8 +334,12 @@ void DarkMoonEngine::seq_playIntro() {
_screen->copyRegion(11, 8, 8, 8, 301, 128, 0, 0, Screen::CR_NO_P_CHECK);
_screen->copyRegion(i, 0, 309, 8, 3, 128, 2, 0, Screen::CR_NO_P_CHECK);
_screen->updateScreen();
- if (i == 96)
+ if (_flags.platform == Common::kPlatformAmiga) {
+ if (i == 4 || i == 24 || i == 36)
+ sq.animCommand(39);
+ } else if (i == 96) {
sq.animCommand(42);
+ }
delayUntil(endtime);
}
}
@@ -329,34 +354,54 @@ void DarkMoonEngine::seq_playIntro() {
sq.update(2);
sq.delay(10);
- sq.printText(4, 16); // What could Khelben want?
+ sq.printText(4, textColor1); // What could Khelben want?
sq.delay(25);
sq.loadScene(3, 2);
sq.delay(54);
- sq.animCommand(13);
+ sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 12 : 13);
_screen->copyRegion(104, 16, 96, 8, 120, 100, 0, 2, Screen::CR_NO_P_CHECK);
sq.fadeText();
+
+ if (_flags.platform == Common::kPlatformAmiga)
+ sq.animCommand(9);
- sq.printText(5, 15); // Welcome, please come in
+ sq.printText(5, textColor2); // Welcome, please come in
sq.animCommand(10);
sq.animCommand(10);
sq.animCommand(9);
sq.animCommand(9);
sq.fadeText();
- sq.printText(6, 15); // Khelben awaits you in his study
+ sq.printText(6, textColor2); // Khelben awaits you in his study
for (int i = 0; i < 3; i++)
sq.animCommand(10);
sq.animCommand(9);
+
+ if (_flags.platform == Common::kPlatformAmiga)
+ sq.setPlatformAnimIndexOffset(-1);
+
sq.animCommand(14);
- sq.loadScene(5, 2);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 2037 : 5);
+ if (_flags.platform == Common::kPlatformAmiga)
+ _sound->beginFadeOut();
- sq.fadeText();
- _screen->clearCurPage();
- _screen->updateScreen();
+ sq.loadScene(5, 2);
+
+ if (!skipFlag() && !shouldQuit()) {
+ if (_flags.platform == Common::kPlatformAmiga) {
+ _screen->fadeToBlack(5);
+ _screen->clearCurPage();
+ _screen->fadeFromBlack(1);
+ sq.fadeText();
+ snd_playSong(14);
+ } else {
+ sq.waitForSongNotifier(5);
+ sq.fadeText();
+ _screen->clearCurPage();
+ _screen->updateScreen();
+ }
+ }
for (int i = 0; i < 6; i++)
sq.animCommand(15);
@@ -371,8 +416,11 @@ void DarkMoonEngine::seq_playIntro() {
_screen->clearCurPage();
sq.update(2);
+ if (_flags.platform == Common::kPlatformAmiga && !skipFlag() && !shouldQuit())
+ snd_playSong(15);
+
sq.animCommand(16);
- sq.printText(7, 15); // Thank you for coming so quickly
+ sq.printText(7, textColor2); // Thank you for coming so quickly
sq.animCommand(16);
sq.animCommand(17);
for (int i = 0; i < 3; i++)
@@ -380,39 +428,39 @@ void DarkMoonEngine::seq_playIntro() {
sq.fadeText();
sq.animCommand(16);
- sq.loadScene(8, 2);
+ sq.loadScene(8, 2, true);
sq.update(2);
sq.animCommand(32);
- sq.printText(8, 15); // I am troubled my friend
+ sq.printText(8, textColor2); // I am troubled my friend
sq.animCommand(33);
sq.animCommand(33);
for (int i = 0; i < 4; i++)
sq.animCommand(32);
sq.fadeText();
- sq.printText(9, 15); // Ancient evil stirs in the Temple Darkmoon
+ sq.printText(9, textColor2); // Ancient evil stirs in the Temple Darkmoon
sq.animCommand(33);
- sq.animCommand(43);
+ sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 41 : 43);
sq.animCommand(33);
for (int i = 0; i < 3; i++)
sq.animCommand(32);
sq.fadeText();
- sq.printText(10, 15); // I fear for the safety of our city
+ sq.printText(10, textColor2); // I fear for the safety of our city
for (int i = 0; i < 4; i++)
sq.animCommand(33);
sq.animCommand(32);
sq.animCommand(32);
- sq.loadScene(9, 2);
sq.fadeText();
+ sq.loadScene(9, 2);
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 3000 : 6);
sq.update(2);
sq.animCommand(34);
- sq.printText(11, 15); // I need your help
+ sq.printText(11, textColor2); // I need your help
for (int i = 0; i < 3; i++)
sq.animCommand(34);
sq.animCommand(35);
@@ -422,10 +470,10 @@ void DarkMoonEngine::seq_playIntro() {
sq.loadScene(12, 2);
sq.update(2);
- sq.loadScene(6, 2);
+ sq.loadScene(6, 2, true);
sq.animCommand(18);
- sq.printText(12, 15); // Three nights ago I sent forth a scout
+ sq.printText(12, textColor2); // Three nights ago I sent forth a scout
sq.animCommand(19);
sq.animCommand(20);
sq.animCommand(22);
@@ -434,7 +482,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(18);
sq.fadeText();
- sq.printText(13, 15); // She has not yet returned
+ sq.printText(13, textColor2); // She has not yet returned
sq.animCommand(20);
sq.animCommand(19);
sq.animCommand(23);
@@ -445,7 +493,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(18);
sq.fadeText();
- sq.printText(14, 15); // I fear for her safety
+ sq.printText(14, textColor2); // I fear for her safety
sq.animCommand(19);
sq.animCommand(20);
sq.animCommand(20);
@@ -457,7 +505,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(18);
sq.animCommand(18);
- sq.printText(15, 15); // Take this coin
+ sq.printText(15, textColor2); // Take this coin
sq.animCommand(28);
sq.animCommand(19);
sq.animCommand(20);
@@ -466,7 +514,13 @@ void DarkMoonEngine::seq_playIntro() {
sq.fadeText();
sq.loadScene(10, 2);
+
+ if (_flags.platform == Common::kPlatformAmiga)
+ _screen->fadeToBlack(10);
+
_screen->clearCurPage();
+ if (_flags.platform == Common::kPlatformAmiga)
+ sq.setPalette(0);
_screen->updateScreen();
sq.animCommand(37, 18);
@@ -476,8 +530,8 @@ void DarkMoonEngine::seq_playIntro() {
_screen->clearCurPage();
sq.update(2);
- sq.loadScene(11, 2);
- sq.printText(16, 15); // I will use it to contact you
+ sq.loadScene(11, 2, true);
+ sq.printText(16, textColor2); // I will use it to contact you
sq.animCommand(19);
sq.animCommand(20);
sq.animCommand(20);
@@ -485,7 +539,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(18);
sq.fadeText();
- sq.printText(17, 15); // You must act quickly
+ sq.printText(17, textColor2); // You must act quickly
sq.animCommand(19);
sq.animCommand(20);
sq.animCommand(19);
@@ -494,7 +548,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.fadeText();
sq.animCommand(18);
- sq.printText(18, 15); // I will teleport you near Darkmoon
+ sq.printText(18, textColor2); // I will teleport you near Darkmoon
sq.animCommand(20);
sq.animCommand(27);
sq.animCommand(20);
@@ -504,7 +558,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.fadeText();
sq.animCommand(18);
- sq.printText(19, 15); // May luck be with you my friend
+ sq.printText(19, textColor2); // May luck be with you my friend
sq.animCommand(19);
sq.animCommand(19);
sq.animCommand(20);
@@ -519,9 +573,18 @@ void DarkMoonEngine::seq_playIntro() {
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 4825 : 8, true);
- if (skipFlag() || shouldQuit()) {
+ if (_flags.platform == Common::kPlatformAmiga && !skipFlag() && !shouldQuit()) {
+ static const uint8 magicHandsCol[] = { 0x15, 0x1D, 0x3A, 0x32, 0x32, 0x3F };
snd_fadeOut();
- } else {
+ _screen->getPalette(0).copy(magicHandsCol, 0, 1, 31);
+ _screen->fadePalette(_screen->getPalette(0), 32);
+ _screen->getPalette(0).copy(magicHandsCol, 1, 1, 31);
+ _screen->fadePalette(_screen->getPalette(0), 32);
+ }
+
+ if (skipFlag() || shouldQuit())
+ snd_fadeOut();
+ else {
_screen->setScreenDim(17);
_screen->clearCurDim();
snd_playSoundEffect(14);
@@ -550,6 +613,20 @@ void DarkMoonEngine::seq_playFinale() {
_screen->clearPage(2);
_screen->updateScreen();
+ uint8 textColor1 = 10;
+ uint8 textColor2 = 15;
+
+ if (_flags.platform == Common::kPlatformAmiga) {
+ textColor1 = 29;
+ textColor2 = 31;
+ sq.loadScene(13, 2);
+ sq.loadScene(14, 2);
+ sq.loadScene(15, 2);
+ } else if (_configRenderMode == Common::kRenderEGA) {
+ textColor1 = 15;
+ }
+
+
sq.loadScene(0, 2);
sq.delay(18);
@@ -567,7 +644,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.animCommand(2);
sq.animCommand(2);
- sq.printText(0, 10); // Finally, Dran has been defeated
+ sq.printText(0, textColor1); // Finally, Dran has been defeated
for (int i = 0; i < 7; i++)
sq.animCommand(2);
sq.fadeText();
@@ -575,13 +652,13 @@ void DarkMoonEngine::seq_playFinale() {
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 475 : 1);
- sq.printText(1, 10); // Suddenly, your friend Khelben appears
+ sq.printText(1, textColor1); // Suddenly, your friend Khelben appears
sq.animCommand(4);
for (int i = 0; i < 3; i++)
sq.animCommand(2);
sq.fadeText();
- sq.printText(2, 15); // Greetings, my victorious friends
+ sq.printText(2, textColor2); // Greetings, my victorious friends
for (int i = 0; i < 4; i++)
sq.animCommand(5);
sq.animCommand(2);
@@ -589,42 +666,42 @@ void DarkMoonEngine::seq_playFinale() {
sq.fadeText();
sq.animCommand(6);
- sq.printText(3, 15); // You have defeated Dran
+ sq.printText(3, textColor2); // You have defeated Dran
for (int i = 0; i < 5; i++)
sq.animCommand(5);
sq.animCommand(2);
sq.animCommand(2);
sq.fadeText();
- sq.printText(4, 15); // I did not know Dran was a dragon
+ sq.printText(4, textColor2); // I did not know Dran was a dragon
for (int i = 0; i < 4; i++)
sq.animCommand(5);
sq.animCommand(2);
sq.animCommand(2);
sq.fadeText();
- sq.printText(5, 15); // He must have been over 300 years old
+ sq.printText(5, textColor2); // He must have been over 300 years old
for (int i = 0; i < 4; i++)
sq.animCommand(5);
sq.animCommand(2);
sq.animCommand(2);
sq.fadeText();
- sq.printText(6, 15); // His power is gone
+ sq.printText(6, textColor2); // His power is gone
for (int i = 0; i < 3; i++)
sq.animCommand(5);
sq.animCommand(2);
sq.animCommand(2);
sq.fadeText();
- sq.printText(7, 15); // But Darkmoon is still a source of great evil
+ sq.printText(7, textColor2); // But Darkmoon is still a source of great evil
for (int i = 0; i < 4; i++)
sq.animCommand(5);
sq.animCommand(2);
sq.animCommand(2);
sq.fadeText();
- sq.printText(8, 15); // And many of his minions remain
+ sq.printText(8, textColor2); // And many of his minions remain
for (int i = 0; i < 4; i++)
sq.animCommand(5);
sq.animCommand(2);
@@ -636,14 +713,14 @@ void DarkMoonEngine::seq_playFinale() {
sq.loadScene(3, 2);
_screen->copyRegion(8, 8, 0, 0, 304, 128, 0, 2, Screen::CR_NO_P_CHECK);
- sq.printText(9, 15); // Now we must leave this place
+ sq.printText(9, textColor2); // Now we must leave this place
sq.animCommand(7);
sq.animCommand(8);
sq.animCommand(7);
sq.animCommand(7, 36);
sq.fadeText();
- sq.printText(10, 15); // So my forces can destroy it..
+ sq.printText(10, textColor2); // So my forces can destroy it..
for (int i = 0; i < 3; i++)
sq.animCommand(7);
sq.animCommand(8);
@@ -652,7 +729,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.animCommand(8, 18);
sq.fadeText();
- sq.printText(11, 15); // Follow me
+ sq.printText(11, textColor2); // Follow me
sq.animCommand(7, 18);
sq.animCommand(9, 18);
sq.animCommand(8, 18);
@@ -673,7 +750,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.loadScene(6, 6);
sq.delay(10);
- sq.printText(12, 10); // Powerful mages stand ready for the final assault...
+ sq.printText(12, textColor1); // Powerful mages stand ready for the final assault...
sq.delay(90);
sq.fadeText();
@@ -701,11 +778,11 @@ void DarkMoonEngine::seq_playFinale() {
sq.animCommand(15);
sq.animCommand(11);
- sq.printText(13, 10); // The temple's evil is very strong
+ sq.printText(13, textColor1); // The temple's evil is very strong
sq.delay(72);
sq.fadeText();
- sq.printText(14, 10); // It must not be allowed...
+ sq.printText(14, textColor1); // It must not be allowed...
sq.delay(72);
sq.fadeText();
@@ -732,7 +809,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.animCommand(17);
sq.animCommand(18);
- sq.printText(15, 10); // The temple ceases to exist
+ sq.printText(15, textColor1); // The temple ceases to exist
sq.initDelayedPaletteFade(6, 1);
sq.delay(36);
@@ -755,7 +832,7 @@ void DarkMoonEngine::seq_playFinale() {
}
sq.delay(18);
- sq.printText(16, 15); // My friends, our work is done
+ sq.printText(16, textColor2); // My friends, our work is done
sq.animCommand(20);
sq.animCommand(19);
sq.animCommand(19, 36);
@@ -763,12 +840,12 @@ void DarkMoonEngine::seq_playFinale() {
snd_playSoundEffect(12);
sq.fadeText();
- sq.printText(17, 15); // Thank you
+ sq.printText(17, textColor2); // Thank you
sq.animCommand(19);
sq.animCommand(20, 36);
sq.fadeText();
- sq.printText(18, 15); // You have earned my deepest respect
+ sq.printText(18, textColor2); // You have earned my deepest respect
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(11);
sq.animCommand(20);
@@ -779,7 +856,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(36);
sq.fadeText();
- sq.printText(19, 15); // We will remember you always
+ sq.printText(19, textColor2); // We will remember you always
sq.animCommand(19);
sq.animCommand(19, 18);
if (!skipFlag() && !shouldQuit())
@@ -846,7 +923,7 @@ void DarkMoonEngine::seq_playFinale() {
if (_configRenderMode != Common::kRenderEGA) {
sq.setPalette(11);
- sq.fadePalette(9, 10);
+ sq.fadePalette(9, textColor1);
}
_screen->clearCurPage();
@@ -1011,20 +1088,21 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
_system(system), _vm(vm), _screen(screen) {
int size = 0;
+ _platformAnimOffset = 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 uint8*[16],
+ _vm->_flags.platform == Common::kPlatformAmiga ? 0 : (_vm->_configRenderMode == Common::kRenderEGA ? _palFilesIntroEGA : _palFilesIntroVGA),
+ new const DarkMoonShapeDef*[16],
new const DarkMoonAnimCommand *[44],
false,
false,
true,
true,
- 0,
+ _vm->_flags.platform == Common::kPlatformAmiga ? 1 : 0,
0,
false,
2
@@ -1033,14 +1111,17 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
for (int i = 0; i < 44; i++)
_config->animData[i] = _vm->staticres()->loadEoB2SeqData(kEoB2IntroAnimData00 + i, size);
- for (int i = 0; i < 13; i++)
+ for (int i = 0; i < 16; i++)
_config->cpsData[i] = _vm->staticres()->loadRawData(kEoB2IntroCpsDataStreet1 + i, size);
- memset(_config->shapeDefs, 0, 13 * sizeof(DarkMoonShapeDef*));
+ memset(_config->shapeDefs, 0, 16 * 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);
+ _config->shapeDefs[13] = _vm->staticres()->loadEoB2ShapeData(kEoB2IntroShapes13, size);
+ _config->shapeDefs[14] = _vm->staticres()->loadEoB2ShapeData(kEoB2IntroShapes14, size);
+ _config->shapeDefs[15] = _vm->staticres()->loadEoB2ShapeData(kEoB2IntroShapes15, size);
} else {
_config = new Config(
@@ -1075,21 +1156,29 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
}
_screen->enableHiColorMode(false);
+ int numColors = 256;
- for (int i = 0; _config->palFiles[i]; i++) {
- if (i < 4)
+ if (_vm->_flags.platform == Common::kPlatformAmiga) {
+ numColors = 32;
+ for (int i = 0; i < 13; ++i)
_palettes[i] = &_screen->getPalette(i);
- else
+ } else {
+ for (int i = 0; _config->palFiles[i]; i++) {
+ if (i < 4)
+ _palettes[i] = &_screen->getPalette(i);
+ else
+ _palettes[i] = new Palette(256);
+ _screen->loadPalette(_config->palFiles[i], *_palettes[i]);
+ }
+
+ for (int i = 9; i < 13; ++i)
_palettes[i] = new Palette(256);
- _screen->loadPalette(_config->palFiles[i], *_palettes[i]);
}
- for (int i = 9; i < 13; ++i)
- _palettes[i] = new Palette(256);
-
- _palettes[9]->fill(0, 256, 0);
- _palettes[10]->fill(0, 256, 63);
- _palettes[11]->fill(0, 256, 0);
+ _palettes[9]->fill(0, numColors, 0);
+ _palettes[10]->fill(0, numColors, 63);
+ _palettes[11]->fill(0, numColors, 0);
+
if (_vm->gameFlags().platform == Common::kPlatformFMTowns)
_screen->loadPalette("PALETTE.COL", *_palettes[12]);
@@ -1105,7 +1194,7 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
memcpy(_fadingTables[i], fadeData + (i << 8), 256);
}
} else {
- if (_vm->_configRenderMode != Common::kRenderCGA && _vm->_configRenderMode != Common::kRenderEGA) {
+ if (_vm->_flags.platform != Common::kPlatformAmiga && _vm->_configRenderMode != Common::kRenderCGA && _vm->_configRenderMode != Common::kRenderEGA) {
uint8 *pal = _vm->resource()->fileData("PALETTE1.PAL", 0);
for (int i = 0; i < 7; i++)
_screen->createFadeTable(pal, _fadingTables[i], 18, (i + 1) * 36);
@@ -1115,12 +1204,14 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
delete[] fadeData;
- _shapes = new const uint8*[30];
- memset(_shapes, 0, 30 * sizeof(uint8 *));
+ _shapes = new const uint8*[54];
+ memset(_shapes, 0, 54 * sizeof(uint8 *));
_fadePalTimer = 0;
_fadePalRate = 0;
+ memset(_textColor, 0, 3);
+
_screen->setScreenPalette(*_palettes[0]);
_prevFont = _screen->setFont(_vm->gameFlags().platform == Common::kPlatformFMTowns ? Screen::FID_SJIS_LARGE_FNT : Screen::FID_8_FNT);
_screen->hideMouse();
@@ -1131,10 +1222,12 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
}
DarkmoonSequenceHelper::~DarkmoonSequenceHelper() {
- for (int i = 4; _config->palFiles[i]; i++)
- delete _palettes[i];
- for (int i = 9; i < 13; ++i)
- delete _palettes[i];
+ if (_vm->_flags.platform != Common::kPlatformAmiga) {
+ for (int i = 4; _config->palFiles[i]; i++)
+ delete _palettes[i];
+ for (int i = 9; i < 13; ++i)
+ delete _palettes[i];
+ }
for (int i = 0; i < 7; i++)
delete[] _fadingTables[i];
@@ -1159,13 +1252,14 @@ DarkmoonSequenceHelper::~DarkmoonSequenceHelper() {
_vm->_allowSkip = false;
}
-void DarkmoonSequenceHelper::loadScene(int index, int pageNum) {
- char file[13] = "";
+void DarkmoonSequenceHelper::loadScene(int index, int pageNum, bool ignorePalette) {
+ Common::String file;
Common::SeekableReadStream *s = 0;
uint32 chunkID = 0;
+ bool isRawData = false;
if (_config->cpsFiles) {
- strcpy(file, _config->cpsFiles[index]);
+ file = _config->cpsFiles[index];
s = _vm->resource()->createReadStream(file);
}
@@ -1174,18 +1268,32 @@ void DarkmoonSequenceHelper::loadScene(int index, int pageNum) {
s->seek(0);
}
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ // Tolerance for diffenrences up to 2 bytes is needed in some cases
+ if ((((int32)(chunkID & 0xFFFF) + 5) & ~3) != (((s->size()) + 3) & ~3))
+ isRawData = true;
+ } else if (file.firstChar() == 'X') {
+ isRawData = true;
+ }
+
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);
- } else if (s && file[0] != 'X') {
+
+ } else if (s && !isRawData) {
delete s;
- _screen->loadBitmap(_config->cpsFiles[index], pageNum | 1, pageNum | 1, _palettes[0]);
+ _screen->loadBitmap(_config->cpsFiles[index], pageNum | 1, pageNum | 1, ignorePalette ? 0 : _palettes[0]);
+
+ } else if (s && _vm->gameFlags().platform == Common::kPlatformAmiga) {
+ _screen->loadFileDataToPage(s, 5, 64000);
+ _screen->decodeLocalizedAmigaPage(5, pageNum, true);
+
} else {
if (!s) {
- file[0] = 'X';
+ file.setChar('X', 0);
s = _vm->resource()->createReadStream(file);
}
@@ -1226,10 +1334,12 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
if (_vm->skipFlag() || _vm->shouldQuit())
return;
+ index += _platformAnimOffset;
uint32 end = 0;
for (const DarkMoonAnimCommand *s = _config->animData[index]; s->command != 0xFF && !_vm->skipFlag() && !_vm->shouldQuit(); s++) {
int palIndex = s->pal + _config->animPalOffs;
+
int x = s->x1;
if (x >= Screen::SCREEN_W)
x >>= 1;
@@ -1311,6 +1421,20 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
_screen->copyRegion(s->x1 - 8, s->y1 - 8, s->x1, s->y1, (_shapes[s->obj][2] + 1) << 3, _shapes[s->obj][3], 2, 0, Screen::CR_NO_P_CHECK);
_screen->updateScreen();
delay(s->delay /** 7*/);
+ } else if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ end = _system->getMillis() + s->delay * _vm->tickLength();
+
+ if (--palIndex) {
+ uint8 obj = (palIndex - 1) * 10 + s->obj;
+ _screen->copyRegion(s->x1 - 8, s->y1 - 8, 0, 0, (_shapes[obj][2] + 1) << 3, _shapes[obj][3], 2, 4, Screen::CR_NO_P_CHECK);
+ _screen->drawShape(4, _shapes[obj], s->x1 & 7, 0, 0);
+ _screen->copyRegion(0, 0, s->x1, s->y1, (_shapes[obj][2] + 1) << 3, _shapes[obj][3], 4, 0, Screen::CR_NO_P_CHECK);
+ } else {
+ _screen->copyRegion(s->x1 - 8, s->y1 - 8, s->x1, s->y1, (_shapes[s->obj][2] + 1) << 3, _shapes[s->obj][3], 2, 0, Screen::CR_NO_P_CHECK);
+ }
+ _screen->updateScreen();
+
+ _vm->delayUntil(end);
} else {
_screen->enableShapeBackgroundFading(true);
_screen->setShapeFadingLevel(1);
@@ -1367,17 +1491,24 @@ void DarkmoonSequenceHelper::animCommand(int index, int del) {
delay(del);
}
+void DarkmoonSequenceHelper::setPlatformAnimIndexOffset(int offset) {
+ _platformAnimOffset = offset;
+}
+
void DarkmoonSequenceHelper::printText(int index, int color) {
if (_vm->skipFlag() || _vm->shouldQuit())
return;
_screen->setClearScreenDim(17);
- uint8 col1 = 15;
- if (_vm->_configRenderMode != Common::kRenderEGA) {
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ memset(_textColor, 58, 3);
+ _palettes[0]->copy(_textColor, 0, 1, 31);
+ color = 31;
+ } else if (_vm->_configRenderMode != Common::kRenderEGA) {
_palettes[0]->copy(*_palettes[0], color, 1, 255);
setPalette(0);
- col1 = 255;
+ color = 255;
}
char *temp = new char[strlen(_config->strings[index]) + 1];
@@ -1394,7 +1525,7 @@ void DarkmoonSequenceHelper::printText(int index, int color) {
*cr = 0;
uint32 len = strlen(str);
- _screen->printText(str, (dm->sx + ((dm->w - len) >> 1)) << 3, dm->sy + yOffs, col1, dm->unkA);
+ _screen->printText(str, (dm->sx + ((dm->w - len) >> 1)) << 3, dm->sy + yOffs, color, dm->unkA);
if (cr) {
*cr = 13;
@@ -1405,14 +1536,23 @@ void DarkmoonSequenceHelper::printText(int index, int color) {
}
delete[] temp;
- _screen->updateScreen();
+
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ _screen->fadePalette(*_palettes[0], 20);
+ else
+ _screen->updateScreen();
}
void DarkmoonSequenceHelper::fadeText() {
if (_vm->skipFlag() || _vm->shouldQuit())
return;
- if (_vm->_configRenderMode != Common::kRenderEGA)
+
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ _screen->fadeTextColor(_palettes[0], 31, 8);
+ else if (_vm->_configRenderMode != Common::kRenderEGA)
_screen->fadeTextColor(_palettes[0], 255, 8);
+
+ memset(_textColor, 0, 3);
_screen->clearCurDim();
}
@@ -1420,21 +1560,33 @@ void DarkmoonSequenceHelper::update(int srcPage) {
if (_vm->skipFlag() || _vm->shouldQuit())
return;
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ _screen->fadeToBlack(5);
+
_screen->copyRegion(0, 0, 8, 8, 304, 128, srcPage, 0, Screen::CR_NO_P_CHECK);
if (_vm->_configRenderMode != Common::kRenderEGA)
setPaletteWithoutTextColor(0);
+
+ _screen->updateScreen();
}
void DarkmoonSequenceHelper::setPaletteWithoutTextColor(int index) {
if (_vm->_configRenderMode == Common::kRenderEGA || _vm->skipFlag() || _vm->shouldQuit())
return;
- if (!memcmp(_palettes[11]->getData(), _palettes[index]->getData(), 765))
- return;
+ int numCol = (_vm->gameFlags().platform == Common::kPlatformAmiga) ? 31 : 255;
- _palettes[11]->copy(*_palettes[index], 0, 255);
- _palettes[11]->copy(*_palettes[0], 255, 1, 255);
+ if (_vm->gameFlags().platform != Common::kPlatformAmiga) {
+ if (!memcmp(_palettes[11]->getData(), _palettes[index]->getData(), numCol * 3))
+ return;
+ }
+
+ _palettes[11]->copy(*_palettes[index], 0, numCol);
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ _palettes[11]->copy(_textColor, 0, 1, numCol);
+ else
+ _palettes[11]->copy(*_palettes[0], numCol, 1, numCol);
setPalette(11);
_screen->updateScreen();
@@ -1506,6 +1658,10 @@ void DarkmoonSequenceHelper::delay(uint32 ticks) {
void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim) {
int seq = 0;
+
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ return;
+
while (_vm->sound()->checkTrigger() < index && !(_vm->skipFlag() || _vm->shouldQuit())) {
if (introUpdateAnim) {
animCommand(30 | seq);
diff --git a/engines/kyra/sequence/sequences_eob.cpp b/engines/kyra/sequence/sequences_eob.cpp
index 5961070..d4aeb52 100644
--- a/engines/kyra/sequence/sequences_eob.cpp
+++ b/engines/kyra/sequence/sequences_eob.cpp
@@ -1058,6 +1058,9 @@ void EoBAmigaFinalePlayer::start() {
surprise();
congratulation();
+ _vm->_allowSkip = false;
+ _vm->_eventList.clear();
+
_screen->fadeToBlack();
}
Commit: b80927992807ce9b9ce69920f86d7f2e7f7b45be
https://github.com/scummvm/scummvm/commit/b80927992807ce9b9ce69920f86d7f2e7f7b45be
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:58+02:00
Commit Message:
KYRA: (EOB2/Amiga) - update sound driver
- add fade out method
- some renaming
- turn a warning into a debug message
Changed paths:
engines/kyra/sound/drivers/audiomaster2.cpp
engines/kyra/sound/drivers/audiomaster2.h
engines/kyra/sound/sound.h
engines/kyra/sound/sound_amiga_eob.cpp
engines/kyra/sound/sound_intern.h
diff --git a/engines/kyra/sound/drivers/audiomaster2.cpp b/engines/kyra/sound/drivers/audiomaster2.cpp
index d050a61..dbc6f30 100644
--- a/engines/kyra/sound/drivers/audiomaster2.cpp
+++ b/engines/kyra/sound/drivers/audiomaster2.cpp
@@ -39,8 +39,8 @@ public:
~AudioMaster2IOManager();
struct IOUnit {
- IOUnit() : _next(0), _sampleData(0), _sampleDataRepeat(0), _lenOnce(0), _lenRepeat(0), _startTick(0), _endTick(0), _transposeData(0), _rate(0), _period(0), _transposePara(0), _transposeCounter(0),
- _levelAdjustData(0), _volumeSetting(0), _outputVolume(0), _levelAdjustPara(0), _levelAdjustCounter(0), _flags(0) {}
+ IOUnit() : _next(0), _sampleData(0), _sampleDataRepeat(0), _lenOnce(0), _lenRepeat(0), _startTick(0), _endTick(0), _transposeData(0), _rate(0), _period(0), _transposePara(0), _transposeDuration(0),
+ _levelAdjustData(0), _volumeSetting(0), _outputVolume(0), _levelAdjustPara(0), _levelAdjustDuration(0), _fadeOutState(-1), _flags(0) {}
IOUnit *_next;
const int8 *_sampleData;
@@ -53,18 +53,22 @@ public:
uint16 _rate;
uint16 _period;
uint16 _transposePara;
- uint8 _transposeCounter;
+ uint8 _transposeDuration;
const uint8 *_levelAdjustData;
uint16 _volumeSetting;
uint16 _outputVolume;
int16 _levelAdjustPara;
- uint8 _levelAdjustCounter;
+ uint8 _levelAdjustDuration;
+ int16 _fadeOutState;
uint8 _flags;
};
void clearChain();
void deployChannels(IOUnit **dest);
IOUnit *requestFreeUnit();
+
+ void fadeOut();
+ bool isFading();
uint32 _sync;
uint32 _tempo;
@@ -93,11 +97,17 @@ public:
void flushResource(const Common::String &name);
void flushAllResources();
+ void fadeOut(int delay);
+ bool isFading();
+
void setMusicVolume(int volume);
void setSoundEffectVolume(int volume);
void interrupt();
+ void resetCounter();
+ int getPlayDuration();
+
void sync(SoundResource *res);
void stopChannels();
@@ -105,11 +115,13 @@ private:
void updateDevice();
AudioMaster2IOManager::IOUnit *_channels[4];
-
AudioMaster2IOManager *_io;
AudioMaster2ResourceManager *_res;
Audio::Mixer *_mixer;
+ uint32 _durationCounter;
+ uint8 _fadeOutSteps;
+
static AudioMaster2Internal *_refInstance;
static int _refCount;
@@ -138,6 +150,7 @@ public:
virtual void interrupt(AudioMaster2IOManager *io);
virtual void setupMusicNote(AudioMaster2IOManager::IOUnit *unit, uint8 note, uint16 volume) {}
+ virtual void setupSoundEffect(AudioMaster2IOManager::IOUnit *unit, uint32 sync, uint32 tempo) {}
enum Mode {
kIdle = 0,
@@ -156,7 +169,6 @@ protected:
private:
virtual void release() = 0;
virtual void setupEnvelopes(AudioMaster2IOManager::IOUnit *unit) {}
- virtual void setupSoundEffect(AudioMaster2IOManager::IOUnit *unit, uint32 sync, uint32 tempo) {}
int _refCnt;
bool _playing;
@@ -204,6 +216,7 @@ public:
void loadVolumeData(Common::ReadStream *stream, uint32 size);
void setupMusicNote(AudioMaster2IOManager::IOUnit *unit, uint8 note, uint16 volume);
+ void setupSoundEffect(AudioMaster2IOManager::IOUnit *unit, uint32 sync, uint32 rate);
struct EnvelopeData {
EnvelopeData(const uint8 *data, uint32 size) : volume(0x40), _data(data), _dataSize(size) {}
@@ -217,11 +230,10 @@ private:
void release();
void setupEnvelopes(AudioMaster2IOManager::IOUnit *unit);
- void setupSoundEffect(AudioMaster2IOManager::IOUnit *unit, uint32 sync, uint32 rate);
EnvelopeData *_transpose;
EnvelopeData *_levelAdjust;
- SoundResource8SVX *_samplesResource;
+ SoundResource *_samplesResource;
};
class SoundResourceSMUS : public SoundResource {
@@ -288,6 +300,7 @@ public:
void initResource(SoundResource *resource);
void releaseResource(const Common::String &resName);
+ void stopChain();
void flush();
SoundResource *getResource(const Common::String &resName, SoundResource::Mode mode);
@@ -299,7 +312,6 @@ public:
private:
SoundResource *retrieveFromChain(const Common::String &resName);
void linkToChain(SoundResource *resource, SoundResource::Mode mode);
- void stopChain();
SoundResource *_chainPlaying;
SoundResource *_chainInactive;
@@ -413,13 +425,32 @@ AudioMaster2IOManager::IOUnit *AudioMaster2IOManager::requestFreeUnit() {
return 0;
}
+void AudioMaster2IOManager::fadeOut() {
+ for (int i = 0; i < 8; ++i) {
+ if (_units[i]->_flags & 2)
+ _units[i]->_fadeOutState = 0;
+ }
+}
+
+bool AudioMaster2IOManager::isFading() {
+ for (int i = 0; i < 8; ++i) {
+ if (_units[i]->_flags & 2) {
+ if (_units[i]->_fadeOutState > -1)
+ return true;
+ } else {
+ _units[i]->_fadeOutState = -1;
+ }
+ }
+ return false;
+}
+
void SoundResource::loadName(Common::ReadStream *stream, uint32 size) {
char *data = new char[size + 1];
stream->read(data, size);
data[size] = '\0';
_name = data;
-
+
delete[] data;
}
@@ -618,12 +649,13 @@ void SoundResourceINST::loadSamples(Common::ReadStream *stream, uint32 size) {
SoundResource *instr = _res->getResource(data, SoundResource::kIdle);
if (instr) {
int type = instr->getType();
- if (type != 4)
+ if (type == 1)
error("SoundResourceINST::loadInstrument(): Unexpected resource type");
instr->open();
- _samplesResource = (SoundResource8SVX*)instr;
+ _samplesResource = instr;
} else {
- warning("SoundResourceINST::loadInstrument(): Samples resource '%s' not found for '%s'.", data, _name.c_str());
+ // This will come up quite often in EOB II. But never with intruments that are actually used. No need to bother the user with a warning here.
+ debugC(9, kDebugLevelSound, "SoundResourceINST::loadInstrument(): Samples resource '%s' not found for '%s'.", data, _name.c_str());
}
delete[] data;
@@ -650,7 +682,7 @@ void SoundResourceINST::setupEnvelopes(AudioMaster2IOManager::IOUnit *unit) {
assert(unit);
if (_transpose) {
unit->_transposeData = _transpose->_data;
- unit->_transposeCounter = 0;
+ unit->_transposeDuration = 0;
unit->_transposePara = 0;
} else {
unit->_transposeData = 0;
@@ -658,7 +690,7 @@ void SoundResourceINST::setupEnvelopes(AudioMaster2IOManager::IOUnit *unit) {
if (_levelAdjust) {
unit->_levelAdjustData = _levelAdjust->_data;
- unit->_levelAdjustCounter = 0;
+ unit->_levelAdjustDuration = 0;
unit->_levelAdjustPara = 0;
} else {
unit->_levelAdjustData = 0;
@@ -877,6 +909,18 @@ void AudioMaster2ResourceManager::releaseResource(const Common::String &resName)
res->close();
}
+void AudioMaster2ResourceManager::stopChain() {
+ Common::StackLock lock(*_mutex);
+
+ SoundResource *cur = _chainPlaying;
+ while (cur) {
+ cur->setPlayStatus(false);
+ cur = cur->_next;
+ }
+
+ _driver->stopChannels();
+}
+
void AudioMaster2ResourceManager::flush() {
stopChain();
@@ -905,6 +949,11 @@ SoundResource *AudioMaster2ResourceManager::getResource(const Common::String &re
if (!res)
return 0;
+ if (mode == SoundResource::kIdle)
+ res->setPlayStatus(false);
+ else if (res->getType() == 1)
+ _driver->resetCounter();
+
linkToChain(res, mode);
return res;
@@ -1023,18 +1072,6 @@ void AudioMaster2ResourceManager::linkToChain(SoundResource *resource, SoundReso
}
}
-void AudioMaster2ResourceManager::stopChain() {
- Common::StackLock lock(*_mutex);
-
- SoundResource *cur = _chainPlaying;
- while (cur) {
- cur->setPlayStatus(false);
- cur = cur->_next;
- }
-
- _driver->stopChannels();
-}
-
AudioMaster2IFFLoader::~AudioMaster2IFFLoader() {
initResource();
}
@@ -1122,8 +1159,9 @@ void AudioMaster2IFFLoader::initResource() {
AudioMaster2Internal *AudioMaster2Internal::_refInstance = 0;
int AudioMaster2Internal::_refCount = 0;
-AudioMaster2Internal::AudioMaster2Internal(Audio::Mixer *mixer) : Paula(true, mixer->getOutputRate(), mixer->getOutputRate() / 50), _mixer(mixer), _res(0), _ready(false) {
+AudioMaster2Internal::AudioMaster2Internal(Audio::Mixer *mixer) : Paula(true, mixer->getOutputRate(), mixer->getOutputRate() / 50), _mixer(mixer), _res(0), _fadeOutSteps(0), _durationCounter(0), _ready(false) {
_channels[0] = _channels[1] = _channels[2] = _channels[3] = 0;
+ setAudioFilter(true);
}
AudioMaster2Internal::~AudioMaster2Internal() {
@@ -1204,6 +1242,18 @@ void AudioMaster2Internal::flushAllResources() {
_res->flush();
}
+void AudioMaster2Internal::fadeOut(int delay) {
+ if (!_ready)
+ return;
+
+ _fadeOutSteps = delay >> 3;
+ _io->fadeOut();
+}
+
+bool AudioMaster2Internal::isFading() {
+ return _io->isFading();
+}
+
void AudioMaster2Internal::setMusicVolume(int volume) {
if (_ready)
_res->setMasterVolume(1, volume);
@@ -1218,12 +1268,21 @@ void AudioMaster2Internal::interrupt() {
if (!_ready)
return;
+ _durationCounter++;
_io->_sync += _io->_tempo;
_res->interrupt(_io);
_io->deployChannels(_channels);
updateDevice();
}
+void AudioMaster2Internal::resetCounter() {
+ _durationCounter = 0;
+}
+
+int AudioMaster2Internal::getPlayDuration() {
+ return _durationCounter;
+}
+
void AudioMaster2Internal::sync(SoundResource *res) {
if (!_ready || !res)
return;
@@ -1273,7 +1332,7 @@ void AudioMaster2Internal::updateDevice() {
unit->_period += unit->_transposePara;
const uint8 *data = unit->_transposeData;
- if (unit->_transposeCounter-- <= 1) {
+ if (unit->_transposeDuration-- <= 1) {
for (bool loop = true; loop; ) {
uint8 para = *data++;
@@ -1301,7 +1360,7 @@ void AudioMaster2Internal::updateDevice() {
data -= ((para + 1) << 1);
} else {
- unit->_transposeCounter = para;
+ unit->_transposeDuration = para;
unit->_transposePara = *data++;
unit->_transposeData = data;
loop = false;
@@ -1319,7 +1378,7 @@ void AudioMaster2Internal::updateDevice() {
unit->_outputVolume += unit->_levelAdjustPara;
const uint8 *data = unit->_levelAdjustData;
- if (unit->_levelAdjustCounter-- <= 1) {
+ if (unit->_levelAdjustDuration-- <= 1) {
for (bool loop = true; loop; ) {
uint8 para = *data++;
if (para == 0xFF) {
@@ -1358,14 +1417,13 @@ void AudioMaster2Internal::updateDevice() {
continue;
}
- unit->_levelAdjustCounter = para;
+ unit->_levelAdjustDuration = para;
if (para == 1) {
unit->_outputVolume = para2;
unit->_levelAdjustPara = 0;
} else {
int16 va = para2 - unit->_outputVolume;
- va /= para;
unit->_levelAdjustPara = va / para;
}
@@ -1396,6 +1454,17 @@ void AudioMaster2Internal::updateDevice() {
setChannelPeriod(i, unit->_period);
setChannelVolume(i, unit->_outputVolume >> 8);
}
+
+ if (unit->_fadeOutState > -1) {
+ setChannelVolume(i, ((unit->_outputVolume / _fadeOutSteps) * (_fadeOutSteps - unit->_fadeOutState)) >> 8);
+ if (++unit->_fadeOutState > _fadeOutSteps)
+ unit->_fadeOutState = -1;
+ }
+ }
+
+ if (_fadeOutSteps && !_io->isFading()) {
+ _fadeOutSteps = 0;
+ _res->stopChain();
}
}
@@ -1432,6 +1501,18 @@ void AudioMaster2::flushAllResources() {
_am2i->flushAllResources();
}
+void AudioMaster2::fadeOut(int delay) {
+ _am2i->fadeOut(delay);
+}
+
+bool AudioMaster2::isFading() {
+ return _am2i->isFading();
+}
+
+int AudioMaster2::getPlayDuration() {
+ return _am2i->getPlayDuration();
+}
+
void AudioMaster2::setMusicVolume(int volume) {
_am2i->setMusicVolume(volume);
}
diff --git a/engines/kyra/sound/drivers/audiomaster2.h b/engines/kyra/sound/drivers/audiomaster2.h
index b9a3824..0ac21d2 100644
--- a/engines/kyra/sound/drivers/audiomaster2.h
+++ b/engines/kyra/sound/drivers/audiomaster2.h
@@ -66,6 +66,11 @@ public:
void flushResource(const Common::String &name);
void flushAllResources();
+ void fadeOut(int delay);
+ bool isFading();
+
+ int getPlayDuration();
+
void setMusicVolume(int volume);
void setSoundEffectVolume(int volume);
diff --git a/engines/kyra/sound/sound.h b/engines/kyra/sound/sound.h
index abeb605..871263c 100644
--- a/engines/kyra/sound/sound.h
+++ b/engines/kyra/sound/sound.h
@@ -207,6 +207,7 @@ public:
* playing a new track or sound effect.
*/
virtual void beginFadeOut() = 0;
+ virtual void beginFadeOut(int) { beginFadeOut(); }
/**
* Stops all audio playback when paused. Continues after end of pause.
diff --git a/engines/kyra/sound/sound_amiga_eob.cpp b/engines/kyra/sound/sound_amiga_eob.cpp
index eccf380..444c859 100644
--- a/engines/kyra/sound/sound_amiga_eob.cpp
+++ b/engines/kyra/sound/sound_amiga_eob.cpp
@@ -104,20 +104,25 @@ void SoundAmiga_EoB::loadSoundFile(Common::String file) {
if (!in)
return;
+ // This value can deviate up to 5 bytes from the real size in EOB II Amiga.
+ // The original simply tries to read 64000 bytes from the file (ignoring this
+ // value). We do the same.
+ // EOB I strangely always seems to have correct values.
uint16 readSize = in->readUint16LE() - 10;
uint8 cmp = in->readByte();
in->seek(1, SEEK_CUR);
uint32 outSize = in->readUint32LE();
in->seek(2, SEEK_CUR);
- if (in->read(_fileBuffer, readSize) != readSize)
- error("SoundAmiga_EoB::loadSoundFile(): Failed to load sound file '%s'", file.c_str());
+ readSize = in->read(_fileBuffer, 64000);
delete in;
+ if (cmp == 0 && readSize < outSize)
+ outSize = readSize;
+
uint8 *buf = new uint8[outSize];
if (cmp == 0) {
- assert(readSize == outSize);
memcpy(buf, _fileBuffer, outSize);
} else if (cmp == 3) {
Screen::decodeFrame3(_fileBuffer, buf, outSize, true);
@@ -135,7 +140,7 @@ void SoundAmiga_EoB::loadSoundFile(Common::String file) {
}
void SoundAmiga_EoB::playTrack(uint8 track) {
- if (!_musicEnabled)
+ if (!_musicEnabled || !_ready)
return;
Common::String newSound;
@@ -149,7 +154,17 @@ void SoundAmiga_EoB::playTrack(uint8 track) {
newSound = "FINALE.SMUS";
}
} else if (_vm->game() == GI_EOB2) {
-
+ if (_currentResourceSet == kMusicIntro) {
+ if (track > 11 && track < 16) {
+ const char *const songs[] = { "INTRO1A.SMUS", "CHARGEN3.SMUS", "INTRO1B.SMUS", "INTRO1C.SMUS" };
+ newSound = songs[track - 12];
+ }
+ } else if (_currentResourceSet == kMusicFinale) {
+ if (track > 0 && track < 4) {
+ const char *const songs[] = { "FINALE1B.SMUS", "FINALE1C.SMUS", "FINALE1D.SMUS" };
+ newSound = songs[track - 1];
+ }
+ }
}
if (!newSound.empty() && _ready) {
@@ -161,11 +176,17 @@ void SoundAmiga_EoB::playTrack(uint8 track) {
void SoundAmiga_EoB::haltTrack() {
if (!_lastSound.empty())
_driver->stopSound(_lastSound);
+ _lastSound.clear();
}
void SoundAmiga_EoB::playSoundEffect(uint8 track, uint8 volume) {
- if (_currentResourceSet == -1 || !_ready)
+ if (_currentResourceSet == -1 || !_sfxEnabled || !_ready)
+ return;
+
+ if (_vm->game() == GI_EOB2 && _currentResourceSet == kMusicIntro && track == 14) {
+ _driver->startSound("TELEPORT.SAM");
return;
+ }
if (!_resInfo[_currentResourceSet]->soundList || track >= 120 || !_sfxEnabled)
return;
@@ -191,8 +212,10 @@ void SoundAmiga_EoB::playSoundEffect(uint8 track, uint8 volume) {
}
}
-void SoundAmiga_EoB::beginFadeOut() {
- haltTrack();
+void SoundAmiga_EoB::beginFadeOut(int delay) {
+ _driver->fadeOut(delay);
+ while (_driver->isFading() && !_vm->shouldQuit())
+ _vm->delay(5);
}
void SoundAmiga_EoB::updateVolumeSettings() {
@@ -207,6 +230,10 @@ void SoundAmiga_EoB::updateVolumeSettings() {
_driver->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume")));
}
+int SoundAmiga_EoB::checkTrigger() {
+ return _driver->getPlayDuration();
+}
+
void SoundAmiga_EoB::unloadLevelSounds() {
if (_currentFile != -1) {
_driver->flushResource(Common::String::format("L%dM1A1", _currentFile));
diff --git a/engines/kyra/sound/sound_intern.h b/engines/kyra/sound/sound_intern.h
index b6e28da..fbf19d7 100644
--- a/engines/kyra/sound/sound_intern.h
+++ b/engines/kyra/sound/sound_intern.h
@@ -422,8 +422,10 @@ public:
void playTrack(uint8 track);
void haltTrack();
void playSoundEffect(uint8 track, uint8 volume = 0xFF);
- void beginFadeOut();
+ void beginFadeOut() { beginFadeOut(160); }
+ void beginFadeOut(int delay);
void updateVolumeSettings();
+ int checkTrigger();
private:
void unloadLevelSounds();
Commit: 3f1c47f3a05aa2161b398d1225156d935c10a700
https://github.com/scummvm/scummvm/commit/3f1c47f3a05aa2161b398d1225156d935c10a700
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:58+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix ending sequence
Changed paths:
engines/kyra/sequence/sequences_darkmoon.cpp
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index 629cf81..5d31375 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -62,6 +62,7 @@ public:
void delay(uint32 ticks);
void waitForSongNotifier(int index, bool introUpdateAnim = false);
+ void updateAmigaSound();
private:
void setPaletteWithoutTextColor(int index);
@@ -99,6 +100,10 @@ private:
int _fadePalRate;
int _fadePalIndex;
+ uint8 _sndNextTrack;
+ uint16 _sndNextTrackMarker;
+ const uint16 *_sndMarkersFMTowns;
+
uint8 _textColor[3];
int _platformAnimOffset;
@@ -109,6 +114,7 @@ private:
static const char *const _palFilesIntroEGA[];
static const char *const _palFilesFinaleVGA[];
static const char *const _palFilesFinaleEGA[];
+ static const char *const _palFilesFinaleAmiga[];
};
int DarkMoonEngine::mainMenu() {
@@ -601,6 +607,10 @@ void DarkMoonEngine::seq_playIntro() {
}
void DarkMoonEngine::seq_playFinale() {
+ _screen->fadeToBlack();
+ _screen->clearCurPage();
+ _screen->clearPage(2);
+
DarkmoonSequenceHelper sq(_system, this, _screen, DarkmoonSequenceHelper::kFinale);
_screen->setCurPage(0);
@@ -608,9 +618,6 @@ void DarkMoonEngine::seq_playFinale() {
_sound->loadSoundFile(0);
snd_stopSound();
sq.delay(3);
-
- _screen->clearCurPage();
- _screen->clearPage(2);
_screen->updateScreen();
uint8 textColor1 = 10;
@@ -619,18 +626,14 @@ void DarkMoonEngine::seq_playFinale() {
if (_flags.platform == Common::kPlatformAmiga) {
textColor1 = 29;
textColor2 = 31;
- sq.loadScene(13, 2);
- sq.loadScene(14, 2);
- sq.loadScene(15, 2);
} else if (_configRenderMode == Common::kRenderEGA) {
textColor1 = 15;
}
-
sq.loadScene(0, 2);
sq.delay(18);
- if (!skipFlag() && !shouldQuit())
+ if (!skipFlag() && !shouldQuit() && _flags.platform != Common::kPlatformAmiga)
snd_playSong(1);
sq.update(2);
@@ -762,14 +765,16 @@ void DarkMoonEngine::seq_playFinale() {
sq.animCommand(10);
sq.animCommand(13);
- sq.initDelayedPaletteFade(4, 1);
+ if (_flags.platform != Common::kPlatformAmiga)
+ sq.initDelayedPaletteFade(4, 1);
sq.animCommand(14);
sq.animCommand(13);
sq.animCommand(14);
sq.animCommand(14);
sq.animCommand(13);
- sq.initDelayedPaletteFade(2, 1);
+ if (_flags.platform != Common::kPlatformAmiga)
+ sq.initDelayedPaletteFade(2, 1);
sq.animCommand(15);
sq.animCommand(14);
@@ -793,7 +798,8 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(8);
sq.animCommand(10);
- sq.initDelayedPaletteFade(5, 1);
+ if (_flags.platform != Common::kPlatformAmiga)
+ sq.initDelayedPaletteFade(5, 1);
sq.animCommand(13);
sq.animCommand(14);
sq.animCommand(13);
@@ -804,13 +810,22 @@ void DarkMoonEngine::seq_playFinale() {
sq.animCommand(14);
sq.animCommand(13);
sq.animCommand(12);
+ if (_flags.platform == Common::kPlatformAmiga)
+ sq.fadePalette(2, 3);
for (int i = 0; i < 4; i++)
sq.animCommand(16);
+ if (_flags.platform == Common::kPlatformAmiga)
+ sq.fadePalette(4, 3);
sq.animCommand(17);
sq.animCommand(18);
sq.printText(15, textColor1); // The temple ceases to exist
- sq.initDelayedPaletteFade(6, 1);
+ if (_flags.platform != Common::kPlatformAmiga) {
+ sq.initDelayedPaletteFade(6, 1);
+ } else {
+ _screen->fadePalette(_screen->getPalette(5), 127);
+ sq.copyPalette(5, 0);
+ }
sq.delay(36);
if (!skipFlag() && !shouldQuit())
@@ -819,12 +834,15 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(54);
sq.fadeText();
sq.loadScene(12, 2);
-
+
sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 3475 : 5);
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(6);
+ if (_flags.platform == Common::kPlatformAmiga)
+ sq.copyPalette(6, 0);
+
if (!skipFlag() && !shouldQuit()) {
if (_configRenderMode != Common::kRenderEGA)
sq.setPaletteWithoutTextColor(0);
@@ -873,6 +891,7 @@ void DarkMoonEngine::seq_playFinale() {
if (skipFlag() || shouldQuit()) {
_screen->copyRegion(0, 0, 8, 8, 304, 128, 2, 0, Screen::CR_NO_P_CHECK);
} else {
+ sq.updateAmigaSound();
snd_playSoundEffect(6);
if (_configRenderMode != Common::kRenderEGA)
sq.setPaletteWithoutTextColor(0);
@@ -893,6 +912,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(12);
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(12);
+ sq.updateAmigaSound();
removeInputTop();
resetSkipFlag(true);
@@ -900,13 +920,17 @@ void DarkMoonEngine::seq_playFinale() {
sq.loadScene(10, 2);
sq.loadScene(9, 2);
- snd_stopSound();
- sq.delay(3);
-
- _sound->loadSoundFile(1);
+ if (_flags.platform == Common::kPlatformAmiga) {
+ sq.setPalette(7);
+ sq.delay(3);
+ } else {
+ snd_stopSound();
+ sq.delay(3);
+ _sound->loadSoundFile(1);
+ }
sq.delay(18);
- if (!skipFlag() && !shouldQuit())
+ if (!skipFlag() && !shouldQuit() && _flags.platform != Common::kPlatformAmiga)
snd_playSong(_flags.platform == Common::kPlatformFMTowns ? 16 : 1);
int temp = 0;
@@ -919,11 +943,13 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(90);
+ removeInputTop();
resetSkipFlag(true);
if (_configRenderMode != Common::kRenderEGA) {
- sq.setPalette(11);
- sq.fadePalette(9, textColor1);
+ if (_flags.platform != Common::kPlatformAmiga)
+ sq.setPalette(11);
+ sq.fadePalette(9, 10);
}
_screen->clearCurPage();
@@ -943,14 +969,20 @@ void DarkMoonEngine::seq_playFinale() {
if (_flags.platform == Common::kPlatformFMTowns)
sq.copyPalette(12, 0);
-
- sq.setPalette(9);
+
+ if (_flags.platform != Common::kPlatformAmiga)
+ sq.setPalette(9);
sq.fadePalette(0, 18);
- while (!skipFlag() && !shouldQuit())
+ while (!skipFlag() && !shouldQuit()) {
+ sq.updateAmigaSound();
delay(_tickLength);
+ }
snd_stopSound();
+ removeInputTop();
+ resetSkipFlag(true);
+
sq.fadePalette(9, 10);
}
@@ -962,6 +994,8 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da
_screen->setScreenDim(sd);
const ScreenDim *dm = _screen->_curDim;
+ const uint8 col1 = _flags.platform == Common::kPlatformAmiga ? 19 : 12;
+ const uint8 col2 = _flags.platform == Common::kPlatformAmiga ? 29 : 240;
_screen->copyRegion(dm->sx << 3, dm->sy, dm->sx << 3, dm->sy, dm->w << 3, dm->h, 0, backupPage, Screen::CR_NO_P_CHECK);
@@ -1037,6 +1071,7 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da
}
_screen->copyRegion(dm->sx << 3, dm->sy, dm->sx << 3, dm->sy, dm->w << 3, dm->h, backupPage, tempPage, Screen::CR_NO_P_CHECK);
+ sq->updateAmigaSound();
for (int h = 0; h < i; h++) {
if (items[h + 1].y < dm->h) {
@@ -1048,8 +1083,8 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da
if (items[h + 1].size == 6)
_screen->setFont(Screen::FID_6_FNT);
- _screen->printText(items[h + 1].str, (dm->sx << 3) + items[h + 1].x - 1, dm->sy + items[h + 1].y + 1, 12, 0);
- _screen->printText(items[h + 1].str, (dm->sx << 3) + items[h + 1].x, dm->sy + items[h + 1].y, 240, 0);
+ _screen->printText(items[h + 1].str, (dm->sx << 3) + items[h + 1].x - 1, dm->sy + items[h + 1].y + 1, col1, 0);
+ _screen->printText(items[h + 1].str, (dm->sx << 3) + items[h + 1].x, dm->sy + items[h + 1].y, col2, 0);
if (items[h + 1].size == 6)
_screen->setFont(Screen::FID_8_FNT);
@@ -1089,6 +1124,8 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
int size = 0;
_platformAnimOffset = 0;
+ _sndNextTrack = 1;
+ _sndNextTrackMarker = 0;
if (mode == kIntro) {
_config = new Config(
@@ -1128,14 +1165,14 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
_vm->staticres()->loadStrings(kEoB2FinaleStrings, size),
_vm->staticres()->loadStrings(kEoB2FinaleCPSFiles, size),
new const uint8*[13],
- _vm->_configRenderMode == Common::kRenderEGA ? _palFilesFinaleEGA : _palFilesFinaleVGA,
+ _vm->_flags.platform == Common::kPlatformAmiga ? _palFilesFinaleAmiga : (_vm->_configRenderMode == Common::kRenderEGA ? _palFilesFinaleEGA : _palFilesFinaleVGA),
new const DarkMoonShapeDef*[13],
new const DarkMoonAnimCommand *[21],
true,
true,
false,
false,
- 1,
+ _vm->_flags.platform == Common::kPlatformAmiga ? 2 : 1,
18,
true,
6
@@ -1159,9 +1196,16 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
int numColors = 256;
if (_vm->_flags.platform == Common::kPlatformAmiga) {
- numColors = 32;
+ static const int8 palIndex[13] = { -1, -1, 3, 2, 4, 5, 6, 7, -1, -1, -1, -1, -1 };
for (int i = 0; i < 13; ++i)
_palettes[i] = &_screen->getPalette(i);
+ Common::SeekableReadStream *s = _config->palFiles ? _vm->resource()->createReadStream(_config->palFiles[0]) : 0;
+ numColors = 32;
+ for (int i = 0; i < 13; ++i) {
+ if (s && palIndex[i] != -1)
+ _palettes[palIndex[i]]->loadAmigaPalette(*s, 0, 32);
+ }
+ delete s;
} else {
for (int i = 0; _config->palFiles[i]; i++) {
if (i < 4)
@@ -1279,8 +1323,9 @@ void DarkmoonSequenceHelper::loadScene(int index, int pageNum, bool ignorePalett
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.
+ // The original code also handles files with FORM chunks and ILBM and PBM sub chunks.
+ // Up until now I haven't found any need for these (Amiga versions included).
+ // We error out here theoretically, but this should never happen.
error("DarkmoonSequenceHelper::loadScene(): CPS file loading failure in scene %d - unhandled FORM chunk encountered", index);
} else if (s && !isRawData) {
@@ -1338,6 +1383,8 @@ 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++) {
+ updateAmigaSound();
+
int palIndex = s->pal + _config->animPalOffs;
int x = s->x1;
@@ -1675,6 +1722,22 @@ void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim
}
}
+void DarkmoonSequenceHelper::updateAmigaSound() {
+ if (_vm->gameFlags().platform != Common::kPlatformAmiga)
+ return;
+
+ int ct = _vm->sound()->checkTrigger();
+ if (ct < _sndNextTrackMarker)
+ return;
+
+ _vm->snd_playSong(_sndNextTrack++);
+ if (_sndNextTrack == 4)
+ _sndNextTrack = 1;
+
+ static const uint16 interval[4] = { 0, 1015, 4461, 1770 };
+ _sndNextTrackMarker = interval[_sndNextTrack];
+}
+
const char *const DarkmoonSequenceHelper::_palFilesIntroVGA[] = {
"PALETTE1.PAL",
"PALETTE3.PAL",
@@ -1717,6 +1780,11 @@ const char *const DarkmoonSequenceHelper::_palFilesFinaleEGA[] = {
0
};
+const char *const DarkmoonSequenceHelper::_palFilesFinaleAmiga[] = {
+ "FINALE.PAL",
+ 0
+};
+
void DarkMoonEngine::seq_nightmare() {
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);
if (_flags.lang == Common::JA_JPN)
Commit: 463cf48e2a16e0056922b06a741ee477e7078de2
https://github.com/scummvm/scummvm/commit/463cf48e2a16e0056922b06a741ee477e7078de2
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:59+02:00
Commit Message:
KYRA: (EOB) - minor sequence code cleanup
Changed paths:
engines/kyra/sequence/sequences_darkmoon.cpp
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index 5d31375..2a25493 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -272,13 +272,13 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(6, 18);
sq.animCommand(0);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 229 : 1);
+ sq.waitForSongNotifier(1);
sq.animCommand(_configRenderMode == Common::kRenderEGA ? 12 : 11);
sq.animCommand(7, 6);
sq.animCommand(2, 6);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 447 : 2);
+ sq.waitForSongNotifier(2);
sq.animCommand(_flags.platform == Common::kPlatformAmiga ? 37 : (_configRenderMode == Common::kRenderEGA ? 39 : 38));
sq.animCommand(3);
@@ -287,7 +287,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.animCommand(0, 6);
sq.animCommand(2);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 670 : 3);
+ sq.waitForSongNotifier(3);
_screen->setClearScreenDim(17);
_screen->setCurPage(2);
@@ -318,7 +318,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.printText(3, textColor1); // The message was urgent.
sq.loadScene(1, 2);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 1380 : 4);
+ sq.waitForSongNotifier(4);
// intro scroll
if (!skipFlag() && !shouldQuit()) {
@@ -461,7 +461,7 @@ void DarkMoonEngine::seq_playIntro() {
sq.fadeText();
sq.loadScene(9, 2);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 3000 : 6);
+ sq.waitForSongNotifier(6);
sq.update(2);
sq.animCommand(34);
@@ -572,12 +572,12 @@ void DarkMoonEngine::seq_playIntro() {
sq.fadeText();
sq.animCommand(29);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 4475 : 7);
+ sq.waitForSongNotifier(7);
sq.animCommand(30);
sq.animCommand(31);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 4825 : 8, true);
+ sq.waitForSongNotifier(8, true);
if (_flags.platform == Common::kPlatformAmiga && !skipFlag() && !shouldQuit()) {
static const uint8 magicHandsCol[] = { 0x15, 0x1D, 0x3A, 0x32, 0x32, 0x3F };
@@ -653,7 +653,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.fadeText();
sq.animCommand(2);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 475 : 1);
+ sq.waitForSongNotifier(1);
sq.printText(1, textColor1); // Suddenly, your friend Khelben appears
sq.animCommand(4);
@@ -744,7 +744,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.loadScene(4, 2);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 2030 : 2);
+ sq.waitForSongNotifier(2);
_screen->clearCurPage();
sq.update(2);
@@ -757,7 +757,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(90);
sq.fadeText();
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 2200 : 3);
+ sq.waitForSongNotifier(3);
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(7);
@@ -791,7 +791,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.delay(72);
sq.fadeText();
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 2752 : 4);
+ sq.waitForSongNotifier(4);
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(7);
@@ -835,7 +835,7 @@ void DarkMoonEngine::seq_playFinale() {
sq.fadeText();
sq.loadScene(12, 2);
- sq.waitForSongNotifier(_flags.platform == Common::kPlatformFMTowns ? 3475 : 5);
+ sq.waitForSongNotifier(5);
if (!skipFlag() && !shouldQuit())
snd_playSoundEffect(6);
@@ -1121,11 +1121,19 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da
DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, Mode mode) :
_system(system), _vm(vm), _screen(screen) {
-
+
+ assert(mode == kIntro || mode == kFinale);
+
+ static const uint16 soundMarkersFMTowns[2][8] = {
+ { 229, 447, 670, 1380, 2037, 3000, 4475, 4825 },
+ { 475, 2030, 2200, 2752, 3475, 0, 0, 0 }
+ };
+
int size = 0;
_platformAnimOffset = 0;
_sndNextTrack = 1;
_sndNextTrackMarker = 0;
+ _sndMarkersFMTowns = soundMarkersFMTowns[mode];
if (mode == kIntro) {
_config = new Config(
@@ -1704,11 +1712,13 @@ void DarkmoonSequenceHelper::delay(uint32 ticks) {
}
void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim) {
- int seq = 0;
-
- if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ if (_vm->gameFlags().platform == Common::kPlatformFMTowns)
+ index = _sndMarkersFMTowns[index - 1];
+ else if (_vm->gameFlags().platform == Common::kPlatformAmiga)
return;
+ int seq = 0;
+
while (_vm->sound()->checkTrigger() < index && !(_vm->skipFlag() || _vm->shouldQuit())) {
if (introUpdateAnim) {
animCommand(30 | seq);
Commit: 5462d42363bf6f0e84aa0ecbb12b0dc8941acadb
https://github.com/scummvm/scummvm/commit/5462d42363bf6f0e84aa0ecbb12b0dc8941acadb
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:59+02:00
Commit Message:
KYRA: (EOB2/Amiga) - improve font file warnings
- add warning for wrong font file: The German version of EOB II has a font file with more characters than the English version or the EOB I fonts. Users now get a warning/instruction if they have the wrong file.
- add translation support for all AmigaDOS font related warnings/errors
Changed paths:
engines/kyra/engine/eobcommon.cpp
engines/kyra/graphics/screen.cpp
engines/kyra/graphics/screen.h
engines/kyra/graphics/screen_eob.cpp
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 26a23aa..5b7c4ae 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -438,27 +438,20 @@ Common::Error EoBCoreEngine::init() {
assert(_debugger);
if (_flags.platform == Common::kPlatformAmiga) {
- bool showErrorDlg = false;
if (_res->exists("EOBF6.FONT"))
_screen->loadFont(Screen::FID_6_FNT, "EOBF6.FONT");
else if (_res->exists("FONTS/EOBF6.FONT"))
_screen->loadFont(Screen::FID_6_FNT, "FONTS/EOBF6.FONT");
else
- showErrorDlg = true;
+ AmigaDOSFont::errorDialog(0);
if (_res->exists("EOBF8.FONT"))
_screen->loadFont(Screen::FID_8_FNT, "EOBF8.FONT");
else if (_res->exists("FONTS/EOBF8.FONT"))
_screen->loadFont(Screen::FID_8_FNT, "FONTS/EOBF8.FONT");
else
- showErrorDlg = true;
+ AmigaDOSFont::errorDialog(0);
- if (showErrorDlg) {
- ::GUI::displayErrorDialog("This AMIGA version requires the following font files:\n\nEOBF6.FONT\nEOBF6/6\nEOBF8.FONT\nEOBF8/8\n\n"
- "If you used the orginal installer for the installation these files\nshould be located in the AmigaDOS system 'Fonts/' folder.\n"
- "Please copy them into the EOB game data directory.\n");
- error("Failed to load font files.");
- }
} else {
_screen->loadFont(Screen::FID_6_FNT, "FONT6.FNT");
_screen->loadFont(Screen::FID_8_FNT, "FONT8.FNT");
diff --git a/engines/kyra/graphics/screen.cpp b/engines/kyra/graphics/screen.cpp
index 5717319..ea0871f 100644
--- a/engines/kyra/graphics/screen.cpp
+++ b/engines/kyra/graphics/screen.cpp
@@ -1365,7 +1365,7 @@ bool Screen::loadFont(FontId fontId, const char *filename) {
fnt = new AMIGAFont();
#ifdef ENABLE_EOB
else if (_isAmiga)
- fnt = new AmigaDOSFont(_vm->resource());
+ fnt = new AmigaDOSFont(_vm->resource(), _vm->game() == GI_EOB2 && _vm->gameFlags().lang == Common::DE_DEU);
else if (_vm->game() == GI_EOB1 || _vm->game() == GI_EOB2)
// We use normal VGA rendering in EOB II, since we do the complete EGA dithering in updateScreen().
fnt = new OldDOSFont(_useHiResEGADithering ? Common::kRenderVGA : _renderMode);
diff --git a/engines/kyra/graphics/screen.h b/engines/kyra/graphics/screen.h
index 5a746a0..b6706cd 100644
--- a/engines/kyra/graphics/screen.h
+++ b/engines/kyra/graphics/screen.h
@@ -187,7 +187,7 @@ private:
class Resource;
class AmigaDOSFont : public Font {
public:
- AmigaDOSFont(Resource *res);
+ AmigaDOSFont(Resource *res, bool needsLocalizedFont = false);
~AmigaDOSFont() { unload(); }
bool load(Common::SeekableReadStream &file);
@@ -197,6 +197,8 @@ public:
void setColorMap(const uint8 *src) { _colorMap = src; }
void drawChar(uint16 c, byte *dst, int pitch, int) const;
+ static void errorDialog(int index);
+
private:
void unload();
@@ -242,8 +244,10 @@ private:
uint16 _selectedElement;
const uint8 *_colorMap;
-
const uint16 _maxPathLen;
+ const bool _needsLocalizedFont;
+
+ static uint8 _errorDialogDisplayed;
Resource *_res;
};
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index 33f4bab..b3c0393 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -31,6 +31,7 @@
#include "kyra/resource/resource.h"
#include "common/system.h"
+#include "common/translation.h"
#include "graphics/cursorman.h"
#include "graphics/palette.h"
@@ -1975,7 +1976,7 @@ void OldDOSFont::unload() {
_bitmapOffsets = 0;
}
-AmigaDOSFont::AmigaDOSFont(Resource *res) : _res(res), _width(0), _height(0), _first(0), _last(0), _content(0), _numElements(0), _selectedElement(0), _maxPathLen(256) {
+AmigaDOSFont::AmigaDOSFont(Resource *res, bool needsLocalizedFont) : _res(res), _needsLocalizedFont(needsLocalizedFont), _width(0), _height(0), _first(0), _last(0), _content(0), _numElements(0), _selectedElement(0), _maxPathLen(256) {
assert(_res);
}
@@ -2078,6 +2079,35 @@ void AmigaDOSFont::drawChar(uint16 c, byte *dst, int pitch, int) const {
}
}
+uint8 AmigaDOSFont::_errorDialogDisplayed = 0;
+
+void AmigaDOSFont::errorDialog(int index) {
+ if (_errorDialogDisplayed & (1 << index))
+ return;
+ _errorDialogDisplayed |= (1 << index);
+
+ // I've made rather elaborate dialogs here, since the Amiga font file handling is quite prone to cause problems for users.
+ // This will hopefully prevent unnecessary forum posts and bug reports.
+ if (index == 0) {
+ ::GUI::displayErrorDialog(_s(
+ "This AMIGA version requires the following font files:\n\nEOBF6.FONT\nEOBF6/6\nEOBF8.FONT\nEOBF8/8\n\n"
+ "If you used the orginal installer for the installation these files\nshould be located in the AmigaDOS system 'Fonts/' folder.\n"
+ "Please copy them into the EOB game data directory.\n"
+ ));
+
+ error("Failed to load font files.");
+ } else if (index == 1) {
+ ::GUI::displayErrorDialog(_s(
+ "This AMIGA version requires the following font files:\n\nEOBF6.FONT\nEOBF6/6\nEOBF8.FONT\nEOBF8/8\n\n"
+ "This is a localized (non-English) version of EOB II which uses language specific characters\n"
+ "contained only in the specific font files that came with your game. You cannot use the font\n"
+ "files from the English version or from any EOB I game which seems to be what you are doing.\n\n"
+ "The game will continue, but the language specific characters will not be displayed.\n"
+ "Please copy the correct font files into your EOB II game data directory.\n\n"
+ ));
+ }
+}
+
void AmigaDOSFont::unload() {
delete[] _content;
}
@@ -2105,12 +2135,8 @@ AmigaDOSFont::TextFont *AmigaDOSFont::loadContentFile(const Common::String fileN
str = _res->createEndianAwareReadStream(fileNameAlt);
}
- if (!str) {
- ::GUI::displayErrorDialog("This AMIGA version requires the following font files:\n\nEOBF6.FONT\nEOBF6/6\nEOBF8.FONT\nEOBF8/8\n\n"
- "If you used the orginal installer for the installation these files\nshould be located in the AmigaDOS system 'Fonts/' folder.\n"
- "Please copy them into the EOB game data directory.\n");
- error("Failed to load font files.");
- }
+ if (!str)
+ errorDialog(0);
}
uint32 hunkId = str->readUint32();
@@ -2137,6 +2163,9 @@ AmigaDOSFont::TextFont *AmigaDOSFont::loadContentFile(const Common::String fileN
fnt->firstChar = str->readByte();
fnt->lastChar = str->readByte();
+ if (_needsLocalizedFont && fnt->lastChar <= 127)
+ errorDialog(1);
+
str->seek(18, SEEK_CUR);
int32 curPos = str->pos();
uint32 bufferSize = dataSize - (curPos - fntStartPos);
Commit: 82b288a5107e9f15ed2d25dac017e54e915323b8
https://github.com/scummvm/scummvm/commit/82b288a5107e9f15ed2d25dac017e54e915323b8
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:59+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix vcn block drawing
Changed paths:
engines/kyra/engine/scene_eob.cpp
diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp
index 80d3e7d..f47e0d2 100644
--- a/engines/kyra/engine/scene_eob.cpp
+++ b/engines/kyra/engine/scene_eob.cpp
@@ -159,8 +159,13 @@ Common::String EoBCoreEngine::initLevelData(int sub) {
uint16 size = (_flags.platform == Common::kPlatformFMTowns) ? 2916 : s->readUint16();
delete[] _vmpPtr;
_vmpPtr = new uint16[size];
- for (int i = 0; i < size; i++)
- _vmpPtr[i] = s->readUint16();
+ if (_flags.gameID == GI_EOB1) {
+ for (int i = 0; i < size; i++)
+ _vmpPtr[i] = s->readUint16();
+ } else {
+ for (int i = 0; i < size; i++)
+ _vmpPtr[i] = s->readUint16LE();
+ }
delete s;
const char *paletteFilePattern = (_flags.gameID == GI_EOB2 && _configRenderMode == Common::kRenderEGA) ? "%s.EGA" : "%s.PAL";
@@ -315,7 +320,7 @@ void EoBCoreEngine::loadVcnData(const char *file, const uint8 *cgaMapping) {
const char *filePattern = ((_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.ECN" : "%s.VCN");
Common::String fn = Common::String::format(filePattern, _lastBlockDataFile);
- if (_flags.platform == Common::kPlatformAmiga) {
+ if (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformAmiga) {
Common::SeekableReadStream *in = _res->createReadStream(fn);
vcnSize = in->readUint16LE() * (_vcnSrcBitsPerPixel << 3);
_vcnBlocks = new uint8[vcnSize];
Commit: 4b15576fcb69bda418c0ef12728761f060a1bd21
https://github.com/scummvm/scummvm/commit/4b15576fcb69bda418c0ef12728761f060a1bd21
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:59+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix monster shape encoding
Changed paths:
engines/kyra/engine/scene_eob.cpp
diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp
index f47e0d2..f010069 100644
--- a/engines/kyra/engine/scene_eob.cpp
+++ b/engines/kyra/engine/scene_eob.cpp
@@ -263,7 +263,7 @@ Common::String EoBCoreEngine::initLevelData(int sub) {
} else {
if (*pos++ != 0xEC)
continue;
- loadMonsterShapes((const char *)(pos + 2), pos[1] * 18, pos[15] ? true : false, *pos * 18);
+ loadMonsterShapes((const char *)(pos + 2), pos[1] * 18, pos[15] ? true : false, *pos * (_flags.platform == Common::kPlatformAmiga ? 6 : 18));
pos += 16;
}
}
Commit: 5f20702ce889972b797625c7d1040a9f12104085
https://github.com/scummvm/scummvm/commit/5f20702ce889972b797625c7d1040a9f12104085
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:54:59+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix main menu version string color
Changed paths:
engines/kyra/sequence/sequences_darkmoon.cpp
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index 2a25493..86e837e 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -155,7 +155,7 @@ 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, _flags.platform == Common::kPlatformFMTowns ? 152 : 160, 13, 0);
+ _screen->printText(versionString.c_str(), 267 - versionString.size() * 6, _flags.platform == Common::kPlatformFMTowns ? 152 : 160, _flags.platform == Common::kPlatformAmiga ? 18 : 13, 0);
_screen->setFont(of);
_screen->_curPage = op;
_screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK);
Commit: ba9a4cd6e19f084f5209075bce77c067ed7f0051
https://github.com/scummvm/scummvm/commit/ba9a4cd6e19f084f5209075bce77c067ed7f0051
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:00+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix detect magic blue shapes
Changed paths:
engines/kyra/engine/eobcommon.cpp
engines/kyra/engine/items_eob.cpp
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 5b7c4ae..d7fad04 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -806,12 +806,13 @@ void EoBCoreEngine::loadItemsAndDecorationsShapes() {
for (int i = 0; i < _numItemIconShapes; i++)
_itemIconShapes[i] = _screen->encodeShape((i % 0x14) << 1, (i / 0x14) << 4, 2, 0x10, false, _cgaMappingIcons);
- if (_flags.platform == Common::kPlatformAmiga && _flags.gameID == GI_EOB1) {
+ if (_flags.platform == Common::kPlatformAmiga) {
+ const uint8 offsY = (_flags.gameID == GI_EOB1) ? 80 : 96;
_amigaBlueItemIconShapes = new const uint8*[_numItemIconShapes];
for (int i = 0; i < _numItemIconShapes; i++) {
int bx = (i % 0x14) << 1;
int by = (i / 0x14) << 4;
- _amigaBlueItemIconShapes[i] = _screen->getPagePixel(2, (bx << 3) + 8, by + 88) ? _screen->encodeShape(bx, by + 80, 2, 0x10, false, 0) : _screen->encodeShape(bx, by, 2, 0x10, false, 0);
+ _amigaBlueItemIconShapes[i] = _screen->getPagePixel(2, (bx << 3) + 8, by + offsY + 8) ? _screen->encodeShape(bx, by + offsY, 2, 0x10, false, 0) : _screen->encodeShape(bx, by, 2, 0x10, false, 0);
}
}
}
diff --git a/engines/kyra/engine/items_eob.cpp b/engines/kyra/engine/items_eob.cpp
index b4d9d67..39054b6 100644
--- a/engines/kyra/engine/items_eob.cpp
+++ b/engines/kyra/engine/items_eob.cpp
@@ -466,11 +466,10 @@ void EoBCoreEngine::drawItemIconShape(int pageNum, Item itemId, int x, int y) {
const uint8 *shp = _itemIconShapes[icn];
if (applyBluePal) {
- if (_flags.gameID == GI_EOB1) {
- if (_amigaBlueItemIconShapes)
- shp = _amigaBlueItemIconShapes[icn];
- else
- ovl = (_configRenderMode == Common::kRenderCGA) ? _itemsOverlayCGA : &_itemsOverlay[icn << 4];
+ if (_amigaBlueItemIconShapes) {
+ shp = _amigaBlueItemIconShapes[icn];
+ } else if (_flags.gameID == GI_EOB1) {
+ ovl = (_configRenderMode == Common::kRenderCGA) ? _itemsOverlayCGA : &_itemsOverlay[icn << 4];
} else {
_screen->setFadeTable(_lightBlueFadingTable);
_screen->setShapeFadingLevel(1);
Commit: c94b6a438952c9d20b9a07d0a8712e9e2be25c7c
https://github.com/scummvm/scummvm/commit/c94b6a438952c9d20b9a07d0a8712e9e2be25c7c
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:00+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix text resource loading
Changed paths:
engines/kyra/engine/eobcommon.cpp
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index d7fad04..792cf10 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -1346,7 +1346,10 @@ void EoBCoreEngine::npcSequence(int npcIndex) {
drawNpcScene(npcIndex);
Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
- _screen->loadFileDataToPage(s, 5, 32000);
+ if (s)
+ _screen->loadFileDataToPage(s, 5, 32000);
+ else
+ _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
delete s;
gui_drawBox(0, 121, 320, 79, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
@@ -1594,7 +1597,10 @@ void EoBCoreEngine::initDialogueSequence() {
snd_stopSound();
Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
- _screen->loadFileDataToPage(s, 5, 32000);
+ if (s)
+ _screen->loadFileDataToPage(s, 5, 32000);
+ else
+ _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
_txt->setupField(9, 0);
delete s;
}
@@ -1798,7 +1804,11 @@ void EoBCoreEngine::displayParchment(int id) {
if (id >= 0) {
// display text
Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
- _screen->loadFileDataToPage(s, 5, 32000);
+ if (s)
+ _screen->loadFileDataToPage(s, 5, 32000);
+ else
+ _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
+ delete s;
_screen->set16bitShadingLevel(4);
gui_drawBox(0, 0, 176, 175, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
_screen->set16bitShadingLevel(0);
Commit: 02000cfe371784fe5eb46e063a0391fa1ec2001f
https://github.com/scummvm/scummvm/commit/02000cfe371784fe5eb46e063a0391fa1ec2001f
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:00+02:00
Commit Message:
KYRA: (EOB2/Amiga) - add special gfx decoder for localized version
Changed paths:
engines/kyra/engine/eobcommon.cpp
engines/kyra/engine/scene_eob.cpp
engines/kyra/graphics/screen_eob.cpp
engines/kyra/graphics/screen_eob.h
engines/kyra/sequence/sequences_darkmoon.cpp
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 792cf10..1c75c78 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -1346,10 +1346,15 @@ void EoBCoreEngine::npcSequence(int npcIndex) {
drawNpcScene(npcIndex);
Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
- if (s)
+ if (s) {
_screen->loadFileDataToPage(s, 5, 32000);
- else
- _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
+ } else {
+ s = _res->createReadStream("TEXT.CPS");
+ if (s->readSint32BE() + 12 == s->size())
+ _screen->loadSpecialAmigaCPS("TEXT.CPS", 5, false);
+ else
+ _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
+ }
delete s;
gui_drawBox(0, 121, 320, 79, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
@@ -1597,12 +1602,18 @@ void EoBCoreEngine::initDialogueSequence() {
snd_stopSound();
Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
- if (s)
+ if (s) {
_screen->loadFileDataToPage(s, 5, 32000);
- else
- _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
- _txt->setupField(9, 0);
+ } else {
+ s = _res->createReadStream("TEXT.CPS");
+ if (s->readSint32BE() + 12 == s->size())
+ _screen->loadSpecialAmigaCPS("TEXT.CPS", 5, false);
+ else
+ _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
+ }
delete s;
+
+ _txt->setupField(9, 0);
}
void EoBCoreEngine::restoreAfterDialogueSequence() {
@@ -1804,10 +1815,15 @@ void EoBCoreEngine::displayParchment(int id) {
if (id >= 0) {
// display text
Common::SeekableReadStream *s = _res->createReadStream("TEXT.DAT");
- if (s)
+ if (s) {
_screen->loadFileDataToPage(s, 5, 32000);
- else
- _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
+ } else {
+ s = _res->createReadStream("TEXT.CPS");
+ if (s->readSint32BE() + 12 == s->size())
+ _screen->loadSpecialAmigaCPS("TEXT.CPS", 5, false);
+ else
+ _screen->loadBitmap("TEXT.CPS", 5, 5, 0, true);
+ }
delete s;
_screen->set16bitShadingLevel(4);
gui_drawBox(0, 0, 176, 175, guiSettings()->colors.frame1, guiSettings()->colors.frame2, guiSettings()->colors.fill);
diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp
index f010069..9a2f4e2 100644
--- a/engines/kyra/engine/scene_eob.cpp
+++ b/engines/kyra/engine/scene_eob.cpp
@@ -132,7 +132,12 @@ void EoBCoreEngine::readLevelFileData(int level) {
if (s) {
s->seek(0);
- _screen->loadFileDataToPage(s, 5, 15000);
+ if (s->readSint32BE() + 12 == s->size()) {
+ _screen->loadSpecialAmigaCPS(file.c_str(), 5, false);
+ } else {
+ s->seek(0);
+ _screen->loadFileDataToPage(s, 5, 15000);
+ }
delete s;
}
}
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index b3c0393..2e2674d 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -29,9 +29,11 @@
#include "kyra/engine/eobcommon.h"
#include "kyra/resource/resource.h"
+#include "kyra/engine/util.h"
#include "common/system.h"
#include "common/translation.h"
+#include "common/memstream.h"
#include "graphics/cursorman.h"
#include "graphics/palette.h"
@@ -267,9 +269,10 @@ void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int te
if (s->size() == 0) {
loadAlternative = true;
- // This check is due to EOB II Amiga German.That version simply checks
- // for certain file names which aren't actual CPS files. The files contain
- // raw data. I check the header size info to identify these.
+ // This check is due to EOB II Amiga German. That version simply checks
+ // for certain file names which aren't actual CPS files. These files use
+ // a diffenrent format and compression type. I check the header size
+ // info to identify these.
} else if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
// Tolerance for diffenrences up to 2 bytes is needed in some cases
if ((((s->readUint16LE()) + 5) & ~3) != (((s->size()) + 3) & ~3))
@@ -291,18 +294,7 @@ void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int te
loadBitmap(tmp.c_str(), tempPage, destPage, 0);
} else if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
- s = _vm->resource()->createReadStream(tmp);
- if (!s)
- error("Screen_EoB::loadEoBBitmap(): Failed to load file '%s'", file);
-
- // See comment above. In addition to checking for certain file names which
- // aren't real CPS files the EOB II Amiga German makes a specific check for CHARGEN.CPS
- // which contains palette data at the beginning. For now I haven't come up
- // with a way of avoiding this hack.
- if (tmp.equals("CHARGEN.CPS"))
- _palettes[0]->loadAmigaPalette(*s, 0, 32);
-
- loadFileDataToPage(s, destPage, 40000);
+ loadSpecialAmigaCPS(tmp.c_str(), destPage, true);
} else {
tmp.setChar('X', 0);
@@ -1529,6 +1521,128 @@ void Screen_EoB::shadeRect(int x1, int y1, int x2, int y2, int shadingLevel) {
_16bitShadingLevel = l;
}
+static uint32 _decodeFrameAmiga_x = 0;
+
+bool decodeFrameAmiga_readNextBit(const uint8 *&data, uint32 &code, uint32 &chk) {
+ _decodeFrameAmiga_x = code & 1;
+ code >>= 1;
+ if (code)
+ return _decodeFrameAmiga_x;
+
+ data -= 4;
+ code = READ_BE_UINT32(data);
+ chk ^= code;
+ _decodeFrameAmiga_x = code & 1;
+ code = (code >> 1) | (1 << 31);
+
+ return _decodeFrameAmiga_x;
+}
+
+uint32 decodeFrameAmiga_readBits(const uint8 *&data, uint32 &code, uint32 &chk, int count) {
+ uint32 res = 0;
+ while (count--) {
+ decodeFrameAmiga_readNextBit(data, code, chk);
+ uint32 bt1 = _decodeFrameAmiga_x;
+ _decodeFrameAmiga_x = res >> 31;
+ res = (res << 1) | bt1;
+ }
+ return res;
+}
+
+void Screen_EoB::loadSpecialAmigaCPS(const char *fileName, int destPage, bool isGraphics) {
+ uint32 fileSize = 0;
+ const uint8 *file = _vm->resource()->fileData(fileName, &fileSize);
+
+ if (!file)
+ error("Screen_EoB::loadSpecialAmigaCPS(): Failed to load file '%s'", file);
+
+ uint32 inSize = READ_BE_UINT32(file);
+ const uint8 *pos = file;
+
+ // Check whether the file starts with the actual compression header.
+ // If this is not the case, there should a palette before the header.
+ // Unlike normal CPS files these files never have more than one palette.
+ if (((inSize + 15) & ~3) != ((fileSize + 3) & ~3)) {
+ Common::MemoryReadStream in(pos, 64);
+ _palettes[0]->loadAmigaPalette(in, 0, 32);
+ pos += 64;
+ }
+
+ inSize = READ_BE_UINT32(pos);
+ uint32 outSize = READ_BE_UINT32(pos + 4);
+ uint32 chk = READ_BE_UINT32(pos + 8);
+
+ pos = pos + 8 + inSize;
+ uint8 *dstStart = _pagePtrs[destPage];
+ uint8 *dst = dstStart + outSize;
+
+ uint32 val = READ_BE_UINT32(pos);
+ _decodeFrameAmiga_x = 0;
+ chk ^= val;
+
+ while (dst > dstStart) {
+ int para = -1;
+ int para2 = 0;
+
+ if (decodeFrameAmiga_readNextBit(pos, val, chk)) {
+ uint32 code = decodeFrameAmiga_readBits(pos, val, chk, 2);
+
+ if (code == 3) {
+ para = para2 = 8;
+ } else {
+ int cnt = 0;
+ if (code < 2) {
+ cnt = 3 + code;
+ para2 = 9 + code;
+ } else {
+ cnt = decodeFrameAmiga_readBits(pos, val, chk, 8) + 1;
+ para2 = 12;
+ }
+
+ code = decodeFrameAmiga_readBits(pos, val, chk, para2);
+ while (cnt--) {
+ dst--;
+ *dst = dst[code & 0xFFFF];
+ }
+ }
+ } else {
+ if (decodeFrameAmiga_readNextBit(pos, val, chk)) {
+ uint32 code = decodeFrameAmiga_readBits(pos, val, chk, 8);
+ dst--;
+ *dst = dst[code & 0xFFFF];
+ dst--;
+ *dst = dst[code & 0xFFFF];
+
+ } else {
+ para = 3;
+ }
+ }
+
+ if (para > 0) {
+ uint32 code = decodeFrameAmiga_readBits(pos, val, chk, para);
+ uint32 cnt = (code & 0xFFFF) + para2 + 1;
+
+ while (cnt--) {
+ for (int i = 0; i < 8; ++i) {
+ decodeFrameAmiga_readNextBit(pos, val, chk);
+ uint32 bt1 = _decodeFrameAmiga_x;
+ _decodeFrameAmiga_x = code >> 31;
+ code = (code << 1) | bt1;
+ }
+ *(--dst) = code & 0xFF;
+ }
+ }
+ }
+
+ delete[] file;
+
+ if (chk)
+ error("Screen_EoB::loadSpecialAmigaCPS(): Checksum error");
+
+ if (isGraphics)
+ convertAmigaGfx(_pagePtrs[destPage], 320, 200);
+}
+
void Screen_EoB::updateDirtyRects() {
if (!_useHiResEGADithering) {
Screen::updateDirtyRects();
diff --git a/engines/kyra/graphics/screen_eob.h b/engines/kyra/graphics/screen_eob.h
index 42a03ca..66efc25 100644
--- a/engines/kyra/graphics/screen_eob.h
+++ b/engines/kyra/graphics/screen_eob.h
@@ -90,6 +90,9 @@ public:
void convertToHiColor(int page);
void shadeRect(int x1, int y1, int x2, int y2, int shadingLevel);
+ // Amiga specific
+ void loadSpecialAmigaCPS(const char *fileName, int destPage, bool isGraphics);
+
private:
void updateDirtyRects();
void ditherRect(const uint8 *src, uint8 *dst, int dstPitch, int srcW, int srcH, int colorKey = -1);
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index 86e837e..b92eb74 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -131,7 +131,7 @@ int DarkMoonEngine::mainMenu() {
while (menuChoice >= 0 && !shouldQuit()) {
switch (menuChoice) {
case 0: {
- if (_flags.platform == Common::kPlatformFMTowns) {
+ if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformAmiga) {
_screen->loadPalette("MENU.PAL", _screen->getPalette(0));
_screen->setScreenPalette(_screen->getPalette(0));
_screen->loadEoBBitmap("MENU", 0, 3, 3, 2);
@@ -1341,8 +1341,8 @@ void DarkmoonSequenceHelper::loadScene(int index, int pageNum, bool ignorePalett
_screen->loadBitmap(_config->cpsFiles[index], pageNum | 1, pageNum | 1, ignorePalette ? 0 : _palettes[0]);
} else if (s && _vm->gameFlags().platform == Common::kPlatformAmiga) {
- _screen->loadFileDataToPage(s, 5, 64000);
- _screen->decodeLocalizedAmigaPage(5, pageNum, true);
+ delete s;
+ _screen->loadSpecialAmigaCPS(_config->cpsFiles[index], pageNum | 1, true);
} else {
if (!s) {
Commit: cbe81aa021bab1082ee6a652cbd15fe323ea2069
https://github.com/scummvm/scummvm/commit/cbe81aa021bab1082ee6a652cbd15fe323ea2069
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:00+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix GUI colors
Changed paths:
engines/kyra/engine/darkmoon.cpp
engines/kyra/engine/darkmoon.h
engines/kyra/gui/gui_eob.cpp
engines/kyra/resource/staticres_eob.cpp
diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index 617cd09..c7a91c7 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -495,7 +495,12 @@ void DarkMoonEngine::characterLevelGain(int charIndex) {
}
const KyraRpgGUISettings *DarkMoonEngine::guiSettings() const {
- return (_flags.platform == Common::kPlatformFMTowns) ? &_guiSettingsFMTowns : &_guiSettingsDOS;
+ if (_flags.platform == Common::kPlatformAmiga)
+ return &_guiSettingsAmiga;
+ else if (_flags.platform == Common::kPlatformFMTowns)
+ return &_guiSettingsFMTowns;
+ else
+ return &_guiSettingsDOS;
}
} // End of namespace Kyra
diff --git a/engines/kyra/engine/darkmoon.h b/engines/kyra/engine/darkmoon.h
index 16fe856..71bfc75 100644
--- a/engines/kyra/engine/darkmoon.h
+++ b/engines/kyra/engine/darkmoon.h
@@ -132,6 +132,7 @@ private:
static const KyraRpgGUISettings _guiSettingsDOS;
static const KyraRpgGUISettings _guiSettingsFMTowns;
+ static const KyraRpgGUISettings _guiSettingsAmiga;
static const uint8 _egaDefaultPalette[];
};
diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index 005c67c..bfde732 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -368,7 +368,7 @@ void EoBCoreEngine::gui_drawHitpoints(int index) {
y = 16;
w = 51;
h = 5;
- if (_flags.platform == Common::kPlatformAmiga)
+ if (_flags.platform == Common::kPlatformAmiga && _flags.gameID == GI_EOB1)
bgCol = guiSettings()->colors.sfill;
}
@@ -4327,7 +4327,7 @@ void GUI_EoB::restParty_updateRestTime(int hours, bool init) {
_vm->_txt->clearCurDim();
drawMenuButtonBox(_screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->w << 3, _screen->_curDim->h, false, false);
_screen->copyRegion(_screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->sx << 3, _screen->_curDim->sy, _screen->_curDim->w << 3, _screen->_curDim->h, 0, 2, Screen::CR_NO_P_CHECK);
- _screen->printShadedText(getMenuString(42), (_screen->_curDim->sx + 1) << 3, _screen->_curDim->sy + 5, 9, 0, _vm->guiSettings()->colors.guiColorBlack);
+ _screen->printShadedText(getMenuString(42), (_screen->_curDim->sx + 1) << 3, _screen->_curDim->sy + 5, _vm->guiSettings()->colors.guiColorLightBlue, 0, _vm->guiSettings()->colors.guiColorBlack);
}
_screen->setCurPage(0);
diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index a75c464..20497d0 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -1418,6 +1418,11 @@ const KyraRpgGUISettings DarkMoonEngine::_guiSettingsDOS = {
{ 186, 181, 183, 183, 184, 17, 23, 20, 186, 181, 183, 182, 177, 180, 15, 6, 8, 9, 2, 5, 4, 3, 12 }
};
+const KyraRpgGUISettings DarkMoonEngine::_guiSettingsAmiga = {
+ { 28, 31, 95, 9, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
+ { 18, 17, 10, 17, 11, 10, 12, 25, 18, 9, 10, 18, 9, 10, 31, 24, 25, 28, 29, 7, 26, 27, 19 }
+};
+
const uint8 DarkMoonEngine::_egaDefaultPalette[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
};
Commit: 69f2e0caaa3b7257318f2e9943d233da45bfab80
https://github.com/scummvm/scummvm/commit/69f2e0caaa3b7257318f2e9943d233da45bfab80
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:01+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix ingame colors
Changed paths:
engines/kyra/engine/darkmoon.cpp
engines/kyra/engine/eobcommon.cpp
engines/kyra/engine/scene_eob.cpp
engines/kyra/engine/scene_rpg.cpp
engines/kyra/engine/sprites_eob.cpp
engines/kyra/graphics/screen.cpp
engines/kyra/graphics/screen.h
engines/kyra/graphics/screen_eob.cpp
engines/kyra/graphics/screen_eob.h
engines/kyra/gui/gui_eob.cpp
engines/kyra/script/script_eob.cpp
engines/kyra/sequence/sequences_darkmoon.cpp
diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index c7a91c7..8d621b9 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -153,6 +153,9 @@ void DarkMoonEngine::updateUsedCharacterHandItem(int charIndex, int slot) {
}
void DarkMoonEngine::generateMonsterPalettes(const char *file, int16 monsterIndex) {
+ if (_flags.platform == Common::kPlatformAmiga)
+ return;
+
int cp = _screen->setCurPage(2);
_screen->loadShapeSetBitmap(file, 3, 3);
uint8 tmpPal[16];
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 1c75c78..798bfb6 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -1639,12 +1639,15 @@ void EoBCoreEngine::drawSequenceBitmap(const char *file, int destRect, int x1, i
static const uint8 frameH[] = { 96, 121 };
int page = ((flags & 2) || destRect) ? 0 : 6;
+ int amigaPalIndex = (x1 ? 1 : 0) + (y1 ? 2 : 0) + 1;
if (scumm_stricmp(_dialogueLastBitmap, file)) {
_screen->clearPage(2);
if (!destRect) {
if (!(flags & 1)) {
_screen->loadEoBBitmap("BORDER", 0, 3, 3, 2);
+ if (_flags.platform == Common::kPlatformAmiga)
+ _screen->copyRegion(0, 0, 0, 0, 320, 122, 2, 0, Screen::CR_NO_P_CHECK);
_screen->copyRegion(0, 0, 0, 0, 184, 121, 2, page, Screen::CR_NO_P_CHECK);
} else {
_screen->copyRegion(0, 0, 0, 0, 184, 121, 0, page, Screen::CR_NO_P_CHECK);
@@ -1658,13 +1661,25 @@ void EoBCoreEngine::drawSequenceBitmap(const char *file, int destRect, int x1, i
strcpy(_dialogueLastBitmap, file);
}
+ if (_flags.platform == Common::kPlatformAmiga) {
+ int cp = _screen->setCurPage(0);
+ if (!_dialogueFieldAmiga)
+ gui_drawDialogueBox();
+ _screen->drawClippedLine(0, 120, 319, 120, 9);
+ _screen->drawClippedLine(0, 121, 319, 121, guiSettings()->colors.fill);
+ _screen->setPagePixel(0, 319, 121, 9);
+ _screen->setCurPage(cp);
+ _screen->setupDualPalettesSplitScreen(_screen->getPalette(amigaPalIndex), _screen->getPalette(7));
+ _dialogueFieldAmiga = true;
+ }
+
if (flags & 2)
_screen->crossFadeRegion(x1 << 3, y1, frameX[destRect] << 3, frameY[destRect], frameW[destRect] << 3, frameH[destRect], 2, page);
else
_screen->copyRegion(x1 << 3, y1, frameX[destRect] << 3, frameY[destRect], frameW[destRect] << 3, frameH[destRect], 2, page, Screen::CR_NO_P_CHECK);
if (page == 6)
- _screen->copyRegion(0, 0, 0, 0, 184, 121, 6, 0, Screen::CR_NO_P_CHECK);
+ _screen->copyRegion(0, 0, 0, 0, 184, (_flags.platform == Common::kPlatformAmiga) ? 110 : 121, 6, 0, Screen::CR_NO_P_CHECK);
_screen->updateScreen();
}
diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp
index 9a2f4e2..7f3c464 100644
--- a/engines/kyra/engine/scene_eob.cpp
+++ b/engines/kyra/engine/scene_eob.cpp
@@ -96,7 +96,7 @@ void EoBCoreEngine::loadLevel(int level, int sub) {
loadVcnData(gfxFile.c_str(), (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformDOS) ? _cgaMappingLevel[_cgaLevelMappingIndex[level - 1]] : 0);
_screen->loadEoBBitmap("INVENT", _cgaMappingInv, 5, 3, 2);
- if (_flags.platform == Common::kPlatformAmiga)
+ if (_flags.platform == Common::kPlatformAmiga && _flags.gameID == GI_EOB1)
_screen->getPalette(0).copy(_screen->getPalette(1), 1, 5, 1);
delayUntil(end);
@@ -190,8 +190,8 @@ Common::String EoBCoreEngine::initLevelData(int sub) {
_screen->enableShapeBackgroundFading(false);
}
- if (_flags.platform != Common::kPlatformAmiga && (_flags.gameID == GI_EOB2 || _configRenderMode != Common::kRenderEGA))
- _screen->loadPalette(tmpStr.c_str(), _screen->getPalette(0));
+ if (_flags.gameID == GI_EOB2 || (_flags.platform != Common::kPlatformAmiga && _configRenderMode != Common::kRenderCGA && _configRenderMode != Common::kRenderEGA))
+ _screen->loadPalette(tmpStr.c_str(), _screen->getPalette(_flags.platform == Common::kPlatformAmiga ? 6 : 0));
if (_flags.platform == Common::kPlatformFMTowns) {
uint16 *src = (uint16*)_screen->getPalette(0).getData();
@@ -368,7 +368,7 @@ void EoBCoreEngine::loadVcnData(const char *file, const uint8 *cgaMapping) {
}
}
} else {
- if (!(_flags.gameID == GI_EOB1 && _configRenderMode == Common::kRenderEGA))
+ if (_flags.platform != Common::kPlatformAmiga && !(_flags.gameID == GI_EOB1 && _configRenderMode == Common::kRenderEGA))
memcpy(_vcnColTable, colMap, 32);
memcpy(_vcnBlocks, pos, vcnSize);
@@ -546,7 +546,7 @@ void EoBCoreEngine::drawScene(int refresh) {
if (_sceneDrawPage2) {
if (refresh)
- _screen->fillRect(0, 0, 176, 120, 12);
+ _screen->fillRect(0, 0, 176, 120, guiSettings()->colors.guiColorBlack);
if (!_loading)
_screen->setScreenPalette(_screen->getPalette(0));
diff --git a/engines/kyra/engine/scene_rpg.cpp b/engines/kyra/engine/scene_rpg.cpp
index 4c0a97e..1bb777f 100644
--- a/engines/kyra/engine/scene_rpg.cpp
+++ b/engines/kyra/engine/scene_rpg.cpp
@@ -534,20 +534,20 @@ void KyraRpgEngine::vcnDraw_bw_trans_hiCol(uint8 *&dst, const uint8 *&src) {
void KyraRpgEngine::vcnDraw_fw_Amiga(uint8 *&dst, const uint8 *&src) {
for (int blockX = 0; blockX < 8; blockX++) {
- *dst = 0;
+ uint8 col = 0;
for (int i = 0; i < 5; ++i)
- *dst |= (((src[i] & (0x80 >> blockX)) >> (7 - blockX)) << i);
- dst++;
+ col |= (((src[i] & (0x80 >> blockX)) >> (7 - blockX)) << i);
+ *dst++ = col;
}
src += 5;
}
void KyraRpgEngine::vcnDraw_bw_Amiga(uint8 *&dst, const uint8 *&src) {
for (int blockX = 7; blockX >= 0; blockX--) {
- *dst = 0;
+ uint8 col = 0;
for (int i = 0; i < 5; ++i)
- *dst |= (((src[i] & (0x80 >> blockX)) >> (7 - blockX)) << i);
- dst++;
+ col |= (((src[i] & (0x80 >> blockX)) >> (7 - blockX)) << i);
+ *dst++ = col;
}
src += 5;
}
diff --git a/engines/kyra/engine/sprites_eob.cpp b/engines/kyra/engine/sprites_eob.cpp
index 5e2e58e..f7e65f2 100644
--- a/engines/kyra/engine/sprites_eob.cpp
+++ b/engines/kyra/engine/sprites_eob.cpp
@@ -363,6 +363,7 @@ void EoBCoreEngine::drawBlockObject(int flipped, int page, const uint8 *shape, i
const ScreenDim *d = _screen->getScreenDim(sd);
if (_flags.gameID == GI_EOB1)
x &= ~1;
+
_screen->drawShape(page, shape, x - (d->sx << 3), y - d->sy, sd, flipped | (ovl ? 2 : 0), ovl);
}
@@ -373,7 +374,7 @@ void EoBCoreEngine::drawMonsterShape(const uint8 *shape, int x, int y, int flipp
ovl = _monsterFlashOverlay;
else if (_flags.gameID == GI_EOB2 && flags & 0x20)
ovl = _monsterStoneOverlay;
- else if (palIndex != -1)
+ else if (palIndex != -1 && _flags.platform != Common::kPlatformAmiga)
ovl = _monsterPalettes[palIndex];
drawBlockObject(flipped, 2, shape, x, y, 5, ovl);
diff --git a/engines/kyra/graphics/screen.cpp b/engines/kyra/graphics/screen.cpp
index ea0871f..b69cc07 100644
--- a/engines/kyra/graphics/screen.cpp
+++ b/engines/kyra/graphics/screen.cpp
@@ -100,6 +100,8 @@ bool Screen::init() {
_useSJIS = false;
_use16ColorMode = _vm->gameFlags().use16ColorMode;
_isAmiga = (_vm->gameFlags().platform == Common::kPlatformAmiga);
+ // Amiga copper palette magic requires the use of more than 32 colors for some purposes.
+ _useAmigaExtraColors = (_isAmiga && _vm->game() == GI_EOB2);
// We only check the "render_mode" setting for both Eye of the Beholder
// games here, since all the other games do not support the render_mode
@@ -174,14 +176,18 @@ bool Screen::init() {
const int paletteCount = _isAmiga ? 13 : 4;
// We allow 256 color palettes in EGA mode, since original EOB II code does the same and requires it
const int numColors = _use16ColorMode ? 16 : (_isAmiga ? 32 : (_renderMode == Common::kRenderCGA ? 4 : 256));
+ const int numColorsInternal = _useAmigaExtraColors ? 64 : numColors;
_interfacePaletteEnabled = false;
- _screenPalette = new Palette(numColors);
+ _screenPalette = new Palette(numColorsInternal);
assert(_screenPalette);
_palettes.resize(paletteCount);
- for (int i = 0; i < paletteCount; ++i) {
+ _palettes[0] = new Palette(numColorsInternal);
+ assert(_palettes[0]);
+
+ for (int i = 1; i < paletteCount; ++i) {
_palettes[i] = new Palette(numColors);
assert(_palettes[i]);
}
@@ -195,7 +201,7 @@ bool Screen::init() {
Screen::setScreenPalette(pal);
}
- _internFadePalette = new Palette(numColors);
+ _internFadePalette = new Palette(numColorsInternal);
assert(_internFadePalette);
setScreenPalette(getPalette(0));
diff --git a/engines/kyra/graphics/screen.h b/engines/kyra/graphics/screen.h
index b6706cd..b1b2d86 100644
--- a/engines/kyra/graphics/screen.h
+++ b/engines/kyra/graphics/screen.h
@@ -687,6 +687,7 @@ protected:
bool _useHiResEGADithering;
bool _useHiColorScreen;
bool _isAmiga;
+ bool _useAmigaExtraColors;
Common::RenderMode _renderMode;
int _bytesPerPixel;
int _screenPageSize;
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index 2e2674d..0e55962 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -62,7 +62,7 @@ Screen_EoB::Screen_EoB(EoBCoreEngine *vm, OSystem *system) : Screen(vm, system,
_egaDitheringTempPage = 0;
_cgaMappingDefault = 0;
_cgaDitheringTables[0] = _cgaDitheringTables[1] = 0;
- _useHiResEGADithering = false;
+ _useHiResEGADithering = _dualPaletteMode = false;
}
Screen_EoB::~Screen_EoB() {
@@ -165,6 +165,13 @@ void Screen_EoB::setMouseCursor(int x, int y, const byte *shape, const uint8 *ov
else
copyRegionToBuffer(6, 0, 0, mouseW, mouseH, cursor);
+ // Mouse cursor post processing for EOB II Amiga
+ if (_dualPaletteMode) {
+ int len = mouseW * mouseH;
+ while (--len > -1)
+ cursor[len] |= 0x20;
+ }
+
// Mouse cursor post processing for CGA mode. Unlike the original (which uses drawShape for the mouse cursor)
// the cursor manager cannot know whether a pixel value of 0 is supposed to be black or transparent. Thus, we
// go over the transparency mask again and turn the black pixels to color 4.
@@ -280,7 +287,7 @@ void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int te
}
if (!loadAlternative)
- loadBitmap(tmp.c_str(), tempPage, destPage, 0);
+ loadBitmap(tmp.c_str(), tempPage, destPage, _vm->gameFlags().platform == Common::kPlatformAmiga ? _palettes[0] : 0);
} else {
loadAlternative = true;
@@ -1643,23 +1650,63 @@ void Screen_EoB::loadSpecialAmigaCPS(const char *fileName, int destPage, bool is
convertAmigaGfx(_pagePtrs[destPage], 320, 200);
}
+void Screen_EoB::setupDualPalettesSplitScreen(Palette &top, Palette &bottom) {
+ // The original supports simultaneous fading of both palettes, but doesn't make any use of that
+ // feature. The fade rate is always set to 0. So I see no need to implement that.
+ _palettes[0]->copy(top, 0, 32, 0);
+ _palettes[0]->copy(bottom, 0, 32, 32);
+ setScreenPalette(*_palettes[0]);
+ _dualPaletteMode = _forceFullUpdate = true;
+}
+
+void Screen_EoB::disableDualPalettesSplitScreen() {
+ _dualPaletteMode = false;
+ _forceFullUpdate = true;
+}
+
void Screen_EoB::updateDirtyRects() {
- if (!_useHiResEGADithering) {
+ if (!_useHiResEGADithering && !_dualPaletteMode) {
Screen::updateDirtyRects();
return;
}
- if (_forceFullUpdate) {
+ if (_dualPaletteMode && _forceFullUpdate) {
+ uint32 *pos = (uint32*)(_pagePtrs[0] + 120 * SCREEN_W);
+ uint16 h = 80 * (SCREEN_W >> 2);
+ while (h--)
+ *pos++ |= 0x20202020;
+ _system->copyRectToScreen(getCPagePtr(0), SCREEN_W, 0, 0, SCREEN_W, SCREEN_H);
+
+ } else if (_dualPaletteMode) {
+ Common::List<Common::Rect>::iterator it;
+ for (it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) {
+ if (it->bottom > 119) {
+ int16 startY = MAX<int16>(120, it->top);
+ int16 h = it->bottom - startY + 1;
+ int16 w = it->width();
+ uint8 *pos = _pagePtrs[0] + startY * SCREEN_W + it->left;
+ while (h--) {
+ for (int x = 0; x < w; ++x)
+ *pos++ |= 0x20;
+ pos += (SCREEN_W - w);
+ }
+ }
+ _system->copyRectToScreen(_pagePtrs[0] + it->top * SCREEN_W + it->left, SCREEN_W, it->left, it->top, it->width(), it->height());
+ }
+
+ } else if (_forceFullUpdate) {
ditherRect(getCPagePtr(0), _egaDitheringTempPage, SCREEN_W * 2, SCREEN_W, SCREEN_H);
_system->copyRectToScreen(_egaDitheringTempPage, SCREEN_W * 2, 0, 0, SCREEN_W * 2, SCREEN_H * 2);
+
} else {
- const byte *page0 = getCPagePtr(0);
+ const uint8 *page0 = getCPagePtr(0);
Common::List<Common::Rect>::iterator it;
for (it = _dirtyRects.begin(); it != _dirtyRects.end(); ++it) {
ditherRect(page0 + it->top * SCREEN_W + it->left, _egaDitheringTempPage, SCREEN_W * 2, it->width(), it->height());
_system->copyRectToScreen(_egaDitheringTempPage, SCREEN_W * 2, it->left * 2, it->top * 2, it->width() * 2, it->height() * 2);
}
}
+
_forceFullUpdate = false;
_dirtyRects.clear();
}
diff --git a/engines/kyra/graphics/screen_eob.h b/engines/kyra/graphics/screen_eob.h
index 66efc25..5df67df 100644
--- a/engines/kyra/graphics/screen_eob.h
+++ b/engines/kyra/graphics/screen_eob.h
@@ -93,6 +93,12 @@ public:
// Amiga specific
void loadSpecialAmigaCPS(const char *fileName, int destPage, bool isGraphics);
+ // This is a simple way of emulating the Amiga copper list palette magic for more than 32 colors.
+ // I use colors 32 to 63 for these extra colors (which the Amiga copper sends to the color
+ // registers on the fly at vertical beam position 120).
+ void setupDualPalettesSplitScreen(Palette &top, Palette &bottom);
+ void disableDualPalettesSplitScreen();
+
private:
void updateDirtyRects();
void ditherRect(const uint8 *src, uint8 *dst, int dstPitch, int srcW, int srcH, int colorKey = -1);
@@ -122,6 +128,7 @@ private:
uint8 *_dsTempPage;
uint8 *_shpBuffer;
uint8 *_convertHiColorBuffer;
+ bool _dualPaletteMode;
uint16 *_cgaDitheringTables[2];
const uint8 *_cgaMappingDefault;
diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index bfde732..981a33f 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -61,8 +61,15 @@ void EoBCoreEngine::gui_drawPlayField(bool refresh) {
_screen->updateScreen();
_screen->loadEoBBitmap("INVENT", _cgaMappingInv, 5, 3, 2);
- if (_flags.platform == Common::kPlatformAmiga)
- _screen->getPalette(0).copy(_screen->getPalette(1), 1, 5, 1);
+
+ if (_flags.platform == Common::kPlatformAmiga) {
+ if (_flags.gameID == GI_EOB1) {
+ _screen->getPalette(0).copy(_screen->getPalette(1), 1, 5, 1);
+ } else {
+ _screen->setupDualPalettesSplitScreen(_screen->getPalette(6), _screen->getPalette(1));
+ _screen->getPalette(7).copy(_screen->getPalette(1), 0, 32);
+ }
+ }
}
void EoBCoreEngine::gui_restorePlayField() {
@@ -3233,7 +3240,7 @@ 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, _vm->guiSettings()->colors.guiColorBlack);
+ _screen->printShadedText(Common::String::format(_vm->_menuStringsMgc[1], np[lastHighLightButton] - numAssignedSpellsPerBookPage[lastHighLightButton], np[lastHighLightButton]).c_str(), 8, 38, _vm->guiSettings()->colors.guiColorLightBlue, _vm->guiSettings()->colors.fill, _vm->guiSettings()->colors.guiColorBlack);
_screen->set16bitShadingLevel(0);
}
diff --git a/engines/kyra/script/script_eob.cpp b/engines/kyra/script/script_eob.cpp
index b063b08..1c96a53 100644
--- a/engines/kyra/script/script_eob.cpp
+++ b/engines/kyra/script/script_eob.cpp
@@ -1319,6 +1319,9 @@ int EoBInfProcessor::oeob_loadNewLevelOrMonsters(int8 *data) {
_vm->gui_drawAllCharPortraitsWithStats();
_subroutineStackPos = 0;
+ if (_vm->_flags.gameID == GI_EOB2 && _vm->_flags.platform == Common::kPlatformAmiga)
+ _vm->gui_restorePlayField();
+
} else {
cmd = *pos++;
_vm->releaseMonsterShapes(cmd * 18, 18);
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index b92eb74..7a581e5 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -160,6 +160,7 @@ int DarkMoonEngine::mainMenu() {
_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->showMouse();
_screen->updateScreen();
_allowImport = true;
menuChoice = mainMenuLoop();
@@ -1201,6 +1202,7 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *
}
_screen->enableHiColorMode(false);
+ _screen->disableDualPalettesSplitScreen();
int numColors = 256;
if (_vm->_flags.platform == Common::kPlatformAmiga) {
@@ -1296,7 +1298,6 @@ DarkmoonSequenceHelper::~DarkmoonSequenceHelper() {
_screen->enableHiColorMode(true);
_screen->clearCurPage();
_screen->setFont(_prevFont);
- _screen->showMouse();
_screen->updateScreen();
_system->delayMillis(150);
Commit: d56cea770bfa765acd8ed5df3015c35124b85d40
https://github.com/scummvm/scummvm/commit/d56cea770bfa765acd8ed5df3015c35124b85d40
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:01+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix sequence dialogue field
Changed paths:
engines/kyra/engine/eobcommon.cpp
engines/kyra/engine/kyra_rpg.cpp
engines/kyra/engine/kyra_rpg.h
engines/kyra/resource/staticres_eob.cpp
engines/kyra/script/script_eob.cpp
engines/kyra/script/script_eob.h
engines/kyra/text/text_rpg.cpp
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 798bfb6..6990427 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -1588,7 +1588,6 @@ void EoBCoreEngine::initDialogueSequence() {
_npcSequenceSub = -1;
_txt->setWaitButtonMode(0);
_dialogueField = true;
-
_dialogueLastBitmap[0] = 0;
_txt->resetPageBreakString();
@@ -1618,7 +1617,7 @@ void EoBCoreEngine::initDialogueSequence() {
void EoBCoreEngine::restoreAfterDialogueSequence() {
_txt->allowPageBreak(false);
- _dialogueField = false;
+ _dialogueField = _dialogueFieldAmiga = false;
_dialogueLastBitmap[0] = 0;
@@ -1850,9 +1849,13 @@ void EoBCoreEngine::displayParchment(int id) {
} else {
// display bitmap
- id = -id - 1;
static const uint8 x[] = { 0, 20, 0 };
static const uint8 y[] = { 0, 0, 96 };
+ id = -id - 1;
+
+ if (_flags.platform == Common::kPlatformAmiga)
+ _txt->setupField(9, 0);
+
drawSequenceBitmap("MAP", 0, x[id], y[id], 0);
removeInputTop();
diff --git a/engines/kyra/engine/kyra_rpg.cpp b/engines/kyra/engine/kyra_rpg.cpp
index 6164024..a2f0460 100644
--- a/engines/kyra/engine/kyra_rpg.cpp
+++ b/engines/kyra/engine/kyra_rpg.cpp
@@ -120,6 +120,7 @@ KyraRpgEngine::KyraRpgEngine(OSystem *system, const GameFlags &flags) : KyraEngi
memset(_lvlTempData, 0, sizeof(_lvlTempData));
_dialogueField = false;
+ _dialogueFieldAmiga = true;
_environmentSfx = _environmentSfxVol = _envSfxDistThreshold = 0;
_monsterStepCounter = _monsterStepMode = 0;
diff --git a/engines/kyra/engine/kyra_rpg.h b/engines/kyra/engine/kyra_rpg.h
index a6625e1..af1d27f 100644
--- a/engines/kyra/engine/kyra_rpg.h
+++ b/engines/kyra/engine/kyra_rpg.h
@@ -367,6 +367,7 @@ protected:
virtual TextDisplayer_rpg *txt() { return _txt; }
bool _dialogueField;
+ bool _dialogueFieldAmiga;
const char *_dialogueButtonString[9];
const uint16 *_dialogueButtonPosX;
diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index 20497d0..90a8b90 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -1419,7 +1419,7 @@ const KyraRpgGUISettings DarkMoonEngine::_guiSettingsDOS = {
};
const KyraRpgGUISettings DarkMoonEngine::_guiSettingsAmiga = {
- { 28, 31, 95, 9, 7, { 285, 139 }, { 189, 162 }, { 31, 31 } },
+ { 28, 31, 95, 9, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } },
{ 18, 17, 10, 17, 11, 10, 12, 25, 18, 9, 10, 18, 9, 10, 31, 24, 25, 28, 29, 7, 26, 27, 19 }
};
diff --git a/engines/kyra/script/script_eob.cpp b/engines/kyra/script/script_eob.cpp
index 1c96a53..a736396 100644
--- a/engines/kyra/script/script_eob.cpp
+++ b/engines/kyra/script/script_eob.cpp
@@ -518,7 +518,6 @@ int EoBInfProcessor::oeob_moveInventoryItemToBlock(int8 *data) {
}
int EoBInfProcessor::oeob_printMessage_v1(int8 *data) {
- static const char amigaColorMap[16] = { 0x00, 0x06, 0x1d, 0x1b, 0x1a, 0x17, 0x18, 0x0e, 0x19, 0x1c, 0x1c, 0x1e, 0x13, 0x0a, 0x11, 0x1f };
static const char colorConfig[] = "\x6\x21\x2\x21";
char col[5];
int8 *pos = data;
@@ -533,8 +532,8 @@ int EoBInfProcessor::oeob_printMessage_v1(int8 *data) {
if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
assert((uint8)col[1] < 16);
assert((uint8)col[3] < 16);
- col[1] = amigaColorMap[(uint8)col[1]];
- col[3] = amigaColorMap[(uint8)col[3]];
+ col[1] = _amigaColorMap[(uint8)col[1]];
+ col[3] = _amigaColorMap[(uint8)col[3]];
}
_vm->txt()->printMessage(col);
@@ -549,6 +548,7 @@ int EoBInfProcessor::oeob_printMessage_v1(int8 *data) {
}
int EoBInfProcessor::oeob_printMessage_v2(int8 *data) {
+
int8 *pos = data;
uint16 str = READ_LE_UINT16(pos);
pos += 2;
@@ -556,6 +556,12 @@ int EoBInfProcessor::oeob_printMessage_v2(int8 *data) {
pos += 2;
int c = 0;
+ _vm->_dialogueFieldAmiga = true;
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga) {
+ assert(col < 16);
+ col = _amigaColorMap[col];
+ }
+
if (_activeCharacter == -1) {
c = _vm->rollDice(1, 6, -1);
while (!_vm->testCharacter(c, 3))
@@ -1633,6 +1639,10 @@ int EoBInfProcessor::oeob_specialEvent(int8 *data) {
return pos - data;
}
+const uint8 EoBInfProcessor::_amigaColorMap[16] = {
+ 0x00, 0x06, 0x1d, 0x1b, 0x1a, 0x17, 0x18, 0x0e, 0x19, 0x1c, 0x1c, 0x1e, 0x13, 0x0a, 0x11, 0x1f
+};
+
} // End of namespace Kyra
#endif // ENABLE_EOB
diff --git a/engines/kyra/script/script_eob.h b/engines/kyra/script/script_eob.h
index b996e31..67d2fff 100644
--- a/engines/kyra/script/script_eob.h
+++ b/engines/kyra/script/script_eob.h
@@ -121,6 +121,8 @@ private:
int8 _activeCharacter;
+ static const uint8 _amigaColorMap[16];
+
const int _commandMin;
};
diff --git a/engines/kyra/text/text_rpg.cpp b/engines/kyra/text/text_rpg.cpp
index 6f1ed2a..f9d2a42 100644
--- a/engines/kyra/text/text_rpg.cpp
+++ b/engines/kyra/text/text_rpg.cpp
@@ -37,6 +37,10 @@ TextDisplayer_rpg::TextDisplayer_rpg(KyraRpgEngine *engine, Screen *scr) : _vm(e
_lineCount(0), _printFlag(false), _lineWidth(0), _numCharsTotal(0), _allowPageBreak(true),
_numCharsLeft(0), _numCharsPrinted(0), _sjisTextModeLineBreak(false), _waitButtonMode(1) {
+ static const uint8 amigaColorMap[16] = {
+ 0x00, 0x06, 0x1d, 0x1b, 0x1a, 0x17, 0x18, 0x0e, 0x19, 0x1c, 0x1c, 0x1e, 0x13, 0x0a, 0x11, 0x1f
+ };
+
_dialogueBuffer = new char[kEoBTextBufferSize];
memset(_dialogueBuffer, 0, kEoBTextBufferSize);
@@ -48,14 +52,8 @@ TextDisplayer_rpg::TextDisplayer_rpg(KyraRpgEngine *engine, Screen *scr) : _vm(e
for (int i = 0; i < 256; ++i)
_colorMap[i] = i;
- if (_vm->game() != GI_LOL) {
- _colorMap[15] = _vm->guiSettings()->colors.guiColorWhite;
- _colorMap[6] = _vm->guiSettings()->colors.guiColorLightRed;
- _colorMap[8] = _vm->guiSettings()->colors.guiColorDarkRed;
- _colorMap[9] = _vm->guiSettings()->colors.guiColorLightBlue;
- _colorMap[2] = _vm->guiSettings()->colors.guiColorBlue;
- _colorMap[12] = _vm->guiSettings()->colors.guiColorBlack;
- }
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ memcpy(_colorMap, amigaColorMap, 16);
for (int i = 0; i < _screen->screenDimTableCount(); i++) {
const ScreenDim *d = _screen->getScreenDim(i);
@@ -94,6 +92,8 @@ void TextDisplayer_rpg::setupField(int dim, bool mode) {
} else {
resetDimTextPositions(dim);
}
+
+ _vm->_dialogueFieldAmiga = false;
}
void TextDisplayer_rpg::resetDimTextPositions(int dim) {
@@ -189,11 +189,17 @@ void TextDisplayer_rpg::displayText(char *str, ...) {
case 1:
printLine(_currentLine);
_textDimData[sdx].color2 = parseCommand();
+ // EOB II Amiga does not use a color table here. EOB I doesn't do any color mapping here.
+ /*if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ _textDimData[sdx].color2 = _colorMap[_textDimData[sdx].color2];*/
break;
case 5:
printLine(_currentLine);
_textDimData[sdx].color1 = parseCommand();
+ // EOB I doesn't do any color mapping here.
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga && _vm->game() == GI_EOB2)
+ _textDimData[sdx].color1 = _colorMap[_textDimData[sdx].color1];
break;
case 8:
@@ -531,6 +537,8 @@ void TextDisplayer_rpg::printDialogueText(int stringId, const char *pageBreakStr
resetPageBreakString();
}
}
+
+ _vm->_dialogueFieldAmiga = true;
}
void TextDisplayer_rpg::printDialogueText(const char *str, bool wait) {
Commit: b01fd0e1df7f049c0a6d0572af3114fbe44906a9
https://github.com/scummvm/scummvm/commit/b01fd0e1df7f049c0a6d0572af3114fbe44906a9
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:01+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix original save file handling
Changed paths:
engines/kyra/gui/saveload_eob.cpp
diff --git a/engines/kyra/gui/saveload_eob.cpp b/engines/kyra/gui/saveload_eob.cpp
index f88266d..5a55c8f 100644
--- a/engines/kyra/gui/saveload_eob.cpp
+++ b/engines/kyra/gui/saveload_eob.cpp
@@ -654,8 +654,10 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
int8 testStr = test.readSByte();
test.seek(66);
int8 testChr = test.readSByte();
- test.seek(_flags.gameID == GI_EOB1 ? 48 : 50);
+ test.seek(_flags.gameID == GI_EOB1 ? 48 : 70);
uint32 exp = test.readUint32LE();
+ test.seek(_flags.gameID == GI_EOB1 ? 61 : 47);
+ bool padding = !test.readByte();
test.seek(0);
if (testStr >= 0 && testStr <= 25 && testChr >= 0 && testChr <= 25) {
@@ -663,7 +665,7 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
sourcePlatform = Common::kPlatformFMTowns;
}
- if (sourcePlatform == Common::kPlatformDOS && exp & 0xFF000000)
+ if (padding && sourcePlatform == Common::kPlatformDOS && exp & 0xFF000000)
sourcePlatform = Common::kPlatformAmiga;
Common::SeekableSubReadStreamEndian in(fs, 0, fs->size(), sourcePlatform == Common::kPlatformAmiga, DisposeAfterUse::YES);
@@ -699,6 +701,8 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
c->constitutionMax = in.readSByte();
c->charismaCur = in.readSByte();
c->charismaMax = in.readSByte();
+ if (_flags.gameID == GI_EOB2 && sourcePlatform == Common::kPlatformAmiga)
+ in.skip(1);
c->hitPointsCur = (_flags.gameID == GI_EOB1) ? in.readSByte() : in.readSint16();
c->hitPointsMax = (_flags.gameID == GI_EOB1) ? in.readSByte() : in.readSint16();
if (_flags.gameID == GI_EOB1) {
@@ -715,7 +719,7 @@ Common::String EoBCoreEngine::readOriginalSaveFile(Common::String &file) {
c->portrait = in.readSByte();
c->food = in.readByte();
in.read(c->level, 3);
- if (sourcePlatform == Common::kPlatformAmiga)
+ if (_flags.gameID == GI_EOB1 && sourcePlatform == Common::kPlatformAmiga)
in.skip(1);
for (int ii = 0; ii < 3; ii++)
c->experience[ii] = in.readUint32();
@@ -1093,6 +1097,7 @@ bool EoBCoreEngine::saveAsOriginalSaveFile(int slot) {
out->writeSByte(c->hitPointsCur);
out->writeSByte(c->hitPointsMax);
} else if (_flags.platform == Common::kPlatformAmiga) {
+ out->writeByte(0);
out->writeSint16BE(c->hitPointsCur);
out->writeSint16BE(c->hitPointsMax);
} else {
@@ -1110,7 +1115,8 @@ bool EoBCoreEngine::saveAsOriginalSaveFile(int slot) {
out->write(c->level, 3);
if (_flags.platform == Common::kPlatformAmiga) {
- out->writeByte(0);
+ if (_flags.gameID == GI_EOB1)
+ out->writeByte(0);
for (int ii = 0; ii < 3; ii++)
out->writeUint32BE(c->experience[ii]);
} else {
Commit: f96310dec6b7ecff17913f913b1b5518ad458870
https://github.com/scummvm/scummvm/commit/f96310dec6b7ecff17913f913b1b5518ad458870
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:01+02:00
Commit Message:
KYRA: (EOB) - fix saveload menu glitch
The save file list needs a refresh after transfering a party from EOB I to EOB II. This did not always happen.
Changed paths:
engines/kyra/engine/chargen.cpp
diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 2fc1586..8d5619c 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -1530,6 +1530,7 @@ TransferPartyWiz::TransferPartyWiz(EoBCoreEngine *vm, Screen_EoB *screen) : _vm(
}
TransferPartyWiz::~TransferPartyWiz() {
+ _vm->gui()->notifyUpdateSaveSlotsList();
delete[] _oldItems;
}
Commit: 2692702892d746731c8adc870c885f0be21d20f8
https://github.com/scummvm/scummvm/commit/2692702892d746731c8adc870c885f0be21d20f8
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:01+02:00
Commit Message:
KYRA: (EOB) - fix party transfer glitch
(recalculate armor class after party transfer from EOB I to EOB II)
Changed paths:
engines/kyra/engine/chargen.cpp
diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 8d5619c..2ae9682 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -1847,6 +1847,8 @@ void TransferPartyWiz::convertInventory() {
c->inventory[slot] = convertItem(itm);
}
}
+
+ _vm->recalcArmorClass(i);
}
}
Commit: d7e6b46814bdad33c5da667540ecc3c610f482ab
https://github.com/scummvm/scummvm/commit/d7e6b46814bdad33c5da667540ecc3c610f482ab
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:01+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix German version text
(add necessary character conversion)
Changed paths:
engines/kyra/text/text_rpg.cpp
engines/kyra/text/text_rpg.h
diff --git a/engines/kyra/text/text_rpg.cpp b/engines/kyra/text/text_rpg.cpp
index f9d2a42..7b891ee 100644
--- a/engines/kyra/text/text_rpg.cpp
+++ b/engines/kyra/text/text_rpg.cpp
@@ -116,6 +116,7 @@ void TextDisplayer_rpg::removePageBreakFlag() {
}
void TextDisplayer_rpg::displayText(char *str, ...) {
+ convertString(str);
_printFlag = false;
_lineWidth = 0;
@@ -754,6 +755,27 @@ void TextDisplayer_rpg::displayWaitButton() {
SWAP(_vm->_dialogueButtonLabelColor1, _vm->_dialogueButtonLabelColor2);
}
+void TextDisplayer_rpg::convertString(char *str) {
+ static const char convertTable_EOB2_Amiga_DE[] = {
+ '\x84', '\x7F', '\x8E', '\x7F', '\x81', '\x7D', '\x9A', '\x7D', '\x94', '\x7E', '\x99', '\x7E', '\0', '\0'
+ };
+
+ const char *table = 0;
+
+ if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformAmiga && _vm->gameFlags().lang == Common::DE_DEU)
+ table = convertTable_EOB2_Amiga_DE;
+
+ if (!table)
+ return;
+
+ for (; *str; ++str) {
+ for (const char *c = table; *c; c += 2) {
+ if ((*str) == c[0])
+ *str = c[1];
+ }
+ }
+}
+
} // End of namespace Kyra
#endif // (ENABLE_EOB || ENABLE_LOL)
diff --git a/engines/kyra/text/text_rpg.h b/engines/kyra/text/text_rpg.h
index 7f5825f..36d5d1f 100644
--- a/engines/kyra/text/text_rpg.h
+++ b/engines/kyra/text/text_rpg.h
@@ -67,6 +67,8 @@ protected:
virtual void textPageBreak();
void displayWaitButton();
+ void convertString(char *str);
+
char *_dialogueBuffer;
char *_tempString1;
Commit: 972f4e201ade5660723f6348480437e2a02fa6de
https://github.com/scummvm/scummvm/commit/972f4e201ade5660723f6348480437e2a02fa6de
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:02+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix flesh to stone spell colors
Changed paths:
engines/kyra/engine/eobcommon.cpp
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 6990427..16f9088 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -537,7 +537,7 @@ Common::Error EoBCoreEngine::init() {
_monsterFlashOverlay = new uint8[16];
_monsterStoneOverlay = new uint8[16];
memset(_monsterFlashOverlay, (_configRenderMode == Common::kRenderCGA) ? 0xFF : guiSettings()->colors.guiColorWhite, 16 * sizeof(uint8));
- memset(_monsterStoneOverlay, 0x0D, 16 * sizeof(uint8));
+ memset(_monsterStoneOverlay, (_flags.platform == Common::kPlatformAmiga) ? guiSettings()->colors.guiColorWhite : 0x0D, 16 * sizeof(uint8));
_monsterFlashOverlay[0] = _monsterStoneOverlay[0] = 0;
// Prevent autosave on game startup
Commit: 0ea6650837cce3007f0820acd17518f9809fd4a7
https://github.com/scummvm/scummvm/commit/0ea6650837cce3007f0820acd17518f9809fd4a7
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:02+02:00
Commit Message:
KYRA: (EOB2/Amiga) - implement proper sound file loading
(also fix some sound related bugs)
Changed paths:
engines/kyra/engine/chargen.cpp
engines/kyra/engine/darkmoon.cpp
engines/kyra/engine/darkmoon.h
engines/kyra/engine/eob.cpp
engines/kyra/engine/eob.h
engines/kyra/engine/eobcommon.cpp
engines/kyra/engine/eobcommon.h
engines/kyra/engine/scene_eob.cpp
engines/kyra/engine/sprites_eob.cpp
engines/kyra/resource/staticres_eob.cpp
engines/kyra/sound/drivers/audiomaster2.cpp
engines/kyra/sound/sound.h
engines/kyra/sound/sound_amiga_eob.cpp
engines/kyra/sound/sound_intern.h
diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp
index 2ae9682..7a4c967 100644
--- a/engines/kyra/engine/chargen.cpp
+++ b/engines/kyra/engine/chargen.cpp
@@ -634,16 +634,20 @@ int CharacterGenerator::alignmentMenu(int cClass) {
}
int CharacterGenerator::getInput(Button *buttonList) {
+ if (_vm->gameFlags().platform == Common::kPlatformAmiga)
+ return _vm->checkInput(buttonList, false, 0);
+
if (_vm->game() == GI_EOB1 && _vm->sound()->checkTrigger()) {
_vm->sound()->resetTrigger();
_vm->snd_playSong(20);
- } else if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform != Common::kPlatformAmiga && !_vm->sound()->isPlaying()) {
+ } else if (_vm->game() == GI_EOB2 && !_vm->sound()->isPlaying()) {
// WORKAROUND for EOB II: The original implements the same sound trigger check as in EOB I.
// However, Westwood seems to have forgotten to set the trigger at the end of the AdLib song,
// so that the music will not loop. We simply check whether the sound driver is still playing.
_vm->delay(3 * _vm->_tickLength);
_vm->snd_playSong(13);
}
+
return _vm->checkInput(buttonList, false, 0);
}
diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index 8d621b9..efe66a4 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -37,6 +37,11 @@ DarkMoonEngine::DarkMoonEngine(OSystem *system, const GameFlags &flags) : EoBCor
_utilMenuStrings = _ascii2SjisTables = _ascii2SjisTables2 = 0;
_npcShpData = _dscDoorType5Offs = _hornSounds = 0;
_dreamSteps = 0;
+
+ _amigaSoundMapExtra = _amigaSoundFiles2 = 0;
+ _amigaSoundIndex1 = 0;
+ _amigaSoundIndex2 = 0;
+ _amigaCurSoundIndex = 0;
}
DarkMoonEngine::~DarkMoonEngine() {
@@ -415,6 +420,91 @@ bool DarkMoonEngine::restParty_extraAbortCondition() {
return true;
}
+void DarkMoonEngine::snd_loadAmigaSounds(int level, int sub) {
+ if (_flags.platform != Common::kPlatformAmiga)
+ return;
+
+ int fileNum = _amigaSoundIndex2[level];
+ if (fileNum != _amigaCurSoundFile) {
+ for (int i = 52; i < 68; ++i) {
+ if (_amigaSoundMap[i]) {
+ _sound->unloadSoundFile(_amigaSoundMap[i]);
+ _amigaSoundMap[i] = 0;
+ }
+ }
+
+ _sound->loadSoundFile(_amigaSoundFiles2[fileNum]);
+ _amigaCurSoundFile = fileNum;
+
+ int mapCnt = 0;
+ for (int i = 0; i < fileNum + 1; ) {
+ if (!_amigaSoundMapExtra[mapCnt++][0])
+ i++;
+ }
+
+ for (int i = 52; i < 68; ++i) {
+ if (!_amigaSoundMapExtra[mapCnt][0]) {
+ _amigaSoundMap[i] = 0;
+ break;
+ }
+ _amigaSoundMap[i] = _amigaSoundMapExtra[mapCnt++];
+ }
+ }
+
+ if (level == 10 || (level == 8 && sub))
+ return;
+
+ uint16 sndIndex = 0;
+
+ for (int i = 0; i != level; ) {
+ int8 val = _amigaSoundIndex1[sndIndex++];
+ if (val == -1)
+ i++;
+ }
+
+ if (sub)
+ sndIndex += 4;
+
+ if (_amigaCurSoundIndex) {
+ for (int i = 0; i < 4; ++i) {
+ int8 valCur = _amigaSoundIndex1[_amigaCurSoundIndex + i];
+ int8 valNew = _amigaSoundIndex1[sndIndex + i];
+ if (valCur < 0)
+ continue;
+
+ if (i < 2) {
+ for (int ii = 1; ii < 5; ++ii)
+ _sound->unloadSoundFile(Common::String::format("%s%d", _amigaLevelSoundList2[valCur], ii));
+ } else {
+ if (valCur != valNew)
+ _sound->unloadSoundFile(Common::String::format("%s.SAM", _amigaLevelSoundList1[valCur]));
+ _sound->unloadSoundFile(Common::String::format("%s1", _amigaLevelSoundList2[valCur]));
+ }
+ }
+ }
+
+ for (int i = 0; i < 4; ++i) {
+ int8 valCur = _amigaCurSoundIndex ? _amigaSoundIndex1[_amigaCurSoundIndex + i] : -5;
+ int8 valNew = _amigaSoundIndex1[sndIndex + i];
+
+ if (valNew >= 0 && valNew != valCur) {
+ if (i < 2 && valCur >= 0 && _amigaCurSoundIndex)
+ _sound->unloadSoundFile(Common::String::format("%s.SAM", _amigaLevelSoundList1[_amigaSoundIndex1[_amigaCurSoundIndex]]));
+ _sound->loadSoundFile(Common::String::format("%s.CPS", _amigaLevelSoundList1[valNew]));
+ assert(_amigaLevelSoundList2[valNew]);
+ _amigaSoundMap[36 + i] = _amigaLevelSoundList2[valNew][0] ? _amigaLevelSoundList2[valNew] : 0;
+ } else if (valNew == -2) {
+ _amigaSoundMap[36 + i] = 0;
+ } else if (valNew == -3) {
+ _amigaSoundMap[36 + i] = _amigaSoundMap[35 + i];
+ }
+ }
+
+ _sound->loadSoundFile(Common::String::format(sub ? "LEVEL%da.SAM" : "LEVEL%d.SAM", level));
+
+ _amigaCurSoundIndex = sndIndex;
+}
+
void DarkMoonEngine::useHorn(int charIndex, int weaponSlot) {
int v = _items[_characters[charIndex].inventory[weaponSlot]].value - 1;
_txt->printMessage(_hornStrings[v]);
diff --git a/engines/kyra/engine/darkmoon.h b/engines/kyra/engine/darkmoon.h
index 71bfc75..b3a69d2 100644
--- a/engines/kyra/engine/darkmoon.h
+++ b/engines/kyra/engine/darkmoon.h
@@ -115,6 +115,16 @@ private:
void restParty_npc();
bool restParty_extraAbortCondition();
+ // Sound
+ void snd_loadAmigaSounds(int level, int sub);
+
+ const char *const *_amigaSoundFiles2;
+ const char *const *_amigaSoundMapExtra;
+ const int8 *_amigaSoundIndex1;
+ const uint8 *_amigaSoundIndex2;
+
+ int _amigaCurSoundIndex;
+
// misc
void useHorn(int charIndex, int weaponSlot);
bool checkPartyStatusExtra();
diff --git a/engines/kyra/engine/eob.cpp b/engines/kyra/engine/eob.cpp
index f2d06e0..dc653fa 100644
--- a/engines/kyra/engine/eob.cpp
+++ b/engines/kyra/engine/eob.cpp
@@ -513,6 +513,39 @@ void EoBEngine::turnUndeadAutoHit() {
sparkEffectOffensive();
}
+void EoBEngine::snd_loadAmigaSounds(int level, int) {
+ if (_flags.platform != Common::kPlatformAmiga || level == _amigaCurSoundFile)
+ return;
+
+ if (_amigaCurSoundFile != -1) {
+ _sound->unloadSoundFile(Common::String::format("L%dM1A1", _amigaCurSoundFile));
+ _sound->unloadSoundFile(Common::String::format("L%dM2A1", _amigaCurSoundFile));
+
+ for (int i = 1; i < 5; ++i) {
+ _sound->unloadSoundFile(Common::String::format("L%dM1M%d", _amigaCurSoundFile, i));
+ _sound->unloadSoundFile(Common::String::format("L%dM2M%d", _amigaCurSoundFile, i));
+ }
+
+ for (int i = 0; i < 2; ++i) {
+ if (_amigaLevelSoundList1[_amigaCurSoundFile * 2 + i][0])
+ _sound->unloadSoundFile(_amigaLevelSoundList1[_amigaCurSoundFile * 2 + i]);
+ if (_amigaLevelSoundList2[_amigaCurSoundFile * 2 + i][0])
+ _sound->unloadSoundFile(_amigaLevelSoundList2[_amigaCurSoundFile * 2 + i]);
+ }
+ }
+
+ for (int i = 0; i < 2; ++i) {
+ if (_amigaLevelSoundList1[level * 2 + i][0])
+ _sound->loadSoundFile(Common::String::format("%s.CPS", _amigaLevelSoundList1[level * 2 + i]));
+ if (_amigaLevelSoundList2[level * 2 + i][0])
+ _sound->loadSoundFile(Common::String::format("%s.CPS", _amigaLevelSoundList2[level * 2 + i]));
+ }
+
+ _sound->loadSoundFile(Common::String::format("LEVELSAM%d.CPS", level));
+
+ _amigaCurSoundFile = level;
+}
+
bool EoBEngine::checkPartyStatusExtra() {
_screen->copyPage(0, 10);
int cd = _screen->curDimIndex();
diff --git a/engines/kyra/engine/eob.h b/engines/kyra/engine/eob.h
index de98a91..efb6c47 100644
--- a/engines/kyra/engine/eob.h
+++ b/engines/kyra/engine/eob.h
@@ -109,6 +109,9 @@ private:
const char *const *_turnUndeadString;
+ // Sound
+ void snd_loadAmigaSounds(int level, int);
+
// Misc
bool checkPartyStatusExtra();
int resurrectionSelectDialogue();
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index 16f9088..153d179 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -221,6 +221,9 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) : KyraRpgE
_mnNumWord = _numSpells = _mageSpellListSize = _spellLevelsMageSize = _spellLevelsClericSize = 0;
_inventorySlotsX = _slotValidationFlags = _encodeMonsterShpTable = 0;
_cgaMappingDefault = _cgaMappingAlt = _cgaMappingInv = _cgaLevelMappingIndex = _cgaMappingItemsL = _cgaMappingItemsS = _cgaMappingThrown = _cgaMappingIcons = _cgaMappingDeco = 0;
+ _amigaLevelSoundList1 = _amigaLevelSoundList2 = 0;
+ _amigaSoundMap = 0;
+ _amigaCurSoundFile = -1;
memset(_cgaMappingLevel, 0, sizeof(_cgaMappingLevel));
memset(_expRequirementTables, 0, sizeof(_expRequirementTables));
memset(_saveThrowTables, 0, sizeof(_saveThrowTables));
@@ -322,6 +325,9 @@ EoBCoreEngine::~EoBCoreEngine() {
delete[] _menuDefs;
_menuDefs = 0;
+ delete[] _amigaSoundMap;
+ _amigaSoundMap = 0;
+
delete _inf;
_inf = 0;
delete _timer;
diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h
index 3566ea4..c4340a2 100644
--- a/engines/kyra/engine/eobcommon.h
+++ b/engines/kyra/engine/eobcommon.h
@@ -1180,6 +1180,13 @@ protected:
void snd_playSoundEffect(int id, int volume=0xFF);
void snd_stopSound();
void snd_fadeOut(int speed = 160);
+ virtual void snd_loadAmigaSounds(int level, int sub) = 0;
+
+ const char **_amigaSoundMap;
+ const char *const *_amigaLevelSoundList1;
+ const char *const *_amigaLevelSoundList2;
+
+ int _amigaCurSoundFile;
// keymap
static const char *const kKeymapName;
diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp
index 7f3c464..110bf0d 100644
--- a/engines/kyra/engine/scene_eob.cpp
+++ b/engines/kyra/engine/scene_eob.cpp
@@ -222,13 +222,15 @@ Common::String EoBCoreEngine::initLevelData(int sub) {
}
}
- if (_flags.gameID == GI_EOB2) {
+ if (_flags.platform == Common::kPlatformAmiga) {
+ delay(3 * _tickLength);
+ snd_loadAmigaSounds(_currentLevel, sub);
+ if (_flags.gameID == GI_EOB2)
+ pos += 13;
+ } else if (_flags.gameID == GI_EOB2) {
delay(3 * _tickLength);
_sound->loadSoundFile((const char *)pos);
pos += 13;
- } else if (_flags.platform == Common::kPlatformAmiga) {
- delay(3 * _tickLength);
- _sound->loadSoundFile(_currentLevel);
}
releaseDoorShapes();
diff --git a/engines/kyra/engine/sprites_eob.cpp b/engines/kyra/engine/sprites_eob.cpp
index f7e65f2..17a5f55 100644
--- a/engines/kyra/engine/sprites_eob.cpp
+++ b/engines/kyra/engine/sprites_eob.cpp
@@ -1038,7 +1038,10 @@ bool EoBCoreEngine::updateMonsterTryDistanceAttack(EoBMonsterInPlay *m) {
if (s < 20) {
monsterSpellCast(m, s);
} else if (s == 20) {
- snd_processEnvironmentalSoundEffect(103, m->block);
+ if (_flags.platform == Common::kPlatformAmiga)
+ snd_processEnvironmentalSoundEffect(39, _currentBlock + 1);
+ else
+ snd_processEnvironmentalSoundEffect(103, m->block);
_txt->printMessage(_monsterSpecAttStrings[0]);
for (int i = 0; i < 6; i++)
statusAttack(i, 4, _monsterSpecAttStrings[1], 1, 5, 9, 1);
diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index 90a8b90..c0ec243 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -468,9 +468,18 @@ void EoBCoreEngine::initStaticResource() {
void *sndInfo_finale = 0;
if (_flags.platform == Common::kPlatformAmiga) {
- const char *const *files = _staticres->loadStrings(kEoBBaseSoundFilesIngame, temp);
const char *const *map = _staticres->loadStrings(kEoBBaseSoundMap, temp2);
- SoundResourceInfo_AmigaEoB ingame(files, temp, map, temp2);
+ _amigaSoundMap = new const char*[temp2];
+ for (int i = 0; i < temp2; ++i) {
+ assert(map[i]);
+ _amigaSoundMap[i] = map[i][0] ? map[i] : 0;
+ }
+
+ _amigaLevelSoundList1 = _staticres->loadStrings(kEoBBaseLevelSounds1, temp);
+ _amigaLevelSoundList2 = _staticres->loadStrings(kEoBBaseLevelSounds2, temp);
+
+ const char *const *files = _staticres->loadStrings(kEoBBaseSoundFilesIngame, temp);
+ SoundResourceInfo_AmigaEoB ingame(files, temp, _amigaSoundMap, temp2);
sndInfo_ingame = &ingame;
files = _staticres->loadStrings(kEoBBaseSoundFilesIntro, temp);
SoundResourceInfo_AmigaEoB intro(files, temp, 0, 0);
@@ -1356,6 +1365,11 @@ void DarkMoonEngine::initStaticResource() {
_monsterAcHitChanceTable1 = _monsterAcHitChanceTbl1;
_monsterAcHitChanceTable2 = _monsterAcHitChanceTbl2;
+ _amigaSoundMapExtra = _staticres->loadStrings(kEoB2SoundMapExtra, temp);
+ _amigaSoundFiles2 = _staticres->loadStrings(kEoB2SoundFilesIngame2, temp);
+ _amigaSoundIndex1 = (const int8*)_staticres->loadRawData(kEoB2SoundIndex1, temp);
+ _amigaSoundIndex2 = _staticres->loadRawData(kEoB2SoundIndex2, temp);
+
static const char *const errorSlotNoNameString[3] = {
" You must specify\r a name for your\r save game!",
" Spielst[nde m]ssen\r einen Namen haben!",
diff --git a/engines/kyra/sound/drivers/audiomaster2.cpp b/engines/kyra/sound/drivers/audiomaster2.cpp
index dbc6f30..7db9887 100644
--- a/engines/kyra/sound/drivers/audiomaster2.cpp
+++ b/engines/kyra/sound/drivers/audiomaster2.cpp
@@ -292,12 +292,13 @@ private:
class AudioMaster2ResourceManager {
public:
- AudioMaster2ResourceManager(AudioMaster2Internal *driver, Common::Mutex *mutex);
+ AudioMaster2ResourceManager(AudioMaster2Internal *driver, Common::Mutex &mutex);
~AudioMaster2ResourceManager();
void loadResourceFile(Common::SeekableReadStream *data);
void initResource(SoundResource *resource);
+ void deinitResource(SoundResource *resource);
void releaseResource(const Common::String &resName);
void stopChain();
@@ -314,12 +315,12 @@ private:
void linkToChain(SoundResource *resource, SoundResource::Mode mode);
SoundResource *_chainPlaying;
- SoundResource *_chainInactive;
+ SoundResource *_chainStorage;
uint16 _masterVolume[3];
AudioMaster2Internal *_driver;
- Common::Mutex *_mutex;
+ Common::Mutex &_mutex;
};
class AudioMaster2IFFLoader : public Common::IFFParser {
@@ -456,11 +457,16 @@ void SoundResource::loadName(Common::ReadStream *stream, uint32 size) {
void SoundResource::open() {
_refCnt++;
+ debugC(8, kDebugLevelSound, "SoundResource::open(): '%s', type '%s', new refCount: '%d'", _name.c_str(), (_type == 1) ? "SMUS" : (_type == 2 ? "INST" : "8SVX"), _refCnt);
}
void SoundResource::close() {
- if (--_refCnt <= 0)
+ _refCnt--;
+ debugC(8, kDebugLevelSound, "SoundResource::close(): '%s', type '%s', new refCount: '%d' %s", _name.c_str(), (_type == 1) ? "SMUS" : (_type == 2 ? "INST" : "8SVX"), _refCnt, _refCnt <= 0 ? "--> RELEASED" : "");
+ if (_refCnt == 0) {
+ _res->deinitResource(this);
release();
+ }
}
const Common::String &SoundResource::getName() const {
@@ -656,6 +662,7 @@ void SoundResourceINST::loadSamples(Common::ReadStream *stream, uint32 size) {
} else {
// This will come up quite often in EOB II. But never with intruments that are actually used. No need to bother the user with a warning here.
debugC(9, kDebugLevelSound, "SoundResourceINST::loadInstrument(): Samples resource '%s' not found for '%s'.", data, _name.c_str());
+ _samplesResource = 0;
}
delete[] data;
@@ -760,11 +767,7 @@ void SoundResourceSMUS::prepare() {
_playFlags = 0;
for (Common::Array<Track*>::iterator trk = _tracks.begin(); trk != _tracks.end(); ++trk) {
(*trk)->_dataCur = (*trk)->_dataStart;
-
- for (Common::Array<SoundResource*>::iterator instr = _instruments.begin(); instr != _instruments.end(); ++instr) {
- (*trk)->setInstrument(*instr);
- break;
- }
+ (*trk)->setInstrument(*_instruments.begin());
if (!(*trk)->_instrument)
error("SoundResourceSMUS::prepare():: Unable to assign default instrument to track (resource files loaded in the wrong order?)");
@@ -864,7 +867,7 @@ const uint16 SoundResourceSMUS::_durationTable[64] = {
0x8700, 0x4380, 0x21c0, 0x10e0, 0x0870, 0x0438, 0x021c, 0x010e
};
-AudioMaster2ResourceManager::AudioMaster2ResourceManager(AudioMaster2Internal *driver, Common::Mutex *mutex) : _driver(driver), _mutex(mutex), _chainPlaying(0), _chainInactive(0) {
+AudioMaster2ResourceManager::AudioMaster2ResourceManager(AudioMaster2Internal *driver, Common::Mutex &mutex) : _driver(driver), _mutex(mutex), _chainPlaying(0), _chainStorage(0) {
memset(_masterVolume, 0, sizeof(_masterVolume));
}
@@ -898,6 +901,36 @@ void AudioMaster2ResourceManager::initResource(SoundResource *resource) {
linkToChain(res, SoundResource::kIdle);
}
+void AudioMaster2ResourceManager::deinitResource(SoundResource *resource) {
+ Common::StackLock lock(_mutex);
+
+ SoundResource *prev = 0;
+ for (SoundResource *cur = _chainPlaying; cur; cur = cur->_next) {
+ if (cur == resource) {
+ if (prev)
+ prev->_next = cur->_next;
+ else
+ _chainPlaying = cur->_next;
+ cur->_next = 0;
+ return;
+ }
+ prev = cur;
+ }
+
+ prev = 0;
+ for (SoundResource *cur = _chainStorage; cur; cur = cur->_next) {
+ if (cur == resource) {
+ if (prev)
+ prev->_next = cur->_next;
+ else
+ _chainStorage = cur->_next;
+ cur->_next = 0;
+ return;
+ }
+ prev = cur;
+ }
+}
+
void AudioMaster2ResourceManager::releaseResource(const Common::String &resName) {
stopChain();
@@ -910,7 +943,7 @@ void AudioMaster2ResourceManager::releaseResource(const Common::String &resName)
}
void AudioMaster2ResourceManager::stopChain() {
- Common::StackLock lock(*_mutex);
+ Common::StackLock lock(_mutex);
SoundResource *cur = _chainPlaying;
while (cur) {
@@ -922,21 +955,19 @@ void AudioMaster2ResourceManager::stopChain() {
}
void AudioMaster2ResourceManager::flush() {
- stopChain();
+ Common::StackLock lock(_mutex);
- Common::StackLock lock(*_mutex);
+ stopChain();
- for (SoundResource *res = _chainPlaying; _chainPlaying; res = _chainPlaying) {
- _chainPlaying = res->_next;
- res->_next = 0;
- res->setPlayStatus(false);
+ while (_chainPlaying) {
+ SoundResource *res = _chainPlaying;
+ deinitResource(res);
res->close();
}
- for (SoundResource *res = _chainInactive; _chainInactive; res = _chainInactive) {
- _chainInactive = res->_next;
- res->_next = 0;
- res->setPlayStatus(false);
+ while (_chainStorage) {
+ SoundResource *res = _chainStorage;
+ deinitResource(res);
res->close();
}
}
@@ -961,7 +992,7 @@ SoundResource *AudioMaster2ResourceManager::getResource(const Common::String &re
void AudioMaster2ResourceManager::setMasterVolume(int type, int volume) {
assert(type == 1 || type == 2 || type == 4);
- Common::StackLock lock(*_mutex);
+ Common::StackLock lock(_mutex);
_masterVolume[type >> 1] = volume & 0xFFFF;
@@ -970,7 +1001,7 @@ void AudioMaster2ResourceManager::setMasterVolume(int type, int volume) {
res->setMasterVolume(volume);
}
- for (SoundResource *res = _chainInactive; res; res = res->_next) {
+ for (SoundResource *res = _chainStorage; res; res = res->_next) {
if (res->getType() == type)
res->setMasterVolume(volume);
}
@@ -988,13 +1019,13 @@ void AudioMaster2ResourceManager::interrupt(AudioMaster2IOManager *io) {
cur = cur->_next;
} else if (prev) {
prev->_next = cur->_next;
- cur->_next = _chainInactive;
- _chainInactive = cur;
+ cur->_next = _chainStorage;
+ _chainStorage = cur;
cur = prev->_next;
} else {
_chainPlaying = cur->_next;
- cur->_next = _chainInactive;
- _chainInactive = cur;
+ cur->_next = _chainStorage;
+ _chainStorage = cur;
cur = _chainPlaying;
}
}
@@ -1012,11 +1043,11 @@ SoundResource *AudioMaster2ResourceManager::retrieveFromChain(const Common::Stri
const char *srchStr = resName.c_str();
uint32 srchDepth = strlen(srchStr);
+ Common::StackLock lock(_mutex);
+
SoundResource *cur = _chainPlaying;
SoundResource *prev = 0;
- Common::StackLock lock(*_mutex);
-
while (cur) {
if (!scumm_strnicmp(cur->getName().c_str(), srchStr, srchDepth)) {
if (prev)
@@ -1030,7 +1061,7 @@ SoundResource *AudioMaster2ResourceManager::retrieveFromChain(const Common::Stri
cur = cur->_next;
}
- cur = _chainInactive;
+ cur = _chainStorage;
prev = 0;
while (cur) {
@@ -1038,7 +1069,7 @@ SoundResource *AudioMaster2ResourceManager::retrieveFromChain(const Common::Stri
if (prev)
prev->_next = cur->_next;
else
- _chainInactive = cur->_next;
+ _chainStorage = cur->_next;
cur->_next = 0;
return cur;
}
@@ -1051,13 +1082,13 @@ SoundResource *AudioMaster2ResourceManager::retrieveFromChain(const Common::Stri
void AudioMaster2ResourceManager::linkToChain(SoundResource *resource, SoundResource::Mode mode) {
+ Common::StackLock lock(_mutex);
+
if (resource->getType() == 1) {
stopChain();
resource->prepare();
}
- Common::StackLock lock(*_mutex);
-
if (mode == SoundResource::kRestart) {
resource->setPlayStatus(true);
resource->_next = _chainPlaying;
@@ -1067,8 +1098,8 @@ void AudioMaster2ResourceManager::linkToChain(SoundResource *resource, SoundReso
_driver->sync(resource);
} else {
- resource->_next = _chainInactive;
- _chainInactive = resource;
+ resource->_next = _chainStorage;
+ _chainStorage = resource;
}
}
@@ -1203,13 +1234,13 @@ bool AudioMaster2Internal::init() {
return true;
_io = new AudioMaster2IOManager();
- _res = new AudioMaster2ResourceManager(this, &_mutex);
+ _res = new AudioMaster2ResourceManager(this, _mutex);
+ startPaula();
+
_mixer->playStream(Audio::Mixer::kPlainSoundType,
&_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
- startPaula();
-
_ready = true;
return true;
@@ -1290,9 +1321,9 @@ void AudioMaster2Internal::sync(SoundResource *res) {
if (res->getType() != 1)
return;
- SoundResourceSMUS *smus = static_cast<SoundResourceSMUS*>(res);
-
Common::StackLock lock(_mutex);
+
+ SoundResourceSMUS *smus = static_cast<SoundResourceSMUS*>(res);
_io->_tempo = smus->getTempo();
smus->setSync(_io->_sync);
}
diff --git a/engines/kyra/sound/sound.h b/engines/kyra/sound/sound.h
index 871263c..6c45d8b 100644
--- a/engines/kyra/sound/sound.h
+++ b/engines/kyra/sound/sound.h
@@ -161,6 +161,11 @@ public:
virtual void loadSoundFile(Common::String file) = 0;
/**
+ * Unload a specifc sound file that has been loaded before.
+ */
+ virtual void unloadSoundFile(Common::String file) {}
+
+ /**
* Load a sound file for playing sound
* effects from.
*/
diff --git a/engines/kyra/sound/sound_amiga_eob.cpp b/engines/kyra/sound/sound_amiga_eob.cpp
index 444c859..f572c11 100644
--- a/engines/kyra/sound/sound_amiga_eob.cpp
+++ b/engines/kyra/sound/sound_amiga_eob.cpp
@@ -30,7 +30,7 @@
namespace Kyra {
SoundAmiga_EoB::SoundAmiga_EoB(KyraEngine_v1 *vm, Audio::Mixer *mixer) : Sound(vm, mixer),
- _vm(vm), _driver(0), _currentResourceSet(-1), _currentFile(-1), _levelSoundList1(0), _levelSoundList2(0), _ready(false) {
+ _vm(vm), _driver(0), _currentResourceSet(-1), _ready(false) {
_fileBuffer = new uint8[64000];
memset(_resInfo, 0, sizeof(_resInfo));
}
@@ -51,11 +51,8 @@ bool SoundAmiga_EoB::init() {
if (!_driver->init())
return false;
- int temp = 0;
- _levelSoundList1 = _vm->staticres()->loadStrings(kEoBBaseLevelSounds1, temp);
- _levelSoundList2 = _vm->staticres()->loadStrings(kEoBBaseLevelSounds2, temp);
-
_ready = true;
+
return true;
}
@@ -78,29 +75,12 @@ void SoundAmiga_EoB::selectAudioResourceSet(int set) {
_currentResourceSet = set;
}
-void SoundAmiga_EoB::loadSoundFile(uint file) {
- if (_vm->gameFlags().platform != Common::kPlatformAmiga || _currentResourceSet != kMusicIngame || !_ready)
- return;
-
- unloadLevelSounds();
-
- for (int i = 0; i < 2; ++i) {
- if (_levelSoundList1[file * 2 + i][0])
- loadSoundFile(Common::String::format("%s.CPS", _levelSoundList1[file * 2 + i]));
- if (_levelSoundList2[file * 2 + i][0])
- loadSoundFile(Common::String::format("%s.CPS", _levelSoundList2[file * 2 + i]));
- }
-
- loadSoundFile(Common::String::format("LEVELSAM%d.CPS", file));
-
- _currentFile = file;
-}
-
void SoundAmiga_EoB::loadSoundFile(Common::String file) {
if (!_ready)
return;
Common::SeekableReadStream *in = _vm->resource()->createReadStream(file);
+ debugC(6, kDebugLevelSound, "SoundAmiga_EoB::loadSoundFile(): Attempting to load sound file '%s'...%s", file.c_str(), in ? "SUCCESS" : "FILE NOT FOUND");
if (!in)
return;
@@ -139,6 +119,13 @@ void SoundAmiga_EoB::loadSoundFile(Common::String file) {
delete[] buf;
}
+void SoundAmiga_EoB::unloadSoundFile(Common::String file) {
+ if (!_ready)
+ return;
+ debugC(5, kDebugLevelSound, "SoundAmiga_EoB::unloadSoundFile(): Attempting to free resource '%s'...%s", file.c_str(), _driver->stopSound(file) ? "SUCCESS" : "FAILURE");
+ _driver->flushResource(file);
+}
+
void SoundAmiga_EoB::playTrack(uint8 track) {
if (!_musicEnabled || !_ready)
return;
@@ -191,21 +178,32 @@ void SoundAmiga_EoB::playSoundEffect(uint8 track, uint8 volume) {
if (!_resInfo[_currentResourceSet]->soundList || track >= 120 || !_sfxEnabled)
return;
+ if (_vm->game() == GI_EOB2 && track == 2) {
+ beginFadeOut(60);
+ return;
+ }
+
Common::String newSound = _resInfo[_currentResourceSet]->soundList[track];
+ const char *suffix = (_vm->game() == GI_EOB1) ? "1.SAM" : ((track > 51 && track < 68) ? ".SMUS" : ".SAM");
if (!newSound.empty()) {
if (volume == 255) {
- if (_driver->startSound(newSound + "1.SAM")) {
- _lastSound = newSound + "1.SAM";
+ if (_driver->startSound(newSound + suffix)) {
+ _lastSound = newSound + suffix;
return;
} else {
volume = 1;
}
}
- if (volume > 0 && volume < 5) {
- newSound = Common::String::format("%s%d", newSound.c_str(), volume);
- _driver->startSound(newSound);
+ if (volume > 0 && volume < 5)
+ newSound = Common::String::format("%s%d", newSound.c_str(), volume);
+
+ if (!_driver->startSound(newSound)) {
+ // WORKAROUND for wrongly named resources. This applies to at least 'BLADE' in the EOB II dungeons (instead of 'BLADE1').
+ newSound = _resInfo[_currentResourceSet]->soundList[track];
+ if (_driver->startSound(newSound))
+ debugC(5, kDebugLevelSound, "SoundAmiga_EoB::playSoundEffect(): Triggered workaround for wrongly named resource: '%s'", newSound.c_str());
}
_lastSound = newSound;
@@ -216,6 +214,7 @@ void SoundAmiga_EoB::beginFadeOut(int delay) {
_driver->fadeOut(delay);
while (_driver->isFading() && !_vm->shouldQuit())
_vm->delay(5);
+ haltTrack();
}
void SoundAmiga_EoB::updateVolumeSettings() {
@@ -234,23 +233,4 @@ int SoundAmiga_EoB::checkTrigger() {
return _driver->getPlayDuration();
}
-void SoundAmiga_EoB::unloadLevelSounds() {
- if (_currentFile != -1) {
- _driver->flushResource(Common::String::format("L%dM1A1", _currentFile));
- _driver->flushResource(Common::String::format("L%dM2A1", _currentFile));
-
- for (int i = 1; i < 5; ++i) {
- _driver->flushResource(Common::String::format("L%dM1M%d", _currentFile, i));
- _driver->flushResource(Common::String::format("L%dM2M%d", _currentFile, i));
- }
-
- for (int i = 0; i < 2; ++i) {
- if (_levelSoundList1[_currentFile * 2 + i][0])
- _driver->flushResource(_levelSoundList1[_currentFile * 2 + i]);
- if (_levelSoundList2[_currentFile * 2 + i][0])
- _driver->flushResource(_levelSoundList2[_currentFile * 2 + i]);
- }
- }
-}
-
} // End of namespace Kyra
diff --git a/engines/kyra/sound/sound_intern.h b/engines/kyra/sound/sound_intern.h
index fbf19d7..57afb26 100644
--- a/engines/kyra/sound/sound_intern.h
+++ b/engines/kyra/sound/sound_intern.h
@@ -417,8 +417,9 @@ public:
void initAudioResourceInfo(int set, void *info);
void selectAudioResourceSet(int set);
bool hasSoundFile(uint file) const { return false; }
- void loadSoundFile(uint file);
+ void loadSoundFile(uint) {}
void loadSoundFile(Common::String file);
+ void unloadSoundFile(Common::String file);
void playTrack(uint8 track);
void haltTrack();
void playSoundEffect(uint8 track, uint8 volume = 0xFF);
@@ -428,8 +429,6 @@ public:
int checkTrigger();
private:
- void unloadLevelSounds();
-
uint8 *_fileBuffer;
KyraEngine_v1 *_vm;
@@ -438,10 +437,6 @@ private:
Common::String _lastSound;
int _currentResourceSet;
- int _currentFile;
-
- const char *const *_levelSoundList1;
- const char *const *_levelSoundList2;
bool _ready;
};
Commit: d84061c036dcf27efa9276a2f86619af0eac1dbe
https://github.com/scummvm/scummvm/commit/d84061c036dcf27efa9276a2f86619af0eac1dbe
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:02+02:00
Commit Message:
KYRA: (EOB2/Amiga) - fix German version monster sound
(Monster sounds are broken in the original, because the devs seem to have accidently left the sound track numbers from the DOS version. This will add a workaround.)
Changed paths:
engines/kyra/engine/darkmoon.cpp
engines/kyra/engine/darkmoon.h
engines/kyra/engine/eobcommon.h
engines/kyra/engine/sprites_eob.cpp
engines/kyra/resource/staticres_eob.cpp
diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index efe66a4..718e8a1 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -42,6 +42,8 @@ DarkMoonEngine::DarkMoonEngine(OSystem *system, const GameFlags &flags) : EoBCor
_amigaSoundIndex1 = 0;
_amigaSoundIndex2 = 0;
_amigaCurSoundIndex = 0;
+ _amigaSoundPatch = 0;
+ _amigaSoundPatchSize = 0;
}
DarkMoonEngine::~DarkMoonEngine() {
@@ -235,6 +237,85 @@ void DarkMoonEngine::loadMonsterDecoration(Common::SeekableReadStream *stream, i
}
}
+const uint8 *DarkMoonEngine::loadMonsterProperties(const uint8 *data) {
+ uint8 cmd = *data++;
+ while (cmd != 0xFF) {
+ EoBMonsterProperty *d = &_monsterProps[cmd];
+ d->armorClass = (int8)*data++;
+ d->hitChance = (int8)*data++;
+ d->level = (int8)*data++;
+ d->hpDcTimes = *data++;
+ d->hpDcPips = *data++;
+ d->hpDcBase = *data++;
+ d->attacksPerRound = *data++;
+ d->dmgDc[0].times = *data++;
+ d->dmgDc[0].pips = *data++;
+ d->dmgDc[0].base = (int8)*data++;
+ d->dmgDc[1].times = *data++;
+ d->dmgDc[1].pips = *data++;
+ d->dmgDc[1].base = (int8)*data++;
+ d->dmgDc[2].times = *data++;
+ d->dmgDc[2].pips = *data++;
+ d->dmgDc[2].base = (int8)*data++;
+ d->immunityFlags = READ_LE_UINT16(data);
+ data += 2;
+ d->capsFlags = READ_LE_UINT16(data);
+ data += 2;
+ d->typeFlags = READ_LE_UINT16(data);
+ data += 2;
+ d->experience = READ_LE_UINT16(data);
+ data += 2;
+
+ d->u30 = *data++;
+ d->sound1 = (int8)*data++;
+ d->sound2 = (int8)*data++;
+
+ // I have confirmed with WinUAE that the monster sounds in EOB II Amiga German are broken. Some
+ // monsters do at least have walking sounds. Attack sounds seem to be completely dysfunctional
+ // for all monsters. Maybe the devs who did the localization used the DOS resources without doing
+ // the necessary modifications. A quick debug run and comparison leaves the impression that the
+ // German Amiga version indeed has the track numbers from the DOS version.
+ // WORKAROUND: I've made an autogenerated sound patch file from the English version for all levels,
+ // sub levels and monster types. It became clear from the patch file that 95% of all sound entries
+ // are sound1 = 38 and sound2 = 36. So I eliminated these entries from the patch file and set
+ // the 38/36 combo as the default. This remaining patch file is rather small...
+ if (_flags.platform == Common::kPlatformAmiga && _flags.lang == Common::DE_DEU) {
+ d->sound1 = 38;
+ d->sound2 = 36;
+ uint8 id = (_currentLevel - 1) | (_currentSub << 4) | (cmd << 5);
+ for (int i = 0; i < _amigaSoundPatchSize; i += 3) {
+ if (_amigaSoundPatch[i] == id) {
+ d->sound1 = _amigaSoundPatch[i + 1];
+ d->sound2 = _amigaSoundPatch[i + 2];
+ break;
+ }
+ }
+ }
+
+ d->numRemoteAttacks = *data++;
+
+ if (*data++ != 0xFF) {
+ d->remoteWeaponChangeMode = *data++;
+ d->numRemoteWeapons = *data++;
+
+ for (int i = 0; i < d->numRemoteWeapons; i++) {
+ d->remoteWeapons[i] = (int8)*data;
+ data += 2;
+ }
+ }
+
+ d->tuResist = (int8)*data++;
+ d->dmgModifierEvade = *data++;
+
+ for (int i = 0; i < 3; i++)
+ d->decorations[i] = *data++;
+
+ cmd = *data++;
+ }
+
+ return data;
+}
+
void DarkMoonEngine::replaceMonster(int unit, uint16 block, int pos, int dir, int type, int shpIndex, int mode, int h2, int randItem, int fixedItem) {
uint8 flg = _levelBlockProperties[block].flags & 7;
diff --git a/engines/kyra/engine/darkmoon.h b/engines/kyra/engine/darkmoon.h
index b3a69d2..05847df 100644
--- a/engines/kyra/engine/darkmoon.h
+++ b/engines/kyra/engine/darkmoon.h
@@ -94,6 +94,7 @@ private:
// Monsters
void generateMonsterPalettes(const char *file, int16 monsterIndex);
void loadMonsterDecoration(Common::SeekableReadStream *stream, int16 monsterIndex);
+ const uint8 *loadMonsterProperties(const uint8 *data);
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);
@@ -122,6 +123,8 @@ private:
const char *const *_amigaSoundMapExtra;
const int8 *_amigaSoundIndex1;
const uint8 *_amigaSoundIndex2;
+ const uint8 *_amigaSoundPatch;
+ int _amigaSoundPatchSize;
int _amigaCurSoundIndex;
diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h
index c4340a2..97d7ea3 100644
--- a/engines/kyra/engine/eobcommon.h
+++ b/engines/kyra/engine/eobcommon.h
@@ -491,7 +491,7 @@ protected:
uint8 *loadTownsShape(Common::SeekableReadStream *stream);
virtual void generateMonsterPalettes(const char *file, int16 monsterIndex) {}
virtual void loadMonsterDecoration(Common::SeekableReadStream *stream, int16 monsterIndex) {}
- const uint8 *loadMonsterProperties(const uint8 *data);
+ virtual const uint8 *loadMonsterProperties(const uint8 *data) { return 0; }
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);
void placeMonster(EoBMonsterInPlay *m, uint16 block, int dir);
diff --git a/engines/kyra/engine/sprites_eob.cpp b/engines/kyra/engine/sprites_eob.cpp
index 17a5f55..362c6c8 100644
--- a/engines/kyra/engine/sprites_eob.cpp
+++ b/engines/kyra/engine/sprites_eob.cpp
@@ -88,62 +88,6 @@ uint8 *EoBCoreEngine::loadTownsShape(Common::SeekableReadStream *stream) {
return shape;
}
-const uint8 *EoBCoreEngine::loadMonsterProperties(const uint8 *data) {
- uint8 cmd = *data++;
- while (cmd != 0xFF) {
- EoBMonsterProperty *d = &_monsterProps[cmd];
- d->armorClass = (int8)*data++;
- d->hitChance = (int8)*data++;
- d->level = (int8)*data++;
- d->hpDcTimes = *data++;
- d->hpDcPips = *data++;
- d->hpDcBase = *data++;
- d->attacksPerRound = *data++;
- d->dmgDc[0].times = *data++;
- d->dmgDc[0].pips = *data++;
- d->dmgDc[0].base = (int8)*data++;
- d->dmgDc[1].times = *data++;
- d->dmgDc[1].pips = *data++;
- d->dmgDc[1].base = (int8)*data++;
- d->dmgDc[2].times = *data++;
- d->dmgDc[2].pips = *data++;
- d->dmgDc[2].base = (int8)*data++;
- d->immunityFlags = READ_LE_UINT16(data);
- data += 2;
- d->capsFlags = READ_LE_UINT16(data);
- data += 2;
- d->typeFlags = READ_LE_UINT16(data);
- data += 2;
- d->experience = READ_LE_UINT16(data);
- data += 2;
-
- d->u30 = *data++;
- d->sound1 = (int8)*data++;
- d->sound2 = (int8)*data++;
- d->numRemoteAttacks = *data++;
-
- if (*data++ != 0xFF) {
- d->remoteWeaponChangeMode = *data++;
- d->numRemoteWeapons = *data++;
-
- for (int i = 0; i < d->numRemoteWeapons; i++) {
- d->remoteWeapons[i] = (int8)*data;
- data += 2;
- }
- }
-
- d->tuResist = (int8)*data++;
- d->dmgModifierEvade = *data++;
-
- for (int i = 0; i < 3; i++)
- d->decorations[i] = *data++;
-
- cmd = *data++;
- }
-
- return data;
-}
-
const uint8 *EoBCoreEngine::loadActiveMonsterData(const uint8 *data, int level) {
for (uint8 p = *data++; p != 0xFF; p = *data++) {
uint8 v = *data++;
diff --git a/engines/kyra/resource/staticres_eob.cpp b/engines/kyra/resource/staticres_eob.cpp
index c0ec243..2082fc6 100644
--- a/engines/kyra/resource/staticres_eob.cpp
+++ b/engines/kyra/resource/staticres_eob.cpp
@@ -1369,6 +1369,7 @@ void DarkMoonEngine::initStaticResource() {
_amigaSoundFiles2 = _staticres->loadStrings(kEoB2SoundFilesIngame2, temp);
_amigaSoundIndex1 = (const int8*)_staticres->loadRawData(kEoB2SoundIndex1, temp);
_amigaSoundIndex2 = _staticres->loadRawData(kEoB2SoundIndex2, temp);
+ _amigaSoundPatch = _staticres->loadRawData(kEoB2MonsterSoundPatchData, _amigaSoundPatchSize);
static const char *const errorSlotNoNameString[3] = {
" You must specify\r a name for your\r save game!",
Commit: 6c496af5af4006304d01f0e6026e897c44ee57ef
https://github.com/scummvm/scummvm/commit/6c496af5af4006304d01f0e6026e897c44ee57ef
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:02+02:00
Commit Message:
KYRA: (EOB2/Amiga) - final glitches fix
Changed paths:
engines/kyra/engine/timer_eob.cpp
engines/kyra/gui/gui_eob.cpp
engines/kyra/gui/saveload_eob.cpp
engines/kyra/script/script_eob.cpp
diff --git a/engines/kyra/engine/timer_eob.cpp b/engines/kyra/engine/timer_eob.cpp
index ef50201..8bc81b3 100644
--- a/engines/kyra/engine/timer_eob.cpp
+++ b/engines/kyra/engine/timer_eob.cpp
@@ -61,6 +61,9 @@ void EoBCoreEngine::enableSysTimer(int sysTimer) {
KyraRpgEngine::enableSysTimer(sysTimer);
+ if (!_disableElapsedTime)
+ return;
+
_disableElapsedTime = _system->getMillis() - _disableElapsedTime;
for (int i = 0; i < 6; i++) {
@@ -75,8 +78,10 @@ void EoBCoreEngine::enableSysTimer(int sysTimer) {
if (_scriptTimersMode & 1) {
for (int i = 0; i < _scriptTimersCount; i++) {
- if (_scriptTimers[i].next)
+ if (_scriptTimers[i].next) {
_scriptTimers[i].next += _disableElapsedTime;
+ debugC(3, kDebugLevelTimer, "EoBCoreEngine::enableSysTimer() - CTIME: %08d SCRIPT TIMER[%02d].NEXT: %08d", _system->getMillis(), i, _scriptTimers[i].next);
+ }
}
}
@@ -94,6 +99,9 @@ void EoBCoreEngine::disableSysTimer(int sysTimer) {
KyraRpgEngine::disableSysTimer(sysTimer);
+ if (_disableElapsedTime)
+ return;
+
_disableElapsedTime = _system->getMillis();
}
@@ -202,9 +210,11 @@ void EoBCoreEngine::advanceTimers(uint32 millis) {
if (_scriptTimers[i].next > ct) {
uint32 chrt = _scriptTimers[i].next - ct;
_scriptTimers[i].next = chrt > millis ? ct + chrt - millis : 1;
+ debugC(3, kDebugLevelTimer, "EoBCoreEngine::advanceTimers() - CTIME: %08d SCRIPT TIMER[%02d].NEXT: %08d", ct, i, _scriptTimers[i].next);
} else if (_scriptTimers[i].next) {
_scriptTimers[i].next = 1;
- }
+ debugC(3, kDebugLevelTimer, "EoBCoreEngine::advanceTimers() - CTIME: %08d SCRIPT TIMER[%02d].NEXT: %08d", ct, i, _scriptTimers[i].next);
+ }
}
}
diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index 981a33f..2d51adb 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -507,7 +507,7 @@ void EoBCoreEngine::gui_drawInventoryItem(int slot, int redraw, int pageNum) {
uint8 col1 = guiSettings()->colors.frame1;
uint8 col2 = guiSettings()->colors.frame2;
- if (_flags.platform == Common::kPlatformAmiga) {
+ if (_flags.gameID == GI_EOB1 && _flags.platform == Common::kPlatformAmiga) {
col1 = guiSettings()->colors.inactiveTabFrame1;
col2 = guiSettings()->colors.inactiveTabFrame2;
} else if (_configRenderMode == Common::kRenderCGA) {
diff --git a/engines/kyra/gui/saveload_eob.cpp b/engines/kyra/gui/saveload_eob.cpp
index 5a55c8f..07c99d5 100644
--- a/engines/kyra/gui/saveload_eob.cpp
+++ b/engines/kyra/gui/saveload_eob.cpp
@@ -51,6 +51,8 @@ Common::Error EoBCoreEngine::loadGameState(int slot) {
if (slot != -1)
_screen->fadeToBlack(10);
+ enableSysTimer(2);
+
for (int i = 0; i < 6; i++) {
EoBCharacter *c = &_characters[i];
c->id = in.readByte();
diff --git a/engines/kyra/script/script_eob.cpp b/engines/kyra/script/script_eob.cpp
index a736396..8c0fb06 100644
--- a/engines/kyra/script/script_eob.cpp
+++ b/engines/kyra/script/script_eob.cpp
@@ -58,6 +58,7 @@ const uint8 *EoBCoreEngine::initScriptTimers(const uint8 *pos) {
_scriptTimers[_scriptTimersCount].ticks = ticks;
pos += 2;
_scriptTimers[_scriptTimersCount++].next = _system->getMillis() + ticks * _tickLength;
+ debugC(3, kDebugLevelTimer, "EoBCoreEngine::initScriptTimers() - CTIME: %08d SCRIPT TIMER[%02d].NEXT: %08d", _system->getMillis(), _scriptTimersCount - 1, _scriptTimers[_scriptTimersCount - 1].next);
}
return pos;
@@ -76,6 +77,7 @@ void EoBCoreEngine::updateScriptTimers() {
if (_scriptTimers[i].next < _system->getMillis()) {
_inf->run(_scriptTimers[i].func, _flags.gameID == GI_EOB1 ? 0x20 : 0x80);
_scriptTimers[i].next = _system->getMillis() + _scriptTimers[i].ticks * _tickLength;
+ debugC(3, kDebugLevelTimer, "EoBCoreEngine::updateScriptTimers() - CTIME: %08d SCRIPT TIMER[%02d].NEXT: %08d", _system->getMillis(), i, _scriptTimers[i].next);
_sceneUpdateRequired = true;
timerUpdate = true;
}
@@ -1537,6 +1539,8 @@ int EoBInfProcessor::oeob_delay(int8 *data) {
}
int EoBInfProcessor::oeob_drawScene(int8 *data) {
+ if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform == Common::kPlatformAmiga)
+ _screen->setupDualPalettesSplitScreen(_screen->getPalette(6), _screen->getPalette(7));
_vm->drawScene(1);
return 0;
}
Commit: b7552e46ea71be70c6f21831750c9ae39caca737
https://github.com/scummvm/scummvm/commit/b7552e46ea71be70c6f21831750c9ae39caca737
Author: athrxx (athrxx at scummvm.org)
Date: 2019-04-13T18:55:03+02:00
Commit Message:
KYRA: (EOB2/Amiga) - update news file
Changed paths:
NEWS.md
diff --git a/NEWS.md b/NEWS.md
index 4856d08..6343245 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -22,7 +22,7 @@ For a more comprehensive changelog of the latest experimental code, see:
- Fixed a bug that leads to enormous memory consumption in scene 22.
Kyra:
- - Added support for the Amiga version of Eye of the Beholder.
+ - Added support for the Amiga version of Eye of the Beholder I + II.
- Added support for the FM-Towns version of Eye of the Beholder II.
- Several bug fixes.
More information about the Scummvm-git-logs
mailing list