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_RJ.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]
LIMIT-MODE = LE$PRODUCTIVE
LIMIT-MODE = LE$AUTOMATIC
ENGINE = 0,0,0
ENABLE-200CC = 0
@ -10,6 +10,7 @@ PERF-MONITOR = 0
CUSTOM-TT = 1
XPFLAGS = 1
SPEEDOMETER = 1
THCLOUD-TIME = 720
[CHAT-MESSAGE-MODES]
@legacy = 1

20
fs.json
View file

@ -24,16 +24,16 @@
},
"Scene/UI/*_E.szs": {"/message/Common.bmg": "Common_E.bmg"},
"Scene/UI/*_K.szs": {"/message/Common.bmg": "Common_K.bmg"},
"Scene/UI/*_J.szs": {"/message/Common.bmg": "Common_J.bmg"},
"Scene/UI/*_U.szs": {"/message/Common.bmg": "Common_U.bmg"},
"Scene/UI/*_F.szs": {"/message/Common.bmg": "Common_F.bmg"},
"Scene/UI/*_Q.szs": {"/message/Common.bmg": "Common_Q.bmg"},
"Scene/UI/*_G.szs": {"/message/Common.bmg": "Common_G.bmg"},
"Scene/UI/*_I.szs": {"/message/Common.bmg": "Common_I.bmg"},
"Scene/UI/*_S.szs": {"/message/Common.bmg": "Common_S.bmg"},
"Scene/UI/*_M.szs": {"/message/Common.bmg": "Common_M.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", "/message/Menu.bmg": "Menu_K.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", "/message/Menu.bmg": "Menu_U.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", "/message/Menu.bmg": "Menu_Q.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", "/message/Menu.bmg": "Menu_I.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", "/message/Menu.bmg": "Menu_M.bmg"},
"Scene/UI/Race_E.szs": {"/message/Common.bmg": "Common_RE.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_ct_icon import patch_ct_icon
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_image import patch_image
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_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_track_sha1 = BooleanVar(value=self.option["dont_check_track_sha1"])
self.intvar_process_track = IntVar(value=self.option["process_track"])
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("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 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_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))
@ -122,12 +125,6 @@ def __init__(self):
self.translate("Cette ROM est déjà moddé, " +
"il est déconseillé de l'utiliser pour installer le mod"))
region_ID = {
"J": "JAP",
"P": "PAL",
"K": "KOR",
"E": "USA"
}
try:
with open(self.path_mkwf + "/setup.txt") as f: setup = f.read()
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"
"la région PAL sera utilisé par défaut."))
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"
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 zipfile
import json
import sys
import os
VERSION_FILE_URL = "https://raw.githubusercontent.com/Faraphel/MKWF-Install/master/version"
from .definition import *
def check_update(self):
@ -40,5 +40,11 @@ def check_update(self):
os.startfile(os.path.realpath("./Updater/Updater.exe"))
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:
self.log_error()

View file

@ -1,5 +1,7 @@
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_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_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):
if track:

View file

@ -1,7 +1,8 @@
import requests
import subprocess
import os
root = "https://raw.githubusercontent.com/Faraphel/MKWF-Install/master/"
from .definition import *
def get_github_file(self, file):
@ -9,7 +10,7 @@ def get_github_file(self, file):
returncode = 0
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 int(dl.headers['Content-Length']) == os.path.getsize(file): return 1
else: returncode = 3
@ -27,3 +28,11 @@ def get_github_file(self, file):
except:
self.log_error()
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)
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),
check=True, stdout=subprocess.PIPE)

View file

@ -7,6 +7,7 @@ default_option = {
"disable_download": False,
"del_track_after_conv": False,
"dont_check_for_update": False,
"dont_check_track_sha1": False,
"process_track": 8
}
@ -21,4 +22,8 @@ def change_option(self, option, value, restart=False):
def load_option(self):
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", 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,95 +4,118 @@ import os
from .definition import *
bmgID_track_move = {
"T11": 0x7008, "T12": 0x7001, "T13": 0x7002, "T14": 0x7004,
"T21": 0x7000, "T22": 0x7005, "T23": 0x7006, "T24": 0x7007,
"T31": 0x7009, "T32": 0x700f, "T33": 0x700b, "T34": 0x7003,
"T41": 0x700e, "T42": 0x700a, "T43": 0x700c, "T44": 0x700d,
"T51": 0x7010, "T52": 0x7014, "T53": 0x7019, "T54": 0x701a,
"T61": 0x701b, "T62": 0x701f, "T63": 0x7017, "T64": 0x7012,
"T71": 0x7015, "T72": 0x701e, "T73": 0x701d, "T74": 0x7011,
"T81": 0x7018, "T82": 0x7016, "T83": 0x7013, "T84": 0x701c,
}
trackname_color = {
"MSRDS ": "\c{green}MSRDS\c{off} ",
"CTR ": "\c{YOR4}CTR\c{off} ",
"CTTR ": "\c{YOR5}CTTR\c{off} ",
"CNR ": "\c{YOR5}CNR\c{off} ",
"DKR ": "\c{YOR6}DKR\c{off} ",
"LCP ": "\c{green}LCP\c{off} ",
"LEGO-R ": "\c{red2}LEGO-R\c{off} ",
"MP9 ": "\c{YOR0}MP9\c{off} ",
"MSUSA ": "\c{green}MSUSA\c{off} ",
"FZMV ": "\c{YOR2}FZMV\c{off} ",
"KAR ": "\c{green}KAR\c{off} ",
"KO ": "\c{YOR5}KO\c{off} ",
"FZ ": "\c{YOR2}FZ\c{off} ",
"RV ": "\c{white}RV\c{off} ",
"SADX ": "\c{blue2}SADX\c{off} ",
"SCR ": "\c{YOR2}SCR\c{off} ",
"SH ": "\c{red}SH\c{off} ",
"SM64 ": "\c{red1}SM64\c{off} ",
"SMB1 ": "\c{red2}SMB1\c{off} ",
"SMB2 ": "\c{red3}SMB2\c{off} ",
"SSBB ": "\c{red4}SSBB\c{off} ",
"SMS ": "\c{YOR6}SMS\c{off} ",
"SMO ": "\c{YOR7}SMO\c{off} ",
"VVVVVV ": "\c{blue}VVVVVV\c{off} ",
"WF ": "\c{green}WF\c{off} ",
"WP ": "\c{yellow}WP\c{off} ",
"Zelda OoT ": "\c{green}Zelda OoT\c{off} ",
"Zelda TP ": "\c{green}Zelda TP\c{off} ",
"Zelda WW ": "\c{green}Zelda WW\c{off} ",
"PMWR ": "\c{yellow}PMWR\c{off} ",
"SHR ": "\c{green}SHR\c{off} ",
"SK64 ": "\c{green}SK64\c{off} ",
"SMG ": "\c{red2}SMG\c{off} ",
"Spyro 1 ": "\c{blue}Spyro 1\c{off} ",
"Aléatoire: ": "\c{white}Aléatoire: ",
"Random: ": "\c{white}Random: ",
"Zufällig: ": "\c{white}Zufällig: ",
"Casuale: ": "\c{white}Casuale: ",
"Aleatorio: ": "\c{white}Aleatorio: ",
"Wii U ": "WiiU ",
"Wii ": "\c{blue}Wii\c{off} ",
"WiiU ": "\c{red4}Wii U\c{off} ", # Permet d'éviter que Wii et Wii U se mélange
"3DS ": "\c{YOR3}3DS\c{off} ",
"DS ": "\c{white}DS\c{off} ",
"GCN ": "\c{blue2}GCN\c{off} ",
"GBA ": "\c{blue1}GBA\c{off} ",
"N64 ": "\c{red}N64\c{off} ",
"SNES ": "\c{green}SNES\c{off} ",
"RMX ": "\c{YOR4}RMX\c{off} ",
"MKT ": "\c{YOR5}MKT\c{off} ",
"GP ": "\c{YOR6}GP\c{off} ",
"(Boost)": "\c{YOR3}(Boost)\c{off}",
"★★★ ": "\c{YOR2}★★★\c{off} ",
"★★☆ ": "\c{YOR2}★★☆\c{off} ",
"★☆☆ ": "\c{YOR2}★☆☆\c{off} ",
"★★★! ": "\c{YOR4}★★★\c{off} ",
"★★☆! ": "\c{YOR4}★★☆\c{off} ",
"★☆☆! ": "\c{YOR4}★☆☆\c{off} ",
"★★★!! ": "\c{YOR6}★★★\c{off} ",
"★★☆!! ": "\c{YOR6}★★☆\c{off} ",
"★☆☆!! ": "\c{YOR6}★☆☆\c{off} ",
}
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,
"T21": 0x7000, "T22": 0x7005, "T23": 0x7006, "T24": 0x7007,
"T31": 0x7009, "T32": 0x700f, "T33": 0x700b, "T34": 0x7003,
"T41": 0x700e, "T42": 0x700a, "T43": 0x700c, "T44": 0x700d,
"T51": 0x7010, "T52": 0x7014, "T53": 0x7019, "T54": 0x701a,
"T61": 0x701b, "T62": 0x701f, "T63": 0x7017, "T64": 0x7012,
"T71": 0x7015, "T72": 0x701e, "T73": 0x701d, "T74": 0x7011,
"T81": 0x7018, "T82": 0x7016, "T83": 0x7013, "T84": 0x701c,
}
trackname_color = {
"MSRDS ": "\c{green}MSRDS\c{off} ",
"CTR ": "\c{YOR4}CTR\c{off} ",
"CTTR ": "\c{YOR5}CTTR\c{off} ",
"CNR ": "\c{YOR5}CNR\c{off} ",
"DKR ": "\c{YOR6}DKR\c{off} ",
"LCP ": "\c{green}LCP\c{off} ",
"LEGO-R ": "\c{red2}LEGO-R\c{off} ",
"MP9 ": "\c{YOR0}MP9\c{off} ",
"MSUSA ": "\c{green}MSUSA\c{off} ",
"FZMV ": "\c{YOR2}FZMV\c{off} ",
"KAR ": "\c{green}KAR\c{off} ",
"KO ": "\c{YOR5}KO\c{off} ",
"FZ ": "\c{YOR2}FZ\c{off} ",
"RV ": "\c{white}RV\c{off} ",
"SADX ": "\c{blue2}SADX\c{off} ",
"SCR ": "\c{YOR2}SCR\c{off} ",
"SH ": "\c{red}SH\c{off} ",
"SM64 ": "\c{red1}SM64\c{off} ",
"SMB1 ": "\c{red2}SMB1\c{off} ",
"SMB2 ": "\c{red3}SMB2\c{off} ",
"SSBB ": "\c{red4}SSBB\c{off} ",
"SMS ": "\c{YOR6}SMS\c{off} ",
"SMO ": "\c{YOR7}SMO\c{off} ",
"VVVVVV ": "\c{blue}VVVVVV\c{off} ",
"WF ": "\c{green}WF\c{off} ",
"WP ": "\c{yellow}WP\c{off} ",
"Zelda OoT ": "\c{green}Zelda OoT\c{off} ",
"Zelda TP ": "\c{green}Zelda TP\c{off} ",
"Zelda WW ": "\c{green}Zelda WW\c{off} ",
"PMWR ": "\c{yellow}PMWR\c{off} ",
"SHR ": "\c{green}SHR\c{off} ",
"SK64 ": "\c{green}SK64\c{off} ",
"SMG ": "\c{red2}SMG\c{off} ",
"Spyro 1 ": "\c{blue}Spyro 1\c{off} ",
"Aléatoire: ": "\c{white}Aléatoire: ",
"Random: ": "\c{white}Random: ",
"Zufällig: ": "\c{white}Zufällig: ",
"Casuale: ": "\c{white}Casuale: ",
"Aleatorio: ": "\c{white}Aleatorio: ",
"Wii U ": "WiiU ",
"Wii ": "\c{blue}Wii\c{off} ",
"WiiU ": "\c{red4}Wii U\c{off} ", # Permet d'éviter que Wii et Wii U se mélange
"3DS ": "\c{YOR3}3DS\c{off} ",
"DS ": "\c{white}DS\c{off} ",
"GCN ": "\c{blue2}GCN\c{off} ",
"GBA ": "\c{blue1}GBA\c{off} ",
"N64 ": "\c{red}N64\c{off} ",
"SNES ": "\c{green}SNES\c{off} ",
"RMX ": "\c{YOR4}RMX\c{off} ",
"MKT ": "\c{YOR5}MKT\c{off} ",
"GP ": "\c{YOR6}GP\c{off} ",
"(Boost)": "\c{YOR3}(Boost)\c{off}",
"★★★ ": "\c{YOR2}★★★\c{off} ",
"★★☆ ": "\c{YOR2}★★☆\c{off} ",
"★☆☆ ": "\c{YOR2}★☆☆\c{off} ",
"★★★! ": "\c{YOR4}★★★\c{off} ",
"★★☆! ": "\c{YOR4}★★☆\c{off} ",
"★☆☆! ": "\c{YOR4}★☆☆\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,
}
bmglang = gamefile[-len("E.txt"):-len(".txt")] # Langue du fichier
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",
"--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
bmgtracks = subprocess.run(["./tools/szs/wbmgt", "CAT", get_nodir(gamefile) + ".d/message/Common.bmg"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(gamefile),
@ -129,26 +152,29 @@ def patch_bmg(self, gamefile): # gamefile est le fichier .szs trouvé dans le /
if not(os.path.exists("./file/tmp/")): os.makedirs("./file/tmp/")
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",
"OVERWRITE=./file/tmp/Common.bmg", "--patch-bmg", "OVERWRITE=./file/ExtraCommon.txt"],
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",
"OVERWRITE=./file/tmp/Common.bmg", "--patch-bmg", "OVERWRITE=./file/ExtraCommon.txt"],
creationflags=CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE).stdout.decode()
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"],
creationflags=CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE).stdout.decode()
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"],
creationflags=CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE).stdout.decode()
shutil.rmtree(gamefile + ".d")
os.remove("./file/tmp/Common.bmg")
os.remove("./file/ExtraCommon.txt")
def finalise(common_file, bmgtext):
for console in trackname_color: bmgtext = bmgtext.replace(console, trackname_color[console])
with open(common_file, "w", encoding="utf-8") as f: f.write(bmgtext)
subprocess.run(["./tools/szs/wbmgt", "ENCODE", get_nodir(common_file), "--overwrite"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(common_file))
os.remove(common_file)
def finalise(file, bmgtext, replacement_list):
for text, colored_text in replacement_list.items(): bmgtext = bmgtext.replace(text, colored_text)
with open(file, "w", encoding="utf-8") as f: f.write(bmgtext)
subprocess.run(["./tools/szs/wbmgt", "ENCODE", get_nodir(file), "--overwrite"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(file))
os.remove(file)
finalise(f"./file/Common_{bmglang}.txt", bmgtext)
finalise(f"./file/Common_R{bmglang}.txt", rbmgtext)
finalise(f"./file/Menu_{bmglang}.txt", bmgmenu, menu_replacement)
finalise(f"./file/Common_{bmglang}.txt", bmgcommon, trackname_color)
finalise(f"./file/Common_R{bmglang}.txt", rbmgcommon, trackname_color)
except:
self.log_error()

View file

@ -21,10 +21,12 @@ def patch_file(self):
self.patch_img_desc()
self.patch_image(fc)
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()
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.config(text=f'{self.translate("Installer le mod")} (v{self.VERSION})')
except: self.log_error()
finally: self.Progress(show=False)

View file

@ -8,8 +8,8 @@ import os
def count_track(self):
tracks = []
with open("./ct_config.json", encoding="utf-8") as f:
ctconfig = json.load(f)
with open("./ct_config.json", encoding="utf-8") as f: ctconfig = json.load(f)
self.VERSION = ctconfig["version"]
for cup in ctconfig["cup"].values():
if not (cup["locked"]): tracks.extend(cup["courses"].values())
tracks.extend(ctconfig["tracks_list"])
@ -34,30 +34,47 @@ def patch_track(self, tracks, total_track="?"):
process_list = {}
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
process_list[track_file] = None # Used for
self.Progress(statut=self.translate("Conversion des courses") + f"\n({i + 1}/{total_track})\n" +
"\n".join(process_list.keys()), add=1)
"\n".join(process_list.keys()), add=1)
for _track in [get_track_szs(track_file), get_track_wu8(track_file)]:
if os.path.exists(_track):
if os.path.getsize(_track) < 1000: # File under this size are corrupted
os.remove(_track)
download_returncode = self.get_github_file(get_track_wu8(track_file))
if download_returncode == -1: # can't download
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 du téléchargement."))
return -1
else:
messagebox.showwarning(self.translate("Attention"),
self.translate("Impossible de télécharger cette course ! (") +
str(error_count) + "/" + str(error_max) + ")")
while True:
download_returncode = self.get_github_file(get_track_wu8(track_file))
if download_returncode == -1: # can't download
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 du téléchargement."))
return -1
else:
messagebox.showwarning(self.translate("Attention"),
self.translate("Impossible de télécharger cette course ! (") +
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(
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():
if process is not None:
if process.poll() is None:
print("still running...")
pass # if the process is still running
else: # process ended
process_list.pop(track_file)
@ -110,10 +126,9 @@ def patch_track(self, tracks, total_track="?"):
else: return 0
for i, track in enumerate(tracks):
track_file = get_trackname(track=track)
while True:
if len(process_list) < max_process:
returncode = add_process(track_file)
returncode = add_process(track)
if returncode == 0: break
elif returncode == -1: return -1 # if error occur, stop function
elif clean_process() == -1: return -1

View file

@ -1,5 +1,7 @@
{
"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 lecode.bin": "Patch lecode.bin",
"Installation du mod": "Installing mod",

View file

@ -1,7 +1,7 @@
{
"version": "0.7",
"version": "0.8",
"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",
"download_bin": "https://github.com/Faraphel/MKWF-Install/releases/download/0.7/MKWF.v0.7.zip",
"changelog": "",
"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"
}