From 6ef82079fc13e36ab23d26aff32fc1ba1379104f Mon Sep 17 00:00:00 2001 From: heroesiiifan Date: Mon, 12 Apr 2021 20:17:50 +0200 Subject: [PATCH] v1.7 --- .gitignore | 4 ++++ .vscode/launch.json | 22 ++++++++++++++++++ .vscode/settings.json | 3 +++ CREDITS.md | 1 + README.md | 20 +++++++--------- .../translation/{def => _archive}/RanIsld.def | Bin .../translation/{def => _archive}/RanNone.def | Bin .../translation/{def => _archive}/RanNorm.def | Bin .../translation/{def => _archive}/RanShow.def | Bin .../translation/{def => _archive}/RanStrg.def | Bin .../translation/{def => _archive}/RanWeak.def | Bin additional_files/vcmi/mod.json | 2 +- scripts/build_hd.py | 8 +++++-- scripts/build_hota.py | 6 ++++- scripts/build_vcmi.py | 8 +++++-- scripts/extract_files.py | 14 ++++++++++- 16 files changed, 70 insertions(+), 18 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json rename additional_files/translation/{def => _archive}/RanIsld.def (100%) rename additional_files/translation/{def => _archive}/RanNone.def (100%) rename additional_files/translation/{def => _archive}/RanNorm.def (100%) rename additional_files/translation/{def => _archive}/RanShow.def (100%) rename additional_files/translation/{def => _archive}/RanStrg.def (100%) rename additional_files/translation/{def => _archive}/RanWeak.def (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e568b39 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +benoetigt.txt +_out/ +_tmp/ +*.log \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..11de5db --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + // Verwendet IntelliSense zum Ermitteln möglicher Attribute. + // Zeigen Sie auf vorhandene Attribute, um die zugehörigen Beschreibungen anzuzeigen. + // Weitere Informationen finden Sie unter https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Build", + "type": "python", + "request": "launch", + "program": "scripts/build.py", + "console": "integratedTerminal" + }, + { + "name": "Python: Aktuelle Datei", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2fdd499 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "C:\\Program Files\\Python37\\python.exe" +} \ No newline at end of file diff --git a/CREDITS.md b/CREDITS.md index 37026b1..25bd727 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -7,4 +7,5 @@ * HD+ Teilw. Übersetzung - http://heroes3.udomehlem.de/ * Xarfax * blub +* nokia9210 * Etliche anonyme Fans \ No newline at end of file diff --git a/README.md b/README.md index 0cda764..84df2b9 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Inoffizielle deutsche Übersetzung von Heroes III Complete Edition für VCMI / H * 7-ZIP zum entpacken ## Bauen -* Benötigt Complete 4.0 / Heroes III RoE in Deutsch / HotA 1.6.1 / Chronicles in Deutsch -> Dateien müssen kopiert werden, siehe "homm3_files/benoetigt.txt" +* Benötigt Complete 4.0 / Heroes III RoE in Deutsch / HotA 1.6.1 / Heroes III SoD in Deutsch / Chronicles in Deutsch -> Dateien müssen kopiert werden, siehe "homm3_files/benoetigt.txt" * Chronicles Mod für VCMI - https://wiki.vcmi.eu/Mod_list (umgewandelt in ZIP) * Die build.py mit Python 3 starten (requirements.txt müssen via pip installiert werden). * Buildvorgang läuft aktuell nur unter Windows (case not sensitive & EXEn). @@ -37,9 +37,9 @@ Inoffizielle deutsche Übersetzung von Heroes III Complete Edition für VCMI / H * [SOD_SP](https://github.com/RoseKavalier/H3Plugins/releases) ## Was Fehlt? -* Audio/Video von AB, SoD und HotA in Deutsch -* Originale SoD-Kampagnen/-Szenarien in Deutsch (SoD in Deutsch: selten) -* Bessere(?) Übersetzungen für DeepL-konvertierte +* Audio/Video von AB und HotA in Deutsch +* Originale AB-Kampagnen/-Szenarien in Deutsch (wurde offiziell nie übersetzt) +* Bessere(?) Übersetzungen für DeepL-konvertierte Maps (AB) * Todo: siehe Backlog ## Vorgehensweise: HoMM3 HD frisch installieren @@ -48,7 +48,7 @@ Inoffizielle deutsche Übersetzung von Heroes III Complete Edition für VCMI / H * Data-CD in den Ordner "CD data" * #de.ini kopieren in lang * Dateien aus Zip in "Packs/German" -* Ggf. [SOD_SP](https://github.com/RoseKavalier/H3Plugins/releases) installieren (in ini von eng auf deu ändern) +* Ggf. [SOD_SP](https://github.com/RoseKavalier/H3Plugins/releases) installieren (in INI-Datei von "eng" auf "deu" ändern) * Heroes Chronicles-Kampagnen in den Maps-Ordner kopieren * Sprache im Menü auf Deutsch umstellen & Mod hinzufügen * genießen @@ -61,12 +61,9 @@ Inoffizielle deutsche Übersetzung von Heroes III Complete Edition für VCMI / H ## Backlog / Todo Achtung: Übersetzungen in Textdateien in Kodierung CP1252 (in Notepad++: ANSI), NICHT UTF-8!!! ### Allgemein -* Deutsches Keyboard-Layout -* Rohstoffe im rechten Quadrat (mit Texten) kleingeschrieben -> Lässt sich scheinbar nicht über Textdateien ändern... (tolower()?) -### VCMI -* - -### HD -* - +* Deutsches Keyboard-Layout (hartcodiert; nur über Patch/Plugin anpassbar) +* Rohstoffe im rechten Quadrat (mit Texten) kleingeschrieben -> Lässt sich nicht über Textdateien ändern... tolower()!) + ### HotA * SpTraits.txt ggf. noch von DeepL optimieren * .DAT übersetzen (hota/txt) - nur Map-Editor übrig... @@ -75,6 +72,7 @@ Achtung: Übersetzungen in Textdateien in Kodierung CP1252 (in Notepad++: ANSI), ### 1.7 * kleine Übersetzung-Fixes * Encoding-Fixes +* original Maps, Kampagnen, ein paar Sprites und Audio aus offiziellem, deutschem SoD ### 1.6 * Ctrl in Strg umbenannt diff --git a/additional_files/translation/def/RanIsld.def b/additional_files/translation/_archive/RanIsld.def similarity index 100% rename from additional_files/translation/def/RanIsld.def rename to additional_files/translation/_archive/RanIsld.def diff --git a/additional_files/translation/def/RanNone.def b/additional_files/translation/_archive/RanNone.def similarity index 100% rename from additional_files/translation/def/RanNone.def rename to additional_files/translation/_archive/RanNone.def diff --git a/additional_files/translation/def/RanNorm.def b/additional_files/translation/_archive/RanNorm.def similarity index 100% rename from additional_files/translation/def/RanNorm.def rename to additional_files/translation/_archive/RanNorm.def diff --git a/additional_files/translation/def/RanShow.def b/additional_files/translation/_archive/RanShow.def similarity index 100% rename from additional_files/translation/def/RanShow.def rename to additional_files/translation/_archive/RanShow.def diff --git a/additional_files/translation/def/RanStrg.def b/additional_files/translation/_archive/RanStrg.def similarity index 100% rename from additional_files/translation/def/RanStrg.def rename to additional_files/translation/_archive/RanStrg.def diff --git a/additional_files/translation/def/RanWeak.def b/additional_files/translation/_archive/RanWeak.def similarity index 100% rename from additional_files/translation/def/RanWeak.def rename to additional_files/translation/_archive/RanWeak.def diff --git a/additional_files/vcmi/mod.json b/additional_files/vcmi/mod.json index feca814..81886a1 100644 --- a/additional_files/vcmi/mod.json +++ b/additional_files/vcmi/mod.json @@ -1,7 +1,7 @@ { "name" : "HoMM3 for VCMI in german", "description" : "Patch changes any Heroes3 complete localisation into german.\nBased on german files found on https://www.mightandmagicworld.de/filebase/heroes_3_patches-c12/index.html files from 10.04.2018\n initial mod by magikyr\nextended by anonymous", - "version" : "1.1", + "version" : "1.7", "author" : "mightandmagicworld ported by magikyr extended by heroesiiifan", "contact" : "", "modType" : "Language", diff --git a/scripts/build_hd.py b/scripts/build_hd.py index 7927d36..15d2d24 100644 --- a/scripts/build_hd.py +++ b/scripts/build_hd.py @@ -38,9 +38,11 @@ def correct_line_ending(file_in, file_out): if os.environ["DEEPL_TRANSLATION"] == "1": for filename in os.listdir("additional_files/translation/deepl/maps/out"): - if not filename.startswith("[") and filename not in os.listdir("homm3_files/RoE_de/Maindisk/Maps"): zipObj.write(os.path.join("additional_files/translation/deepl/maps/out", filename), arcname=os.path.join("Packs/German", filename)) + if not filename.startswith("[") and filename not in os.listdir("homm3_files/RoE_de/Maindisk/Maps") and filename not in os.listdir("homm3_files/SoD_de/Installation/Maps"): zipObj.write(os.path.join("additional_files/translation/deepl/maps/out", filename), arcname=os.path.join("Packs/German", filename)) for filename in os.listdir("homm3_files/RoE_de/Maindisk/Maps"): zipObj.write(os.path.join("homm3_files/RoE_de/Maindisk/Maps", filename), arcname=os.path.join("Packs/German", filename)) +for filename in os.listdir("homm3_files/SoD_de/Installation/Maps"): + if filename not in os.listdir("homm3_files/RoE_de/Maindisk/Maps"): zipObj.write(os.path.join("homm3_files/SoD_de/Installation/Maps", filename), arcname=os.path.join("Packs/German", filename)) for filename in os.listdir("additional_files/translation/campaign/extra"): zipObj.write(os.path.join("additional_files/translation/campaign/extra", filename), arcname=os.path.join("_Custom_Campaign", filename)) for filename in os.listdir("additional_files/translation/campaign/chronicles"): @@ -67,8 +69,10 @@ def correct_line_ending(file_in, file_out): zipObj.write(os.path.join("_tmp", "file.tmp"), arcname=os.path.join("Packs/German", filename)) for filename in os.listdir("additional_files/translation/campaign"): - if "extra" not in filename and "chronicles" not in filename: + if "extra" not in filename and "chronicles" not in filename and filename not in os.listdir("_tmp/camp"): zipObj.write(os.path.join("additional_files/translation/campaign", filename), arcname=os.path.join("Packs/German", filename)) +for filename in os.listdir("_tmp/camp"): + zipObj.write(os.path.join("_tmp/camp", filename), arcname=os.path.join("Packs/German", filename)) if os.environ["APPEND_SOUND"] == "1": for filename in os.listdir("_tmp/snd"): diff --git a/scripts/build_hota.py b/scripts/build_hota.py index 10b4609..e24b0e6 100644 --- a/scripts/build_hota.py +++ b/scripts/build_hota.py @@ -104,9 +104,13 @@ def correct_line_ending(file_in, file_out): zipObj.write(os.path.join("_tmp/HotA_patched/" + "HotA.dat"), arcname=os.path.join("", "HotA.dat")) if os.environ["DEEPL_TRANSLATION"] == "1": for filename in os.listdir("additional_files/translation/deepl/maps/out"): - if filename not in os.listdir("homm3_files/RoE_de/Maindisk/Maps"): zipObj.write(os.path.join("additional_files/translation/deepl/maps/out", filename), arcname=os.path.join("Maps", filename)) + if filename not in os.listdir("homm3_files/RoE_de/Maindisk/Maps") and filename not in os.listdir("homm3_files/SoD_de/Installation/Maps"): zipObj.write(os.path.join("additional_files/translation/deepl/maps/out", filename), arcname=os.path.join("Maps", filename)) for dirpath,dirs,files in os.walk("homm3_files/RoE_de/Maindisk/Maps"): for f in files: fn = os.path.join(dirpath, f) zipObj.write(fn, arcname=os.path.join("Maps", f)) +for dirpath,dirs,files in os.walk("homm3_files/SoD_de/Installation/Maps"): + for f in files: + fn = os.path.join(dirpath, f) + if f not in os.listdir("homm3_files/RoE_de/Maindisk/Maps"): zipObj.write(fn, arcname=os.path.join("Maps", f)) zipObj.close() \ No newline at end of file diff --git a/scripts/build_vcmi.py b/scripts/build_vcmi.py index 6c6e79f..aa15474 100644 --- a/scripts/build_vcmi.py +++ b/scripts/build_vcmi.py @@ -16,9 +16,11 @@ if os.environ["DEEPL_TRANSLATION"]: for filename in os.listdir("additional_files/translation/deepl/maps/out"): - if not filename.startswith("[") and filename not in os.listdir("homm3_files/RoE_de/Maindisk/Maps"): zipObj.write(os.path.join("additional_files/translation/deepl/maps/out", filename), arcname=os.path.join("content/maps", filename)) + if not filename.startswith("[") and filename not in os.listdir("homm3_files/RoE_de/Maindisk/Maps") and filename not in os.listdir("homm3_files/SoD_de/Installation/Maps"): zipObj.write(os.path.join("additional_files/translation/deepl/maps/out", filename), arcname=os.path.join("content/maps", filename)) for filename in os.listdir("homm3_files/RoE_de/Maindisk/Maps"): zipObj.write(os.path.join("homm3_files/RoE_de/Maindisk/Maps", filename), arcname=os.path.join("content/maps", filename)) +for filename in os.listdir("homm3_files/SoD_de/Installation/Maps"): + if filename not in os.listdir("homm3_files/RoE_de/Maindisk/Maps"): zipObj.write(os.path.join("homm3_files/SoD_de/Installation/Maps", filename), arcname=os.path.join("content/maps", filename)) for filename in os.listdir("additional_files/translation/campaign/extra"): zipObj.write(os.path.join("additional_files/translation/campaign/extra", filename), arcname=os.path.join("content/maps", filename)) for filename in os.listdir("additional_files/translation/campaign/chronicles"): @@ -41,8 +43,10 @@ zipObj.write(os.path.join("additional_files/translation/txt", filename), arcname=os.path.join("content/data", filename)) for filename in os.listdir("additional_files/translation/campaign"): - if filename != "extra": + if filename != "extra" and filename not in os.listdir("_tmp/camp"): zipObj.write(os.path.join("additional_files/translation/campaign", filename), arcname=os.path.join("content/data", filename)) +for filename in os.listdir("_tmp/camp"): + zipObj.write(os.path.join("_tmp/camp", filename), arcname=os.path.join("content/data", filename)) if os.environ["APPEND_SOUND"] == "1": for filename in os.listdir("_tmp/snd"): diff --git a/scripts/extract_files.py b/scripts/extract_files.py index 3ef3889..559daff 100644 --- a/scripts/extract_files.py +++ b/scripts/extract_files.py @@ -22,17 +22,29 @@ def_ = list(filter(lambda x: x.lower() in ["cbbegib.def", "cbcancb.def", "cbrestb.def", "hisccam.def", "hiscres.def", "hiscsta.def", "hiscext.def", "mubjoin.def", "scbutt3.def", "scnrback.def", "scnrlod.def", "scnrsav.def", "soload.def", "somain.def", "soquit.def", "soretrn.def", "sorstrt.def", "sosave.def", "scnrbeg.def", "cmpscan.def", "codefaul.def", "icm011.def", "icm012.def", "trrecb.def"], output)) output = subprocess.Popen(["tools/mmarch.exe", "extract", "homm3_files/RoE_de/Maindisk/Data/h3sprite.lod", "_tmp/def"] + def_, stdout=subprocess.PIPE).communicate()[0].decode('cp1252') -if not os.path.exists("_tmp/def"): os.makedirs("_tmp/def") output = subprocess.Popen(["tools/mmarch.exe", "list", "homm3_files/Chronicles_de/_common/lsprite.lod", """|"""], stdout=subprocess.PIPE).communicate()[0].decode('cp1252').split("|") def_ = list(filter(lambda x: x.lower() in ["camcusl.def", "sysob12.def", "sysob13.def", "scnrexi.def", "gspexit.def", "gspbgin.def", "camprst.def", "campld.def", "campcn.def", "avrcgen0.def", "avrcgen1.def", "avrcgen2.def", "avrcgen3.def", "avrcgen4.def", "avrcgen5.def", "avrcgen6.def", "avrcgen7.def", "avrcgn00.def", "avrcgn01.def", "avrcgn02.def", "avrcgn03.def", "avrcgn04.def", "avrcgn05.def", "avrcgn06.def", "avrcgn07.def", "avrcgn08.def", "avwmon1.def", "avwmon2.def", "avwmon3.def", "avwmon4.def", "avwmon5.def", "avwmon6.def", "avwmon7.def", "avwmrnd0.def", "avzevnt0.def", "avzgrail.def"], output)) output = subprocess.Popen(["tools/mmarch.exe", "extract", "homm3_files/Chronicles_de/_common/lsprite.lod", "_tmp/def"] + def_, stdout=subprocess.PIPE).communicate()[0].decode('cp1252') +output = subprocess.Popen(["tools/mmarch.exe", "list", "homm3_files/SoD_de/Installation/H3sprite.lod", """|"""], stdout=subprocess.PIPE).communicate()[0].decode('cp1252').split("|") +def_ = list(filter(lambda x: x.lower() in ["scalbut.def", "ranisld.def", "rannone.def", "rannorm.def", "ranshow.def", "ranstrg.def", "ranweak.def"], output)) +output = subprocess.Popen(["tools/mmarch.exe", "extract", "homm3_files/SoD_de/Installation/H3sprite.lod", "_tmp/def"] + def_, stdout=subprocess.PIPE).communicate()[0].decode('cp1252') + +if not os.path.exists("_tmp/camp"): os.makedirs("_tmp/camp") +output = subprocess.Popen(["tools/mmarch.exe", "list", "homm3_files/SoD_de/Installation/H3bitmap.lod", """|"""], stdout=subprocess.PIPE).communicate()[0].decode('cp1252').split("|") +def_ = list(filter(lambda x: x.lower() in ["crag.h3c", "final.h3c", "gelu.h3c", "gem.h3c", "sandro.h3c", "secret.h3c", "yog.h3c"], output)) +output = subprocess.Popen(["tools/mmarch.exe", "extract", "homm3_files/SoD_de/Installation/H3bitmap.lod", "_tmp/camp"] + def_, stdout=subprocess.PIPE).communicate()[0].decode('cp1252') + if os.environ["APPEND_SOUND"] == "1": if not os.path.exists("_tmp/snd"): os.makedirs("_tmp/snd") output = subprocess.Popen(["tools/mmarch.exe", "list", "homm3_files/RoE_de/Datadisk/heroes3.snd", """|"""], stdout=subprocess.PIPE).communicate()[0].decode('cp1252').split("|") snd = list(filter(lambda x: True, output)) output = subprocess.Popen(["tools/mmarch.exe", "extract", "homm3_files/RoE_de/Datadisk/heroes3.snd", "_tmp/snd"] + snd, stdout=subprocess.PIPE).communicate()[0].decode('cp1252') + output = subprocess.Popen(["tools/mmarch.exe", "list", "homm3_files/SoD_de/Disk/HEROES3.SND", """|"""], stdout=subprocess.PIPE).communicate()[0].decode('cp1252').split("|") + snd = list(filter(lambda x: x.startswith("H3x"), output)) + output = subprocess.Popen(["tools/mmarch.exe", "extract", "homm3_files/SoD_de/Disk/HEROES3.SND", "_tmp/snd"] + snd, stdout=subprocess.PIPE).communicate()[0].decode('cp1252') + if os.environ["APPEND_VIDEO"] == "1": if not os.path.exists("_tmp/vid"): os.makedirs("_tmp/vid") output = subprocess.Popen(["tools/mmarch.exe", "list", "homm3_files/RoE_de/Datadisk/heroes3.vid", """|"""], stdout=subprocess.PIPE).communicate()[0].decode('cp1252').split("|")