[Scummvm-git-logs] scummvm master -> 52ebbfebc9d365d6b0b52e82a59ed0201b404a2f

athrxx athrxx at scummvm.org
Sun Dec 13 21:27:19 UTC 2020


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

Summary:
52ebbfebc9 KYRA: support hebrew fan translation (#2683)


Commit: 52ebbfebc9d365d6b0b52e82a59ed0201b404a2f
    https://github.com/scummvm/scummvm/commit/52ebbfebc9d365d6b0b52e82a59ed0201b404a2f
Author: Niv Baehr (bloop93 at gmail.com)
Date: 2020-12-13T22:27:16+01:00

Commit Message:
KYRA: support hebrew fan translation (#2683)

* KYRA: add hebrew to kyra.dat

* KYRA: add hebrew detection entry + fix kallak text

* KYRA: fix rigth align text for hebrew

* KYRA: restore lines lost in rebase

* KYRA: convert non-ascii to escape sequence

* KYRA: bump kyra.dat version

* KYRA: update renamed variable

* KYRA: use memset and rename variables

* KYRA: translate remaining hebrew strings

Co-authored-by: BLooperZ <blooperz at users.noreply.github.com>

Changed paths:
  A devtools/create_kyradat/escaping/convert.py
  A devtools/create_kyradat/resources/lok_dos_cd_hebrew.h
    devtools/create_kyradat/create_kyradat.cpp
    devtools/create_kyradat/games.cpp
    devtools/create_kyradat/resources.cpp
    engines/kyra/detection_tables.h
    engines/kyra/gui/gui_lok.cpp
    engines/kyra/resource/staticres.cpp
    engines/kyra/sequence/seqplayer_lok.cpp
    engines/kyra/sequence/sequences_lok.cpp
    engines/kyra/text/text.cpp
    engines/kyra/text/text_lok.cpp


diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp
index bc4c8e0257..80d55232c1 100644
--- a/devtools/create_kyradat/create_kyradat.cpp
+++ b/devtools/create_kyradat/create_kyradat.cpp
@@ -45,7 +45,7 @@
 
 
 enum {
-	kKyraDatVersion = 107
+	kKyraDatVersion = 108
 };
 
 const ExtractFilename extractFilenames[] = {
@@ -1201,6 +1201,7 @@ const TypeTable languageTable[] = {
 	{ IT_ITA, 5 },
 	{ JA_JPN, 6 },
 	{ RU_RUS, 7 },
+	{ HE_ISR, 8 },
 	{ -1, -1 }
 };
 
diff --git a/devtools/create_kyradat/escaping/convert.py b/devtools/create_kyradat/escaping/convert.py
new file mode 100644
index 0000000000..3fe332fd84
--- /dev/null
+++ b/devtools/create_kyradat/escaping/convert.py
@@ -0,0 +1,40 @@
+"""
+Allows converting header files from escape sequences and back to readable form.
+"""
+
+from string import printable
+
+def escape_char(c):
+    if chr(c) in printable:
+        return bytes([c])
+    ashex = hex(c)[2:].upper().encode()
+    return b'\\x' + ashex
+
+def encode_seq(seq):
+    try:
+        print(int(b'0x' + seq[:2], 16))
+        return bytes([int(b'0x' + seq[:2], 16)]) + seq[2:]
+    except:
+        return seq
+
+if __name__ == '__main__':
+    import argparse
+
+    parser = argparse.ArgumentParser(description='convert character escape sequence')
+    group = parser.add_mutually_exclusive_group()
+    group.add_argument('--escape', '-e', action='store_true')
+    group.add_argument('--read', '-r', action='store_true')
+    parser.add_argument('input', help='filename to read from')
+    parser.add_argument('output', help='filename to write to')
+    args = parser.parse_args()
+
+    with open(args.input, 'rb') as f:
+        data = f.read()
+
+    if args.escape:
+        with open(args.output, 'wb') as f:
+            f.write(b''.join(escape_char(c) for c in data))
+
+    else:
+        with open(args.output, 'wb') as f:
+            f.write(b''.join(encode_seq(seq) for seq in data.split(b'\\x')))
diff --git a/devtools/create_kyradat/games.cpp b/devtools/create_kyradat/games.cpp
index 676aec31fa..21303f4a6a 100644
--- a/devtools/create_kyradat/games.cpp
+++ b/devtools/create_kyradat/games.cpp
@@ -51,6 +51,7 @@ const Game kyra1Games[] = {
 	{ kKyra1, kPlatformDOS, kTalkieVersion, IT_ITA },
 	{ kKyra1, kPlatformDOS, kTalkieVersion, ES_ESP },
 	//{ kKyra1, kPlatformDOS, kTalkieVersion, RU_RUS },
+	{ kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR },
 
 	{ kKyra1, kPlatformFMTowns, kNoSpecial, EN_ANY },
 	{ kKyra1, kPlatformFMTowns, kNoSpecial, JA_JPN },
diff --git a/devtools/create_kyradat/resources.cpp b/devtools/create_kyradat/resources.cpp
index 53cc90d43f..5936f03436 100644
--- a/devtools/create_kyradat/resources.cpp
+++ b/devtools/create_kyradat/resources.cpp
@@ -47,7 +47,7 @@
 #include "resources/lok_dos_cd_italian.h"
 #include "resources/lok_dos_cd_spanish.h"
 #include "resources/lok_dos_cd_russian.h"
-
+#include "resources/lok_dos_cd_hebrew.h"
 #include "resources/lok_dos_cddemo.h"
 #include "resources/lok_dos_cddemo_english.h"
 
@@ -693,7 +693,30 @@ static const ResourceProvider resourceProviders[] = {
 	{ k1NewGameString, kKyra1, kPlatformDOS, kTalkieVersion, RU_RUS, &k1NewGameStringDOSCDRussianProvider },
 	{ k1ConfigStrings, kKyra1, kPlatformDOS, kTalkieVersion, RU_RUS, &k1ConfigStringsDOSCDRussianProvider },*/
 
+	{ k1IntroStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1IntroStringsDOSCDHebrewProvider },
+	{ k1ItemNames, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1ItemNamesDOSCDHebrewProvider },
+	{ k1TakenStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1TakenStringsDOSCDHebrewProvider },
+	{ k1PlacedStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1PlacedStringsDOSCDHebrewProvider },
+	{ k1DroppedStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1DroppedStringsDOSCDHebrewProvider },
+	{ k1NoDropStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1NoDropStringsDOSCDHebrewProvider },
+	{ k1PutDownString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1PutDownStringDOSCDHebrewProvider },
+	{ k1WaitAmuletString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1WaitAmuletStringDOSCDHebrewProvider },
+	{ k1BlackJewelString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1BlackJewelStringDOSCDHebrewProvider },
+	{ k1HealingTipString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1HealingTipStringDOSCDHebrewProvider },
+	{ k1PoisonGoneString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1PoisonGoneStringDOSCDHebrewProvider },
+	{ k1ThePoisonStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1ThePoisonStringsDOSCDHebrewProvider },
+	{ k1FluteStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1FluteStringsDOSCDHebrewProvider },
+	{ k1WispJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1WispJewelStringsDOSCDHebrewProvider },
+	{ k1MagicJewelStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1MagicJewelStringsDOSCDHebrewProvider },
+	{ k1FlaskFullString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1FlaskFullStringDOSCDHebrewProvider },
+	{ k1FullFlaskString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1FullFlaskStringDOSCDHebrewProvider },
+	{ k1OutroHomeString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1OutroHomeStringDOSCDHebrewProvider },
+	{ k1VeryCleverString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1VeryCleverStringDOSCDHebrewProvider },
+	{ k1GUIStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1GUIStringsDOSCDHebrewProvider },
+	{ k1NewGameString, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1NewGameStringDOSCDHebrewProvider },
+	{ k1ConfigStrings, kKyra1, kPlatformDOS, kTalkieVersion, HE_ISR, &k1ConfigStringsDOSCDHebrewProvider },
 	{ k1KallakWritingSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1KallakWritingSeqFMTownsProvider },
+
 	{ k1MalcolmTreeSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1MalcolmTreeSeqFMTownsProvider },
 	{ k1WestwoodLogoSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1WestwoodLogoSeqFMTownsProvider },
 	{ k1KyrandiaLogoSeq, kKyra1, kPlatformFMTowns, kNoSpecial, UNK_LANG, &k1KyrandiaLogoSeqFMTownsProvider },
diff --git a/devtools/create_kyradat/resources/lok_dos_cd_hebrew.h b/devtools/create_kyradat/resources/lok_dos_cd_hebrew.h
new file mode 100644
index 0000000000..1c7da8fe77
--- /dev/null
+++ b/devtools/create_kyradat/resources/lok_dos_cd_hebrew.h
@@ -0,0 +1,428 @@
+static const char *const k1IntroStringsDOSCDHebrew[51] = {
+	"This is a text test - 1",
+	"This is a text test - 2",
+	"\xE1\xF8\xEB\xE5\xFA, \xE7\xE9\xEC\xE9\xF7...",
+	"...\xEE\xF0\xE4\xE9\xE2\xED \xF8\xE1 \xE4\xF2\xE5\xF6\xEE\xE4 \xF9\xEC \xE4\xEE\xE9\xF1\xE8\xE9\xF7\xF0\xE9\xED \xE4\xEE\xEC\xEB\xE5\xFA\xE9\xE9\xED!",
+	"\xE4\xE1\xE4\xEC\xFA\xE9 \xE0\xE5\xFA\xEA?",
+	"\xEE\xEC\xF7\xE5\xEC\xED!",
+	"\xF9\xEE\xF2\xFA\xE9 \xE0\xFA\xEE\xE5\xEC \xF2\xEC \xE0\xE5\xE3\xE5\xFA \xE4\xE1\xF8\xE9\xE7\xE4 \xF9\xEC\xEA.",
+	"\xE5\xF6\xE9\xF4\xE9\xFA\xE9 \xF9\xFA\xE1\xE5\xE0 \xEE\xE5\xF7\xE3\xED \xE9\xE5\xFA\xF8.",
+	"\xEC\xEE\xE4 \xEC\xE9 \xEC\xEE\xE4\xF8?",
+	"\xE4\xE0\xF8\xF5 \xE4\xE6\xE5 \xF0\xFA\xE5\xF0\xE4 \xEC\xEE\xF8\xE5\xFA\xE9!",
+	"\xE4\xF7\xEC\xEC\xE4 \xE4\xF4\xF2\xE5\xE8\xE4 \xF9\xEC\xEA \xE0\xE9\xF0\xE4 \xE9\xEB\xE5\xEC\xE4 \xEC\xF2\xF6\xE5\xF8 \xE0\xE5\xFA\xE9.",
+	"\xF7\xE3\xE9\xEE\xE4, \xF7\xE8\xE5\xEC \xE0\xE5\xFA\xE9 \xF2\xEB\xF9\xE9\xE5!",
+	"\xF0\xE5\xFA\xF8 \xEC\xE9 \xF8\xF7 \xEE\xF2\xE8 \xF7\xF1\xED.",
+	"\xE0\xF0\xE9 \xEE\xFA\xEB\xE5\xE5\xEF \xEC\xF4\xE2\xE5\xF2 \xE1\xEA, \xE1\xE6\xE4 \xE0\xE9\xEF \xF1\xF4\xF7...",
+	"...\xF2\xEB\xF9\xE9\xE5 \xE0\xFA\xE4 \xE0\xE1\xEF...",
+	"...\xE0\xE1\xEC \xE0\xFA \xF2\xE9\xF0\xE9\xEA \xE0\xF0\xE9 \xEE\xF9\xE0\xE9\xF8 \xEB\xF4\xE9 \xF9\xE4\xEF.",
+	"\xE0\xE9\xF0\xF0\xE9 \xEE\xE6\xE9\xEC \xE3\xEE\xF2\xE4 \xF2\xEC \xF7\xE9\xF8\xF0\xE3\xE9\xE4...",
+	"...\xE0\xE1\xEC \xEC\xE0 \xE0\xE5\xEB\xEC \xEC\xF9\xEC\xE5\xEC \xEE\xEE\xEA \xE0\xFA \xF9\xEC\xEA.",
+	"Malcolm the Jester has broken free!",
+	"He now controls the Kyragem...",
+	"...source of all magic in Kyrandia!",
+	"",
+	"\xE0\xFA\xE4 \xEE\xF2\xE6 \xEC\xE4\xEB\xF9\xE9\xEC \xE0\xE5\xFA\xE9!",
+	"\xE0\xEA \xEC\xE0, \xE9\xF9 \xEC\xE9 \xEE\xF9\xE4\xE5 \xEE\xE9\xE5\xE7\xE3 \xE1\xF9\xE1\xE9\xEC\xEA...",
+	"\xEB\xE9\xF9\xE5\xF3 \xEE\xE1\xE3\xE7!",
+	"\xE0\xE1\xEC \xE0\xFA\xEF \xEC\xEA \xE0\xE6\xE4\xF8\xE4 \xE4\xE5\xE2\xF0\xFA.",
+	"\xE0\xEC \xFA\xF7\xF4\xE5\xF5 \xF2\xEC \xE4\xF2\xF5 \xE4\xE6\xE4!",
+	"\xE0\xEC \xFA\xE8\xF4\xF1 \xF2\xEC \xE4\xF2\xF5 \xE4\xE6\xE4 \xF1\xF0\xE0\xE9 \xF7\xE8\xEF!",
+	"\xE1\xE5!",
+	"\xE6\xE4 \xEE\xF6\xE7\xE9\xF7 \xE9\xE5\xFA\xF8 \xEB\xEB\xE4...",
+	"...\xEC\xE0 \xEB\xEA?",
+	"\xE7\xE4 \xE7\xE4 \xE7\xE4...",
+	"\xE4\xE0\xE9\xEF \xE0\xF6\xE1\xF2\xE5\xFA \xE3\xE1\xF8 \xF0\xF4\xEC\xE0?",
+	"\xE8\xE5\xE1 \xEC\xE4\xE9\xE5\xFA \xE1\xE7\xE9\xE9\xED!",
+	"\xE1\xF8\xF0\xE3\xE5\xEF!",
+	"\xF1\xE1\xE0! \xF2\xF9\xE9\xF0\xE5 \xE6\xE0\xFA!",
+	"\xEC\xE0! \xE0\xFA\xE4 \xF2\xF9\xE9\xFA \xE6\xE0\xFA!",
+	"\xE9\xE7\xE9 \xE4\xEE\xEC\xEA \xE1\xF8\xF0\xE3\xE5\xEF!",
+	"\xEC\xE7\xE9\xE9 \xE4\xEE\xE9\xF1\xE8\xE9\xF7\xF0\xE9\xED \xE4\xEE\xEC\xEB\xE5\xFA\xE9\xE9\xED!",
+	"\xE5\xE1\xEB\xEF, \xE4\xE1\xE4 \xF0\xF6\xE0 \xEC\xF9\xF7\xED \xE0\xFA \xF7\xE9\xF8\xF0\xE3\xE9\xE4!",
+	"\xF8\xF2\xE9\xE5\xEF \xEE\xF6\xE5\xE9\xEF!",
+	"\xEC\xE4\xEB\xF8\xE6\xE4 \xE4\xEE\xEC\xEB\xE5\xFA\xE9\xFA \xE4\xF8\xE0\xF9\xE5\xF0\xE4 \xF9\xEC\xE9...",
+	"\xE0\xF0\xE9 \xEE\xEE\xF0\xE4 \xE0\xFA \xE4\xF1\xF0\xE3\xEC\xE9\xED \xEC\xF0\xF2\xEC\xE9\xE9\xED \xE4\xF8\xF9\xEE\xE9\xE5\xFA \xF9\xEC \xF7\xE9\xF8\xF0\xE3\xE9\xE4!",
+	"\xEB\xEC \xE4\xEB\xE1\xE5\xE3, \xE1\xF8\xF0\xE3\xE5\xEF!",
+	"\xE4\xE0\xF8\xF5 \xE4\xF4\xF1\xE9\xF7\xE4 \xEC\xE4\xFA\xE9\xE9\xF4\xE7...",
+	"\xE5\xE7\xE1\xF8\xE9\xEA \xF9\xE1\xE5 \xEC\xF2\xF6\xEE\xED!",
+	"\xE1\xF8\xE9\xEF \xE4\xE9\xF7\xF8\xE4...",
+	"\xEE\xEC\xF7\xE5\xEC\xED \xE4\xF6\xEC\xE9\xE7 \xEC\xE4\xF9\xFA\xE7\xF8\xF8!",
+	"\xE1\xF7\xF8\xE5\xE1 \xE4\xE5\xE0 \xE9\xE2\xE9\xF2 \xE0\xEC\xE9\xE9.",
+	"\xF0\xE0 \xF2\xE6\xF8\xE9 \xEC\xE1\xF8\xF0\xE3\xE5\xEF...",
+	""
+};
+
+static const StringListProvider k1IntroStringsDOSCDHebrewProvider = { ARRAYSIZE(k1IntroStringsDOSCDHebrew), k1IntroStringsDOSCDHebrew };
+
+static const char *const k1ItemNamesDOSCDHebrew[107] = {
+	"\xF0\xE5\xF4\xEA",
+	"\xE0\xE7\xEC\xEE\xE4",
+	"\xFA\xF8\xF9\xE9\xF9",
+	"\xE9\xE4\xEC\xE5\xED",
+	"\xE1\xF8\xF7\xFA",
+	"\xF4\xF0\xE9\xF0\xE4",
+	"\xE0\xE5\xE3\xED",
+	"\xF4\xE8\xE3\xE4",
+	"\xF1\xF4\xE9\xF8",
+	"\xEC\xF9\xED",
+	"\xE8\xE5\xF4\xE6",
+	"\xF9\xE4\xED",
+	"\xE0\xE1\xEF \xF9\xEE\xF9",
+	"\xE0\xE1\xEF \xE9\xF8\xE7",
+	"\xE0\xE1\xEF \xF7\xF9\xFA",
+	"\xE0\xE1\xEF \xF9\xE5\xE0\xE1\xFA",
+	"\xF9\xE5\xF9\xF0\xE4",
+	"\xF6\xE1\xF2\xE5\xF0\xE9",
+	"\xF1\xE7\xEC\xE1",
+	"\xF9\xE5\xF9\xF0\xFA \xEB\xF1\xF3",
+	"\xF4\xF1\xEC\xE5\xEF \xEB\xF1\xF3",
+	"\xEE\xE8\xE1\xF2 \xEB\xF1\xF3",
+	"\xEE\xE8\xE1\xF2 \xE6\xE4\xE1",
+	"\xE8\xE1\xF2\xFA \xE6\xE4\xE1",
+	"\xE2\xE1\xE9\xF2 \xEE\xEC\xEB\xE5\xFA\xE9",
+	"\xE0\xF6\xE8\xF8\xE5\xE1\xEC",
+	"\xE1\xEC\xE5\xE8",
+	"\xE0\xE2\xE5\xE6",
+	"\xE2\xF8\xE2\xF8\xE9 \xE0\xF9 \xF7\xE5\xF8\xF0\xE9-\xF2\xE3",
+	"\xE2\xF8\xE2\xF8\xE9 \xE0\xF9",
+	"\xE2\xF8\xE2\xF8\xE9 \xE0\xF9",
+	"\xE2\xF8\xE2\xF8\xE9 \xE0\xF9",
+	"\xE2\xF8\xE2\xF8\xE9 \xE0\xF9",
+	"\xE2\xF8\xE2\xF8\xE9 \xE0\xF9",
+	"\xE3\xE2",
+	"\xE0\xE3\xF8\xE4",
+	"\xF9\xE5\xF7 \xE8\xEC\xE4",
+	"\xF2\xF6\xED",
+	"\xFA\xF4\xE5\xE7",
+	"\xEC\xE9\xE1\xFA \xFA\xF4\xE5\xE7",
+	"\xE0\xE5\xEB\xEE\xF0\xE9\xE5\xFA",
+	"\xF4\xE8\xF8\xE9\xE4",
+	"\xF4\xFA\xF7",
+	"\xE2\xE5\xEC\xE4",
+	"\xEE\xF1\xE5\xF8",
+	"'\xF2\xF0\xE7",
+	"\xF0\xE5\xF6\xE4",
+	"\xE1\xE9\xF6\xE4",
+	"\xF2\xEC\xE4",
+	"\xFA\xEC\xFA\xEF",
+	"\xEB\xE5\xEB\xE1 \xF0\xE5\xF4\xEC",
+	"\xEB\xE3\xE5\xF8 \xE1\xE3\xE5\xEC\xE7",
+	"\xE3\xEE\xF2\xE4",
+	"\xF8\xE0\xE9",
+	"\xF4\xFA\xE9\xFA \xF7\xF8\xE7",
+	"\xE0\xE1\xE5\xE1",
+	"\xF9\xF2\xE5\xEF \xE7\xE5\xEC",
+	"\xEE\xF4\xFA\xE7 \xE1\xF8\xE6\xEC",
+	"\xEE\xF4\xFA\xE7 \xE9\xF8\xF7\xEF",
+	"\xEE\xF4\xFA\xE7 \xE1\xE6\xEC\xFA",
+	"\xF9\xE9\xF7\xE5\xE9 \xE0\xE3\xE5\xED",
+	"\xF9\xE9\xF7\xE5\xE9 \xE0\xE3\xE5\xED",
+	"\xF9\xE9\xF7\xE5\xE9 \xEB\xE7\xE5\xEC",
+	"\xF9\xE9\xF7\xE5\xE9 \xEB\xE7\xE5\xEC",
+	"\xF9\xE9\xF7\xE5\xE9 \xF6\xE4\xE5\xE1",
+	"\xF9\xE9\xF7\xE5\xE9 \xF6\xE4\xE5\xE1",
+	"\xF9\xE9\xF7\xE5\xE9 \xE9\xF8\xE5\xF7",
+	"\xF9\xE9\xF7\xE5\xE9 \xEB\xFA\xE5\xED",
+	"\xF9\xE9\xF7\xE5\xE9 \xF1\xE2\xE5\xEC",
+	"\xF9\xE9\xF7\xE5\xE9 \xE4\xF7\xF9\xFA \xE1\xF2\xF0\xEF",
+	"\xEE\xE9\xED \xEE\xFA\xE5\xF7\xE9\xED",
+	"\xEE\xE9\xED \xEE\xFA\xE5\xF7\xE9\xED",
+	"\xEE\xE9\xED \xEE\xEC\xE5\xE7\xE9\xED",
+	"\xEE\xE9\xED \xEE\xEC\xE5\xE7\xE9\xED",
+	"\xEE\xE9\xED \xEE\xE9\xF0\xF8\xEC\xE9\xE9\xED",
+	"\xEE\xE9\xED \xEE\xE9\xF0\xF8\xEC\xE9\xE9\xED",
+	"\xEE\xE9\xED \xF7\xF1\xE5\xEE\xE9\xED",
+	"\xEE\xE9\xED \xF7\xF1\xE5\xEE\xE9\xED",
+	"\xE1\xF7\xE1\xE5\xF7\xE5\xEF \xF8\xE9\xF7",
+	"\xE1\xF7\xE1\xE5\xF7\xE5\xEF \xF8\xE9\xF7",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xEE\xE2\xE9\xEC\xE4",
+	"\xF4\xE9\xF1\xFA \xF7\xEC\xF3",
+	"\xF4\xE9\xF1\xFA \xF7\xEC\xF3",
+	"\xF4\xE9\xF1\xFA \xF7\xEC\xF3",
+	"\xF4\xE9\xF1\xFA \xF7\xEC\xF3",
+	"\xF4\xE9\xF1\xFA \xF7\xEC\xF3",
+	"\xE0\xE1\xEF \xEB\xF9\xF3 \xE0\xE3\xE5\xEE\xE4",
+	"\xE0\xE1\xEF \xEB\xF9\xF3 \xEB\xFA\xE5\xEE\xE4",
+	"\xE0\xE1\xEF \xEB\xF9\xF3 \xF6\xE4\xE5\xE1\xE4",
+	"\xE0\xE1\xEF \xEB\xF9\xF3 \xE9\xF8\xE5\xF7\xE4",
+	"\xE0\xE1\xEF \xEB\xF9\xF3 \xEB\xE7\xE5\xEC\xE4-\xE9\xF8\xE5\xF7\xE4",
+	"\xE0\xE1\xEF \xEB\xF9\xF3 \xEB\xE7\xE5\xEC\xE4",
+	"\xE0\xE1\xEF \xEB\xF9\xF3 \xF1\xE2\xE5\xEC\xE4",
+	"\xF1\xEC\xF2 \xEB\xE1\xE3",
+	"\xEB\xFA\xF8 \xEE\xEC\xEB\xE5\xFA",
+	"\xF9\xF8\xE1\xE9\xE8 \xEE\xEC\xEB\xE5\xFA",
+	"\xEE\xF4\xFA\xE7 \xE6\xE4\xE1",
+	"\xF4\xF8\xE9\xE8 \xEC\xE0 \xEE\xE5\xEB\xF8"
+};
+
+static const StringListProvider k1ItemNamesDOSCDHebrewProvider = { ARRAYSIZE(k1ItemNamesDOSCDHebrew), k1ItemNamesDOSCDHebrew };
+
+static const char *const k1TakenStringsDOSCDHebrew[2] = {
+	"\xEC\xF7\xE7\xFA\xED ",
+	"\xEC\xF7\xE7\xFA\xED "
+};
+
+static const StringListProvider k1TakenStringsDOSCDHebrewProvider = { ARRAYSIZE(k1TakenStringsDOSCDHebrew), k1TakenStringsDOSCDHebrew };
+
+static const char *const k1PlacedStringsDOSCDHebrew[1] = {
+	"\xE4\xF0\xE7\xFA\xED "
+};
+
+static const StringListProvider k1PlacedStringsDOSCDHebrewProvider = { ARRAYSIZE(k1PlacedStringsDOSCDHebrew), k1PlacedStringsDOSCDHebrew };
+
+static const char *const k1DroppedStringsDOSCDHebrew[1] = {
+	"\xF9\xEE\xE8\xFA\xED "
+};
+
+static const StringListProvider k1DroppedStringsDOSCDHebrewProvider = { ARRAYSIZE(k1DroppedStringsDOSCDHebrew), k1DroppedStringsDOSCDHebrew };
+
+static const char *const k1NoDropStringsDOSCDHebrew[2] = {
+	"\xEC\xE0 \xF0\xE9\xFA\xEF \xEC\xF9\xEE\xE5\xE8 \xF2\xE5\xE3 \xE7\xF4\xF6\xE9\xED \xE1\xE6\xE9\xF8\xE4 \xE4\xE6\xE5.",
+	"\xEC\xE0 \xF0\xE9\xFA\xEF \xEC\xF9\xE9\xED \xE0\xFA \xE6\xE4 \xEB\xE0\xEF."
+};
+
+static const StringListProvider k1NoDropStringsDOSCDHebrewProvider = { ARRAYSIZE(k1NoDropStringsDOSCDHebrew), k1NoDropStringsDOSCDHebrew };
+
+static const char *const k1PutDownStringDOSCDHebrew[1] = {
+	"\xE0\xE5\xEC\xE9 \xEE\xE5\xE8\xE1 \xFA\xE7\xE9\xEC\xE4 \xF9\xE0\xF0\xE9\xE7 \xE0\xFA \xE6\xE4."
+};
+
+static const StringListProvider k1PutDownStringDOSCDHebrewProvider = { ARRAYSIZE(k1PutDownStringDOSCDHebrew), k1PutDownStringDOSCDHebrew };
+
+static const char *const k1WaitAmuletStringDOSCDHebrew[1] = {
+	"\xE0\xF0\xE9 \xEE\xF0\xE9\xE7 \xF9\xF2\xEC\xE9\xE9 \xEC\xE4\xEE\xFA\xE9\xEF \xF9\xEB\xE5\xE7\xE5\xFA\xE9\xE5 \xF9\xEC \xE4\xF7\xEE\xF2 \xF9\xEC\xE9 \xE9\xE7\xE6\xF8\xE5."
+};
+
+static const StringListProvider k1WaitAmuletStringDOSCDHebrewProvider = { ARRAYSIZE(k1WaitAmuletStringDOSCDHebrew), k1WaitAmuletStringDOSCDHebrew };
+
+static const char *const k1BlackJewelStringDOSCDHebrew[1] = {
+	"\xE6\xE5 \xE0\xE1\xEF \xE7\xEF, \xE0\xE1\xEC \xEE\xE3\xE5\xF2 \xE4\xE9\xE0 \xF9\xE7\xE5\xF8\xE4?"
+};
+
+static const StringListProvider k1BlackJewelStringDOSCDHebrewProvider = { ARRAYSIZE(k1BlackJewelStringDOSCDHebrew), k1BlackJewelStringDOSCDHebrew };
+
+static const char *const k1HealingTipStringDOSCDHebrew[1] = {
+	"\xE1\xE7\xE9\xE9, \xE6\xE4 \xF2\xF9\xE5\xE9 \xEC\xE4\xE9\xE5\xFA \xF9\xE9\xEE\xE5\xF9\xE9 \xE0\xED \xE7\xEC\xE9\xEC\xE4 \xE0\xF4\xE2\xF2."
+};
+
+static const StringListProvider k1HealingTipStringDOSCDHebrewProvider = { ARRAYSIZE(k1HealingTipStringDOSCDHebrew), k1HealingTipStringDOSCDHebrew };
+
+static const char *const k1PoisonGoneStringDOSCDHebrew[2] = {
+	"\xEE\xE3\xE4\xE9\xED!",
+	"\xE4\xF9\xF4\xF2\xE5\xFA \xE4\xF8\xF2\xEC \xF0\xF2\xEC\xEE\xE5 \xEB\xEC\xE0 \xE4\xE9\xE5!"
+};
+
+static const StringListProvider k1PoisonGoneStringDOSCDHebrewProvider = { ARRAYSIZE(k1PoisonGoneStringDOSCDHebrew), k1PoisonGoneStringDOSCDHebrew };
+
+static const char *const k1ThePoisonStringsDOSCDHebrew[4] = {
+	"\xE4\xE0\xF8\xF1...",
+	"\xEC\xE0 \xEE\xF6\xEC\xE9\xE7 \xEC\xF0\xF9\xE5\xED...",
+	"\xE0\xF0\xE9 \xEC\xE0 \xEE\xF8\xE2\xE9\xF9 \xE8\xE5\xE1 \xEB\xEC \xEB\xEA...",
+	"\xE4\xF0\xE7\xF9 \xE4\xE6\xE4\r\xE1\xE5\xE3\xE0\xE9 \xE0\xF8\xF1\xE9!"
+};
+
+static const StringListProvider k1ThePoisonStringsDOSCDHebrewProvider = { ARRAYSIZE(k1ThePoisonStringsDOSCDHebrew), k1ThePoisonStringsDOSCDHebrew };
+
+static const char *const k1FluteStringsDOSCDHebrew[40] = {
+	"\xEC\xE0 \xF0\xF9\xEE\xF2 \xEE\xF8\xF9\xE9\xED \xE1\xEE\xE9\xE5\xE7\xE3.",
+	"\xE4\xFA\xE5 \xE4\xE0\xE7\xF8\xE5\xEF \xE1\xE4\xE7\xEC\xE8 \xE4\xE9\xE4 \xE2\xE1\xE5\xE4!",
+	"\xBA",
+	"\xBA",
+	"",
+	"\x01",
+	"\x01\xB3",
+	"\xB3",
+	"\x06\x04\x08\x03\x06",
+	"\x08\x01\x01",
+	"\x02\x04",
+	"\x05\x02",
+	"\x08\x01\x01",
+	"\x11",
+	"5",
+	"Y",
+	"",
+	"",
+	"",
+	"",
+	"\x15",
+	"9",
+	"]",
+	"",
+	"",
+	"",
+	"",
+	"\x07",
+	")",
+	"M",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"SHAPE_HORZ_REV",
+	"SHAPE_VERT_REV"
+};
+
+static const StringListProvider k1FluteStringsDOSCDHebrewProvider = { ARRAYSIZE(k1FluteStringsDOSCDHebrew), k1FluteStringsDOSCDHebrew };
+
+static const char *const k1WispJewelStringsDOSCDHebrew[2] = {
+	"\xEC\xE0 \xEE\xEE\xF9 \xEE\xFA\xE7\xF9\xF7 \xEC\xE9 \xEB\xF8\xE2\xF2.",
+	"\xE0\xE5\xEC\xE9 \xEE\xE5\xE8\xE1 \xFA\xE7\xE9\xEC\xE4 \xF9\xE0\xF0\xE9\xE7 \xE0\xFA \xE6\xE4."
+};
+
+static const StringListProvider k1WispJewelStringsDOSCDHebrewProvider = { ARRAYSIZE(k1WispJewelStringsDOSCDHebrew), k1WispJewelStringsDOSCDHebrew };
+
+static const char *const k1MagicJewelStringsDOSCDHebrew[1] = {
+	"\xE6\xE5 \xE4\xE9\xFA\xE4 \xE4\xF8\xE2\xF9\xE4 \xEE\xE5\xE6\xF8\xE4."
+};
+
+static const StringListProvider k1MagicJewelStringsDOSCDHebrewProvider = { ARRAYSIZE(k1MagicJewelStringsDOSCDHebrew), k1MagicJewelStringsDOSCDHebrew };
+
+static const char *const k1FlaskFullStringDOSCDHebrew[1] = {
+	"\xE4\xE1\xF7\xE1\xE5\xF7\xE5\xEF \xEB\xE1\xF8 \xEE\xEC\xE0."
+};
+
+static const StringListProvider k1FlaskFullStringDOSCDHebrewProvider = { ARRAYSIZE(k1FlaskFullStringDOSCDHebrew), k1FlaskFullStringDOSCDHebrew };
+
+static const char *const k1FullFlaskStringDOSCDHebrew[4] = {
+	"\xE4\xE1\xF7\xE1\xE5\xF7\xE5\xEF \xEE\xEC\xE0 \xF2\xEB\xF9\xE9\xE5\r\xE1\xEE\xE9\xED \xEE\xFA\xE5\xF7\xE9\xED \xE5\xEE\xE1\xF2\xE1\xF2\xE9\xED.",
+	"\xE4\xE1\xF7\xE1\xE5\xF7\xE5\xEF \xEE\xEC\xE0 \xF2\xEB\xF9\xE9\xE5\r\xE1\xEE\xE9\xED \xEE\xEC\xE5\xE7\xE9\xED.",
+	"\xE4\xE1\xF7\xE1\xE5\xF7\xE5\xEF \xEE\xEC\xE0 \xF2\xEB\xF9\xE9\xE5\r\xE1\xEE\xE9\xED \xEE\xE9\xF0\xF8\xEC\xE9\xE9\xED.",
+	"\xEE\xE9\xED \xF7\xF1\xE5\xEE\xE9\xED."
+};
+
+static const StringListProvider k1FullFlaskStringDOSCDHebrewProvider = { ARRAYSIZE(k1FullFlaskStringDOSCDHebrew), k1FullFlaskStringDOSCDHebrew };
+
+static const char *const k1OutroHomeStringDOSCDHebrew[1] = {
+	"\xE1\xE9\xFA"
+};
+
+static const StringListProvider k1OutroHomeStringDOSCDHebrewProvider = { ARRAYSIZE(k1OutroHomeStringDOSCDHebrew), k1OutroHomeStringDOSCDHebrew };
+
+static const char *const k1VeryCleverStringDOSCDHebrew[1] = {
+	"\xF9\xF0\xE5\xEF \xE1\xE9\xE5\xFA\xF8!  \xE0\xE1\xEC \xE4\xEE\xE0\xEE\xF6\xE9\xED \xE4\xE0\xE5\xEE\xEC\xEC\xE9\xED \xE4\xEC\xEC\xE5 \xEC\xE7\xE9\xF0\xED."
+};
+
+static const StringListProvider k1VeryCleverStringDOSCDHebrewProvider = { ARRAYSIZE(k1VeryCleverStringDOSCDHebrew), k1VeryCleverStringDOSCDHebrew };
+
+static const char *const k1GUIStringsDOSCDHebrew[81] = {
+	"\xE3\xE1\xF8\xE9 \xE9\xEE\xE9 \xF7\xE9\xF8\xF0\xE3\xE9\xE4",
+	"\xE8\xF2\xE9\xF0\xFA \xEE\xF9\xE7\xF7",
+	"\xF9\xEE\xE9\xF8\xFA \xE4\xEE\xF9\xE7\xF7",
+	"\xE1\xF7\xF8\xE9 \xEE\xF9\xE7\xF7",
+	"\xE9\xF6\xE9\xE0\xE4 \xEE\xE4\xEE\xF9\xE7\xF7",
+	"\xE7\xE6\xF8\xE4 \xEC\xEE\xF9\xE7\xF7",
+	"\xE1\xF7\xF8\xE9 \xEE\xF9\xE7\xF7",
+	"\xE0\xE9\xE6\xE4 \xEE\xF9\xE7\xF7 \xEC\xE8\xF2\xE5\xEF?",
+	"\xE1\xE7\xF8\xE5 \xE4\xE9\xEB\xEF \xEC\xF9\xEE\xE5\xF8:",
+	"] \xEE\xF9\xE1\xF6\xFA \xF8\xE9\xF7\xE4 [",
+	"\xE1\xE9\xE8\xE5\xEC",
+	"\xE4\xE6\xE9\xF0\xE5 \xFA\xE9\xE0\xE5\xF8 \xF9\xEC \xE4\xEE\xF9\xE7\xF7 \xE4\xF9\xEE\xE5\xF8:",
+	"\xF9\xEE\xE9\xF8\xE4",
+	"\xF0\xE5\xE7 \xF2\xEC \xEE\xF9\xEB\xE1\xEA \xE1\xF9\xEC\xE5\xED, \xE1\xF8\xF0\xE3\xE5\xEF.",
+	"\xE4\xE0\xED \xE0\xFA\xED \xE1\xE8\xE5\xE7\xE9\xED \xF9\xE1\xF8\xF6\xE5\xF0\xEB\xED \xEC\xF6\xE0\xFA?",
+	"XXX",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"XXX",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"XXXXXXX",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"XXXXXXXXX",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"XXXXXXXXXXXX",
+	"",
+	"",
+	"",
+	"",
+	"",
+	"\xFA\xF4\xF8\xE9\xE8 \xF8\xE0\xF9\xE9",
+	"\xF4\xE5\xF2\xEC",
+	"\xEB\xE1\xE5\xE9",
+	"\xEB\xEF",
+	"\xEC\xE0",
+	"\xCD\x0E\x17""+""\xD5\x0E\x17""+""\xDA\x0E\x17""+""\xE1\x0E\x17""+""\xE6\x0E\x17""+""\xEE\x0E\x17""+""\xF8\x0E\x17""+""\x03\x0F\x17""+""\x10\x0F\x17""+""\x18\x0F\x17""+""\x1F\x0F\x17""+$""\x0F\x17""+\xEE\xE4\xE9\xF8\xE5\xFA \xE4\xEC\xE9\xEB\xE4 ",
+	"\xEE\xE4\xE9\xF8\xE5\xFA \xE8\xF7\xF1\xE8 ",
+	"\xEE\xE5\xE6\xE9\xF7\xE4 ",
+	"\xF6\xEC\xE9\xEC\xE9\xED ",
+	"\xF7\xE5\xEC / \xE8\xF7\xF1\xE8 "
+};
+
+static const StringListProvider k1GUIStringsDOSCDHebrewProvider = { ARRAYSIZE(k1GUIStringsDOSCDHebrew), k1GUIStringsDOSCDHebrew };
+
+static const char *const k1NewGameStringDOSCDHebrew[1] = {
+	"] \xE4\xFA\xE7\xEC\xFA \xEE\xF9\xE7\xF7 \xE7\xE3\xF9 ["
+};
+
+static const StringListProvider k1NewGameStringDOSCDHebrewProvider = { ARRAYSIZE(k1NewGameStringDOSCDHebrew), k1NewGameStringDOSCDHebrew };
+
+static const char *const k1ConfigStringsDOSCDHebrew[12] = {
+	"\xE0\xE8\xE9\xFA \xE1\xE9\xE5\xFA\xF8",
+	"\xE0\xE8\xE9\xFA",
+	"\xF8\xE2\xE9\xEC\xE4",
+	"\xEE\xE4\xE9\xF8\xE4",
+	"\xEE\xE4\xE9\xF8\xE4 \xE1\xE9\xE5\xFA\xF8",
+	"\xE8\xF7\xF1\xE8 \xE1\xEC\xE1\xE3",
+	"\xF7\xE5\xEC \xE1\xEC\xE1\xE3",
+	"\xF7\xE5\xEC \xE5\xE8\xF7\xF1\xE8",
+	"\xE0\xE8\xE9\xFA \xE1\xE9\xE5\xFA\xF8",
+	"\xF8\xE2\xE9\xEC\xE4",
+	"\xEE\xE4\xE9\xF8\xE4",
+	"\xEC\xE7\xE9\xF6\xE4"
+};
+
+static const StringListProvider k1ConfigStringsDOSCDHebrewProvider = { ARRAYSIZE(k1ConfigStringsDOSCDHebrew), k1ConfigStringsDOSCDHebrew };
+
diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h
index a125b0ff57..cc8502c8e7 100644
--- a/engines/kyra/detection_tables.h
+++ b/engines/kyra/detection_tables.h
@@ -341,6 +341,20 @@ const KYRAGameDescription adGameDescs[] = {
 		},
 		KYRA1_CD_FLAGS
 	},
+
+	{ // HEBREW FAN TRANSLATION
+		{
+			"kyra1",
+			"CD",
+			AD_ENTRY1("GEMCUT.PAK", "20c141be61ed01bfda09197e0452bcf7"),
+			Common::HE_ISR,
+			Common::kPlatformDOS,
+			ADGF_CD,
+			GUIO4(GUIO_MIDIADLIB, GUIO_MIDIMT32, GUIO_MIDIPCSPK, GUIO_RENDERVGA)
+		},
+		KYRA1_CD_FLAGS
+	},
+
 	{
 		{
 			"kyra1",
diff --git a/engines/kyra/gui/gui_lok.cpp b/engines/kyra/gui/gui_lok.cpp
index 7772ac4325..6c0d60dd0d 100644
--- a/engines/kyra/gui/gui_lok.cpp
+++ b/engines/kyra/gui/gui_lok.cpp
@@ -357,7 +357,7 @@ void GUI_LoK::setGUILabels() {
 	int menuLabelGarbageOffset = 0;
 
 	if (_vm->gameFlags().isTalkie) {
-		if (_vm->gameFlags().lang == Common::EN_ANY)
+		if (_vm->gameFlags().lang == Common::EN_ANY || _vm->gameFlags().lang == Common::HE_ISR)
 			offset = 52;
 		else if (_vm->gameFlags().lang == Common::DE_DEU)
 			offset = 30;
diff --git a/engines/kyra/resource/staticres.cpp b/engines/kyra/resource/staticres.cpp
index d9ff76bbef..a6c1bdc0ee 100644
--- a/engines/kyra/resource/staticres.cpp
+++ b/engines/kyra/resource/staticres.cpp
@@ -39,7 +39,7 @@
 
 namespace Kyra {
 
-#define RESFILE_VERSION 107
+#define RESFILE_VERSION 108
 
 namespace {
 bool checkKyraDat(Common::SeekableReadStream *file) {
@@ -94,6 +94,7 @@ const IndexTable iLanguageTable[] = {
 	{ Common::IT_ITA, 5 },
 	{ Common::JA_JPN, 6 },
 	{ Common::RU_RUS, 7 },
+	{ Common::HE_ISR, 8 },
 	{ -1, -1 }
 };
 
@@ -964,6 +965,8 @@ void KyraEngine_LoK::loadMainScreen(int page) {
 		_screen->loadBitmap("MAIN_ITA.CPS", page, page, 0);
 	else if (_flags.lang == Common::RU_RUS)
 		_screen->loadBitmap("MAIN_ENG.CPS", page, page, 0);
+	else if (_flags.lang == Common::HE_ISR)
+		_screen->loadBitmap("MAIN_HEB.CPS", page, page, 0);
 	else
 		warning("no main graphics file found");
 
diff --git a/engines/kyra/sequence/seqplayer_lok.cpp b/engines/kyra/sequence/seqplayer_lok.cpp
index 2ce2e9da7f..3c72affc6d 100644
--- a/engines/kyra/sequence/seqplayer_lok.cpp
+++ b/engines/kyra/sequence/seqplayer_lok.cpp
@@ -602,6 +602,9 @@ bool SeqPlayer::playSequence(const uint8 *seqData, bool skipSeq) {
 	memset(_seqMovies, 0, sizeof(_seqMovies));
 
 	_screen->_curPage = 0;
+	char revBuffer[384];
+	memset(revBuffer, 0, sizeof(revBuffer));
+	int charIdx = 0;
 	while (!_seqQuitFlag && !_vm->shouldQuit()) {
 		if (skipSeq && _vm->seq_skipSequence()) {
 			while (1) {
@@ -619,17 +622,36 @@ bool SeqPlayer::playSequence(const uint8 *seqData, bool skipSeq) {
 			if (_seqDisplayedTextTimer < _system->getMillis()) {
 				char charStr[3];
 				charStr[0] = _vm->seqTextsTable()[_seqDisplayedText][_seqDisplayedChar];
+				if (_vm->gameFlags().lang == Common::HE_ISR) {
+					for (int k = charIdx; k > 0; k--) {
+						revBuffer[k] = revBuffer[k - 1];
+					}
+					revBuffer[0] = charStr[0];
+					if (!charIdx) {
+						int w = _screen->getTextWidth(_vm->seqTextsTable()[_seqDisplayedText] + _seqDisplayedChar);
+						_seqDisplayedTextX += w;
+					}
+					charIdx++;
+				}
 				charStr[1] = charStr[2] = '\0';
 				if (_vm->gameFlags().lang == Common::JA_JPN)
 					charStr[1] = _vm->seqTextsTable()[_seqDisplayedText][++_seqDisplayedChar];
-				_screen->printText(charStr, _seqDisplayedTextX, 180, 0xF, 0xC);
-				_seqDisplayedTextX += _screen->getCharWidth((uint8)charStr[0]);
+				if (_vm->gameFlags().lang == Common::HE_ISR) {
+					_seqDisplayedTextX -= _screen->getCharWidth((uint8)charStr[0]);
+					_screen->printText(revBuffer, _seqDisplayedTextX, 180, 0xF, 0xC);
+				} else {
+					_screen->printText(charStr, _seqDisplayedTextX, 180, 0xF, 0xC);
+					_seqDisplayedTextX += _screen->getCharWidth((uint8)charStr[0]);
+				}
 				++_seqDisplayedChar;
 
-				if (_vm->seqTextsTable()[_seqDisplayedText][_seqDisplayedChar] == '\0')
+				if (_vm->seqTextsTable()[_seqDisplayedText][_seqDisplayedChar] == '\0') {
 					_seqDisplayedTextTimer = 0xFFFFFFFF;
-				else
+					memset(revBuffer, 0, sizeof(revBuffer));
+					charIdx = 0;
+				} else {
 					_seqDisplayedTextTimer = _system->getMillis() + 1000 / ((_vm->gameFlags().lang == Common::FR_FRA) ? 120 : 60);
+				}
 			}
 		}
 
diff --git a/engines/kyra/sequence/sequences_lok.cpp b/engines/kyra/sequence/sequences_lok.cpp
index 97e5c4c7a9..62bec398f4 100644
--- a/engines/kyra/sequence/sequences_lok.cpp
+++ b/engines/kyra/sequence/sequences_lok.cpp
@@ -266,6 +266,8 @@ bool KyraEngine_LoK::seq_introStory() {
 		_screen->loadBitmap("TEXT_ENG.CPS", 3, 3, &_screen->getPalette(0));
 	else if (_flags.lang == Common::RU_RUS && _flags.isTalkie)
 		_screen->loadBitmap("TEXT_ENG.CPS", 3, 3, &_screen->getPalette(0));
+	else if (_flags.lang == Common::HE_ISR)
+		_screen->loadBitmap("TEXT_HEB.CPS", 3, 3, &_screen->getPalette(0));
 	else
 		warning("no story graphics file found");
 
diff --git a/engines/kyra/text/text.cpp b/engines/kyra/text/text.cpp
index e7b5b0a479..4ffdffe800 100644
--- a/engines/kyra/text/text.cpp
+++ b/engines/kyra/text/text.cpp
@@ -204,6 +204,15 @@ void TextDisplayer::printTalkTextMessage(const char *text, int x, int y, uint8 c
 }
 
 void TextDisplayer::printText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2) {
+	char revBuffer[384];
+	memset(revBuffer, 0, sizeof(revBuffer));
+	if (_vm->gameFlags().lang == Common::HE_ISR) {
+		int len = strlen(str);
+		for (int i = 0; i < len; i++) {
+			revBuffer[i] = str[len - i - 1];
+		}
+		str = revBuffer;
+	}
 	uint8 colorMap[] = { 0, 15, 12, 12 };
 	colorMap[3] = c1;
 	_screen->setTextColor(colorMap, 0, 3);
diff --git a/engines/kyra/text/text_lok.cpp b/engines/kyra/text/text_lok.cpp
index f89bd9a4c2..6146778e85 100644
--- a/engines/kyra/text/text_lok.cpp
+++ b/engines/kyra/text/text_lok.cpp
@@ -350,16 +350,28 @@ void KyraEngine_LoK::drawSentenceCommand(const char *sentence, int color) {
 		_startSentencePalIndex = color;
 	}
 
-	_text->printText(sentence, 8, 143, 0xFF, _flags.platform == Common::kPlatformAmiga ? 19 : 12, 0);
+	if (_flags.lang != Common::HE_ISR) {
+		_text->printText(sentence, 8, 143, 0xFF, _flags.platform == Common::kPlatformAmiga ? 19 : 12, 0);
+	} else {
+		_screen->_charSpacing = -2;
+		_text->printText(sentence, 311 - _screen->getTextWidth(sentence), 143, 0xFF, _flags.platform == Common::kPlatformAmiga ? 19 : 12, 0);
+		_screen->_charSpacing = 0;
+	}
 	setTextFadeTimerCountdown(15);
 	_fadeText = false;
 }
 
 void KyraEngine_LoK::updateSentenceCommand(const char *str1, const char *str2, int color) {
 	char sentenceCommand[500];
-	Common::strlcpy(sentenceCommand, str1, sizeof(sentenceCommand));
-	if (str2)
-		Common::strlcat(sentenceCommand, str2, sizeof(sentenceCommand));
+	if (_flags.lang != Common::HE_ISR) {
+		Common::strlcpy(sentenceCommand, str1, sizeof(sentenceCommand));
+		if (str2)
+			Common::strlcat(sentenceCommand, str2, sizeof(sentenceCommand));
+	} else {
+		if (str2)
+			Common::strlcpy(sentenceCommand, str2, sizeof(sentenceCommand));
+		Common::strlcat(sentenceCommand, str1, sizeof(sentenceCommand));
+	}
 
 	drawSentenceCommand(sentenceCommand, color);
 	_screen->updateScreen();




More information about the Scummvm-git-logs mailing list