mirror of
https://github.com/Faraphel/Atlas-Install.git
synced 2025-07-13 16:18:22 +02:00
commit
668fa8f846
22 changed files with 230 additions and 144 deletions
11
.gitignore
vendored
11
.gitignore
vendored
|
@ -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.
Binary file not shown.
Binary file not shown.
|
@ -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
20
fs.json
|
@ -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"},
|
||||||
|
|
2
main.pyw
2
main.pyw
|
@ -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
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
{"language": "en", "format": "FST", "disable_download": false, "del_track_after_conv": false, "dont_check_for_update": false, "process_track": 8}
|
|
|
@ -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")
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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",
|
||||||
|
|
6
version
6
version
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue