diff --git a/src/main/java/emu/grasscutter/tools/Tools.java b/src/main/java/emu/grasscutter/tools/Tools.java index 475649b1f..2081299d3 100644 --- a/src/main/java/emu/grasscutter/tools/Tools.java +++ b/src/main/java/emu/grasscutter/tools/Tools.java @@ -1,10 +1,12 @@ package emu.grasscutter.tools; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; +import java.io.FilenameFilter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; @@ -30,13 +32,73 @@ import emu.grasscutter.data.def.SceneData; import emu.grasscutter.utils.Utils; public final class Tools { - - @SuppressWarnings("deprecation") public static void createGmHandbook() throws Exception { + ToolsWithLanguageOption.createGmHandbook(getLanguageOption()); + } + + public static void createGachaMapping(String location) throws Exception { + ToolsWithLanguageOption.createGachaMapping(location, getLanguageOption()); + } + + public static List getAvailableLanguage() throws Exception { + File textMapFolder = new File(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMap"); + List availableLangList = new ArrayList(); + for (String textMapFileName : textMapFolder.list(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + if (name.startsWith("TextMap") && name.endsWith(".json")){ + return true; + } + return false; + } + })) { + availableLangList.add(textMapFileName.replace("TextMap","").replace(".json","").toLowerCase()); + } + return availableLangList; + } + + public static String getLanguageOption() throws Exception { + List availableLangList = getAvailableLanguage(); + + // Use system out for better format + if (availableLangList.size() == 1) { + return availableLangList.get(0).toUpperCase(); + } + System.out.println("The following languages mappings are available, please select one: [default: EN]"); + String groupedLangList = "> "; + int groupedLangCount = 0; + String input = ""; + for (String availableLanguage: availableLangList){ + groupedLangCount++; + groupedLangList = groupedLangList + "" + availableLanguage + "\t"; + if (groupedLangCount == 6) { + System.out.println(groupedLangList); + groupedLangCount = 0; + groupedLangList = "> "; + } + } + if (groupedLangCount > 0) { + System.out.println(groupedLangList); + } + System.out.print("\nYour choice:[EN]"); + + input = new BufferedReader(new InputStreamReader(System.in)).readLine(); + if (availableLangList.contains(input.toLowerCase())) { + return input.toUpperCase(); + } + Grasscutter.getLogger().info("Invalid option. Will use EN(English) as fallback"); + + return "EN"; + } +} + +final class ToolsWithLanguageOption { + @SuppressWarnings("deprecation") + public static void createGmHandbook(String language) throws Exception { ResourceLoader.loadResources(); Map map; - try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMap/TextMapEN.json")), StandardCharsets.UTF_8)) { + try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMap/TextMap"+language+".json")), StandardCharsets.UTF_8)) { map = Grasscutter.getGsonFactory().fromJson(fileReader, new TypeToken>() {}.getType()); } @@ -96,11 +158,11 @@ public final class Tools { } @SuppressWarnings("deprecation") - public static void createGachaMapping(String location) throws Exception { + public static void createGachaMapping(String location, String language) throws Exception { ResourceLoader.loadResources(); Map map; - try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMap/TextMapEN.json")), StandardCharsets.UTF_8)) { + try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMap/TextMap"+language+".json")), StandardCharsets.UTF_8)) { map = Grasscutter.getGsonFactory().fromJson(fileReader, new TypeToken>() {}.getType()); } @@ -113,6 +175,9 @@ public final class Tools { list = new ArrayList<>(GameData.getAvatarDataMap().keySet()); Collections.sort(list); + // if the user made choices for language, I assume it's okay to assign his/her selected language to "en-us" + // since it's the fallback language and there will be no difference in the gacha record page. + // The enduser can still modify the `gacha_mappings.js` directly to enable multilingual for the gacha record system. writer.println("mappings = {\"en-us\": {"); // Avatars @@ -140,10 +205,10 @@ public final class Tools { default: color = "blue"; } - + // Got the magic number 4233146695 from manually search in the json file writer.println( "\"" + (avatarID % 1000 + 1000) + "\" : [\"" - + map.get(data.getNameTextMapHash()) + "(Avatar)\", \"" + + map.get(data.getNameTextMapHash()) + "(" + map.get(4233146695L)+ ")\", \"" + color + "\"]"); } @@ -173,9 +238,12 @@ public final class Tools { default: continue; // skip unnecessary entries } + + // Got the magic number 4231343903 from manually search in the json file + writer.println(",\"" + data.getId() + "\" : [\"" + map.get(data.getNameTextMapHash()).replaceAll("\"", "") - + "(Weapon)\",\""+ color + "\"]"); + + "("+ map.get(4231343903L)+")\",\""+ color + "\"]"); } writer.println(",\"200\": \"Standard\", \"301\": \"Avatar Event\", \"302\": \"Weapon event\""); writer.println("}\n}");