Commit bc1dac15 authored by JoyJ's avatar JoyJ

Added a new rules.txt file that contains all card series rules in a structured format

parent 9c91dc00
...@@ -47,6 +47,9 @@ ...@@ -47,6 +47,9 @@
<setting name="MostOnly" serializeAs="String"> <setting name="MostOnly" serializeAs="String">
<value>True</value> <value>True</value>
</setting> </setting>
<setting name="IgnoreNum" serializeAs="String">
<value>False</value>
</setting>
</YGO_DeckAnalyzer.Properties.Settings> </YGO_DeckAnalyzer.Properties.Settings>
</userSettings> </userSettings>
<system.data> <system.data>
......
...@@ -12,7 +12,7 @@ namespace YGO_DeckAnalyzer.Properties { ...@@ -12,7 +12,7 @@ namespace YGO_DeckAnalyzer.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.2.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
...@@ -118,5 +118,17 @@ namespace YGO_DeckAnalyzer.Properties { ...@@ -118,5 +118,17 @@ namespace YGO_DeckAnalyzer.Properties {
this["MostOnly"] = value; this["MostOnly"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool IgnoreNum {
get {
return ((bool)(this["IgnoreNum"]));
}
set {
this["IgnoreNum"] = value;
}
}
} }
} }
...@@ -26,5 +26,8 @@ ...@@ -26,5 +26,8 @@
<Setting Name="MostOnly" Type="System.Boolean" Scope="User"> <Setting Name="MostOnly" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value> <Value Profile="(Default)">True</Value>
</Setting> </Setting>
<Setting Name="IgnoreNum" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>
\ No newline at end of file
...@@ -48,6 +48,11 @@ ...@@ -48,6 +48,11 @@
this.bwWorker = new System.ComponentModel.BackgroundWorker(); this.bwWorker = new System.ComponentModel.BackgroundWorker();
this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.txtStatus = new System.Windows.Forms.ToolStripStatusLabel(); this.txtStatus = new System.Windows.Forms.ToolStripStatusLabel();
this.btnChooseFile = new System.Windows.Forms.Button();
this.ofdSelectFile = new System.Windows.Forms.OpenFileDialog();
this.fbdSelect = new System.Windows.Forms.FolderBrowserDialog();
this.checkIgnoreNum = new System.Windows.Forms.CheckBox();
this.btnReloadRules = new System.Windows.Forms.Button();
this.statusStrip1.SuspendLayout(); this.statusStrip1.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
...@@ -59,9 +64,9 @@ ...@@ -59,9 +64,9 @@
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.listDecks.FormattingEnabled = true; this.listDecks.FormattingEnabled = true;
this.listDecks.ItemHeight = 12; this.listDecks.ItemHeight = 12;
this.listDecks.Location = new System.Drawing.Point(12, 12); this.listDecks.Location = new System.Drawing.Point(10, 12);
this.listDecks.Name = "listDecks"; this.listDecks.Name = "listDecks";
this.listDecks.Size = new System.Drawing.Size(339, 412); this.listDecks.Size = new System.Drawing.Size(354, 400);
this.listDecks.TabIndex = 0; this.listDecks.TabIndex = 0;
this.listDecks.DragDrop += new System.Windows.Forms.DragEventHandler(this.listDecks_DragDrop); this.listDecks.DragDrop += new System.Windows.Forms.DragEventHandler(this.listDecks_DragDrop);
this.listDecks.DragEnter += new System.Windows.Forms.DragEventHandler(this.listDecks_DragEnter); this.listDecks.DragEnter += new System.Windows.Forms.DragEventHandler(this.listDecks_DragEnter);
...@@ -69,9 +74,9 @@ ...@@ -69,9 +74,9 @@
// btnStart // btnStart
// //
this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnStart.Location = new System.Drawing.Point(357, 365); this.btnStart.Location = new System.Drawing.Point(372, 356);
this.btnStart.Name = "btnStart"; this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(135, 59); this.btnStart.Size = new System.Drawing.Size(135, 30);
this.btnStart.TabIndex = 1; this.btnStart.TabIndex = 1;
this.btnStart.Text = "让我康康!"; this.btnStart.Text = "让我康康!";
this.btnStart.UseVisualStyleBackColor = true; this.btnStart.UseVisualStyleBackColor = true;
...@@ -85,7 +90,7 @@ ...@@ -85,7 +90,7 @@
// btnChooseStringsConf // btnChooseStringsConf
// //
this.btnChooseStringsConf.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnChooseStringsConf.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnChooseStringsConf.Location = new System.Drawing.Point(357, 54); this.btnChooseStringsConf.Location = new System.Drawing.Point(372, 54);
this.btnChooseStringsConf.Name = "btnChooseStringsConf"; this.btnChooseStringsConf.Name = "btnChooseStringsConf";
this.btnChooseStringsConf.Size = new System.Drawing.Size(75, 23); this.btnChooseStringsConf.Size = new System.Drawing.Size(75, 23);
this.btnChooseStringsConf.TabIndex = 2; this.btnChooseStringsConf.TabIndex = 2;
...@@ -96,7 +101,7 @@ ...@@ -96,7 +101,7 @@
// txtStringsConf // txtStringsConf
// //
this.txtStringsConf.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.txtStringsConf.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.txtStringsConf.Location = new System.Drawing.Point(357, 27); this.txtStringsConf.Location = new System.Drawing.Point(372, 27);
this.txtStringsConf.Name = "txtStringsConf"; this.txtStringsConf.Name = "txtStringsConf";
this.txtStringsConf.Size = new System.Drawing.Size(135, 21); this.txtStringsConf.Size = new System.Drawing.Size(135, 21);
this.txtStringsConf.TabIndex = 3; this.txtStringsConf.TabIndex = 3;
...@@ -106,7 +111,7 @@ ...@@ -106,7 +111,7 @@
// //
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label1.AutoSize = true; this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(355, 12); this.label1.Location = new System.Drawing.Point(370, 12);
this.label1.Name = "label1"; this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(101, 12); this.label1.Size = new System.Drawing.Size(101, 12);
this.label1.TabIndex = 4; this.label1.TabIndex = 4;
...@@ -116,7 +121,7 @@ ...@@ -116,7 +121,7 @@
// //
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label2.AutoSize = true; this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(355, 81); this.label2.Location = new System.Drawing.Point(370, 81);
this.label2.Name = "label2"; this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(83, 12); this.label2.Size = new System.Drawing.Size(83, 12);
this.label2.TabIndex = 7; this.label2.TabIndex = 7;
...@@ -125,7 +130,7 @@ ...@@ -125,7 +130,7 @@
// txtCardsCdb // txtCardsCdb
// //
this.txtCardsCdb.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.txtCardsCdb.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.txtCardsCdb.Location = new System.Drawing.Point(357, 96); this.txtCardsCdb.Location = new System.Drawing.Point(372, 96);
this.txtCardsCdb.Name = "txtCardsCdb"; this.txtCardsCdb.Name = "txtCardsCdb";
this.txtCardsCdb.Size = new System.Drawing.Size(135, 21); this.txtCardsCdb.Size = new System.Drawing.Size(135, 21);
this.txtCardsCdb.TabIndex = 6; this.txtCardsCdb.TabIndex = 6;
...@@ -134,7 +139,7 @@ ...@@ -134,7 +139,7 @@
// btnChooseCardsCdb // btnChooseCardsCdb
// //
this.btnChooseCardsCdb.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnChooseCardsCdb.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnChooseCardsCdb.Location = new System.Drawing.Point(357, 123); this.btnChooseCardsCdb.Location = new System.Drawing.Point(372, 123);
this.btnChooseCardsCdb.Name = "btnChooseCardsCdb"; this.btnChooseCardsCdb.Name = "btnChooseCardsCdb";
this.btnChooseCardsCdb.Size = new System.Drawing.Size(75, 23); this.btnChooseCardsCdb.Size = new System.Drawing.Size(75, 23);
this.btnChooseCardsCdb.TabIndex = 5; this.btnChooseCardsCdb.TabIndex = 5;
...@@ -155,9 +160,9 @@ ...@@ -155,9 +160,9 @@
// btnClear // btnClear
// //
this.btnClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnClear.Location = new System.Drawing.Point(357, 301); this.btnClear.Location = new System.Drawing.Point(372, 329);
this.btnClear.Name = "btnClear"; this.btnClear.Name = "btnClear";
this.btnClear.Size = new System.Drawing.Size(135, 58); this.btnClear.Size = new System.Drawing.Size(135, 24);
this.btnClear.TabIndex = 8; this.btnClear.TabIndex = 8;
this.btnClear.Text = "全部清空"; this.btnClear.Text = "全部清空";
this.btnClear.UseVisualStyleBackColor = true; this.btnClear.UseVisualStyleBackColor = true;
...@@ -167,7 +172,7 @@ ...@@ -167,7 +172,7 @@
// //
this.checkAllowMixDeck.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.checkAllowMixDeck.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.checkAllowMixDeck.AutoSize = true; this.checkAllowMixDeck.AutoSize = true;
this.checkAllowMixDeck.Location = new System.Drawing.Point(357, 152); this.checkAllowMixDeck.Location = new System.Drawing.Point(372, 152);
this.checkAllowMixDeck.Name = "checkAllowMixDeck"; this.checkAllowMixDeck.Name = "checkAllowMixDeck";
this.checkAllowMixDeck.Size = new System.Drawing.Size(132, 16); this.checkAllowMixDeck.Size = new System.Drawing.Size(132, 16);
this.checkAllowMixDeck.TabIndex = 9; this.checkAllowMixDeck.TabIndex = 9;
...@@ -179,7 +184,7 @@ ...@@ -179,7 +184,7 @@
// //
this.checkOutputDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.checkOutputDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.checkOutputDescription.AutoSize = true; this.checkOutputDescription.AutoSize = true;
this.checkOutputDescription.Location = new System.Drawing.Point(357, 174); this.checkOutputDescription.Location = new System.Drawing.Point(372, 174);
this.checkOutputDescription.Name = "checkOutputDescription"; this.checkOutputDescription.Name = "checkOutputDescription";
this.checkOutputDescription.Size = new System.Drawing.Size(96, 16); this.checkOutputDescription.Size = new System.Drawing.Size(96, 16);
this.checkOutputDescription.TabIndex = 10; this.checkOutputDescription.TabIndex = 10;
...@@ -191,7 +196,7 @@ ...@@ -191,7 +196,7 @@
// //
this.checkNoFile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.checkNoFile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.checkNoFile.AutoSize = true; this.checkNoFile.AutoSize = true;
this.checkNoFile.Location = new System.Drawing.Point(357, 218); this.checkNoFile.Location = new System.Drawing.Point(372, 218);
this.checkNoFile.Name = "checkNoFile"; this.checkNoFile.Name = "checkNoFile";
this.checkNoFile.Size = new System.Drawing.Size(108, 16); this.checkNoFile.Size = new System.Drawing.Size(108, 16);
this.checkNoFile.TabIndex = 11; this.checkNoFile.TabIndex = 11;
...@@ -203,7 +208,7 @@ ...@@ -203,7 +208,7 @@
// //
this.checkMostOnly.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.checkMostOnly.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.checkMostOnly.AutoSize = true; this.checkMostOnly.AutoSize = true;
this.checkMostOnly.Location = new System.Drawing.Point(357, 196); this.checkMostOnly.Location = new System.Drawing.Point(372, 196);
this.checkMostOnly.Name = "checkMostOnly"; this.checkMostOnly.Name = "checkMostOnly";
this.checkMostOnly.Size = new System.Drawing.Size(144, 16); this.checkMostOnly.Size = new System.Drawing.Size(144, 16);
this.checkMostOnly.TabIndex = 12; this.checkMostOnly.TabIndex = 12;
...@@ -220,11 +225,12 @@ ...@@ -220,11 +225,12 @@
// //
// statusStrip1 // statusStrip1
// //
this.statusStrip1.ImageScalingSize = new System.Drawing.Size(40, 40);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.txtStatus}); this.txtStatus});
this.statusStrip1.Location = new System.Drawing.Point(0, 428); this.statusStrip1.Location = new System.Drawing.Point(0, 388);
this.statusStrip1.Name = "statusStrip1"; this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(504, 22); this.statusStrip1.Size = new System.Drawing.Size(519, 22);
this.statusStrip1.TabIndex = 13; this.statusStrip1.TabIndex = 13;
this.statusStrip1.Text = "statusStrip1"; this.statusStrip1.Text = "statusStrip1";
// //
...@@ -234,11 +240,53 @@ ...@@ -234,11 +240,53 @@
this.txtStatus.Size = new System.Drawing.Size(42, 17); this.txtStatus.Size = new System.Drawing.Size(42, 17);
this.txtStatus.Text = "status"; this.txtStatus.Text = "status";
// //
// btnChooseFile
//
this.btnChooseFile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnChooseFile.Location = new System.Drawing.Point(372, 294);
this.btnChooseFile.Name = "btnChooseFile";
this.btnChooseFile.Size = new System.Drawing.Size(135, 28);
this.btnChooseFile.TabIndex = 14;
this.btnChooseFile.Text = "选择文件";
this.btnChooseFile.UseVisualStyleBackColor = true;
this.btnChooseFile.Click += new System.EventHandler(this.btnChooseFile_Click);
//
// ofdSelectFile
//
this.ofdSelectFile.Filter = "YDK 文件|*.ydk|所有文件|*.*";
this.ofdSelectFile.Multiselect = true;
//
// checkIgnoreNum
//
this.checkIgnoreNum.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.checkIgnoreNum.AutoSize = true;
this.checkIgnoreNum.Location = new System.Drawing.Point(372, 238);
this.checkIgnoreNum.Name = "checkIgnoreNum";
this.checkIgnoreNum.Size = new System.Drawing.Size(108, 16);
this.checkIgnoreNum.TabIndex = 15;
this.checkIgnoreNum.Text = "不关心系列占比";
this.checkIgnoreNum.UseVisualStyleBackColor = true;
this.checkIgnoreNum.CheckedChanged += new System.EventHandler(this.checkIgnoreNum_CheckedChanged);
//
// btnReloadRules
//
this.btnReloadRules.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnReloadRules.Location = new System.Drawing.Point(372, 260);
this.btnReloadRules.Name = "btnReloadRules";
this.btnReloadRules.Size = new System.Drawing.Size(135, 28);
this.btnReloadRules.TabIndex = 16;
this.btnReloadRules.Text = "重载规则集";
this.btnReloadRules.UseVisualStyleBackColor = true;
this.btnReloadRules.Click += new System.EventHandler(this.btnReloadRules_Click);
//
// YGODeckAnalyzer // YGODeckAnalyzer
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(504, 450); this.ClientSize = new System.Drawing.Size(519, 410);
this.Controls.Add(this.btnReloadRules);
this.Controls.Add(this.checkIgnoreNum);
this.Controls.Add(this.btnChooseFile);
this.Controls.Add(this.statusStrip1); this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.checkMostOnly); this.Controls.Add(this.checkMostOnly);
this.Controls.Add(this.checkNoFile); this.Controls.Add(this.checkNoFile);
...@@ -254,7 +302,7 @@ ...@@ -254,7 +302,7 @@
this.Controls.Add(this.btnStart); this.Controls.Add(this.btnStart);
this.Controls.Add(this.listDecks); this.Controls.Add(this.listDecks);
this.Name = "YGODeckAnalyzer"; this.Name = "YGODeckAnalyzer";
this.Text = "游戏王卡组统计器 v1.3e by JoyJ"; this.Text = "游戏王卡组统计器 v1.4 by JoyJ";
this.Load += new System.EventHandler(this.Form1_Load); this.Load += new System.EventHandler(this.Form1_Load);
this.statusStrip1.ResumeLayout(false); this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout(); this.statusStrip1.PerformLayout();
...@@ -285,6 +333,11 @@ ...@@ -285,6 +333,11 @@
private System.ComponentModel.BackgroundWorker bwWorker; private System.ComponentModel.BackgroundWorker bwWorker;
private System.Windows.Forms.StatusStrip statusStrip1; private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel txtStatus; private System.Windows.Forms.ToolStripStatusLabel txtStatus;
private System.Windows.Forms.Button btnChooseFile;
private System.Windows.Forms.OpenFileDialog ofdSelectFile;
private System.Windows.Forms.FolderBrowserDialog fbdSelect;
private System.Windows.Forms.CheckBox checkIgnoreNum;
private System.Windows.Forms.Button btnReloadRules;
} }
} }
...@@ -11,1127 +11,186 @@ namespace YGO_DeckAnalyzer ...@@ -11,1127 +11,186 @@ namespace YGO_DeckAnalyzer
{ {
public partial class YGODeckAnalyzer : Form public partial class YGODeckAnalyzer : Form
{ {
// 用于存储从rules.txt读取的规则
private Dictionary<long, List<string>> cardSeriesRules = new Dictionary<long, List<string>>();
private Dictionary<string, string> customSeriesNames = new Dictionary<string, string>();
private Dictionary<string, string> seriesRenames = new Dictionary<string, string>();
private HashSet<string> seriesToDelete = new HashSet<string>();
public YGODeckAnalyzer() public YGODeckAnalyzer()
{ {
this.InitializeComponent(); this.InitializeComponent();
// 初始化时加载规则文件
LoadRulesFromFile();
} }
private void btnStart_Click(object sender, EventArgs e) private Dictionary<string, int> seriesPriorities = new Dictionary<string, int>();
{ // 从rules.txt加载规则
btnStart.Enabled = false; private void LoadRulesFromFile()
if (!checkNoFile.Checked)
{ {
if (this.sfdSave.ShowDialog() != DialogResult.OK) string rulesFilePath = Path.Combine(Application.StartupPath, "rules.txt");
if (!File.Exists(rulesFilePath))
{ {
MessageBox.Show("找不到规则文件: rules.txt", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
} }
File.Delete(this.sfdSave.FileName);
}
bwWorker.RunWorkerAsync();
}
private string SpecialProcess_SeriesJudge(long card) try
{ {
switch (card) string[] lines = File.ReadAllLines(rulesFilePath, Encoding.UTF8);
{ foreach (string line in lines)
case 21362970:
case 67757079:
case 94878265:
return "00毛扎";
case 32465539:
case 94344242:
case 68950538:
case 58600555:
case 12615446:
case 85004150:
case 83048208:
return "电子光虫";
case 64631466:
case 94259633:
case 15173384:
case 41426869:
return "0110"; //纳祭
case 22339232:
case 32274490:
case 36021814:
case 37675138:
case 40991587:
case 57473560:
case 90243945:
return "00白骨";
case 26400609:
case 27415516:
case 53797637:
case 53804307:
case 89185742:
case 89399912:
case 90411554:
case 91020571:
case 27770341:
case 45725480:
return "00征龙";
case 46947713:
case 88093706:
case 71278040:
case 18789533:
return "0101"; //各类码语者
case 5560911:
case 28985331:
case 7409792:
case 9411399:
case 3431737:
case 9742784:
case 25472513:
case 67723438:
case 65536818:
case 53325667:
case 94973028:
case 74644400:
case 72291078:
case 75944053:
return "00均卡";
case 5697558:
return "00ED"; //地中
case 86120751:
case 97973692:
case 74063034:
case 47679935:
case 458748:
case 47457347:
return "0召唤师";
case 71564252:
case 15397015:
case 71197066:
case 40605147:
case 41420027:
case 84749824:
case 36975314:
case 5851097:
case 63845230:
case 36584821:
case 30241314:
case 35059553:
case 81674782:
return "BEAT";
case 41373230:
case 1984618:
case 68468459:
return "0145"; //教导
case 39185163:
case 66570171:
case 4064256:
case 92964816:
return "不死世界";
case 11110587:
return "00割草";
case 11827244:
return "003B"; //圆融魔术-真红眼
case 31443476:
return "010F"; //速攻旋转 - 弹丸
case 53936268:
return "0103"; //个人欺骗攻击 - 骚灵
case 30603688:
case 7084129:
case 1784686:
case 73616671:
case 47222536:
case 7922915:
case 48680970:
case 96471335:
case 85551711:
case 75380687:
case 41721210:
return "10A2"; //黑魔导
case 15180041:
case 19502505:
case 41175645:
case 25290459:
case 90500169:
return "0041"; //LV - 无LV的卡
case 18940556:
case 41782653:
case 38572779:
case 44335251:
case 36042004:
case 38179121:
return "00恐龙";
case 79814787:
case 71039903:
case 72855441:
case 34627841:
case 45644898:
case 8240199:
case 36734924:
case 88241506:
case 2783661:
case 29432790:
case 50371210:
case 56920308:
case 93437091:
case 17655904:
case 57043986:
return "00DD"; //青眼
case 11012154:
case 6990577:
case 43411769:
case 79905468:
case 84899094:
case 59537380:
case 13143275:
case 86148577:
case 87571563:
case 50186558:
case 47393199:
case 11908584:
return "0守护龙";
case 37694547:
return "0007"; //齿车街 - 古代机械
case 10000040:
case 10000000:
case 10000010:
case 10000020:
return "0三幻神";
case 87116928:
case 79229522:
return "1093"; //电子龙 - 嵌合
case 67831115:
case 27705190:
case 89320376:
return "0104"; //机怪虫 - 几张机怪虫相关星遗物
case 36468556:
case 91623717:
case 18252559:
case 24068492:
case 27053506:
return "BURN";
case 2819435:
return "00FA"; //幻煌
case 30012506:
case 77411244:
case 3405259:
case 1561110:
return "0ABC";
case 51126152:
case 52481437:
case 13647631:
case 88875132:
case 24919805:
case 76136345:
case 25274141:
case 26096328:
return "00列车";
case 92379223:
case 31434645:
return "0黄金国";
case 53855409:
case 96363153:
case 37675907:
case 50091196:
case 20932152:
case 80457744:
return "00废二";
case 89397517:
return "00A0"; //传说的骑士->传说之龙
case 26293219:
case 99899504:
case 63804806:
return "0骷髅头";
case 90764875:
case 64379261:
case 37984162:
case 84401683:
case 37168514:
return "00蛇头";
case 93130021:
case 10992251:
case 10642488:
case 14089428:
case 5494820:
case 14291024:
return "0胜利蛇";
case 62340868:
case 25955164:
case 98434877:
case 25833572:
return "属性魔神";
case 36562627:
case 49511705:
case 96012004:
case 70050374:
case 28112535:
case 76728962:
case 3549275:
case 39454112:
case 93078761:
return "00赌博";
case 81171949:
return "头奖壶7";
case 6853254:
return "00DD0巨神龙";
case 6075801:
case 33282498:
case 33460840:
case 60681103:
case 69868555:
case 87835759:
return "0巨神龙";
case 4148264:
case 58012707:
return "0G战队";
case 899287:
case 14512825:
case 41916534:
case 45072394:
case 46294982:
case 72283691:
case 73405179:
case 78527720:
return "00金宫";
case 59160188:
case 50383626:
case 29424328:
case 23898021:
case 25643346:
case 86377375:
return "黯黑世界";
case 24096499:
case 36318200:
case 77797992:
case 97317530:
return "森之圣兽";
case 28118128:
case 92729410:
case 39972129:
return "00子狸";
case 80208158:
case 15574615:
case 16796157:
case 43791861:
case 79185500:
return "00罗宾";
case 8198712:
case 32828635:
case 69217334:
case 95612049:
case 81306186:
case 59913418:
case 72426662:
case 86124104:
return "世界末日";
case 95308449:
return "0倒计时";
case 94212438:
case 67287533:
case 31893528:
case 30170981:
case 94772232:
case 40771118:
case 14386013:
case 16625614:
return "0通灵盘";
case 93151201:
case 84530620:
case 15510988:
case 70797118:
case 57019473:
case 21524779:
case 27217742:
return "雷电家族";
case 75917088:
case 2316186:
case 72709014:
case 74270067:
case 58015506:
return "王女试炼";
case 440556:
case 80727036:
case 7500772:
case 50449881:
case 50532786:
case 70655556:
case 11954712:
case 23536866:
case 51227866:
case 17201174:
case 67111213:
case 43138260:
case 70101178:
case 71923655:
case 20838380:
case 2584136:
case 32393580:
case 84224627:
case 14306092:
case 5014629:
case 28593363:
case 49221191:
case 37798171:
case 44223284:
case 21954587:
case 34290067:
case 93830681:
case 70156946:
case 69155991:
case 47840168:
case 20358953:
case 71015787:
case 13429800:
case 51254277:
case 11845050:
case 10532969:
case 25484449:
case 64319467:
case 17643265:
case 7150545:
case 63193879:
case 37792478:
case 87047161:
case 23672629:
case 59479050:
case 31320433:
case 37279508:
case 65676461:
return "00鲨鱼";
case 77506119:
case 49389523:
case 63595262:
case 64047146:
case 13995824:
case 10321588:
case 20351153:
case 58807980:
case 58685438:
case 22318971:
return "0独角兽";
case 58901502:
case 63364266:
case 59255742:
case 84305651:
case 98637386:
case 7391448:
return "00御用";
case 3070049:
case 67675300:
case 73659078:
case 15893860:
case 32750510:
case 24661486:
return "冰指示物";
case 61802346:
case 50920465:
case 43694481:
case 96565487:
case 28348537:
case 51706604:
return "00雪暴";
case 95929069:
case 68535320:
case 16223761:
return "冰火手";
case 49003308:
case 9053187:
case 43793530:
case 39674352:
case 53776525:
return "魔蜥义豪";
case 39389320:
case 42233477:
case 78621186:
case 40453765:
case 20394040:
return "0野蛮人";
case 20765952:
case 22610082:
case 29549364:
case 57882509:
case 56948373:
case 82432018:
case 94377247:
case 49064413:
case 48948935:
return "假面魔兽";
case 8508055:
case 55550921:
case 82452993:
case 3810071:
case 49814180:
case 96458440:
case 97570038:
return "00格斗";
case 84814897:
case 91597389:
case 87798440:
case 7369217:
case 87564935:
case 8964854:
case 63676256:
case 59364406:
case 47415292:
case 31768112:
case 12965761:
case 69456283:
case 11678191:
case 72083436:
case 11743119:
case 99249638:
case 26931058:
case 39778366:
case 19086954:
case 46181000:
case 85359414:
case 47693640:
case 57062206:
return "00同盟";
case 96029574:
case 95750695:
case 91798373:
case 81601517:
case 19041767:
case 26120084:
case 16984449:
return "00二重";
case 80476891:
case 55100740:
case 44088292:
case 38026562:
case 18993198:
return "0化合兽";
case 99173029:
case 92394653:
case 92200612:
case 90365482:
case 82841979:
case 74115234:
case 73055622:
case 66815913:
case 52900000:
case 48716139:
case 43543777:
case 43378076:
case 39817919:
case 37406863:
case 32181268:
case 30461781:
case 25415052:
case 24701235:
case 16889337:
case 9553721:
case 6544078:
case 1200843:
case 276357:
return "00灵魂";
case 42352091:
case 79747096:
case 4019153:
case 15232745:
case 42230449:
case 78625448:
case 77402960:
case 41418852:
return "源数之门";
}
return null;
}
private void AddCustomSeries(ref Dictionary<string, string> series)
{ {
series.Add("00恐龙", "恐龙"); string trimmedLine = line.Trim();
series.Add("0ABC", "ABC");
series.Add("BEAT", "METABEAT");
series.Add("不死世界", "不死世界");
series.Add("00割草", "割草");
series.Add("00均卡", "均卡(LINK/同调)");
series.Add("0守护龙", "守护龙");
series.Add("0三幻神", "三幻神");
series.Add("BURN", "烧血");
series.Add("00列车", "列车");
series.Add("0召唤师", "召唤师");
series.Add("00废二", "废二");
series.Add("00幻魔", "幻魔");
series.Add("00征龙", "征龙");
series.Add("00白骨", "白骨");
series.Add("电子光虫", "电子光虫");
series.Add("00毛扎", "毛扎");
series.Add("0骷髅头", "燃烧骷髅头");
series.Add("00蛇头", "蛇头");
series.Add("0胜利蛇", "胜利蛇");
series.Add("属性魔神", "门之守护神");
series.Add("00赌博", "骰子与硬币");
series.Add("头奖壶7", "头奖壶");
series.Add("0巨神龙", "巨神龙");
series.Add("0G战队", "G战队");
series.Add("00金宫", "急流山的金宫");
series.Add("黯黑世界", "黯黑世界");
series.Add("森之圣兽", "森之圣兽");
series.Add("00子狸", "子狸");
series.Add("00罗宾", "星斗罗宾");
series.Add("世界末日", "世界末日");
series.Add("0倒计时", "倒计时");
series.Add("0通灵盘", "通灵盘");
series.Add("雷电家族", "雷电家族");
series.Add("王女试炼", "王女试炼");
series.Add("00鲨鱼", "鲨");
series.Add("0独角兽", "独角兽");
series.Add("00御用", "御用");
series.Add("冰指示物", "冰指示物");
series.Add("00雪暴", "雪暴");
series.Add("0冰火手", "冰火手");
series.Add("魔蜥义豪", "魔蜥义豪");
series.Add("0野蛮人", "野蛮人");
series.Add("假面魔兽", "假面魔兽");
series.Add("00格斗", "格斗武僧");
series.Add("00同盟", "各种同盟均");
series.Add("00二重", "各种二重均");
series.Add("00灵魂", "各种灵魂均");
series.Add("0化合兽", "化合兽");
series.Add("源数之门", "源数之门");
}
private Dictionary<string, string> SpecialProcess(Dictionary<string, string> series) // 跳过注释行和空行
{ if (string.IsNullOrEmpty(trimmedLine) || trimmedLine.StartsWith("#"))
this.AddCustomSeries(ref series); continue;
if (series.Keys.Contains("004B")) // 解析规则
{ string[] parts = trimmedLine.Split('|');
series["004B"] = "极星"; if (parts.Length < 2)
} continue;
if (series.Keys.Contains("010E")) //进化药
{ string command = parts[0].Trim();
series["010E"] = "恐龙";
} switch (command)
if (series.Keys.Contains("00B9"))
{
series["00B9"] = "火山";
}
if (series.Keys.Contains("0125"))
{
series["0125"] = null; //笑容
}
if (series.Keys.Contains("00B6"))
{
series["00B6"] = null; //外神
}
if (series.Keys.Contains("00B7"))
{
series["00B7"] = null; //古神
}
if (series.Keys.Contains("00B8"))
{
series["00B8"] = null; //旧神
}
if (series.Keys.Contains("1017"))
{
series["1017"] = null; //同调士
}
if (series.Keys.Contains("00C2"))
{
series["00C2"] = null; //动力工具
}
if (series.Keys.Contains("0123"))
{
series["0123"] = "蔷薇龙"; //蔷薇
}
if (series.Keys.Contains("007E"))
{
series["007E"] = "霍普";
}
if (series.Keys.Contains("00A0"))
{
series["00A0"] = "传说之龙"; //传说的骑士
}
if (series.Keys.Contains("2017"))
{
series["2017"] = null; //同调龙
}
if (series.Keys.Contains("0061"))
{
series["0061"] = "忍者";
}
if (series.Keys.Contains("001E"))
{
series["001E"] = "HERO";
}
if (series.Keys.Contains("001F"))
{
series["001F"] = "HERO";
}
if (series.Keys.Contains("0007"))
{
series["0007"] = "古代机械";
}
if (series.Keys.Contains("00A3"))
{
series["00A3"] = null; //星尘
}
if (series.Keys.Contains("011D"))
{
series["011D"] = null; //禁忌的
}
if (series.Keys.Contains("0073"))
{
series["0073"] = null; //超量
}
if (series.Keys.Contains("0110"))
{
series["0110"] = "纳祭";
}
if (series.Keys.Contains("0066"))
{
series["0066"] = "废二";
}
if (series.Keys.Contains("0119"))
{
series["0119"] = "炎兽";
}
if (series.Keys.Contains("0118"))
{
series["0118"] = null;
}
if (series.Keys.Contains("0101"))
{
series["0101"] = "电子界";
}
if (series.Keys.Contains("0065"))
{
series["0065"] = "入魔";
}
if (series.Keys.Contains("00DB"))
{
series["00DB"] = "幻影骑士团";
}
if (series.Keys.Contains("00C5"))
{
series["00C5"] = "狱火机";
}
if (series.Keys.Contains("004C"))
{
series["004C"] = null; //落穴
}
if (series.Keys.Contains("0040"))
{
series["0040"] = "艾克佐迪亚";
}
if (series.Keys.Contains("00AB"))
{
series["00AB"] = "文具人";
}
if (series.Keys.Contains("010D"))
{
series["010D"] = "魔导兽";
}
if (series.Keys.Contains("0099"))
{
series["0099"] = "魔术师";
}
if (series.Keys.Contains("1002"))
{
series["1002"] = "次世代";
}
if (series.Keys.Contains("3008"))
{
series["3008"] = "HERO";
}
if (series.Keys.Contains("5008"))
{
series["5008"] = "HERO";
}
if (series.Keys.Contains("6008"))
{
series["6008"] = "HERO";
}
if (series.Keys.Contains("A008"))
{
series["A008"] = "HERO";
}
if (series.Keys.Contains("C008"))
{
series["C008"] = "HERO";
}
if (series.Keys.Contains("0071"))
{
series["0071"] = "甜点";
}
if (series.Keys.Contains("0009"))
{
series["0009"] = "HERO";
}
if (series.Keys.Contains("0008"))
{
series["0008"] = "HERO";
}
if (series.Keys.Contains("100A"))
{
series["100A"] = "入魔";
}
if (series.Keys.Contains("3013"))
{
series["3013"] = "机皇";
}
if (series.Keys.Contains("6013"))
{
series["6013"] = "机皇";
}
if (series.Keys.Contains("0020"))
{
series["0020"] = "六武众";
}
if (series.Keys.Contains("1033"))
{
series["1033"] = "黑羽";
}
if (series.Keys.Contains("0034"))
{
series["0034"] = "宝玉兽";
}
if (series.Keys.Contains("2034"))
{
series["2034"] = "宝玉兽";
}
if (series.Keys.Contains("103D"))
{
series["103D"] = "六武众";
}
if (series.Keys.Contains("3042"))
{
series["3042"] = "极星";
}
if (series.Keys.Contains("5042"))
{
series["5042"] = "极星";
}
if (series.Keys.Contains("6042"))
{
series["6042"] = "极星";
}
if (series.Keys.Contains("A042"))
{
series["A042"] = "极星";
}
if (series.Keys.Contains("0047"))
{
series["0047"] = "宝石骑士";
}
if (series.Keys.Contains("010C"))
{
series["010C"] = "机界";
}
if (series.Keys.Contains("0112"))
{
series["0112"] = null; //幻崩
}
if (series.Keys.Contains("0048"))
{
series["0048"] = null; //No
}
if (series.Keys.Contains("1048"))
{
series["1048"] = null; //CNo
}
if (series.Keys.Contains("1073"))
{
series["1073"] = null; //CX
}
if (series.Keys.Contains("2073"))
{
series["2073"] = null; //超量龙
}
if (series.Keys.Contains("0046"))
{
series["0046"] = null; //融合
}
if (series.Keys.Contains("0096"))
{
series["0096"] = null; //电子鱼人
}
if (series.Keys.Contains("0095"))
{
series["0095"] = null; //升阶魔法
}
if (series.Keys.Contains("304E"))
{
series["304E"] = "进化龙";
}
if (series.Keys.Contains("504E"))
{
series["504E"] = "进化龙";
}
if (series.Keys.Contains("006F"))
{
series["006F"] = "英豪挑战者";
}
if (series.Keys.Contains("0092"))
{
series["0092"] = "纹章兽";
}
if (series.Keys.Contains("1072"))
{
series["1072"] = "齿轮齿轮";
}
if (series.Keys.Contains("10F8"))
{
series["10F8"] = "魔术师";
}
if (series.Keys.Contains("20F8"))
{
series["20F8"] = null;
}
if (series.Keys.Contains("010D"))
{
series["010D"] = "魔导兽";
}
if (series.Keys.Contains("107A"))
{
series["107A"] = "圣骑士";
}
if (series.Keys.Contains("207A"))
{
series["207A"] = "圣骑士";
}
if (series.Keys.Contains("007B"))
{
series["007B"] = "银河眼";
}
if (series.Keys.Contains("0055"))
{
series["0055"] = "银河眼";
}
if (series.Keys.Contains("307B"))
{
series["307B"] = "银河眼";
}
if (series.Keys.Contains("009F"))
{
series["009F"] = "魔术师";
}
if (series.Keys.Contains("007D"))
{
series["007D"] = "阳炎兽";
}
if (series.Keys.Contains("107F"))
{
series["107F"] = "霍普";
}
if (series.Keys.Contains("207F"))
{
series["207F"] = "霍普";
}
if (series.Keys.Contains("1081"))
{
series["1081"] = "炎王";
}
if (series.Keys.Contains("0075"))
{
series["0075"] = null; //深渊
}
if (series.Keys.Contains("0093"))
{
series["0093"] = "电子龙";
}
if (series.Keys.Contains("0094"))
{
series["0094"] = "电子龙";
}
if (series.Keys.Contains("109A"))
{
series["109A"] = "超重武者";
}
if (series.Keys.Contains("109B"))
{
series["109B"] = "幻奏";
}
if (series.Keys.Contains("109C"))
{
series["109C"] = "星守";
}
if (series.Keys.Contains("10A2"))
{
series["10A2"] = "黑魔导";
}
if (series.Keys.Contains("20A2"))
{
series["20A2"] = "黑魔导";
}
if (series.Keys.Contains("30A2"))
{
series["30A2"] = "黑魔导";
}
if (series.Keys.Contains("10A4"))
{
series["10A4"] = "栗子球"; //羽翼栗子球
}
if (series.Keys.Contains("00A5"))
{
series["00A5"] = "HERO";
}
if (series.Keys.Contains("10AA"))
{
series["10AA"] = "机壳";
}
if (series.Keys.Contains("00AF"))
{ {
series["00AF"] = "DDD"; case "卡片追加字段":
} if (parts.Length >= 3)
if (series.Keys.Contains("00D7"))
{ {
series["00D7"] = "破坏剑"; long cardId;
} if (long.TryParse(parts[1], out cardId))
if (series.Keys.Contains("00C6"))
{ {
series["00C6"] = "魔术师"; if (!cardSeriesRules.ContainsKey(cardId))
}
if (series.Keys.Contains("00C7"))
{ {
series["00C7"] = "魔术师"; cardSeriesRules[cardId] = new List<string>();
} }
if (series.Keys.Contains("00CE")) if (parts[2].Length != 4)
{ {
series["00CE"] = "水伶女"; throw new Exception($"错误:读取{parts[1]}|{parts[2]}时出错,卡片字段长度必须是4!");
} }
if (series.Keys.Contains("00A9")) cardSeriesRules[cardId].Add(parts[2]);
{
series["00A9"] = "魔玩具";
} }
if (series.Keys.Contains("00C3"))
{
series["00C3"] = "魔玩具";
} }
if (series.Keys.Contains("10B5")) break;
case "设置优先级":
if (parts.Length >= 3)
{ {
series["10B5"] = "灵兽"; string seriesName = parts[1];
} int priority;
if (series.Keys.Contains("20B5")) if (int.TryParse(parts[2], out priority))
{ {
series["20B5"] = "灵兽"; seriesPriorities[seriesName] = priority;
} }
if (series.Keys.Contains("40B5"))
{
series["40B5"] = "灵兽";
} }
if (series.Keys.Contains("10C1")) break;
case "字段归入系列":
if (parts.Length >= 3)
{ {
series["10C1"] = "PSY骨架"; customSeriesNames[parts[1]] = parts[2];
} }
if (series.Keys.Contains("10D9")) break;
case "系列重命名":
if (parts.Length >= 3)
{ {
series["10D9"] = "不知火"; seriesRenames[parts[1]] = parts[2];
} }
if (series.Keys.Contains("00EA")) break;
case "删除系列":
if (parts.Length >= 2)
{ {
series["00EA"] = "水晶机巧"; seriesToDelete.Add(parts[1]);
} }
if (series.Keys.Contains("10DC")) break;
case "按条件删除分类":
if (parts.Length >= 3)
{ {
series["10DC"] = "超级量子"; string condition = parts[1];
} string toDelete = parts[2];
if (series.Keys.Contains("20DC"))
if (!conditionalDeleteRules.ContainsKey(condition))
{ {
series["20DC"] = "超级量子"; conditionalDeleteRules[condition] = new List<string>();
} }
if (series.Keys.Contains("20EC"))
{ conditionalDeleteRules[condition].Add(toDelete);
series["20EC"] = "魔界剧团";
} }
if (series.Keys.Contains("10ED")) break;
{
series["10ED"] = "地中族";
} }
if (series.Keys.Contains("10EE"))
{
series["10EE"] = "秘旋谍";
} }
if (series.Keys.Contains("20EE"))
{
series["20EE"] = "秘旋谍";
} }
if (series.Keys.Contains("00F2")) catch (Exception ex)
{ {
series["00F2"] = "魔术师"; MessageBox.Show($"加载规则文件时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
if (series.Keys.Contains("10F2"))
{
series["10F2"] = "魔术师";
} }
if (series.Keys.Contains("20F2"))
// 替代原来的SpecialProcess_SeriesJudge方法
private string SpecialProcess_SeriesJudge(long card)
{ {
series["20F2"] = "魔术师"; // 将所有系列合并为一个字符串,每个系列占4个字符
} StringBuilder result = new StringBuilder();
if (series.Keys.Contains("00F3")) if (cardSeriesRules.ContainsKey(card))
{ {
series["00F3"] = "捕食植物"; foreach (string series in cardSeriesRules[card])
}
if (series.Keys.Contains("00F4"))
{ {
series["00F4"] = "召唤师"; result.Append(series.PadRight(4, '0').Substring(0, 4));
} }
if (series.Keys.Contains("0102")) return result.ToString();
{
series["0102"] = "枪管";
} }
if (series.Keys.Contains("1115")) return null;
{
series["1115"] = "闪刀";
} }
if (series.Keys.Contains("00FD"))
// 替代原来的AddCustomSeries方法
private void AddCustomSeries(ref Dictionary<string, string> series)
{ {
series["00FD"] = "星遗物"; foreach (var pair in customSeriesNames)
}
if (series.Keys.Contains("1130"))
{ {
series["1130"] = "破械"; series[pair.Key] = pair.Value;
} }
if (series.Keys.Contains("013B"))
{
series["013B"] = null; //叛逆
} }
if (series.Keys.Contains("013C"))
// 替代原来的SpecialProcess方法
private Dictionary<string, string> SpecialProcess(Dictionary<string, string> series)
{ {
series["013C"] = null; //代码破坏者 this.AddCustomSeries(ref series);
}
if (series.Keys.Contains("0143")) // 处理系列重命名
foreach (var pair in seriesRenames)
{ {
series["0143"] = "黄金国"; if (series.Keys.Contains(pair.Key))
}
if (series.Keys.Contains("2142"))
{ {
series["2142"] = "黄金国"; series[pair.Key] = pair.Value;
} }
if (series.Keys.Contains("1143"))
{
series["1143"] = "黄金国";
} }
if (series.Keys.Contains("0148"))
// 处理系列删除
foreach (string seriesKey in seriesToDelete)
{ {
series["0148"] = "圣骑士"; if (series.Keys.Contains(seriesKey))
}
if (series.Keys.Contains("0054"))
{ {
series["0054"] = "拟声(我我我/怒怒怒等)"; series[seriesKey] = null;
} }
if (series.Keys.Contains("0059"))
{
series["0059"] = "拟声(我我我/怒怒怒等)";
} }
if (series.Keys.Contains("008F"))
{ return series;
series["008F"] = "拟声(我我我/怒怒怒等)";
} }
if (series.Keys.Contains("013A"))
private void btnStart_Click(object sender, EventArgs e)
{ {
series["013A"] = "拟声(我我我/怒怒怒等)"; btnStart.Enabled = false;
} if (!checkNoFile.Checked)
if (series.Keys.Contains("0082"))
{ {
series["0082"] = "拟声(我我我/怒怒怒等)"; //蔷薇 if (this.sfdSave.ShowDialog() != DialogResult.OK)
}
if (series.Keys.Contains("00C0"))
{ {
series["00C0"] = "灵使"; //蔷薇 btnStart.Enabled = true;
return;
} }
if (series.Keys.Contains("0091")) File.Delete(this.sfdSave.FileName);
{
series["0091"] = "守墓"; //蔷薇
} }
return series; bwWorker.RunWorkerAsync();
} }
private void btnChooseStringsConf_Click(object sender, EventArgs e) private void btnChooseStringsConf_Click(object sender, EventArgs e)
...@@ -1154,6 +213,7 @@ namespace YGO_DeckAnalyzer ...@@ -1154,6 +213,7 @@ namespace YGO_DeckAnalyzer
this.checkAllowMixDeck.Checked = Properties.Settings.Default.AllowMixDeck; this.checkAllowMixDeck.Checked = Properties.Settings.Default.AllowMixDeck;
this.checkNoFile.Checked = Properties.Settings.Default.NoFile; this.checkNoFile.Checked = Properties.Settings.Default.NoFile;
this.checkMostOnly.Checked = Properties.Settings.Default.MostOnly; this.checkMostOnly.Checked = Properties.Settings.Default.MostOnly;
this.checkIgnoreNum.Checked = Properties.Settings.Default.IgnoreNum;
this.init = false; this.init = false;
} }
...@@ -1241,6 +301,7 @@ namespace YGO_DeckAnalyzer ...@@ -1241,6 +301,7 @@ namespace YGO_DeckAnalyzer
Properties.Settings.Default.MostOnly = checkMostOnly.Checked; Properties.Settings.Default.MostOnly = checkMostOnly.Checked;
this.SaveOptions(); this.SaveOptions();
} }
private Dictionary<string, List<string>> conditionalDeleteRules = new Dictionary<string, List<string>>();
private void bwWorker_DoWork(object sender, DoWorkEventArgs e) private void bwWorker_DoWork(object sender, DoWorkEventArgs e)
{ {
...@@ -1332,7 +393,11 @@ namespace YGO_DeckAnalyzer ...@@ -1332,7 +393,11 @@ namespace YGO_DeckAnalyzer
{ {
main++; main++;
} }
string setcodeString = cardSetCode[card]; string setcodeString = "";
if (cardSetCode.ContainsKey(card))
{
setcodeString = cardSetCode[card];
}
string processing = this.SpecialProcess_SeriesJudge(card); string processing = this.SpecialProcess_SeriesJudge(card);
if (processing != null) if (processing != null)
{ {
...@@ -1364,7 +429,11 @@ namespace YGO_DeckAnalyzer ...@@ -1364,7 +429,11 @@ namespace YGO_DeckAnalyzer
foreach (KeyValuePair<string, int> kvp in deckCardSeries) foreach (KeyValuePair<string, int> kvp in deckCardSeries)
{ {
string serie = ""; string serie = "";
if (!series.ContainsKey(kvp.Key)) if (customSeriesNames.ContainsKey(kvp.Key))
{
serie = customSeriesNames[kvp.Key];
}
else if (!series.ContainsKey(kvp.Key))
{ {
serie = $"未知(0x{kvp.Key})"; serie = $"未知(0x{kvp.Key})";
} }
...@@ -1384,101 +453,101 @@ namespace YGO_DeckAnalyzer ...@@ -1384,101 +453,101 @@ namespace YGO_DeckAnalyzer
} }
} }
} }
// 修改bwWorker_DoWork方法中处理卡组类型的部分
string postfix = ""; string postfix = "";
while (deckCardSeriesFilter.Count > 0)
{ // 创建SeriesInfo列表
most = 0; List<SeriesInfo> seriesInfoList = new List<SeriesInfo>();
mostType = "";
//foreach (KeyValuePair<string,int> kvp in deckCardSeries)
//{
// if (kvp.Value > most)
// {
// most = kvp.Value;
// mostTypeKey = kvp.Key;
// if (!series.ContainsKey(mostTypeKey))
// {
// mostType = $"未知(0x{mostTypeKey})";
// }
// else
// {
// mostType = series[mostTypeKey];
// }
// }
//}
foreach (KeyValuePair<string, int> kvp in deckCardSeriesFilter) foreach (KeyValuePair<string, int> kvp in deckCardSeriesFilter)
{ {
if (kvp.Value > most) // 获取系列的优先级,如果没有设置则默认为0
int priority = 0;
if (seriesPriorities.ContainsKey(kvp.Key))
{ {
most = kvp.Value; priority = seriesPriorities[kvp.Key];
mostType = kvp.Key;
} }
seriesInfoList.Add(new SeriesInfo(kvp.Key, kvp.Value, priority));
} }
if (most <= 6 && (!checkMostOnly.Checked || most <= 3))
// 根据checkIgnoreNum选项进行排序
if (checkIgnoreNum.Checked)
{
// 按优先级排序,优先级相同时按字符串排序
seriesInfoList.Sort((a, b) => {
// 首先按优先级排序(降序)
int priorityCompare = b.Priority.CompareTo(a.Priority);
if (priorityCompare != 0)
return priorityCompare;
// 如果优先级相同,按字符串排序(升序)
return string.Compare(a.Name, b.Name);
});
// 添加满足条件的系列到deckType
foreach (SeriesInfo seriesInfo in seriesInfoList)
{ {
if (deckCardSeriesFilter.Keys.Contains("割草")) if (seriesInfo.Count > 6 || (checkMostOnly.Checked && seriesInfo.Count > 3))
{ {
deckType.Add("割草"); if (!deckType.Contains(seriesInfo.Name))
}
if (deckCardSeriesFilter.Keys.Contains("机巧蛇"))
{ {
deckType.Add("机巧蛇"); deckType.Add(seriesInfo.Name);
if (this.checkOutputDescription.Checked && !checkNoFile.Checked)
{
sw.WriteLine($"{seriesInfo.Name}系列投入:{seriesInfo.Count}");
}
}
}
} }
break;
} }
else else
{ {
// 按优先级排序,优先级相同时按数量排序
seriesInfoList.Sort((a, b) => {
// 首先按优先级排序(降序)
int priorityCompare = b.Priority.CompareTo(a.Priority);
if (priorityCompare != 0)
return priorityCompare;
// 如果优先级相同,按数量排序(降序)
return b.Count.CompareTo(a.Count);
});
// 添加满足条件的系列到deckType
foreach (SeriesInfo seriesInfo in seriesInfoList)
{
if (seriesInfo.Count > 6 || (checkMostOnly.Checked && seriesInfo.Count > 3))
{
if (!deckType.Contains(seriesInfo.Name))
{
deckType.Add(seriesInfo.Name);
if (this.checkOutputDescription.Checked && !checkNoFile.Checked) if (this.checkOutputDescription.Checked && !checkNoFile.Checked)
{ {
sw.WriteLine($"{mostType}系列投入:{most}"); sw.WriteLine($"{seriesInfo.Name}系列投入:{seriesInfo.Count}");
}
} }
if (!deckType.Contains(mostType))
{
deckType.Add(mostType);
} }
deckCardSeriesFilter.Remove(mostType);
} }
} }
// 如果没有找到任何系列,添加"其他"
if (deckType.Count == 0) if (deckType.Count == 0)
{ {
deckType.Add("其他"); deckType.Add("其他");
} }
//deckType.Sort(); //deckType.Sort();
string realDeckType = ""; string realDeckType = "";
if (!checkMostOnly.Checked)
{
if (deckType.Contains("割草"))
{
realDeckType = "割草";
deckType.Remove("割草");
}
if (main > 55 && realDeckType != "割草")
{
realDeckType = $"{main}张";
}
}
if (deckType.Count > 1) if (deckType.Count > 1)
{ {
if (deckType.Contains("METABEAT")) // 应用条件删除规则
foreach (var rule in conditionalDeleteRules)
{ {
deckType.Remove("METABEAT"); if (deckType.Contains(rule.Key))
}
if (deckType.Contains("均卡(LINK/同调)"))
{ {
deckType.Remove("均卡(LINK/同调)"); foreach (var typeToRemove in rule.Value)
}
if (deckType.Contains("黑魔导") || deckType.Contains("召唤师"))
{ {
deckType.Remove("风魔女"); deckType.Remove(typeToRemove);
} }
if (deckType.Contains("恩底弥翁"))
{
deckType.Remove("魔导兽");
} }
if (deckType.Contains("甘多拉"))
{
deckType.Remove("守护龙");
deckType.Remove("圣像骑士");
deckType.Remove("龙骑兵团");
} }
} }
if (deckType.Count >= 3 && this.checkAllowMixDeck.Checked) if (deckType.Count >= 3 && this.checkAllowMixDeck.Checked)
...@@ -1514,7 +583,10 @@ namespace YGO_DeckAnalyzer ...@@ -1514,7 +583,10 @@ namespace YGO_DeckAnalyzer
overAllDeckType[realDeckType]++; overAllDeckType[realDeckType]++;
} }
} }
catch catch (Exception ex)
#if DEBUG
when (false)
#endif
{ {
failed++; failed++;
} }
...@@ -1595,7 +667,7 @@ namespace YGO_DeckAnalyzer ...@@ -1595,7 +667,7 @@ namespace YGO_DeckAnalyzer
string message = "处理结束"; string message = "处理结束";
if (failed > 0) if (failed > 0)
{ {
message += ",失败{failed}个"; message += $",失败{failed}个";
} }
if (!checkNoFile.Checked) if (!checkNoFile.Checked)
{ {
...@@ -1608,7 +680,7 @@ namespace YGO_DeckAnalyzer ...@@ -1608,7 +680,7 @@ namespace YGO_DeckAnalyzer
{ {
if (e.UserState is Dictionary<string, int>) if (e.UserState is Dictionary<string, int>)
{ {
FormChart form = new FormChart(e.UserState as Dictionary<string,int>); FormChart form = new FormChart(e.UserState as Dictionary<string, int>);
form.Show(); form.Show();
} }
else else
...@@ -1621,5 +693,62 @@ namespace YGO_DeckAnalyzer ...@@ -1621,5 +693,62 @@ namespace YGO_DeckAnalyzer
{ {
btnStart.Enabled = true; btnStart.Enabled = true;
} }
private void btnChooseFile_Click(object sender, EventArgs e)
{
if (ofdSelectFile.ShowDialog() == DialogResult.OK)
{
listDecks.Items.AddRange(ofdSelectFile.FileNames);
}
}
private void checkIgnoreNum_CheckedChanged(object sender, EventArgs e)
{
Properties.Settings.Default.IgnoreNum = checkIgnoreNum.Checked;
this.SaveOptions();
}
private void btnReloadRules_Click(object sender, EventArgs e)
{
// 清除现有规则
cardSeriesRules.Clear();
customSeriesNames.Clear();
seriesRenames.Clear();
seriesToDelete.Clear();
seriesPriorities.Clear();
conditionalDeleteRules.Clear();
// 重新加载规则文件
LoadRulesFromFile();
// 显示消息框通知用户
MessageBox.Show("规则文件重新加载完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
// 创建一个辅助类来保存系列信息,包括名称、数量和优先级
class SeriesInfo : IComparable<SeriesInfo>
{
public string Name { get; set; }
public int Count { get; set; }
public int Priority { get; set; }
public SeriesInfo(string name, int count, int priority)
{
Name = name;
Count = count;
Priority = priority;
}
public int CompareTo(SeriesInfo other)
{
// 首先按优先级排序(降序)
int priorityCompare = other.Priority.CompareTo(this.Priority);
if (priorityCompare != 0)
return priorityCompare;
// 如果优先级相同,按数量排序(降序)
return other.Count.CompareTo(this.Count);
} }
} }
...@@ -116,6 +116,11 @@ ...@@ -116,6 +116,11 @@
<ItemGroup> <ItemGroup>
<Folder Include="pics\" /> <Folder Include="pics\" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="rules.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup> <PropertyGroup>
......
...@@ -135,4 +135,10 @@ ...@@ -135,4 +135,10 @@
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>678, 17</value> <value>678, 17</value>
</metadata> </metadata>
<metadata name="ofdSelectFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>799, 17</value>
</metadata>
<metadata name="fbdSelect.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>926, 17</value>
</metadata>
</root> </root>
\ No newline at end of file
# 游戏王卡片分析规则文件
# 以#开头的行是注释行,不执行
# 先后顺序理论上是有影响的
# 注意【字段】和【系列】的区别:
# 字段是string.conf里规定的值转化成的4位字符串,用于判断单卡,类似!setname 0x186→0186
# 字段一定是4位的,不能长也不能短
# 系列则是卡组最终归类名称
# 一句话:卡→字段;卡组→系列。
# 卡片追加字段命令,将卡号设为指定的字段,对应SpecialProcess_SeriesJudge的处理
# 注意:中文英文都没关系,但长度必须是4。
# 这里的【字段】仅作判断用,实际输出时使用的名字在【字段归入系列】【系列重命名】里
# 可以多次追加同一个字段,1张当多张来算。
卡片追加字段|21362970|00毛扎
卡片追加字段|67757079|00毛扎
卡片追加字段|94878265|00毛扎
卡片追加字段|32465539|电子光虫
卡片追加字段|94344242|电子光虫
卡片追加字段|68950538|电子光虫
卡片追加字段|58600555|电子光虫
卡片追加字段|12615446|电子光虫
卡片追加字段|85004150|电子光虫
卡片追加字段|83048208|电子光虫
#纳祭之魔
卡片追加字段|64631466|0110
卡片追加字段|94259633|0110
卡片追加字段|15173384|0110
卡片追加字段|41426869|0110
卡片追加字段|22339232|00白骨
卡片追加字段|32274490|00白骨
卡片追加字段|36021814|00白骨
卡片追加字段|37675138|00白骨
卡片追加字段|40991587|00白骨
卡片追加字段|57473560|00白骨
卡片追加字段|90243945|00白骨
#码语者
卡片追加字段|46947713|0101
卡片追加字段|88093706|0101
卡片追加字段|71278040|0101
卡片追加字段|18789533|0101
卡片追加字段|5560911|00均卡
卡片追加字段|28985331|00均卡
卡片追加字段|7409792|00均卡
卡片追加字段|9411399|00均卡
卡片追加字段|3431737|00均卡
卡片追加字段|9742784|00均卡
卡片追加字段|25472513|00均卡
卡片追加字段|67723438|00均卡
卡片追加字段|65536818|00均卡
卡片追加字段|53325667|00均卡
卡片追加字段|94973028|00均卡
卡片追加字段|74644400|00均卡
卡片追加字段|72291078|00均卡
卡片追加字段|75944053|00均卡
#地中
卡片追加字段|5697558|00ED
卡片追加字段|86120751|0召唤师
卡片追加字段|97973692|0召唤师
卡片追加字段|74063034|0召唤师
卡片追加字段|47679935|0召唤师
卡片追加字段|458748|0召唤师
卡片追加字段|47457347|0召唤师
卡片追加字段|71564252|BEAT
卡片追加字段|15397015|BEAT
卡片追加字段|71197066|BEAT
卡片追加字段|40605147|BEAT
卡片追加字段|41420027|BEAT
卡片追加字段|84749824|BEAT
卡片追加字段|36975314|BEAT
卡片追加字段|5851097|BEAT
卡片追加字段|63845230|BEAT
卡片追加字段|36584821|BEAT
卡片追加字段|30241314|BEAT
卡片追加字段|35059553|BEAT
卡片追加字段|81674782|BEAT
#教导
卡片追加字段|41373230|0145
卡片追加字段|1984618|0145
卡片追加字段|68468459|0145
卡片追加字段|39185163|不死世界
卡片追加字段|66570171|不死世界
卡片追加字段|4064256|不死世界
卡片追加字段|92964816|不死世界
# 割草特殊处理
# 因为要到6张才算卡组成立,所以这里1张按6张卡计算
卡片追加字段|11110587|00割草
卡片追加字段|11110587|00割草
卡片追加字段|11110587|00割草
卡片追加字段|11110587|00割草
卡片追加字段|11110587|00割草
卡片追加字段|11110587|00割草
#真红眼
卡片追加字段|11827244|003B
#枪管
卡片追加字段|31443476|010F
#骚灵
卡片追加字段|53936268|0103
#黑魔术
卡片追加字段|30603688|10A2
卡片追加字段|7084129|10A2
卡片追加字段|1784686|10A2
卡片追加字段|73616671|10A2
卡片追加字段|47222536|10A2
卡片追加字段|7922915|10A2
卡片追加字段|48680970|10A2
卡片追加字段|96471335|10A2
卡片追加字段|85551711|10A2
卡片追加字段|75380687|10A2
卡片追加字段|41721210|10A2
#LV
卡片追加字段|15180041|0041
卡片追加字段|19502505|0041
卡片追加字段|41175645|0041
卡片追加字段|25290459|0041
卡片追加字段|90500169|0041
卡片追加字段|18940556|00恐龙
卡片追加字段|41782653|00恐龙
卡片追加字段|38572779|00恐龙
卡片追加字段|44335251|00恐龙
卡片追加字段|36042004|00恐龙
卡片追加字段|38179121|00恐龙
#青眼
卡片追加字段|79814787|00DD
卡片追加字段|71039903|00DD
卡片追加字段|72855441|00DD
卡片追加字段|34627841|00DD
卡片追加字段|45644898|00DD
卡片追加字段|8240199|00DD
卡片追加字段|36734924|00DD
卡片追加字段|88241506|00DD
卡片追加字段|2783661|00DD
卡片追加字段|29432790|00DD
卡片追加字段|50371210|00DD
卡片追加字段|56920308|00DD
卡片追加字段|93437091|00DD
卡片追加字段|17655904|00DD
卡片追加字段|57043986|00DD
卡片追加字段|11012154|0守护龙
卡片追加字段|6990577|0守护龙
卡片追加字段|43411769|0守护龙
卡片追加字段|79905468|0守护龙
卡片追加字段|84899094|0守护龙
卡片追加字段|59537380|0守护龙
卡片追加字段|13143275|0守护龙
卡片追加字段|86148577|0守护龙
卡片追加字段|87571563|0守护龙
卡片追加字段|50186558|0守护龙
卡片追加字段|47393199|0守护龙
卡片追加字段|11908584|0守护龙
#古代机械
卡片追加字段|37694547|0007
卡片追加字段|10000040|0三幻神
卡片追加字段|10000000|0三幻神
卡片追加字段|10000010|0三幻神
卡片追加字段|10000020|0三幻神
#电子龙
卡片追加字段|87116928|1093
卡片追加字段|79229522|1093
#机怪虫
卡片追加字段|67831115|0104
卡片追加字段|27705190|0104
卡片追加字段|89320376|0104
卡片追加字段|36468556|BURN
卡片追加字段|91623717|BURN
卡片追加字段|18252559|BURN
卡片追加字段|24068492|BURN
卡片追加字段|27053506|BURN
#幻煌龙
卡片追加字段|2819435|00FA
卡片追加字段|30012506|ABC龙
卡片追加字段|77411244|ABC龙
卡片追加字段|3405259|ABC龙
卡片追加字段|1561110|ABC龙
卡片追加字段|51126152|00列车
卡片追加字段|52481437|00列车
卡片追加字段|13647631|00列车
卡片追加字段|88875132|00列车
卡片追加字段|24919805|00列车
卡片追加字段|76136345|00列车
卡片追加字段|25274141|00列车
卡片追加字段|26096328|00列车
卡片追加字段|92379223|0黄金国
卡片追加字段|31434645|0黄金国
卡片追加字段|53855409|00废二
卡片追加字段|96363153|00废二
卡片追加字段|37675907|00废二
卡片追加字段|50091196|00废二
卡片追加字段|20932152|00废二
卡片追加字段|80457744|00废二
#传说骑士
卡片追加字段|89397517|00A0
卡片追加字段|26293219|0骷髅头
卡片追加字段|99899504|0骷髅头
卡片追加字段|63804806|0骷髅头
卡片追加字段|90764875|00蛇头
卡片追加字段|64379261|00蛇头
卡片追加字段|37984162|00蛇头
卡片追加字段|84401683|00蛇头
卡片追加字段|37168514|00蛇头
卡片追加字段|93130021|0胜利蛇
卡片追加字段|10992251|0胜利蛇
卡片追加字段|10642488|0胜利蛇
卡片追加字段|14089428|0胜利蛇
卡片追加字段|5494820|0胜利蛇
卡片追加字段|14291024|0胜利蛇
卡片追加字段|62340868|属性魔神
卡片追加字段|25955164|属性魔神
卡片追加字段|98434877|属性魔神
卡片追加字段|25833572|属性魔神
卡片追加字段|36562627|00赌博
卡片追加字段|49511705|00赌博
卡片追加字段|96012004|00赌博
卡片追加字段|70050374|00赌博
卡片追加字段|28112535|00赌博
卡片追加字段|76728962|00赌博
卡片追加字段|3549275|00赌博
卡片追加字段|39454112|00赌博
卡片追加字段|93078761|00赌博
卡片追加字段|81171949|头奖壶7
卡片追加字段|6853254|00DD|0巨神龙
卡片追加字段|6075801|0巨神龙
卡片追加字段|33282498|0巨神龙
卡片追加字段|33460840|0巨神龙
卡片追加字段|60681103|0巨神龙
卡片追加字段|69868555|0巨神龙
卡片追加字段|87835759|0巨神龙
卡片追加字段|4148264|0G战队
卡片追加字段|58012707|0G战队
卡片追加字段|899287|00金宫
卡片追加字段|14512825|00金宫
卡片追加字段|41916534|00金宫
卡片追加字段|45072394|00金宫
卡片追加字段|46294982|00金宫
卡片追加字段|72283691|00金宫
卡片追加字段|73405179|00金宫
卡片追加字段|78527720|00金宫
卡片追加字段|59160188|黯黑世界
卡片追加字段|50383626|黯黑世界
卡片追加字段|29424328|黯黑世界
卡片追加字段|23898021|黯黑世界
卡片追加字段|25643346|黯黑世界
卡片追加字段|86377375|黯黑世界
卡片追加字段|24096499|森之圣兽
卡片追加字段|36318200|森之圣兽
卡片追加字段|77797992|森之圣兽
卡片追加字段|97317530|森之圣兽
卡片追加字段|28118128|00子狸
卡片追加字段|92729410|00子狸
卡片追加字段|39972129|00子狸
卡片追加字段|80208158|00罗宾
卡片追加字段|15574615|00罗宾
卡片追加字段|16796157|00罗宾
卡片追加字段|43791861|00罗宾
卡片追加字段|79185500|00罗宾
卡片追加字段|8198712|世界末日
卡片追加字段|32828635|世界末日
卡片追加字段|69217334|世界末日
卡片追加字段|95612049|世界末日
卡片追加字段|81306186|世界末日
卡片追加字段|59913418|世界末日
卡片追加字段|72426662|世界末日
卡片追加字段|86124104|世界末日
#倒计时特殊处理,1张当6张计算
卡片追加字段|95308449|0倒计时
卡片追加字段|95308449|0倒计时
卡片追加字段|95308449|0倒计时
卡片追加字段|95308449|0倒计时
卡片追加字段|95308449|0倒计时
卡片追加字段|95308449|0倒计时
卡片追加字段|94212438|0通灵盘
卡片追加字段|67287533|0通灵盘
卡片追加字段|31893528|0通灵盘
卡片追加字段|30170981|0通灵盘
卡片追加字段|94772232|0通灵盘
卡片追加字段|40771118|0通灵盘
卡片追加字段|14386013|0通灵盘
卡片追加字段|16625614|0通灵盘
卡片追加字段|93151201|雷电家族
卡片追加字段|84530620|雷电家族
卡片追加字段|15510988|雷电家族
卡片追加字段|70797118|雷电家族
卡片追加字段|57019473|雷电家族
卡片追加字段|21524779|雷电家族
卡片追加字段|27217742|雷电家族
卡片追加字段|75917088|王女试炼
卡片追加字段|2316186|王女试炼
卡片追加字段|72709014|王女试炼
卡片追加字段|74270067|王女试炼
卡片追加字段|58015506|王女试炼
卡片追加字段|77506119|0独角兽
卡片追加字段|49389523|0独角兽
卡片追加字段|63595262|0独角兽
卡片追加字段|64047146|0独角兽
卡片追加字段|13995824|0独角兽
卡片追加字段|10321588|0独角兽
卡片追加字段|20351153|0独角兽
卡片追加字段|58807980|0独角兽
卡片追加字段|58685438|0独角兽
卡片追加字段|22318971|0独角兽
卡片追加字段|58901502|00御用
卡片追加字段|63364266|00御用
卡片追加字段|59255742|00御用
卡片追加字段|84305651|00御用
卡片追加字段|98637386|00御用
卡片追加字段|7391448|00御用
卡片追加字段|3070049|冰指示物
卡片追加字段|67675300|冰指示物
卡片追加字段|73659078|冰指示物
卡片追加字段|15893860|冰指示物
卡片追加字段|32750510|冰指示物
卡片追加字段|24661486|冰指示物
卡片追加字段|61802346|00雪暴
卡片追加字段|50920465|00雪暴
卡片追加字段|43694481|00雪暴
卡片追加字段|96565487|00雪暴
卡片追加字段|28348537|00雪暴
卡片追加字段|51706604|00雪暴
卡片追加字段|95929069|0冰火手
卡片追加字段|68535320|0冰火手
卡片追加字段|16223761|0冰火手
卡片追加字段|49003308|魔蜥义豪
卡片追加字段|9053187|魔蜥义豪
卡片追加字段|43793530|魔蜥义豪
卡片追加字段|39674352|魔蜥义豪
卡片追加字段|53776525|魔蜥义豪
卡片追加字段|39389320|0野蛮人
卡片追加字段|42233477|0野蛮人
卡片追加字段|78621186|0野蛮人
卡片追加字段|40453765|0野蛮人
卡片追加字段|20394040|0野蛮人
卡片追加字段|20765952|假面魔兽
卡片追加字段|22610082|假面魔兽
卡片追加字段|29549364|假面魔兽
卡片追加字段|57882509|假面魔兽
卡片追加字段|56948373|假面魔兽
卡片追加字段|82432018|假面魔兽
卡片追加字段|94377247|假面魔兽
卡片追加字段|49064413|假面魔兽
卡片追加字段|48948935|假面魔兽
卡片追加字段|8508055|00格斗
卡片追加字段|55550921|00格斗
卡片追加字段|82452993|00格斗
卡片追加字段|3810071|00格斗
卡片追加字段|49814180|00格斗
卡片追加字段|96458440|00格斗
卡片追加字段|97570038|00格斗
卡片追加字段|84814897|00同盟
卡片追加字段|91597389|00同盟
卡片追加字段|87798440|00同盟
卡片追加字段|7369217|00同盟
卡片追加字段|87564935|00同盟
卡片追加字段|8964854|00同盟
卡片追加字段|63676256|00同盟
卡片追加字段|59364406|00同盟
卡片追加字段|47415292|00同盟
卡片追加字段|31768112|00同盟
卡片追加字段|12965761|00同盟
卡片追加字段|69456283|00同盟
卡片追加字段|11678191|00同盟
卡片追加字段|72083436|00同盟
卡片追加字段|11743119|00同盟
卡片追加字段|99249638|00同盟
卡片追加字段|26931058|00同盟
卡片追加字段|39778366|00同盟
卡片追加字段|19086954|00同盟
卡片追加字段|46181000|00同盟
卡片追加字段|85359414|00同盟
卡片追加字段|47693640|00同盟
卡片追加字段|57062206|00同盟
卡片追加字段|96029574|00二重
卡片追加字段|95750695|00二重
卡片追加字段|91798373|00二重
卡片追加字段|81601517|00二重
卡片追加字段|19041767|00二重
卡片追加字段|26120084|00二重
卡片追加字段|16984449|00二重
卡片追加字段|80476891|0化合兽
卡片追加字段|55100740|0化合兽
卡片追加字段|44088292|0化合兽
卡片追加字段|38026562|0化合兽
卡片追加字段|18993198|0化合兽
卡片追加字段|99173029|00灵魂
卡片追加字段|92394653|00灵魂
卡片追加字段|92200612|00灵魂
卡片追加字段|90365482|00灵魂
卡片追加字段|82841979|00灵魂
卡片追加字段|74115234|00灵魂
卡片追加字段|73055622|00灵魂
卡片追加字段|66815913|00灵魂
卡片追加字段|52900000|00灵魂
卡片追加字段|48716139|00灵魂
卡片追加字段|43543777|00灵魂
卡片追加字段|43378076|00灵魂
卡片追加字段|39817919|00灵魂
卡片追加字段|37406863|00灵魂
卡片追加字段|32181268|00灵魂
卡片追加字段|30461781|00灵魂
卡片追加字段|25415052|00灵魂
卡片追加字段|24701235|00灵魂
卡片追加字段|16889337|00灵魂
卡片追加字段|9553721|00灵魂
卡片追加字段|6544078|00灵魂
卡片追加字段|1200843|00灵魂
卡片追加字段|276357|00灵魂
#有些源数不是源数之门,不能做简单源数→源数之门替换
卡片追加字段|42352091|源数之门
卡片追加字段|79747096|源数之门
卡片追加字段|4019153|源数之门
卡片追加字段|15232745|源数之门
卡片追加字段|42230449|源数之门
卡片追加字段|78625448|源数之门
卡片追加字段|77402960|源数之门
卡片追加字段|41418852|源数之门
卡片追加字段|84869738|00扎克
卡片追加字段|13331639|00扎克
卡片追加字段|89194033|王家神殿
卡片追加字段|29762407|王家神殿
#九头蛇,1张当6张计算
卡片追加字段|44009443|0九头蛇
卡片追加字段|44009443|0九头蛇
卡片追加字段|44009443|0九头蛇
卡片追加字段|44009443|0九头蛇
卡片追加字段|44009443|0九头蛇
卡片追加字段|44009443|0九头蛇
卡片追加字段|93953933|0九头蛇
#混沌战士
卡片追加字段|45948430|10CF
卡片追加字段|32360466|10CF
卡片追加字段|6628343|10CF
卡片追加字段|32013448|10CF
卡片追加字段|79234734|10CF
# 老艾特殊处理
# 因为要到6张才算卡组成立,所以这里1张老艾头按2张卡计算(0x0040=被封印的)
卡片追加字段|33396948|0040
卡片追加字段|33396948|0040
#弱肉一色,1张当2张计算
卡片追加字段|66926224|弱肉一色
卡片追加字段|66926224|弱肉一色
#祝台特殊胜利,1张当6张计算
卡片追加字段|77751766|00祝台
卡片追加字段|77751766|00祝台
卡片追加字段|77751766|00祝台
卡片追加字段|77751766|00祝台
卡片追加字段|77751766|00祝台
卡片追加字段|77751766|00祝台
# 字段归入系列命令,将字段归入系列
字段归入系列|00恐龙|恐龙
字段归入系列|0黄金国|黄金国
字段归入系列|0九头蛇|九头蛇
字段归入系列|00割草|割草
字段归入系列|00祝台|祝台
字段归入系列|弱肉一色|弱肉一色
字段归入系列|王家神殿|王家神殿
字段归入系列|00扎克|扎克
字段归入系列|ABC龙|ABC
字段归入系列|BEAT|METABEAT
字段归入系列|不死世界|不死世界
字段归入系列|00均卡|均卡(LINK/同调)
字段归入系列|0守护龙|守护龙
字段归入系列|0三幻神|三幻神
字段归入系列|BURN|烧血
字段归入系列|00列车|列车
字段归入系列|0召唤师|召唤师
字段归入系列|00废二|废二
字段归入系列|00幻魔|幻魔
字段归入系列|00白骨|白骨
字段归入系列|电子光虫|电子光虫
字段归入系列|00毛扎|毛扎
字段归入系列|0骷髅头|燃烧骷髅头
字段归入系列|00蛇头|蛇头
字段归入系列|0胜利蛇|胜利蛇
字段归入系列|属性魔神|门之守护神
字段归入系列|00赌博|骰子与硬币
字段归入系列|头奖壶7|头奖壶
字段归入系列|0巨神龙|巨神龙
字段归入系列|0G战队|G战队
字段归入系列|00金宫|急流山的金宫
字段归入系列|黯黑世界|黯黑世界
字段归入系列|森之圣兽|森之圣兽
字段归入系列|00子狸|子狸
字段归入系列|00罗宾|星斗罗宾
字段归入系列|世界末日|世界末日
字段归入系列|0倒计时|倒计时
字段归入系列|0通灵盘|通灵盘
字段归入系列|雷电家族|雷电家族
字段归入系列|王女试炼|王女试炼
字段归入系列|0独角兽|独角兽
字段归入系列|00御用|御用
字段归入系列|冰指示物|冰指示物
字段归入系列|00雪暴|雪暴
字段归入系列|0冰火手|冰火手
字段归入系列|魔蜥义豪|魔蜥义豪
字段归入系列|0野蛮人|野蛮人
字段归入系列|假面魔兽|假面魔兽
字段归入系列|00格斗|格斗武僧
字段归入系列|00同盟|各种同盟均
字段归入系列|00二重|各种二重均
字段归入系列|00灵魂|各种灵魂均
字段归入系列|0化合兽|化合兽
字段归入系列|源数之门|源数之门
# 对应SpecialProcess的处理
系列重命名|0040|艾克佐迪亚
系列重命名|004B|极星
系列重命名|010E|恐龙
系列重命名|00B9|火山
删除系列|0125
删除系列|00B6
删除系列|00B7
删除系列|00B8
删除系列|1017
删除系列|00C2
系列重命名|0123|蔷薇龙
系列重命名|007E|霍普
系列重命名|00A0|传说之龙
删除系列|2017
系列重命名|0061|忍者
系列重命名|001E|HERO
系列重命名|001F|HERO
系列重命名|0007|古代机械
删除系列|00A3
删除系列|011D
删除系列|0073
系列重命名|0110|纳祭
系列重命名|0066|废二
系列重命名|0119|炎兽
删除系列|0118
系列重命名|0101|电子界
系列重命名|0065|入魔
系列重命名|00DB|幻影骑士团
系列重命名|00C5|狱火机
删除系列|004C
系列重命名|0040|艾克佐迪亚
系列重命名|00AB|文具人
系列重命名|010D|魔导兽
系列重命名|0099|魔术师
系列重命名|1002|次世代
系列重命名|3008|HERO
系列重命名|5008|HERO
系列重命名|6008|HERO
系列重命名|A008|HERO
系列重命名|C008|HERO
系列重命名|0071|甜点
系列重命名|0009|HERO
系列重命名|0008|HERO
系列重命名|100A|入魔
系列重命名|3013|机皇
系列重命名|6013|机皇
系列重命名|0020|六武众
系列重命名|1033|黑羽
系列重命名|0034|宝玉兽
系列重命名|2034|宝玉兽
系列重命名|103D|六武众
系列重命名|3042|极星
系列重命名|5042|极星
系列重命名|6042|极星
系列重命名|A042|极星
系列重命名|0047|宝石骑士
系列重命名|010C|机界
删除系列|0112
删除系列|0048
删除系列|1048
删除系列|1073
删除系列|2073
删除系列|0046
删除系列|0096
删除系列|0095
系列重命名|304E|进化龙
系列重命名|504E|进化龙
系列重命名|006F|英豪挑战者
系列重命名|0092|纹章兽
系列重命名|1072|齿轮齿轮
系列重命名|10F8|魔术师
删除系列|20F8
系列重命名|010D|魔导兽
系列重命名|107A|圣骑士
系列重命名|207A|圣骑士
系列重命名|007B|银河眼
系列重命名|0055|银河眼
系列重命名|307B|银河眼
系列重命名|009F|魔术师
系列重命名|007D|阳炎兽
系列重命名|107F|霍普
系列重命名|207F|霍普
系列重命名|1081|炎王
删除系列|0075
系列重命名|0093|电子龙
系列重命名|0094|电子龙
系列重命名|109A|超重武者
系列重命名|109B|幻奏
系列重命名|109C|星守
系列重命名|10A2|黑魔导
系列重命名|20A2|黑魔导
系列重命名|30A2|黑魔导
系列重命名|10A4|栗子球
系列重命名|00A5|HERO
系列重命名|10AA|机壳
系列重命名|00AF|DDD
系列重命名|00D7|破坏剑
系列重命名|00C6|魔术师
系列重命名|00C7|魔术师
系列重命名|00CE|水伶女
系列重命名|00A9|魔玩具
系列重命名|00C3|魔玩具
系列重命名|10B5|灵兽
系列重命名|20B5|灵兽
系列重命名|40B5|灵兽
系列重命名|10C1|PSY骨架
系列重命名|10D9|不知火
系列重命名|00EA|水晶机巧
系列重命名|10DC|超级量子
系列重命名|20DC|超级量子
系列重命名|20EC|魔界剧团
系列重命名|10ED|地中族
系列重命名|10EE|秘旋谍
系列重命名|20EE|秘旋谍
系列重命名|00F2|魔术师
系列重命名|10F2|魔术师
系列重命名|20F2|魔术师
系列重命名|00F3|捕食植物
系列重命名|00F4|召唤师
系列重命名|0102|枪管
系列重命名|1115|闪刀
系列重命名|00FD|星遗物
系列重命名|1130|破械
删除系列|013B
删除系列|013C
系列重命名|0143|黄金国
系列重命名|2142|黄金国
系列重命名|1143|黄金国
系列重命名|0148|圣骑士
系列重命名|0054|拟声
系列重命名|0059|拟声
系列重命名|008F|拟声
系列重命名|013A|拟声
系列重命名|0082|拟声
系列重命名|00C0|灵使
系列重命名|0091|守墓
#以下2025/06/29新增,对应从0x114e~0x1ce的处理
系列重命名|114E|电脑堺
系列重命名|1151|直播双子
系列重命名|2151|直播双子
系列重命名|0152|直播双子
系列重命名|0153|直播双子
系列重命名|1158|圣天树
系列重命名|015B|惊乐园
系列重命名|015C|惊乐园
系列重命名|1162|七音服
系列重命名|2167|森之圣兽
系列重命名|0168|水母
系列重命名|0169|源数之门
系列重命名|017E|白银城
系列重命名|117E|白银城
系列重命名|2185|涂鸦兽
系列重命名|0189|俱舍怒威
系列重命名|0197|新式魔厨
系列重命名|119B|迪亚贝尔
系列重命名|119D|荷鲁斯
系列重命名|01A9|天杯
系列重命名|01AA|天杯
系列重命名|01A2|百夫长
系列重命名|01B3|百夫长
系列重命名|01B6|千年
系列重命名|11B8|鲨
系列重命名|01BE|雷火
#降阶魔法
删除系列|015E
#七皇
删除系列|0175
#异晶人的
删除系列|0176
#桥梁
删除系列|0187
#至爱
#此处仅删除了系列,暂时还没把至爱卡归类
删除系列|0194
#维萨斯
删除系列|0198
#反击
删除系列|0199
#哈特
删除系列|01A0
#时空
#此处仅删除了系列,暂时还没把时空卡归类
删除系列|01B4
#蓝泪
删除系列|01B5
#统王
删除系列|01C6
#瞬间移动
删除系列|01CC
# 按条件删除分类:仅当有2个以上系列时,删除单个分类
# 使用场景:比如当METABEAT+黄金国时,仅保留黄金国;但如果一个卡组分类仅为METABEAT,就仍然输出METABEAT。
# 其他使用场景:类似甘多拉+守护龙的卡组,守护龙仅为了甘多拉服务,就不需要留下守护龙分类了。
# 语法上:当存在第二个值时,删除第三个种类。
按条件删除分类|烧血|烧血
按条件删除分类|METABEAT|METABEAT
按条件删除分类|均卡(LINK/同调)|均卡(LINK/同调)
按条件删除分类|黑魔导|风魔女
按条件删除分类|召唤师|风魔女
按条件删除分类|恩底弥翁|魔导兽
按条件删除分类|甘多拉|守护龙
按条件删除分类|甘多拉|圣像骑士
按条件删除分类|甘多拉|龙骑兵团
按条件删除分类|九头蛇|九头蛇
# 设置优先级:优先级越高,排列顺序就总是更靠前;即使它们的占比更低。
# 在【不关系占比】模式下仍然生效。
# 比如【割草】系列总排列在其他任何标签前(比如:割草狱火机)
# 语法:设置优先级||优先级(数字)
# 没有设置优先级的系列,优先级默认为0。
# 可以设置负数优先级,让其在排列时总是靠后。
# 同一优先级按字符串顺序自然排列。
设置优先级|割草|10000
设置优先级|艾克佐迪亚|-10000
设置优先级|祝台|-10000
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment