diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java b/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java index 9122475da..ef0b7afa1 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java @@ -11,8 +11,9 @@ import emu.grasscutter.utils.Utils; import lombok.Getter; public class GachaBanner { - @Getter private int gachaType; - @Getter private int scheduleId; + @Getter private int gachaType = -1; + @Getter int scheduleId = -1; + @Getter int sortId = -1; @Getter private String prefabPath; @Getter private String previewPrefabPath; @Getter private String titlePath; @@ -20,26 +21,40 @@ public class GachaBanner { private int costItemAmount = 1; private int costItemId10 = 0; private int costItemAmount10 = 10; - @Getter private int beginTime; - @Getter private int endTime; - @Getter private int sortId; + @Getter private int beginTime = 0; + @Getter private int endTime = 1924992000; @Getter private int gachaTimesLimit = Integer.MAX_VALUE; @Getter private int[] rateUpItems4 = {}; @Getter private int[] rateUpItems5 = {}; - @Getter private int[] fallbackItems3 = {11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304}; - @Getter private int[] fallbackItems4Pool1 = {1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1059, 1064, 1065, 1067, 1068, 1072}; - @Getter private int[] fallbackItems4Pool2 = {11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405}; - @Getter private int[] fallbackItems5Pool1 = {1003, 1016, 1042, 1035, 1041, 1069}; - @Getter private int[] fallbackItems5Pool2 = {11501, 11502, 12501, 12502, 13502, 13505, 14501, 14502, 15501, 15502}; - @Getter private boolean removeC6FromPool = false; - @Getter private boolean autoStripRateUpFromFallback = true; - private int[][] weights4 = {{1,510}, {8,510}, {10,10000}}; - private int[][] weights5 = {{1,75}, {73,150}, {90,10000}}; - private int[][] poolBalanceWeights4 = {{1,255}, {17,255}, {21,10455}}; - private int[][] poolBalanceWeights5 = {{1,30}, {147,150}, {181,10230}}; - private int eventChance4 = 50; // Chance to win a featured event item - private int eventChance5 = 50; // Chance to win a featured event item + // This now handles default values for the fields below @Getter private BannerType bannerType = BannerType.STANDARD; + // Constants used by the BannerType enum + static final int[][] DEFAULT_WEIGHTS_4 = {{1,510}, {8,510}, {10,10000}}; + static final int[][] DEFAULT_WEIGHTS_4_WEAPON = {{1, 600}, {7, 600}, {8, 6600}, {10, 12600}}; + static final int[][] DEFAULT_WEIGHTS_5 = {{1,75}, {73,150}, {90,10000}}; + static final int[][] DEFAULT_WEIGHTS_5_CHARACTER = {{1,80}, {73,80}, {90,10000}}; + static final int[][] DEFAULT_WEIGHTS_5_WEAPON = {{1,100}, {62,100}, {73,7800}, {80,10000}}; + static final int[] DEFAULT_FALLBACK_ITEMS_4_POOL_1 = {1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1059, 1064, 1065, 1067, 1068, 1072}; // Default avatars + static final int[] DEFAULT_FALLBACK_ITEMS_4_POOL_2 = {11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405}; // Default weapons + static final int[] DEFAULT_FALLBACK_ITEMS_5_POOL_1 = {1003, 1016, 1042, 1035, 1041, 1069}; // Default avatars + static final int[] DEFAULT_FALLBACK_ITEMS_5_POOL_2 = {11501, 11502, 12501, 12502, 13502, 13505, 14501, 14502, 15501, 15502}; // Default weapons + static final int[] EMPTY_POOL = {}; // Used to remove a type of fallback + // These don't change between banner types (apart from Standard having three extra 4star avatars) + @Getter private int[] fallbackItems3 = {11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304}; + @Getter private int[] fallbackItems4Pool1 = DEFAULT_FALLBACK_ITEMS_4_POOL_1; + @Getter private int[] fallbackItems4Pool2 = DEFAULT_FALLBACK_ITEMS_4_POOL_2; + // Different banner types have different defaults, see above for default values and the enum for which are used where. + @Getter private int[] fallbackItems5Pool1; + @Getter private int[] fallbackItems5Pool2; + private int[][] weights4; + private int[][] weights5; + private int eventChance4 = -1; // Chance to win a featured event item + private int eventChance5 = -1; // Chance to win a featured event item + // + @Getter private boolean removeC6FromPool = false; + @Getter private boolean autoStripRateUpFromFallback = true; // Ensures that featured items won't "double dip" into the losing pool + private int[][] poolBalanceWeights4 = {{1,255}, {17,255}, {21,10455}}; // Used to ensure that players won't go too many rolls without getting something from pool 1 (avatar) or pool 2 (weapon) + private int[][] poolBalanceWeights5 = {{1,30}, {147,150}, {181,10230}}; @Getter private int wishMaxProgress = 2; // Deprecated fields that were tolerated in early May 2022 but have apparently still being circulating in new custom configs @@ -53,12 +68,14 @@ public class GachaBanner { @Deprecated private int minItemType = -1; @Deprecated private int maxItemType = -1; @Getter private boolean deprecated = false; + @Getter private boolean disabled = false; private void warnDeprecated(String name, String replacement) { Grasscutter.getLogger().error("Deprecated field found in Banners config: "+name+" was replaced back in early May 2022, use "+replacement+" instead. You MUST remove this field from your config."); this.deprecated = true; } public void onLoad() { + // Handle deprecated configs if (eventChance != -1) warnDeprecated("eventChance", "eventChance4 & eventChance5"); if (costItem != 0) @@ -75,12 +92,30 @@ public class GachaBanner { warnDeprecated("rateUpItems1", "rateUpItems5"); if (rateUpItems2.length > 0) warnDeprecated("rateUpItems2", "rateUpItems4"); + + // Handle default values if (this.previewPrefabPath != null && this.previewPrefabPath.equals("UI_Tab_" + this.prefabPath)) Grasscutter.getLogger().error("Redundant field found in Banners config: previewPrefabPath does not need to be specified if it is identical to prefabPath prefixed with \"UI_Tab_\"."); if (this.previewPrefabPath == null || this.previewPrefabPath.isEmpty()) this.previewPrefabPath = "UI_Tab_" + this.prefabPath; + if (this.gachaType < 0) + this.gachaType = this.bannerType.gachaType; + if (this.costItemId == 0) + this.costItemId = this.bannerType.costItemId; if (this.costItemId10 == 0) this.costItemId10 = this.costItemId; + if (this.weights4 == null) + this.weights4 = this.bannerType.weights4; + if (this.weights5 == null) + this.weights5 = this.bannerType.weights5; + if (this.eventChance4 < 0) + this.eventChance4 = this.bannerType.eventChance4; + if (this.eventChance5 < 0) + this.eventChance5 = this.bannerType.eventChance5; + if (this.fallbackItems5Pool1 == null) + this.fallbackItems5Pool1 = this.bannerType.fallbackItems5Pool1; + if (this.fallbackItems5Pool2 == null) + this.fallbackItems5Pool2 = this.bannerType.fallbackItems5Pool2; } public ItemParamData getCost(int numRolls) { @@ -196,6 +231,31 @@ public class GachaBanner { } public enum BannerType { - STANDARD, EVENT, WEAPON; + STANDARD(200, 224, DEFAULT_WEIGHTS_4, DEFAULT_WEIGHTS_5, 50, 50, DEFAULT_FALLBACK_ITEMS_5_POOL_1, DEFAULT_FALLBACK_ITEMS_5_POOL_2), + BEGINNER(100, 224, DEFAULT_WEIGHTS_4, DEFAULT_WEIGHTS_5, 50, 50, DEFAULT_FALLBACK_ITEMS_5_POOL_1, DEFAULT_FALLBACK_ITEMS_5_POOL_2), + EVENT(301, 223, DEFAULT_WEIGHTS_4, DEFAULT_WEIGHTS_5_CHARACTER, 50, 50, DEFAULT_FALLBACK_ITEMS_5_POOL_1, DEFAULT_FALLBACK_ITEMS_5_POOL_2), // Legacy value for CHARACTER + CHARACTER(301, 223, DEFAULT_WEIGHTS_4, DEFAULT_WEIGHTS_5_CHARACTER, 50, 50, DEFAULT_FALLBACK_ITEMS_5_POOL_1, EMPTY_POOL), + CHARACTER2(400, 223, DEFAULT_WEIGHTS_4, DEFAULT_WEIGHTS_5_CHARACTER, 50, 50, DEFAULT_FALLBACK_ITEMS_5_POOL_1, EMPTY_POOL), + WEAPON(302, 223, DEFAULT_WEIGHTS_4_WEAPON, DEFAULT_WEIGHTS_5_WEAPON, 75, 75, EMPTY_POOL, DEFAULT_FALLBACK_ITEMS_5_POOL_2); + + public final int gachaType; + public final int costItemId; + public final int[][] weights4; + public final int[][] weights5; + public final int eventChance4; + public final int eventChance5; + public final int[] fallbackItems5Pool1; + public final int[] fallbackItems5Pool2; + + BannerType(int gachaType, int costItemId, int[][] weights4, int[][] weights5, int eventChance4, int eventChance5, int[] fallbackItems5Pool1, int[] fallbackItems5Pool2) { + this.gachaType = gachaType; + this.costItemId = costItemId; + this.weights4 = weights4; + this.weights5 = weights5; + this.eventChance4 = eventChance4; + this.eventChance5 = eventChance5; + this.fallbackItems5Pool1 = fallbackItems5Pool1; + this.fallbackItems5Pool2 = fallbackItems5Pool2; + } } } diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaSystem.java b/src/main/java/emu/grasscutter/game/gacha/GachaSystem.java index 02805612f..ec6e6dd11 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaSystem.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaSystem.java @@ -45,8 +45,6 @@ public class GachaSystem extends BaseGameSystem { private static final int starglitterId = 221; private static final int stardustId = 222; - private int[] fallbackItems4Pool2Default = {11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405}; - private int[] fallbackItems5Pool2Default = {11501, 11502, 12501, 12502, 13502, 13505, 14501, 14502, 15501, 15502}; public GachaSystem(GameServer server) { super(server); @@ -69,6 +67,8 @@ public class GachaSystem extends BaseGameSystem { public synchronized void load() { getGachaBanners().clear(); + int autoScheduleId = 1000; + int autoSortId = 9000; try { List banners = DataLoader.loadTableToList("Banners", GachaBanner.class); if (banners.size() > 0) { @@ -76,8 +76,14 @@ public class GachaSystem extends BaseGameSystem { banner.onLoad(); if (banner.isDeprecated()) { Grasscutter.getLogger().error("A Banner has not been loaded because it contains one or more deprecated fields. Remove the fields mentioned above and reload."); + } else if (banner.isDisabled()) { + Grasscutter.getLogger().debug("A Banner has not been loaded because it is disabled."); } else { - getGachaBanners().put(banner.getScheduleId(), banner); + if (banner.scheduleId < 0) + banner.scheduleId = autoScheduleId++; + if (banner.sortId < 0) + banner.sortId = autoSortId--; + getGachaBanners().put(banner.scheduleId, banner); } } Grasscutter.getLogger().debug("Banners successfully loaded."); @@ -160,7 +166,7 @@ public class GachaSystem extends BaseGameSystem { private synchronized int doFallbackRarePull(int[] fallback1, int[] fallback2, int rarity, GachaBanner banner, PlayerGachaBannerInfo gachaInfo) { if (fallback1.length < 1) { if (fallback2.length < 1) { - return getRandom((rarity==5)? fallbackItems5Pool2Default : fallbackItems4Pool2Default); + return getRandom((rarity==5)? GachaBanner.DEFAULT_FALLBACK_ITEMS_5_POOL_2 : GachaBanner.DEFAULT_FALLBACK_ITEMS_4_POOL_2); } else { return getRandom(fallback2); } diff --git a/src/main/java/emu/grasscutter/utils/FileUtils.java b/src/main/java/emu/grasscutter/utils/FileUtils.java index 40b12af21..75d54fc3b 100644 --- a/src/main/java/emu/grasscutter/utils/FileUtils.java +++ b/src/main/java/emu/grasscutter/utils/FileUtils.java @@ -91,6 +91,9 @@ public final class FileUtils { private static final String[] TSJ_JSON_TSV = {"tsj", "json", "tsv"}; private static final Path[] DATA_PATHS = {DATA_USER_PATH, DATA_DEFAULT_PATH}; public static Path getDataPathTsjJsonTsv(String filename) { + return getDataPathTsjJsonTsv(filename, true); + } + public static Path getDataPathTsjJsonTsv(String filename, boolean fallback) { val name = getFilenameWithoutExtension(filename); for (val data_path : DATA_PATHS) { for (val ext : TSJ_JSON_TSV) { @@ -98,7 +101,7 @@ public final class FileUtils { if (Files.exists(path)) return path; } } - return DATA_USER_PATH.resolve(name + ".tsj"); // Maybe they want to write to a new file + return fallback ? DATA_USER_PATH.resolve(name + ".tsj") : null; // Maybe they want to write to a new file } public static Path getDataPath(String path) { diff --git a/src/main/resources/defaults/data/Banners.tsj b/src/main/resources/defaults/data/Banners.tsj index 35dc84cee..c7ac65bde 100644 --- a/src/main/resources/defaults/data/Banners.tsj +++ b/src/main/resources/defaults/data/Banners.tsj @@ -1,6 +1,94 @@ -comment gachaType scheduleId bannerType prefabPath titlePath costItemId beginTime endTime sortId rateUpItems5 rateUpItems4 weights5 weights4 fallbackItems5Pool2 fallbackItems5Pool1 fallbackItems4Pool1 eventChance4 eventChance5 costItemId10 costItemAmount10 gachaTimesLimit removeC6FromPool -Beginner's Banner. Do not change for no reason. 100 803 EVENT GachaShowPanel_A016 UI_GACHA_SHOW_PANEL_A016_TITLE 224 1924992000 9999 [1034] 8 20 -Standard 200 893 STANDARD GachaShowPanel_A022 UI_GACHA_SHOW_PANEL_A022_TITLE 224 1924992000 1000 [[1, 75], [73, 150], [90, 10000]] [1006, 1014, 1015, 1020, 1021, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1059, 1064, 1065, 1067, 1068, 1072] -Character Event Banner 1 301 903 EVENT GachaShowPanel_A106 UI_GACHA_SHOW_PANEL_A071_TITLE 223 1924992000 9998 [1058] [1050, 1059, 1074] [[1, 80], [73, 80], [90, 10000]] [] -Character Event Banner 2 400 923 EVENT GachaShowPanel_A107 UI_GACHA_SHOW_PANEL_A037_TITLE 223 1924992000 9998 [1033] [1050, 1059, 1074] [[1, 80], [73, 80], [90, 10000]] [] -Weapon Event Banner 302 913 WEAPON GachaShowPanel_A108 UI_GACHA_SHOW_PANEL_A021_TITLE 223 1924992000 9997 [14509, 15507] [11401, 12402, 13401, 14401, 15402] [[1, 100], [62, 100], [73, 7800], [80, 10000]] [[1, 600], [7, 600], [8, 6600], [10, 12600]] [] 75 75 +comment bannerType prefabPath titlePath rateUpItems5 rateUpItems4 disabled costItemId scheduleId sortId beginTime endTime weights5 weights4 fallbackItems5Pool2 fallbackItems5Pool1 fallbackItems4Pool1 eventChance4 eventChance5 costItemId10 costItemAmount10 gachaTimesLimit removeC6FromPool +Beginner's Banner. Do not change for no reason. BEGINNER GachaShowPanel_A016 UI_GACHA_SHOW_PANEL_A016_TITLE [1034] 224 803 9999 1924992000 8 20 +Standard STANDARD GachaShowPanel_A022 UI_GACHA_SHOW_PANEL_A022_TITLE 224 893 1000 1924992000 [[1, 75], [73, 150], [90, 10000]] [1006, 1014, 1015, 1020, 1021, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1059, 1064, 1065, 1067, 1068, 1072] +Old Standard image STANDARD GachaShowPanel_A017 UI_GACHA_SHOW_PANEL_A017_TITLE true [1006, 1014, 1015, 1020, 1021, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1059, 1064, 1065, 1067, 1068, 1072] +1.0a character CHARACTER GachaShowPanel_A019 UI_GACHA_SHOW_PANEL_A019_TITLE [1022] [1014, 1031, 1023] true 223 1924992000 [[1, 80], [73, 80], [90, 10000]] [] +1.0a weapon WEAPON GachaShowPanel_A020 UI_GACHA_SHOW_PANEL_A020_TITLE [11501, 15502] [11402, 12402, 14402, 15402, 13407] true 223 1924992000 [[1, 100], [62, 100], [73, 7800], [80, 10000]] [[1, 600], [7, 600], [8, 6600], [10, 12600]] [] 75 75 +1.0b character CHARACTER GachaShowPanel_A018 UI_GACHA_SHOW_PANEL_A018_TITLE [1029] [1025, 1034, 1043] true +1.0b weapon WEAPON GachaShowPanel_A021 UI_GACHA_SHOW_PANEL_A021_TITLE [14502, 12502] [11403, 15403, 12403, 14403, 13401] true +1.1a character CHARACTER GachaShowPanel_A023 UI_GACHA_SHOW_PANEL_A023_TITLE [1033] [1039, 1024, 1027] true +1.1a weapon WEAPON GachaShowPanel_A025 UI_GACHA_SHOW_PANEL_A025_TITLE [14504, 15501] [11402, 12405, 14409, 15405, 13407] true +1.1b character CHARACTER GachaShowPanel_A024 UI_GACHA_SHOW_PANEL_A024_TITLE [1030] [1044, 1020, 1036] true +1.1b weapon WEAPON GachaShowPanel_A026 UI_GACHA_SHOW_PANEL_A026_TITLE [13504, 12504] [11405, 12402, 14401, 15401, 13401] true +1.2a character CHARACTER GachaShowPanel_A027 UI_GACHA_SHOW_PANEL_A027_TITLE [1038] [1031, 1043, 1032] true +1.2a weapon WEAPON GachaShowPanel_A029 UI_GACHA_SHOW_PANEL_A029_TITLE [11504, 14501] [11401, 12401, 13407, 14403, 15402] true +1.2b character CHARACTER GachaShowPanel_A028 UI_GACHA_SHOW_PANEL_A028_TITLE [1037] [1023, 1025, 1034] true +1.2b weapon WEAPON GachaShowPanel_A030 UI_GACHA_SHOW_PANEL_A030_TITLE [12501, 15502] [11403, 12402, 13401, 14409, 15401] true +1.3a character CHARACTER GachaShowPanel_A031 UI_GACHA_SHOW_PANEL_A031_TITLE [1026] [1039, 1024, 1044] true +1.3a weapon WEAPON GachaShowPanel_A034 UI_GACHA_SHOW_PANEL_A034_TITLE [11505, 13505] [11402, 12403, 15405, 14409, 13407] true +1.3b character CHARACTER GachaShowPanel_A032 UI_GACHA_SHOW_PANEL_A032_TITLE [1042] [1027, 1032, 1014] true +1.3b weapon WEAPON GachaShowPanel_A035 UI_GACHA_SHOW_PANEL_A035_TITLE [13501, 12502] [12410, 13406, 11405, 15403, 14402] true +1.3c character CHARACTER GachaShowPanel_A033 UI_GACHA_SHOW_PANEL_A033_TITLE [1046] [1025, 1023, 1036] true +1.4a character CHARACTER GachaShowPanel_A036 UI_GACHA_SHOW_PANEL_A036_TITLE [1022] [1043, 1020, 1034] true +1.4a weapon WEAPON GachaShowPanel_A038 UI_GACHA_SHOW_PANEL_A038_TITLE [15503, 11502] [11410, 14410, 12401, 15401, 13401] true +1.4b character CHARACTER GachaShowPanel_A037 UI_GACHA_SHOW_PANEL_A037_TITLE [1033] [1045, 1014, 1031] true +1.4b weapon WEAPON GachaShowPanel_A039 UI_GACHA_SHOW_PANEL_A039_TITLE [15501, 14502] [15410, 11401, 12403, 14401, 13407] true +1.5a character CHARACTER GachaShowPanel_A040 UI_GACHA_SHOW_PANEL_A040_TITLE [1030] [1048, 1034, 1039] true +1.5a weapon WEAPON GachaShowPanel_A042 UI_GACHA_SHOW_PANEL_A042_TITLE [11504, 14504] [12410, 13406, 11402, 14409, 15403] true +1.5b character CHARACTER GachaShowPanel_A041 UI_GACHA_SHOW_PANEL_A041_TITLE [1051] [1044, 1025, 1024] true +1.5b weapon WEAPON GachaShowPanel_A043 UI_GACHA_SHOW_PANEL_A043_TITLE [12503, 11501] [11403, 12405, 13401, 14403, 15405] true +1.6a character CHARACTER GachaShowPanel_A044 UI_GACHA_SHOW_PANEL_A018_TITLE [1029] [1014, 1043, 1031] true +1.6a weapon WEAPON GachaShowPanel_A046 UI_GACHA_SHOW_PANEL_A021_TITLE [12501, 14502] [15412, 11405, 12402, 13407, 14402] true +1.6b character CHARACTER GachaShowPanel_A045 UI_GACHA_SHOW_PANEL_A045_TITLE [1047] [1045, 1032, 1020] true +1.6b weapon WEAPON GachaShowPanel_A047 UI_GACHA_SHOW_PANEL_A021_TITLE [11503, 14501] [11410, 14410, 15410, 13401, 12401] true +2.0a character CHARACTER GachaShowPanel_A048 UI_GACHA_SHOW_PANEL_A048_TITLE [1002] [1027, 1036, 1048] true +2.0a weapon WEAPON GachaShowPanel_A050 UI_GACHA_SHOW_PANEL_A021_TITLE [11509, 13502] [12403, 13407, 14401, 11401, 15402] true +2.0b character CHARACTER GachaShowPanel_A049 UI_GACHA_SHOW_PANEL_A049_TITLE [1049] [1053, 1039, 1044] true +2.0b weapon WEAPON GachaShowPanel_A051 UI_GACHA_SHOW_PANEL_A021_TITLE [15509, 11502] [11403, 12405, 13401, 14403, 15401] true +2.1a character CHARACTER GachaShowPanel_A052 UI_GACHA_SHOW_PANEL_A052_TITLE [1052] [1056, 1023, 1043] true +2.1a weapon WEAPON GachaShowPanel_A054 UI_GACHA_SHOW_PANEL_A021_TITLE [13509, 12504] [11405, 12402, 13407, 14402, 15403] true +2.1b character CHARACTER GachaShowPanel_A053 UI_GACHA_SHOW_PANEL_A053_TITLE [1054] [1045, 1024, 1025] true +2.1b weapon WEAPON GachaShowPanel_A055 UI_GACHA_SHOW_PANEL_A021_TITLE [14506, 11505] [11402, 12401, 13401, 14401, 15402] true +2.2a character CHARACTER GachaShowPanel_A056 UI_GACHA_SHOW_PANEL_A037_TITLE [1033] [1027, 1036, 1048] true +2.2a weapon WEAPON GachaShowPanel_A058 UI_GACHA_SHOW_PANEL_A021_TITLE [15507, 14504] [12416, 11401, 13407, 14409, 15405] true +2.2b character CHARACTER GachaShowPanel_A057 UI_GACHA_SHOW_PANEL_A033_TITLE [1046] [1050, 1039, 1053] true +2.2b weapon WEAPON GachaShowPanel_A059 UI_GACHA_SHOW_PANEL_A021_TITLE [13501, 15503] [13416, 15416, 11403, 12405, 14402] true +2.3a character CHARACTER GachaShowPanel_A060 UI_GACHA_SHOW_PANEL_A027_TITLE [1038] [1032, 1034, 1045] true +2.3a character2 CHARACTER2 GachaShowPanel_A062 UI_GACHA_SHOW_PANEL_A041_TITLE [1051] [1032, 1034, 1045] true +2.3a weapon WEAPON GachaShowPanel_A063 UI_GACHA_SHOW_PANEL_A021_TITLE [11503, 12503] [14410, 15410, 11405, 12403, 13401] true +2.3b character CHARACTER GachaShowPanel_A061 UI_GACHA_SHOW_PANEL_A061_TITLE [1057] [1055, 1014, 1023] true +2.3b weapon WEAPON GachaShowPanel_A064 UI_GACHA_SHOW_PANEL_A021_TITLE [12510, 15501] [11410, 15412, 12402, 13407, 14403] true +2.4a character CHARACTER GachaShowPanel_A065 UI_GACHA_SHOW_PANEL_A065_TITLE [1063] [1064, 1027, 1036] true +2.4a character2 CHARACTER2 GachaShowPanel_A066 UI_GACHA_SHOW_PANEL_A031_TITLE [1026] [1064, 1027, 1036] true +2.4a weapon WEAPON GachaShowPanel_A067 UI_GACHA_SHOW_PANEL_A021_TITLE [13507, 13505] [13406, 11402, 12401, 14402, 15401] true +2.4b character CHARACTER GachaShowPanel_A068 UI_GACHA_SHOW_PANEL_A040_TITLE [1030] [1025, 1024, 1048] true +2.4b character2 CHARACTER2 GachaShowPanel_A069 UI_GACHA_SHOW_PANEL_A028_TITLE [1037] [1025, 1024, 1048] true +2.4b weapon WEAPON GachaShowPanel_A070 UI_GACHA_SHOW_PANEL_A021_TITLE [13504, 15502] [12410, 11401, 13401, 14401, 15403] true +2.5a character CHARACTER GachaShowPanel_A071 UI_GACHA_SHOW_PANEL_A071_TITLE [1058] [1031, 1039, 1050] true +2.5a weapon WEAPON GachaShowPanel_A072 UI_GACHA_SHOW_PANEL_A021_TITLE [14509, 11505] [13416, 11403, 12405, 14409, 15402] true +2.5b character CHARACTER GachaShowPanel_A073 UI_GACHA_SHOW_PANEL_A052_TITLE [1052] [1032, 1044, 1056] true +2.5b character2 CHARACTER2 GachaShowPanel_A074 UI_GACHA_SHOW_PANEL_A053_TITLE [1054] [1032, 1044, 1056] true +2.5b weapon WEAPON GachaShowPanel_A075 UI_GACHA_SHOW_PANEL_A021_TITLE [13509, 14506] [12416, 15416, 11405, 13407, 14403] true +2.6a character CHARACTER GachaShowPanel_A076 UI_GACHA_SHOW_PANEL_A076_TITLE [1066] [1043, 1023, 1064] true +2.6a character2 CHARACTER2 GachaShowPanel_A077 UI_GACHA_SHOW_PANEL_A036_TITLE [1022] [1043, 1023, 1064] true +2.6a weapon WEAPON GachaShowPanel_A078 UI_GACHA_SHOW_PANEL_A021_TITLE [11510, 15503] [11402, 12403, 13401, 14402, 15405] true +2.6b character CHARACTER GachaShowPanel_A079 UI_GACHA_SHOW_PANEL_A048_TITLE [1002] [1020, 1045, 1053] true +2.6b weapon WEAPON GachaShowPanel_A080 UI_GACHA_SHOW_PANEL_A021_TITLE [11509, 12504] [11401, 12402, 13407, 14401, 15401] true +2.7a character CHARACTER GachaShowPanel_A081 UI_GACHA_SHOW_PANEL_A081_TITLE [1060] [1014, 1048, 1034] true +2.7a character2 CHARACTER2 GachaShowPanel_A082 UI_GACHA_SHOW_PANEL_A031_TITLE [1026] [1014, 1048, 1034] true +2.7a weapon WEAPON GachaShowPanel_A083 UI_GACHA_SHOW_PANEL_A021_TITLE [15508, 13505] [13406, 14409, 12401, 15403, 11403] true +2.7b character CHARACTER GachaShowPanel_A084 UI_GACHA_SHOW_PANEL_A061_TITLE [1057] [1065, 1036, 1055] true +2.7b weapon WEAPON GachaShowPanel_A085 UI_GACHA_SHOW_PANEL_A021_TITLE [12510, 14504] [12410, 11405, 13401, 14403, 15402] true +2.8a character CHARACTER GachaShowPanel_A086 UI_GACHA_SHOW_PANEL_A045_TITLE [1047] [1059, 1027, 1050] true +2.8a character2 CHARACTER2 GachaShowPanel_A087 UI_GACHA_SHOW_PANEL_A018_TITLE [1029] [1059, 1027, 1050] true +2.8a weapon WEAPON GachaShowPanel_A088 UI_GACHA_SHOW_PANEL_A021_TITLE [11503, 14502] [11410, 15412, 12405, 13407, 14402] true +2.8b character CHARACTER GachaShowPanel_A089 UI_GACHA_SHOW_PANEL_A049_TITLE [1049] [1032, 1044, 1064] true +2.8b weapon WEAPON GachaShowPanel_A090 UI_GACHA_SHOW_PANEL_A021_TITLE [15509, 11504] [14410, 15410, 11402, 12403, 13401] true +3.0a character CHARACTER GachaShowPanel_A091 UI_GACHA_SHOW_PANEL_A091_TITLE [1069] [1067, 1039, 1031] true +3.0a character2 CHARACTER2 GachaShowPanel_A092 UI_GACHA_SHOW_PANEL_A040_TITLE [1030] [1067, 1039, 1031] true +3.0a weapon WEAPON GachaShowPanel_A093 UI_GACHA_SHOW_PANEL_A021_TITLE [15511, 13504] [11401, 12402, 13407, 14401, 15402] true +3.0b character CHARACTER GachaShowPanel_A094 UI_GACHA_SHOW_PANEL_A028_TITLE [1037] [1068, 1043, 1025] true +3.0b character2 CHARACTER2 GachaShowPanel_A095 UI_GACHA_SHOW_PANEL_A053_TITLE [1054] [1068, 1043, 1025] true +3.0b weapon WEAPON GachaShowPanel_A096 UI_GACHA_SHOW_PANEL_A021_TITLE [14506, 15502] [11403, 12401, 13401, 14409, 15405] true +3.1a character CHARACTER GachaShowPanel_A097 UI_GACHA_SHOW_PANEL_A097_TITLE [1071] [1072, 1065, 1053] true +3.1a character2 CHARACTER2 GachaShowPanel_A098 UI_GACHA_SHOW_PANEL_A036_TITLE [1022] [1072, 1065, 1053] true +3.1a weapon WEAPON GachaShowPanel_A099 UI_GACHA_SHOW_PANEL_A021_TITLE [13511, 15503] [12415, 11405, 13407, 14403, 15401] true +3.1b character CHARACTER GachaShowPanel_A100 UI_GACHA_SHOW_PANEL_A0100_TITLE [1070] [1014, 1024, 1023] true +3.1b character2 CHARACTER2 GachaShowPanel_A101 UI_GACHA_SHOW_PANEL_A027_TITLE [1038] [1014, 1024, 1023] true +3.1b weapon WEAPON GachaShowPanel_A102 UI_GACHA_SHOW_PANEL_A021_TITLE [11511, 11505] [11418, 14416, 12405, 13401, 15403] true +3.2a character CHARACTER GachaShowPanel_A103 UI_GACHA_SHOW_PANEL_A0100_TITLE [1073] [1020, 1034, 1032] true +3.2a character2 CHARACTER2 GachaShowPanel_A104 UI_GACHA_SHOW_PANEL_A049_TITLE [1049] [1020, 1034, 1032] true +3.2a weapon WEAPON GachaShowPanel_A105 UI_GACHA_SHOW_PANEL_A021_TITLE [14511, 15509] [11402, 12403, 13407, 14402, 15405] true +3.2b character CHARACTER GachaShowPanel_A106 UI_GACHA_SHOW_PANEL_A071_TITLE [1058] [1074, 1050, 1059] +3.2b character2 CHARACTER2 GachaShowPanel_A107 UI_GACHA_SHOW_PANEL_A037_TITLE [1033] [1074, 1050, 1059] +3.2b weapon WEAPON GachaShowPanel_A108 UI_GACHA_SHOW_PANEL_A021_TITLE [14509, 15507] [11401, 12402, 13401, 14401, 15402] \ No newline at end of file