Update banner titles to 4.6

Fix benner editor format
Add banner title update tool
This commit is contained in:
2024-05-30 23:33:37 +08:00
parent 56a72ad940
commit 984afbdf0b
20 changed files with 921 additions and 471 deletions

View File

@ -50,8 +50,10 @@ namespace GrasscutterTools.Forms
private void InitBannerPrefab() private void InitBannerPrefab()
{ {
CmbPrefab.Items.Clear(); CmbPrefab.DisplayMember = "Value";
CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names); CmbPrefab.DataSource = GameData.GachaBannerPrefabs;
//CmbPrefab.Items.Clear();
//CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names);
} }
private void InitCheckedListBoxs() private void InitCheckedListBoxs()
@ -96,6 +98,11 @@ namespace GrasscutterTools.Forms
#region - UI - #region - UI -
private static string TrimPrefixAndSuffix(string text, int prefixLength, int suffixLength)
{
return text.Substring(prefixLength, text.Length - prefixLength - suffixLength);
}
private void ShowBanner(GachaBanner banner) private void ShowBanner(GachaBanner banner)
{ {
try try
@ -103,10 +110,17 @@ namespace GrasscutterTools.Forms
NUDGachaType.Value = banner.GachaType; NUDGachaType.Value = banner.GachaType;
NUDScheduleId.Value = banner.ScheduleId; NUDScheduleId.Value = banner.ScheduleId;
CmbBannerType.SelectedIndex = (int)banner.BannerType; CmbBannerType.SelectedIndex = (int)banner.BannerType;
if (string.IsNullOrEmpty(banner.TitlePath) || !int.TryParse(banner.TitlePath.Substring("UI_GACHA_SHOW_PANEL_A".Length, 3), out int prefabId)) const string titlePrefix = "UI_GACHA_SHOW_PANEL_";
const string suffix = "_TITLE";
if (string.IsNullOrEmpty(banner.TitlePath) || banner.TitlePath.Length <= titlePrefix.Length + suffix.Length)
{
CmbPrefab.SelectedIndex = -1; CmbPrefab.SelectedIndex = -1;
}
else else
CmbPrefab.SelectedIndex = Array.IndexOf(GameData.GachaBannerPrefabs.Ids, prefabId); {
var titleKey = TrimPrefixAndSuffix(banner.TitlePath, titlePrefix.Length, suffix.Length);
CmbPrefab.SelectedIndex = GameData.GachaBannerTitles.FindIndex(it => it.Key == titleKey);
}
RbCostItem224.Checked = banner.CostItem == 224; RbCostItem224.Checked = banner.CostItem == 224;
RbCostItem223.Checked = banner.CostItem == 223; RbCostItem223.Checked = banner.CostItem == 223;
NUDBeginTime.Value = banner.BeginTime; NUDBeginTime.Value = banner.BeginTime;
@ -153,15 +167,15 @@ namespace GrasscutterTools.Forms
else else
purpleIds = TxtRateUpItems2.Text.Split(',').Select(s => int.Parse(s.Trim())).ToArray(); purpleIds = TxtRateUpItems2.Text.Split(',').Select(s => int.Parse(s.Trim())).ToArray();
var prefabId = GameData.GachaBannerPrefabs.Ids[CmbPrefab.SelectedIndex]; var prefabId = GameData.GachaBannerPrefabs[CmbPrefab.SelectedIndex].Key;
GachaBanner banner = new GachaBanner GachaBanner banner = new GachaBanner
{ {
GachaType = (int)NUDGachaType.Value, GachaType = (int)NUDGachaType.Value,
ScheduleId = (int)NUDScheduleId.Value, ScheduleId = (int)NUDScheduleId.Value,
BannerType = (BannerType)CmbBannerType.SelectedIndex, BannerType = (BannerType)CmbBannerType.SelectedIndex,
PrefabPath = $"GachaShowPanel_A{prefabId:000}", PrefabPath = $"GachaShowPanel_{prefabId}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_A{prefabId:000}", PreviewPrefabPath = $"UI_Tab_GachaShowPanel_{prefabId}",
TitlePath = $"UI_GACHA_SHOW_PANEL_A{prefabId:000}_TITLE", TitlePath = $"UI_GACHA_SHOW_PANEL_{prefabId}_TITLE",
CostItem = RbCostItem224.Checked ? 224 : 223, CostItem = RbCostItem224.Checked ? 224 : 223,
BeginTime = (int)NUDBeginTime.Value, BeginTime = (int)NUDBeginTime.Value,
EndTime = (int)NUDEndTime.Value, EndTime = (int)NUDEndTime.Value,

View File

@ -50,8 +50,11 @@ namespace GrasscutterTools.Forms
private void InitBannerPrefab() private void InitBannerPrefab()
{ {
CmbPrefab.Items.Clear(); CmbPrefab.DisplayMember = "Value";
CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names); CmbPrefab.DataSource = GameData.GachaBannerPrefabs;
//CmbPrefab.Items.Clear();
//CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names);
} }
private void LnkWeightHelp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) private void LnkWeightHelp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
@ -206,6 +209,10 @@ namespace GrasscutterTools.Forms
#region - - #region - -
private static string TrimPrefixAndSuffix(string text, int prefixLength, int suffixLength)
{
return text.Substring(prefixLength, text.Length - prefixLength - suffixLength);
}
private void ShowBanner(GachaBanner2 banner) private void ShowBanner(GachaBanner2 banner)
{ {
try try
@ -213,10 +220,17 @@ namespace GrasscutterTools.Forms
NUDGachaType.Value = banner.GachaType; NUDGachaType.Value = banner.GachaType;
NUDScheduleId.Value = banner.ScheduleId; NUDScheduleId.Value = banner.ScheduleId;
CmbBannerType.SelectedIndex = (int)banner.BannerType; CmbBannerType.SelectedIndex = (int)banner.BannerType;
if (string.IsNullOrEmpty(banner.TitlePath) || !int.TryParse(banner.TitlePath.Substring("UI_GACHA_SHOW_PANEL_A".Length, 3), out int prefabId)) const string titlePrefix = "UI_GACHA_SHOW_PANEL_";
const string suffix = "_TITLE";
if (string.IsNullOrEmpty(banner.TitlePath) || banner.TitlePath.Length <= titlePrefix.Length + suffix.Length)
{
CmbPrefab.SelectedIndex = -1; CmbPrefab.SelectedIndex = -1;
}
else else
CmbPrefab.SelectedIndex = Array.IndexOf(GameData.GachaBannerPrefabs.Ids, prefabId); {
var titleKey = TrimPrefixAndSuffix(banner.TitlePath, titlePrefix.Length, suffix.Length);
CmbPrefab.SelectedIndex = GameData.GachaBannerTitles.FindIndex(it => it.Key == titleKey);
}
RbCostItem224.Checked = banner.CostItem == 224; RbCostItem224.Checked = banner.CostItem == 224;
RbCostItem223.Checked = banner.CostItem == 223; RbCostItem223.Checked = banner.CostItem == 223;
DTPBeginTime.Value = DateTimeOffset.FromUnixTimeSeconds(banner.BeginTime).DateTime; DTPBeginTime.Value = DateTimeOffset.FromUnixTimeSeconds(banner.BeginTime).DateTime;
@ -249,15 +263,15 @@ namespace GrasscutterTools.Forms
return null; return null;
} }
var prefabId = GameData.GachaBannerPrefabs.Ids[CmbPrefab.SelectedIndex]; var prefabId = GameData.GachaBannerPrefabs[CmbPrefab.SelectedIndex].Key;
var banner = new GachaBanner2 var banner = new GachaBanner2
{ {
GachaType = (int)NUDGachaType.Value, GachaType = (int)NUDGachaType.Value,
ScheduleId = (int)NUDScheduleId.Value, ScheduleId = (int)NUDScheduleId.Value,
BannerType = (BannerType)CmbBannerType.SelectedIndex, BannerType = (BannerType)CmbBannerType.SelectedIndex,
PrefabPath = $"GachaShowPanel_A{prefabId:000}", PrefabPath = $"GachaShowPanel_{prefabId}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_A{prefabId:000}", PreviewPrefabPath = $"UI_Tab_GachaShowPanel_{prefabId}",
TitlePath = $"UI_GACHA_SHOW_PANEL_A{prefabId:000}_TITLE", TitlePath = $"UI_GACHA_SHOW_PANEL_{prefabId}_TITLE",
CostItem = RbCostItem224.Checked ? 224 : 223, CostItem = RbCostItem224.Checked ? 224 : 223,
BeginTime = (int)new DateTimeOffset(DTPBeginTime.Value, TimeSpan.Zero).ToUnixTimeSeconds(), BeginTime = (int)new DateTimeOffset(DTPBeginTime.Value, TimeSpan.Zero).ToUnixTimeSeconds(),
EndTime = (int)new DateTimeOffset(DTPEndTime.Value, TimeSpan.Zero).ToUnixTimeSeconds(), EndTime = (int)new DateTimeOffset(DTPEndTime.Value, TimeSpan.Zero).ToUnixTimeSeconds(),

View File

@ -61,10 +61,10 @@ namespace GrasscutterTools.Forms
private void InitBannerPrefab() private void InitBannerPrefab()
{ {
CmbPrefab.Items.Clear(); CmbPrefab.DisplayMember = "Value";
CmbPrefab.Items.AddRange(GameData.GachaBannerPrefabs.Names); CmbPrefab.DataSource = GameData.GachaBannerPrefabs;
CmbTitlePath.Items.Clear(); CmbTitlePath.DisplayMember = "Value";
CmbTitlePath.Items.AddRange(GameData.GachaBannerTitles.Names); CmbTitlePath.DataSource = GameData.GachaBannerTitles;
} }
protected override void OnLoad(EventArgs e) protected override void OnLoad(EventArgs e)
@ -405,6 +405,12 @@ namespace GrasscutterTools.Forms
#region - - #region - -
private static string TrimPrefixAndSuffix(string text, int prefixLength, int suffixLength)
{
return text.Substring(prefixLength, text.Length - prefixLength - suffixLength);
}
/// <summary> /// <summary>
/// 显示指定卡池参数 /// 显示指定卡池参数
/// </summary> /// </summary>
@ -416,14 +422,28 @@ namespace GrasscutterTools.Forms
NUDGachaType.Value = banner.GachaType; NUDGachaType.Value = banner.GachaType;
NUDScheduleId.Value = banner.ScheduleId; NUDScheduleId.Value = banner.ScheduleId;
CmbBannerType.SelectedIndex = (int)banner.BannerType; CmbBannerType.SelectedIndex = (int)banner.BannerType;
if (string.IsNullOrEmpty(banner.PrefabPath) || !int.TryParse(banner.PrefabPath.Substring("GachaShowPanel_A".Length, 3), out int prefabId)) const string prefabPrefix = "GachaShowPanel_";
if (string.IsNullOrEmpty(banner.PrefabPath) || banner.PrefabPath.Length <= prefabPrefix.Length)
{
CmbPrefab.SelectedIndex = -1; CmbPrefab.SelectedIndex = -1;
}
else else
CmbPrefab.SelectedIndex = Array.IndexOf(GameData.GachaBannerPrefabs.Ids, prefabId); {
if (string.IsNullOrEmpty(banner.TitlePath) || !int.TryParse(banner.TitlePath.Substring("UI_GACHA_SHOW_PANEL_A".Length, 3), out int titleId)) var prefabKey = banner.PrefabPath.Substring(prefabPrefix.Length);
CmbPrefab.SelectedIndex = GameData.GachaBannerPrefabs.FindIndex(it => it.Key == prefabKey);
}
const string titlePrefix = "UI_GACHA_SHOW_PANEL_";
const string suffix = "_TITLE";
if (string.IsNullOrEmpty(banner.TitlePath) || banner.TitlePath.Length <= titlePrefix.Length + suffix.Length)
{
CmbTitlePath.SelectedIndex = -1; CmbTitlePath.SelectedIndex = -1;
}
else else
CmbTitlePath.SelectedIndex = Array.IndexOf(GameData.GachaBannerTitles.Ids, titleId); {
var titleKey = TrimPrefixAndSuffix(banner.TitlePath, titlePrefix.Length, suffix.Length);
CmbTitlePath.SelectedIndex = GameData.GachaBannerTitles.FindIndex(it => it.Key == titleKey);
}
RbCostItem224.Checked = banner.CostItemId == 224; RbCostItem224.Checked = banner.CostItemId == 224;
RbCostItem223.Checked = banner.CostItemId == 223; RbCostItem223.Checked = banner.CostItemId == 223;
NUDCostItemAmount1.Value = banner.CoseItemAmount; NUDCostItemAmount1.Value = banner.CoseItemAmount;
@ -458,16 +478,16 @@ namespace GrasscutterTools.Forms
return null; return null;
} }
var prefabId = GameData.GachaBannerPrefabs.Ids[CmbPrefab.SelectedIndex]; var prefabId = GameData.GachaBannerPrefabs[CmbPrefab.SelectedIndex].Key;
var titleId = GameData.GachaBannerTitles.Ids[CmbTitlePath.SelectedIndex]; var titleId = GameData.GachaBannerTitles[CmbTitlePath.SelectedIndex].Key;
var banner = new GachaBanner3 var banner = new GachaBanner3
{ {
GachaType = (int)NUDGachaType.Value, GachaType = (int)NUDGachaType.Value,
ScheduleId = (int)NUDScheduleId.Value, ScheduleId = (int)NUDScheduleId.Value,
BannerType = (BannerType)CmbBannerType.SelectedIndex, BannerType = (BannerType)CmbBannerType.SelectedIndex,
PrefabPath = $"GachaShowPanel_A{prefabId:000}", PrefabPath = $"GachaShowPanel_{prefabId}",
PreviewPrefabPath = $"UI_Tab_GachaShowPanel_A{prefabId:000}", PreviewPrefabPath = $"UI_Tab_GachaShowPanel_{prefabId}",
TitlePath = $"UI_GACHA_SHOW_PANEL_A{titleId:000}_TITLE", TitlePath = $"UI_GACHA_SHOW_PANEL_{titleId}_TITLE",
CostItemId = RbCostItem224.Checked ? 224 : 223, CostItemId = RbCostItem224.Checked ? 224 : 223,
CoseItemAmount = (int)NUDCostItemAmount1.Value, CoseItemAmount = (int)NUDCostItemAmount1.Value,
CostItemId10 = RbCostItem224.Checked ? 224 : 223, CostItemId10 = RbCostItem224.Checked ? 224 : 223,

View File

@ -17,6 +17,7 @@
* *
**/ **/
using System.Collections.Generic;
using GrasscutterTools.Properties; using GrasscutterTools.Properties;
namespace GrasscutterTools.Game namespace GrasscutterTools.Game
@ -42,13 +43,28 @@ namespace GrasscutterTools.Game
Dungeons = new ItemMap(Resources.Dungeon); Dungeons = new ItemMap(Resources.Dungeon);
Weapons = new ItemMap(Resources.Weapon); Weapons = new ItemMap(Resources.Weapon);
WeaponColors = new ItemMap(Resources.WeaponColor); WeaponColors = new ItemMap(Resources.WeaponColor);
GachaBannerPrefabs = new ItemMap(Resources.GachaBennerPrefab); GachaBannerPrefabs = ToDictionary(Resources.GachaBannerPrefab);
GachaBannerTitles = new ItemMap(Resources.GachaBannerTitle); GachaBannerTitles = ToDictionary(Resources.GachaBannerTitle);
Quests = new ItemMap(Resources.Quest); Quests = new ItemMap(Resources.Quest);
ShopType = new ItemMap(Resources.ShopType); ShopType = new ItemMap(Resources.ShopType);
Weathers = new ItemMapGroup(Resources.Weather); Weathers = new ItemMapGroup(Resources.Weather);
} }
private static List<KeyValuePair<string, string>> ToDictionary(string file)
{
var lines = file.Split('\n');
var dic = new List<KeyValuePair<string, string>>(lines.Length);
foreach (var line in lines)
{
var i = line.IndexOf(':');
if (i <= 0) continue;
var key = line.Substring(0, i).Trim();
var value = line.Substring(i + 1).Trim();
dic.Add(new KeyValuePair<string, string>(key, value));
}
return dic;
}
public static ItemMap Achievements { get; private set; } public static ItemMap Achievements { get; private set; }
public static ItemMapGroup Activity { get; private set; } public static ItemMapGroup Activity { get; private set; }
@ -83,9 +99,9 @@ namespace GrasscutterTools.Game
public static ItemMap WeaponColors { get; private set; } public static ItemMap WeaponColors { get; private set; }
public static ItemMap GachaBannerPrefabs { get; private set; } public static List<KeyValuePair<string, string>> GachaBannerPrefabs { get; private set; }
public static ItemMap GachaBannerTitles { get; private set; } public static List<KeyValuePair<string, string>> GachaBannerTitles { get; private set; }
public static ItemMap Quests { get; private set; } public static ItemMap Quests { get; private set; }

View File

@ -787,8 +787,8 @@
<Content Include="Resources\en-us\CustomCommands.txt" /> <Content Include="Resources\en-us\CustomCommands.txt" />
<None Include="Resources\en-us\Dungeon.txt" /> <None Include="Resources\en-us\Dungeon.txt" />
<Content Include="Resources\en-us\Cutscene.txt" /> <Content Include="Resources\en-us\Cutscene.txt" />
<Content Include="Resources\en-us\GachaBennerTitle.txt" /> <Content Include="Resources\en-us\GachaBannerTitle.txt" />
<Content Include="Resources\en-us\GachaBennerPrefab.txt" /> <Content Include="Resources\en-us\GachaBannerPrefab.txt" />
<Content Include="Resources\en-us\Gadget.txt" /> <Content Include="Resources\en-us\Gadget.txt" />
<Content Include="Resources\en-us\Item.txt" /> <Content Include="Resources\en-us\Item.txt" />
<Content Include="Resources\en-us\Monsters.txt" /> <Content Include="Resources\en-us\Monsters.txt" />
@ -810,8 +810,8 @@
<Content Include="Resources\ru-ru\CustomCommands.txt" /> <Content Include="Resources\ru-ru\CustomCommands.txt" />
<None Include="Resources\ru-ru\Dungeon.txt" /> <None Include="Resources\ru-ru\Dungeon.txt" />
<Content Include="Resources\ru-ru\Cutscene.txt" /> <Content Include="Resources\ru-ru\Cutscene.txt" />
<Content Include="Resources\ru-ru\GachaBennerTitle.txt" /> <Content Include="Resources\ru-ru\GachaBannerTitle.txt" />
<Content Include="Resources\ru-ru\GachaBennerPrefab.txt" /> <Content Include="Resources\ru-ru\GachaBannerPrefab.txt" />
<Content Include="Resources\ru-ru\Gadget.txt" /> <Content Include="Resources\ru-ru\Gadget.txt" />
<Content Include="Resources\ru-ru\Item.txt" /> <Content Include="Resources\ru-ru\Item.txt" />
<Content Include="Resources\ru-ru\Monsters.txt" /> <Content Include="Resources\ru-ru\Monsters.txt" />
@ -839,7 +839,7 @@
<None Include="Resources\zh-cn\Dungeon.txt" /> <None Include="Resources\zh-cn\Dungeon.txt" />
<Content Include="Resources\zh-cn\Cutscene.txt" /> <Content Include="Resources\zh-cn\Cutscene.txt" />
<Content Include="Resources\zh-cn\GachaBannerTitle.txt" /> <Content Include="Resources\zh-cn\GachaBannerTitle.txt" />
<Content Include="Resources\zh-cn\GachaBennerPrefab.txt" /> <Content Include="Resources\zh-cn\GachaBannerPrefab.txt" />
<Content Include="Resources\zh-cn\Gadget.txt" /> <Content Include="Resources\zh-cn\Gadget.txt" />
<Content Include="Resources\zh-cn\Item.txt" /> <Content Include="Resources\zh-cn\Item.txt" />
<Content Include="Resources\zh-cn\Monsters.txt" /> <Content Include="Resources\zh-cn\Monsters.txt" />
@ -858,8 +858,8 @@
<Content Include="Resources\zh-tw\CustomCommands.txt" /> <Content Include="Resources\zh-tw\CustomCommands.txt" />
<None Include="Resources\zh-tw\Dungeon.txt" /> <None Include="Resources\zh-tw\Dungeon.txt" />
<Content Include="Resources\zh-tw\Cutscene.txt" /> <Content Include="Resources\zh-tw\Cutscene.txt" />
<Content Include="Resources\zh-tw\GachaBennerTitle.txt" /> <Content Include="Resources\zh-tw\GachaBannerTitle.txt" />
<Content Include="Resources\zh-tw\GachaBennerPrefab.txt" /> <Content Include="Resources\zh-tw\GachaBannerPrefab.txt" />
<None Include="Resources\zh-tw\Gadget.txt" /> <None Include="Resources\zh-tw\Gadget.txt" />
<Content Include="Resources\zh-tw\Item.txt" /> <Content Include="Resources\zh-tw\Item.txt" />
<Content Include="Resources\zh-tw\Monsters.txt" /> <Content Include="Resources\zh-tw\Monsters.txt" />

View File

@ -36,6 +36,7 @@
this.TxtGcResRoot = new System.Windows.Forms.TextBox(); this.TxtGcResRoot = new System.Windows.Forms.TextBox();
this.BtnUpdateAllResources = new System.Windows.Forms.Button(); this.BtnUpdateAllResources = new System.Windows.Forms.Button();
this.BtnUpdateActivity = new System.Windows.Forms.Button(); this.BtnUpdateActivity = new System.Windows.Forms.Button();
this.BtnUpdateBannerTitles = new System.Windows.Forms.Button();
this.SuspendLayout(); this.SuspendLayout();
// //
// BtnUpdateResources // BtnUpdateResources
@ -110,6 +111,16 @@
this.BtnUpdateActivity.UseVisualStyleBackColor = true; this.BtnUpdateActivity.UseVisualStyleBackColor = true;
this.BtnUpdateActivity.Click += new System.EventHandler(this.BtnUpdateActivity_Click); this.BtnUpdateActivity.Click += new System.EventHandler(this.BtnUpdateActivity_Click);
// //
// BtnUpdateBannerTitles
//
this.BtnUpdateBannerTitles.Location = new System.Drawing.Point(353, 100);
this.BtnUpdateBannerTitles.Name = "BtnUpdateBannerTitles";
this.BtnUpdateBannerTitles.Size = new System.Drawing.Size(150, 30);
this.BtnUpdateBannerTitles.TabIndex = 0;
this.BtnUpdateBannerTitles.Text = "Update Banner Titles";
this.BtnUpdateBannerTitles.UseVisualStyleBackColor = true;
this.BtnUpdateBannerTitles.Click += new System.EventHandler(this.BtnUpdateBannerTitles_Click);
//
// PageTools // PageTools
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
@ -118,6 +129,7 @@
this.Controls.Add(this.LblGcResRoot); this.Controls.Add(this.LblGcResRoot);
this.Controls.Add(this.TxtProjectResRoot); this.Controls.Add(this.TxtProjectResRoot);
this.Controls.Add(this.LblProjectResRoot); this.Controls.Add(this.LblProjectResRoot);
this.Controls.Add(this.BtnUpdateBannerTitles);
this.Controls.Add(this.BtnUpdateActivity); this.Controls.Add(this.BtnUpdateActivity);
this.Controls.Add(this.BtnUpdateAllResources); this.Controls.Add(this.BtnUpdateAllResources);
this.Controls.Add(this.BtnConvertCutScene); this.Controls.Add(this.BtnConvertCutScene);
@ -138,5 +150,6 @@
private System.Windows.Forms.TextBox TxtGcResRoot; private System.Windows.Forms.TextBox TxtGcResRoot;
private System.Windows.Forms.Button BtnUpdateAllResources; private System.Windows.Forms.Button BtnUpdateAllResources;
private System.Windows.Forms.Button BtnUpdateActivity; private System.Windows.Forms.Button BtnUpdateActivity;
private System.Windows.Forms.Button BtnUpdateBannerTitles;
} }
} }

View File

@ -22,6 +22,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms; using System.Windows.Forms;
using GrasscutterTools.Game; using GrasscutterTools.Game;
@ -151,10 +152,8 @@ namespace GrasscutterTools.Pages
{ {
if (!CheckInputPaths()) return; if (!CheckInputPaths()) return;
if (TextMapData == null) TextMapData ??= new TextMapData(TxtGcResRoot.Text);
TextMapData = new TextMapData(TxtGcResRoot.Text); GameResources ??= new GameResources(TxtGcResRoot.Text, TextMapData);
if (GameResources == null)
GameResources = new GameResources(TxtGcResRoot.Text, TextMapData);
GameResources.ConvertResources(TxtProjectResRoot.Text); GameResources.ConvertResources(TxtProjectResRoot.Text);
MessageBox.Show("OK", Resources.Tips, MessageBoxButtons.OK); MessageBox.Show("OK", Resources.Tips, MessageBoxButtons.OK);
@ -176,8 +175,7 @@ namespace GrasscutterTools.Pages
Encoding.UTF8); Encoding.UTF8);
var activityItems = JsonConvert.DeserializeObject<List<NewActivityItem>>(json); var activityItems = JsonConvert.DeserializeObject<List<NewActivityItem>>(json);
if (TextMapData == null) TextMapData ??= new TextMapData(TxtGcResRoot.Text);
TextMapData = new TextMapData(TxtGcResRoot.Text);
UpdateActivityForLanguage(activityItems, "TextMapCHS", "zh-cn"); UpdateActivityForLanguage(activityItems, "TextMapCHS", "zh-cn");
UpdateActivityForLanguage(activityItems, "TextMapCHT", "zh-tw"); UpdateActivityForLanguage(activityItems, "TextMapCHT", "zh-tw");
@ -218,5 +216,51 @@ namespace GrasscutterTools.Pages
// activityItems.Select(it => $"{it.ActivityId}:{TextMapData.GetText(it.NameTextMapHash)}"), // activityItems.Select(it => $"{it.ActivityId}:{TextMapData.GetText(it.NameTextMapHash)}"),
// Encoding.UTF8); // Encoding.UTF8);
} }
private void UpdateGachaResourceForLanguage(string textMap, string language)
{
var i = Array.IndexOf(TextMapData.TextMapFiles, textMap);
TextMapData.LoadTextMap(TextMapData.TextMapFilePaths[i]);
var titleBuffer = new StringBuilder();
const string titlePattern = "UI_GACHA_SHOW_PANEL_([^_]+?)_TITLE";
const string markPattern = "<[^>]+>";
foreach (var kv in TextMapData.ManualTextMap)
{
var titleId = Regex.Match(kv.Value, titlePattern);
if (!titleId.Success) continue;
var text = TextMapData.TextMap[kv.Key];
titleBuffer.Append(titleId.Groups[1].Captures[0].Value)
.Append(":")
.AppendLine(Regex.Replace(text, markPattern, ""));
}
var titleFilePath = Path.Combine(TxtProjectResRoot.Text, language, "GachaBannerTitle.txt");
File.WriteAllText(titleFilePath, titleBuffer.ToString(), Encoding.UTF8);
}
private void BtnUpdateBannerTitles_Click(object sender, EventArgs e)
{
try
{
if (!CheckInputPaths()) return;
TextMapData ??= new TextMapData(TxtGcResRoot.Text);
UpdateGachaResourceForLanguage("TextMapCHS", "zh-cn");
UpdateGachaResourceForLanguage("TextMapCHT", "zh-tw");
UpdateGachaResourceForLanguage("TextMapEN", "en-us");
UpdateGachaResourceForLanguage("TextMapRU", "ru-ru");
MessageBox.Show("OK", Resources.Tips, MessageBoxButtons.OK);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
} }
} }

View File

@ -837,9 +837,9 @@ namespace GrasscutterTools.Properties {
///103:月草的赐慧-纳西妲 ///103:月草的赐慧-纳西妲
///104 [字符串的其余部分被截断]&quot;; 的本地化字符串。 ///104 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary> /// </summary>
internal static string GachaBennerPrefab { internal static string GachaBannerPrefab {
get { get {
return ResourceManager.GetString("GachaBennerPrefab", resourceCulture); return ResourceManager.GetString("GachaBannerPrefab", resourceCulture);
} }
} }

View File

@ -181,8 +181,8 @@
<data name="Error" xml:space="preserve"> <data name="Error" xml:space="preserve">
<value>Error</value> <value>Error</value>
</data> </data>
<data name="GachaBennerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="GachaBannerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\en-us\GachaBennerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\en-us\GachaBannerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data> </data>
<data name="Help" xml:space="preserve"> <data name="Help" xml:space="preserve">
<value>Help</value> <value>Help</value>
@ -285,8 +285,8 @@ Improvement suggestions have been submitted, please use caution to send emails t
<data name="ShopJsonOverrideWarning" xml:space="preserve"> <data name="ShopJsonOverrideWarning" xml:space="preserve">
<value>Only allowed to save in Shop.json format! Are you sure you want to overwrite the currently specified file?</value> <value>Only allowed to save in Shop.json format! Are you sure you want to overwrite the currently specified file?</value>
</data> </data>
<data name="GachaBennerTitle" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="GachaBannerTitle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\en-us\GachaBennerTitle.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value> <value>..\Resources\en-us\GachaBannerTitle.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value>
</data> </data>
<data name="Dungeon" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Dungeon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\en-us\Dungeon.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\en-us\Dungeon.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>

View File

@ -178,8 +178,8 @@
<data name="Error" xml:space="preserve"> <data name="Error" xml:space="preserve">
<value>错误</value> <value>错误</value>
</data> </data>
<data name="GachaBennerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="GachaBannerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\zh-cn\GachaBennerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\zh-cn\GachaBannerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data> </data>
<data name="SettingSaveError" xml:space="preserve"> <data name="SettingSaveError" xml:space="preserve">
<value>保存设置时异常:</value> <value>保存设置时异常:</value>

View File

@ -181,8 +181,8 @@
<data name="Error" xml:space="preserve"> <data name="Error" xml:space="preserve">
<value>Ошибка</value> <value>Ошибка</value>
</data> </data>
<data name="GachaBennerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="GachaBannerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ru-ru\GachaBennerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\ru-ru\GachaBannerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data> </data>
<data name="Help" xml:space="preserve"> <data name="Help" xml:space="preserve">
<value>Помощь</value> <value>Помощь</value>
@ -273,8 +273,8 @@
<data name="ShopJsonOverrideWarning" xml:space="preserve"> <data name="ShopJsonOverrideWarning" xml:space="preserve">
<value>Разрешено сохранять только в формате Shop.json! Вы уверены, что хотите перезаписать текущий файл?</value> <value>Разрешено сохранять только в формате Shop.json! Вы уверены, что хотите перезаписать текущий файл?</value>
</data> </data>
<data name="GachaBennerTitle" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="GachaBannerTitle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ru-ru\GachaBennerTitle.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\ru-ru\GachaBannerTitle.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data> </data>
<data name="Dungeon" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Dungeon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ru-ru\Dungeon.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\ru-ru\Dungeon.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>

View File

@ -178,8 +178,8 @@
<data name="Error" xml:space="preserve"> <data name="Error" xml:space="preserve">
<value>錯誤</value> <value>錯誤</value>
</data> </data>
<data name="GachaBennerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="GachaBannerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\zh-tw\GachaBennerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\zh-tw\GachaBannerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data> </data>
<data name="Help" xml:space="preserve"> <data name="Help" xml:space="preserve">
<value>幫助</value> <value>幫助</value>
@ -279,8 +279,8 @@
<data name="ShopJsonOverrideWarning" xml:space="preserve"> <data name="ShopJsonOverrideWarning" xml:space="preserve">
<value>僅允許以 Shop.json 格式保存!確定要覆蓋當前指定文件嗎?</value> <value>僅允許以 Shop.json 格式保存!確定要覆蓋當前指定文件嗎?</value>
</data> </data>
<data name="GachaBennerTitle" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="GachaBannerTitle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\zh-tw\GachaBennerTitle.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\zh-tw\GachaBannerTitle.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data> </data>
<data name="Dungeon" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Dungeon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\zh-tw\Dungeon.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value> <value>..\Resources\zh-tw\Dungeon.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>

View File

@ -1,55 +1,139 @@
007:Beginners' wish A007:Beginners' wish
008:Wanderlust Invocation A008:Wanderlust Invocation
009:Ballad in Goblets A009:Ballad in Goblets
010:Dawn Pilgrimage A010:Dawn Pilgrimage
011:Grace of Southwind A011:Grace of Southwind
012:Bane of All Evil A012:Bane of All Evil
013:Epitome Invocation A013:Epitome Invocation
015:Sparkling Steps A015:Sparkling Steps
016:Beginners' wish A016:Beginners' wish
017:Wanderlust Invocation A017:Wanderlust Invocation
018:Sparkling Steps A018:Sparkling Steps
019:Ballad in Goblets A019:Ballad in Goblets
020:Amos' Bow and Aquila Favonia A020:Amos' Bow and Aquila Favonia
021:Lost Prayer to the Sacred Winds and Wolf's Gravestone A021:Lost Prayer to the Sacred Winds and Wolf's Gravestone
022:Wanderlust Invocation A022:Wanderlust Invocation
023:Farewell of Snezhnaya A023:Farewell of Snezhnaya
024:Gentry of Hermitage A024:Gentry of Hermitage
025:Skyward Harp and Memory of Dust A025:Skyward Harp and Memory of Dust
026:Vortex Vanquisher and The Unforged A026:Vortex Vanquisher and The Unforged
027:Secretum Secretorum A027:Secretum Secretorum
028:Adrift in the Harbor A028:Adrift in the Harbor
029:Summit Shaper and Skyward Atlas A029:Summit Shaper and Skyward Atlas
030:Amos' Bow and Skyward Pride A030:Amos' Bow and Skyward Pride
031:Invitation to Mundane Life A031:Invitation to Mundane Life
032:Dance of Lanterns A032:Dance of Lanterns
033:Moment of Bloom A033:Moment of Bloom
034:Primordial Jade Winged-Spear and Primordial Jade Cutter A034:Primordial Jade Winged-Spear and Primordial Jade Cutter
035:Staff of Homa and Wolf's Gravestone A035:Staff of Homa and Wolf's Gravestone
036:Ballad in Goblets A036:Ballad in Goblets
037:Farewell of Snezhnaya A037:Farewell of Snezhnaya
038:Elegy for the End and Skyward Blade A038:Elegy for the End and Skyward Blade
039:Skyward Harp and Lost Prayer to the Sacred Winds A039:Skyward Harp and Lost Prayer to the Sacred Winds
040:Gentry of Hermitage A040:Gentry of Hermitage
041:Born of Ocean Swell A041:Born of Ocean Swell
042:Summit Shaper and Memory of Dust A042:Summit Shaper and Memory of Dust
043:Aquila Favonia and Song of Broken Pines A043:Aquila Favonia and Song of Broken Pines
045:Leaves in the Wind A045:Leaves in the Wind
048:The Heron's Court A048:The Heron's Court
049:Tapestry of Golden Flames A049:Tapestry of Golden Flames
052:Reign of Serenity A052:Reign of Serenity
053:Drifting Luminescence A053:Drifting Luminescence
061:Oni's Royale A061:Oni's Royale
065:The Transcendent One Returns A065:The Transcendent One Returns
071:Everbloom Violet A071:Everbloom Violet
076:Azure Excursion A076:Azure Excursion
081:Discerner of Enigmas A081:Discerner of Enigmas
091:Tighnari A091:Tighnari
092:Zhongli A092:Zhongli
093:Hunter's Path A093:Hunter's Path
097:Cyno A097:Cyno
098:Venti A098:Venti
099:Staff of the Scarlet Sands A099:Staff of the Scarlet Sands
//100:Twirling Lotus // Error A100:翩舞歈莲-妮露
101:Secretorum Secretorum A101:深秘之息-阿贝多
102:Epitome Invocation A102:神铸赋形-圣显绿箭
A103:月草的赐慧-纳西妲
A104:焰色天河-宵宫
A105:神铸赋形-千夜飞雷
A106:华紫樱绯-八重神子
A107:暂别冬都-达达利亚
A108:神铸赋形-神乐冬极
A109:余火变相-流浪者
A110:鬼门斗宴-荒泷一斗
A111:神铸赋形-图莱杜拉赤角
A112:影寂天下人-雷电将军
A113:苍流踏花-神里绫人
A114:神铸赋形-薙草波乱
A115:敕诫枢谋-艾尔海森
A116:烟火之邀-魈
A117:神铸赋形-裁叶萃光和璞鸢
A118:赤团开时-胡桃
A119:素霓伣天-夜兰
A120:神铸赋形-护摩若水
A121:迪希雅
A122:赛诺
A123:苇海信标/赤沙之杖
A124:申鹤
A125:神里绫华
A126:雾切之回光/息灾
A127:纳西妲
A128:妮露
A129:千夜浮梦/圣显之钥
A130:白术
A131:甘雨
A132:碧落之珑/阿莫斯之弓
A133:宵宫
A134:八重神子
A135:飞雷之弦振/神乐之真意
A136:艾尔海森
A137:枫原万叶
A138:苍古自由之誓/裁叶萃光
A139:优菈
A140:可莉
A141:松籁响起之时/四风原典
A142:珊瑚宫心海
A143:流浪者
A144:不灭月华/图莱杜拉的回忆
A145:林尼
A146:夜兰
A147:最初的大魔术/若水
A148:钟离
A149:公子
A150:贯虹之槊/冬极白星
A151:那维莱特
A152:胡桃
A153:万世流涌大典/护摩之杖
A154:莱欧斯利
A155:温迪
A156:金流监督/终未嗟叹之诗
A157:芙宁娜
A158:白术
A159:静水流涌之辉/碧落之珑
A160:赛诺
A161:神里绫人
A162:波乱月白经津/赤沙之杖
A163:娜维娅
A164:神里绫华
A165:裁断/雾切之回光
A166:雷电将军
A167:宵宫
A168:薙草之稻光/飞雷之弦振
A169:闲云
A170:纳西妲
A171:鹤鸣余音/千夜浮梦
A172:魈
A173:八重神子
A174:和璞鸢/神乐之真意
A175:千织
A176:荒泷一斗
A177:有乐御簾切/赤角石溃杵
A178:那维莱特
A179:枫原万叶
A180:万世流涌大典/苍古自由之誓
A181:阿蕾奇诺
A182:林尼
A183:赤月之形/最初的大魔术
A184:流浪者
A185:白术
A186:图莱杜拉的回忆/碧落之珑

View File

@ -1,55 +1,53 @@
007:Beginners' wish A007:Beginners' wish
008:Wanderlust Invocation A008:Wanderlust Invocation
009:Ballad in Goblets A009:Ballad in Goblets
010:Dawn Pilgrimage A010:Dawn Pilgrimage
011:Grace of Southwind A011:Grace of Southwind
012:Bane of All Evil A012:Bane of All Evil
013:Epitome Invocation A013:Epitome Invocation
015:Sparkling Steps A015:Sparkling Steps
016:Beginners' wish A016:Beginners' wish
017:Wanderlust Invocation A017:Wanderlust Invocation
018:Sparkling Steps A018:Sparkling Steps
019:Ballad in Goblets A019:Ballad in Goblets
020:Amos' Bow and Aquila Favonia A020:Epitome Invocation
021:Lost Prayer to the Sacred Winds and Wolf's Gravestone A021:Epitome Invocation
022:Wanderlust Invocation A022:Wanderlust Invocation
023:Farewell of Snezhnaya A023:Farewell of Snezhnaya
024:Gentry of Hermitage A024:Gentry of Hermitage
025:Skyward Harp and Memory of Dust A027:Secretum Secretorum
026:Vortex Vanquisher and The Unforged A028:Adrift in the Harbor
027:Secretum Secretorum A031:Invitation to Mundane Life
028:Adrift in the Harbor A032:Dance of Lanterns
029:Summit Shaper and Skyward Atlas A033:Moment of Bloom
030:Amos' Bow and Skyward Pride A036:Ballad in Goblets
031:Invitation to Mundane Life A037:Farewell of Snezhnaya
032:Dance of Lanterns A040:Gentry of Hermitage
033:Moment of Bloom A041:Born of Ocean Swell
034:Primordial Jade Winged-Spear and Primordial Jade Cutter A045:Leaves in the Wind
035:Staff of Homa and Wolf's Gravestone A048:The Heron's Court
036:Ballad in Goblets A049:Tapestry of Golden Flames
037:Farewell of Snezhnaya A052:Reign of Serenity
038:Elegy for the End and Skyward Blade A053:Drifting Luminescence
039:Skyward Harp and Lost Prayer to the Sacred Winds A061:Oni's Royale
040:Gentry of Hermitage A065:The Transcendent One Returns
041:Born of Ocean Swell A071:Everbloom Violet
042:Summit Shaper and Memory of Dust A076:Azure Excursion
043:Aquila Favonia and Song of Broken Pines A081:Discerner of Enigmas
045:Leaves in the Wind A091:Viridescent Vigil
048:The Heron's Court A097:Twilight Arbiter
049:Tapestry of Golden Flames A0100:Twirling Lotus
052:Reign of Serenity A0103:The Moongrass' Enlightenment
053:Drifting Luminescence A0109:From Ashes Reborn
061:Oni's Royale A0115:Caution in Confidence
065:The Transcendent One Returns A0121:Auric Blaze
071:Everbloom Violet A0130:Immaculate Pulse
076:Azure Excursion A0145:Conjuring Chiaroscuro
081:Discerner of Enigmas A0151:Decree of the Deeps
091:Tighnari A0154:Tempestuous Destiny
092:Zhongli A0157:Chanson of Many Waters
093:Hunter's Path A0163:In the Name of the Rosula
097:Cyno A0169:The Crane Soars Skyward
098:Venti A0175:Of Silken Clouds Woven
099:Staff of the Scarlet Sands A0181:The Hearth's Ashen Shadow
//100:Twirling Lotus // Error B001:Ode to the Dawn Breeze
101:Secretorum Secretorum
102:Epitome Invocation

View File

@ -1,45 +1,129 @@
007:Молитва новичка A007:Молитва новичка
008:Жажда странствий A008:Жажда странствий
009:Стихи из винного кубка A009:Стихи из винного кубка
010:Рассветное паломничество A010:Рассветное паломничество
011:Благоволение южного ветра A011:Благоволение южного ветра
012:Истребление всего зла A012:Истребление всего зла
013:Воплощение божества A013:Воплощение божества
015:Сверкающая поступь A015:Сверкающая поступь
016:Молитва новичка A016:Молитва новичка
017:Жажда странствий A017:Жажда странствий
018:Сверкающая поступь A018:Сверкающая поступь
019:Стихи из винного кубка A019:Стихи из винного кубка
020:Воплощение божества A020:Воплощение божества
021:Воплощение божества A021:Воплощение божества
022:Жажда странствий A022:Жажда странствий
023:Зимнее расставание A023:Зимнее расставание
024:Горы и рынки A024:Горы и рынки
027:Таинственные секреты A027:Таинственные секреты
028:Эфемерное недоверие A028:Эфемерное недоверие
031:Приглашение к мирской жизни A031:Приглашение к мирской жизни
032:Танец фонарей A032:Танец фонарей
033:Момент цветения A033:Момент цветения
036:Стихи из винного кубка A036:Стихи из винного кубка
037:Зимнее расставание A037:Зимнее расставание
040:Горы и рынки A040:Горы и рынки
041:Рождённая морской пеной A041:Рождённая морской пеной
045:Листья на ветру A045:Листья на ветру
048:Сад белой цапли A048:Сад белой цапли
049:Гобелен золотого пламени A049:Гобелен золотого пламени
052:Господство безмятежности A052:Господство безмятежности
053:Дрейфующее свечение A053:Дрейфующее свечение
061:Пиршество óни A061:Пиршество óни
065:Возвращение в мир смертных A065:Возвращение в мир смертных
071:Вечноцветущий пурпур A071:Вечноцветущий пурпур
076:Лазурный поход A076:Лазурный поход
081:Белая радуга A081:Белая радуга
091:Патруль лесной чащи A091:Патруль лесной чащи
092:Горы и рынки A092:Горы и рынки
093:Охотничья тропа A093:Охотничья тропа
097:Сумеречный вершитель A097:Сумеречный вершитель
098:Стихи из винного кубка A098:Стихи из винного кубка
099:Посох алых песков A099:Посох алых песков
//100:Кружащийся лотос // Error A100:翩舞歈莲-妮露
101:Таинственные секреты A101:深秘之息-阿贝多
102:Воплощение божества A102:神铸赋形-圣显绿箭
A103:月草的赐慧-纳西妲
A104:焰色天河-宵宫
A105:神铸赋形-千夜飞雷
A106:华紫樱绯-八重神子
A107:暂别冬都-达达利亚
A108:神铸赋形-神乐冬极
A109:余火变相-流浪者
A110:鬼门斗宴-荒泷一斗
A111:神铸赋形-图莱杜拉赤角
A112:影寂天下人-雷电将军
A113:苍流踏花-神里绫人
A114:神铸赋形-薙草波乱
A115:敕诫枢谋-艾尔海森
A116:烟火之邀-魈
A117:神铸赋形-裁叶萃光和璞鸢
A118:赤团开时-胡桃
A119:素霓伣天-夜兰
A120:神铸赋形-护摩若水
A121:迪希雅
A122:赛诺
A123:苇海信标/赤沙之杖
A124:申鹤
A125:神里绫华
A126:雾切之回光/息灾
A127:纳西妲
A128:妮露
A129:千夜浮梦/圣显之钥
A130:白术
A131:甘雨
A132:碧落之珑/阿莫斯之弓
A133:宵宫
A134:八重神子
A135:飞雷之弦振/神乐之真意
A136:艾尔海森
A137:枫原万叶
A138:苍古自由之誓/裁叶萃光
A139:优菈
A140:可莉
A141:松籁响起之时/四风原典
A142:珊瑚宫心海
A143:流浪者
A144:不灭月华/图莱杜拉的回忆
A145:林尼
A146:夜兰
A147:最初的大魔术/若水
A148:钟离
A149:公子
A150:贯虹之槊/冬极白星
A151:那维莱特
A152:胡桃
A153:万世流涌大典/护摩之杖
A154:莱欧斯利
A155:温迪
A156:金流监督/终未嗟叹之诗
A157:芙宁娜
A158:白术
A159:静水流涌之辉/碧落之珑
A160:赛诺
A161:神里绫人
A162:波乱月白经津/赤沙之杖
A163:娜维娅
A164:神里绫华
A165:裁断/雾切之回光
A166:雷电将军
A167:宵宫
A168:薙草之稻光/飞雷之弦振
A169:闲云
A170:纳西妲
A171:鹤鸣余音/千夜浮梦
A172:魈
A173:八重神子
A174:和璞鸢/神乐之真意
A175:千织
A176:荒泷一斗
A177:有乐御簾切/赤角石溃杵
A178:那维莱特
A179:枫原万叶
A180:万世流涌大典/苍古自由之誓
A181:阿蕾奇诺
A182:林尼
A183:赤月之形/最初的大魔术
A184:流浪者
A185:白术
A186:图莱杜拉的回忆/碧落之珑

View File

@ -1,45 +1,53 @@
007:Молитва новичка A007:Молитва новичка
008:Жажда странствий A008:Жажда странствий
009:Стихи из винного кубка A009:Стихи из винного кубка
010:Рассветное паломничество A010:Рассветное паломничество
011:Благоволение южного ветра A011:Благоволение южного ветра
012:Истребление всего зла A012:Истребление всего зла
013:Воплощение божества A013:Воплощение божества
015:Сверкающая поступь A015:Сверкающая поступь
016:Молитва новичка A016:Молитва новичка
017:Жажда странствий A017:Жажда странствий
018:Сверкающая поступь A018:Сверкающая поступь
019:Стихи из винного кубка A019:Стихи из винного кубка
020:Воплощение божества A020:Воплощение божества
021:Воплощение божества A021:Воплощение божества
022:Жажда странствий A022:Жажда странствий
023:Зимнее расставание A023:Зимнее расставание
024:Горы и рынки A024:Горы и рынки
027:Таинственные секреты A027:Таинственные секреты
028:Эфемерное недоверие A028:Эфемерное недоверие
031:Приглашение к мирской жизни A031:Приглашение к мирской жизни
032:Танец фонарей A032:Танец фонарей
033:Момент цветения A033:Момент цветения
036:Стихи из винного кубка A036:Стихи из винного кубка
037:Зимнее расставание A037:Зимнее расставание
040:Горы и рынки A040:Горы и рынки
041:Рождённая морской пеной A041:Рождённая морской пеной
045:Листья на ветру A045:Листья на ветру
048:Сад белой цапли A048:Сад белой цапли
049:Гобелен золотого пламени A049:Гобелен золотого пламени
052:Господство безмятежности A052:Господство безмятежности
053:Дрейфующее свечение A053:Дрейфующее свечение
061:Пиршество óни A061:Пиршество óни
065:Возвращение в мир смертных A065:Возвращение в мир смертных
071:Вечноцветущий пурпур A071:Вечноцветущий пурпур
076:Лазурный поход A076:Лазурный поход
081:Белая радуга A081:Белая радуга
091:Патруль лесной чащи A091:Патруль лесной чащи
092:Горы и рынки A097:Сумеречный вершитель
093:Охотничья тропа A0100:Кружащийся лотос
097:Сумеречный вершитель A0103:Озарение лунной травы
098:Стихи из винного кубка A0109:Прах перерождённый
099:Посох алых песков A0115:Сдержанное благоразумие
//100:Кружащийся лотос // Error A0121:Пылающее золото
101:Таинственные секреты A0130:Биение мудрого сердца
102:Воплощение божества A0145:Волшебство света и тени
A0151:Завет глубин
A0154:Бушующий рок
A0157:Песнь водам мира
A0163:Во имя розы
A0169:Журавль взлетает в небеса
A0175:Сплетение шёлковых облаков
A0181:Пепельная тень очага
B001:Стихи утреннего ветра

View File

@ -1,69 +1,129 @@
007:初行者推荐祈愿 A007:初行者推荐祈愿
008:奔行世间 A008:奔行世间
009:杯装之诗 A009:杯装之诗
010:黎明巡礼 A010:黎明巡礼
011:南风之眷 A011:南风之眷
012:靖妖傩舞 A012:靖妖傩舞
013:神铸赋形 A013:神铸赋形
015:闪焰的驻足 A015:闪焰的驻足
016:初行者推荐祈愿 A016:初行者推荐祈愿
017:奔行世间 A017:奔行世间
018:闪焰的驻足 A018:闪焰的驻足
019:杯装之诗 A019:杯装之诗
020:神铸赋形 A020:神铸赋形
021:神铸赋形 A021:神铸赋形
022:奔行世间 A022:奔行世间
023:暂别冬都 A023:暂别冬都
024:陵薮市朝 A024:陵薮市朝
027:深秘之息 A027:深秘之息
028:浮生孰来 A028:浮生孰来
031:烟火之邀 A031:烟火之邀
032:鱼龙灯昼 A032:鱼龙灯昼
033:赤团开时 A033:赤团开时
036:杯装之诗 A036:杯装之诗
037:暂别冬都 A037:暂别冬都
040:陵薮市朝 A040:陵薮市朝
041:浪涌之瞬 A041:浪涌之瞬
045:叶落风随 A045:叶落风随
048:白鹭之庭 A048:白鹭之庭
049:焰色天河 A049:焰色天河
052:影寂天下人 A052:影寂天下人
053:浮岳虹珠 A053:浮岳虹珠
061:鬼门斗宴 A061:鬼门斗宴
065:出尘入世 A065:出尘入世
071:华紫樱绯 A071:华紫樱绯
076:苍流踏花 A076:苍流踏花
081:素霓伣天 A081:素霓伣天
091:巡御蘙荟-提纳里 A091:巡御蘙荟-提纳里
092:陵薮市朝-钟离 A092:陵薮市朝-钟离
093:神铸赋形-猎人贯虹 A093:神铸赋形-猎人贯虹
097:雳裁冥昭-赛诺 A097:雳裁冥昭-赛诺
098:杯装之诗-温迪 A098:杯装之诗-温迪
099:神铸赋形-赤沙终末 A099:神铸赋形-赤沙终末
100:翩舞歈莲-妮露 A100:翩舞歈莲-妮露
101:深秘之息-阿贝多 A101:深秘之息-阿贝多
102:神铸赋形-圣显绿箭 A102:神铸赋形-圣显绿箭
103:月草的赐慧-纳西妲 A103:月草的赐慧-纳西妲
104:焰色天河-宵宫 A104:焰色天河-宵宫
105:神铸赋形-千夜飞雷 A105:神铸赋形-千夜飞雷
106:华紫樱绯-八重神子 A106:华紫樱绯-八重神子
107:暂别冬都-达达利亚 A107:暂别冬都-达达利亚
108:神铸赋形-神乐冬极 A108:神铸赋形-神乐冬极
109:余火变相-流浪者 A109:余火变相-流浪者
110:鬼门斗宴-荒泷一斗 A110:鬼门斗宴-荒泷一斗
111:神铸赋形-图莱杜拉赤角 A111:神铸赋形-图莱杜拉赤角
112:影寂天下人-雷电将军 A112:影寂天下人-雷电将军
113:苍流踏花-神里绫人 A113:苍流踏花-神里绫人
114:神铸赋形-薙草波乱 A114:神铸赋形-薙草波乱
115:敕诫枢谋-艾尔海森 A115:敕诫枢谋-艾尔海森
116:烟火之邀-魈 A116:烟火之邀-魈
117:神铸赋形-裁叶萃光和璞鸢 A117:神铸赋形-裁叶萃光和璞鸢
118:赤团开时-胡桃 A118:赤团开时-胡桃
119:素霓伣天-夜兰 A119:素霓伣天-夜兰
120:神铸赋形-护摩若水 A120:神铸赋形-护摩若水
121:迪希雅 A121:迪希雅
122:赛诺 A122:赛诺
123:苇海信标/赤沙之杖 A123:苇海信标/赤沙之杖
124:申鹤 A124:申鹤
125:神里绫华 A125:神里绫华
126:雾切之回光/息灾 A126:雾切之回光/息灾
A127:纳西妲
A128:妮露
A129:千夜浮梦/圣显之钥
A130:白术
A131:甘雨
A132:碧落之珑/阿莫斯之弓
A133:宵宫
A134:八重神子
A135:飞雷之弦振/神乐之真意
A136:艾尔海森
A137:枫原万叶
A138:苍古自由之誓/裁叶萃光
A139:优菈
A140:可莉
A141:松籁响起之时/四风原典
A142:珊瑚宫心海
A143:流浪者
A144:不灭月华/图莱杜拉的回忆
A145:林尼
A146:夜兰
A147:最初的大魔术/若水
A148:钟离
A149:公子
A150:贯虹之槊/冬极白星
A151:那维莱特
A152:胡桃
A153:万世流涌大典/护摩之杖
A154:莱欧斯利
A155:温迪
A156:金流监督/终未嗟叹之诗
A157:芙宁娜
A158:白术
A159:静水流涌之辉/碧落之珑
A160:赛诺
A161:神里绫人
A162:波乱月白经津/赤沙之杖
A163:娜维娅
A164:神里绫华
A165:裁断/雾切之回光
A166:雷电将军
A167:宵宫
A168:薙草之稻光/飞雷之弦振
A169:闲云
A170:纳西妲
A171:鹤鸣余音/千夜浮梦
A172:魈
A173:八重神子
A174:和璞鸢/神乐之真意
A175:千织
A176:荒泷一斗
A177:有乐御簾切/赤角石溃杵
A178:那维莱特
A179:枫原万叶
A180:万世流涌大典/苍古自由之誓
A181:阿蕾奇诺
A182:林尼
A183:赤月之形/最初的大魔术
A184:流浪者
A185:白术
A186:图莱杜拉的回忆/碧落之珑

View File

@ -1,49 +1,53 @@
007:初行者推荐祈愿 A007:初行者推荐祈愿
008:奔行世间 A008:奔行世间
009:杯装之诗 A009:杯装之诗
010:黎明巡礼 A010:黎明巡礼
011:南风之眷 A011:南风之眷
012:靖妖傩舞 A012:靖妖傩舞
013:神铸赋形 A013:神铸赋形
015:闪焰的驻足 A015:闪焰的驻足
016:初行者推荐祈愿 A016:初行者推荐祈愿
017:奔行世间 A017:奔行世间
018:闪焰的驻足 A018:闪焰的驻足
019:杯装之诗 A019:杯装之诗
020:神铸赋形 A020:神铸赋形
021:神铸赋形 A021:神铸赋形
022:奔行世间 A022:奔行世间
023:暂别冬都 A023:暂别冬都
024:陵薮市朝 A024:陵薮市朝
027:深秘之息 A027:深秘之息
028:浮生孰来 A028:浮生孰来
031:烟火之邀 A031:烟火之邀
032:鱼龙灯昼 A032:鱼龙灯昼
033:赤团开时 A033:赤团开时
036:杯装之诗 A036:杯装之诗
037:暂别冬都 A037:暂别冬都
040:陵薮市朝 A040:陵薮市朝
041:浪涌之瞬 A041:浪涌之瞬
045:叶落风随 A045:叶落风随
048:白鹭之庭 A048:白鹭之庭
049:焰色天河 A049:焰色天河
052:影寂天下人 A052:影寂天下人
053:浮岳虹珠 A053:浮岳虹珠
061:鬼门斗宴 A061:鬼门斗宴
065:出尘入世 A065:出尘入世
071:华紫樱绯 A071:华紫樱绯
076:苍流踏花 A076:苍流踏花
081:素霓伣天 A081:素霓伣天
091:巡御蘙荟-提纳里 A091:巡御蘙荟
092:陵薮市朝-钟离 A097:雳裁冥昭
093:神铸赋形-猎人贯虹 A0100:翩舞歈莲
097:雳裁冥昭-赛诺 A0103:月草的赐慧
098:杯装之诗-温迪 A0109:余火变相
099:神铸赋形-赤沙终末 A0115:敕诫枢谋
0100:翩舞歈莲-妮露 A0121:烈阳烁金
0103:月草的赐慧-纳西妲 A0130:心珠循琅
0109:余火变相-流浪者 A0145:光与影的戏术
0115:敕诫枢谋-艾尔海森 A0151:渊海界令
101:深秘之息-阿贝多 A0154:劫中泛滥
101:神铸赋形-圣显绿箭 A0157:众水的颂诗
121:迪希雅 A0163:刺玫的铭誓
A0169:云府鹤行
A0175:千云绘羽织
A0181:炉边烬影
B001:晨风之诗

View File

@ -1,45 +1,128 @@
007:初行者推薦祈願 A007:初行者推薦祈願
008:奔行世間 A008:奔行世間
009:杯裝之詩 A009:杯裝之詩
010:黎明巡禮 A010:黎明巡禮
011:南風之眷 A011:南風之眷
012:靖妖儺舞 A012:靖妖儺舞
013:神鑄賦形 A013:神鑄賦形
015:閃焰的駐足 A015:閃焰的駐足
016:初行者推薦祈願 A016:初行者推薦祈願
017:奔行世間 A017:奔行世間
018:閃焰的駐足 A018:閃焰的駐足
019:杯裝之詩 A019:杯裝之詩
020:神鑄賦形 A020:神鑄賦形
021:神鑄賦形 A021:神鑄賦形
022:奔行世間 A022:奔行世間
023:暫別冬都 A023:暫別冬都
024:陵藪市朝 A024:陵藪市朝
027:深秘之息 A027:深秘之息
028:浮生孰來 A028:浮生孰來
031:煙火之邀 A031:煙火之邀
032:魚龍燈晝 A032:魚龍燈晝
033:赤團開時 A033:赤團開時
036:杯裝之詩 A036:杯裝之詩
037:暫別冬都 A037:暫別冬都
040:陵藪市朝 A040:陵藪市朝
041:浪湧之瞬 A041:浪湧之瞬
045:葉落風隨 A045:葉落風隨
048:白鷺之庭 A048:白鷺之庭
049:焰色天河 A049:焰色天河
052:影寂天下人 A052:影寂天下人
053:浮岳虹珠 A053:浮岳虹珠
061:鬼門斗宴 A061:鬼門斗宴
065:出塵入世 A065:出塵入世
071:華紫櫻緋 A071:華紫櫻緋
076:蒼流踏花 A076:蒼流踏花
081:素霓俔天 A081:素霓俔天
091:巡禦蘙薈-提納里 A091:巡禦蘙薈-提納里
092:陵藪市朝-鍾離 A092:陵藪市朝-鍾離
093:神鑄賦形-獵人貫虹 A093:神鑄賦形-獵人貫虹
097:靂裁冥昭-賽諾 A097:靂裁冥昭-賽諾
098:杯裝之詩-溫迪 A098:杯裝之詩-溫迪
099:神鑄賦形-赤沙終末 A099:神鑄賦形-赤沙終末
//100:翩舞歈蓮-妮露 // Error A101:深秘之息-阿贝多
101:深秘之息-阿貝多 A102:神铸赋形-圣显绿箭
101:神鑄賦形-聖顯綠箭 A103:月草的赐慧-纳西妲
A104:焰色天河-宵宫
A105:神铸赋形-千夜飞雷
A106:华紫樱绯-八重神子
A107:暂别冬都-达达利亚
A108:神铸赋形-神乐冬极
A109:余火变相-流浪者
A110:鬼门斗宴-荒泷一斗
A111:神铸赋形-图莱杜拉赤角
A112:影寂天下人-雷电将军
A113:苍流踏花-神里绫人
A114:神铸赋形-薙草波乱
A115:敕诫枢谋-艾尔海森
A116:烟火之邀-魈
A117:神铸赋形-裁叶萃光和璞鸢
A118:赤团开时-胡桃
A119:素霓伣天-夜兰
A120:神铸赋形-护摩若水
A121:迪希雅
A122:赛诺
A123:苇海信标/赤沙之杖
A124:申鹤
A125:神里绫华
A126:雾切之回光/息灾
A127:纳西妲
A128:妮露
A129:千夜浮梦/圣显之钥
A130:白术
A131:甘雨
A132:碧落之珑/阿莫斯之弓
A133:宵宫
A134:八重神子
A135:飞雷之弦振/神乐之真意
A136:艾尔海森
A137:枫原万叶
A138:苍古自由之誓/裁叶萃光
A139:优菈
A140:可莉
A141:松籁响起之时/四风原典
A142:珊瑚宫心海
A143:流浪者
A144:不灭月华/图莱杜拉的回忆
A145:林尼
A146:夜兰
A147:最初的大魔术/若水
A148:钟离
A149:公子
A150:贯虹之槊/冬极白星
A151:那维莱特
A152:胡桃
A153:万世流涌大典/护摩之杖
A154:莱欧斯利
A155:温迪
A156:金流监督/终未嗟叹之诗
A157:芙宁娜
A158:白术
A159:静水流涌之辉/碧落之珑
A160:赛诺
A161:神里绫人
A162:波乱月白经津/赤沙之杖
A163:娜维娅
A164:神里绫华
A165:裁断/雾切之回光
A166:雷电将军
A167:宵宫
A168:薙草之稻光/飞雷之弦振
A169:闲云
A170:纳西妲
A171:鹤鸣余音/千夜浮梦
A172:魈
A173:八重神子
A174:和璞鸢/神乐之真意
A175:千织
A176:荒泷一斗
A177:有乐御簾切/赤角石溃杵
A178:那维莱特
A179:枫原万叶
A180:万世流涌大典/苍古自由之誓
A181:阿蕾奇诺
A182:林尼
A183:赤月之形/最初的大魔术
A184:流浪者
A185:白术
A186:图莱杜拉的回忆/碧落之珑

View File

@ -1,45 +1,53 @@
007:初行者推薦祈願 A007:初行者推薦祈願
008:奔行世間 A008:奔行世間
009:杯裝之詩 A009:杯裝之詩
010:黎明巡禮 A010:黎明巡禮
011:南風之眷 A011:南風之眷
012:靖妖儺舞 A012:靖妖儺舞
013:神鑄賦形 A013:神鑄賦形
015:閃焰的駐足 A015:閃焰的駐足
016:初行者推薦祈願 A016:初行者推薦祈願
017:奔行世間 A017:奔行世間
018:閃焰的駐足 A018:閃焰的駐足
019:杯裝之詩 A019:杯裝之詩
020:神鑄賦形 A020:神鑄賦形
021:神鑄賦形 A021:神鑄賦形
022:奔行世間 A022:奔行世間
023:暫別冬都 A023:暫別冬都
024:陵藪市朝 A024:陵藪市朝
027:深秘之息 A027:深秘之息
028:浮生孰來 A028:浮生孰來
031:煙火之邀 A031:煙火之邀
032:魚龍燈晝 A032:魚龍燈晝
033:赤團開時 A033:赤團開時
036:杯裝之詩 A036:杯裝之詩
037:暫別冬都 A037:暫別冬都
040:陵藪市朝 A040:陵藪市朝
041:浪湧之瞬 A041:浪湧之瞬
045:葉落風隨 A045:葉落風隨
048:白鷺之庭 A048:白鷺之庭
049:焰色天河 A049:焰色天河
052:影寂天下人 A052:影寂天下人
053:浮岳虹珠 A053:浮嶽虹珠
061:鬼門斗宴 A061:鬼門鬥宴
065:出塵入世 A065:出塵入世
071:華紫櫻緋 A071:華紫櫻緋
076:蒼流踏花 A076:蒼流踏花
081:素霓俔天 A081:素霓俔天
091:巡禦蘙薈-提納里 A091:巡禦翳薈
092:陵藪市朝-鍾離 A097:靂裁冥昭
093:神鑄賦形-獵人貫虹 A0100:翩舞歈蓮
097:靂裁冥昭-賽諾 A0103:月草的賜慧
098:杯裝之詩-溫迪 A0109:餘火變相
099:神鑄賦形-赤沙終末 A0115:敕誡樞謀
//100:翩舞歈蓮-妮露 // Error A0121:烈陽爍金
101:深秘之息-阿貝多 A0130:心珠循琅
101:神鑄賦形-聖顯綠箭 A0145:光與影的戲術
A0151:淵海界令
A0154:劫中泛濫
A0157:眾水的頌詩
A0163:刺玫的銘誓
A0169:雲府鶴行
A0175:千雲繪羽織
A0181:爐邊燼影
B001:晨風之詩