Merge pull request #22 from Faraphel/dev

v0.8
This commit is contained in:
Faraphel 2021-07-13 00:51:16 +02:00 committed by GitHub
commit 668fa8f846
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 230 additions and 144 deletions

11
.gitignore vendored
View file

@ -96,3 +96,14 @@
/file/Common_M.bmg /file/Common_M.bmg
/file/Common_RJ.bmg /file/Common_RJ.bmg
/file/Common_J.bmg /file/Common_J.bmg
/file/Menu_F.bmg
/file/Menu_I.bmg
/file/Menu_E.bmg
/file/Menu_G.bmg
/file/Menu_S.bmg
/file/Menu_Q.bmg
/file/Menu_K.bmg
/file/Menu_J.bmg
/option.json
/file/Menu_M.bmg
/file/Menu_U.bmg

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -2,7 +2,7 @@
[LECODE-PARAMETERS] [LECODE-PARAMETERS]
LIMIT-MODE = LE$PRODUCTIVE LIMIT-MODE = LE$AUTOMATIC
ENGINE = 0,0,0 ENGINE = 0,0,0
ENABLE-200CC = 0 ENABLE-200CC = 0
@ -10,6 +10,7 @@ PERF-MONITOR = 0
CUSTOM-TT = 1 CUSTOM-TT = 1
XPFLAGS = 1 XPFLAGS = 1
SPEEDOMETER = 1 SPEEDOMETER = 1
THCLOUD-TIME = 720
[CHAT-MESSAGE-MODES] [CHAT-MESSAGE-MODES]
@legacy = 1 @legacy = 1

20
fs.json
View file

@ -24,16 +24,16 @@
}, },
"Scene/UI/*_E.szs": {"/message/Common.bmg": "Common_E.bmg"}, "Scene/UI/*_E.szs": {"/message/Common.bmg": "Common_E.bmg", "/message/Menu.bmg": "Menu_E.bmg"},
"Scene/UI/*_K.szs": {"/message/Common.bmg": "Common_K.bmg"}, "Scene/UI/*_K.szs": {"/message/Common.bmg": "Common_K.bmg", "/message/Menu.bmg": "Menu_K.bmg"},
"Scene/UI/*_J.szs": {"/message/Common.bmg": "Common_J.bmg"}, "Scene/UI/*_J.szs": {"/message/Common.bmg": "Common_J.bmg", "/message/Menu.bmg": "Menu_J.bmg"},
"Scene/UI/*_U.szs": {"/message/Common.bmg": "Common_U.bmg"}, "Scene/UI/*_U.szs": {"/message/Common.bmg": "Common_U.bmg", "/message/Menu.bmg": "Menu_U.bmg"},
"Scene/UI/*_F.szs": {"/message/Common.bmg": "Common_F.bmg"}, "Scene/UI/*_F.szs": {"/message/Common.bmg": "Common_F.bmg", "/message/Menu.bmg": "Menu_F.bmg"},
"Scene/UI/*_Q.szs": {"/message/Common.bmg": "Common_Q.bmg"}, "Scene/UI/*_Q.szs": {"/message/Common.bmg": "Common_Q.bmg", "/message/Menu.bmg": "Menu_Q.bmg"},
"Scene/UI/*_G.szs": {"/message/Common.bmg": "Common_G.bmg"}, "Scene/UI/*_G.szs": {"/message/Common.bmg": "Common_G.bmg", "/message/Menu.bmg": "Menu_G.bmg"},
"Scene/UI/*_I.szs": {"/message/Common.bmg": "Common_I.bmg"}, "Scene/UI/*_I.szs": {"/message/Common.bmg": "Common_I.bmg", "/message/Menu.bmg": "Menu_I.bmg"},
"Scene/UI/*_S.szs": {"/message/Common.bmg": "Common_S.bmg"}, "Scene/UI/*_S.szs": {"/message/Common.bmg": "Common_S.bmg", "/message/Menu.bmg": "Menu_S.bmg"},
"Scene/UI/*_M.szs": {"/message/Common.bmg": "Common_M.bmg"}, "Scene/UI/*_M.szs": {"/message/Common.bmg": "Common_M.bmg", "/message/Menu.bmg": "Menu_M.bmg"},
"Scene/UI/Race_E.szs": {"/message/Common.bmg": "Common_RE.bmg"}, "Scene/UI/Race_E.szs": {"/message/Common.bmg": "Common_RE.bmg"},
"Scene/UI/Race_K.szs": {"/message/Common.bmg": "Common_RK.bmg"}, "Scene/UI/Race_K.szs": {"/message/Common.bmg": "Common_RK.bmg"},

View file

@ -28,7 +28,7 @@ class ClassApp():
from source.patch_img_desc import patch_img_desc from source.patch_img_desc import patch_img_desc
from source.patch_ct_icon import patch_ct_icon from source.patch_ct_icon import patch_ct_icon
from source.log_error import log_error from source.log_error import log_error
from source.get_github_file import get_github_file from source.get_github_file import get_github_file, check_track_sha1
from source.patch_track import count_track, patch_track, patch_autoadd from source.patch_track import count_track, patch_track, patch_autoadd
from source.patch_image import patch_image from source.patch_image import patch_image
from source.option import load_option, change_option from source.option import load_option, change_option

View file

@ -1 +0,0 @@
{"language": "en", "format": "FST", "disable_download": false, "del_track_after_conv": false, "dont_check_for_update": false, "process_track": 8}

View file

@ -20,6 +20,7 @@ def __init__(self):
self.boolvar_disable_download = BooleanVar(value=self.option["disable_download"]) self.boolvar_disable_download = BooleanVar(value=self.option["disable_download"])
self.boolvar_del_track_after_conv = BooleanVar(value=self.option["del_track_after_conv"]) self.boolvar_del_track_after_conv = BooleanVar(value=self.option["del_track_after_conv"])
self.boolvar_dont_check_for_update = BooleanVar(value=self.option["dont_check_for_update"]) self.boolvar_dont_check_for_update = BooleanVar(value=self.option["dont_check_for_update"])
self.boolvar_dont_check_track_sha1 = BooleanVar(value=self.option["dont_check_track_sha1"])
self.intvar_process_track = IntVar(value=self.option["process_track"]) self.intvar_process_track = IntVar(value=self.option["process_track"])
self.root.title(self.translate("MKWFaraphel Installateur")) self.root.title(self.translate("MKWFaraphel Installateur"))
@ -50,6 +51,8 @@ def __init__(self):
self.menu_advanced.add_checkbutton(label=self.translate("Désactiver les téléchargements"), variable=self.boolvar_disable_download, command=lambda: self.change_option("disable_download", self.boolvar_disable_download)) self.menu_advanced.add_checkbutton(label=self.translate("Désactiver les téléchargements"), variable=self.boolvar_disable_download, command=lambda: self.change_option("disable_download", self.boolvar_disable_download))
self.menu_advanced.add_checkbutton(label=self.translate("Supprimer les courses wu8 après conversion en szs"), variable=self.boolvar_del_track_after_conv, command=lambda: self.change_option("del_track_after_conv", self.boolvar_del_track_after_conv)) self.menu_advanced.add_checkbutton(label=self.translate("Supprimer les courses wu8 après conversion en szs"), variable=self.boolvar_del_track_after_conv, command=lambda: self.change_option("del_track_after_conv", self.boolvar_del_track_after_conv))
self.menu_advanced.add_checkbutton(label=self.translate("Ne pas vérifier les mises à jour"), variable=self.boolvar_dont_check_for_update, command=lambda: self.change_option("dont_check_for_update", self.boolvar_dont_check_for_update)) self.menu_advanced.add_checkbutton(label=self.translate("Ne pas vérifier les mises à jour"), variable=self.boolvar_dont_check_for_update, command=lambda: self.change_option("dont_check_for_update", self.boolvar_dont_check_for_update))
self.menu_advanced.add_checkbutton(label=self.translate("Ne pas vérifier le sha1 des courses"), variable=self.boolvar_dont_check_track_sha1, command=lambda: self.change_option("dont_check_track_sha1",self.boolvar_dont_check_track_sha1))
self.menu_advanced.add_separator() self.menu_advanced.add_separator()
self.menu_advanced.add_command(label=self.translate("Nombre de processus de conversion de course :")) self.menu_advanced.add_command(label=self.translate("Nombre de processus de conversion de course :"))
self.menu_advanced.add_radiobutton(label=self.translate("1 processus"), variable=self.intvar_process_track, value=1, command=lambda: self.change_option("process_track", 1)) self.menu_advanced.add_radiobutton(label=self.translate("1 processus"), variable=self.intvar_process_track, value=1, command=lambda: self.change_option("process_track", 1))
@ -122,12 +125,6 @@ def __init__(self):
self.translate("Cette ROM est déjà moddé, " + self.translate("Cette ROM est déjà moddé, " +
"il est déconseillé de l'utiliser pour installer le mod")) "il est déconseillé de l'utiliser pour installer le mod"))
region_ID = {
"J": "JAP",
"P": "PAL",
"K": "KOR",
"E": "USA"
}
try: try:
with open(self.path_mkwf + "/setup.txt") as f: setup = f.read() with open(self.path_mkwf + "/setup.txt") as f: setup = f.read()
setup = setup[setup.find("!part-id = ")+len("!part-id = "):] setup = setup[setup.find("!part-id = ")+len("!part-id = "):]
@ -137,7 +134,9 @@ def __init__(self):
self.transate("Impossible de trouver la région de votre jeu.\n" self.transate("Impossible de trouver la région de votre jeu.\n"
"la région PAL sera utilisé par défaut.")) "la région PAL sera utilisé par défaut."))
self.original_game_ID = "RMCP01" self.original_game_ID = "RMCP01"
try: self.original_region = region_ID[self.original_game_ID[3]] try:
self.original_region_ID = self.original_game_ID[3]
self.original_region = region_ID[self.original_region_ID]
except: self.original_region = "PAL" except: self.original_region = "PAL"
self.frame_action.grid(row=3, column=1, sticky="NEWS") self.frame_action.grid(row=3, column=1, sticky="NEWS")

View file

@ -1,11 +1,11 @@
from . import * from tkinter import messagebox
import requests import requests
import zipfile import zipfile
import json import json
import sys import sys
import os import os
VERSION_FILE_URL = "https://raw.githubusercontent.com/Faraphel/MKWF-Install/master/version" from .definition import *
def check_update(self): def check_update(self):
@ -40,5 +40,11 @@ def check_update(self):
os.startfile(os.path.realpath("./Updater/Updater.exe")) os.startfile(os.path.realpath("./Updater/Updater.exe"))
sys.exit() sys.exit()
except requests.ConnectionError:
messagebox.showwarning(self.translate("Attention"),
self.translate("Impossible de se connecter à internet. Le téléchargement sera "
"automatiquement désactivé."))
self.option["disable_download"] = True
except: except:
self.log_error() self.log_error()

View file

@ -1,5 +1,7 @@
CREATE_NO_WINDOW = 0x08000000 CREATE_NO_WINDOW = 0x08000000
VERSION = "0.8.1" GITHUB_REPOSITORY = "Faraphel/MKWF-Install"
GITHUB_CONTENT_ROOT = f"https://raw.githubusercontent.com/{GITHUB_REPOSITORY}/master/"
VERSION_FILE_URL = GITHUB_CONTENT_ROOT + "version"
get_filename = lambda file: ".".join(file.split(".")[:-1]) get_filename = lambda file: ".".join(file.split(".")[:-1])
get_nodir = lambda file: file.replace("\\", "/").split("/")[-1] get_nodir = lambda file: file.replace("\\", "/").split("/")[-1]
@ -8,6 +10,13 @@ get_extension = lambda file: file.split(".")[-1]
get_track_wu8 = lambda track: f"./file/Track-WU8/{track}.wu8" get_track_wu8 = lambda track: f"./file/Track-WU8/{track}.wu8"
get_track_szs = lambda track: f"./file/Track/{track}.szs" get_track_szs = lambda track: f"./file/Track/{track}.szs"
region_ID = {
"J": "JAP",
"P": "PAL",
"K": "KOR",
"E": "USA"
}
def get_trackname(name=None, prefix=None, suffix=None, track=None): def get_trackname(name=None, prefix=None, suffix=None, track=None):
if track: if track:

View file

@ -1,7 +1,8 @@
import requests import requests
import subprocess
import os import os
root = "https://raw.githubusercontent.com/Faraphel/MKWF-Install/master/" from .definition import *
def get_github_file(self, file): def get_github_file(self, file):
@ -9,7 +10,7 @@ def get_github_file(self, file):
returncode = 0 returncode = 0
if self.boolvar_disable_download.get(): return 2 if self.boolvar_disable_download.get(): return 2
dl = requests.get(root+file, allow_redirects=True, stream=True) dl = requests.get(GITHUB_CONTENT_ROOT+file, allow_redirects=True, stream=True)
if os.path.exists(file): if os.path.exists(file):
if int(dl.headers['Content-Length']) == os.path.getsize(file): return 1 if int(dl.headers['Content-Length']) == os.path.getsize(file): return 1
else: returncode = 3 else: returncode = 3
@ -27,3 +28,11 @@ def get_github_file(self, file):
except: except:
self.log_error() self.log_error()
return -1 return -1
def check_track_sha1(self, file, excepted_sha1):
sha1 = subprocess.run(["./tools/szs/wszst", "SHA1", file, "--autoadd-path", "./file/auto-add/"],
check=True, creationflags=CREATE_NO_WINDOW,
stdout=subprocess.PIPE).stdout.decode().split(" ")[0]
if excepted_sha1 == sha1: return 0
else: return -1

View file

@ -117,7 +117,9 @@ def install_mod(self):
shutil.rmtree(self.path_mkwf) shutil.rmtree(self.path_mkwf)
self.Progress(statut=self.translate("Changement de l'ID du jeu"), add=1) self.Progress(statut=self.translate("Changement de l'ID du jeu"), add=1)
subprocess.run(["./tools/wit/wit", "EDIT", get_nodir(self.path_mkwf_format), "--id", "RMCP60"], # see to maybe change ID to MKWF subprocess.run(["./tools/wit/wit", "EDIT", get_nodir(self.path_mkwf_format), "--id",
f"RMC{self.original_region_ID}60", "--name", f"Mario Kart Wii Faraphel {self.VERSION}",
"--modify", "ALL"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(self.path_mkwf_format), creationflags=CREATE_NO_WINDOW, cwd=get_dir(self.path_mkwf_format),
check=True, stdout=subprocess.PIPE) check=True, stdout=subprocess.PIPE)

View file

@ -7,6 +7,7 @@ default_option = {
"disable_download": False, "disable_download": False,
"del_track_after_conv": False, "del_track_after_conv": False,
"dont_check_for_update": False, "dont_check_for_update": False,
"dont_check_track_sha1": False,
"process_track": 8 "process_track": 8
} }
@ -22,3 +23,7 @@ def load_option(self):
if not(os.path.exists("./option.json")): if not(os.path.exists("./option.json")):
with open("./option.json", "w", encoding="utf-8") as f: json.dump(default_option, f, ensure_ascii=False) with open("./option.json", "w", encoding="utf-8") as f: json.dump(default_option, f, ensure_ascii=False)
with open("./option.json", encoding="utf-8") as f: self.option = json.load(f) with open("./option.json", encoding="utf-8") as f: self.option = json.load(f)
for option_key, option_value in default_option.items():
if not(option_key in self.option):
self.option[option_key] = option_value

View file

@ -4,7 +4,11 @@ import os
from .definition import * from .definition import *
bmgID_track_move = {
def patch_bmg(self, gamefile): # gamefile est le fichier .szs trouvé dans le /files/Scene/UI/ du jeu
try:
bmgID_track_move = {
"T11": 0x7008, "T12": 0x7001, "T13": 0x7002, "T14": 0x7004, "T11": 0x7008, "T12": 0x7001, "T13": 0x7002, "T14": 0x7004,
"T21": 0x7000, "T22": 0x7005, "T23": 0x7006, "T24": 0x7007, "T21": 0x7000, "T22": 0x7005, "T23": 0x7006, "T24": 0x7007,
"T31": 0x7009, "T32": 0x700f, "T33": 0x700b, "T34": 0x7003, "T31": 0x7009, "T32": 0x700f, "T33": 0x700b, "T34": 0x7003,
@ -14,8 +18,8 @@ bmgID_track_move = {
"T61": 0x701b, "T62": 0x701f, "T63": 0x7017, "T64": 0x7012, "T61": 0x701b, "T62": 0x701f, "T63": 0x7017, "T64": 0x7012,
"T71": 0x7015, "T72": 0x701e, "T73": 0x701d, "T74": 0x7011, "T71": 0x7015, "T72": 0x701e, "T73": 0x701d, "T74": 0x7011,
"T81": 0x7018, "T82": 0x7016, "T83": 0x7013, "T84": 0x701c, "T81": 0x7018, "T82": 0x7016, "T83": 0x7013, "T84": 0x701c,
} }
trackname_color = { trackname_color = {
"MSRDS ": "\c{green}MSRDS\c{off} ", "MSRDS ": "\c{green}MSRDS\c{off} ",
"CTR ": "\c{YOR4}CTR\c{off} ", "CTR ": "\c{YOR4}CTR\c{off} ",
"CTTR ": "\c{YOR5}CTTR\c{off} ", "CTTR ": "\c{YOR5}CTTR\c{off} ",
@ -82,17 +86,36 @@ trackname_color = {
"★★★!! ": "\c{YOR6}★★★\c{off} ", "★★★!! ": "\c{YOR6}★★★\c{off} ",
"★★☆!! ": "\c{YOR6}★★☆\c{off} ", "★★☆!! ": "\c{YOR6}★★☆\c{off} ",
"★☆☆!! ": "\c{YOR6}★☆☆\c{off} ", "★☆☆!! ": "\c{YOR6}★☆☆\c{off} ",
} }
NINTENDO_CWF_REPLACE = "Wiimmfi"
MAINMENU_REPLACE = f"MKWFaraphel {self.VERSION}"
menu_replacement = {
"CWF de Nintendo": NINTENDO_CWF_REPLACE,
"Wi-Fi Nintendo": NINTENDO_CWF_REPLACE,
"CWF Nintendo": NINTENDO_CWF_REPLACE,
"Nintendo WFC": NINTENDO_CWF_REPLACE,
"Wi-Fi": NINTENDO_CWF_REPLACE,
"インターネット": NINTENDO_CWF_REPLACE,
"Menu principal": MAINMENU_REPLACE,
"Menú principal": MAINMENU_REPLACE,
"Main Menu": MAINMENU_REPLACE,
"トップメニュー": MAINMENU_REPLACE,
"Mario Kart Wii": MAINMENU_REPLACE,
}
def patch_bmg(self, gamefile): # gamefile est le fichier .szs trouvé dans le /files/Scene/UI/ du jeu
try:
bmglang = gamefile[-len("E.txt"):-len(".txt")] # Langue du fichier bmglang = gamefile[-len("E.txt"):-len(".txt")] # Langue du fichier
self.Progress(statut=self.translate("Patch des textes ") + bmglang, add=1) self.Progress(statut=self.translate("Patch des textes ") + bmglang, add=1)
subprocess.run(["./tools/szs/wszst", "EXTRACT", get_nodir(gamefile), "-d", get_nodir(gamefile) + ".d", subprocess.run(["./tools/szs/wszst", "EXTRACT", get_nodir(gamefile), "-d", get_nodir(gamefile) + ".d",
"--overwrite"], creationflags=CREATE_NO_WINDOW, cwd=get_dir(gamefile)) "--overwrite"], creationflags=CREATE_NO_WINDOW, cwd=get_dir(gamefile))
# Menu.bmg
bmgmenu = subprocess.run(["./tools/szs/wbmgt", "CAT", get_nodir(gamefile) + ".d/message/Menu.bmg"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(gamefile),
check=True, stdout=subprocess.PIPE).stdout.decode()
# Common.bmg # Common.bmg
bmgtracks = subprocess.run(["./tools/szs/wbmgt", "CAT", get_nodir(gamefile) + ".d/message/Common.bmg"], bmgtracks = subprocess.run(["./tools/szs/wbmgt", "CAT", get_nodir(gamefile) + ".d/message/Common.bmg"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(gamefile), creationflags=CREATE_NO_WINDOW, cwd=get_dir(gamefile),
@ -129,10 +152,12 @@ def patch_bmg(self, gamefile): # gamefile est le fichier .szs trouvé dans le /
if not(os.path.exists("./file/tmp/")): os.makedirs("./file/tmp/") if not(os.path.exists("./file/tmp/")): os.makedirs("./file/tmp/")
filecopy(gamefile+".d/message/Common.bmg", "./file/tmp/Common.bmg") filecopy(gamefile+".d/message/Common.bmg", "./file/tmp/Common.bmg")
bmgtext = subprocess.run(["tools/szs/wctct", "bmg", "--le-code", "--long", "./file/CTFILE.txt", "--patch-bmg", bmgcommon = subprocess.run(
["tools/szs/wctct", "bmg", "--le-code", "--long", "./file/CTFILE.txt", "--patch-bmg",
"OVERWRITE=./file/tmp/Common.bmg", "--patch-bmg", "OVERWRITE=./file/ExtraCommon.txt"], "OVERWRITE=./file/tmp/Common.bmg", "--patch-bmg", "OVERWRITE=./file/ExtraCommon.txt"],
creationflags=CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE).stdout.decode() creationflags=CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE).stdout.decode()
rbmgtext = subprocess.run(["tools/szs/wctct", "bmg", "--le-code", "--long", "./file/RCTFILE.txt", "--patch-bmg", rbmgcommon = subprocess.run(
["tools/szs/wctct", "bmg", "--le-code", "--long", "./file/RCTFILE.txt", "--patch-bmg",
"OVERWRITE=./file/tmp/Common.bmg", "--patch-bmg", "OVERWRITE=./file/ExtraCommon.txt"], "OVERWRITE=./file/tmp/Common.bmg", "--patch-bmg", "OVERWRITE=./file/ExtraCommon.txt"],
creationflags=CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE).stdout.decode() creationflags=CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE).stdout.decode()
@ -140,15 +165,16 @@ def patch_bmg(self, gamefile): # gamefile est le fichier .szs trouvé dans le /
os.remove("./file/tmp/Common.bmg") os.remove("./file/tmp/Common.bmg")
os.remove("./file/ExtraCommon.txt") os.remove("./file/ExtraCommon.txt")
def finalise(common_file, bmgtext): def finalise(file, bmgtext, replacement_list):
for console in trackname_color: bmgtext = bmgtext.replace(console, trackname_color[console]) for text, colored_text in replacement_list.items(): bmgtext = bmgtext.replace(text, colored_text)
with open(common_file, "w", encoding="utf-8") as f: f.write(bmgtext) with open(file, "w", encoding="utf-8") as f: f.write(bmgtext)
subprocess.run(["./tools/szs/wbmgt", "ENCODE", get_nodir(common_file), "--overwrite"], subprocess.run(["./tools/szs/wbmgt", "ENCODE", get_nodir(file), "--overwrite"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(common_file)) creationflags=CREATE_NO_WINDOW, cwd=get_dir(file))
os.remove(common_file) os.remove(file)
finalise(f"./file/Common_{bmglang}.txt", bmgtext) finalise(f"./file/Menu_{bmglang}.txt", bmgmenu, menu_replacement)
finalise(f"./file/Common_R{bmglang}.txt", rbmgtext) finalise(f"./file/Common_{bmglang}.txt", bmgcommon, trackname_color)
finalise(f"./file/Common_R{bmglang}.txt", rbmgcommon, trackname_color)
except: except:
self.log_error() self.log_error()

View file

@ -21,10 +21,12 @@ def patch_file(self):
self.patch_img_desc() self.patch_img_desc()
self.patch_image(fc) self.patch_image(fc)
for file in glob.glob(self.path_mkwf+"/files/Scene/UI/MenuSingle_?.szs"): self.patch_bmg(file) for file in glob.glob(self.path_mkwf+"/files/Scene/UI/MenuSingle_?.szs"): self.patch_bmg(file)
# MenuSingle could be any other file, Common and Menu are all the same in all other files.
self.patch_autoadd() self.patch_autoadd()
if self.patch_track(tracks, total_track) != 0: return if self.patch_track(tracks, total_track) != 0: return
self.button_install_mod.grid(row=2, column=1, columnspan=2, sticky="NEWS") self.button_install_mod.grid(row=2, column=1, columnspan=2, sticky="NEWS")
self.button_install_mod.config(text=f'{self.translate("Installer le mod")} (v{self.VERSION})')
except: self.log_error() except: self.log_error()
finally: self.Progress(show=False) finally: self.Progress(show=False)

View file

@ -8,8 +8,8 @@ import os
def count_track(self): def count_track(self):
tracks = [] tracks = []
with open("./ct_config.json", encoding="utf-8") as f: with open("./ct_config.json", encoding="utf-8") as f: ctconfig = json.load(f)
ctconfig = json.load(f) self.VERSION = ctconfig["version"]
for cup in ctconfig["cup"].values(): for cup in ctconfig["cup"].values():
if not (cup["locked"]): tracks.extend(cup["courses"].values()) if not (cup["locked"]): tracks.extend(cup["courses"].values())
tracks.extend(ctconfig["tracks_list"]) tracks.extend(ctconfig["tracks_list"])
@ -34,7 +34,9 @@ def patch_track(self, tracks, total_track="?"):
process_list = {} process_list = {}
error_count, error_max = 0, 3 error_count, error_max = 0, 3
def add_process(track_file):
def add_process(track):
track_file = get_trackname(track=track)
nonlocal error_count, error_max, process_list nonlocal error_count, error_max, process_list
process_list[track_file] = None # Used for process_list[track_file] = None # Used for
@ -46,6 +48,7 @@ def patch_track(self, tracks, total_track="?"):
if os.path.getsize(_track) < 1000: # File under this size are corrupted if os.path.getsize(_track) < 1000: # File under this size are corrupted
os.remove(_track) os.remove(_track)
while True:
download_returncode = self.get_github_file(get_track_wu8(track_file)) download_returncode = self.get_github_file(get_track_wu8(track_file))
if download_returncode == -1: # can't download if download_returncode == -1: # can't download
error_count += 1 error_count += 1
@ -58,6 +61,20 @@ def patch_track(self, tracks, total_track="?"):
messagebox.showwarning(self.translate("Attention"), messagebox.showwarning(self.translate("Attention"),
self.translate("Impossible de télécharger cette course ! (") + self.translate("Impossible de télécharger cette course ! (") +
str(error_count) + "/" + str(error_max) + ")") str(error_count) + "/" + str(error_max) + ")")
elif download_returncode == 2: break # Si le téléchargement est désactivé, ne pas checker le sha1
if "sha1" in track:
if not self.boolvar_dont_check_track_sha1.get():
if not self.check_track_sha1(get_track_wu8(track_file), track["sha1"]) == 0: # La course est correcte
error_count += 1
if error_count > error_max: # Too much track wasn't correctly converted
messagebox.showerror(
self.translate("Erreur"),
self.translate("Trop de course ont eu une erreur de vérification de sha1."))
return -1
continue
break
if not (os.path.exists( if not (os.path.exists(
get_track_szs(track_file))) or download_returncode == 3: # returncode 3 is track has been updated get_track_szs(track_file))) or download_returncode == 3: # returncode 3 is track has been updated
@ -80,7 +97,6 @@ def patch_track(self, tracks, total_track="?"):
for track_file, process in process_list.copy().items(): for track_file, process in process_list.copy().items():
if process is not None: if process is not None:
if process.poll() is None: if process.poll() is None:
print("still running...")
pass # if the process is still running pass # if the process is still running
else: # process ended else: # process ended
process_list.pop(track_file) process_list.pop(track_file)
@ -110,10 +126,9 @@ def patch_track(self, tracks, total_track="?"):
else: return 0 else: return 0
for i, track in enumerate(tracks): for i, track in enumerate(tracks):
track_file = get_trackname(track=track)
while True: while True:
if len(process_list) < max_process: if len(process_list) < max_process:
returncode = add_process(track_file) returncode = add_process(track)
if returncode == 0: break if returncode == 0: break
elif returncode == -1: return -1 # if error occur, stop function elif returncode == -1: return -1 # if error occur, stop function
elif clean_process() == -1: return -1 elif clean_process() == -1: return -1

View file

@ -1,5 +1,7 @@
{ {
"en": { "en": {
"Ne pas vérifier le sha1 des courses": "Don't check for track's sha1",
"Impossible de se connecter à internet. Le téléchargement sera automatiquement désactivé.": "Can't connect to internet, download will automatically be disabled.",
"Patch main.dol": "Patch main.dol", "Patch main.dol": "Patch main.dol",
"Patch lecode.bin": "Patch lecode.bin", "Patch lecode.bin": "Patch lecode.bin",
"Installation du mod": "Installing mod", "Installation du mod": "Installing mod",

View file

@ -1,7 +1,7 @@
{ {
"version": "0.7", "version": "0.8",
"subversion": "0", "subversion": "0",
"changelog": "- \"CNR Outer Space Chase\" avait le préfix \"CTR\", rendant la course inutilisable\n- \"SADX Twinkle Circuit\" avaient le préfix \"SHR\", rendant les courses inutilisables\n- Si une course n'est pas trouvée, elle sera téléchargée depuis le github -> les mises à jour seront bien plus légère car vous ne devrez pas retélécharger toutes les courses. Elles seront également retéléchargées si leur taille ne correspond pas à leur version github\n- le code patch_file.py a été divisé en plusieurs fichier pour simplifier le code\n- Update.exe a été recompilé avec la nouvelle version de cx_freeze pour corriger le problème des dossiers non-ASCII\n- Correction de traduction oubliée\n- Ajout d'une barre de menus, où a été déplacé le langage, le format de sortie et de nouvelles options avancé\n\n- \"CNR Outer Space Chase\" had \"CTR\" prefix, making the map unusable\n- \"SADX Twinkle Circuit\" all had \"SHR\" prefix, making the tracks unusable\n- If a track is not found, the program will download it from the github -> update could be much lighter because you won't have to redownload all tracks. They will also be redownloaded if their size doesn't match with their github one\n- Splitted patch_file.py into multiple file to make the code more readable\n- Recompiled Update.exe with new cx_freeze version to fix issue with non-ASCII directory\n- Fixed missing translation\n- Added a menu bar, moved it language, output format and added new advanced option", "changelog": "",
"download_bin": "https://github.com/Faraphel/MKWF-Install/releases/download/0.7/MKWF.v0.7.zip", "download_bin": "https://github.com/Faraphel/MKWF-Install/releases/download/0.8/MKWF.v0.8.zip",
"updater_bin": "https://github.com/Faraphel/MKWF-Install/raw/master/Updater/Updater.zip" "updater_bin": "https://github.com/Faraphel/MKWF-Install/raw/master/Updater/Updater.zip"
} }