Bake banner defaults into BannerType enum, and add every historic banner

This commit is contained in:
AnimeGitB 2022-11-25 23:25:22 +10:30
parent da3981089d
commit 83b84408a1
4 changed files with 187 additions and 30 deletions

View File

@ -11,8 +11,9 @@ import emu.grasscutter.utils.Utils;
import lombok.Getter; import lombok.Getter;
public class GachaBanner { public class GachaBanner {
@Getter private int gachaType; @Getter private int gachaType = -1;
@Getter private int scheduleId; @Getter int scheduleId = -1;
@Getter int sortId = -1;
@Getter private String prefabPath; @Getter private String prefabPath;
@Getter private String previewPrefabPath; @Getter private String previewPrefabPath;
@Getter private String titlePath; @Getter private String titlePath;
@ -20,26 +21,40 @@ public class GachaBanner {
private int costItemAmount = 1; private int costItemAmount = 1;
private int costItemId10 = 0; private int costItemId10 = 0;
private int costItemAmount10 = 10; private int costItemAmount10 = 10;
@Getter private int beginTime; @Getter private int beginTime = 0;
@Getter private int endTime; @Getter private int endTime = 1924992000;
@Getter private int sortId;
@Getter private int gachaTimesLimit = Integer.MAX_VALUE; @Getter private int gachaTimesLimit = Integer.MAX_VALUE;
@Getter private int[] rateUpItems4 = {}; @Getter private int[] rateUpItems4 = {};
@Getter private int[] rateUpItems5 = {}; @Getter private int[] rateUpItems5 = {};
@Getter private int[] fallbackItems3 = {11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304}; // This now handles default values for the fields below
@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
@Getter private BannerType bannerType = BannerType.STANDARD; @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; @Getter private int wishMaxProgress = 2;
// Deprecated fields that were tolerated in early May 2022 but have apparently still being circulating in new custom configs // 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 minItemType = -1;
@Deprecated private int maxItemType = -1; @Deprecated private int maxItemType = -1;
@Getter private boolean deprecated = false; @Getter private boolean deprecated = false;
@Getter private boolean disabled = false;
private void warnDeprecated(String name, String replacement) { 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."); 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; this.deprecated = true;
} }
public void onLoad() { public void onLoad() {
// Handle deprecated configs
if (eventChance != -1) if (eventChance != -1)
warnDeprecated("eventChance", "eventChance4 & eventChance5"); warnDeprecated("eventChance", "eventChance4 & eventChance5");
if (costItem != 0) if (costItem != 0)
@ -75,12 +92,30 @@ public class GachaBanner {
warnDeprecated("rateUpItems1", "rateUpItems5"); warnDeprecated("rateUpItems1", "rateUpItems5");
if (rateUpItems2.length > 0) if (rateUpItems2.length > 0)
warnDeprecated("rateUpItems2", "rateUpItems4"); warnDeprecated("rateUpItems2", "rateUpItems4");
// Handle default values
if (this.previewPrefabPath != null && this.previewPrefabPath.equals("UI_Tab_" + this.prefabPath)) 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_\"."); 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()) if (this.previewPrefabPath == null || this.previewPrefabPath.isEmpty())
this.previewPrefabPath = "UI_Tab_" + this.prefabPath; 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) if (this.costItemId10 == 0)
this.costItemId10 = this.costItemId; 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) { public ItemParamData getCost(int numRolls) {
@ -196,6 +231,31 @@ public class GachaBanner {
} }
public enum BannerType { 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;
}
} }
} }

View File

@ -45,8 +45,6 @@ public class GachaSystem extends BaseGameSystem {
private static final int starglitterId = 221; private static final int starglitterId = 221;
private static final int stardustId = 222; 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) { public GachaSystem(GameServer server) {
super(server); super(server);
@ -69,6 +67,8 @@ public class GachaSystem extends BaseGameSystem {
public synchronized void load() { public synchronized void load() {
getGachaBanners().clear(); getGachaBanners().clear();
int autoScheduleId = 1000;
int autoSortId = 9000;
try { try {
List<GachaBanner> banners = DataLoader.loadTableToList("Banners", GachaBanner.class); List<GachaBanner> banners = DataLoader.loadTableToList("Banners", GachaBanner.class);
if (banners.size() > 0) { if (banners.size() > 0) {
@ -76,8 +76,14 @@ public class GachaSystem extends BaseGameSystem {
banner.onLoad(); banner.onLoad();
if (banner.isDeprecated()) { 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."); 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 { } 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."); 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) { private synchronized int doFallbackRarePull(int[] fallback1, int[] fallback2, int rarity, GachaBanner banner, PlayerGachaBannerInfo gachaInfo) {
if (fallback1.length < 1) { if (fallback1.length < 1) {
if (fallback2.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 { } else {
return getRandom(fallback2); return getRandom(fallback2);
} }

View File

@ -91,6 +91,9 @@ public final class FileUtils {
private static final String[] TSJ_JSON_TSV = {"tsj", "json", "tsv"}; private static final String[] TSJ_JSON_TSV = {"tsj", "json", "tsv"};
private static final Path[] DATA_PATHS = {DATA_USER_PATH, DATA_DEFAULT_PATH}; private static final Path[] DATA_PATHS = {DATA_USER_PATH, DATA_DEFAULT_PATH};
public static Path getDataPathTsjJsonTsv(String filename) { public static Path getDataPathTsjJsonTsv(String filename) {
return getDataPathTsjJsonTsv(filename, true);
}
public static Path getDataPathTsjJsonTsv(String filename, boolean fallback) {
val name = getFilenameWithoutExtension(filename); val name = getFilenameWithoutExtension(filename);
for (val data_path : DATA_PATHS) { for (val data_path : DATA_PATHS) {
for (val ext : TSJ_JSON_TSV) { for (val ext : TSJ_JSON_TSV) {
@ -98,7 +101,7 @@ public final class FileUtils {
if (Files.exists(path)) return path; 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) { public static Path getDataPath(String path) {

View File

@ -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 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. 100 803 EVENT GachaShowPanel_A016 UI_GACHA_SHOW_PANEL_A016_TITLE 224 1924992000 9999 [1034] 8 20 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 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] 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]
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]] [] 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]
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]] [] 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]] []
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 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]