From 83b84408a13205d0774a177b8c76e0579ff754b2 Mon Sep 17 00:00:00 2001
From: AnimeGitB <AnimeGitB@bigblueball.in>
Date: Fri, 25 Nov 2022 23:25:22 +1030
Subject: [PATCH] Bake banner defaults into BannerType enum, and add every
 historic banner

---
 .../grasscutter/game/gacha/GachaBanner.java   |  94 +++++++++++++---
 .../grasscutter/game/gacha/GachaSystem.java   |  14 ++-
 .../java/emu/grasscutter/utils/FileUtils.java |   5 +-
 src/main/resources/defaults/data/Banners.tsj  | 100 ++++++++++++++++--
 4 files changed, 185 insertions(+), 28 deletions(-)

diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java b/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java
index 9122475d..ef0b7afa 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 = {};
+    // 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 = {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 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;
-    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}};
+    @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}};
-    private int eventChance4 = 50; // Chance to win a featured event item
-    private int eventChance5 = 50; // Chance to win a featured event item
-    @Getter private BannerType bannerType = BannerType.STANDARD;
     @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 02805612..ec6e6dd1 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<GachaBanner> 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 40b12af2..75d54fc3 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 35dc84ce..c7ac65bd 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
-- 
GitLab