Merge pull request #16 from Faraphel/dev

v0.6.1
This commit is contained in:
Faraphel 2021-06-16 16:45:16 +02:00 committed by GitHub
commit 0f2a8dbaae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 124 additions and 46 deletions

8
.gitignore vendored
View file

@ -88,3 +88,11 @@
/test/
/distribution.txt
/error.log
/file/Common_RU.bmg
/file/Common_U.bmg
/file/Common_RQ.bmg
/file/Common_RM.bmg
/file/Common_Q.bmg
/file/Common_M.bmg
/file/Common_RJ.bmg
/file/Common_J.bmg

View file

@ -20,18 +20,6 @@
"strapA_608x456fr.png": "TEX.RGB565",
"strapA_608x456ge.png": "TEX.RGB565",
"strapA_608x456it.png": "TEX.RGB565",
"strapB_16_9_832x456de.png": "TEX.RGB565",
"strapB_16_9_832x456en.png": "TEX.RGB565",
"strapB_16_9_832x456es.png": "TEX.RGB565",
"strapB_16_9_832x456fr.png": "TEX.RGB565",
"strapB_16_9_832x456ge.png": "TEX.RGB565",
"strapB_16_9_832x456it.png": "TEX.RGB565",
"strapB_608x456de.png": "TEX.RGB565",
"strapB_608x456en.png": "TEX.RGB565",
"strapB_608x456es.png": "TEX.RGB565",
"strapB_608x456fr.png": "TEX.RGB565",
"strapB_608x456ge.png": "TEX.RGB565",
"strapB_608x456it.png": "TEX.RGB565",
"savebanner.tpl.png": "TPL.RGB565",
"ct_icons.tpl.png": "TPL.CMPR"
}

34
fs.json
View file

@ -25,22 +25,26 @@
"Scene/UI/*_E.szs": {"/message/Common.bmg": "Common_E.bmg"},
"Scene/UI/*_U.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_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_S.bmg"},
"Scene/UI/*_M.szs": {"/message/Common.bmg": "Common_M.bmg"},
"Scene/UI/Race_E.szs": {"/message/Common.bmg": "Common_RE.bmg"},
"Scene/UI/Race_U.szs": {"/message/Common.bmg": "Common_RE.bmg"},
"Scene/UI/Race_K.szs": {"/message/Common.bmg": "Common_RK.bmg"},
"Scene/UI/Race_J.szs": {"/message/Common.bmg": "Common_RJ.bmg"},
"Scene/UI/Race_U.szs": {"/message/Common.bmg": "Common_RU.bmg"},
"Scene/UI/Race_F.szs": {"/message/Common.bmg": "Common_RF.bmg"},
"Scene/UI/Race_Q.szs": {"/message/Common.bmg": "Common_RF.bmg"},
"Scene/UI/Race_Q.szs": {"/message/Common.bmg": "Common_RQ.bmg"},
"Scene/UI/Race_G.szs": {"/message/Common.bmg": "Common_RG.bmg"},
"Scene/UI/Race_I.szs": {"/message/Common.bmg": "Common_RI.bmg"},
"Scene/UI/Race_S.szs": {"/message/Common.bmg": "Common_RS.bmg"},
"Scene/UI/Race_M.szs": {"/message/Common.bmg": "Common_RS.bmg"},
"Scene/UI/Race_M.szs": {"/message/Common.bmg": "Common_RM.bmg"},
"Boot/Strap/eu/Dutch.szs": {
"/Textures(NW4R)/strapA_16_9_832x456": "strapA_16_9_832x456de",
@ -60,6 +64,24 @@
"/Textures(NW4R)/strapA_608x456": "strapA_608x456en",
"/Textures(NW4R)/strapB_608x456": "strapA_608x456en"
},
"Boot/Strap/jp/jp.szs": {
"/Textures(NW4R)/strapA_16_9_832x456": "strapA_16_9_832x456en",
"/Textures(NW4R)/strapB_16_9_832x456": "strapA_16_9_832x456en",
"/Textures(NW4R)/strapA_608x456": "strapA_608x456en",
"/Textures(NW4R)/strapB_608x456": "strapA_608x456en"
},
"Boot/Strap/kr/Korean.szs": {
"/Textures(NW4R)/strapA_16_9_832x456": "strapA_16_9_832x456en",
"/Textures(NW4R)/strapB_16_9_832x456": "strapA_16_9_832x456en",
"/Textures(NW4R)/strapA_608x456": "strapA_608x456en",
"/Textures(NW4R)/strapB_608x456": "strapA_608x456en"
},
"Boot/Strap/ch/Chinese.szs": {
"/Textures(NW4R)/strapA_16_9_832x456": "strapA_16_9_832x456en",
"/Textures(NW4R)/strapB_16_9_832x456": "strapA_16_9_832x456en",
"/Textures(NW4R)/strapA_608x456": "strapA_608x456en",
"/Textures(NW4R)/strapB_608x456": "strapA_608cccx456en"
},
"Boot/Strap/eu/French.szs": {
"/Textures(NW4R)/strapA_16_9_832x456": "strapA_16_9_832x456fr",
"/Textures(NW4R)/strapB_16_9_832x456": "strapA_16_9_832x456fr",

View file

@ -27,6 +27,9 @@ include_files = [
("./file/CourseSelectCup.brctr", "./file/CourseSelectCup.brctr"),
("./file/course_name.brlyt", "./file/course_name.brlyt"),
("./file/lecode-PAL.bin", "./file/lecode-PAL.bin"),
("./file/lecode-USA.bin", "./file/lecode-USA.bin"),
("./file/lecode-JAP.bin", "./file/lecode-JAP.bin"),
("./file/lecode-KOR.bin", "./file/lecode-KOR.bin"),
("./file/itemBoxNiseRtpa.brres", "./file/itemBoxNiseRtpa.brres"),
("./file/lpar-default.txt", "./file/lpar-default.txt"),
("./file/RKRace.breff", "./file/RKRace.breff"),

View file

@ -2,6 +2,7 @@ from tkinter import *
from tkinter import messagebox, filedialog, ttk
from threading import Thread
import subprocess
import glob
import os
from .definition import *
@ -46,7 +47,7 @@ def __init__(self):
Button(self.frame_game_path, text="...", relief=RIDGE, command=select_path).grid(row=1, column=2, sticky="NEWS")
self.frame_game_path_action = Frame(self.frame_game_path) # Action Extraire & Tout faire
self.frame_game_path_action = Frame(self.frame_game_path) # Extract and do everything button
self.frame_game_path_action.grid(row=2, column=1, columnspan=2, sticky="NEWS")
self.frame_game_path_action.columnconfigure(1, weight=1)
@ -65,6 +66,7 @@ def __init__(self):
self.translate("Ce dossier sera écrasé si vous installer le mod !\n" +
"Êtes-vous sûr de vouloir l'utiliser ?")):
self.path_mkwf = os.path.realpath(path + "/../../")
else: return
elif extension.upper() in ["ISO", "WBFS", "WIA", "CSIO"]:
# Fiding a directory name that dosen't already exist
directory_name, i = "MKWiiFaraphel", 1
@ -86,14 +88,33 @@ def __init__(self):
self.Progress(show=False)
return
if os.path.exists(self.path_mkwf + "/files/rel/lecode-PAL.bin"):
if glob.glob(self.path_mkwf + "/files/rel/lecode-???.bin"): # if a LECODE file is already here
messagebox.showwarning(self.translate("Attention"),
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 = "):]
self.original_game_ID = setup[:setup.find("\n")]
except:
messagebox.showwarning(self.translate("Attention"),
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]]
except: self.original_region = "PAL"
self.frame_action.grid(row=3, column=1, sticky="NEWS")
except: self.log_error()
finally:
self.frame_action.grid(row=3, column=1, sticky="NEWS")
self.Progress(show=False)
t = Thread(target=func)

View file

@ -89,18 +89,19 @@ def install_mod(self):
"--add-lecode"], creationflags=CREATE_NO_WINDOW, cwd=get_dir(self.path_mkwf),
check=True, stdout=subprocess.PIPE)
self.Progress(statut=self.translate("Patch lecode-PAL.bin"), add=1)
self.Progress(statut=self.translate("Patch lecode.bin"), add=1)
shutil.copytree("./file/Track/", self.path_mkwf+"/files/Race/Course/", dirs_exist_ok=True)
if not(os.path.exists(self.path_mkwf+"/tmp/")): os.makedirs(self.path_mkwf+"/tmp/")
filecopy("./file/CTFILE.txt", self.path_mkwf+"/tmp/CTFILE.txt")
filecopy("./file/lpar-default.txt", self.path_mkwf + "/tmp/lpar-default.txt")
filecopy("./file/lecode-PAL.bin", self.path_mkwf + "/tmp/lecode-PAL.bin")
filecopy(f"./file/lecode-{self.original_region}.bin", self.path_mkwf + f"/tmp/lecode-{self.original_region}.bin")
subprocess.run(
["./tools/szs/wlect", "patch", "./tmp/lecode-PAL.bin", "-od", "./files/rel/lecode-PAL.bin",
"--track-dir", "./files/Race/Course/", "--move-tracks", "./files/Race/Course/", "--le-define",
"./tmp/CTFILE.txt", "--lpar", "./tmp/lpar-default.txt", "--overwrite"],
["./tools/szs/wlect", "patch", f"./tmp/lecode-{self.original_region}.bin", "-od",
f"./files/rel/lecode-{self.original_region}.bin", "--track-dir", "./files/Race/Course/",
"--move-tracks", "./files/Race/Course/", "--le-define", "./tmp/CTFILE.txt", "--lpar",
"./tmp/lpar-default.txt", "--overwrite"],
creationflags=CREATE_NO_WINDOW, cwd=self.path_mkwf, check=True, stdout=subprocess.PIPE)
shutil.rmtree(self.path_mkwf + "/tmp/")
@ -111,13 +112,13 @@ def install_mod(self):
if outputformat in ["ISO", "WBFS", "CISO"]:
self.path_mkwf_format = os.path.realpath(self.path_mkwf + "/../MKWFaraphel." + outputformat.lower())
subprocess.run(["./tools/wit/wit", "COPY", get_nodir(self.path_mkwf), "--DEST",
get_nodir(self.path_mkwf_format), f"--{outputformat.lower()}", "--overwrite"],
CREATE_NO_WINDOW, cwd=get_dir(self.path_mkwf),
get_nodir(self.path_mkwf_format), f"--{outputformat.lower()}", "--overwrite"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(self.path_mkwf),
check=True, stdout=subprocess.PIPE)
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_dir(self.path_mkwf_format), "--id", "RMCP60"],
subprocess.run(["./tools/wit/wit", "EDIT", get_nodir(self.path_mkwf_format), "--id", "RMCP60"], # see to maybe change ID to MKWF
creationflags=CREATE_NO_WINDOW, cwd=get_dir(self.path_mkwf_format),
check=True, stdout=subprocess.PIPE)

View file

@ -102,7 +102,7 @@ def patch_bmg(self, gamefile): # gamefile est le fichier .szs trouvé dans le /
trackend = "2328"
bmgtracks = bmgtracks[bmgtracks.find(trackheader) + len(trackheader):bmgtracks.find(trackend)]
with open("./file/ExtraCommon.txt", "w") as f:
with open("./file/ExtraCommon.txt", "w", encoding="utf8") as f:
f.write("#BMG\n\n"
f" 703e\t= {self.translate('Aléatoire: Toutes les pistes', lang=bmglang)}\n"
f" 703f\t= {self.translate('Aléatoire: Pistes Originales', lang=bmglang)}\n"

View file

@ -1,5 +1,7 @@
from tkinter import messagebox
from threading import Thread
import subprocess
import shutil
import json
import glob
import os
@ -31,17 +33,23 @@ def patch_file(self):
for i, file in enumerate(fc["img"]):
self.Progress(statut=self.translate("Conversion des images")+f"\n({i + 1}/{len(fc['img'])}) {file}", add=1)
subprocess.run(["./tools/szs/wimgt", "ENCODE", "./file/" + file, "-x", fc["img"][file], "--overwrite"],
creationflags=CREATE_NO_WINDOW)
creationflags=CREATE_NO_WINDOW, check=True, stdout=subprocess.PIPE)
for file in glob.glob(self.path_mkwf+"/files/Scene/UI/MenuSingle_?.szs"):
self.patch_bmg(file)
if not(os.path.exists("./file/auto-add/")):
subprocess.run(["./tools/szs/wszst", "AUTOADD", self.path_mkwf + "/files/Race/Course/", "--DEST",
"./file/auto-add/"], creationflags=CREATE_NO_WINDOW)
if os.path.exists("./file/auto-add"): shutil.rmtree("./file/auto-add")
if not(os.path.exists(self.path_mkwf + "/tmp/")): os.makedirs(self.path_mkwf + "/tmp/")
subprocess.run(["./tools/szs/wszst", "AUTOADD", get_nodir(self.path_mkwf) + "/files/Race/Course/",
"--DEST", get_nodir(self.path_mkwf) + "/tmp/auto-add/"],
creationflags=CREATE_NO_WINDOW, cwd=get_dir(self.path_mkwf),
check=True, stdout=subprocess.PIPE)
shutil.move(self.path_mkwf + "/tmp/auto-add/", "./file/auto-add/")
shutil.rmtree(self.path_mkwf + "/tmp/")
max_process = 8
process_list = {}
error_count, error_max = 0, 3
for i, file in enumerate(os.listdir("./file/Track-WU8/")):
while True:
@ -50,28 +58,55 @@ def patch_file(self):
self.Progress(statut=self.translate("Conversion des courses")+f"\n({i + 1}/{total_track})\n" +
"\n".join(process_list.keys()), add=1)
if not (os.path.exists("./file/Track/" + get_filename(file) + ".szs")):
track_szs_file = f"./file/Track/{get_filename(file)}.szs"
if os.path.exists(track_szs_file):
if os.path.getsize(track_szs_file) < 1000: # File under this size are corrupted
os.remove(track_szs_file)
if not(os.path.exists(track_szs_file)):
process_list[file] = subprocess.Popen([
"./tools/szs/wszst", "NORMALIZE", "./file/Track-WU8/" + file, "--DEST",
"./file/Track/%N.szs", "--szs", "--overwrite", "--autoadd-path",
"./file/auto-add/"], creationflags=CREATE_NO_WINDOW)
"./file/auto-add/"], creationflags=CREATE_NO_WINDOW, stderr=subprocess.PIPE)
break
else:
for process in process_list:
if process_list[process] is not None:
if not (process_list[process].poll() is None):
process_list.pop(process)
break
returncode = process_list[process].poll()
if returncode is None: pass # if the process is still running
else: # process ended
stderr = process_list[process].stderr.read()
if b"wszst: ERROR" in stderr: # Error occured
process_list.pop(process)
os.remove(f"./file/Track/{get_filename(process)}.szs")
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 conversion."))
return
else: # if the error max hasn't been reach
messagebox.showwarning(
self.translate("Attention"),
self.translate("La course ") +
process +
self.translate(" n'a pas été correctement converti. (") +
str(error_count) + "/"+str(error_max)+")")
break
else:
process_list.pop(process)
break
else:
process_list.pop(process)
break
self.Progress(show=False)
self.button_install_mod.grid(row=2, column=1, sticky="NEWS")
self.listbox_outputformat.grid(row=2, column=2, sticky="NEWS")
except:
self.log_error()
except: self.log_error()
finally: self.Progress(show=False)
t = Thread(target=func)
t.setDaemon(True)

View file

@ -1 +1 @@
{"en": {"Une erreur est survenue :": "An error occured :", "Cette action va extraire / utiliser la ROM s\u00e9lectionn\u00e9, pr\u00e9parer les fichiers et installer le mod. Voulez-vous continuer ?": "This will extract the selected ROM, prepare files and install mod. Do you wish to continue ?", "Fonctionnalit\u00e9 exp\u00e9rimentale": "Experimental functionality", "Tout faire": "Do everything", "Cr\u00e9ation des images descriptives": "Creation of descriptive images", "Cr\u00e9ation de ct_icon.png": "Creating ct_icon.png", "Patch des textes ": "Patching text ", "Al\u00e9atoire: Toutes les pistes": "Random: All tracks", "Al\u00e9atoire: Pistes Originales": "Random: Original tracks", "Al\u00e9atoire: Custom Tracks": "Random: Custom Tracks", "Al\u00e9atoire: Pistes Nouvelles": "Random: New tracks", "MKWFaraphel Installateur": "MKWFaraphel Installer", "Jeu Wii": "Wii game", "Jeu original": "Original game", "Erreur": "Error", "Le chemin de fichier est invalide": "The file path in invalid", "Attention": "Warning", "Ce dossier sera \u00e9cras\u00e9 si vous installer le mod !\n\u00cates-vous s\u00fbr de vouloir l'utiliser ?": "This directory will be overwritten if you install the mod !\nAre you sure you want to use it ?", "Extraction du jeu...": "Extracting the game...", "Le type de fichier n'est pas reconnu": "This file type is not supported", "Cette ROM est d\u00e9j\u00e0 modd\u00e9, il est d\u00e9conseill\u00e9 de l'utiliser pour installer le mod": "This game is already modded, it is not recommended to use it to install the mod", "Extraire le fichier": "Extract file", "Preparer les fichiers": "Prepare files", "Action": "Action", "Installer le mod": "Install mod", "Dossier": "Directory", "Langage : ": "Language : ", "Mise \u00e0 jour disponible !": "Update available !", "Une mise \u00e0 jour est disponible, souhaitez-vous l'installer ?": "An update is available, do you want to install it ?", "T\u00e9l\u00e9chargement de Updater en cours...": "Downloading the Updater...", "fin du t\u00e9l\u00e9chargement, d\u00e9but de l'extraction...": "end of the download, extracting...", "fin de l'extraction": "finished extracting", "lancement de l'application...": "starting application...", "Modification de": "Modifying", "Recompilation de": "Recompilating", "Conversion en": "Converting to", "Changement de l'ID du jeu": "editing game's ID", "Fin": "End", "L'installation est termin\u00e9 !": "The mod has been installed !", "Conversion des fichiers": "Converting files", "Conversion des images": "Converting images", "Conversion des textes": "Converting texts", "Conversion des courses": "Converting races", "Configuration de LE-CODE": "Configurating LE-CODE"}, "ge": {"Al\u00e9atoire: Toutes les pistes": "Zuf\u00e4llig: Alle Spuren", "Al\u00e9atoire: Pistes Originales": "Zuf\u00e4llig: Original-Spuren", "Al\u00e9atoire: Custom Tracks": "Zuf\u00e4llig: Custom Tracks", "Al\u00e9atoire: Pistes Nouvelles": "Zuf\u00e4llig: Neue Spuren"}, "it": {"Al\u00e9atoire: Toutes les pistes": "Casuale: Tutte le tracce", "Al\u00e9atoire: Pistes Originales": "Casuale: Tracce originali", "Al\u00e9atoire: Custom Tracks": "Casuale: Custom Tracks", "Al\u00e9atoire: Pistes Nouvelles": "Casuale: Nuovi brani"}, "sp": {"Al\u00e9atoire: Toutes les pistes": "Aleatorio: Todas las pistas", "Al\u00e9atoire: Pistes Originales": "Aleatorio: Pistas originales", "Al\u00e9atoire: Custom Tracks": "Aleatorio: Custom Tracks", "Al\u00e9atoire: Pistes Nouvelles": "Aleatorio: Pistas nuevas"}, "selected": "fr"}
{"en": {"La course ": "The track ", " n'a pas été correctement converti. (": "hasn't been correctly converted. (", "Trop de course ont eu une erreur de conversion.": "Too much track had a conversion issue.", "Une erreur est survenue :": "An error occured :", "Cette action va extraire / utiliser la ROM s\u00e9lectionn\u00e9, pr\u00e9parer les fichiers et installer le mod. Voulez-vous continuer ?": "This will extract the selected ROM, prepare files and install mod. Do you wish to continue ?", "Fonctionnalit\u00e9 exp\u00e9rimentale": "Experimental functionality", "Tout faire": "Do everything", "Cr\u00e9ation des images descriptives": "Creation of descriptive images", "Cr\u00e9ation de ct_icon.png": "Creating ct_icon.png", "Patch des textes ": "Patching text ", "Al\u00e9atoire: Toutes les pistes": "Random: All tracks", "Al\u00e9atoire: Pistes Originales": "Random: Original tracks", "Al\u00e9atoire: Custom Tracks": "Random: Custom Tracks", "Al\u00e9atoire: Pistes Nouvelles": "Random: New tracks", "MKWFaraphel Installateur": "MKWFaraphel Installer", "Jeu Wii": "Wii game", "Jeu original": "Original game", "Erreur": "Error", "Le chemin de fichier est invalide": "The file path in invalid", "Attention": "Warning", "Ce dossier sera \u00e9cras\u00e9 si vous installer le mod !\n\u00cates-vous s\u00fbr de vouloir l'utiliser ?": "This directory will be overwritten if you install the mod !\nAre you sure you want to use it ?", "Extraction du jeu...": "Extracting the game...", "Le type de fichier n'est pas reconnu": "This file type is not supported", "Cette ROM est d\u00e9j\u00e0 modd\u00e9, il est d\u00e9conseill\u00e9 de l'utiliser pour installer le mod": "This game is already modded, it is not recommended to use it to install the mod", "Extraire le fichier": "Extract file", "Preparer les fichiers": "Prepare files", "Action": "Action", "Installer le mod": "Install mod", "Dossier": "Directory", "Langage : ": "Language : ", "Mise \u00e0 jour disponible !": "Update available !", "Une mise \u00e0 jour est disponible, souhaitez-vous l'installer ?": "An update is available, do you want to install it ?", "T\u00e9l\u00e9chargement de Updater en cours...": "Downloading the Updater...", "fin du t\u00e9l\u00e9chargement, d\u00e9but de l'extraction...": "end of the download, extracting...", "fin de l'extraction": "finished extracting", "lancement de l'application...": "starting application...", "Modification de": "Modifying", "Recompilation de": "Recompilating", "Conversion en": "Converting to", "Changement de l'ID du jeu": "editing game's ID", "Fin": "End", "L'installation est termin\u00e9 !": "The mod has been installed !", "Conversion des fichiers": "Converting files", "Conversion des images": "Converting images", "Conversion des textes": "Converting texts", "Conversion des courses": "Converting races", "Configuration de LE-CODE": "Configurating LE-CODE"}, "ge": {"Al\u00e9atoire: Toutes les pistes": "Zuf\u00e4llig: Alle Spuren", "Al\u00e9atoire: Pistes Originales": "Zuf\u00e4llig: Original-Spuren", "Al\u00e9atoire: Custom Tracks": "Zuf\u00e4llig: Custom Tracks", "Al\u00e9atoire: Pistes Nouvelles": "Zuf\u00e4llig: Neue Spuren"}, "it": {"Al\u00e9atoire: Toutes les pistes": "Casuale: Tutte le tracce", "Al\u00e9atoire: Pistes Originales": "Casuale: Tracce originali", "Al\u00e9atoire: Custom Tracks": "Casuale: Custom Tracks", "Al\u00e9atoire: Pistes Nouvelles": "Casuale: Nuovi brani"}, "sp": {"Al\u00e9atoire: Toutes les pistes": "Aleatorio: Todas las pistas", "Al\u00e9atoire: Pistes Originales": "Aleatorio: Pistas originales", "Al\u00e9atoire: Custom Tracks": "Aleatorio: Custom Tracks", "Al\u00e9atoire: Pistes Nouvelles": "Aleatorio: Pistas nuevas"}, "selected": "fr"}

View file

@ -1,7 +1,7 @@
{
"version": "0.6",
"subversion": "0",
"changelog": "- The image of the score system explanation now have explain the star's color\n- Microsoft Visual C++ should now be included with the installer, avoiding an error with vcruntime140.dll\n- Update will now be detected by the installer when changing subversion (0.5.1 -> 0.5.2 will be detected)\n- A new file named \"error.log\" can now be generated when an error is occurring, helping debugging\n- Updated cx_freeze so that having special character in path don't cause issue (.exe version)\n- Fixed an issue where having a dump with a DATA directory would cause the installer to not work",
"download_bin": "https://github.com/Faraphel/MKWF-Install/releases/download/0.6/MKWF.v0.6.zip",
"subversion": "1",
"changelog": "- JAP, USA and KOR version are now supported by the installer !",
"download_bin": "https://github.com/Faraphel/MKWF-Install/releases/download/0.6.1/MKWF.v0.6.1.zip",
"updater_bin": "https://github.com/Faraphel/MKWF-Install/raw/master/Updater/Updater.zip"
}