diff options
author | athrxx | 2012-02-13 18:39:50 +0100 |
---|---|---|
committer | athrxx | 2012-02-21 21:48:39 +0100 |
commit | 86a817beb5eef248c5f5e28f18133db802a59c2e (patch) | |
tree | dc606582deb0ccd10114fdf77554a8a4697110aa | |
parent | 66ba9343987d67e8bf8e1742fcf139dee95a8448 (diff) | |
download | scummvm-rg350-86a817beb5eef248c5f5e28f18133db802a59c2e.tar.gz scummvm-rg350-86a817beb5eef248c5f5e28f18133db802a59c2e.tar.bz2 scummvm-rg350-86a817beb5eef248c5f5e28f18133db802a59c2e.zip |
KYRA: (EOB) - start work on CGA and EGA graphics modes
31 files changed, 1755 insertions, 1017 deletions
diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp index 0b7d4af783..a3d88c7b52 100644 --- a/devtools/create_kyradat/create_kyradat.cpp +++ b/devtools/create_kyradat/create_kyradat.cpp @@ -45,7 +45,7 @@ #include <map> enum { - kKyraDatVersion = 80 + kKyraDatVersion = 81 }; const ExtractFilename extractFilenames[] = { @@ -445,6 +445,21 @@ const ExtractFilename extractFilenames[] = { { kEoB1BeholderSfx, kTypeRawData, false }, { kEoB1TurnUndeadString, kTypeStringList, true }, + { kEoB1CgaMappingDefault, kTypeRawData, false }, + { kEoB1CgaMappingAlt, kTypeRawData, false }, + { kEoB1CgaMappingInv, kTypeRawData, false }, + { kEoB1CgaMappingItemsL, kTypeRawData, false }, + { kEoB1CgaMappingItemsS, kTypeRawData, false }, + { kEoB1CgaMappingThrown, kTypeRawData, false }, + { kEoB1CgaMappingIcons, kTypeRawData, false }, + { kEoB1CgaMappingDeco, kTypeRawData, false }, + { kEoB1CgaLevelMappingIndex, kTypeRawData, false }, + { kEoB1CgaMappingLevel0, kTypeRawData, false }, + { kEoB1CgaMappingLevel1, kTypeRawData, false }, + { kEoB1CgaMappingLevel2, kTypeRawData, false }, + { kEoB1CgaMappingLevel3, kTypeRawData, false }, + { kEoB1CgaMappingLevel4, kTypeRawData, false }, + { kEoB1NpcShpData, kTypeRawData, false }, { kEoB1NpcSubShpIndex1, kTypeRawData, false }, { kEoB1NpcSubShpIndex2, kTypeRawData, false }, @@ -474,50 +489,50 @@ const ExtractFilename extractFilenames[] = { { kEoB2IntroStrings, k2TypeSfxList, true }, { kEoB2IntroCPSFiles, kTypeStringList, true }, - { kEoB2IntroSeqData00, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData01, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData02, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData03, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData04, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData05, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData06, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData07, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData08, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData09, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData10, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData11, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData12, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData13, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData14, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData15, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData16, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData17, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData18, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData19, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData20, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData21, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData22, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData23, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData24, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData25, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData26, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData27, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData28, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData29, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData30, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData31, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData32, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData33, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData34, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData35, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData36, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData37, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData38, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData39, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData40, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData41, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData42, kEoB2TypeSeqData, false }, - { kEoB2IntroSeqData43, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData00, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData01, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData02, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData03, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData04, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData05, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData06, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData07, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData08, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData09, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData10, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData11, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData12, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData13, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData14, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData15, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData16, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData17, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData18, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData19, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData20, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData21, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData22, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData23, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData24, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData25, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData26, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData27, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData28, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData29, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData30, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData31, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData32, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData33, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData34, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData35, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData36, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData37, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData38, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData39, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData40, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData41, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData42, kEoB2TypeSeqData, false }, + { kEob2IntroAnimData43, kEoB2TypeSeqData, false }, { kEoB2IntroShapes00, kEoB2TypeShapeData, false }, { kEoB2IntroShapes01, kEoB2TypeShapeData, false }, { kEoB2IntroShapes04, kEoB2TypeShapeData, false }, @@ -526,27 +541,27 @@ const ExtractFilename extractFilenames[] = { { kEoB2FinaleStrings, k2TypeSfxList, true }, { kEoB2CreditsData, kTypeRawData, true }, { kEoB2FinaleCPSFiles, kTypeStringList, true }, - { kEoB2FinaleSeqData00, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData01, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData02, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData03, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData04, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData05, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData06, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData07, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData08, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData09, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData10, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData11, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData12, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData13, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData14, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData15, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData16, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData17, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData18, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData19, kEoB2TypeSeqData, false }, - { kEoB2FinaleSeqData20, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData00, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData01, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData02, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData03, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData04, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData05, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData06, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData07, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData08, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData09, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData10, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData11, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData12, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData13, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData14, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData15, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData16, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData17, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData18, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData19, kEoB2TypeSeqData, false }, + { kEob2FinaleAnimData20, kEoB2TypeSeqData, false }, { kEoB2FinaleShapes00, kEoB2TypeShapeData, false }, { kEoB2FinaleShapes03, kEoB2TypeShapeData, false }, { kEoB2FinaleShapes07, kEoB2TypeShapeData, false }, @@ -1756,6 +1771,34 @@ const char *getIdString(const int id) { return "kEoB1BeholderSfx"; case kEoB1TurnUndeadString: return "kEoB1TurnUndeadString"; + case kEoB1CgaMappingDefault: + return "kEoB1CgaMappingDefault"; + case kEoB1CgaMappingAlt: + return "kEoB1CgaMappingAlt"; + case kEoB1CgaMappingInv: + return "kEoB1CgaMappingInv"; + case kEoB1CgaMappingItemsL: + return "kEoB1CgaMappingItemsL"; + case kEoB1CgaMappingItemsS: + return "kEoB1CgaMappingItemsS"; + case kEoB1CgaMappingThrown: + return "kEoB1CgaMappingThrown"; + case kEoB1CgaMappingIcons: + return "kEoB1CgaMappingIcons"; + case kEoB1CgaMappingDeco: + return "kEoB1CgaMappingDeco"; + case kEoB1CgaLevelMappingIndex: + return "kEoB1CgaLevelMappingIndex"; + case kEoB1CgaMappingLevel0: + return "kEoB1CgaMappingLevel0"; + case kEoB1CgaMappingLevel1: + return "kEoB1CgaMappingLevel1"; + case kEoB1CgaMappingLevel2: + return "kEoB1CgaMappingLevel2"; + case kEoB1CgaMappingLevel3: + return "kEoB1CgaMappingLevel3"; + case kEoB1CgaMappingLevel4: + return "kEoB1CgaMappingLevel4"; case kEoB1NpcShpData: return "kEoB1NpcShpData"; case kEoB1NpcSubShpIndex1: @@ -1806,94 +1849,94 @@ const char *getIdString(const int id) { return "kEoB2IntroStrings"; case kEoB2IntroCPSFiles: return "kEoB2IntroCPSFiles"; - case kEoB2IntroSeqData00: - return "kEoB2IntroSeqData00"; - case kEoB2IntroSeqData01: - return "kEoB2IntroSeqData01"; - case kEoB2IntroSeqData02: - return "kEoB2IntroSeqData02"; - case kEoB2IntroSeqData03: - return "kEoB2IntroSeqData03"; - case kEoB2IntroSeqData04: - return "kEoB2IntroSeqData04"; - case kEoB2IntroSeqData05: - return "kEoB2IntroSeqData05"; - case kEoB2IntroSeqData06: - return "kEoB2IntroSeqData06"; - case kEoB2IntroSeqData07: - return "kEoB2IntroSeqData07"; - case kEoB2IntroSeqData08: - return "kEoB2IntroSeqData08"; - case kEoB2IntroSeqData09: - return "kEoB2IntroSeqData09"; - case kEoB2IntroSeqData10: - return "kEoB2IntroSeqData10"; - case kEoB2IntroSeqData11: - return "kEoB2IntroSeqData11"; - case kEoB2IntroSeqData12: - return "kEoB2IntroSeqData12"; - case kEoB2IntroSeqData13: - return "kEoB2IntroSeqData13"; - case kEoB2IntroSeqData14: - return "kEoB2IntroSeqData14"; - case kEoB2IntroSeqData15: - return "kEoB2IntroSeqData15"; - case kEoB2IntroSeqData16: - return "kEoB2IntroSeqData16"; - case kEoB2IntroSeqData17: - return "kEoB2IntroSeqData17"; - case kEoB2IntroSeqData18: - return "kEoB2IntroSeqData18"; - case kEoB2IntroSeqData19: - return "kEoB2IntroSeqData19"; - case kEoB2IntroSeqData20: - return "kEoB2IntroSeqData20"; - case kEoB2IntroSeqData21: - return "kEoB2IntroSeqData21"; - case kEoB2IntroSeqData22: - return "kEoB2IntroSeqData22"; - case kEoB2IntroSeqData23: - return "kEoB2IntroSeqData23"; - case kEoB2IntroSeqData24: - return "kEoB2IntroSeqData24"; - case kEoB2IntroSeqData25: - return "kEoB2IntroSeqData25"; - case kEoB2IntroSeqData26: - return "kEoB2IntroSeqData26"; - case kEoB2IntroSeqData27: - return "kEoB2IntroSeqData27"; - case kEoB2IntroSeqData28: - return "kEoB2IntroSeqData28"; - case kEoB2IntroSeqData29: - return "kEoB2IntroSeqData29"; - case kEoB2IntroSeqData30: - return "kEoB2IntroSeqData30"; - case kEoB2IntroSeqData31: - return "kEoB2IntroSeqData31"; - case kEoB2IntroSeqData32: - return "kEoB2IntroSeqData32"; - case kEoB2IntroSeqData33: - return "kEoB2IntroSeqData33"; - case kEoB2IntroSeqData34: - return "kEoB2IntroSeqData34"; - case kEoB2IntroSeqData35: - return "kEoB2IntroSeqData35"; - case kEoB2IntroSeqData36: - return "kEoB2IntroSeqData36"; - case kEoB2IntroSeqData37: - return "kEoB2IntroSeqData37"; - case kEoB2IntroSeqData38: - return "kEoB2IntroSeqData38"; - case kEoB2IntroSeqData39: - return "kEoB2IntroSeqData39"; - case kEoB2IntroSeqData40: - return "kEoB2IntroSeqData40"; - case kEoB2IntroSeqData41: - return "kEoB2IntroSeqData41"; - case kEoB2IntroSeqData42: - return "kEoB2IntroSeqData42"; - case kEoB2IntroSeqData43: - return "kEoB2IntroSeqData43"; + case kEob2IntroAnimData00: + return "kEob2IntroAnimData00"; + case kEob2IntroAnimData01: + return "kEob2IntroAnimData01"; + case kEob2IntroAnimData02: + return "kEob2IntroAnimData02"; + case kEob2IntroAnimData03: + return "kEob2IntroAnimData03"; + case kEob2IntroAnimData04: + return "kEob2IntroAnimData04"; + case kEob2IntroAnimData05: + return "kEob2IntroAnimData05"; + case kEob2IntroAnimData06: + return "kEob2IntroAnimData06"; + case kEob2IntroAnimData07: + return "kEob2IntroAnimData07"; + case kEob2IntroAnimData08: + return "kEob2IntroAnimData08"; + case kEob2IntroAnimData09: + return "kEob2IntroAnimData09"; + case kEob2IntroAnimData10: + return "kEob2IntroAnimData10"; + case kEob2IntroAnimData11: + return "kEob2IntroAnimData11"; + case kEob2IntroAnimData12: + return "kEob2IntroAnimData12"; + case kEob2IntroAnimData13: + return "kEob2IntroAnimData13"; + case kEob2IntroAnimData14: + return "kEob2IntroAnimData14"; + case kEob2IntroAnimData15: + return "kEob2IntroAnimData15"; + case kEob2IntroAnimData16: + return "kEob2IntroAnimData16"; + case kEob2IntroAnimData17: + return "kEob2IntroAnimData17"; + case kEob2IntroAnimData18: + return "kEob2IntroAnimData18"; + case kEob2IntroAnimData19: + return "kEob2IntroAnimData19"; + case kEob2IntroAnimData20: + return "kEob2IntroAnimData20"; + case kEob2IntroAnimData21: + return "kEob2IntroAnimData21"; + case kEob2IntroAnimData22: + return "kEob2IntroAnimData22"; + case kEob2IntroAnimData23: + return "kEob2IntroAnimData23"; + case kEob2IntroAnimData24: + return "kEob2IntroAnimData24"; + case kEob2IntroAnimData25: + return "kEob2IntroAnimData25"; + case kEob2IntroAnimData26: + return "kEob2IntroAnimData26"; + case kEob2IntroAnimData27: + return "kEob2IntroAnimData27"; + case kEob2IntroAnimData28: + return "kEob2IntroAnimData28"; + case kEob2IntroAnimData29: + return "kEob2IntroAnimData29"; + case kEob2IntroAnimData30: + return "kEob2IntroAnimData30"; + case kEob2IntroAnimData31: + return "kEob2IntroAnimData31"; + case kEob2IntroAnimData32: + return "kEob2IntroAnimData32"; + case kEob2IntroAnimData33: + return "kEob2IntroAnimData33"; + case kEob2IntroAnimData34: + return "kEob2IntroAnimData34"; + case kEob2IntroAnimData35: + return "kEob2IntroAnimData35"; + case kEob2IntroAnimData36: + return "kEob2IntroAnimData36"; + case kEob2IntroAnimData37: + return "kEob2IntroAnimData37"; + case kEob2IntroAnimData38: + return "kEob2IntroAnimData38"; + case kEob2IntroAnimData39: + return "kEob2IntroAnimData39"; + case kEob2IntroAnimData40: + return "kEob2IntroAnimData40"; + case kEob2IntroAnimData41: + return "kEob2IntroAnimData41"; + case kEob2IntroAnimData42: + return "kEob2IntroAnimData42"; + case kEob2IntroAnimData43: + return "kEob2IntroAnimData43"; case kEoB2IntroShapes00: return "kEoB2IntroShapes00"; case kEoB2IntroShapes01: @@ -1908,48 +1951,48 @@ const char *getIdString(const int id) { return "kEoB2CreditsData"; case kEoB2FinaleCPSFiles: return "kEoB2FinaleCPSFiles"; - case kEoB2FinaleSeqData00: - return "kEoB2FinaleSeqData00"; - case kEoB2FinaleSeqData01: - return "kEoB2FinaleSeqData01"; - case kEoB2FinaleSeqData02: - return "kEoB2FinaleSeqData02"; - case kEoB2FinaleSeqData03: - return "kEoB2FinaleSeqData03"; - case kEoB2FinaleSeqData04: - return "kEoB2FinaleSeqData04"; - case kEoB2FinaleSeqData05: - return "kEoB2FinaleSeqData05"; - case kEoB2FinaleSeqData06: - return "kEoB2FinaleSeqData06"; - case kEoB2FinaleSeqData07: - return "kEoB2FinaleSeqData07"; - case kEoB2FinaleSeqData08: - return "kEoB2FinaleSeqData08"; - case kEoB2FinaleSeqData09: - return "kEoB2FinaleSeqData09"; - case kEoB2FinaleSeqData10: - return "kEoB2FinaleSeqData10"; - case kEoB2FinaleSeqData11: - return "kEoB2FinaleSeqData11"; - case kEoB2FinaleSeqData12: - return "kEoB2FinaleSeqData12"; - case kEoB2FinaleSeqData13: - return "kEoB2FinaleSeqData13"; - case kEoB2FinaleSeqData14: - return "kEoB2FinaleSeqData14"; - case kEoB2FinaleSeqData15: - return "kEoB2FinaleSeqData15"; - case kEoB2FinaleSeqData16: - return "kEoB2FinaleSeqData16"; - case kEoB2FinaleSeqData17: - return "kEoB2FinaleSeqData17"; - case kEoB2FinaleSeqData18: - return "kEoB2FinaleSeqData18"; - case kEoB2FinaleSeqData19: - return "kEoB2FinaleSeqData19"; - case kEoB2FinaleSeqData20: - return "kEoB2FinaleSeqData20"; + case kEob2FinaleAnimData00: + return "kEob2FinaleAnimData00"; + case kEob2FinaleAnimData01: + return "kEob2FinaleAnimData01"; + case kEob2FinaleAnimData02: + return "kEob2FinaleAnimData02"; + case kEob2FinaleAnimData03: + return "kEob2FinaleAnimData03"; + case kEob2FinaleAnimData04: + return "kEob2FinaleAnimData04"; + case kEob2FinaleAnimData05: + return "kEob2FinaleAnimData05"; + case kEob2FinaleAnimData06: + return "kEob2FinaleAnimData06"; + case kEob2FinaleAnimData07: + return "kEob2FinaleAnimData07"; + case kEob2FinaleAnimData08: + return "kEob2FinaleAnimData08"; + case kEob2FinaleAnimData09: + return "kEob2FinaleAnimData09"; + case kEob2FinaleAnimData10: + return "kEob2FinaleAnimData10"; + case kEob2FinaleAnimData11: + return "kEob2FinaleAnimData11"; + case kEob2FinaleAnimData12: + return "kEob2FinaleAnimData12"; + case kEob2FinaleAnimData13: + return "kEob2FinaleAnimData13"; + case kEob2FinaleAnimData14: + return "kEob2FinaleAnimData14"; + case kEob2FinaleAnimData15: + return "kEob2FinaleAnimData15"; + case kEob2FinaleAnimData16: + return "kEob2FinaleAnimData16"; + case kEob2FinaleAnimData17: + return "kEob2FinaleAnimData17"; + case kEob2FinaleAnimData18: + return "kEob2FinaleAnimData18"; + case kEob2FinaleAnimData19: + return "kEob2FinaleAnimData19"; + case kEob2FinaleAnimData20: + return "kEob2FinaleAnimData20"; case kEoB2FinaleShapes00: return "kEoB2FinaleShapes00"; case kEoB2FinaleShapes03: diff --git a/devtools/create_kyradat/create_kyradat.h b/devtools/create_kyradat/create_kyradat.h index ad54c6ce65..83ee2855fa 100644 --- a/devtools/create_kyradat/create_kyradat.h +++ b/devtools/create_kyradat/create_kyradat.h @@ -446,6 +446,21 @@ enum kExtractID { kEoB1BeholderSfx, kEoB1TurnUndeadString, + kEoB1CgaMappingDefault, + kEoB1CgaMappingAlt, + kEoB1CgaMappingInv, + kEoB1CgaMappingItemsL, + kEoB1CgaMappingItemsS, + kEoB1CgaMappingThrown, + kEoB1CgaMappingIcons, + kEoB1CgaMappingDeco, + kEoB1CgaLevelMappingIndex, + kEoB1CgaMappingLevel0, + kEoB1CgaMappingLevel1, + kEoB1CgaMappingLevel2, + kEoB1CgaMappingLevel3, + kEoB1CgaMappingLevel4, + kEoB1NpcShpData, kEoB1NpcSubShpIndex1, kEoB1NpcSubShpIndex2, @@ -474,50 +489,50 @@ enum kExtractID { kEoB2IntroStrings, kEoB2IntroCPSFiles, - kEoB2IntroSeqData00, - kEoB2IntroSeqData01, - kEoB2IntroSeqData02, - kEoB2IntroSeqData03, - kEoB2IntroSeqData04, - kEoB2IntroSeqData05, - kEoB2IntroSeqData06, - kEoB2IntroSeqData07, - kEoB2IntroSeqData08, - kEoB2IntroSeqData09, - kEoB2IntroSeqData10, - kEoB2IntroSeqData11, - kEoB2IntroSeqData12, - kEoB2IntroSeqData13, - kEoB2IntroSeqData14, - kEoB2IntroSeqData15, - kEoB2IntroSeqData16, - kEoB2IntroSeqData17, - kEoB2IntroSeqData18, - kEoB2IntroSeqData19, - kEoB2IntroSeqData20, - kEoB2IntroSeqData21, - kEoB2IntroSeqData22, - kEoB2IntroSeqData23, - kEoB2IntroSeqData24, - kEoB2IntroSeqData25, - kEoB2IntroSeqData26, - kEoB2IntroSeqData27, - kEoB2IntroSeqData28, - kEoB2IntroSeqData29, - kEoB2IntroSeqData30, - kEoB2IntroSeqData31, - kEoB2IntroSeqData32, - kEoB2IntroSeqData33, - kEoB2IntroSeqData34, - kEoB2IntroSeqData35, - kEoB2IntroSeqData36, - kEoB2IntroSeqData37, - kEoB2IntroSeqData38, - kEoB2IntroSeqData39, - kEoB2IntroSeqData40, - kEoB2IntroSeqData41, - kEoB2IntroSeqData42, - kEoB2IntroSeqData43, + 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, + kEob2IntroAnimData41, + kEob2IntroAnimData42, + kEob2IntroAnimData43, kEoB2IntroShapes00, kEoB2IntroShapes01, kEoB2IntroShapes04, @@ -526,27 +541,27 @@ enum kExtractID { kEoB2FinaleStrings, kEoB2CreditsData, kEoB2FinaleCPSFiles, - kEoB2FinaleSeqData00, - kEoB2FinaleSeqData01, - kEoB2FinaleSeqData02, - kEoB2FinaleSeqData03, - kEoB2FinaleSeqData04, - kEoB2FinaleSeqData05, - kEoB2FinaleSeqData06, - kEoB2FinaleSeqData07, - kEoB2FinaleSeqData08, - kEoB2FinaleSeqData09, - kEoB2FinaleSeqData10, - kEoB2FinaleSeqData11, - kEoB2FinaleSeqData12, - kEoB2FinaleSeqData13, - kEoB2FinaleSeqData14, - kEoB2FinaleSeqData15, - kEoB2FinaleSeqData16, - kEoB2FinaleSeqData17, - kEoB2FinaleSeqData18, - kEoB2FinaleSeqData19, - kEoB2FinaleSeqData20, + kEob2FinaleAnimData00, + kEob2FinaleAnimData01, + kEob2FinaleAnimData02, + kEob2FinaleAnimData03, + kEob2FinaleAnimData04, + kEob2FinaleAnimData05, + kEob2FinaleAnimData06, + kEob2FinaleAnimData07, + kEob2FinaleAnimData08, + kEob2FinaleAnimData09, + kEob2FinaleAnimData10, + kEob2FinaleAnimData11, + kEob2FinaleAnimData12, + kEob2FinaleAnimData13, + kEob2FinaleAnimData14, + kEob2FinaleAnimData15, + kEob2FinaleAnimData16, + kEob2FinaleAnimData17, + kEob2FinaleAnimData18, + kEob2FinaleAnimData19, + kEob2FinaleAnimData20, kEoB2FinaleShapes00, kEoB2FinaleShapes03, kEoB2FinaleShapes07, diff --git a/devtools/create_kyradat/games.cpp b/devtools/create_kyradat/games.cpp index e0e6f011fa..a45cb802ef 100644 --- a/devtools/create_kyradat/games.cpp +++ b/devtools/create_kyradat/games.cpp @@ -1089,6 +1089,21 @@ const int eob1FloppyNeed[] = { kEoB1BeholderSfx, kEoB1TurnUndeadString, + kEoB1CgaMappingDefault, + kEoB1CgaMappingAlt, + kEoB1CgaMappingInv, + kEoB1CgaMappingItemsL, + kEoB1CgaMappingItemsS, + kEoB1CgaMappingThrown, + kEoB1CgaMappingIcons, + kEoB1CgaMappingDeco, + kEoB1CgaLevelMappingIndex, + kEoB1CgaMappingLevel0, + kEoB1CgaMappingLevel1, + kEoB1CgaMappingLevel2, + kEoB1CgaMappingLevel3, + kEoB1CgaMappingLevel4, + kEoB1NpcShpData, kEoB1NpcSubShpIndex1, kEoB1NpcSubShpIndex2, @@ -1497,50 +1512,50 @@ const int eob2FloppyNeed[] = { kEoB2IntroStrings, kEoB2IntroCPSFiles, - kEoB2IntroSeqData00, - kEoB2IntroSeqData01, - kEoB2IntroSeqData02, - kEoB2IntroSeqData03, - kEoB2IntroSeqData04, - kEoB2IntroSeqData05, - kEoB2IntroSeqData06, - kEoB2IntroSeqData07, - kEoB2IntroSeqData08, - kEoB2IntroSeqData09, - kEoB2IntroSeqData10, - kEoB2IntroSeqData11, - kEoB2IntroSeqData12, - kEoB2IntroSeqData13, - kEoB2IntroSeqData14, - kEoB2IntroSeqData15, - kEoB2IntroSeqData16, - kEoB2IntroSeqData17, - kEoB2IntroSeqData18, - kEoB2IntroSeqData19, - kEoB2IntroSeqData20, - kEoB2IntroSeqData21, - kEoB2IntroSeqData22, - kEoB2IntroSeqData23, - kEoB2IntroSeqData24, - kEoB2IntroSeqData25, - kEoB2IntroSeqData26, - kEoB2IntroSeqData27, - kEoB2IntroSeqData28, - kEoB2IntroSeqData29, - kEoB2IntroSeqData30, - kEoB2IntroSeqData31, - kEoB2IntroSeqData32, - kEoB2IntroSeqData33, - kEoB2IntroSeqData34, - kEoB2IntroSeqData35, - kEoB2IntroSeqData36, - kEoB2IntroSeqData37, - kEoB2IntroSeqData38, - kEoB2IntroSeqData39, - kEoB2IntroSeqData40, - kEoB2IntroSeqData41, - kEoB2IntroSeqData42, - kEoB2IntroSeqData43, + 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, + kEob2IntroAnimData41, + kEob2IntroAnimData42, + kEob2IntroAnimData43, kEoB2IntroShapes00, kEoB2IntroShapes01, @@ -1550,27 +1565,27 @@ const int eob2FloppyNeed[] = { kEoB2FinaleStrings, kEoB2CreditsData, kEoB2FinaleCPSFiles, - kEoB2FinaleSeqData00, - kEoB2FinaleSeqData01, - kEoB2FinaleSeqData02, - kEoB2FinaleSeqData03, - kEoB2FinaleSeqData04, - kEoB2FinaleSeqData05, - kEoB2FinaleSeqData06, - kEoB2FinaleSeqData07, - kEoB2FinaleSeqData08, - kEoB2FinaleSeqData09, - kEoB2FinaleSeqData10, - kEoB2FinaleSeqData11, - kEoB2FinaleSeqData12, - kEoB2FinaleSeqData13, - kEoB2FinaleSeqData14, - kEoB2FinaleSeqData15, - kEoB2FinaleSeqData16, - kEoB2FinaleSeqData17, - kEoB2FinaleSeqData18, - kEoB2FinaleSeqData19, - kEoB2FinaleSeqData20, + kEob2FinaleAnimData00, + kEob2FinaleAnimData01, + kEob2FinaleAnimData02, + kEob2FinaleAnimData03, + kEob2FinaleAnimData04, + kEob2FinaleAnimData05, + kEob2FinaleAnimData06, + kEob2FinaleAnimData07, + kEob2FinaleAnimData08, + kEob2FinaleAnimData09, + kEob2FinaleAnimData10, + kEob2FinaleAnimData11, + kEob2FinaleAnimData12, + kEob2FinaleAnimData13, + kEob2FinaleAnimData14, + kEob2FinaleAnimData15, + kEob2FinaleAnimData16, + kEob2FinaleAnimData17, + kEob2FinaleAnimData18, + kEob2FinaleAnimData19, + kEob2FinaleAnimData20, kEoB2FinaleShapes00, kEoB2FinaleShapes03, kEoB2FinaleShapes07, diff --git a/devtools/create_kyradat/tables.cpp b/devtools/create_kyradat/tables.cpp index e3f658a893..b1b542deea 100644 --- a/devtools/create_kyradat/tables.cpp +++ b/devtools/create_kyradat/tables.cpp @@ -2548,6 +2548,76 @@ const ExtractEntrySearchData kEoB1TurnUndeadStringProvider[] = { EXTRACT_END_ENTRY }; +const ExtractEntrySearchData kEoB1CgaMappingDefaultProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x0000002C, { { 0x7E, 0x1C, 0x75, 0xC3, 0x8E, 0xF7, 0x56, 0x62, 0x9B, 0xB6, 0xF4, 0x3A, 0x21, 0x03, 0xFA, 0xF5 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingAltProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000030, { { 0x2A, 0x8C, 0xF6, 0xD7, 0x87, 0xFA, 0x7B, 0x22, 0x28, 0x2A, 0x50, 0xE2, 0x26, 0x7B, 0xC7, 0x44 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingInvProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x0000002E, { { 0x3A, 0x06, 0xBF, 0x0C, 0xD4, 0xD0, 0x15, 0x1F, 0xB5, 0xC5, 0x49, 0xFD, 0x21, 0xE1, 0xE1, 0x66 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingItemsLProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x0000002A, { { 0xE0, 0x85, 0xA1, 0x3A, 0x3D, 0xC9, 0xF8, 0x56, 0x17, 0x0A, 0xD8, 0x44, 0x56, 0xDF, 0x3C, 0x57 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingItemsSProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000036, { { 0x2E, 0x6F, 0xD4, 0x2E, 0xB2, 0x84, 0xB2, 0xC3, 0x36, 0x88, 0x80, 0xC1, 0x67, 0x5A, 0xEB, 0x60 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingThrownProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000030, { { 0x0C, 0x3D, 0x1E, 0xAB, 0x0B, 0x25, 0x9F, 0x78, 0xE6, 0xB1, 0x52, 0x79, 0x0F, 0x96, 0x33, 0x97 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingIconsProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000039, { { 0x99, 0x50, 0x1A, 0xE1, 0xF3, 0x52, 0xC3, 0x5A, 0x4E, 0xBD, 0x03, 0x74, 0x2C, 0x39, 0xCA, 0x71 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingDecoProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000035, { { 0xA5, 0x17, 0xED, 0xEE, 0x02, 0x87, 0x8C, 0x9D, 0xAC, 0x96, 0xC6, 0x07, 0xB0, 0x8E, 0x5D, 0xE3 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaLevelMappingIndexProvider[] = { + { UNK_LANG, kPlatformPC, { 0x0000000C, 0x00000013, { { 0x48, 0x5D, 0xDF, 0x8F, 0xFD, 0x5D, 0xA0, 0xB0, 0x00, 0xD8, 0xB3, 0x09, 0x90, 0x5D, 0x13, 0x3F } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingLevel0Provider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000035, { { 0xC2, 0x4D, 0x2F, 0x0A, 0xB0, 0x3E, 0x46, 0x80, 0xD1, 0xEE, 0x32, 0x5F, 0xBA, 0x5C, 0xCC, 0x7A } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingLevel1Provider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000030, { { 0x94, 0x8E, 0xAE, 0x12, 0xB5, 0x68, 0xCD, 0x43, 0x95, 0xD2, 0x01, 0x21, 0x0C, 0xA1, 0x34, 0xF5 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingLevel2Provider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000030, { { 0x20, 0x6F, 0x9F, 0x57, 0x0C, 0xFD, 0xDA, 0x5C, 0xA0, 0x1D, 0x28, 0xB4, 0x88, 0x24, 0x68, 0x68 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingLevel3Provider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000030, { { 0x44, 0x95, 0x9A, 0x69, 0x70, 0xB2, 0x63, 0xB6, 0xFB, 0xD0, 0xFF, 0xD9, 0xF0, 0xCD, 0xD4, 0x75 } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEoB1CgaMappingLevel4Provider[] = { + { UNK_LANG, kPlatformPC, { 0x00000020, 0x00000031, { { 0xEA, 0xC4, 0x01, 0xC0, 0x21, 0xFE, 0x66, 0xDD, 0xD4, 0x83, 0xC1, 0x2C, 0x09, 0xD3, 0xD0, 0x97 } } } }, + EXTRACT_END_ENTRY +}; + const ExtractEntrySearchData kEoB1NpcShpDataProvider[] = { { UNK_LANG, kPlatformPC, { 0x0000004C, 0x00000A42, { { 0x70, 0x21, 0x85, 0x8C, 0xD4, 0x04, 0xAA, 0x20, 0x1D, 0x0E, 0x9D, 0xB7, 0x74, 0x58, 0xCC, 0x0C } } } }, EXTRACT_END_ENTRY @@ -2701,222 +2771,222 @@ const ExtractEntrySearchData kEoB2IntroCPSFilesProvider[] = { EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData00Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData00Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000003E1, { { 0x38, 0xC2, 0x0F, 0xE1, 0x43, 0x6A, 0xE8, 0x7C, 0x82, 0x65, 0x9B, 0x4A, 0x9F, 0x83, 0xCD, 0xC8 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData01Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData01Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000003A3, { { 0x84, 0x44, 0xF4, 0x46, 0x4E, 0x2B, 0xD7, 0xC6, 0xAD, 0x14, 0xF1, 0x9E, 0x8A, 0xBE, 0x7B, 0x42 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData02Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData02Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x00000446, { { 0x0C, 0xCA, 0x41, 0x0C, 0x89, 0x59, 0xD5, 0x28, 0x9A, 0xDC, 0x51, 0x1C, 0x0B, 0x8C, 0xD2, 0xDB } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData03Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData03Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x0000010E, { { 0xAB, 0x48, 0x64, 0x02, 0xB3, 0xF3, 0x6C, 0x82, 0x9D, 0x37, 0x5F, 0x52, 0x0F, 0x5B, 0xDF, 0x96 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData04Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData04Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x00000149, { { 0x3B, 0xAC, 0x14, 0x51, 0xDF, 0x5D, 0x22, 0x15, 0x46, 0x4E, 0xCD, 0xF3, 0xD4, 0x61, 0x29, 0x4A } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData05Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData05Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x0000010E, { { 0x28, 0x29, 0x5F, 0x31, 0x23, 0x53, 0xBA, 0xD7, 0x24, 0xB9, 0x21, 0x70, 0x84, 0x8A, 0x1C, 0x2E } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData06Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData06Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x000000B0, 0x00001365, { { 0x91, 0x28, 0x2F, 0x10, 0x45, 0x4D, 0xCF, 0x3E, 0x70, 0x1E, 0xD4, 0xBA, 0x0E, 0x70, 0xDE, 0xD0 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData07Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData07Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000003C4, { { 0x8C, 0x72, 0xDE, 0x4F, 0x92, 0x52, 0x0A, 0xED, 0xF4, 0x79, 0xD6, 0x3D, 0x8F, 0x59, 0x9D, 0x69 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData08Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData08Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x00000442, { { 0xD2, 0x91, 0x51, 0xEB, 0x91, 0x13, 0x43, 0xCE, 0x7E, 0x60, 0xB8, 0xFF, 0xA7, 0xE2, 0x4C, 0x11 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData09Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData09Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x000004BC, { { 0xD6, 0xC7, 0x44, 0x2E, 0xE7, 0x2A, 0x44, 0x09, 0x39, 0xC3, 0xD3, 0xA8, 0x02, 0xC8, 0xA0, 0x19 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData10Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData10Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000006E, 0x00000C12, { { 0x91, 0xDB, 0x41, 0x7A, 0x4F, 0x7C, 0x7B, 0x83, 0x32, 0x13, 0x68, 0xF6, 0x58, 0x79, 0xDA, 0x99 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData11Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData11Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x000000B0, 0x0000073C, { { 0x17, 0x1F, 0x4D, 0x05, 0x3F, 0x14, 0x2E, 0x77, 0xD3, 0xDB, 0x78, 0x67, 0xBB, 0x18, 0xDC, 0x85 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData12Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData12Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x00000228, { { 0xC9, 0x50, 0x68, 0x51, 0xD0, 0xC1, 0x5D, 0xD4, 0xFF, 0x08, 0x28, 0xDE, 0xC4, 0x41, 0x8C, 0xDB } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData13Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData13Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x00000340, { { 0x03, 0xCA, 0x5D, 0xD1, 0x15, 0xFA, 0x60, 0xD7, 0x70, 0x64, 0x3D, 0x44, 0x08, 0xB8, 0xDB, 0xAD } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData14Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData14Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x000007C0, { { 0x82, 0xA9, 0x0B, 0x90, 0x9D, 0x65, 0x1E, 0xC7, 0x03, 0x5E, 0xB7, 0xDF, 0x6E, 0x1F, 0xED, 0xD6 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData15Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData15Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x00000504, { { 0xA7, 0x91, 0x4F, 0xAD, 0xB1, 0x77, 0x80, 0x3A, 0xC7, 0xDE, 0x35, 0x7A, 0x96, 0x16, 0xD2, 0x13 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData16Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData16Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000079, 0x00000B3D, { { 0xCC, 0x63, 0x5A, 0x11, 0xEE, 0x8A, 0xAE, 0x3A, 0x14, 0xC3, 0xBC, 0xDA, 0xAF, 0x1D, 0xD4, 0x2C } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData17Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData17Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000084, 0x00000911, { { 0x09, 0x1C, 0x4B, 0xD9, 0x0B, 0x2A, 0xD6, 0xC1, 0xE3, 0x8D, 0xFE, 0x43, 0x8F, 0x2E, 0x21, 0x51 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData18Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData18Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x000008FA, { { 0xFE, 0x58, 0xD9, 0x67, 0x78, 0x97, 0xE2, 0xCD, 0x82, 0xB8, 0xC9, 0xC0, 0x1F, 0xCA, 0x7C, 0xF5 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData19Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData19Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00000D6B, { { 0xA1, 0xDD, 0x7B, 0x8B, 0x25, 0xA5, 0x96, 0x5A, 0x33, 0x5E, 0x80, 0x5F, 0xA5, 0xBB, 0xAC, 0x11 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData20Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData20Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00000D6C, { { 0x19, 0xF9, 0x93, 0x1D, 0x01, 0xEE, 0x7C, 0x8B, 0x6C, 0x3E, 0x35, 0x2C, 0x5C, 0x88, 0xCD, 0xB6 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData21Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData21Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00000D83, { { 0xCB, 0x4F, 0x21, 0x29, 0x63, 0x5B, 0x8C, 0xF2, 0xBA, 0x03, 0x49, 0xD1, 0xAF, 0x22, 0xB0, 0xD5 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData22Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData22Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000200, { { 0x66, 0xEE, 0x45, 0xB1, 0x87, 0x66, 0xC4, 0x55, 0xCE, 0x60, 0x0C, 0x5B, 0xBB, 0x3C, 0x7D, 0x33 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData23Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData23Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x0000020D, { { 0xC4, 0x49, 0xE2, 0x5B, 0x2E, 0x17, 0x68, 0xC4, 0xBA, 0x20, 0xEC, 0xB1, 0xEB, 0x1A, 0xFB, 0xE0 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData24Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData24Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000214, { { 0xF1, 0x46, 0x82, 0xEF, 0x6D, 0xCA, 0x68, 0xA2, 0xF3, 0x55, 0x63, 0xD2, 0x13, 0x25, 0x19, 0xF7 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData25Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData25Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000256, { { 0x8F, 0xB9, 0xCD, 0xB8, 0x58, 0xCB, 0x90, 0x03, 0xFC, 0xB6, 0x95, 0x6F, 0x52, 0xF8, 0x7D, 0x19 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData26Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData26Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000263, { { 0x7A, 0x37, 0x07, 0xC4, 0x67, 0x72, 0x1F, 0xCB, 0xAC, 0x98, 0x46, 0x9A, 0xF3, 0x5F, 0xBA, 0x78 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData27Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData27Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x0000026A, { { 0x80, 0x11, 0xEE, 0x44, 0xDA, 0xE1, 0x26, 0x1F, 0x14, 0x7E, 0x93, 0x99, 0x44, 0x44, 0x9F, 0x85 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData28Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData28Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x000001F6, { { 0x45, 0xA1, 0xA5, 0xEC, 0x85, 0x06, 0xE2, 0x91, 0x28, 0xE0, 0xBB, 0x53, 0x74, 0x44, 0xD9, 0xA6 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData29Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData29Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x000001F9, { { 0x3F, 0x03, 0x2F, 0x8B, 0xFB, 0x6A, 0x97, 0x05, 0xED, 0xBB, 0xD6, 0xA0, 0xF5, 0x7A, 0x6D, 0x08 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData30Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData30Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000204, { { 0xA1, 0x37, 0x57, 0xC3, 0x72, 0x08, 0x98, 0xA6, 0xF4, 0x5E, 0x58, 0x9E, 0xF3, 0x11, 0x88, 0x1E } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData31Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData31Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000212, { { 0x19, 0xCC, 0x6F, 0xA8, 0x29, 0xB5, 0x3B, 0x15, 0x2F, 0x2C, 0x43, 0xED, 0x7A, 0xF5, 0xC5, 0x69 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData32Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData32Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000006C9, { { 0xBF, 0x65, 0xBA, 0x3F, 0x44, 0xEE, 0xB0, 0x5C, 0x8B, 0xBD, 0x15, 0xAB, 0x03, 0xD1, 0x55, 0x21 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData33Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData33Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00001585, { { 0xB5, 0x44, 0x06, 0xC9, 0xE8, 0x27, 0x75, 0x6E, 0x63, 0x77, 0xE9, 0xA9, 0x68, 0x73, 0xF5, 0x78 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData34Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData34Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x00000B43, { { 0x52, 0xB4, 0x1E, 0x14, 0x88, 0xBD, 0x8A, 0xD7, 0x38, 0xDF, 0x25, 0xB0, 0xAF, 0xAE, 0x76, 0xE1 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData35Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData35Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x000005A4, { { 0xFB, 0x82, 0xE7, 0xB2, 0x54, 0xDB, 0xB5, 0xE1, 0xCE, 0xFB, 0xD1, 0x23, 0x39, 0x8F, 0xA1, 0x0D } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData36Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData36Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x00000572, { { 0x2C, 0x16, 0xD9, 0xBE, 0xDB, 0xBA, 0x04, 0xCA, 0x97, 0xB5, 0x88, 0x43, 0xA8, 0x62, 0xE2, 0x04 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData37Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData37Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x0000024E, { { 0xFF, 0x28, 0xD8, 0x62, 0xC6, 0xAD, 0x48, 0xC7, 0x31, 0x84, 0x6C, 0xBA, 0x9F, 0x4D, 0x15, 0xDA } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData38Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData38Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x000001D9, 0x00001FB1, { { 0x16, 0xB0, 0xDF, 0x86, 0x8C, 0xB3, 0x52, 0xEF, 0x21, 0x04, 0x22, 0x6D, 0xC0, 0x03, 0xB8, 0xC6 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData39Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData39Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000004D, 0x00000582, { { 0x11, 0x6C, 0xBB, 0xF6, 0x1B, 0x3C, 0xAE, 0xAA, 0x40, 0x27, 0x3F, 0x86, 0x33, 0x92, 0xCB, 0xA9 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData40Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData40Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000160, 0x000010A2, { { 0xD9, 0x9D, 0xF1, 0x7D, 0xE1, 0x7C, 0x61, 0xC0, 0xD4, 0xD3, 0x05, 0x0C, 0x79, 0xDD, 0xDB, 0xD1 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData41Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData41Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x00000355, { { 0x92, 0x85, 0xBE, 0x5A, 0x38, 0x08, 0xF3, 0xDF, 0xC6, 0x56, 0x74, 0xC3, 0x0B, 0x3F, 0x72, 0x4D } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData42Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData42Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x0000010B, { { 0x68, 0xF8, 0x1D, 0x74, 0x6D, 0x32, 0x1E, 0x3A, 0x1C, 0xD1, 0x1D, 0x4B, 0x89, 0x3D, 0x5F, 0x2B } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2IntroSeqData43Provider[] = { +const ExtractEntrySearchData kEob2IntroAnimData43Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000037, 0x00000116, { { 0xD5, 0x46, 0xCB, 0x3F, 0x27, 0xBD, 0x2B, 0xD6, 0x35, 0x69, 0x9E, 0x0A, 0x28, 0xDA, 0xC9, 0x84 } } } }, EXTRACT_END_ENTRY }; @@ -2959,107 +3029,107 @@ const ExtractEntrySearchData kEoB2FinaleCPSFilesProvider[] = { EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData00Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData00Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000079, 0x00000B66, { { 0x9B, 0x8C, 0x17, 0xFA, 0xD2, 0x4F, 0x4B, 0x0E, 0x3A, 0x43, 0xB1, 0x86, 0x0C, 0xDC, 0x73, 0xAB } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData01Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData01Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000063, 0x00000A03, { { 0xBB, 0x31, 0xEA, 0x35, 0xFB, 0x99, 0x4C, 0x3E, 0x72, 0xBD, 0x36, 0x6B, 0x5C, 0x03, 0x19, 0x7F } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData02Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData02Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000002C, 0x000007C2, { { 0xF6, 0x83, 0x37, 0x58, 0x3C, 0x59, 0x84, 0x8F, 0x97, 0x80, 0xE2, 0xD8, 0xFD, 0x77, 0xA9, 0x54 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData03Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData03Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x0000092B, { { 0x47, 0xE4, 0x34, 0xE8, 0x72, 0xCC, 0xA4, 0x4A, 0xA4, 0x8F, 0xBA, 0xBC, 0x0C, 0x04, 0x18, 0xAF } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData04Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData04Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x0000080B, { { 0x16, 0xDB, 0x77, 0x4C, 0x8E, 0xFD, 0x44, 0xF6, 0x5E, 0x28, 0x0B, 0x74, 0x93, 0x45, 0x8F, 0xD9 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData05Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData05Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000004D, 0x00000C72, { { 0x6C, 0x57, 0x56, 0x7E, 0x87, 0x10, 0x9C, 0xE7, 0x69, 0xAC, 0x3B, 0x3F, 0xF6, 0x43, 0x5C, 0xD4 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData06Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData06Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000016, 0x00000264, { { 0x48, 0x49, 0x5D, 0x78, 0xE2, 0xF1, 0x0D, 0x87, 0xEE, 0xEE, 0xD1, 0xA1, 0xC6, 0x64, 0xCA, 0x13 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData07Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData07Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000042, 0x00000ABE, { { 0xFE, 0xA9, 0x5D, 0x87, 0xAF, 0x55, 0x04, 0x92, 0x41, 0xD3, 0xAD, 0x1D, 0xFF, 0x03, 0x81, 0x3C } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData08Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData08Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x000004D8, { { 0x4E, 0xA7, 0xCC, 0x0B, 0x1B, 0x48, 0x22, 0x09, 0x33, 0xF7, 0x23, 0xF1, 0xF5, 0x9F, 0xA5, 0x7B } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData09Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData09Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000058, 0x000004BE, { { 0xF6, 0xEA, 0xA0, 0x7F, 0x54, 0x61, 0x79, 0x4C, 0x71, 0xD7, 0x9B, 0xA6, 0xC3, 0x45, 0xEE, 0x3E } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData10Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData10Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000009A, 0x00000FC4, { { 0xA9, 0xFB, 0x31, 0x55, 0xB8, 0x28, 0x63, 0xC3, 0x4B, 0x9E, 0x7D, 0x41, 0xC7, 0x1F, 0x2F, 0xBD } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData11Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData11Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x000000C6, 0x0000166B, { { 0xCC, 0x16, 0x50, 0xFF, 0xFF, 0xD5, 0xAE, 0x03, 0x40, 0xA3, 0x9A, 0x1F, 0xF8, 0x8E, 0x23, 0x7A } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData12Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData12Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x000000FD, 0x00001A69, { { 0x6A, 0x80, 0x89, 0x7E, 0xFC, 0xE4, 0x01, 0xF5, 0xA2, 0x11, 0xE7, 0x26, 0x20, 0x96, 0x62, 0x7B } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData13Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData13Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x000000FD, 0x00001886, { { 0xF9, 0x5B, 0x62, 0xDD, 0xAB, 0x14, 0x35, 0x77, 0x53, 0x05, 0xDB, 0xC5, 0xFD, 0x4D, 0x4F, 0x12 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData14Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData14Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000108, 0x00001895, { { 0x22, 0xA1, 0x88, 0x69, 0xF9, 0x1C, 0xA2, 0x64, 0x44, 0xCD, 0x00, 0xFA, 0xB1, 0x94, 0xEB, 0x3A } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData15Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData15Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x000000D1, 0x000016E5, { { 0xD8, 0xE9, 0xA5, 0xEE, 0x54, 0x1B, 0x3E, 0x32, 0xDA, 0x78, 0x90, 0xC2, 0x54, 0xFC, 0xD5, 0x39 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData16Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData16Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000008F, 0x00000C69, { { 0xBC, 0x41, 0xE5, 0xAF, 0x89, 0xE2, 0x54, 0x12, 0x9E, 0xB0, 0x5F, 0x28, 0xFF, 0x92, 0x9D, 0x89 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData17Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData17Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x000000DC, 0x0000170D, { { 0x7A, 0x7B, 0x74, 0xCB, 0x68, 0xC2, 0xFF, 0xC7, 0xBE, 0x47, 0xE9, 0x43, 0xF7, 0x15, 0x8D, 0x59 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData18Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData18Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000134, 0x00002651, { { 0x71, 0x26, 0x47, 0x0D, 0x7C, 0x96, 0x45, 0x0B, 0x82, 0xD0, 0x37, 0xB9, 0xD4, 0xD0, 0x84, 0xFC } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData19Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData19Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x0000004D, 0x000009C3, { { 0xDA, 0x96, 0xDF, 0x16, 0xEB, 0x5D, 0x49, 0xA4, 0x3F, 0xD3, 0x31, 0xBE, 0x49, 0x72, 0xF2, 0x71 } } } }, EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEoB2FinaleSeqData20Provider[] = { +const ExtractEntrySearchData kEob2FinaleAnimData20Provider[] = { { UNK_LANG, kPlatformUnknown, { 0x00000021, 0x000003D8, { { 0xD9, 0xC8, 0x58, 0x4B, 0x7D, 0x79, 0x86, 0xCB, 0xEB, 0x77, 0xC2, 0xD4, 0xB7, 0xB4, 0xE9, 0x6A } } } }, EXTRACT_END_ENTRY }; @@ -4106,6 +4176,21 @@ const ExtractEntry extractProviders[] = { { kEoB1BeholderSfx, kEoB1BeholderSfxProvider }, { kEoB1TurnUndeadString, kEoB1TurnUndeadStringProvider }, + { kEoB1CgaMappingDefault, kEoB1CgaMappingDefaultProvider }, + { kEoB1CgaMappingAlt, kEoB1CgaMappingAltProvider }, + { kEoB1CgaMappingInv, kEoB1CgaMappingInvProvider }, + { kEoB1CgaMappingItemsL, kEoB1CgaMappingItemsLProvider }, + { kEoB1CgaMappingItemsS, kEoB1CgaMappingItemsSProvider }, + { kEoB1CgaMappingThrown, kEoB1CgaMappingThrownProvider }, + { kEoB1CgaMappingIcons, kEoB1CgaMappingIconsProvider }, + { kEoB1CgaMappingDeco, kEoB1CgaMappingDecoProvider }, + { kEoB1CgaLevelMappingIndex, kEoB1CgaLevelMappingIndexProvider }, + { kEoB1CgaMappingLevel0, kEoB1CgaMappingLevel0Provider }, + { kEoB1CgaMappingLevel1, kEoB1CgaMappingLevel1Provider }, + { kEoB1CgaMappingLevel2, kEoB1CgaMappingLevel2Provider }, + { kEoB1CgaMappingLevel3, kEoB1CgaMappingLevel3Provider }, + { kEoB1CgaMappingLevel4, kEoB1CgaMappingLevel4Provider }, + { kEoB1NpcShpData, kEoB1NpcShpDataProvider }, { kEoB1NpcSubShpIndex1, kEoB1NpcSubShpIndex1Provider }, { kEoB1NpcSubShpIndex2, kEoB1NpcSubShpIndex2Provider }, @@ -4134,50 +4219,50 @@ const ExtractEntry extractProviders[] = { { kEoB2IntroStrings, kEoB2IntroStringsProvider }, { kEoB2IntroCPSFiles, kEoB2IntroCPSFilesProvider }, - { kEoB2IntroSeqData00, kEoB2IntroSeqData00Provider }, - { kEoB2IntroSeqData01, kEoB2IntroSeqData01Provider }, - { kEoB2IntroSeqData02, kEoB2IntroSeqData02Provider }, - { kEoB2IntroSeqData03, kEoB2IntroSeqData03Provider }, - { kEoB2IntroSeqData04, kEoB2IntroSeqData04Provider }, - { kEoB2IntroSeqData05, kEoB2IntroSeqData05Provider }, - { kEoB2IntroSeqData06, kEoB2IntroSeqData06Provider }, - { kEoB2IntroSeqData07, kEoB2IntroSeqData07Provider }, - { kEoB2IntroSeqData08, kEoB2IntroSeqData08Provider }, - { kEoB2IntroSeqData09, kEoB2IntroSeqData09Provider }, - { kEoB2IntroSeqData10, kEoB2IntroSeqData10Provider }, - { kEoB2IntroSeqData11, kEoB2IntroSeqData11Provider }, - { kEoB2IntroSeqData12, kEoB2IntroSeqData12Provider }, - { kEoB2IntroSeqData13, kEoB2IntroSeqData13Provider }, - { kEoB2IntroSeqData14, kEoB2IntroSeqData14Provider }, - { kEoB2IntroSeqData15, kEoB2IntroSeqData15Provider }, - { kEoB2IntroSeqData16, kEoB2IntroSeqData16Provider }, - { kEoB2IntroSeqData17, kEoB2IntroSeqData17Provider }, - { kEoB2IntroSeqData18, kEoB2IntroSeqData18Provider }, - { kEoB2IntroSeqData19, kEoB2IntroSeqData19Provider }, - { kEoB2IntroSeqData20, kEoB2IntroSeqData20Provider }, - { kEoB2IntroSeqData21, kEoB2IntroSeqData21Provider }, - { kEoB2IntroSeqData22, kEoB2IntroSeqData22Provider }, - { kEoB2IntroSeqData23, kEoB2IntroSeqData23Provider }, - { kEoB2IntroSeqData24, kEoB2IntroSeqData24Provider }, - { kEoB2IntroSeqData25, kEoB2IntroSeqData25Provider }, - { kEoB2IntroSeqData26, kEoB2IntroSeqData26Provider }, - { kEoB2IntroSeqData27, kEoB2IntroSeqData27Provider }, - { kEoB2IntroSeqData28, kEoB2IntroSeqData28Provider }, - { kEoB2IntroSeqData29, kEoB2IntroSeqData29Provider }, - { kEoB2IntroSeqData30, kEoB2IntroSeqData30Provider }, - { kEoB2IntroSeqData31, kEoB2IntroSeqData31Provider }, - { kEoB2IntroSeqData32, kEoB2IntroSeqData32Provider }, - { kEoB2IntroSeqData33, kEoB2IntroSeqData33Provider }, - { kEoB2IntroSeqData34, kEoB2IntroSeqData34Provider }, - { kEoB2IntroSeqData35, kEoB2IntroSeqData35Provider }, - { kEoB2IntroSeqData36, kEoB2IntroSeqData36Provider }, - { kEoB2IntroSeqData37, kEoB2IntroSeqData37Provider }, - { kEoB2IntroSeqData38, kEoB2IntroSeqData38Provider }, - { kEoB2IntroSeqData39, kEoB2IntroSeqData39Provider }, - { kEoB2IntroSeqData40, kEoB2IntroSeqData40Provider }, - { kEoB2IntroSeqData41, kEoB2IntroSeqData41Provider }, - { kEoB2IntroSeqData42, kEoB2IntroSeqData42Provider }, - { kEoB2IntroSeqData43, kEoB2IntroSeqData43Provider }, + { kEob2IntroAnimData00, kEob2IntroAnimData00Provider }, + { kEob2IntroAnimData01, kEob2IntroAnimData01Provider }, + { kEob2IntroAnimData02, kEob2IntroAnimData02Provider }, + { kEob2IntroAnimData03, kEob2IntroAnimData03Provider }, + { kEob2IntroAnimData04, kEob2IntroAnimData04Provider }, + { kEob2IntroAnimData05, kEob2IntroAnimData05Provider }, + { kEob2IntroAnimData06, kEob2IntroAnimData06Provider }, + { kEob2IntroAnimData07, kEob2IntroAnimData07Provider }, + { kEob2IntroAnimData08, kEob2IntroAnimData08Provider }, + { kEob2IntroAnimData09, kEob2IntroAnimData09Provider }, + { kEob2IntroAnimData10, kEob2IntroAnimData10Provider }, + { kEob2IntroAnimData11, kEob2IntroAnimData11Provider }, + { kEob2IntroAnimData12, kEob2IntroAnimData12Provider }, + { kEob2IntroAnimData13, kEob2IntroAnimData13Provider }, + { kEob2IntroAnimData14, kEob2IntroAnimData14Provider }, + { kEob2IntroAnimData15, kEob2IntroAnimData15Provider }, + { kEob2IntroAnimData16, kEob2IntroAnimData16Provider }, + { kEob2IntroAnimData17, kEob2IntroAnimData17Provider }, + { kEob2IntroAnimData18, kEob2IntroAnimData18Provider }, + { kEob2IntroAnimData19, kEob2IntroAnimData19Provider }, + { kEob2IntroAnimData20, kEob2IntroAnimData20Provider }, + { kEob2IntroAnimData21, kEob2IntroAnimData21Provider }, + { kEob2IntroAnimData22, kEob2IntroAnimData22Provider }, + { kEob2IntroAnimData23, kEob2IntroAnimData23Provider }, + { kEob2IntroAnimData24, kEob2IntroAnimData24Provider }, + { kEob2IntroAnimData25, kEob2IntroAnimData25Provider }, + { kEob2IntroAnimData26, kEob2IntroAnimData26Provider }, + { kEob2IntroAnimData27, kEob2IntroAnimData27Provider }, + { kEob2IntroAnimData28, kEob2IntroAnimData28Provider }, + { kEob2IntroAnimData29, kEob2IntroAnimData29Provider }, + { kEob2IntroAnimData30, kEob2IntroAnimData30Provider }, + { kEob2IntroAnimData31, kEob2IntroAnimData31Provider }, + { kEob2IntroAnimData32, kEob2IntroAnimData32Provider }, + { kEob2IntroAnimData33, kEob2IntroAnimData33Provider }, + { kEob2IntroAnimData34, kEob2IntroAnimData34Provider }, + { kEob2IntroAnimData35, kEob2IntroAnimData35Provider }, + { kEob2IntroAnimData36, kEob2IntroAnimData36Provider }, + { kEob2IntroAnimData37, kEob2IntroAnimData37Provider }, + { kEob2IntroAnimData38, kEob2IntroAnimData38Provider }, + { kEob2IntroAnimData39, kEob2IntroAnimData39Provider }, + { kEob2IntroAnimData40, kEob2IntroAnimData40Provider }, + { kEob2IntroAnimData41, kEob2IntroAnimData41Provider }, + { kEob2IntroAnimData42, kEob2IntroAnimData42Provider }, + { kEob2IntroAnimData43, kEob2IntroAnimData43Provider }, { kEoB2IntroShapes00, kEoB2IntroShapes00Provider }, { kEoB2IntroShapes01, kEoB2IntroShapes01Provider }, { kEoB2IntroShapes04, kEoB2IntroShapes04Provider }, @@ -4186,27 +4271,27 @@ const ExtractEntry extractProviders[] = { { kEoB2FinaleStrings, kEoB2FinaleStringsProvider }, { kEoB2CreditsData, kEoB2CreditsDataProvider }, { kEoB2FinaleCPSFiles, kEoB2FinaleCPSFilesProvider }, - { kEoB2FinaleSeqData00, kEoB2FinaleSeqData00Provider }, - { kEoB2FinaleSeqData01, kEoB2FinaleSeqData01Provider }, - { kEoB2FinaleSeqData02, kEoB2FinaleSeqData02Provider }, - { kEoB2FinaleSeqData03, kEoB2FinaleSeqData03Provider }, - { kEoB2FinaleSeqData04, kEoB2FinaleSeqData04Provider }, - { kEoB2FinaleSeqData05, kEoB2FinaleSeqData05Provider }, - { kEoB2FinaleSeqData06, kEoB2FinaleSeqData06Provider }, - { kEoB2FinaleSeqData07, kEoB2FinaleSeqData07Provider }, - { kEoB2FinaleSeqData08, kEoB2FinaleSeqData08Provider }, - { kEoB2FinaleSeqData09, kEoB2FinaleSeqData09Provider }, - { kEoB2FinaleSeqData10, kEoB2FinaleSeqData10Provider }, - { kEoB2FinaleSeqData11, kEoB2FinaleSeqData11Provider }, - { kEoB2FinaleSeqData12, kEoB2FinaleSeqData12Provider }, - { kEoB2FinaleSeqData13, kEoB2FinaleSeqData13Provider }, - { kEoB2FinaleSeqData14, kEoB2FinaleSeqData14Provider }, - { kEoB2FinaleSeqData15, kEoB2FinaleSeqData15Provider }, - { kEoB2FinaleSeqData16, kEoB2FinaleSeqData16Provider }, - { kEoB2FinaleSeqData17, kEoB2FinaleSeqData17Provider }, - { kEoB2FinaleSeqData18, kEoB2FinaleSeqData18Provider }, - { kEoB2FinaleSeqData19, kEoB2FinaleSeqData19Provider }, - { kEoB2FinaleSeqData20, kEoB2FinaleSeqData20Provider }, + { kEob2FinaleAnimData00, kEob2FinaleAnimData00Provider }, + { kEob2FinaleAnimData01, kEob2FinaleAnimData01Provider }, + { kEob2FinaleAnimData02, kEob2FinaleAnimData02Provider }, + { kEob2FinaleAnimData03, kEob2FinaleAnimData03Provider }, + { kEob2FinaleAnimData04, kEob2FinaleAnimData04Provider }, + { kEob2FinaleAnimData05, kEob2FinaleAnimData05Provider }, + { kEob2FinaleAnimData06, kEob2FinaleAnimData06Provider }, + { kEob2FinaleAnimData07, kEob2FinaleAnimData07Provider }, + { kEob2FinaleAnimData08, kEob2FinaleAnimData08Provider }, + { kEob2FinaleAnimData09, kEob2FinaleAnimData09Provider }, + { kEob2FinaleAnimData10, kEob2FinaleAnimData10Provider }, + { kEob2FinaleAnimData11, kEob2FinaleAnimData11Provider }, + { kEob2FinaleAnimData12, kEob2FinaleAnimData12Provider }, + { kEob2FinaleAnimData13, kEob2FinaleAnimData13Provider }, + { kEob2FinaleAnimData14, kEob2FinaleAnimData14Provider }, + { kEob2FinaleAnimData15, kEob2FinaleAnimData15Provider }, + { kEob2FinaleAnimData16, kEob2FinaleAnimData16Provider }, + { kEob2FinaleAnimData17, kEob2FinaleAnimData17Provider }, + { kEob2FinaleAnimData18, kEob2FinaleAnimData18Provider }, + { kEob2FinaleAnimData19, kEob2FinaleAnimData19Provider }, + { kEob2FinaleAnimData20, kEob2FinaleAnimData20Provider }, { kEoB2FinaleShapes00, kEoB2FinaleShapes00Provider }, { kEoB2FinaleShapes03, kEoB2FinaleShapes03Provider }, { kEoB2FinaleShapes07, kEoB2FinaleShapes07Provider }, diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat Binary files differindex 7fd8be0641..2fc6791d5d 100644 --- a/dists/engine-data/kyra.dat +++ b/dists/engine-data/kyra.dat diff --git a/engines/kyra/chargen.cpp b/engines/kyra/chargen.cpp index ed761e53c6..23274349e7 100644 --- a/engines/kyra/chargen.cpp +++ b/engines/kyra/chargen.cpp @@ -248,10 +248,10 @@ void CharacterGenerator::init() { _faceShapes = new uint8*[44]; for (int i = 0; i < 44; i++) - _faceShapes[i] = _screen->encodeShape((i % 10) << 2, (i / 10) << 5, 4, 32, true); + _faceShapes[i] = _screen->encodeShape((i % 10) << 2, (i / 10) << 5, 4, 32, true, _vm->_cgaMappingDefault); _screen->_curPage = 0; - _screen->loadEoBBitmap("CHARGEN", 0, 3, 3, 0); + _screen->loadEoBBitmap("CHARGEN", _vm->_cgaMappingDefault, 3, 3, 0); _screen->loadShapeSetBitmap("CHARGENB", 3, 3); if (_chargenMagicShapes) { for (int i = 0; i < 10; i++) @@ -261,14 +261,14 @@ void CharacterGenerator::init() { _chargenMagicShapes = new uint8*[10]; for (int i = 0; i < 10; i++) - _chargenMagicShapes[i] = _screen->encodeShape(i << 2, 0, 4, 32, true); + _chargenMagicShapes[i] = _screen->encodeShape(i << 2, 0, 4, 32, true, _vm->_cgaMappingDefault); for (int i = 0; i < 17; i++) { const CreatePartyModButton *c = &_chargenModButtons[i]; - _chargenButtonLabels[i] = c->labelW ? _screen->encodeShape(c->encodeLabelX, c->encodeLabelY, c->labelW, c->labelH, true) : 0; + _chargenButtonLabels[i] = c->labelW ? _screen->encodeShape(c->encodeLabelX, c->encodeLabelY, c->labelW, c->labelH, true, _vm->_cgaMappingDefault) : 0; } - _screen->copyPage(3, 2); + _screen->convertPage(3, 2, _vm->_cgaMappingDefault); _screen->_curPage = 0; _screen->copyRegion(144, 64, 0, 0, 180, 128, 0, 2, Screen::CR_NO_P_CHECK); _screen->updateScreen(); diff --git a/engines/kyra/darkmoon.cpp b/engines/kyra/darkmoon.cpp index f63d49933b..918221e0dd 100644 --- a/engines/kyra/darkmoon.cpp +++ b/engines/kyra/darkmoon.cpp @@ -29,22 +29,21 @@ namespace Kyra { DarkMoonEngine::DarkMoonEngine(OSystem *system, const GameFlags &flags) : EoBCoreEngine(system, flags) { - _seqIntro = _seqFinale = 0; + _animIntro = _animFinale = 0; _shapesIntro = _shapesFinale = 0; _dscDoorType5Offs = 0; _numSpells = 70; _menuChoiceInit = 4; _introStrings = _cpsFilesIntro = _cpsFilesFinale = _finaleStrings = _kheldranStrings = _npcStrings[0] = _npcStrings[1] = _hornStrings = 0; - _seqIntro = _seqFinale = 0; _shapesIntro = _shapesFinale = 0; _creditsData = _npcShpData = _dscDoorType5Offs = _hornSounds = 0; _dreamSteps = 0; } DarkMoonEngine::~DarkMoonEngine() { - delete[] _seqIntro; - delete[] _seqFinale; + delete[] _animIntro; + delete[] _animFinale; delete[] _shapesIntro; delete[] _shapesFinale; } @@ -58,6 +57,14 @@ Common::Error DarkMoonEngine::init() { _monsterProps = new EoBMonsterProperty[10]; + if (_configRenderMode == Common::kRenderEGA) { + Palette pal(16); + _screen->loadPalette(_egaDefaultPalette, pal, 16); + _screen->setScreenPalette(pal); + } else { + _screen->loadPalette("palette.col", _screen->getPalette(0)); + } + return Common::kNoError; } diff --git a/engines/kyra/darkmoon.h b/engines/kyra/darkmoon.h index 78413d2c38..f6e7b3ed2c 100644 --- a/engines/kyra/darkmoon.h +++ b/engines/kyra/darkmoon.h @@ -31,7 +31,7 @@ namespace Kyra { class DarkmoonSequenceHelper; -struct EoBSequenceStep { +struct DarkMoonAnimCommand { uint8 command; uint8 obj; int16 x1; @@ -74,17 +74,19 @@ private: const char * const *_introStrings; const char * const *_cpsFilesIntro; - const EoBSequenceStep **_seqIntro; - const EoBShapeDef **_shapesIntro; + const DarkMoonAnimCommand **_animIntro; + const DarkMoonShapeDef **_shapesIntro; const char * const *_finaleStrings; const uint8 *_creditsData; const char * const *_cpsFilesFinale; - const EoBSequenceStep **_seqFinale; - const EoBShapeDef **_shapesFinale; + const DarkMoonAnimCommand **_animFinale; + const DarkMoonShapeDef **_shapesFinale; - static const char *_palFilesIntro[]; - static const char *_palFilesFinale[]; + static const char *_palFilesIntroVGA[]; + static const char *_palFilesIntroEGA[]; + static const char *_palFilesFinaleVGA[]; + static const char *_palFilesFinaleEGA[]; // Ingame sequence void seq_nightmare(); @@ -135,6 +137,7 @@ private: const uint8 *_hornSounds; static const KyraRpgGUISettings _guiSettings; + static const uint8 _egaDefaultPalette[]; }; } // End of namespace Kyra diff --git a/engines/kyra/eob.cpp b/engines/kyra/eob.cpp index 40b028184f..3a1cfc1c84 100644 --- a/engines/kyra/eob.cpp +++ b/engines/kyra/eob.cpp @@ -55,7 +55,7 @@ Common::Error EoBEngine::init() { initStaticResource(); - _itemsOverlay = _res->fileData("ITEMRMP.VGA", 0); + _itemsOverlay = _res->fileData((_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA) ? "ITEMRMP.EGA" : "ITEMRMP.VGA", 0); _screen->modifyScreenDim(7, 0x01, 0xB3, 0x22, 0x12); _screen->modifyScreenDim(9, 0x01, 0x7D, 0x26, 0x3F); @@ -63,6 +63,14 @@ Common::Error EoBEngine::init() { _scriptTimersCount = 1; + if (_configRenderMode == Common::kRenderEGA) { + Palette pal(16); + _screen->loadPalette(_egaDefaultPalette, pal, 16); + _screen->setScreenPalette(pal); + } else { + _screen->loadPalette("palette.col", _screen->getPalette(0)); + } + return Common::kNoError; } @@ -73,6 +81,7 @@ void EoBEngine::startupNew() { _currentBlock = 490; _currentDirection = 0; setHandItem(0); + EoBCoreEngine::startupNew(); } @@ -134,7 +143,7 @@ void EoBEngine::drawNpcScene(int npcIndex) { void EoBEngine::encodeDrawNpcSeqShape(int npcIndex, int drawX, int drawY) { const uint8 *shpDef = &_npcShpData[npcIndex << 2]; _screen->_curPage = 2; - const uint8 *shp = _screen->encodeShape(shpDef[0], shpDef[1], shpDef[2], shpDef[3]); + const uint8 *shp = _screen->encodeShape(shpDef[0], shpDef[1], shpDef[2], shpDef[3], false, _cgaMappingDefault); _screen->_curPage = 0; _screen->drawShape(0, shp, drawX - (shp[2] << 2), drawY - shp[1], 5); delete[] shp; @@ -352,9 +361,9 @@ void EoBEngine::loadDoorShapes(int doorType1, int shapeId1, int doorType2, int s if (doorType1 != 0xff) { for (int i = 0; i < 3; i++) { const uint8 *enc = &_doorShapeEncodeDefs[(doorType1 * 3 + i) << 2]; - _doorShapes[shapeId1 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3]); + _doorShapes[shapeId1 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0); enc = &_doorSwitchShapeEncodeDefs[(doorType1 * 3 + i) << 2]; - _doorSwitches[shapeId1 + i].shp = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3]); + _doorSwitches[shapeId1 + i].shp = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0); _doorSwitches[shapeId1 + i].x = _doorSwitchCoords[doorType1 * 6 + i * 2]; _doorSwitches[shapeId1 + i].y = _doorSwitchCoords[doorType1 * 6 + i * 2 + 1]; } @@ -363,9 +372,9 @@ void EoBEngine::loadDoorShapes(int doorType1, int shapeId1, int doorType2, int s if (doorType2 != 0xff) { for (int i = 0; i < 3; i++) { const uint8 *enc = &_doorShapeEncodeDefs[(doorType2 * 3 + i) << 2]; - _doorShapes[shapeId2 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3]); + _doorShapes[shapeId2 + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0); enc = &_doorSwitchShapeEncodeDefs[(doorType2 * 3 + i) << 2]; - _doorSwitches[shapeId2 + i].shp = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3]); + _doorSwitches[shapeId2 + i].shp = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0); _doorSwitches[shapeId2 + i].x = _doorSwitchCoords[doorType2 * 6 + i * 2]; _doorSwitches[shapeId2 + i].y = _doorSwitchCoords[doorType2 * 6 + i * 2 + 1]; } diff --git a/engines/kyra/eob.h b/engines/kyra/eob.h index 89d2b25b23..9d583a0cd7 100644 --- a/engines/kyra/eob.h +++ b/engines/kyra/eob.h @@ -109,6 +109,7 @@ private: const KyraRpgGUISettings *guiSettings(); static const KyraRpgGUISettings _guiSettings; + static const uint8 _egaDefaultPalette[]; }; diff --git a/engines/kyra/eobcommon.cpp b/engines/kyra/eobcommon.cpp index 42ceed593e..a68c7de9e8 100644 --- a/engines/kyra/eobcommon.cpp +++ b/engines/kyra/eobcommon.cpp @@ -47,6 +47,7 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) _numThrownItemShapes(flags.gameID == GI_EOB1 ? 12 : 9), _numItemIconShapes(flags.gameID == GI_EOB1 ? 89 : 112), _teleporterWallId(flags.gameID == GI_EOB1 ? 52 : 44) { + _screen = 0; _gui = 0; _debugger = 0; @@ -212,6 +213,8 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) _spellLevelsMage = _spellLevelsCleric = _numSpellsCleric = _numSpellsWisAdj = _numSpellsPal = _numSpellsMage = 0; _mnNumWord = _numSpells = _mageSpellListSize = _spellLevelsMageSize = _spellLevelsClericSize = 0; _inventorySlotsX = _slotValidationFlags = _encodeMonsterShpTable = 0; + _cgaMappingDefault = _cgaMappingAlt = _cgaMappingInv = _cgaLevelMappingIndex = _cgaMappingItemsL = _cgaMappingItemsS = _cgaMappingThrown = _cgaMappingIcons = _cgaMappingDeco = 0; + memset(_cgaMappingLevel, 0, sizeof(_cgaMappingLevel)); memset(_expRequirementTables, 0, sizeof(_expRequirementTables)); memset(_saveThrowTables, 0, sizeof(_saveThrowTables)); memset(_doorType, 0, sizeof(_doorType)); @@ -364,6 +367,9 @@ Common::Error EoBCoreEngine::init() { // This makes a tick length of 54.94. _tickLength = 55; + if (ConfMan.hasKey("render_mode")) + _configRenderMode = Common::parseRenderMode(ConfMan.get("render_mode")); + _screen = new Screen_EoB(this, _system); assert(_screen); _screen->setResolution(); @@ -497,8 +503,7 @@ Common::Error EoBCoreEngine::go() { _debugger->initialize(); _txt->removePageBreakFlag(); - _screen->loadPalette("palette.col", _screen->getPalette(0)); - _screen->setScreenPalette(_screen->getPalette(0)); + _screen->setFont(Screen::FID_8_FNT); loadItemsAndDecorationsShapes(); @@ -661,44 +666,43 @@ bool EoBCoreEngine::checkPartyStatus(bool handleDeath) { void EoBCoreEngine::loadItemsAndDecorationsShapes() { releaseItemsAndDecorationsShapes(); - _screen->setCurPage(2); - _screen->loadBitmap("ITEML1.CPS", 5, 3, 0); + _screen->loadShapeSetBitmap("ITEML1", 5, 3); _largeItemShapes = new const uint8*[_numLargeItemShapes]; int div = (_flags.gameID == GI_EOB1) ? 3 : 8; int mul = (_flags.gameID == GI_EOB1) ? 64 : 24; for (int i = 0; i < _numLargeItemShapes; i++) - _largeItemShapes[i] = _screen->encodeShape((i / div) << 3, (i % div) * mul, 8, 24); + _largeItemShapes[i] = _screen->encodeShape((i / div) << 3, (i % div) * mul, 8, 24, false, _cgaMappingItemsL); - _screen->loadBitmap("ITEMS1.CPS", 5, 3, 0); + _screen->loadShapeSetBitmap("ITEMS1", 5, 3); _smallItemShapes = new const uint8*[_numSmallItemShapes]; for (int i = 0; i < _numSmallItemShapes; i++) - _smallItemShapes[i] = _screen->encodeShape((i / div) << 2, (i % div) * mul, 4, 24); + _smallItemShapes[i] = _screen->encodeShape((i / div) << 2, (i % div) * mul, 4, 24, false, _cgaMappingItemsS); - _screen->loadBitmap("THROWN.CPS", 5, 3, 0); + _screen->loadShapeSetBitmap("THROWN", 5, 3); _thrownItemShapes = new const uint8*[_numThrownItemShapes]; for (int i = 0; i < _numThrownItemShapes; i++) - _thrownItemShapes[i] = _screen->encodeShape((i / div) << 2, (i % div) * mul, 4, 24); + _thrownItemShapes[i] = _screen->encodeShape((i / div) << 2, (i % div) * mul, 4, 24, false, _cgaMappingThrown); _spellShapes = new const uint8*[4]; for (int i = 0; i < 4; i++) - _spellShapes[i] = _screen->encodeShape(8, i << 5, 6, 32); + _spellShapes[i] = _screen->encodeShape(8, i << 5, 6, 32, false, _cgaMappingThrown); _firebeamShapes = new const uint8*[3]; - _firebeamShapes[0] = _screen->encodeShape(16, 0, 4, 24); - _firebeamShapes[1] = _screen->encodeShape(16, 24, 4, 24); - _firebeamShapes[2] = _screen->encodeShape(16, 48, 3, 24); - _redSplatShape = _screen->encodeShape(16, _flags.gameID == GI_EOB1 ? 144 : 72, 5, 24); - _greenSplatShape = _screen->encodeShape(16, _flags.gameID == GI_EOB1 ? 168 : 96, 5, 16); + _firebeamShapes[0] = _screen->encodeShape(16, 0, 4, 24, false, _cgaMappingThrown); + _firebeamShapes[1] = _screen->encodeShape(16, 24, 4, 24, false, _cgaMappingThrown); + _firebeamShapes[2] = _screen->encodeShape(16, 48, 3, 24, false, _cgaMappingThrown); + _redSplatShape = _screen->encodeShape(16, _flags.gameID == GI_EOB1 ? 144 : 72, 5, 24, false, _cgaMappingThrown); + _greenSplatShape = _screen->encodeShape(16, _flags.gameID == GI_EOB1 ? 168 : 96, 5, 16, false, _cgaMappingThrown); - _screen->loadBitmap("ITEMICN.CPS", 5, 3, 0); + _screen->loadShapeSetBitmap("ITEMICN", 5, 3); _itemIconShapes = new const uint8*[_numItemIconShapes]; for (int i = 0; i < _numItemIconShapes; i++) - _itemIconShapes[i] = _screen->encodeShape((i % 0x14) << 1, (i / 0x14) << 4, 2, 0x10); + _itemIconShapes[i] = _screen->encodeShape((i % 0x14) << 1, (i / 0x14) << 4, 2, 0x10, false, _cgaMappingIcons); _tempIconShape = new uint8[300]; - _screen->loadBitmap("DECORATE.CPS", 5, 3, 0); + _screen->loadShapeSetBitmap("DECORATE", 5, 3); if (_flags.gameID == GI_EOB2) { _lightningColumnShape = _screen->encodeShape(18, 88, 4, 64); @@ -709,16 +713,16 @@ void EoBCoreEngine::loadItemsAndDecorationsShapes() { _teleporterShapes = new const uint8*[6]; for (int i = 0; i < 6; i++) - _teleporterShapes[i] = _screen->encodeShape(_teleporterShapeDefs[(i << 2)], _teleporterShapeDefs[(i << 2) + 1], _teleporterShapeDefs[(i << 2) + 2], _teleporterShapeDefs[(i << 2) + 3]); + _teleporterShapes[i] = _screen->encodeShape(_teleporterShapeDefs[(i << 2)], _teleporterShapeDefs[(i << 2) + 1], _teleporterShapeDefs[(i << 2) + 2], _teleporterShapeDefs[(i << 2) + 3], false, _cgaMappingDefault); _sparkShapes = new const uint8*[3]; - _sparkShapes[0] = _screen->encodeShape(29, 0, 2, 16); - _sparkShapes[1] = _screen->encodeShape(31, 0, 2, 16); - _sparkShapes[2] = _screen->encodeShape(33, 0, 2, 16); - _deadCharShape = _screen->encodeShape(0, 88, 4, 32); - _disabledCharGrid = _screen->encodeShape(4, 88, 4, 32); - _blackBoxSmallGrid = _screen->encodeShape(9, 88, 2, 8); - _weaponSlotGrid = _screen->encodeShape(8, 88, 4, 16); - _blackBoxWideGrid = _screen->encodeShape(8, 104, 4, 8); + _sparkShapes[0] = _screen->encodeShape(29, 0, 2, 16, false, _cgaMappingDeco); + _sparkShapes[1] = _screen->encodeShape(31, 0, 2, 16, false, _cgaMappingDeco); + _sparkShapes[2] = _screen->encodeShape(33, 0, 2, 16, false, _cgaMappingDeco); + _deadCharShape = _screen->encodeShape(0, 88, 4, 32, false, _cgaMappingDeco); + _disabledCharGrid = _screen->encodeShape(4, 88, 4, 32, false, _cgaMappingDeco); + _blackBoxSmallGrid = _screen->encodeShape(9, 88, 2, 8, false, _cgaMappingDeco); + _weaponSlotGrid = _screen->encodeShape(8, 88, 4, 16, false, _cgaMappingDeco); + _blackBoxWideGrid = _screen->encodeShape(8, 104, 4, 8, false, _cgaMappingDeco); static const uint8 dHeight[] = { 17, 10, 10 }; static const uint8 dY[] = { 120, 137, 147 }; @@ -726,7 +730,7 @@ void EoBCoreEngine::loadItemsAndDecorationsShapes() { _compassShapes = new const uint8*[12]; for (int y = 0; y < 3; y++) { for (int x = 0; x < 4; x++) - _compassShapes[(y << 2) + x] = _screen->encodeShape(x * 3, dY[y], 3, dHeight[y]); + _compassShapes[(y << 2) + x] = _screen->encodeShape(x * 3, dY[y], 3, dHeight[y], false, _cgaMappingDeco); } } @@ -1197,7 +1201,7 @@ void EoBCoreEngine::initNpc(int npcIndex) { _screen->loadShapeSetBitmap(_flags.gameID == GI_EOB2 ? "OUTPORTS" : "OUTTAKE", 3, 3); _screen->_curPage = 2; - c->faceShape = _screen->encodeShape(npcIndex << 2, _flags.gameID == GI_EOB2 ? 0 : 160, 4, 32, true); + c->faceShape = _screen->encodeShape(npcIndex << 2, _flags.gameID == GI_EOB2 ? 0 : 160, 4, 32, true, _cgaMappingDefault); _screen->_curPage = 0; } @@ -1679,13 +1683,13 @@ void EoBCoreEngine::seq_portal() { _screen->loadShapeSetBitmap("PORTALA", 5, 3); for (int i = 0; i < 5; i++) { - shapes1[i] = _screen->encodeShape(i * 3, 0, 3, 75); - shapes2[i] = _screen->encodeShape(i * 3, 80, 3, 75); - shapes3[i] = _screen->encodeShape(15, i * 18, 15, 18); + shapes1[i] = _screen->encodeShape(i * 3, 0, 3, 75, false, _cgaMappingDefault); + shapes2[i] = _screen->encodeShape(i * 3, 80, 3, 75, false, _cgaMappingDefault); + shapes3[i] = _screen->encodeShape(15, i * 18, 15, 18, false, _cgaMappingDefault); } - shape0 = _screen->encodeShape(30, 0, 8, 77); - _screen->loadEoBBitmap("PORTALB", 0, 5, 3, 2); + shape0 = _screen->encodeShape(30, 0, 8, 77, false, _cgaMappingDefault); + _screen->loadEoBBitmap("PORTALB", _cgaMappingDefault, 5, 3, 2); snd_playSoundEffect(33); snd_playSoundEffect(19); diff --git a/engines/kyra/eobcommon.h b/engines/kyra/eobcommon.h index dff2427ddb..49589c809c 100644 --- a/engines/kyra/eobcommon.h +++ b/engines/kyra/eobcommon.h @@ -31,7 +31,7 @@ namespace Kyra { -struct EoBShapeDef { +struct DarkMoonShapeDef { int16 index; uint8 x, y, w, h; }; @@ -577,7 +577,7 @@ protected: void readLevelFileData(int level); Common::String initLevelData(int sub); void addLevelItems(); - void loadVcnData(const char *file, const char * /*nextFile*/); + void loadVcnData(const char *file, const uint8 *cgaMapping); void loadBlockProperties(const char *mazFile); const uint8 *getBlockFileData(int levelIndex = 0); Common::String getBlockFileName(int levelIndex, int sub); @@ -834,6 +834,17 @@ protected: Common::Error loadGameState(int slot); Common::Error saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail); + const uint8 *_cgaMappingDefault; + const uint8 *_cgaMappingAlt; + const uint8 *_cgaMappingInv; + const uint8 *_cgaMappingItemsL; + const uint8 *_cgaMappingItemsS; + const uint8 *_cgaMappingThrown; + const uint8 *_cgaMappingIcons; + const uint8 *_cgaMappingDeco; + const uint8 *_cgaMappingLevel[5]; + const uint8 *_cgaLevelMappingIndex; + // Default parameters will import all present original save files and push them to the top of the save dialog. bool importOriginalSaveFile(int destSlot, const char *sourceFile = 0); Common::String readOriginalSaveFile(Common::String &file); diff --git a/engines/kyra/gui_eob.cpp b/engines/kyra/gui_eob.cpp index b89a6d7293..2fdfb0c011 100644 --- a/engines/kyra/gui_eob.cpp +++ b/engines/kyra/gui_eob.cpp @@ -47,7 +47,7 @@ Button *EoBCoreEngine::gui_getButton(Button *buttonList, int index) { } void EoBCoreEngine::gui_drawPlayField(bool refresh) { - _screen->loadEoBBitmap("PLAYFLD", 0, 5, 3, 2); + _screen->loadEoBBitmap("PLAYFLD", _cgaMappingDeco, 5, 3, 2); int cp = _screen->setCurPage(2); gui_drawCompass(true); @@ -60,11 +60,11 @@ void EoBCoreEngine::gui_drawPlayField(bool refresh) { if (!_loading) _screen->updateScreen(); - _screen->loadEoBBitmap("INVENT", 0, 5, 3, 2); + _screen->loadEoBBitmap("INVENT", _cgaMappingInv, 5, 3, 2); } void EoBCoreEngine::gui_restorePlayField() { - loadVcnData(0, 0); + loadVcnData(0, (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0); _screen->_curPage = 0; gui_drawPlayField(true); gui_drawAllCharPortraitsWithStats(); @@ -1891,7 +1891,7 @@ void GUI_EoB::simpleMenu_setup(int sd, int maxItem, const char *const *strings, for (int i = 0; i < _menuNumItems; i++) { int item = simpleMenu_getMenuItem(i, menuItemsMask, itemOffset); int ty = y + i * (lineSpacing + _screen->getFontHeight()); - _screen->printShadedText(strings[item], x, ty, dm->unkA, 0); + _screen->printShadedText(strings[item], x, ty, (_vm->_configRenderMode == Common::kRenderCGA) ? 1 : dm->unkA, 0); if (item == v) _screen->printText(strings[item], x, ty, dm->unkC, 0); } @@ -1944,7 +1944,7 @@ int GUI_EoB::simpleMenu_process(int sd, const char *const *strings, void *b, int } if (newItem != currentItem) { - _screen->printText(strings[simpleMenu_getMenuItem(currentItem, menuItemsMask, itemOffset)], x, y + currentItem * lineH , dm->unkA, 0); + _screen->printText(strings[simpleMenu_getMenuItem(currentItem, menuItemsMask, itemOffset)], x, y + currentItem * lineH, (_vm->_configRenderMode == Common::kRenderCGA) ? 1 : dm->unkA, 0); _screen->printText(strings[simpleMenu_getMenuItem(newItem, menuItemsMask, itemOffset)], x, y + newItem * lineH , dm->unkC, 0); _screen->updateScreen(); } diff --git a/engines/kyra/kyra_rpg.cpp b/engines/kyra/kyra_rpg.cpp index b28292562a..8c9a1ec835 100644 --- a/engines/kyra/kyra_rpg.cpp +++ b/engines/kyra/kyra_rpg.cpp @@ -45,7 +45,7 @@ KyraRpgEngine::KyraRpgEngine(OSystem *system, const GameFlags &flags) : KyraEngi _vcnBlocks = 0; _vcfBlocks = 0; _vcnShift = 0; - _vcnExpTable = 0; + _vcnColTable = 0; _vmpPtr = 0; _blockBrightness = _wllVcnOffset = 0; _blockDrawingBuffer = 0; @@ -123,7 +123,7 @@ KyraRpgEngine::~KyraRpgEngine() { delete[] _wllWallFlags; delete[] _vmpPtr; - delete[] _vcnExpTable; + delete[] _vcnColTable; delete[] _vcnBlocks; delete[] _vcfBlocks; delete[] _vcnShift; @@ -173,9 +173,9 @@ Common::Error KyraRpgEngine::init() { _lvlShapeLeftRight = new int16[36]; memset(_lvlShapeLeftRight, 0, 36 * sizeof(int16)); - _vcnExpTable = new uint8[128]; + _vcnColTable = new uint8[128]; for (int i = 0; i < 128; i++) - _vcnExpTable[i] = i & 0x0f; + _vcnColTable[i] = i & 0x0f; _doorShapes = new uint8*[6]; memset(_doorShapes, 0, 6 * sizeof(uint8 *)); diff --git a/engines/kyra/kyra_rpg.h b/engines/kyra/kyra_rpg.h index b606963d8a..6a71239250 100644 --- a/engines/kyra/kyra_rpg.h +++ b/engines/kyra/kyra_rpg.h @@ -225,7 +225,7 @@ protected: uint8 *_vcnBlocks; uint8 *_vcfBlocks; uint8 *_vcnShift; - uint8 *_vcnExpTable; + uint8 *_vcnColTable; uint16 *_blockDrawingBuffer; uint8 *_sceneWindowBuffer; uint8 _blockBrightness; diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 7167d41550..0f7da7673b 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -42,6 +42,8 @@ KyraEngine_v1::KyraEngine_v1(OSystem *system, const GameFlags &flags) _emc = 0; _debugger = 0; + _configRenderMode = Common::kRenderDefault; + if (_flags.platform == Common::kPlatformAmiga) _gameSpeed = 50; else @@ -163,6 +165,9 @@ Common::Error KyraEngine_v1::init() { if (_sound) _sound->updateVolumeSettings(); + if (ConfMan.hasKey("render_mode")) + _configRenderMode = Common::parseRenderMode(ConfMan.get("render_mode")); + _res = new Resource(this); assert(_res); _res->reset(); diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h index 04bfab2cb8..2c2901a753 100644 --- a/engines/kyra/kyra_v1.h +++ b/engines/kyra/kyra_v1.h @@ -306,6 +306,8 @@ protected: bool _configSounds; uint8 _configVoice; + Common::RenderMode _configRenderMode; + // game speed virtual bool skipFlag() const; virtual void resetSkipFlag(bool removeEvent = true); diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h index 5de1577943..84592880e1 100644 --- a/engines/kyra/resource.h +++ b/engines/kyra/resource.h @@ -517,9 +517,23 @@ enum KyraResources { kEoB1EnemyMageSfx, kEoB1BeholderSpellList, kEoB1BeholderSfx, - kEoB1TurnUndeadString, + kEoB1CgaMappingDefault, + kEoB1CgaMappingAlt, + kEoB1CgaMappingInv, + kEoB1CgaMappingItemsL, + kEoB1CgaMappingItemsS, + kEoB1CgaMappingThrown, + kEoB1CgaMappingIcons, + kEoB1CgaMappingDeco, + kEoB1CgaLevelMappingIndex, + kEoB1CgaMappingLevel0, + kEoB1CgaMappingLevel1, + kEoB1CgaMappingLevel2, + kEoB1CgaMappingLevel3, + kEoB1CgaMappingLevel4, + kEoB1NpcShpData, kEoB1NpcSubShpIndex1, kEoB1NpcSubShpIndex2, @@ -548,50 +562,50 @@ enum KyraResources { kEoB2IntroStrings, kEoB2IntroCPSFiles, - kEoB2IntroSeqData00, - kEoB2IntroSeqData01, - kEoB2IntroSeqData02, - kEoB2IntroSeqData03, - kEoB2IntroSeqData04, - kEoB2IntroSeqData05, - kEoB2IntroSeqData06, - kEoB2IntroSeqData07, - kEoB2IntroSeqData08, - kEoB2IntroSeqData09, - kEoB2IntroSeqData10, - kEoB2IntroSeqData11, - kEoB2IntroSeqData12, - kEoB2IntroSeqData13, - kEoB2IntroSeqData14, - kEoB2IntroSeqData15, - kEoB2IntroSeqData16, - kEoB2IntroSeqData17, - kEoB2IntroSeqData18, - kEoB2IntroSeqData19, - kEoB2IntroSeqData20, - kEoB2IntroSeqData21, - kEoB2IntroSeqData22, - kEoB2IntroSeqData23, - kEoB2IntroSeqData24, - kEoB2IntroSeqData25, - kEoB2IntroSeqData26, - kEoB2IntroSeqData27, - kEoB2IntroSeqData28, - kEoB2IntroSeqData29, - kEoB2IntroSeqData30, - kEoB2IntroSeqData31, - kEoB2IntroSeqData32, - kEoB2IntroSeqData33, - kEoB2IntroSeqData34, - kEoB2IntroSeqData35, - kEoB2IntroSeqData36, - kEoB2IntroSeqData37, - kEoB2IntroSeqData38, - kEoB2IntroSeqData39, - kEoB2IntroSeqData40, - kEoB2IntroSeqData41, - kEoB2IntroSeqData42, - kEoB2IntroSeqData43, + 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, + kEob2IntroAnimData41, + kEob2IntroAnimData42, + kEob2IntroAnimData43, kEoB2IntroShapes00, kEoB2IntroShapes01, kEoB2IntroShapes04, @@ -600,27 +614,27 @@ enum KyraResources { kEoB2FinaleStrings, kEoB2CreditsData, kEoB2FinaleCPSFiles, - kEoB2FinaleSeqData00, - kEoB2FinaleSeqData01, - kEoB2FinaleSeqData02, - kEoB2FinaleSeqData03, - kEoB2FinaleSeqData04, - kEoB2FinaleSeqData05, - kEoB2FinaleSeqData06, - kEoB2FinaleSeqData07, - kEoB2FinaleSeqData08, - kEoB2FinaleSeqData09, - kEoB2FinaleSeqData10, - kEoB2FinaleSeqData11, - kEoB2FinaleSeqData12, - kEoB2FinaleSeqData13, - kEoB2FinaleSeqData14, - kEoB2FinaleSeqData15, - kEoB2FinaleSeqData16, - kEoB2FinaleSeqData17, - kEoB2FinaleSeqData18, - kEoB2FinaleSeqData19, - kEoB2FinaleSeqData20, + kEob2FinaleAnimData00, + kEob2FinaleAnimData01, + kEob2FinaleAnimData02, + kEob2FinaleAnimData03, + kEob2FinaleAnimData04, + kEob2FinaleAnimData05, + kEob2FinaleAnimData06, + kEob2FinaleAnimData07, + kEob2FinaleAnimData08, + kEob2FinaleAnimData09, + kEob2FinaleAnimData10, + kEob2FinaleAnimData11, + kEob2FinaleAnimData12, + kEob2FinaleAnimData13, + kEob2FinaleAnimData14, + kEob2FinaleAnimData15, + kEob2FinaleAnimData16, + kEob2FinaleAnimData17, + kEob2FinaleAnimData18, + kEob2FinaleAnimData19, + kEob2FinaleAnimData20, kEoB2FinaleShapes00, kEoB2FinaleShapes03, kEoB2FinaleShapes07, @@ -757,8 +771,8 @@ public: const LoLButtonDef *loadButtonDefs(int id, int &entries); #endif // ENABLE_LOL #ifdef ENABLE_EOB - const EoBSequenceStep *loadEoB2SeqData(int id, int &entries); - const EoBShapeDef *loadEoB2ShapeData(int id, int &entries); + const DarkMoonAnimCommand *loadEoB2SeqData(int id, int &entries); + const DarkMoonShapeDef *loadEoB2ShapeData(int id, int &entries); const EoBCharacter *loadEoBNpcData(int id, int &entries); #endif // ENABLE_EOB diff --git a/engines/kyra/saveload_eob.cpp b/engines/kyra/saveload_eob.cpp index 9f9476d0dc..7f20c124ff 100644 --- a/engines/kyra/saveload_eob.cpp +++ b/engines/kyra/saveload_eob.cpp @@ -110,7 +110,7 @@ Common::Error EoBCoreEngine::loadGameState(int slot) { EoBCharacter *c = &_characters[i]; if (!c->flags || c->portrait < 0) continue; - c->faceShape = _screen->encodeShape((c->portrait % 10) << 2, (c->portrait / 10) << 5, 4, 32, true); + c->faceShape = _screen->encodeShape((c->portrait % 10) << 2, (c->portrait / 10) << 5, 4, 32, true, _cgaMappingDefault); } _screen->loadShapeSetBitmap(_flags.gameID == GI_EOB2 ? "OUTPORTS" : "OUTTAKE", 3, 3); @@ -118,7 +118,7 @@ Common::Error EoBCoreEngine::loadGameState(int slot) { EoBCharacter *c = &_characters[i]; if (!c->flags || c->portrait >= 0) continue; - c->faceShape = _screen->encodeShape((-(c->portrait + 1)) << 2, _flags.gameID == GI_EOB2 ? 0 : 160, 4, 32, true); + c->faceShape = _screen->encodeShape((-(c->portrait + 1)) << 2, _flags.gameID == GI_EOB2 ? 0 : 160, 4, 32, true, _cgaMappingDefault); } _screen->_curPage = 0; diff --git a/engines/kyra/scene_eob.cpp b/engines/kyra/scene_eob.cpp index 3d615e966a..2a59a97cc1 100644 --- a/engines/kyra/scene_eob.cpp +++ b/engines/kyra/scene_eob.cpp @@ -86,8 +86,8 @@ void EoBCoreEngine::loadLevel(int level, int sub) { pos += 2; } - loadVcnData(gfxFile.c_str(), 0); - _screen->loadEoBBitmap("INVENT", 0, 5, 3, 2); + loadVcnData(gfxFile.c_str(), (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[level - 1]] : 0); + _screen->loadEoBBitmap("INVENT", _cgaMappingInv, 5, 3, 2); delayUntil(end); snd_stopSound(); @@ -142,7 +142,8 @@ Common::String EoBCoreEngine::initLevelData(int sub) { loadBlockProperties((const char *)pos); pos += slen; - Common::SeekableReadStream *s = _res->createReadStream(Common::String::format("%s.VMP", (const char *)pos)); + const char *vmpPattern = (_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.EMP" : "%s.VMP"; + Common::SeekableReadStream *s = _res->createReadStream(Common::String::format(vmpPattern, (const char *)pos)); uint16 size = s->readUint16LE(); delete[] _vmpPtr; _vmpPtr = new uint16[size]; @@ -150,12 +151,14 @@ Common::String EoBCoreEngine::initLevelData(int sub) { _vmpPtr[i] = s->readUint16LE(); delete s; - Common::String tmpStr = Common::String::format("%s.PAL", (const char *)pos); + const char *paletteFilePattern = (_flags.gameID == GI_EOB2 && _configRenderMode == Common::kRenderEGA) ? "%s.EGA" : "%s.PAL"; + + Common::String tmpStr = Common::String::format(paletteFilePattern, (const char *)pos); _curGfxFile = (const char *)pos; pos += slen; if (*pos++ != 0xff && _flags.gameID == GI_EOB2) { - tmpStr = Common::String::format("%s.PAL", (const char *)pos); + tmpStr = Common::String::format(paletteFilePattern, (const char *)pos); pos += 13; } @@ -165,21 +168,24 @@ Common::String EoBCoreEngine::initLevelData(int sub) { _screen->setShapeFadeMode(1, false); } - _screen->loadPalette(tmpStr.c_str(), _screen->getPalette(0)); + if (_flags.gameID == GI_EOB2 || _configRenderMode != Common::kRenderEGA) + _screen->loadPalette(tmpStr.c_str(), _screen->getPalette(0)); - Palette backupPal(256); - backupPal.copy(_screen->getPalette(0), 224, 32, 224); - _screen->getPalette(0).fill(224, 32, 0x3f); - uint8 *src = _screen->getPalette(0).getData(); + if (_configRenderMode != Common::kRenderCGA) { + Palette backupPal(256); + backupPal.copy(_screen->getPalette(0), 224, 32, 224); + _screen->getPalette(0).fill(224, 32, 0x3f); + uint8 *src = _screen->getPalette(0).getData(); - _screen->createFadeTable(src, _screen->getFadeTable(0), 4, 75); // green - _screen->createFadeTable(src, _screen->getFadeTable(1), 12, 200); // black - _screen->createFadeTable(src, _screen->getFadeTable(2), 10, 85); // blue - _screen->createFadeTable(src, _screen->getFadeTable(3), 11, 125); // light blue + _screen->createFadeTable(src, _screen->getFadeTable(0), 4, 75); // green + _screen->createFadeTable(src, _screen->getFadeTable(1), 12, 200); // black + _screen->createFadeTable(src, _screen->getFadeTable(2), 10, 85); // blue + _screen->createFadeTable(src, _screen->getFadeTable(3), 11, 125); // light blue - _screen->getPalette(0).copy(backupPal, 224, 32, 224); - _screen->createFadeTable(src, _screen->getFadeTable(4), 12, 85); // grey (shadow) - _screen->setFadeTableIndex(4); + _screen->getPalette(0).copy(backupPal, 224, 32, 224); + _screen->createFadeTable(src, _screen->getFadeTable(4), 12, 85); // grey (shadow) + _screen->setFadeTableIndex(4); + } } if (_flags.gameID == GI_EOB2) { @@ -267,15 +273,17 @@ void EoBCoreEngine::addLevelItems() { } } -void EoBCoreEngine::loadVcnData(const char *file, const char * /*nextFile*/) { +void EoBCoreEngine::loadVcnData(const char *file, const uint8 *cgaMapping) { if (file) strcpy(_lastBlockDataFile, file); - _screen->loadBitmap(Common::String::format("%s.VCN", _lastBlockDataFile).c_str(), 3, 3, 0); - const uint8 *v = _screen->getCPagePtr(2); + const char *filePattern = (_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA)) ? "%s.ECN" : "%s.VCN"; + _screen->loadBitmap(Common::String::format(filePattern, _lastBlockDataFile).c_str(), 3, 3, 0); + const uint8 *v = _screen->getCPagePtr(3); uint32 tlen = READ_LE_UINT16(v) << 5; v += 2; - memcpy(_vcnExpTable, v, 32); + if (!(_flags.gameID == GI_EOB1 && (_configRenderMode == Common::kRenderEGA || _configRenderMode == Common::kRenderCGA))) + memcpy(_vcnColTable, v, 32); v += 32; delete[] _vcnBlocks; _vcnBlocks = new uint8[tlen]; @@ -301,7 +309,7 @@ const uint8 *EoBCoreEngine::getBlockFileData(int) { Common::SeekableReadStream *s = _res->createReadStream(_curBlockFile); _screen->loadFileDataToPage(s, 15, s->size()); delete s; - return _screen->getCPagePtr(14); + return _screen->getCPagePtr(15); } Common::String EoBCoreEngine::getBlockFileName(int levelIndex, int sub) { @@ -400,7 +408,7 @@ void EoBCoreEngine::assignWallsAndDecorations(int wallIndex, int vmpIndex, int d if (r->w == 0 || r->h == 0) error("Error trying to make decoration %d (x: %d, y: %d, w: %d, h: %d)", decIndex, r->x, r->y, r->w, r->h); - _levelDecorationShapes[t] = _screen->encodeShape(r->x, r->y, r->w, r->h); + _levelDecorationShapes[t] = _screen->encodeShape(r->x, r->y, r->w, r->h, false, (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[_currentLevel - 1]] : 0); } decIndex = _levelDecorationProperties[_mappedDecorationsCount++].next; diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 796db9a340..79884718d7 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -358,7 +358,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight memcpy(_vcnShift, v, tlen); v += tlen; - memcpy(_vcnExpTable, v, 128); + memcpy(_vcnColTable, v, 128); v += 128; if (_lastOverridePalFilePtr) { @@ -451,7 +451,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight for (int i = 0; i < 8; i++) { uint8 *pl = _screen->getLevelOverlay(7 - i); for (int ii = 0; ii < 16; ii++) - _vcnExpTable[(i << 4) + ii] = pl[(ii << 4) | ii]; + _vcnColTable[(i << 4) + ii] = pl[(ii << 4) | ii]; } } diff --git a/engines/kyra/scene_rpg.cpp b/engines/kyra/scene_rpg.cpp index 07a7a879b1..55d02d8da1 100644 --- a/engines/kyra/scene_rpg.cpp +++ b/engines/kyra/scene_rpg.cpp @@ -389,8 +389,8 @@ void KyraRpgEngine::drawVcnBlocks() { src += 3; for (int blockX = 0; blockX < 4; blockX++) { uint8 t = *src--; - *d++ = _vcnExpTable[((t & 0x0f) + wllVcnOffset) | shift]; - *d++ = _vcnExpTable[((t >> 4) + wllVcnOffset) | shift]; + *d++ = _vcnColTable[((t & 0x0f) + wllVcnOffset) | shift]; + *d++ = _vcnColTable[((t >> 4) + wllVcnOffset) | shift]; } src += 5; d += 168; @@ -399,8 +399,8 @@ void KyraRpgEngine::drawVcnBlocks() { for (int blockY = 0; blockY < 8; blockY++) { for (int blockX = 0; blockX < 4; blockX++) { uint8 t = *src++; - *d++ = _vcnExpTable[((t >> 4) + wllVcnOffset) | shift]; - *d++ = _vcnExpTable[((t & 0x0f) + wllVcnOffset) | shift]; + *d++ = _vcnColTable[((t >> 4) + wllVcnOffset) | shift]; + *d++ = _vcnColTable[((t & 0x0f) + wllVcnOffset) | shift]; } d += 168; } @@ -424,8 +424,8 @@ void KyraRpgEngine::drawVcnBlocks() { src += 3; for (int blockX = 0; blockX < 4; blockX++) { uint8 t = *src--; - uint8 h = _vcnExpTable[((t & 0x0f) + wllVcnRmdOffset) | shift]; - uint8 l = _vcnExpTable[((t >> 4) + wllVcnRmdOffset) | shift]; + uint8 h = _vcnColTable[((t & 0x0f) + wllVcnRmdOffset) | shift]; + uint8 l = _vcnColTable[((t >> 4) + wllVcnRmdOffset) | shift]; if (h) *d = h; d++; @@ -440,8 +440,8 @@ void KyraRpgEngine::drawVcnBlocks() { for (int blockY = 0; blockY < 8; blockY++) { for (int blockX = 0; blockX < 4; blockX++) { uint8 t = *src++; - uint8 h = _vcnExpTable[((t >> 4) + wllVcnRmdOffset) | shift]; - uint8 l = _vcnExpTable[((t & 0x0f) + wllVcnRmdOffset) | shift]; + uint8 h = _vcnColTable[((t >> 4) + wllVcnRmdOffset) | shift]; + uint8 l = _vcnColTable[((t & 0x0f) + wllVcnRmdOffset) | shift]; if (h) *d = h; d++; diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp index 6a76cfd0d5..ebf7835bfd 100644 --- a/engines/kyra/screen.cpp +++ b/engines/kyra/screen.cpp @@ -27,6 +27,7 @@ #include "common/endian.h" #include "common/memstream.h" #include "common/system.h" +#include "common/config-manager.h" #include "engines/util.h" @@ -49,6 +50,9 @@ Screen::Screen(KyraEngine_v1 *vm, OSystem *system, const ScreenDim *dimTable, co memset(_fonts, 0, sizeof(_fonts)); + _renderMode = Common::kRenderDefault; + _cgaDrawCharDitheringTable = 0; + _currentFont = FID_8_FNT; _paletteChanged = true; _curDim = 0; @@ -84,6 +88,10 @@ bool Screen::init() { _useSJIS = false; _use16ColorMode = _vm->gameFlags().use16ColorMode; _isAmiga = (_vm->gameFlags().platform == Common::kPlatformAmiga); + + if (ConfMan.hasKey("render_mode")) + _renderMode = Common::parseRenderMode(ConfMan.get("render_mode")); + memset(_fonts, 0, sizeof(_fonts)); if (_vm->gameFlags().useHiResOverlay) { @@ -110,15 +118,33 @@ bool Screen::init() { } _curPage = 0; - uint8 *pagePtr = new uint8[SCREEN_PAGE_SIZE * 8]; - for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) - _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = pagePtr + (pageNum >> 1) * SCREEN_PAGE_SIZE; - memset(pagePtr, 0, SCREEN_PAGE_SIZE * 8); + + int numPages = SCREEN_PAGE_NUM / 2; + // CGA and EGA modes use additional pages to do the CGA/EGA specific graphics conversions. + if (_renderMode == Common::kRenderEGA || _renderMode == Common::kRenderCGA) + numPages += 4; + + uint8 *pagePtr = new uint8[numPages * SCREEN_PAGE_SIZE]; + memset(pagePtr, 0, numPages * SCREEN_PAGE_SIZE); + + if (_renderMode == Common::kRenderEGA || _renderMode == Common::kRenderCGA) { + // Unlike VGA mode the odd and even page numbers do not always point to the same buffers. + // Instead, the odd pages are used for CGA/EGA specific graphics conversions. + int pageNum = 0; + for (; pageNum < 8; pageNum++) + _pagePtrs[pageNum] = pagePtr + pageNum * SCREEN_PAGE_SIZE; + for (; pageNum < SCREEN_PAGE_NUM; pageNum += 2) + _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = pagePtr + (pageNum / 2) * SCREEN_PAGE_SIZE; + } else { + for (int pageNum = 0; pageNum < SCREEN_PAGE_NUM; pageNum += 2) + _pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = pagePtr + (pageNum / 2) * SCREEN_PAGE_SIZE; + } memset(_shapePages, 0, sizeof(_shapePages)); const int paletteCount = _isAmiga ? 13 : 4; - const int numColors = _use16ColorMode ? 16 : (_isAmiga ? 32 : 256); + // 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)); _interfacePaletteEnabled = false; @@ -131,6 +157,13 @@ bool Screen::init() { assert(_palettes[i]); } + // Setup CGA colors (if CGA mode is selected) + if (_renderMode == Common::kRenderCGA) { + Palette pal(4); + pal.setCGAPalette(1, Palette::kIntensityHigh); + Screen::setScreenPalette(pal); + } + _internFadePalette = new Palette(numColors); assert(_internFadePalette); @@ -618,8 +651,14 @@ void Screen::fadeToBlack(int delay, const UpdateFunctor *upFunc) { } void Screen::fadePalette(const Palette &pal, int delay, const UpdateFunctor *upFunc) { + if (_renderMode == Common::kRenderEGA) + setScreenPalette(pal); + updateScreen(); + if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderEGA) + return; + int diff = 0, delayInc = 0; getFadeParams(pal, delay, delayInc, diff); @@ -1126,7 +1165,7 @@ bool Screen::loadFont(FontId fontId, const char *filename) { fnt = new AMIGAFont(); #ifdef ENABLE_EOB else if (_vm->game() == GI_EOB1 || _vm->game() == GI_EOB2) - fnt = new OldDOSFont(); + fnt = new OldDOSFont(_renderMode, _cgaDrawCharDitheringTable); #endif // ENABLE_EOB else fnt = new DOSFont(); @@ -3013,6 +3052,9 @@ void Screen::loadBitmap(const char *filename, int tempPage, int dstPage, Palette } bool Screen::loadPalette(const char *filename, Palette &pal) { + if (_renderMode == Common::kRenderCGA) + return true; + Common::SeekableReadStream *stream = _vm->resource()->createReadStream(filename); if (!stream) @@ -3029,6 +3071,17 @@ bool Screen::loadPalette(const char *filename, Palette &pal) { } else if (_vm->gameFlags().platform == Common::kPlatformPC98 && _use16ColorMode) { numCols = stream->size() / Palette::kPC98BytesPerColor; pal.loadPC98Palette(*stream, 0, MIN(maxCols, numCols)); + } 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) { + numCols = 16; + pal.loadEGAPalette(*stream, 0, 16); + } else { + numCols = stream->size() / Palette::kVGABytesPerColor; + pal.loadVGAPalette(*stream, 0, numCols); + } + } else { numCols = stream->size() / Palette::kVGABytesPerColor; pal.loadVGAPalette(*stream, 0, MIN(maxCols, numCols)); @@ -3076,7 +3129,14 @@ void Screen::loadPalette(const byte *data, Palette &pal, int bytes) { pal.loadAmigaPalette(stream, 0, stream.size() / Palette::kAmigaBytesPerColor); else if (_vm->gameFlags().platform == Common::kPlatformPC98 && _use16ColorMode) pal.loadPC98Palette(stream, 0, stream.size() / Palette::kPC98BytesPerColor); - else + 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) + pal.loadEGAPalette(stream, 0, stream.size()); + else + pal.loadVGAPalette(stream, 0, stream.size() / Palette::kVGABytesPerColor); + } else pal.loadVGAPalette(stream, 0, stream.size() / Palette::kVGABytesPerColor); } @@ -3553,6 +3613,24 @@ void Palette::loadVGAPalette(Common::ReadStream &stream, int startIndex, int col *pos++ = stream.readByte() & 0x3f; } +void Palette::loadEGAPalette(Common::ReadStream &stream, int startIndex, int colors) { + assert(startIndex + colors <= 16); + + uint8 *dst = _palData + startIndex * 3; + for (int i = 0; i < colors; i++) { + uint8 index = stream.readByte(); + assert(index < _egaNumColors); + memcpy(dst, &_egaColors[index * 3], 3); + dst += 3; + } +} + +void Palette::setCGAPalette(int palIndex, CGAIntensity intensity) { + assert(_numColors == _cgaNumColors); + assert(!(palIndex & ~1)); + memcpy(_palData, _cgaColors[palIndex * 2 + intensity], _numColors * 3); +} + void Palette::loadAmigaPalette(Common::ReadStream &stream, int startIndex, int colors) { assert(startIndex + colors <= _numColors); @@ -3629,4 +3707,22 @@ uint8 *Palette::fetchRealPalette() const { return buffer; } +const uint8 Palette::_egaColors[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x00, 0xAA, 0xAA, + 0xAA, 0x00, 0x00, 0xAA, 0x00, 0xAA, 0xAA, 0x55, 0x00, 0xAA, 0xAA, 0xAA, + 0x55, 0x55, 0x55, 0x55, 0x55, 0xFF, 0x55, 0xFF, 0x55, 0x55, 0xFF, 0xFF, + 0xFF, 0x55, 0x55, 0xFF, 0x55, 0xFF, 0xFF, 0xFF, 0x55, 0xFF, 0xFF, 0xFF +}; + +const int Palette::_egaNumColors = ARRAYSIZE(_egaColors) / 3; + +const uint8 Palette::_cgaColors[4][12] = { + { 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x15, 0x00 }, + { 0x00, 0x00, 0x00, 0x15, 0x3F, 0x15, 0x3F, 0x15, 0x15, 0x3F, 0x3F, 0x15 }, + { 0x00, 0x00, 0x00, 0x00, 0x2A, 0x2A, 0x2A, 0x00, 0x2A, 0x2A, 0x2A, 0x2A }, + { 0x00, 0x00, 0x00, 0x15, 0x3F, 0x3F, 0x3F, 0x15, 0x3F, 0x3F, 0x3F, 0x3F } +}; + +const int Palette::_cgaNumColors = ARRAYSIZE(_cgaColors[0]) / 3; + } // End of namespace Kyra diff --git a/engines/kyra/screen.h b/engines/kyra/screen.h index 62ea35af9e..fcb5ef2be4 100644 --- a/engines/kyra/screen.h +++ b/engines/kyra/screen.h @@ -145,8 +145,8 @@ private: */ class OldDOSFont : public Font { public: - OldDOSFont(); - ~OldDOSFont() { unload(); } + OldDOSFont(Common::RenderMode mode, const uint16 *cgaDitheringTable); + ~OldDOSFont(); bool load(Common::SeekableReadStream &file); int getHeight() const { return _height; } @@ -165,6 +165,9 @@ private: const uint8 *_colorMap; int _numGlyphs; + + Common::RenderMode _renderMode; + const uint16 *_cgaDitheringTable; }; #endif // ENABLE_EOB @@ -252,6 +255,21 @@ public: void loadVGAPalette(Common::ReadStream &stream, int startIndex, int colors); /** + * Load a EGA palette from the given stream. + */ + void loadEGAPalette(Common::ReadStream &stream, int startIndex, int colors); + + /** + * Set default CGA palette. We only need the cyan/magenta/grey mode. + */ + enum CGAIntensity { + kIntensityLow = 0, + kIntensityHigh = 1 + }; + + void setCGAPalette(int palIndex, CGAIntensity intensity); + + /** * Load a AMIGA palette from the given stream. */ void loadAmigaPalette(Common::ReadStream &stream, int startIndex, int colors); @@ -325,9 +343,15 @@ public: */ uint8 *getData() { return _palData; } const uint8 *getData() const { return _palData; } + private: uint8 *_palData; const int _numColors; + + static const uint8 _egaColors[]; + static const int _egaNumColors; + static const uint8 _cgaColors[4][12]; + static const int _cgaNumColors; }; class Screen { @@ -480,9 +504,9 @@ public: // misc void loadBitmap(const char *filename, int tempPage, int dstPage, Palette *pal, bool skip=false); - bool loadPalette(const char *filename, Palette &pal); + virtual bool loadPalette(const char *filename, Palette &pal); bool loadPaletteTable(const char *filename, int firstPalette); - void loadPalette(const byte *data, Palette &pal, int bytes); + virtual void loadPalette(const byte *data, Palette &pal, int bytes); void setAnimBlockPtr(int size); @@ -550,6 +574,8 @@ protected: bool _useSJIS; bool _use16ColorMode; bool _isAmiga; + Common::RenderMode _renderMode; + uint16 *_cgaDrawCharDitheringTable; uint8 _sjisInvisibleColor; diff --git a/engines/kyra/screen_eob.cpp b/engines/kyra/screen_eob.cpp index 6b1128bdfd..aa94114dfc 100644 --- a/engines/kyra/screen_eob.cpp +++ b/engines/kyra/screen_eob.cpp @@ -33,6 +33,7 @@ #include "common/system.h" #include "graphics/cursorman.h" +#include "graphics/palette.h" namespace Kyra { @@ -49,29 +50,66 @@ Screen_EoB::Screen_EoB(EoBCoreEngine *vm, OSystem *system) : Screen(vm, system, _dsRem = 0; _dsScaleTmp = 0; _gfxMaxY = 0; + _egaColorMap = 0; + _egaPixelValueTable = 0; + _cgaMappingDefault = 0; + _cgaDitheringTables[0] = _cgaDitheringTables[1] = 0; + _useHiResEGADithering = false; } Screen_EoB::~Screen_EoB() { delete[] _fadeData; delete[] _dsTempPage; + delete[] _egaColorMap; + delete[] _egaPixelValueTable; + delete[] _cgaDitheringTables[0]; + delete[] _cgaDitheringTables[1]; + delete[] _cgaDrawCharDitheringTable; } bool Screen_EoB::init() { if (Screen::init()) { int temp; _gfxMaxY = _vm->staticres()->loadRawData(kEoBBaseExpObjectY, temp); - _fadeData = _vm->resource()->fileData("FADING.DAT", 0); + + if (_renderMode != Common::kRenderCGA && _renderMode != Common::kRenderEGA) + _fadeData = _vm->resource()->fileData("FADING.DAT", 0); if (!_fadeData) { _fadeData = new uint8[0x700]; memset(_fadeData, 0, 0x700); - uint8 *pal = _vm->resource()->fileData("palette1.pal", 0); // EGA: palette0.pal - for (int i = 0; i < 7; i++) - createFadeTable(pal, &_fadeData[i << 8], 18, (i + 1) * 36); - delete[] pal; + if (_renderMode != Common::kRenderCGA && _renderMode != Common::kRenderEGA) { + uint8 *pal = _vm->resource()->fileData("PALETTE1.PAL", 0); + for (int i = 0; i < 7; i++) + createFadeTable(pal, &_fadeData[i << 8], 18, (i + 1) * 36); + delete[] pal; + } } _dsTempPage = new uint8[6000]; + if (_renderMode == Common::kRenderEGA) { + _egaColorMap = new uint8[256]; + _egaPixelValueTable = new uint8[256]; + for (int i = 0; i < 256; i++) { + _egaColorMap[i] = i & 0x0f; + _egaPixelValueTable[i] = i & 0x0f; + } + + if (_vm->game() == GI_EOB2) + _useHiResEGADithering = true; + } else if (_renderMode == Common::kRenderCGA) { + _cgaMappingDefault = _vm->staticres()->loadRawData(kEoB1CgaMappingDefault, temp); + _cgaDitheringTables[0] = new uint16[256]; + memset(_cgaDitheringTables[0], 0, 256 * sizeof(uint16)); + _cgaDitheringTables[1] = new uint16[256]; + memset(_cgaDitheringTables[1], 0, 256 * sizeof(uint16)); + _cgaDrawCharDitheringTable = new uint16[256]; + memset(_cgaDrawCharDitheringTable, 0, 256 * sizeof(uint16)); + + static const uint bits[] = { 0, 3, 12, 15 }; + for (int i = 0; i < 256; i++) + WRITE_BE_UINT16(&_cgaDrawCharDitheringTable[i], (bits[i & 3] << 8) | (bits[(i >> 2) & 3] << 12) | (bits[(i >> 4) & 3] << 0) | (bits[(i >> 6) & 3] << 4)); + } return true; } @@ -121,12 +159,13 @@ void Screen_EoB::printShadedText(const char *string, int x, int y, int col1, int } void Screen_EoB::loadShapeSetBitmap(const char *file, int tempPage, int destPage) { - loadEoBBitmap(file, 0, tempPage, destPage, -1); + loadEoBBitmap(file, _cgaMappingDefault, tempPage, destPage, -1); _curPage = 2; } -void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *ditheringData, int tempPage, int destPage, int copyToPage) { - Common::String tmp = Common::String::format("%s.CPS", file); +void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int tempPage, int destPage, int convertToPage) { + const char *filePattern = (_vm->game() == GI_EOB1 && (_renderMode == Common::kRenderEGA || _renderMode == Common::kRenderCGA)) ? "%s.EGA" : "%s.CPS"; + Common::String tmp = Common::String::format(filePattern, file); Common::SeekableReadStream *s = _vm->resource()->createReadStream(tmp); bool loadAlternative = false; if (s) { @@ -149,28 +188,124 @@ void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *ditheringData, int tmp.setChar('X', 0); s = _vm->resource()->createReadStream(tmp); if (!s) - error("Screen_EoB::loadEoBBitmap(): CPS file loading failed."); + error("Screen_EoB::loadEoBBitmap(): Failed to load file '%s'", file); s->seek(768); loadFileDataToPage(s, destPage, 64000); delete s; } } - if (copyToPage == -1) { + if (convertToPage == -1) { return; - } else if (copyToPage == 0) { - copyPage(destPage, 2); + } else if (convertToPage == 2 && _renderMode == Common::kRenderCGA) { + convertPage(destPage, 4, cgaMapping); + copyRegion(0, 0, 0, 0, 320, 200, 4, 2, Screen::CR_NO_P_CHECK); + } else if (convertToPage == 0) { + convertPage(destPage, 2, cgaMapping); copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK); } else { - copyPage(destPage, copyToPage); + convertPage(destPage, convertToPage, cgaMapping); + } +} + +void Screen_EoB::convertPage(int srcPage, int dstPage, const uint8 *cgaMapping) { + uint8 *src = getPagePtr(srcPage); + uint8 *dst = getPagePtr(dstPage); + if (src == dst) + return; + + if (_renderMode == Common::kRenderCGA) { + generateCGADitheringTables(cgaMapping); + uint16 *d = (uint16*)dst; + uint8 tblSwitch = 0; + for (int height = SCREEN_H; height; height--) { + const uint16 *table = _cgaDitheringTables[(tblSwitch++) & 1]; + for (int width = SCREEN_W / 2; width; width--) { + *d++ = table[((src[0] & 0x0f) << 4) | (src[1] & 0x0f)]; + src += 2; + } + } + + if (dstPage == 0 || dstPage == 1) + _forceFullUpdate = true; + + } else if (_renderMode == Common::kRenderEGA) { + uint32 len = SCREEN_W * SCREEN_H; + if (_useHiResEGADithering) { + while (len--) { + uint8 col = _egaColorMap[*src++] & 0x0f; + *dst++ = col; + + /*for (int i = 4; i; i--) { + uint8 col = _egaColorMap[*src++]; + + }*/ + } + } else { + while (len--) + *dst++ = *src++ & 0x0f; + } + + if (dstPage == 0 || dstPage == 1) + _forceFullUpdate = true; + } else { + copyPage(srcPage, dstPage); + } +} + +void Screen_EoB::setScreenPalette(const Palette &pal) { + if (_renderMode == Common::kRenderEGA && _egaColorMap && pal.getNumColors() != 16) { + const uint8 *src = pal.getData(); + uint8 *dst = _egaColorMap; + + for (int i = 256; i; i--) { + uint8 r = *src++; + uint8 g = *src++; + uint8 b = *src++; + + uint8 col = 0; + uint16 min = 11907; + + for (int ii = 256; ii; ii--) { + const uint8 *palEntry = _egaMatchTable + (ii - 1) * 3; + if (*palEntry == 0xff) + continue; + + int e_r = palEntry[0]; + e_r -= r; + int e_g = palEntry[1]; + e_g -= g; + int e_b = palEntry[2]; + e_b -= b; + + int s = (e_r * e_r) + (e_g * e_g) + (e_b * e_b); + + if (s < min) { + min = s; + col = ii - 1; + } + } + *dst++ = col; + } + + memset(_egaPixelValueTable, 0, 256); + for (int i = 0; i < 256; i++) + _egaPixelValueTable[_egaColorMap[i]] = i; + + } else if (_renderMode == Common::kRenderEGA) { + _screenPalette->copy(pal); + _system->getPaletteManager()->setPalette(_screenPalette->getData(), 0, _screenPalette->getNumColors()); + + } else if (_renderMode != Common::kRenderCGA) { + Screen::setScreenPalette(pal); } } -uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool no4bitEncoding) { +uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool no4bitEncoding, const uint8 *cgaMapping) { uint8 *shp = 0; uint16 shapesize = 0; - uint8 *srcPage = getPagePtr(_curPage) + y * 320 + (x << 3); + uint8 *srcPage = getPagePtr(_curPage | 1) + y * 320 + (x << 3); uint8 *src = srcPage; if (no4bitEncoding) { @@ -206,7 +341,7 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool no4b *dst++ = (w & 0xff); *dst++ = (h & 0xff); - srcPage = getPagePtr(_curPage) + y * 320 + (x << 3); + srcPage = getPagePtr(_curPage | 1) + y * 320 + (x << 3); src = srcPage; h1 = h; @@ -255,7 +390,7 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool no4b uint8 *pal = dst; dst += 0x10; - srcPage = getPagePtr(_curPage) + y * 320 + (x << 3); + srcPage = getPagePtr(_curPage | 1) + y * 320 + (x << 3); src = srcPage; nib = col = 0; @@ -1096,12 +1231,74 @@ bool Screen_EoB::posWithinRect(int posX, int posY, int x1, int y1, int x2, int y return true; } -OldDOSFont::OldDOSFont() { +void Screen_EoB::generateCGADitheringTables(const uint8 *mappingData) { + for (int i = 0; i < 256; i++) { + WRITE_BE_UINT16(&_cgaDitheringTables[0][i], (mappingData[i >> 4] << 8) | mappingData[(i & 0x0f) + 16]); + WRITE_BE_UINT16(&_cgaDitheringTables[1][i], (mappingData[(i >> 4) + 16] << 8) | mappingData[i & 0x0f]); + } +} + +const uint8 Screen_EoB::_egaMatchTable[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x1E, 0x1E, 0x00, 0x00, 0x1E, + 0x00, 0x1E, 0x1E, 0x0F, 0x00, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x2D, 0x0F, 0x2D, + 0x0F, 0x0F, 0x2D, 0x2D, 0x2D, 0x0F, 0x0F, 0x2D, 0x0F, 0x2D, 0x2D, 0x2D, 0x0F, 0x2D, 0x2D, 0x2D, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x2A, 0x00, 0x1E, 0x1E, 0x00, 0x1E, 0x2A, 0x1E, 0x00, 0x1E, 0x1E, + 0x00, 0x2A, 0x1E, 0x0F, 0x1E, 0x1E, 0x1E, 0x2A, 0x0F, 0x0F, 0x21, 0x0F, 0x0F, 0x36, 0x0F, 0x2D, + 0x21, 0x0F, 0x2D, 0x36, 0x2D, 0x0F, 0x21, 0x2D, 0x0F, 0x36, 0x2D, 0x2D, 0x21, 0x2D, 0x2D, 0x36, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x1E, 0x1E, 0x1E, 0x00, 0x1E, + 0x1E, 0x1E, 0x1E, 0x21, 0x00, 0x1E, 0x2A, 0x1E, 0x0F, 0x21, 0x0F, 0x0F, 0x21, 0x2D, 0x0F, 0x36, + 0x0F, 0x0F, 0x36, 0x2D, 0x2D, 0x21, 0x0F, 0x2D, 0x21, 0x2D, 0x2D, 0x36, 0x0F, 0x2D, 0x36, 0x2D, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x2A, 0x2A, 0x1E, 0x1E, 0x1E, 0x1E, + 0x1E, 0x2A, 0x1E, 0x21, 0x1E, 0x1E, 0x2A, 0x2A, 0x0F, 0x21, 0x21, 0x0F, 0x21, 0x36, 0x0F, 0x36, + 0x21, 0x0F, 0x36, 0x36, 0x2D, 0x21, 0x21, 0x2D, 0x21, 0x36, 0x2D, 0x36, 0x21, 0x2D, 0x36, 0x36, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2A, 0x00, 0x00, 0x2A, + 0x00, 0x1E, 0x2A, 0x0F, 0x00, 0x2A, 0x1E, 0x1E, 0x21, 0x0F, 0x0F, 0x21, 0x0F, 0x2D, 0x21, 0x2D, + 0x0F, 0x21, 0x2D, 0x2D, 0x36, 0x0F, 0x0F, 0x36, 0x0F, 0x2D, 0x36, 0x2D, 0x0F, 0x36, 0x2D, 0x2D, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2A, + 0x00, 0x2A, 0x2A, 0x0F, 0x1E, 0x2A, 0x1E, 0x2A, 0x21, 0x0F, 0x21, 0x21, 0x0F, 0x36, 0x21, 0x2D, + 0x21, 0x21, 0x2D, 0x36, 0x36, 0x0F, 0x21, 0x36, 0x0F, 0x36, 0x36, 0x2D, 0x21, 0x36, 0x2D, 0x36, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x2A, 0x15, 0x00, 0x2A, 0x21, 0x1E, 0x21, 0x15, 0x0F, 0x21, 0x15, 0x2D, 0x21, 0x2F, + 0x0F, 0x21, 0x2F, 0x2D, 0x36, 0x15, 0x0F, 0x36, 0x15, 0x2D, 0x36, 0x2F, 0x0F, 0x36, 0x2F, 0x2D, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2A, 0x2A, 0x2A, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x36, + 0x21, 0x21, 0x36, 0x36, 0x36, 0x21, 0x21, 0x36, 0x21, 0x36, 0x36, 0x36, 0x21, 0x36, 0x36, 0x36, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0x15, 0x15, 0x15, 0x15, 0x2F, 0x15, 0x2F, + 0x15, 0x15, 0x2F, 0x2F, 0x2F, 0x15, 0x15, 0x2F, 0x15, 0x2F, 0x2F, 0x2F, 0x15, 0x2F, 0x2F, 0x2F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0x15, 0x3F, 0x15, 0x2F, + 0x2F, 0x15, 0x2F, 0x3F, 0x2F, 0x15, 0x2F, 0x2F, 0x15, 0x3F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0x3F, + 0x15, 0x15, 0x3F, 0x2F, 0x2F, 0x2F, 0x15, 0x2F, 0x2F, 0x2F, 0x2F, 0x3F, 0x15, 0x2F, 0x3F, 0x2F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x15, 0x3F, 0x3F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x3F, 0x2F, 0x3F, 0x2F, 0x2F, 0x3F, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x15, 0x15, 0x3F, 0x15, 0x2F, 0x3F, 0x2F, 0x15, 0x3F, 0x2F, 0x2F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x15, 0x3F, 0x3F, 0x2F, 0x2F, 0x3F, 0x2F, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x15, 0x3F, 0x3F, 0x2F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F +}; + +OldDOSFont::OldDOSFont(Common::RenderMode mode, const uint16 *cgaDitheringTable) : _renderMode(mode), _cgaDitheringTable(cgaDitheringTable) { _data = 0; _width = _height = _numGlyphs = 0; _bitmapOffsets = 0; } +OldDOSFont::~OldDOSFont() { + unload(); +} + bool OldDOSFont::load(Common::SeekableReadStream &file) { unload(); @@ -1192,36 +1389,87 @@ void OldDOSFont::drawChar(uint16 c, byte *dst, int pitch) const { uint8 color1 = _colorMap[1]; uint8 color2 = _colorMap[0]; + static const uint16 cgaColorMask[] = { 0, 0x5555, 0xAAAA, 0xFFFF }; + uint16 cgaMask1 = cgaColorMask[color1 & 3]; + uint16 cgaMask2 = cgaColorMask[color2 & 3]; + int cH = _height; while (cH--) { int cW = w; + uint8 last = 0; const uint8 *mtbl = _width == 8 ? renderMaskTable8 : renderMaskTable6; - for (bool runWidthLoop = true; runWidthLoop;) { + if (_renderMode == Common::kRenderCGA) { uint8 s = *src++; uint8 m = *mtbl++; - for (uint8 i = 0x80; i; i >>= 1) { - if (!(m & i)) { - runWidthLoop = false; - break; - } + uint8 in = s | last; + uint16 cmp1 = 0; + uint16 cmp2 = 0; + + if (color1) { + in &= m; + cmp1 = _cgaDitheringTable[in]; + } - if (s & i) { - if (color1) - *dst = color1; - } else if (color2) { - *dst = color2; - } - dst++; + if (color2) { + in = ~in & m; + cmp2 = _cgaDitheringTable[in]; } - if (cW) - cW--; - else - runWidthLoop = false; - } + uint16 cDst = 0; + uint8 sh = 14; + for (int i = 0; i < _width; i++) { + cDst |= ((dst[i] & 3) << sh); + sh -= 2; + } + uint16 out = (~(cmp1 | cmp2) & cDst) | (cmp1 & cgaMask1) | (cmp2 & cgaMask2); + + sh = 14; + for (int i = 0; i < _width; i++) { + *dst++ = (out >> sh) & 3; + sh -= 2; + } + + last = s; + } else { + for (bool runWidthLoop = true; runWidthLoop;) { + uint8 s = *src++; + uint8 m = *mtbl++; + + for (uint8 i = 0x80; i; i >>= 1) { + if (!(m & i)) { + runWidthLoop = false; + break; + } + + if (_renderMode == Common::kRenderCGA) { + uint8 in = s | last; + if (s & i) { + if (color1) + *dst = color1; + } else if (color2) { + *dst = color2; + } + last = s; + } else { + if (s & i) { + if (color1) + *dst = color1; + } else if (color2) { + *dst = color2; + } + } + dst++; + } + + if (cW) + cW--; + else + runWidthLoop = false; + } + } dst += pitch; } } diff --git a/engines/kyra/screen_eob.h b/engines/kyra/screen_eob.h index 7040177266..1b55806b8b 100644 --- a/engines/kyra/screen_eob.h +++ b/engines/kyra/screen_eob.h @@ -45,10 +45,14 @@ public: void loadFileDataToPage(Common::SeekableReadStream *s, int pageNum, uint32 size); void printShadedText(const char *string, int x, int y, int col1, int col2); - void loadEoBBitmap(const char *file, const uint8 *ditheringData, int tempPage, int destPage, int copyToPage); + void loadEoBBitmap(const char *file, const uint8 *cgaMapping, int tempPage, int destPage, int convertToPage); void loadShapeSetBitmap(const char *file, int tempPage, int destPage); - uint8 *encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool no4bitEncoding = false); + void convertPage(int srcPage, int dstPage, const uint8 *cgaMapping); + + void setScreenPalette(const Palette &pal); + + uint8 *encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool no4bitEncoding = false, const uint8 *cgaMapping = 0); void drawShape(uint8 pageNum, const uint8 *shapeData, int x, int y, int sd = -1, int flags = 0, ...); const uint8 *scaleShape(const uint8 *shapeData, int blockDistance); const uint8 *scaleShapeStep(const uint8 *shp); @@ -77,6 +81,8 @@ private: void scaleShapeProcessLine(uint8 *&dst, const uint8 *&src); bool posWithinRect(int posX, int posY, int x1, int y1, int x2, int y2); + void generateCGADitheringTables(const uint8 *mappingData); + int _dsDiv, _dsRem, _dsScaleTmp; int16 _gfxX, _gfxY; uint8 _gfxCol; @@ -90,6 +96,14 @@ private: uint8 *_dsTempPage; + uint16 *_cgaDitheringTables[2]; + const uint8 *_cgaMappingDefault; + + uint8 *_egaColorMap; + uint8 *_egaPixelValueTable; + bool _useHiResEGADithering; + + static const uint8 _egaMatchTable[]; static const ScreenDim _screenDimTable[]; static const int _screenDimTableCount; }; diff --git a/engines/kyra/sequences_darkmoon.cpp b/engines/kyra/sequences_darkmoon.cpp index f0d4a01486..d4f5c847fd 100644 --- a/engines/kyra/sequences_darkmoon.cpp +++ b/engines/kyra/sequences_darkmoon.cpp @@ -41,11 +41,22 @@ public: kFinale }; - DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, Mode mode, const char *const *strings, const char *const *cpsFiles, const char *const *palFiles, const EoBShapeDef **shapeDefList, const EoBSequenceStep **seqList); + struct Config { + Config(Mode m, const char *const *str, const char *const *cps, const char *const *pal, const DarkMoonShapeDef **shp, const DarkMoonAnimCommand **anim, bool paletteFading) : mode(m), strings(str), cpsFiles(cps), palFiles(pal), shapeDefs(shp), animData(anim), palFading(paletteFading) {} + Mode mode; + const char *const *strings; + const char *const *cpsFiles; + const char *const *palFiles; + const DarkMoonShapeDef **shapeDefs; + const DarkMoonAnimCommand **animData; + bool palFading; + }; + + DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, const Config *config); ~DarkmoonSequenceHelper(); void loadScene(int index, int pageNum); - void runSequence(int index, int del = -1); + void animCommand(int index, int del = -1); void printText(int index, int color); void fadeText(); @@ -68,13 +79,7 @@ private: OSystem *_system; DarkMoonEngine *_vm; Screen_EoB *_screen; - Mode _mode; - - const char *const *_strings; - const char *const *_cpsFiles; - const char *const *_palFiles; - const EoBShapeDef **_shapeDefs; - const EoBSequenceStep **_seqData; + const Config *_config; Palette *_palettes[12]; @@ -103,10 +108,14 @@ int DarkMoonEngine::mainMenu() { _screen->loadFileDataToPage(s, 3, 64000); delete s; } else { - _screen->loadBitmap("MENU.CPS", 3, 2, &_screen->getPalette(0)); + _screen->loadBitmap("MENU.CPS", 3, 3, &_screen->getPalette(0)); } + if (_configRenderMode == Common::kRenderEGA) + _screen->loadPalette("MENU.EGA", _screen->getPalette(0)); + _screen->setScreenPalette(_screen->getPalette(0)); + _screen->convertPage(3, 2, 0); of = _screen->setFont(Screen::FID_6_FNT); op = _screen->setCurPage(2); @@ -167,7 +176,8 @@ int DarkMoonEngine::mainMenuLoop() { } void DarkMoonEngine::seq_playIntro() { - DarkmoonSequenceHelper sq(_system, this, _screen, DarkmoonSequenceHelper::kIntro, _introStrings, _cpsFilesIntro, _palFilesIntro, _shapesIntro, _seqIntro); + DarkmoonSequenceHelper::Config config(DarkmoonSequenceHelper::kIntro, _introStrings, _cpsFilesIntro, _configRenderMode == Common::kRenderEGA ? _palFilesIntroEGA : _palFilesIntroVGA, _shapesIntro, _animIntro, false); + DarkmoonSequenceHelper sq(_system, this, _screen, &config); _screen->setCurPage(0); _screen->clearCurPage(); @@ -192,24 +202,24 @@ void DarkMoonEngine::seq_playIntro() { removeInputTop(); sq.delay(18); - sq.runSequence(3, 18); - sq.runSequence(6, 18); - sq.runSequence(0); + sq.animCommand(3, 18); + sq.animCommand(6, 18); + sq.animCommand(0); sq.waitForSongNotifier(1); - sq.runSequence(11); - sq.runSequence(7, 6); - sq.runSequence(2, 6); + sq.animCommand(_configRenderMode == Common::kRenderEGA ? 12 : 11); + sq.animCommand(7, 6); + sq.animCommand(2, 6); sq.waitForSongNotifier(2); - sq.runSequence(38); - sq.runSequence(3); - sq.runSequence(8); - sq.runSequence(1, 10); - sq.runSequence(0, 6); - sq.runSequence(2); + sq.animCommand(_configRenderMode == Common::kRenderEGA ? 39 : 38); + sq.animCommand(3); + sq.animCommand(8); + sq.animCommand(1, 10); + sq.animCommand(0, 6); + sq.animCommand(2); sq.waitForSongNotifier(3); @@ -218,22 +228,22 @@ void DarkMoonEngine::seq_playIntro() { _screen->setClearScreenDim(17); _screen->setCurPage(0); - sq.runSequence(40); - sq.runSequence(7, 18); + sq.animCommand(_configRenderMode == Common::kRenderEGA ? 41 : 40); + sq.animCommand(7, 18); sq.printText(0, 16); // You were settling... - sq.runSequence(7, 90); + sq.animCommand(7, 90); sq.fadeText(); sq.printText(1, 16); // Then a note was slipped to you - sq.runSequence(8); - sq.runSequence(2, 72); + sq.animCommand(8); + sq.animCommand(2, 72); sq.fadeText(); sq.printText(2, 16); // It was from your friend Khelben Blackstaff... - sq.runSequence(2); - sq.runSequence(6, 36); - sq.runSequence(3); + sq.animCommand(2); + sq.animCommand(6, 36); + sq.animCommand(3); sq.fadeText(); sq.printText(3, 16); // The message was urgent. @@ -243,19 +253,33 @@ void DarkMoonEngine::seq_playIntro() { // intro scroll if (!skipFlag() && !shouldQuit()) { - for (int i = 0; i < 280; i += 3) { - uint32 endtime = _system->getMillis() + _tickLength; - _screen->copyRegion(11, 8, 8, 8, 301, 128, 0, 0, Screen::CR_NO_P_CHECK); - _screen->copyRegion(i, 0, 309, 8, 3, 128, 2, 0, Screen::CR_NO_P_CHECK); - _screen->updateScreen(); - if (i == 96) - sq.runSequence(42); - delayUntil(endtime); + if (_configRenderMode == Common::kRenderEGA) { + for (int i = 0; i < 35; i++) { + uint32 endtime = _system->getMillis() + 2 * _tickLength; + _screen->copyRegion(16, 8, 8, 8, 296, 128, 0, 0, Screen::CR_NO_P_CHECK); + _screen->copyRegion(i << 3, 0, 304, 8, 8, 128, 2, 0, Screen::CR_NO_P_CHECK); + _screen->updateScreen(); + if (i == 12) + sq.animCommand(42); + else if (i == 25) + snd_playSoundEffect(11); + delayUntil(endtime); + } + } else { + for (int i = 0; i < 280; i += 3) { + uint32 endtime = _system->getMillis() + _tickLength; + _screen->copyRegion(11, 8, 8, 8, 301, 128, 0, 0, Screen::CR_NO_P_CHECK); + _screen->copyRegion(i, 0, 309, 8, 3, 128, 2, 0, Screen::CR_NO_P_CHECK); + _screen->updateScreen(); + if (i == 96) + sq.animCommand(42); + delayUntil(endtime); + } } } _screen->copyRegion(8, 8, 0, 0, 304, 128, 0, 2, Screen::CR_NO_P_CHECK); - sq.runSequence(4); + sq.animCommand(4); sq.fadeText(); sq.delay(10); @@ -268,22 +292,22 @@ void DarkMoonEngine::seq_playIntro() { sq.loadScene(3, 2); sq.delay(54); - sq.runSequence(13); + sq.animCommand(13); _screen->copyRegion(104, 16, 96, 8, 120, 100, 0, 2, Screen::CR_NO_P_CHECK); sq.fadeText(); sq.printText(5, 15); // Welcome, please come in - sq.runSequence(10); - sq.runSequence(10); - sq.runSequence(9); - sq.runSequence(9); + sq.animCommand(10); + sq.animCommand(10); + sq.animCommand(9); + sq.animCommand(9); sq.fadeText(); sq.printText(6, 15); // Khelben awaits you in his study for (int i = 0; i < 3; i++) - sq.runSequence(10); - sq.runSequence(9); - sq.runSequence(14); + sq.animCommand(10); + sq.animCommand(9); + sq.animCommand(14); sq.loadScene(5, 2); sq.waitForSongNotifier(5); @@ -293,45 +317,50 @@ void DarkMoonEngine::seq_playIntro() { _screen->updateScreen(); for (int i = 0; i < 6; i++) - sq.runSequence(15); + sq.animCommand(15); + + if (_configRenderMode == Common::kRenderEGA && !skipFlag() && !shouldQuit()) { + _screen->loadPalette("INTRO.EGA", _screen->getPalette(0)); + _screen->setScreenPalette(_screen->getPalette(0)); + } sq.loadScene(6, 2); sq.loadScene(7, 2); _screen->clearCurPage(); sq.update(2); - sq.runSequence(16); + sq.animCommand(16); sq.printText(7, 15); // Thank you for coming so quickly - sq.runSequence(16); - sq.runSequence(17); + sq.animCommand(16); + sq.animCommand(17); for (int i = 0; i < 3; i++) - sq.runSequence(16); + sq.animCommand(16); sq.fadeText(); - sq.runSequence(16); + sq.animCommand(16); sq.loadScene(8, 2); sq.update(2); - sq.runSequence(32); + sq.animCommand(32); sq.printText(8, 15); // I am troubled my friend - sq.runSequence(33); - sq.runSequence(33); + sq.animCommand(33); + sq.animCommand(33); for (int i = 0; i < 4; i++) - sq.runSequence(32); + sq.animCommand(32); sq.fadeText(); sq.printText(9, 15); // Ancient evil stirs in the Temple Darkmoon - sq.runSequence(33); - sq.runSequence(43); - sq.runSequence(33); + sq.animCommand(33); + sq.animCommand(43); + sq.animCommand(33); for (int i = 0; i < 3; i++) - sq.runSequence(32); + sq.animCommand(32); sq.fadeText(); sq.printText(10, 15); // I fear for the safety of our city for (int i = 0; i < 4; i++) - sq.runSequence(33); - sq.runSequence(32); - sq.runSequence(32); + sq.animCommand(33); + sq.animCommand(32); + sq.animCommand(32); sq.loadScene(9, 2); sq.fadeText(); @@ -339,67 +368,67 @@ void DarkMoonEngine::seq_playIntro() { sq.waitForSongNotifier(6); sq.update(2); - sq.runSequence(34); + sq.animCommand(34); sq.printText(11, 15); // I need your help for (int i = 0; i < 3; i++) - sq.runSequence(34); - sq.runSequence(35); + sq.animCommand(34); + sq.animCommand(35); for (int i = 0; i < 4; i++) - sq.runSequence(34); + sq.animCommand(34); sq.fadeText(); sq.loadScene(12, 2); sq.update(2); sq.loadScene(6, 2); - sq.runSequence(18); + sq.animCommand(18); sq.printText(12, 15); // Three nights ago I sent forth a scout - sq.runSequence(19); - sq.runSequence(20); - sq.runSequence(22); - sq.runSequence(19); - sq.runSequence(20); - sq.runSequence(18); + sq.animCommand(19); + sq.animCommand(20); + sq.animCommand(22); + sq.animCommand(19); + sq.animCommand(20); + sq.animCommand(18); sq.fadeText(); sq.printText(13, 15); // She has not yet returned - sq.runSequence(20); - sq.runSequence(19); - sq.runSequence(23); - sq.runSequence(24); - sq.runSequence(20); - sq.runSequence(19); - sq.runSequence(17); - sq.runSequence(18); + sq.animCommand(20); + sq.animCommand(19); + sq.animCommand(23); + sq.animCommand(24); + sq.animCommand(20); + sq.animCommand(19); + sq.animCommand(17); + sq.animCommand(18); sq.fadeText(); sq.printText(14, 15); // I fear for her safety - sq.runSequence(19); - sq.runSequence(20); - sq.runSequence(20); - sq.runSequence(18); - sq.runSequence(25); - sq.runSequence(18); - sq.runSequence(18); + sq.animCommand(19); + sq.animCommand(20); + sq.animCommand(20); + sq.animCommand(18); + sq.animCommand(25); + sq.animCommand(18); + sq.animCommand(18); sq.fadeText(); - sq.runSequence(18); - sq.runSequence(18); + sq.animCommand(18); + sq.animCommand(18); sq.printText(15, 15); // Take this coin - sq.runSequence(28); - sq.runSequence(19); - sq.runSequence(20); - sq.runSequence(18); - sq.runSequence(18); + sq.animCommand(28); + sq.animCommand(19); + sq.animCommand(20); + sq.animCommand(18); + sq.animCommand(18); sq.fadeText(); sq.loadScene(10, 2); _screen->clearCurPage(); _screen->updateScreen(); - sq.runSequence(37, 18); - sq.runSequence(36, 36); + sq.animCommand(37, 18); + sq.animCommand(36, 36); sq.loadScene(12, 2); _screen->clearCurPage(); @@ -407,44 +436,44 @@ void DarkMoonEngine::seq_playIntro() { sq.loadScene(11, 2); sq.printText(16, 15); // I will use it to contact you - sq.runSequence(19); - sq.runSequence(20); - sq.runSequence(20); - sq.runSequence(18); - sq.runSequence(18); + sq.animCommand(19); + sq.animCommand(20); + sq.animCommand(20); + sq.animCommand(18); + sq.animCommand(18); sq.fadeText(); sq.printText(17, 15); // You must act quickly - sq.runSequence(19); - sq.runSequence(20); - sq.runSequence(19); - sq.runSequence(18); - sq.runSequence(18); + sq.animCommand(19); + sq.animCommand(20); + sq.animCommand(19); + sq.animCommand(18); + sq.animCommand(18); sq.fadeText(); - sq.runSequence(18); + sq.animCommand(18); sq.printText(18, 15); // I will teleport you near Darkmoon - sq.runSequence(20); - sq.runSequence(27); - sq.runSequence(20); - sq.runSequence(19); - sq.runSequence(18); - sq.runSequence(18); + sq.animCommand(20); + sq.animCommand(27); + sq.animCommand(20); + sq.animCommand(19); + sq.animCommand(18); + sq.animCommand(18); sq.fadeText(); - sq.runSequence(18); + sq.animCommand(18); sq.printText(19, 15); // May luck be with you my friend - sq.runSequence(19); - sq.runSequence(19); - sq.runSequence(20); - sq.runSequence(18); + sq.animCommand(19); + sq.animCommand(19); + sq.animCommand(20); + sq.animCommand(18); sq.fadeText(); - sq.runSequence(29); + sq.animCommand(29); sq.waitForSongNotifier(7); - sq.runSequence(30); - sq.runSequence(31); + sq.animCommand(30); + sq.animCommand(31); sq.waitForSongNotifier(8, true); @@ -454,17 +483,21 @@ void DarkMoonEngine::seq_playIntro() { _screen->setScreenDim(17); _screen->clearCurDim(); snd_playSoundEffect(14); - sq.fadePalette(10, 1); + + if (_configRenderMode != Common::kRenderEGA) + sq.fadePalette(10, 1); _screen->setClearScreenDim(18); sq.delay(6); - sq.fadePalette(9, 1); + if (_configRenderMode != Common::kRenderEGA) + sq.fadePalette(9, 1); _screen->clearCurPage(); } sq.fadePalette(9, 10); } void DarkMoonEngine::seq_playFinale() { - DarkmoonSequenceHelper sq(_system, this, _screen, DarkmoonSequenceHelper::kFinale, _finaleStrings, _cpsFilesFinale, _palFilesFinale, _shapesFinale, _seqFinale); + DarkmoonSequenceHelper::Config config(DarkmoonSequenceHelper::kFinale, _finaleStrings, _cpsFilesFinale, _configRenderMode == Common::kRenderEGA ? _palFilesFinaleEGA : _palFilesFinaleVGA, _shapesFinale, _animFinale, true); + DarkmoonSequenceHelper sq(_system, this, _screen, &config); _screen->setCurPage(0); _screen->setFont(Screen::FID_8_FNT); @@ -485,76 +518,76 @@ void DarkMoonEngine::seq_playFinale() { sq.loadScene(1, 2); - sq.runSequence(0); - sq.runSequence(0); + sq.animCommand(0); + sq.animCommand(0); for (int i = 0; i < 3; i++) - sq.runSequence(2); - sq.runSequence(1); - sq.runSequence(2); - sq.runSequence(2); + sq.animCommand(2); + sq.animCommand(1); + sq.animCommand(2); + sq.animCommand(2); sq.printText(0, 10); // Finally, Dran has been defeated for (int i = 0; i < 7; i++) - sq.runSequence(2); + sq.animCommand(2); sq.fadeText(); - sq.runSequence(2); + sq.animCommand(2); sq.waitForSongNotifier(1); sq.printText(1, 10); // Suddenly, your friend Khelben appears - sq.runSequence(4); + sq.animCommand(4); for (int i = 0; i < 3; i++) - sq.runSequence(2); + sq.animCommand(2); sq.fadeText(); sq.printText(2, 15); // Greetings, my victorious friends for (int i = 0; i < 4; i++) - sq.runSequence(5); - sq.runSequence(2); - sq.runSequence(2); + sq.animCommand(5); + sq.animCommand(2); + sq.animCommand(2); sq.fadeText(); - sq.runSequence(6); + sq.animCommand(6); sq.printText(3, 15); // You have defeated Dran for (int i = 0; i < 5; i++) - sq.runSequence(5); - sq.runSequence(2); - sq.runSequence(2); + sq.animCommand(5); + sq.animCommand(2); + sq.animCommand(2); sq.fadeText(); sq.printText(4, 15); // I did not know Dran was a dragon for (int i = 0; i < 4; i++) - sq.runSequence(5); - sq.runSequence(2); - sq.runSequence(2); + sq.animCommand(5); + sq.animCommand(2); + sq.animCommand(2); sq.fadeText(); sq.printText(5, 15); // He must have been over 300 years old for (int i = 0; i < 4; i++) - sq.runSequence(5); - sq.runSequence(2); - sq.runSequence(2); + sq.animCommand(5); + sq.animCommand(2); + sq.animCommand(2); sq.fadeText(); sq.printText(6, 15); // His power is gone for (int i = 0; i < 3; i++) - sq.runSequence(5); - sq.runSequence(2); - sq.runSequence(2); + sq.animCommand(5); + sq.animCommand(2); + sq.animCommand(2); sq.fadeText(); sq.printText(7, 15); // But Darkmoon is still a source of great evil for (int i = 0; i < 4; i++) - sq.runSequence(5); - sq.runSequence(2); - sq.runSequence(2); + sq.animCommand(5); + sq.animCommand(2); + sq.animCommand(2); sq.fadeText(); sq.printText(8, 15); // And many of his minions remain for (int i = 0; i < 4; i++) - sq.runSequence(5); - sq.runSequence(2); - sq.runSequence(2); + sq.animCommand(5); + sq.animCommand(2); + sq.animCommand(2); sq.fadeText(); sq.loadScene(2, 2); @@ -563,29 +596,32 @@ void DarkMoonEngine::seq_playFinale() { _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.runSequence(7); - sq.runSequence(8); - sq.runSequence(7); - sq.runSequence(7, 36); + 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.. for (int i = 0; i < 3; i++) - sq.runSequence(7); - sq.runSequence(8); - sq.runSequence(7); - sq.runSequence(7, 36); - sq.runSequence(8, 18); + sq.animCommand(7); + sq.animCommand(8); + sq.animCommand(7); + sq.animCommand(7, 36); + sq.animCommand(8, 18); sq.fadeText(); sq.printText(11, 15); // Follow me - sq.runSequence(7, 18); - sq.runSequence(9, 18); - sq.runSequence(8, 18); + sq.animCommand(7, 18); + sq.animCommand(9, 18); + sq.animCommand(8, 18); sq.fadeText(); sq.loadScene(7, 2); - sq.copyPalette(3, 0); + + if (_configRenderMode != Common::kRenderEGA) + sq.copyPalette(3, 0); + sq.loadScene(4, 2); sq.waitForSongNotifier(2); @@ -607,23 +643,23 @@ void DarkMoonEngine::seq_playFinale() { snd_playSoundEffect(7); sq.delay(8); - sq.runSequence(10); - sq.runSequence(13); + sq.animCommand(10); + sq.animCommand(13); sq.initDelayedPaletteFade(4, 1); - sq.runSequence(14); - sq.runSequence(13); - sq.runSequence(14); - sq.runSequence(14); - sq.runSequence(13); + sq.animCommand(14); + sq.animCommand(13); + sq.animCommand(14); + sq.animCommand(14); + sq.animCommand(13); sq.initDelayedPaletteFade(2, 1); - sq.runSequence(15); - sq.runSequence(14); - sq.runSequence(13); - sq.runSequence(15); - sq.runSequence(15); - sq.runSequence(11); + sq.animCommand(15); + sq.animCommand(14); + sq.animCommand(13); + sq.animCommand(15); + sq.animCommand(15); + sq.animCommand(11); sq.printText(13, 10); // The temple's evil is very strong sq.delay(72); @@ -639,22 +675,22 @@ void DarkMoonEngine::seq_playFinale() { snd_playSoundEffect(7); sq.delay(8); - sq.runSequence(10); + sq.animCommand(10); sq.initDelayedPaletteFade(5, 1); - sq.runSequence(13); - sq.runSequence(14); - sq.runSequence(13); - sq.runSequence(14); - sq.runSequence(13); - sq.runSequence(13); - sq.runSequence(14); - sq.runSequence(14); - sq.runSequence(13); - sq.runSequence(12); + sq.animCommand(13); + sq.animCommand(14); + sq.animCommand(13); + sq.animCommand(14); + sq.animCommand(13); + sq.animCommand(13); + sq.animCommand(14); + sq.animCommand(14); + sq.animCommand(13); + sq.animCommand(12); for (int i = 0; i < 4; i++) - sq.runSequence(16); - sq.runSequence(17); - sq.runSequence(18); + sq.animCommand(16); + sq.animCommand(17); + sq.animCommand(18); sq.printText(15, 10); // The temple ceases to exist sq.initDelayedPaletteFade(6, 1); @@ -672,40 +708,43 @@ void DarkMoonEngine::seq_playFinale() { if (!skipFlag() && !shouldQuit()) snd_playSoundEffect(6); - if (!skipFlag() && !shouldQuit()) + if (!skipFlag() && !shouldQuit()) { + if (_configRenderMode != Common::kRenderEGA) + sq.setPaletteWithoutTextColor(0); _screen->crossFadeRegion(0, 0, 8, 8, 304, 128, 2, 0); + } sq.delay(18); sq.printText(16, 15); // My friends, our work is done - sq.runSequence(20); - sq.runSequence(19); - sq.runSequence(19, 36); + sq.animCommand(20); + sq.animCommand(19); + sq.animCommand(19, 36); if (!skipFlag() && !shouldQuit()) snd_playSoundEffect(12); sq.fadeText(); sq.printText(17, 15); // Thank you - sq.runSequence(19); - sq.runSequence(20, 36); + sq.animCommand(19); + sq.animCommand(20, 36); sq.fadeText(); sq.printText(18, 15); // You have earned my deepest respect if (!skipFlag() && !shouldQuit()) snd_playSoundEffect(11); - sq.runSequence(20); - sq.runSequence(19); - sq.runSequence(19); + sq.animCommand(20); + sq.animCommand(19); + sq.animCommand(19); if (!skipFlag() && !shouldQuit()) snd_playSoundEffect(11); sq.delay(36); sq.fadeText(); sq.printText(19, 15); // We will remember you always - sq.runSequence(19); - sq.runSequence(19, 18); + sq.animCommand(19); + sq.animCommand(19, 18); if (!skipFlag() && !shouldQuit()) snd_playSoundEffect(11); - sq.runSequence(20, 18); + sq.animCommand(20, 18); sq.fadeText(); sq.delay(28); @@ -718,6 +757,8 @@ void DarkMoonEngine::seq_playFinale() { _screen->copyRegion(0, 0, 8, 8, 304, 128, 2, 0, Screen::CR_NO_P_CHECK); } else { snd_playSoundEffect(6); + if (_configRenderMode != Common::kRenderEGA) + sq.setPaletteWithoutTextColor(0); _screen->crossFadeRegion(0, 0, 8, 8, 304, 128, 2, 0); } @@ -756,8 +797,10 @@ void DarkMoonEngine::seq_playFinale() { resetSkipFlag(true); - sq.setPalette(11); - sq.fadePalette(9, 10); + if (_configRenderMode != Common::kRenderEGA) { + sq.setPalette(11); + sq.fadePalette(9, 10); + } _screen->clearCurPage(); sq.loadScene(11, 2); @@ -912,15 +955,15 @@ void DarkMoonEngine::seq_playCredits(DarkmoonSequenceHelper *sq, const uint8 *da delete[] items[i].str; } -DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, Mode mode, const char *const *strings, const char *const *cpsFiles, const char *const *palFiles, const EoBShapeDef **shapeDefList, const EoBSequenceStep **seqList) : - _system(system), _vm(vm), _screen(screen), _mode(mode), _strings(strings), _cpsFiles(cpsFiles), _palFiles(palFiles), _shapeDefs(shapeDefList), _seqData(seqList) { +DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine *vm, Screen_EoB *screen, const Config *config) : + _system(system), _vm(vm), _screen(screen), _config(config) { - for (int i = 0; _palFiles[i]; i++) { + for (int i = 0; _config->palFiles[i]; i++) { if (i < 4) _palettes[i] = &_screen->getPalette(i); else _palettes[i] = new Palette(256); - _screen->loadPalette(_palFiles[i], *_palettes[i]); + _screen->loadPalette(_config->palFiles[i], *_palettes[i]); } _palettes[9] = new Palette(256); @@ -946,7 +989,7 @@ DarkmoonSequenceHelper::DarkmoonSequenceHelper(OSystem *system, DarkMoonEngine * } DarkmoonSequenceHelper::~DarkmoonSequenceHelper() { - for (int i = 4; _palFiles[i]; i++) + for (int i = 4; _config->palFiles[i]; i++) delete _palettes[i]; delete _palettes[9]; delete _palettes[10]; @@ -967,12 +1010,22 @@ DarkmoonSequenceHelper::~DarkmoonSequenceHelper() { void DarkmoonSequenceHelper::loadScene(int index, int pageNum) { char file[13]; - strcpy(file, _cpsFiles[index]); + strcpy(file, _config->cpsFiles[index]); Common::SeekableReadStream *s = _vm->resource()->createReadStream(file); - if (s && file[0] != 'X') { + uint32 chunkID = 0; + if (s) { + chunkID = s->readUint32LE(); + s->seek(0); + } + + 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') { delete s; - _screen->loadBitmap(_cpsFiles[index], pageNum | 1, pageNum | 1, _palettes[0]); + _screen->loadBitmap(_config->cpsFiles[index], pageNum | 1, pageNum | 1, _palettes[0]); } else { if (!s) { file[0] = 'X'; @@ -982,7 +1035,7 @@ void DarkmoonSequenceHelper::loadScene(int index, int pageNum) { if (!s) error("DarkmoonSequenceHelper::loadScene(): CPS file loading failure in scene %d", index); - if (_mode == kFinale) + if (_config->mode == kFinale) s->read(_palettes[0]->getData(), 768); else s->seek(768); @@ -992,8 +1045,8 @@ void DarkmoonSequenceHelper::loadScene(int index, int pageNum) { int cp = _screen->setCurPage(pageNum); - if (_shapeDefs[index]) { - for (const EoBShapeDef *df = _shapeDefs[index]; df->w; df++) { + if (_config->shapeDefs[index]) { + for (const DarkMoonShapeDef *df = _config->shapeDefs[index]; df->w; df++) { uint16 shapeIndex = (df->index < 0) ? df->index * -1 : df->index; if (_shapes[shapeIndex]) delete[] _shapes[shapeIndex]; @@ -1002,20 +1055,24 @@ void DarkmoonSequenceHelper::loadScene(int index, int pageNum) { } _screen->setCurPage(cp); - _screen->copyPage(pageNum | 1, pageNum); + + if (_vm->_configRenderMode == Common::kRenderEGA) + setPalette(0); + + _screen->convertPage(pageNum | 1, pageNum, 0); if ((pageNum == 0 || pageNum == 1) && !_vm->skipFlag() && !_vm->shouldQuit()) _screen->updateScreen(); } -void DarkmoonSequenceHelper::runSequence(int index, int del) { +void DarkmoonSequenceHelper::animCommand(int index, int del) { if (_vm->skipFlag() || _vm->shouldQuit()) return; uint32 end = 0; - for (const EoBSequenceStep *s = _seqData[index]; s->command != 0xff && !_vm->skipFlag() && !_vm->shouldQuit(); s++) { - int palIndex = _mode == kFinale ? (s->pal + 1) : s->pal; + for (const DarkMoonAnimCommand *s = _config->animData[index]; s->command != 0xff && !_vm->skipFlag() && !_vm->shouldQuit(); s++) { + int palIndex = _config->mode == kFinale ? (s->pal + 1) : s->pal; int x = s->x1; int y = s->y1; int x2 = 0; @@ -1025,10 +1082,10 @@ void DarkmoonSequenceHelper::runSequence(int index, int del) { switch (s->command) { case 0: // flash palette - if (s->pal) + if (_vm->_configRenderMode != Common::kRenderEGA && s->pal) setPaletteWithoutTextColor(palIndex); delay(s->delay); - if (_mode == kIntro && s->pal) + if (_vm->_configRenderMode != Common::kRenderEGA && _config->mode == kIntro && s->pal) setPaletteWithoutTextColor(0); break; @@ -1037,7 +1094,7 @@ void DarkmoonSequenceHelper::runSequence(int index, int del) { shapeW = _shapes[s->obj][2]; shapeH = _shapes[s->obj][3]; - if (_mode == kFinale) { + if (_config->mode == kFinale) { _screen->setScreenDim(18); x -= (_screen->_curDim->sx << 3); y -= _screen->_curDim->sy; @@ -1047,17 +1104,17 @@ void DarkmoonSequenceHelper::runSequence(int index, int del) { x2 = x; } - _screen->drawShape(0, _shapes[s->obj], x, y, _mode == kIntro ? 0 : 18); + _screen->drawShape(0, _shapes[s->obj], x, y, _config->mode == kIntro ? 0 : 18); - if (s->pal) + if (_vm->_configRenderMode != Common::kRenderEGA && s->pal) setPaletteWithoutTextColor(palIndex); else _screen->updateScreen(); delay(s->delay); - if (_mode == kIntro) { - if (s->pal) + if (_config->mode == kIntro) { + if (_vm->_configRenderMode != Common::kRenderEGA && s->pal) setPaletteWithoutTextColor(0); _screen->copyRegion(x - 8, y - 8, x, y, (shapeW + 1) << 3, shapeH, 2, 0, Screen::CR_NO_P_CHECK); } else { @@ -1071,50 +1128,59 @@ void DarkmoonSequenceHelper::runSequence(int index, int del) { // draw shape _screen->drawShape(_screen->_curPage, _shapes[s->obj], x, y, 0); - if (s->pal) + if (_vm->_configRenderMode != Common::kRenderEGA && s->pal) setPaletteWithoutTextColor(palIndex); else if (!_screen->_curPage) _screen->updateScreen(); delay(s->delay); - if (_mode == kIntro && s->pal) + if (_vm->_configRenderMode != Common::kRenderEGA && _config->mode == kIntro && s->pal) setPaletteWithoutTextColor(0); break; case 3: case 4: // fade shape in or out or restore background - if (_mode == kFinale) + if (_config->mode == kFinale) break; - _screen->setShapeFadeMode(0, true); - _screen->setShapeFadeMode(1, true); + if (_vm->_configRenderMode == Common::kRenderEGA) { + if (palIndex) + _screen->drawShape(0, _shapes[s->obj], s->x1, y, 0); + 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(); + delay(s->delay /** 7*/); + } else { + _screen->setShapeFadeMode(0, true); + _screen->setShapeFadeMode(1, true); - end = _system->getMillis() + s->delay * _vm->tickLength(); + end = _system->getMillis() + s->delay * _vm->tickLength(); - if (palIndex) { - _screen->setFadeTableIndex(palIndex - 1); + if (palIndex) { + _screen->setFadeTableIndex(palIndex - 1); - _screen->copyRegion(s->x1 - 8, s->y1 - 8, 0, 0, (_shapes[s->obj][2] + 1) << 3, _shapes[s->obj][3], 2, 4, Screen::CR_NO_P_CHECK); - _screen->drawShape(4, _shapes[s->obj], s->x1 & 7, 0, 0); - _screen->copyRegion(0, 0, s->x1, s->y1, (_shapes[s->obj][2] + 1) << 3, _shapes[s->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(); + _screen->copyRegion(s->x1 - 8, s->y1 - 8, 0, 0, (_shapes[s->obj][2] + 1) << 3, _shapes[s->obj][3], 2, 4, Screen::CR_NO_P_CHECK); + _screen->drawShape(4, _shapes[s->obj], s->x1 & 7, 0, 0); + _screen->copyRegion(0, 0, s->x1, s->y1, (_shapes[s->obj][2] + 1) << 3, _shapes[s->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); - _screen->setShapeFadeMode(0, false); - _screen->setShapeFadeMode(1, false); + _vm->delayUntil(end); + _screen->setShapeFadeMode(0, false); + _screen->setShapeFadeMode(1, false); + } break; case 5: // copy region - if (_mode == kFinale && s->pal) + if (_config->mode == kFinale && s->pal) setPaletteWithoutTextColor(palIndex); - _screen->copyRegion(s->x2 << 3, s->y2, s->x1, s->y1, s->w << 3, s->h, (s->obj && _mode == kFinale) ? 6 : 2, 0, Screen::CR_NO_P_CHECK); + _screen->copyRegion(s->x2 << 3, s->y2, s->x1, s->y1, s->w << 3, s->h, (s->obj && _config->mode == kFinale) ? 6 : 2, 0, Screen::CR_NO_P_CHECK); _screen->updateScreen(); delay(s->delay); break; @@ -1125,8 +1191,15 @@ void DarkmoonSequenceHelper::runSequence(int index, int del) { _vm->snd_playSoundEffect(s->obj); break; + case 7: + // restore background (only used in EGA mode) + delay(s->delay); + _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(); + break; + default: - error("DarkmoonSequenceHelper::runSequence(): Unknown animation opcode encountered."); + error("DarkmoonSequenceHelper::animCommand(): Unknown animation opcode encountered."); break; } } @@ -1140,12 +1213,17 @@ void DarkmoonSequenceHelper::printText(int index, int color) { return; _screen->setClearScreenDim(17); - _palettes[0]->copy(*_palettes[0], color, 1, 255); - setPalette(0); + uint8 col1 = 15; + + if (_vm->_configRenderMode != Common::kRenderEGA) { + _palettes[0]->copy(*_palettes[0], color, 1, 255); + setPalette(0); + col1 = 255; + } - char *temp = new char[strlen(_strings[index]) + 1]; + char *temp = new char[strlen(_config->strings[index]) + 1]; char *str = temp; - strcpy(str, _strings[index]); + strcpy(str, _config->strings[index]); const ScreenDim *dm = _screen->_curDim; @@ -1156,7 +1234,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, 255, dm->unkA); + _screen->printText(str, (dm->sx + ((dm->w - len) >> 1)) << 3, dm->sy + yOffs, col1, dm->unkA); if (cr) { *cr = 13; @@ -1173,8 +1251,8 @@ void DarkmoonSequenceHelper::printText(int index, int color) { void DarkmoonSequenceHelper::fadeText() { if (_vm->skipFlag() || _vm->shouldQuit()) return; - - _screen->fadeTextColor(_palettes[0], 255, 8); + if (_vm->_configRenderMode != Common::kRenderEGA) + _screen->fadeTextColor(_palettes[0], 255, 8); _screen->clearCurDim(); } @@ -1183,11 +1261,13 @@ void DarkmoonSequenceHelper::update(int srcPage) { return; _screen->copyRegion(0, 0, 8, 8, 304, 128, srcPage, 0, Screen::CR_NO_P_CHECK); - setPaletteWithoutTextColor(0); + + if (_vm->_configRenderMode != Common::kRenderEGA) + setPaletteWithoutTextColor(0); } void DarkmoonSequenceHelper::setPaletteWithoutTextColor(int index) { - if (_vm->skipFlag() || _vm->shouldQuit()) + if (_vm->_configRenderMode == Common::kRenderEGA || _vm->skipFlag() || _vm->shouldQuit()) return; if (!memcmp(_palettes[11]->getData(), _palettes[index]->getData(), 765)) @@ -1198,6 +1278,7 @@ void DarkmoonSequenceHelper::setPaletteWithoutTextColor(int index) { setPalette(11); _screen->updateScreen(); + _system->delayMillis(10); } void DarkmoonSequenceHelper::setPalette(int index) { @@ -1207,8 +1288,12 @@ void DarkmoonSequenceHelper::setPalette(int index) { void DarkmoonSequenceHelper::fadePalette(int index, int del) { if (_vm->skipFlag() || _vm->shouldQuit()) return; - - _screen->fadePalette(*_palettes[index], del * _vm->tickLength()); + if (_vm->_configRenderMode == Common::kRenderEGA) { + setPalette(index); + _screen->updateScreen(); + } else { + _screen->fadePalette(*_palettes[index], del * _vm->tickLength()); + } } void DarkmoonSequenceHelper::copyPalette(int srcIndex, int destIndex) { @@ -1227,7 +1312,7 @@ bool DarkmoonSequenceHelper::processDelayedPaletteFade() { if (_vm->skipFlag() || _vm->shouldQuit()) return true; - if (!_fadePalRate || (_system->getMillis() <= _fadePalTimer)) + if (_vm->_configRenderMode == Common::kRenderEGA || !_fadePalRate || (_system->getMillis() <= _fadePalTimer)) return false; if (_screen->delayedFadePalStep(_palettes[_fadePalIndex], _palettes[0], _fadePalRate)) { @@ -1246,7 +1331,7 @@ void DarkmoonSequenceHelper::delay(uint32 ticks) { uint32 end = _system->getMillis() + ticks * _vm->_tickLength; - if (_mode == kFinale) { + if (_config->palFading) { do { if (processDelayedPaletteFade()) break; @@ -1263,11 +1348,11 @@ void DarkmoonSequenceHelper::waitForSongNotifier(int index, bool introUpdateAnim int seq = 0; while (_vm->sound()->checkTrigger() < index && !(_vm->skipFlag() || _vm->shouldQuit())) { if (introUpdateAnim) { - runSequence(30 | seq); + animCommand(30 | seq); seq ^= 1; } - if (_mode == kFinale) + if (_config->palFading) processDelayedPaletteFade(); _vm->updateInput(); diff --git a/engines/kyra/sequences_eob.cpp b/engines/kyra/sequences_eob.cpp index f18c67f659..195c44ea2a 100644 --- a/engines/kyra/sequences_eob.cpp +++ b/engines/kyra/sequences_eob.cpp @@ -110,7 +110,8 @@ void EoBIntroPlayer::start() { if (!_vm->shouldQuit() && !_vm->skipFlag()) { _vm->snd_playSong(2); - _screen->loadBitmap("TITLE-V.CMP", 5, 3, 0); + _screen->loadBitmap((_vm->_configRenderMode == Common::kRenderCGA || _vm->_configRenderMode == Common::kRenderEGA) ? "TITLE-E.CMP" : "TITLE-V.CMP", 3, 5, 0); + _screen->convertPage(5, 2, _vm->_cgaMappingDefault); _screen->crossFadeRegion(0, 0, 0, 0, 320, 200, 2, 0); _vm->delay(120 * _vm->_tickLength); } @@ -121,7 +122,8 @@ void EoBIntroPlayer::start() { _screen->loadFileDataToPage(s, 6, s->size() - 768); delete s; } else { - _screen->loadBitmap("TEXT.CMP", 3, 6, 0); + _screen->loadBitmap("TEXT.CMP", 3, 5, 0); + _screen->convertPage(5, 6, _vm->_cgaMappingAlt); } tower(); @@ -139,8 +141,9 @@ void EoBIntroPlayer::start() { void EoBIntroPlayer::openingCredits() { loadAndSetPalette(_filesOpening[5]); + _screen->loadBitmap(_filesOpening[4], 5, 3, 0); - _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK); + _screen->convertPage(3, 0, _vm->_cgaMappingAlt); _screen->updateScreen(); _vm->snd_playSong(1); @@ -149,7 +152,8 @@ void EoBIntroPlayer::openingCredits() { for (int i = 0; i < 4 && !_vm->shouldQuit() && !_vm->skipFlag(); i++) { _screen->loadBitmap(_filesOpening[i], 5, 3, 0); uint32 nextFrameTimer = _vm->_system->getMillis() + _openingFrmDelay[i + 1] * _vm->_tickLength; - _screen->crossFadeRegion(0, 50, 0, 50, 320, 102, 2, 0); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); + _screen->crossFadeRegion(0, 50, 0, 50, 320, 102, 4, 0); _vm->delayUntil(nextFrameTimer); } } @@ -160,8 +164,8 @@ void EoBIntroPlayer::tower() { _screen->loadBitmap(_filesTower[1], 5, 3, 0); _screen->setCurPage(2); - uint8 *shp = _screen->encodeShape(0, 0, 16, 56, true); - _screen->copyPage(3, 4); + uint8 *shp = _screen->encodeShape(0, 0, 16, 56, true, _vm->_cgaMappingAlt); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); _screen->clearCurPage(); for (int i = 0; i < 200; i += 64) @@ -236,19 +240,19 @@ void EoBIntroPlayer::orb() { uint8 *shp[5]; _screen->loadBitmap(_filesOrb[0], 5, 3, 0); _screen->setCurPage(2); - shp[4] = _screen->encodeShape(0, 0, 20, 136, true); + shp[4] = _screen->encodeShape(0, 0, 20, 136, true, _vm->_cgaMappingAlt); _screen->loadBitmap(_filesOrb[1], 5, 3, 0); - shp[3] = _screen->encodeShape(16, 0, 16, 104, true); + shp[3] = _screen->encodeShape(16, 0, 16, 104, true, _vm->_cgaMappingAlt); _screen->fillRect(0, 0, 127, 103, 12); for (int i = 1; i < 4; i++) { copyBlurRegion(128, 0, 0, 0, 128, 104, i); - shp[3 - i] = _screen->encodeShape(0, 0, 16, 104, true); + shp[3 - i] = _screen->encodeShape(0, 0, 16, 104, true, _vm->_cgaMappingAlt); } _screen->fillRect(0, 0, 159, 135, 12); _screen->setCurPage(0); - _screen->copyPage(3, 4); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); _screen->clearCurPage(); _vm->snd_playSoundEffect(6); @@ -297,14 +301,14 @@ void EoBIntroPlayer::waterdeepEntry() { loadAndSetPalette(_filesWdEntry[0]); _screen->loadBitmap(_filesWdEntry[1], 5, 3, 0); _screen->setCurPage(2); - shp[3] = _screen->encodeShape(0, 0, 20, 136, true); + shp[3] = _screen->encodeShape(0, 0, 20, 136, true, _vm->_cgaMappingAlt); for (int i = 1; i < 4; i++) { copyBlurRegion(0, 0, 0, 0, 160, 136, i); - shp[3 - i] = _screen->encodeShape(0, 0, 20, 136, true); + shp[3 - i] = _screen->encodeShape(0, 0, 20, 136, true, _vm->_cgaMappingAlt); } _screen->setCurPage(0); - _screen->copyPage(3, 4); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); _screen->fillRect(0, 168, 319, 199, 12, 0); _vm->snd_playSoundEffect(6); @@ -321,18 +325,18 @@ void EoBIntroPlayer::waterdeepEntry() { _vm->delay(50 * _vm->_tickLength); _screen->setCurPage(2); - shp[0] = _screen->encodeShape(20, 0, 20, 136, true); + shp[0] = _screen->encodeShape(20, 0, 20, 136, true, _vm->_cgaMappingAlt); _screen->loadBitmap(_filesWdEntry[2], 5, 3, 0); - shp[1] = _screen->encodeShape(0, 0, 20, 136, true); - shp[2] = _screen->encodeShape(20, 0, 20, 136, true); + shp[1] = _screen->encodeShape(0, 0, 20, 136, true, _vm->_cgaMappingAlt); + shp[2] = _screen->encodeShape(20, 0, 20, 136, true, _vm->_cgaMappingAlt); _screen->loadBitmap(_filesWdEntry[3], 5, 3, 0); for (int i = 0; i < 31; i++) - shp2[i] = _screen->encodeShape(_wdEncodeX[i], 136 + (_wdEncodeY[i] << 3), _wdEncodeWH[i], _wdEncodeWH[i] << 3, true); + shp2[i] = _screen->encodeShape(_wdEncodeX[i], 136 + (_wdEncodeY[i] << 3), _wdEncodeWH[i], _wdEncodeWH[i] << 3, true, _vm->_cgaMappingAlt); for (int i = 0; i < 3; i++) - shp3[i] = _screen->encodeShape(5 * i, 152, 5, 32, true); + shp3[i] = _screen->encodeShape(5 * i, 152, 5, 32, true, _vm->_cgaMappingAlt); - _screen->copyPage(3, 4); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); for (int i = 0; i < 3 && !_vm->shouldQuit() && !_vm->skipFlag(); i++) { uint32 end = _vm->_system->getMillis() + 3 * _vm->_tickLength; @@ -391,7 +395,7 @@ void EoBIntroPlayer::king() { return; _screen->loadBitmap(_filesKing[0], 5, 3, 0); - _screen->copyPage(3, 4); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); int x = 15; int y = 14; @@ -428,7 +432,7 @@ void EoBIntroPlayer::king() { _screen->loadBitmap(_filesKing[1], 5, 3, 0); _screen->setCurPage(2); for (int i = 0; i < 4; i++) { - shp[i] = _screen->encodeShape(advEncX[i], 0, advEncW[i], 98, true); + shp[i] = _screen->encodeShape(advEncX[i], 0, advEncW[i], 98, true, _vm->_cgaMappingAlt); dy[i] = 180 + ((_vm->_rnd.getRandomNumber(255) & 3) << 3); stepY[i] = (i * 5) & 3; } @@ -477,8 +481,8 @@ void EoBIntroPlayer::hands() { return; _screen->setCurPage(2); - uint8 *shp1 = _screen->encodeShape(0, 140, 21, 60, true); - uint8 *shp2 = _screen->encodeShape(21, 140, 12, 60, true); + uint8 *shp1 = _screen->encodeShape(0, 140, 21, 60, true, _vm->_cgaMappingAlt); + uint8 *shp2 = _screen->encodeShape(21, 140, 12, 60, true, _vm->_cgaMappingAlt); _screen->loadBitmap(_filesHands[0], 3, 5, 0); _screen->fillRect(0, 160, 319, 199, 12, 0); @@ -509,9 +513,9 @@ void EoBIntroPlayer::hands() { _vm->delay(15 * _vm->_tickLength); _screen->setCurPage(4); - shp1 = _screen->encodeShape(17, 0, 11, 120, true); - shp2 = _screen->encodeShape(28, 112, 1, 31, true); - uint8 *shp3 = _screen->encodeShape(9, 138, 14, 54, true); + shp1 = _screen->encodeShape(17, 0, 11, 120, true, _vm->_cgaMappingAlt); + shp2 = _screen->encodeShape(28, 112, 1, 31, true, _vm->_cgaMappingAlt); + uint8 *shp3 = _screen->encodeShape(9, 138, 14, 54, true, _vm->_cgaMappingAlt); _screen->setCurPage(2); _screen->fillRect(0, 0, 135, 63, 157); @@ -549,8 +553,8 @@ void EoBIntroPlayer::hands() { _vm->delay(15 * _vm->_tickLength); _screen->setCurPage(4); - shp1 = _screen->encodeShape(0, 0, 17, 136, true); - shp2 = _screen->encodeShape(0, 136, 9, 48, true); + shp1 = _screen->encodeShape(0, 0, 17, 136, true, _vm->_cgaMappingAlt); + shp2 = _screen->encodeShape(0, 136, 9, 48, true, _vm->_cgaMappingAlt); _screen->setCurPage(2); _screen->fillRect(0, 0, 143, 95, 157); @@ -576,8 +580,8 @@ void EoBIntroPlayer::hands() { _vm->delay(30 * _vm->_tickLength); _screen->setCurPage(4); - shp1 = _screen->encodeShape(28, 0, 11, 40, true); - shp2 = _screen->encodeShape(28, 40, 10, 72, true); + shp1 = _screen->encodeShape(28, 0, 11, 40, true, _vm->_cgaMappingAlt); + shp2 = _screen->encodeShape(28, 40, 10, 72, true, _vm->_cgaMappingAlt); _screen->setCurPage(2); _screen->fillRect(0, 0, 87, 112, 157); @@ -622,11 +626,11 @@ void EoBIntroPlayer::waterdeepExit() { _screen->loadBitmap(_filesWdExit[0], 5, 3, 0); _screen->setCurPage(2); for (int i = 0; i < 31; i++) - shp2[i] = _screen->encodeShape(_wdEncodeX[i], 136 + (_wdEncodeY[i] << 3), _wdEncodeWH[i], _wdEncodeWH[i] << 3, true); + shp2[i] = _screen->encodeShape(_wdEncodeX[i], 136 + (_wdEncodeY[i] << 3), _wdEncodeWH[i], _wdEncodeWH[i] << 3, true, _vm->_cgaMappingAlt); for (int i = 0; i < 3; i++) - shp3[i] = _screen->encodeShape(5 * i + 15, 152, 5, 32, true); - uint8 *shp1 = _screen->encodeShape(31, 136, 5, 32, true); - _screen->copyPage(3, 4); + shp3[i] = _screen->encodeShape(5 * i + 15, 152, 5, 32, true, _vm->_cgaMappingAlt); + uint8 *shp1 = _screen->encodeShape(31, 136, 5, 32, true, _vm->_cgaMappingAlt); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); _screen->copyRegion(0, 0, 0, 136, 48, 36, 4, 4, Screen::CR_NO_P_CHECK); _screen->fillRect(0, 168, 319, 199, 12, 0); _screen->copyRegion(160, 0, 80, 24, 160, 136, 4, 0, Screen::CR_NO_P_CHECK); @@ -676,7 +680,7 @@ void EoBIntroPlayer::waterdeepExit() { loadAndSetPalette(_filesWdExit[1]); _screen->loadBitmap(_filesWdExit[2], 3, 5, 0); - _screen->copyPage(5, 2); + _screen->convertPage(5, 2, _vm->_cgaMappingAlt); whirlTransition(); _vm->delay(6 * _vm->_tickLength); @@ -717,7 +721,7 @@ void EoBIntroPlayer::waterdeepExit() { } _screen->loadBitmap(_filesWdExit[3], 3, 5, 0); - _screen->copyPage(5, 2); + _screen->convertPage(5, 2, _vm->_cgaMappingAlt); _vm->delay(30 * _vm->_tickLength); _screen->setCurPage(0); _screen->fillRect(0, 16, 319, 31, 12); @@ -733,8 +737,8 @@ void EoBIntroPlayer::tunnel() { return; _screen->setCurPage(4); - uint8 *shp2 = _screen->encodeShape(20, 0, 20, 120, true); - uint8 *shp1 = _screen->encodeShape(0, 0, 20, 120, true); + uint8 *shp2 = _screen->encodeShape(20, 0, 20, 120, true, _vm->_cgaMappingAlt); + uint8 *shp1 = _screen->encodeShape(0, 0, 20, 120, true, _vm->_cgaMappingAlt); _vm->drawBlockObject(1, 4, shp2, 160, 0, 0); _vm->drawBlockObject(1, 4, shp1, 0, 0, 0); delete[] shp1; @@ -771,7 +775,7 @@ void EoBIntroPlayer::tunnel() { _screen->copyRegion(0, 0, 80, 32, 160, 120, 2, 0, Screen::CR_NO_P_CHECK); _screen->loadBitmap(_filesTunnel[0], 5, 3, 0); - _screen->copyPage(3, 4); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); _screen->updateScreen(); _vm->delay(40 * _vm->_tickLength); @@ -808,7 +812,7 @@ void EoBIntroPlayer::tunnel() { _vm->delay(40 * _vm->_tickLength); _screen->loadBitmap(_filesTunnel[1], 5, 3, 0); - _screen->copyPage(3, 4); + _screen->convertPage(3, 4, _vm->_cgaMappingAlt); _vm->snd_playSoundEffect(6); _screen->copyRegion(0, 0, 80, 32, 160, 120, 4, 0, Screen::CR_NO_P_CHECK); _screen->updateScreen(); @@ -825,6 +829,8 @@ void EoBIntroPlayer::tunnel() { } void EoBIntroPlayer::loadAndSetPalette(const char *filename) { + if (_vm->_configRenderMode == Common::kRenderCGA || _vm->_configRenderMode == Common::kRenderEGA) + return; _screen->loadPalette(filename, _screen->getPalette(0)); _screen->getPalette(0).fill(0, 1, 0); _screen->setScreenPalette(_screen->getPalette(0)); @@ -975,8 +981,9 @@ int EoBEngine::mainMenu() { while (menuChoice >= 0 && !shouldQuit()) { switch (menuChoice) { case 0: { - _screen->loadPalette("EOBPAL.COL", _screen->getPalette(0)); - _screen->loadEoBBitmap("INTRO", 0, 5, 3, 2); + if (_configRenderMode != Common::kRenderEGA) + _screen->loadPalette("EOBPAL.COL", _screen->getPalette(0)); + _screen->loadEoBBitmap("INTRO", _cgaMappingDefault, 5, 3, 2); _screen->setScreenPalette(_screen->getPalette(0)); _screen->_curPage = 2; of = _screen->setFont(Screen::FID_6_FNT); @@ -984,8 +991,8 @@ int EoBEngine::mainMenu() { _screen->printText(versionString.c_str(), 280 - versionString.size() * 6, 153, _screen->getPagePixel(2, 0, 0), 0); _screen->setFont(of); _screen->fillRect(0, 159, 319, 199, _screen->getPagePixel(2, 0, 0)); - gui_drawBox(77, 165, 173, 29, 13, 14, 12); - gui_drawBox(76, 164, 175, 31, 13, 14, -1); + gui_drawBox(77, 165, 173, 29, 14, 13, 12); + gui_drawBox(76, 164, 175, 31, 14, 13, -1); _screen->_curPage = 0; _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK); _screen->updateScreen(); @@ -996,7 +1003,6 @@ int EoBEngine::mainMenu() { case 1: // load game in progress - // menuChoice = -1; break; @@ -1089,10 +1095,10 @@ void EoBEngine::seq_xdeath() { _screen->loadShapeSetBitmap("XDEATH2", 5, 3); for (int i = 0; i < 4; i++) - shapes1[i] = _screen->encodeShape(i / 2 * 14, i / 2 * 88, 14, 88, true); + shapes1[i] = _screen->encodeShape(i / 2 * 14, i / 2 * 88, 14, 88, true, _cgaMappingDefault); _screen->loadShapeSetBitmap("XDEATH3", 5, 3); - shapes2 = _screen->encodeShape(22, 0, 16, 95, true); - _screen->loadEoBBitmap("XDEATH1", 0, 5, 3, -1); + shapes2 = _screen->encodeShape(22, 0, 16, 95, true, _cgaMappingDefault); + _screen->loadEoBBitmap("XDEATH1", _cgaMappingDefault, 5, 3, -1); _screen->setCurPage(0); for (int i = 0; i < 10; i++) { diff --git a/engines/kyra/sprites_eob.cpp b/engines/kyra/sprites_eob.cpp index 360d31458a..9e450a5ac7 100644 --- a/engines/kyra/sprites_eob.cpp +++ b/engines/kyra/sprites_eob.cpp @@ -37,7 +37,7 @@ void EoBCoreEngine::loadMonsterShapes(const char *filename, int monsterIndex, bo const uint16 *enc = &_encodeMonsterShpTable[encodeTableIndex << 2]; for (int i = 0; i < 6; i++, enc += 4) - _monsterShapes[monsterIndex + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3]); + _monsterShapes[monsterIndex + i] = _screen->encodeShape(enc[0], enc[1], enc[2], enc[3], false, _cgaMappingDefault); generateMonsterPalettes(filename, monsterIndex); diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 99ad6ea7aa..2be25ce093 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -38,7 +38,7 @@ namespace Kyra { -#define RESFILE_VERSION 80 +#define RESFILE_VERSION 81 namespace { bool checkKyraDat(Common::SeekableReadStream *file) { diff --git a/engines/kyra/staticres_eob.cpp b/engines/kyra/staticres_eob.cpp index a65ade7aee..5e28757978 100644 --- a/engines/kyra/staticres_eob.cpp +++ b/engines/kyra/staticres_eob.cpp @@ -28,12 +28,12 @@ namespace Kyra { #ifdef ENABLE_EOB -const EoBSequenceStep *StaticResource::loadEoB2SeqData(int id, int &entries) { - return (const EoBSequenceStep *)getData(id, kEoB2SequenceData, entries); +const DarkMoonAnimCommand *StaticResource::loadEoB2SeqData(int id, int &entries) { + return (const DarkMoonAnimCommand *)getData(id, kEoB2SequenceData, entries); } -const EoBShapeDef *StaticResource::loadEoB2ShapeData(int id, int &entries) { - return (const EoBShapeDef *)getData(id, kEoB2ShapeData, entries); +const DarkMoonShapeDef *StaticResource::loadEoB2ShapeData(int id, int &entries) { + return (const DarkMoonShapeDef *)getData(id, kEoB2ShapeData, entries); } const EoBCharacter *StaticResource::loadEoBNpcData(int id, int &entries) { @@ -43,7 +43,7 @@ const EoBCharacter *StaticResource::loadEoBNpcData(int id, int &entries) { bool StaticResource::loadEoB2SeqData(Common::SeekableReadStream &stream, void *&ptr, int &size) { size = stream.size() / 11; - EoBSequenceStep *s = new EoBSequenceStep[size]; + DarkMoonAnimCommand *s = new DarkMoonAnimCommand[size]; for (int i = 0; i < size; i++) { s[i].command = stream.readByte(); @@ -65,7 +65,7 @@ bool StaticResource::loadEoB2SeqData(Common::SeekableReadStream &stream, void *& bool StaticResource::loadEoB2ShapeData(Common::SeekableReadStream &stream, void *&ptr, int &size) { size = stream.size() / 6; - EoBShapeDef *s = new EoBShapeDef[size]; + DarkMoonShapeDef *s = new DarkMoonShapeDef[size]; for (int i = 0; i < size; i++) { s[i].index = stream.readSint16BE(); @@ -127,14 +127,14 @@ bool StaticResource::loadEoBNpcData(Common::SeekableReadStream &stream, void *&p } void StaticResource::freeEoB2SeqData(void *&ptr, int &size) { - EoBSequenceStep *d = (EoBSequenceStep *)ptr; + DarkMoonAnimCommand *d = (DarkMoonAnimCommand *)ptr; delete[] d; ptr = 0; size = 0; } void StaticResource::freeEoB2ShapeData(void *&ptr, int &size) { - EoBShapeDef *d = (EoBShapeDef *)ptr; + DarkMoonShapeDef *d = (DarkMoonShapeDef *)ptr; delete[] d; ptr = 0; size = 0; @@ -1035,6 +1035,18 @@ void EoBEngine::initStaticResource() { _beholderSpellList = _staticres->loadRawData(kEoB1BeholderSpellList, temp); _beholderSfx = _staticres->loadRawData(kEoB1BeholderSfx, temp); + _cgaMappingDefault = _staticres->loadRawData(kEoB1CgaMappingDefault, temp); + _cgaMappingAlt = _staticres->loadRawData(kEoB1CgaMappingAlt, temp); + _cgaMappingInv = _staticres->loadRawData(kEoB1CgaMappingInv, temp); + _cgaMappingItemsL = _staticres->loadRawData(kEoB1CgaMappingItemsL, temp); + _cgaMappingItemsS = _staticres->loadRawData(kEoB1CgaMappingItemsS, temp); + _cgaMappingThrown = _staticres->loadRawData(kEoB1CgaMappingThrown, temp); + _cgaMappingIcons = _staticres->loadRawData(kEoB1CgaMappingIcons, temp); + _cgaMappingDeco = _staticres->loadRawData(kEoB1CgaMappingDeco, temp); + _cgaLevelMappingIndex = _staticres->loadRawData(kEoB1CgaLevelMappingIndex, temp); + for (int i = 0; i < 5; i++) + _cgaMappingLevel[i] = _staticres->loadRawData(kEoB1CgaMappingLevel0 + i, temp); + _turnUndeadString = _staticres->loadStrings(kEoB1TurnUndeadString, temp); _npcShpData = _staticres->loadRawData(kEoB1NpcShpData, temp); @@ -1174,18 +1186,22 @@ const KyraRpgGUISettings EoBEngine::_guiSettings = { { 135, 130, 132, 133, 133, 17, 23, 20, 184, 177, 180, 184, 177, 180 } }; +const uint8 EoBEngine::_egaDefaultPalette[] = { + 0, 5, 3, 2, 10, 14, 12, 6, 4, 11, 9, 1, 0, 8, 7, 15 +}; + void DarkMoonEngine::initStaticResource() { int temp; _mainMenuStrings = _staticres->loadStrings(kEoB2MainMenuStrings, temp); _introStrings = _staticres->loadStrings(kEoB2IntroStrings, temp); _cpsFilesIntro = _staticres->loadStrings(kEoB2IntroCPSFiles, temp); - _seqIntro = new const EoBSequenceStep*[44]; + _animIntro = new const DarkMoonAnimCommand*[44]; for (int i = 0; i < 44; i++) - _seqIntro[i] = _staticres->loadEoB2SeqData(kEoB2IntroSeqData00 + i, temp); + _animIntro[i] = _staticres->loadEoB2SeqData(kEob2IntroAnimData00 + i, temp); - _shapesIntro = new const EoBShapeDef*[13]; - memset(_shapesIntro, 0, sizeof(EoBShapeDef *) * 13); + _shapesIntro = new const DarkMoonShapeDef*[13]; + memset(_shapesIntro, 0, sizeof(DarkMoonShapeDef*) * 13); _shapesIntro[0] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes00, temp); _shapesIntro[1] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes01, temp); _shapesIntro[4] = _staticres->loadEoB2ShapeData(kEoB2IntroShapes04, temp); @@ -1195,12 +1211,12 @@ void DarkMoonEngine::initStaticResource() { _creditsData = _staticres->loadRawData(kEoB2CreditsData, temp); _cpsFilesFinale = _staticres->loadStrings(kEoB2FinaleCPSFiles, temp); - _seqFinale = new const EoBSequenceStep*[21]; + _animFinale = new const DarkMoonAnimCommand*[21]; for (int i = 0; i < 21; i++) - _seqFinale[i] = _staticres->loadEoB2SeqData(kEoB2FinaleSeqData00 + i, temp); + _animFinale[i] = _staticres->loadEoB2SeqData(kEob2FinaleAnimData00 + i, temp); - _shapesFinale = new const EoBShapeDef*[13]; - memset(_shapesFinale, 0, sizeof(EoBShapeDef *) * 13); + _shapesFinale = new const DarkMoonShapeDef*[13]; + memset(_shapesFinale, 0, sizeof(DarkMoonShapeDef*) * 13); _shapesFinale[0] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes00, temp); _shapesFinale[3] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes03, temp); _shapesFinale[7] = _staticres->loadEoB2ShapeData(kEoB2FinaleShapes07, temp); @@ -1275,15 +1291,23 @@ void DarkMoonEngine::initSpells() { } } -const char *DarkMoonEngine::_palFilesIntro[] = { - "PALETTE1.PAL", // EGA: palette0.pal +const char *DarkMoonEngine::_palFilesIntroVGA[] = { + "PALETTE1.PAL", + "PALETTE3.PAL", + "PALETTE2.PAL", + "PALETTE4.PAL", + 0 +}; + +const char *DarkMoonEngine::_palFilesIntroEGA[] = { + "PALETTE0.PAL", "PALETTE3.PAL", "PALETTE2.PAL", "PALETTE4.PAL", 0 }; -const char *DarkMoonEngine::_palFilesFinale[] = { +const char *DarkMoonEngine::_palFilesFinaleVGA[] = { "FINALE_0.PAL", "FINALE_0.PAL", "FINALE_1.PAL", @@ -1296,11 +1320,28 @@ const char *DarkMoonEngine::_palFilesFinale[] = { 0 }; +const char *DarkMoonEngine::_palFilesFinaleEGA[] = { + "FINALE_0.PAL", + "FINALE_0.PAL", + "FINALE_1.PAL", + "FINALE_2.PAL", + "FINALE_3.PAL", + "FINALE_4.PAL", + "FINALE_5.PAL", + "FINALE_0.PAL", + "FINALE_0.PAL", + 0 +}; + const KyraRpgGUISettings DarkMoonEngine::_guiSettings = { { 9, 15, 95, 9, 7, { 221, 76 }, { 189, 162 }, { 95, 95 } }, { 186, 181, 183, 133, 184, 17, 23, 20, 186, 181, 183, 182, 177, 180 } }; +const uint8 DarkMoonEngine::_egaDefaultPalette[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +}; + #endif // ENABLE_EOB } // End of namespace Kyra |