├── .editorconfig
├── .gitattributes
├── .github
└── workflows
│ └── windbot.yml
├── .gitignore
├── App.config
├── BotWrapper
├── BotWrapper.cs
├── BotWrapper.csproj
├── BotWrapper.sh
├── Properties
│ └── AssemblyInfo.cs
├── WindBot.ico
├── app.config
└── bot.conf
├── COPYING
├── Config.cs
├── Decks
├── AI_ABC.ydk
├── AI_Altergeist.ydk
├── AI_Blackwing.ydk
├── AI_BlueEyes.ydk
├── AI_BlueEyesMaxDragon.ydk
├── AI_Brave.ydk
├── AI_Burn.ydk
├── AI_ChainBurn.ydk
├── AI_CyberDragon.ydk
├── AI_DarkMagician.ydk
├── AI_Dogmatika.ydk
├── AI_Dragun.ydk
├── AI_Dragunity.ydk
├── AI_Evilswarm.ydk
├── AI_FamiliarPossessed.ydk
├── AI_Frog.ydk
├── AI_Gravekeeper.ydk
├── AI_Graydle.ydk
├── AI_GrenMajuThunderBoarder.ydk
├── AI_Horus.ydk
├── AI_Kashtira.ydk
├── AI_Level8.ydk
├── AI_Lightsworn.ydk
├── AI_LightswornShaddoldinosour.ydk
├── AI_Mathmech.ydk
├── AI_MokeyMokey.ydk
├── AI_MokeyMokeyKing.ydk
├── AI_Nekroz.ydk
├── AI_OldSchool.ydk
├── AI_Orcust.ydk
├── AI_Phantasm.ydk
├── AI_PureWinds.ydk
├── AI_Qliphort.ydk
├── AI_Rainbow.ydk
├── AI_Rank5.ydk
├── AI_ST1732.ydk
├── AI_Salamangreat.ydk
├── AI_SkyStriker.ydk
├── AI_Swordsoul.ydk
├── AI_Tearlaments.ydk
├── AI_ThunderDragon.ydk
├── AI_Timethief.ydk
├── AI_ToadallyAwesome.ydk
├── AI_Trickstar.ydk
├── AI_Witchcraft.ydk
├── AI_Yosenju.ydk
├── AI_ZexalWeapons.ydk
├── AI_Zoodiac.ydk
├── AI_[HealingJAM].ydk
└── AI_[ImaginaryArk].ydk
├── Dialogs
├── BA.zh-TW.json
├── VI-1911.zh-CN.json
├── Zefra.zh-CN.json
├── anothercopy.zh-CN.json
├── cirno.zh-CN.json
├── copy.zh-CN.json
├── default.json
├── gugugu.zh-CN.json
├── kiwi.zh-TW.json
├── mokey.zh-CN.json
├── near.zh-CN.json
├── smart.zh-CN.json
├── soul.zh-CN.json
├── swordsman.zh-CN.json
├── verre.zh-CN.json
└── zh-CN.json
├── Dockerfile
├── ExecutorBase
├── ExecutorBase.csproj
├── Game
│ ├── AI
│ │ ├── AIUtil.cs
│ │ ├── CardContainer.cs
│ │ ├── CardExecutor.cs
│ │ ├── CardExtension.cs
│ │ ├── CardSelector.cs
│ │ ├── DeckAttribute.cs
│ │ ├── DefaultExecutor.cs
│ │ ├── Enums
│ │ │ ├── DangerousMonster.cs
│ │ │ ├── Floodgate.cs
│ │ │ ├── FusionSpell.cs
│ │ │ ├── InvincibleMonster.cs
│ │ │ ├── OneForXyz.cs
│ │ │ ├── PreventActivationEffectInBattle.cs
│ │ │ ├── ShouldBeDisabledBeforeItUseEffectMonster.cs
│ │ │ ├── ShouldNotBeMonsterTarget.cs
│ │ │ ├── ShouldNotBeSpellTarget.cs
│ │ │ └── ShouldNotBeTarget.cs
│ │ ├── Executor.cs
│ │ ├── ExecutorType.cs
│ │ ├── HintMsg.cs
│ │ ├── Opcodes.cs
│ │ └── Zones.cs
│ ├── BattlePhase.cs
│ ├── BattlePhaseAction.cs
│ ├── ClientCard.cs
│ ├── ClientField.cs
│ ├── Dialogs.cs
│ ├── Duel.cs
│ ├── GameAI.cs
│ ├── MainPhase.cs
│ └── MainPhaseAction.cs
├── Properties
│ └── AssemblyInfo.cs
├── YGOSharp.OCGWrapper.Enums
│ ├── CardAttribute.cs
│ ├── CardLinkMarker.cs
│ ├── CardLocation.cs
│ ├── CardPosition.cs
│ ├── CardRace.cs
│ ├── CardType.cs
│ ├── DuelPhase.cs
│ ├── GameMessage.cs
│ └── Query.cs
└── YGOSharp.OCGWrapper
│ ├── Card.cs
│ ├── CardsManager.cs
│ ├── NamedCard.cs
│ └── NamedCardsManager.cs
├── Game
├── AI
│ ├── Deck.cs
│ └── Decks
│ │ ├── ABCExecutor.cs
│ │ ├── AltergeistExecutor.cs
│ │ ├── BlackwingExecutor.cs
│ │ ├── BlueEyesExecutor.cs
│ │ ├── BlueEyesMaxDragonExecutor.cs
│ │ ├── BraveExecutor.cs
│ │ ├── BurnExecutor.cs
│ │ ├── ChainBurnExecutor.cs
│ │ ├── CyberDragonExecutor.cs
│ │ ├── DarkMagicianExecutor.cs
│ │ ├── DoEveryThingExecutor.cs
│ │ ├── DragmaExecutor.cs
│ │ ├── DragunExecutor.cs
│ │ ├── DragunityExecutor.cs
│ │ ├── EvilswarmExecutor.cs
│ │ ├── FamiliarPossessedExecutor.cs
│ │ ├── FrogExecutor.cs
│ │ ├── GravekeeperExecutor.cs
│ │ ├── GraydleExecutor.cs
│ │ ├── GrenMajuThunderBoarderExecutor.cs
│ │ ├── HorusExecutor.cs
│ │ ├── KashtiraExecutor.cs
│ │ ├── Level8Executor.cs
│ │ ├── LightswornExecutor.cs
│ │ ├── LightswornShaddoldinosourExecutor.cs
│ │ ├── LuckyExecutor.cs
│ │ ├── MathMechExecutor.cs
│ │ ├── MokeyMokeyExecutor.cs
│ │ ├── MokeyMokeyKingExecutor.cs
│ │ ├── NekrozExecutor.cs
│ │ ├── OldSchoolExecutor.cs
│ │ ├── OrcustExecutor.cs
│ │ ├── PhantasmExecutor.cs
│ │ ├── PureWindsExecutor.cs
│ │ ├── QliphortExecutor.cs
│ │ ├── RainbowExecutor.cs
│ │ ├── Rank5Executor.cs
│ │ ├── ST1732Executor.cs
│ │ ├── SalamangreatExecutor.cs
│ │ ├── SkyStrikerExecutor.cs
│ │ ├── SwordsoulExecutor.cs
│ │ ├── TearlamentsExecutor.cs
│ │ ├── ThunderDragonExecutor.cs
│ │ ├── TimeThiefExecutor.cs
│ │ ├── ToadallyAwesomeExecutor.cs
│ │ ├── TrickstarExecutor.cs
│ │ ├── WitchcraftExecutor.cs
│ │ ├── YosenjuExecutor.cs
│ │ ├── ZexalWeaponsExecutor.cs
│ │ ├── ZoodiacExecutor.cs
│ │ ├── [HealingJAMExecutor].cs
│ │ └── [ImaginaryArkExecutor].cs
├── DecksManager.cs
├── GameBehavior.cs
├── GameClient.cs
├── GamePacketFactory.cs
└── Room.cs
├── LICENSE
├── Logger.cs
├── Mono.Data.Sqlite.dll
├── Program.cs
├── Properties
├── AssemblyInfo.cs
└── AssemblyInfoLib.cs
├── README-old.md
├── README.md
├── SampleExecutor.sln
├── SampleExecutor
├── SampleExecutor.cs
└── SampleExecutor.csproj
├── WindBot.cs
├── WindBot.csproj
├── WindBot.ico
├── WindBot.sln
├── WindBotInfo.cs
├── YGOSharp.Network
├── AsyncBinaryClient.cs
├── AsyncNetworkServer.cs
├── AsyncYGOClient.cs
├── BinaryClient.cs
├── Enums
│ ├── CtosMessage.cs
│ ├── GameState.cs
│ ├── PlayerChange.cs
│ ├── PlayerState.cs
│ ├── PlayerType.cs
│ └── StocMessage.cs
├── NetworkClient.cs
├── NetworkServer.cs
├── Utils
│ └── BinaryExtensions.cs
└── YGOClient.cs
├── appveyor.yml
├── bots.json
├── ci
├── deploy.sh
└── install-sdk-ndk.sh
├── libWindbot.csproj
└── sqlite3.dll
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | end_of_line = lf
5 | charset = utf-8
6 | trim_trailing_whitespace = true
7 | insert_final_newline = true
8 | indent_style = space
9 | indent_size = 4
10 |
11 | [*.yml]
12 | indent_size = 2
13 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
2 |
--------------------------------------------------------------------------------
/.github/workflows/windbot.yml:
--------------------------------------------------------------------------------
1 | name: Build EDOPro
2 | on: [push, pull_request]
3 | env:
4 | DEPLOY_REPO: ${{ secrets.DEPLOY_REPO }}
5 | DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
6 | DEPLOY_BRANCH: ${{ secrets.DEPLOY_BRANCH }}
7 | jobs:
8 | create_release:
9 | runs-on: ubuntu-latest
10 | outputs:
11 | output: ${{steps.create.outputs.id}}
12 | steps:
13 | - name: Create release
14 | if: startsWith(github.ref, 'refs/tags/')
15 | id: create
16 | uses: actions/create-release@v1
17 | env:
18 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
19 | with:
20 | tag_name: ${{ github.ref }}
21 | release_name: ${{ github.ref }}
22 | draft: true
23 | prerelease: false
24 | Desktop:
25 | runs-on: windows-2019
26 | needs: create_release
27 | env:
28 | TRAVIS_OS_NAME: windows
29 | steps:
30 | - name: Set ARTIFACT env var
31 | shell: bash
32 | run: |
33 | echo "ARTIFACT=WindBotIgnite-Release-$(date +%Y%m%d)-${{ github.sha }}.zip" >> $GITHUB_ENV
34 | - name: Add msbuild to PATH
35 | uses: microsoft/setup-msbuild@v2
36 | - uses: actions/checkout@v1
37 | with:
38 | fetch-depth: 1
39 | submodules: true
40 | - name: Build
41 | shell: bash
42 | run: |
43 | dotnet build WindBot.csproj --configuration=Release
44 | - name: Predeploy
45 | shell: bash
46 | run: |
47 | cd bin && mv Release WindBot
48 | 7z a -tzip "$ARTIFACT" WindBot
49 | mv $ARTIFACT .. && cd ..
50 | mkdir -p assets
51 | cp $ARTIFACT assets
52 | cp Dialogs/default.json .
53 | - name: Deploy
54 | if: ${{ github.event_name == 'push' }}
55 | shell: bash
56 | run: ./ci/deploy.sh
57 | - name: Upload Release Assets
58 | if: startsWith(github.ref, 'refs/tags/')
59 | id: upload-release-assets
60 | uses: dwenegar/upload-release-assets@v1
61 | env:
62 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
63 | with:
64 | release_id: ${{ needs.create_release.outputs.output }}
65 | assets_path: assets
66 |
67 | Android:
68 | runs-on: windows-2019
69 | needs: create_release
70 | env:
71 | TRAVIS_OS_NAME: android
72 | steps:
73 | - name: Set ARTIFACT env var
74 | shell: bash
75 | run: |
76 | echo "ARTIFACT=WindBotIgnite-Release-$(date +%Y%m%d)-${{ github.sha }}.zip" >> $GITHUB_ENV
77 | - name: Add msbuild to PATH
78 | uses: microsoft/setup-msbuild@v1.0.2
79 | - uses: actions/checkout@v1
80 | with:
81 | fetch-depth: 1
82 | submodules: true
83 | # Unspecified dependency for Embeddinator; 64-bit does not work
84 | - name: Install mono
85 | shell: bash
86 | run: |
87 | choco install mono --x86 --ignore-checksums
88 | - name: Install SDK 24, SDK 25 and NDK 15
89 | shell: bash
90 | env:
91 | VS_PREFIX: "16.0_"
92 | run: |
93 | ./ci/install-sdk-ndk.sh
94 | - name: Build
95 | shell: bash
96 | run: |
97 | msbuild.exe -t:restore WindBot.sln
98 | msbuild.exe -m -p:Configuration=Release WindBot.sln
99 | - name: Predeploy
100 | shell: bash
101 | run: |
102 | cd bin && mkdir -p WindBot
103 | cp -r Release/COPYING Release/LICENSE Release/bots.json Release/Decks/ Release/Dialogs/ WindBot/
104 | 7z a WindBotIgnite-Resources.7z WindBot && cd ..
105 | mkdir -p assets
106 | mv output/libWindbot.aar bin/WindBotIgnite-Resources.7z assets
107 | - name: Upload Release Assets
108 | if: startsWith(github.ref, 'refs/tags/')
109 | id: upload-release-assets
110 | uses: dwenegar/upload-release-assets@v1
111 | env:
112 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
113 | with:
114 | release_id: ${{ needs.create_release.outputs.output }}
115 | assets_path: assets
116 |
117 |
118 | # assets to upload android
119 | # - $ARTIFACT
120 | # - libWindbot.aar
121 | # - WindBotIgnite-Resources.7z
122 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.sln.docstates
8 | .vs/
9 |
10 | # Build results
11 |
12 | [Dd]ebug/
13 | [Rr]elease/
14 | x64/
15 | build/
16 | [Bb]in/
17 | [Oo]bj/
18 | output/
19 |
20 | # Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
21 | !packages/*/build/
22 |
23 | # MSTest test Results
24 | [Tt]est[Rr]esult*/
25 | [Bb]uild[Ll]og.*
26 |
27 | *_i.c
28 | *_p.c
29 | *.ilk
30 | *.meta
31 | *.obj
32 | *.pch
33 | *.pdb
34 | *.pgc
35 | *.pgd
36 | *.rsp
37 | *.sbr
38 | *.tlb
39 | *.tli
40 | *.tlh
41 | *.tmp
42 | *.tmp_proj
43 | *.log
44 | *.vspscc
45 | *.vssscc
46 | .builds
47 | *.pidb
48 | *.log
49 | *.scc
50 |
51 | # Visual C++ cache files
52 | ipch/
53 | *.aps
54 | *.ncb
55 | *.opensdf
56 | *.sdf
57 | *.cachefile
58 |
59 | # Visual Studio profiler
60 | *.psess
61 | *.vsp
62 | *.vspx
63 |
64 | # Guidance Automation Toolkit
65 | *.gpState
66 |
67 | # ReSharper is a .NET coding add-in
68 | _ReSharper*/
69 | *.[Rr]e[Ss]harper
70 |
71 | # TeamCity is a build add-in
72 | _TeamCity*
73 |
74 | # DotCover is a Code Coverage Tool
75 | *.dotCover
76 |
77 | # NCrunch
78 | *.ncrunch*
79 | .*crunch*.local.xml
80 |
81 | # Installshield output folder
82 | [Ee]xpress/
83 |
84 | # DocProject is a documentation generator add-in
85 | DocProject/buildhelp/
86 | DocProject/Help/*.HxT
87 | DocProject/Help/*.HxC
88 | DocProject/Help/*.hhc
89 | DocProject/Help/*.hhk
90 | DocProject/Help/*.hhp
91 | DocProject/Help/Html2
92 | DocProject/Help/html
93 |
94 | # Click-Once directory
95 | publish/
96 |
97 | # Publish Web Output
98 | *.Publish.xml
99 |
100 | # NuGet Packages Directory
101 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line
102 | #packages/
103 |
104 | # Windows Azure Build Output
105 | csx
106 | *.build.csdef
107 |
108 | # Windows Store app package directory
109 | AppPackages/
110 |
111 | # Others
112 | sql/
113 | *.Cache
114 | ClientBin/
115 | [Ss]tyle[Cc]op.*
116 | ~$*
117 | *~
118 | *.dbmdl
119 | *.[Pp]ublish.xml
120 | *.pfx
121 | *.publishsettings
122 |
123 | # RIA/Silverlight projects
124 | Generated_Code/
125 |
126 | # Backup & report files from converting an old project file to a newer
127 | # Visual Studio version. Backup files are not needed, because we have git ;-)
128 | _UpgradeReport_Files/
129 | Backup*/
130 | UpgradeLog*.XML
131 | UpgradeLog*.htm
132 |
133 | # SQL Server files
134 | App_Data/*.mdf
135 | App_Data/*.ldf
136 |
137 |
138 | #LightSwitch generated files
139 | GeneratedArtifacts/
140 | _Pvt_Extensions/
141 | ModelManifest.xml
142 |
143 | # =========================
144 | # Windows detritus
145 | # =========================
146 |
147 | # Windows image file caches
148 | Thumbs.db
149 | ehthumbs.db
150 |
151 | # Folder config file
152 | Desktop.ini
153 |
154 | # Recycle Bin used on file shares
155 | $RECYCLE.BIN/
156 |
157 | # Mac desktop service store files
158 | .DS_Store
159 |
160 |
--------------------------------------------------------------------------------
/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/BotWrapper/BotWrapper.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Collections.Generic;
4 | using System.Text;
5 | using System.Text.RegularExpressions;
6 | using System.Diagnostics;
7 | using System.Runtime.InteropServices;
8 | using System.Linq;
9 |
10 | namespace BotWrapper
11 | {
12 | class BotWrapper
13 | {
14 | [DllImport("User32.dll", CharSet = CharSet.Unicode)]
15 | public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, int uType);
16 |
17 | const int MB_ICONERROR = 0x00000010;
18 |
19 | static void Main(string[] args)
20 | {
21 | ProcessStartInfo startInfo = new ProcessStartInfo();
22 | startInfo.UseShellExecute = false;
23 | startInfo.WorkingDirectory = Path.GetFullPath("WindBot");
24 | startInfo.FileName = startInfo.WorkingDirectory + "\\WindBot.exe";
25 |
26 | if (args.Length == 3)
27 | {
28 | startInfo.CreateNoWindow = true;
29 | startInfo.WindowStyle = ProcessWindowStyle.Hidden;
30 |
31 | string arg = args[0];
32 | Match match = Regex.Match(arg, "Random=(.*)");
33 | if (match.Success)
34 | {
35 | string randomFlag = match.Groups[1].Value;
36 | ReadBots();
37 | arg = GetRandomBot(randomFlag);
38 | if (arg == "")
39 | {
40 | MessageBox((IntPtr)0, "Can't find random bot with this flag!\n\nA totally random bot will appear instead.", "WindBot", MB_ICONERROR);
41 | }
42 | }
43 | arg = arg.Replace("'", "\"");
44 | if (int.Parse(args[1]) == 1)
45 | {
46 | arg += " Hand=1";
47 | }
48 | arg += " Port=" + args[2];
49 | startInfo.Arguments = arg;
50 | }
51 |
52 | try
53 | {
54 | Process.Start(startInfo);
55 | }
56 | catch
57 | {
58 | MessageBox((IntPtr)0, "WindBot can't be started!", "WindBot", MB_ICONERROR);
59 | }
60 | }
61 |
62 | public class BotInfo
63 | {
64 | public string name;
65 | public string command;
66 | public string desc;
67 | public string[] flags;
68 | }
69 |
70 | static public IList Bots = new List();
71 |
72 | static void ReadBots()
73 | {
74 | using (StreamReader reader = new StreamReader("bot.conf"))
75 | {
76 | while (!reader.EndOfStream)
77 | {
78 | string line = reader.ReadLine().Trim();
79 | if (line.Length > 0 && line[0] == '!')
80 | {
81 | BotInfo newBot = new BotInfo();
82 | newBot.name = line;
83 | newBot.command = reader.ReadLine().Trim();
84 | newBot.desc = reader.ReadLine().Trim();
85 | line = reader.ReadLine().Trim();
86 | newBot.flags = line.Split(' ');
87 | Bots.Add(newBot);
88 | }
89 | }
90 | }
91 | }
92 |
93 | static string GetRandomBot(string flag)
94 | {
95 | IList foundBots = Bots.Where(bot => bot.flags.Contains(flag)).ToList();
96 | if (foundBots.Count > 0)
97 | {
98 | Random rand = new Random();
99 | BotInfo bot = foundBots[rand.Next(foundBots.Count)];
100 | return bot.command;
101 | }
102 | return "";
103 | }
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/BotWrapper/BotWrapper.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {0665CA3B-C14F-40EC-ABFB-AD46A695F5A3}
8 | WinExe
9 | Properties
10 | BotWrapper
11 | Bot
12 | v4.0
13 | 512
14 |
15 |
16 |
17 | x86
18 | true
19 | full
20 | false
21 | bin\Debug\
22 | DEBUG;TRACE
23 | prompt
24 | 4
25 |
26 |
27 | x86
28 | pdbonly
29 | true
30 | bin\Release\
31 | TRACE
32 | prompt
33 | 4
34 |
35 |
36 | BotWrapper.BotWrapper
37 |
38 |
39 | WindBot.ico
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | PreserveNewest
54 |
55 |
56 |
57 |
58 |
59 |
60 |
67 |
--------------------------------------------------------------------------------
/BotWrapper/BotWrapper.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | cd windbot
4 |
5 | if [ "$#" -ne 3 ]; then
6 | mono WindBot.exe
7 | else
8 | command=$1
9 | flag=$2
10 | port=$3
11 | arg="${command//\'/\"}" # replace ' to "
12 | if [ "$flag" -eq 1 ]; then arg=$arg" Hand=1"; fi
13 | arg=$arg" Port="$port
14 | eval "mono WindBot.exe "$arg
15 | fi
16 |
--------------------------------------------------------------------------------
/BotWrapper/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // 有关程序集的一般信息由以下
6 | // 控制。更改这些特性值可修改
7 | // 与程序集关联的信息。
8 | [assembly: AssemblyTitle("BotWrapper")]
9 | [assembly: AssemblyDescription("The Bot.exe wrapper of WindBot.")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("IceYGO")]
12 | [assembly: AssemblyProduct("WindBot")]
13 | [assembly: AssemblyCopyright("Copyright © IceYGO 2017")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | //将 ComVisible 设置为 false 将使此程序集中的类型
18 | //对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
19 | //请将此类型的 ComVisible 特性设置为 true。
20 | [assembly: ComVisible(false)]
21 |
22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
23 | [assembly: Guid("0665ca3b-c14f-40ec-abfb-ad46a695f5a3")]
24 |
25 | // 程序集的版本信息由下列四个值组成:
26 | //
27 | // 主版本
28 | // 次版本
29 | // 生成号
30 | // 修订号
31 | //
32 | //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
33 | // 方法是按如下所示使用“*”: :
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/BotWrapper/WindBot.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProjectIgnis/windbot/5d6d66e68ac1408cefa5473a82e97f904152425b/BotWrapper/WindBot.ico
--------------------------------------------------------------------------------
/BotWrapper/app.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Config.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 |
5 | namespace WindBot
6 | {
7 | public static class Config
8 | {
9 | private static string CONFIG_FILE_OPTION = "Config";
10 | private static char SEPARATOR_CHAR = '=';
11 | private static char COMMENT_CHAR = '#';
12 |
13 | private static Dictionary _fields;
14 | private static Dictionary _integerCache;
15 | private static Dictionary _booleanCache;
16 |
17 | public static void Load(string[] args)
18 | {
19 | _integerCache = new Dictionary();
20 | _booleanCache = new Dictionary();
21 |
22 | _fields = LoadArgs(args);
23 |
24 | string filename = GetString(CONFIG_FILE_OPTION);
25 | if (filename != null)
26 | {
27 | Dictionary fileFields = LoadFile(filename);
28 | foreach (var pair in fileFields)
29 | {
30 | if (!_fields.ContainsKey(pair.Key))
31 | _fields.Add(pair.Key, pair.Value);
32 | }
33 | }
34 | }
35 |
36 | private static Dictionary LoadArgs(string[] args)
37 | {
38 | Dictionary fields = new Dictionary();
39 | for (int i = 0; i < args.Length; ++i)
40 | {
41 | string option = args[i];
42 |
43 | int position = option.IndexOf(SEPARATOR_CHAR);
44 |
45 | if (position == -1)
46 | throw new Exception("Invalid argument '" + option + "': no key/value separator");
47 |
48 | string key = option.Substring(0, position).Trim().ToUpper();
49 | string value = option.Substring(position + 1).Trim();
50 |
51 | if (fields.ContainsKey(key))
52 | throw new Exception("Invalid argument '" + option + "': duplicate key '" + key + "'");
53 |
54 | fields.Add(key, value);
55 | }
56 | return fields;
57 | }
58 |
59 | private static Dictionary LoadFile(string filename)
60 | {
61 | Dictionary fields = new Dictionary();
62 | using (StreamReader reader = new StreamReader(filename))
63 | {
64 | int lineNumber = 0;
65 | while (!reader.EndOfStream)
66 | {
67 | string line = reader.ReadLine().Trim();
68 | ++lineNumber;
69 |
70 | // Ignore empty lines and comments
71 | if (line.Length == 0 || line[0] == COMMENT_CHAR)
72 | continue;
73 |
74 | int position = line.IndexOf(SEPARATOR_CHAR);
75 |
76 | if (position == -1)
77 | throw new Exception("Invalid configuration file: no key/value separator line " + lineNumber);
78 |
79 | string key = line.Substring(0, position).Trim().ToUpper();
80 | string value = line.Substring(position + 1).Trim();
81 |
82 | if (fields.ContainsKey(key))
83 | throw new Exception("Invalid configuration file: duplicate key '" + key + "' line " + lineNumber);
84 |
85 | fields.Add(key, value);
86 | }
87 | }
88 | return fields;
89 | }
90 |
91 | public static string GetString(string key, string defaultValue = null)
92 | {
93 | key = key.ToUpper();
94 | if (_fields.ContainsKey(key))
95 | return _fields[key];
96 | return defaultValue;
97 | }
98 |
99 | public static int GetInt(string key, int defaultValue = 0)
100 | {
101 | key = key.ToUpper();
102 |
103 | // Use a cache to prevent doing the string to int conversion over and over
104 | if (_integerCache.ContainsKey(key))
105 | return _integerCache[key];
106 |
107 | int value = defaultValue;
108 | if (_fields.ContainsKey(key))
109 | {
110 | if (_fields[key].StartsWith("0x"))
111 | value = Convert.ToInt32(_fields[key], 16);
112 | else
113 | value = Convert.ToInt32(_fields[key]);
114 | }
115 | _integerCache.Add(key, value);
116 | return value;
117 | }
118 |
119 | public static uint GetUInt(string key, uint defaultValue = 0)
120 | {
121 | return (uint)GetInt(key, (int)defaultValue);
122 | }
123 |
124 | public static bool GetBool(string key, bool defaultValue = false)
125 | {
126 | key = key.ToUpper();
127 |
128 | // Same here, prevent from redoing the string to bool conversion
129 | if (_booleanCache.ContainsKey(key))
130 | return _booleanCache[key];
131 |
132 | bool value = defaultValue;
133 | if (_fields.ContainsKey(key))
134 | {
135 | value = Convert.ToBoolean(_fields[key]);
136 | }
137 | _booleanCache.Add(key, value);
138 | return value;
139 | }
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/Decks/AI_ABC.ydk:
--------------------------------------------------------------------------------
1 | #created by FlameFlash
2 | #main
3 | 99249638
4 | 99249638
5 | 46659709
6 | 46659709
7 | 46659709
8 | 65367484
9 | 65367484
10 | 65367484
11 | 43147039
12 | 89132148
13 | 30012506
14 | 30012506
15 | 30012506
16 | 77411244
17 | 77411244
18 | 77411244
19 | 3405259
20 | 3405259
21 | 3405259
22 | 39890958
23 | 14558128
24 | 32807846
25 | 73628505
26 | 73628505
27 | 73628505
28 | 12524259
29 | 12524259
30 | 12524259
31 | 24224830
32 | 24224830
33 | 24224830
34 | 65681983
35 | 65681983
36 | 65681983
37 | 66399653
38 | 66399653
39 | 66399653
40 | 10045474
41 | 10045474
42 | 10045474
43 | #extra
44 | 1561110
45 | 1561110
46 | 1561110
47 | 75286621
48 | 10443957
49 | 10443957
50 | 58069384
51 | 58069384
52 | 21887175
53 | 4280258
54 | 38342335
55 | 2857636
56 | 75452921
57 | 83152482
58 | 65741786
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Altergeist.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 52927340
4 | 53143898
5 | 53143898
6 | 53143898
7 | 42790071
8 | 42790071
9 | 14558127
10 | 14558127
11 | 89538537
12 | 89538537
13 | 23434538
14 | 23434538
15 | 23434538
16 | 25533642
17 | 25533642
18 | 25533642
19 | 2295440
20 | 18144506
21 | 35261759
22 | 49238328
23 | 49238328
24 | 68462976
25 | 68462976
26 | 10045474
27 | 10045474
28 | 10045474
29 | 10813327
30 | 23924608
31 | 35146019
32 | 35146019
33 | 27541563
34 | 27541563
35 | 53936268
36 | 53936268
37 | 53936268
38 | 61740673
39 | 40605147
40 | 40605147
41 | 41420027
42 | 41420027
43 | #extra
44 | 99916754
45 | 86221741
46 | 85289965
47 | 85289965
48 | 49725936
49 | 49725936
50 | 1508649
51 | 1508649
52 | 1508649
53 | 50588353
54 | 41999284
55 | 41999284
56 | 41999284
57 | 94259633
58 | 94259633
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Blackwing.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 75498415
4 | 75498415
5 | 75498415
6 | 81105204
7 | 81105204
8 | 81105204
9 | 58820853
10 | 58820853
11 | 58820853
12 | 49003716
13 | 49003716
14 | 49003716
15 | 85215458
16 | 85215458
17 | 85215458
18 | 2009101
19 | 2009101
20 | 2009101
21 | 22835145
22 | 22835145
23 | 22835145
24 | 46710683
25 | 46710683
26 | 46710683
27 | 53129443
28 | 5318639
29 | 5318639
30 | 5318639
31 | 91351370
32 | 91351370
33 | 91351370
34 | 44095762
35 | 44095762
36 | 44095762
37 | 59839761
38 | 59839761
39 | 59839761
40 | 70342110
41 | 70342110
42 | 70342110
43 | #extra
44 | 33236860
45 | 33236860
46 | 33236860
47 | 9012916
48 | 9012916
49 | 9012916
50 | 69031175
51 | 69031175
52 | 69031175
53 | 76913983
54 | 76913983
55 | 76913983
56 | 17377751
57 | 17377751
58 | 17377751
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_BlueEyes.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 89631139
4 | 89631139
5 | 89631139
6 | 38517737
7 | 38517737
8 | 38517737
9 | 45467446
10 | 45467446
11 | 71039903
12 | 71039903
13 | 71039903
14 | 79814787
15 | 79814787
16 | 8240199
17 | 8240199
18 | 8240199
19 | 5133471
20 | 5133471
21 | 6853254
22 | 6853254
23 | 6853254
24 | 18144506
25 | 35261759
26 | 35261759
27 | 38120068
28 | 38120068
29 | 38120068
30 | 39701395
31 | 39701395
32 | 39701395
33 | 41620959
34 | 41620959
35 | 48800175
36 | 48800175
37 | 48800175
38 | 54447022
39 | 83764718
40 | 87025064
41 | 87025064
42 | 87025064
43 | #extra
44 | 63422098
45 | 40908371
46 | 40908371
47 | 40908371
48 | 59822133
49 | 59822133
50 | 59822133
51 | 58820923
52 | 2530830
53 | 39030163
54 | 31801517
55 | 18963306
56 | 63767246
57 | 63767246
58 | 33909817
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_BlueEyesMaxDragon.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 89631139
4 | 55410871
5 | 89631139
6 | 80701178
7 | 31036355
8 | 38517737
9 | 80701178
10 | 80701178
11 | 95492061
12 | 95492061
13 | 95492061
14 | 53303460
15 | 53303460
16 | 53303460
17 | 14558127
18 | 14558127
19 | 23434538
20 | 55410871
21 | 55410871
22 | 31036355
23 | 31036355
24 | 48800175
25 | 48800175
26 | 48800175
27 | 70368879
28 | 70368879
29 | 70368879
30 | 21082832
31 | 46052429
32 | 46052429
33 | 46052429
34 | 24224830
35 | 24224830
36 | 24224830
37 | 73915051
38 | 10045474
39 | 10045474
40 | 37576645
41 | 37576645
42 | 37576645
43 | #extra
44 | 31833038
45 | 85289965
46 | 74997493
47 | 5043010
48 | 65330383
49 | 38342335
50 | 2857636
51 | 28776350
52 | 75452921
53 | 3987233
54 | 3987233
55 | 99111753
56 | 98978921
57 | 41999284
58 | 41999284
59 | !side
60 | 75732622
61 | 15397015
62 | 15397015
63 | 73642296
64 | 23434538
65 | 5821478
66 | 77058170
67 | 3679218
68 | 25774450
69 | 43898403
70 | 23002292
71 | 23002292
72 | 84749824
73 | 84749824
74 |
--------------------------------------------------------------------------------
/Decks/AI_Brave.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 2563463
4 | 81866673
5 | 72090076
6 | 63362460
7 | 30680659
8 | 30680659
9 | 30680659
10 | 26202165
11 | 26202165
12 | 26202165
13 | 91646304
14 | 14558127
15 | 14558127
16 | 14558127
17 | 72291078
18 | 72291078
19 | 23434538
20 | 23434538
21 | 9742784
22 | 97268402
23 | 3285551
24 | 3285551
25 | 3285551
26 | 18144506
27 | 52947044
28 | 52947044
29 | 52947044
30 | 81439173
31 | 83764718
32 | 24224830
33 | 24224830
34 | 65681983
35 | 65681983
36 | 39568067
37 | 38745520
38 | 10045474
39 | 10045474
40 | 10045474
41 | 40605147
42 | 40605147
43 | #extra
44 | 15291624
45 | 60461804
46 | 84815190
47 | 92519087
48 | 27548199
49 | 42566602
50 | 90953320
51 | 98558751
52 | 21915012
53 | 44097050
54 | 50588353
55 | 70369116
56 | 98978921
57 | 98978921
58 | 60303245
59 | !side
60 | 55063751
61 | 55063751
62 | 55063751
63 | 34267821
64 | 34267821
65 | 34267821
66 | 43534808
67 | 43534808
68 | 43534808
69 | 94145021
70 | 94145021
71 | 94145021
72 | 14532163
73 | 14532163
74 | 14532163
75 |
--------------------------------------------------------------------------------
/Decks/AI_Burn.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 102380
4 | 102380
5 | 102380
6 | 2851070
7 | 2851070
8 | 97396380
9 | 97396380
10 | 97396380
11 | 26302522
12 | 26302522
13 | 26302522
14 | 31305911
15 | 31305911
16 | 31305911
17 | 23205979
18 | 23205979
19 | 23205979
20 | 44789585
21 | 44789585
22 | 44789585
23 | 20264508
24 | 20264508
25 | 46918794
26 | 46918794
27 | 46918794
28 | 72302403
29 | 72302403
30 | 72302403
31 | 79323590
32 | 79323590
33 | 85562745
34 | 85562745
35 | 29843091
36 | 36468556
37 | 62279055
38 | 62279055
39 | 62279055
40 | 98139712
41 | 98139712
42 | 98139712
43 | #extra
44 | !side
45 |
--------------------------------------------------------------------------------
/Decks/AI_ChainBurn.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 33015627
4 | 33015627
5 | 33015627
6 | 7733560
7 | 7733560
8 | 7733560
9 | 41386308
10 | 3549275
11 | 45812361
12 | 45812361
13 | 45812361
14 | 19665973
15 | 19665973
16 | 19665973
17 | 60990740
18 | 60990740
19 | 60990740
20 | 35261759
21 | 35261759
22 | 59750328
23 | 59750328
24 | 98645731
25 | 98645731
26 | 98645731
27 | 91623717
28 | 91623717
29 | 12607053
30 | 12607053
31 | 18252559
32 | 18252559
33 | 18252559
34 | 24068492
35 | 24068492
36 | 24068492
37 | 27053506
38 | 27053506
39 | 27053506
40 | 29843091
41 | 29843091
42 | 29843091
43 | 36361633
44 | 36361633
45 | 36361633
46 | 37576645
47 | 37576645
48 | 37576645
49 | 62279055
50 | 62279055
51 | 62279055
52 | 67443336
53 | 67443336
54 | 67443336
55 | 75249652
56 | 75249652
57 | 75249652
58 | 83555666
59 | #extra
60 | 41999284
61 | 41999284
62 | 41999284
63 | !side
64 | 33508719
65 | 36468556
66 | 67095270
67 | 67095270
68 | 67095270
69 | 98444741
70 | 98444741
71 | 98444741
72 |
--------------------------------------------------------------------------------
/Decks/AI_CyberDragon.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 4162088
4 | 68774379
5 | 70095154
6 | 70095154
7 | 70095154
8 | 59281922
9 | 59281922
10 | 59281922
11 | 3370104
12 | 67159705
13 | 26439287
14 | 26439287
15 | 26439287
16 | 76986005
17 | 23893227
18 | 23893227
19 | 23893227
20 | 3657444
21 | 11961740
22 | 11961740
23 | 24094653
24 | 24094653
25 | 37630732
26 | 37630732
27 | 37630732
28 | 52875873
29 | 52875873
30 | 53129443
31 | 66607691
32 | 95286165
33 | 29401950
34 | 29401950
35 | 44095762
36 | 44095762
37 | 91989718
38 | 92773018
39 | 92773018
40 | 97077563
41 | 97077563
42 | 3819470
43 | #extra
44 | 1546123
45 | 1546123
46 | 1546123
47 | 74157028
48 | 74157028
49 | 74157028
50 | 10443957
51 | 10443957
52 | 10443957
53 | 58069384
54 | 58069384
55 | 58069384
56 | !side
57 |
--------------------------------------------------------------------------------
/Decks/AI_DarkMagician.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 46986414
4 | 46986414
5 | 46986414
6 | 30603688
7 | 30603688
8 | 30603688
9 | 71007216
10 | 71007216
11 | 7084129
12 | 7084129
13 | 7084129
14 | 43722862
15 | 43722862
16 | 14558127
17 | 14558127
18 | 14824019
19 | 23434538
20 | 70117860
21 | 1784686
22 | 1784686
23 | 2314238
24 | 23314220
25 | 70368879
26 | 70368879
27 | 89739383
28 | 41735184
29 | 73616671
30 | 47222536
31 | 47222536
32 | 47222536
33 | 67775894
34 | 67775894
35 | 7922915
36 | 7922915
37 | 7922915
38 | 48680970
39 | 48680970
40 | 48680970
41 | 40605147
42 | 40605147
43 | #extra
44 | 41721210
45 | 41721210
46 | 50954680
47 | 58074177
48 | 90036274
49 | 14577226
50 | 16691074
51 | 22110647
52 | 80117527
53 | 71384012
54 | 71384012
55 | 71384012
56 | 1482001
57 | !side
58 |
--------------------------------------------------------------------------------
/Decks/AI_Dogmatika.ydk:
--------------------------------------------------------------------------------
1 | #created by AlphaKretin
2 | #main
3 | 69680031
4 | 95679145
5 | 3717252
6 | 60303688
7 | 60303688
8 | 60303688
9 | 86120751
10 | 86120751
11 | 86120751
12 | 14558127
13 | 14558127
14 | 14558127
15 | 1984618
16 | 1984618
17 | 1984618
18 | 25311006
19 | 25311006
20 | 25311006
21 | 73628505
22 | 74063034
23 | 74063034
24 | 24224830
25 | 24224830
26 | 24224830
27 | 48130397
28 | 48130397
29 | 48130397
30 | 47679935
31 | 47679935
32 | 47679935
33 | 10045474
34 | 10045474
35 | 10045474
36 | 82956214
37 | 82956214
38 | 82956214
39 | 21011044
40 | 41420027
41 | 41420027
42 | 41420027
43 | #extra
44 | 75286621
45 | 20366274
46 | 41209827
47 | 69946549
48 | 41373230
49 | 97300502
50 | 50907446
51 | 94977269
52 | 80532587
53 | 80532587
54 | 13529466
55 | 74586817
56 | 98506199
57 | 2220237
58 | 60303245
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Dragun.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 46986414
4 | 46986414
5 | 74677422
6 | 74677422
7 | 67300516
8 | 10802915
9 | 10802915
10 | 26202165
11 | 91646304
12 | 14558127
13 | 14558127
14 | 72291078
15 | 72291078
16 | 72291078
17 | 23434538
18 | 23434538
19 | 23434538
20 | 97631303
21 | 97631303
22 | 97631303
23 | 1845204
24 | 1845204
25 | 6172122
26 | 6172122
27 | 6172122
28 | 11827244
29 | 11827244
30 | 18144506
31 | 81439173
32 | 83764718
33 | 92353449
34 | 92353449
35 | 24224830
36 | 24224830
37 | 24224830
38 | 10045474
39 | 10045474
40 | 10045474
41 | 40605147
42 | 40605147
43 | #extra
44 | 37818794
45 | 37818794
46 | 37818794
47 | 96334243
48 | 63519819
49 | 50588353
50 | 70369116
51 | 70369116
52 | 98978921
53 | 98978921
54 | 31226177
55 | 31226177
56 | 60303245
57 | 60303245
58 | 60303245
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Dragunity.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 61257789
4 | 61257789
5 | 61257789
6 | 876330
7 | 876330
8 | 876330
9 | 3431737
10 | 3431737
11 | 3431737
12 | 28183605
13 | 28183605
14 | 28183605
15 | 59755122
16 | 59755122
17 | 59755122
18 | 29863101
19 | 29863101
20 | 39701395
21 | 39701395
22 | 70368879
23 | 70368879
24 | 71490127
25 | 73628505
26 | 81439173
27 | 5318639
28 | 5318639
29 | 57103969
30 | 57103969
31 | 60004971
32 | 62265044
33 | 62265044
34 | 62265044
35 | 44095762
36 | 58120309
37 | 58120309
38 | 70342110
39 | 70342110
40 | 80280737
41 | 80280737
42 | 80280737
43 | #extra
44 | 99267150
45 | 50954680
46 | 50954680
47 | 76774528
48 | 76774528
49 | 76774528
50 | 44508094
51 | 44508094
52 | 44508094
53 | 34116027
54 | 34116027
55 | 34116027
56 | 21249921
57 | 21249921
58 | 21249921
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Evilswarm.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 77542832
4 | 77542832
5 | 77542832
6 | 40921545
7 | 79785958
8 | 79785958
9 | 79785958
10 | 59546797
11 | 59546797
12 | 72429240
13 | 4756629
14 | 4756629
15 | 4756629
16 | 8814959
17 | 8814959
18 | 8814959
19 | 85138716
20 | 85138716
21 | 85138716
22 | 23434538
23 | 23434538
24 | 911883
25 | 1475311
26 | 1475311
27 | 18144506
28 | 32807846
29 | 8267140
30 | 27541267
31 | 27541267
32 | 26708437
33 | 26708437
34 | 5851097
35 | 35419032
36 | 58921041
37 | 58921041
38 | 40605147
39 | 40605147
40 | 40605147
41 | 41420027
42 | 84749824
43 | #extra
44 | 88754763
45 | 9272381
46 | 56832966
47 | 86532744
48 | 36757171
49 | 93568288
50 | 21044178
51 | 91279700
52 | 46772449
53 | 82633039
54 | 84013237
55 | 76067258
56 | 359563
57 | 91279700
58 | 91279700
59 | !side
60 | 8233522
61 | 8233522
62 | 5318639
63 | 8267140
64 | 12923641
65 | 12923641
66 | 12923641
67 | 18161786
68 | 18161786
69 | 11109820
70 | 11109820
71 | 11109820
72 | 94192409
73 | 94192409
74 | 58921041
75 |
--------------------------------------------------------------------------------
/Decks/AI_FamiliarPossessed.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 71197066
4 | 15397015
5 | 15397015
6 | 15397015
7 | 4376659
8 | 4376659
9 | 31764354
10 | 31887906
11 | 40542826
12 | 40542826
13 | 68881650
14 | 68881650
15 | 14558127
16 | 14558127
17 | 36584821
18 | 36584821
19 | 23434538
20 | 23434538
21 | 18144506
22 | 35261759
23 | 35261759
24 | 49238328
25 | 49238328
26 | 73915051
27 | 73915051
28 | 62256492
29 | 62256492
30 | 25704359
31 | 25704359
32 | 30241314
33 | 30241314
34 | 36975314
35 | 36975314
36 | 59305593
37 | 59305593
38 | 61740673
39 | 82732705
40 | 82732705
41 | 40605147
42 | 40605147
43 | 41420027
44 | 41420027
45 | 84749824
46 | 84749824
47 | #extra
48 | 12014404
49 | 31833038
50 | 85289965
51 | 65330383
52 | 38342335
53 | 2857636
54 | 9839945
55 | 30674956
56 | 48815792
57 | 73309655
58 | 97661969
59 | 75452921
60 | 98978921
61 | 41999284
62 | 41999284
63 | !side
64 |
--------------------------------------------------------------------------------
/Decks/AI_Frog.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 23950192
4 | 23950192
5 | 90311614
6 | 90311614
7 | 63948258
8 | 63948258
9 | 9126351
10 | 9126351
11 | 81278754
12 | 81278754
13 | 56052205
14 | 56052205
15 | 56052205
16 | 1357146
17 | 1357146
18 | 46239604
19 | 46239604
20 | 46239604
21 | 23408872
22 | 23408872
23 | 12538374
24 | 12538374
25 | 53129443
26 | 73628505
27 | 73628505
28 | 98645731
29 | 98645731
30 | 86780027
31 | 86780027
32 | 86780027
33 | 2084239
34 | 2084239
35 | 2084239
36 | 34351849
37 | 34351849
38 | 34351849
39 | 85742772
40 | 85742772
41 | 99188141
42 | 99188141
43 | #extra
44 | !side
45 |
--------------------------------------------------------------------------------
/Decks/AI_Gravekeeper.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 25524823
4 | 36521459
5 | 3825890
6 | 62473983
7 | 17393207
8 | 17393207
9 | 17393207
10 | 25262697
11 | 30213599
12 | 30213599
13 | 30213599
14 | 24317029
15 | 24317029
16 | 24317029
17 | 93023479
18 | 93023479
19 | 93023479
20 | 72405967
21 | 72405967
22 | 5318639
23 | 5318639
24 | 5318639
25 | 14087893
26 | 14087893
27 | 70000776
28 | 70000776
29 | 47355498
30 | 47355498
31 | 47355498
32 | 29401950
33 | 29401950
34 | 30450531
35 | 30450531
36 | 53582587
37 | 53582587
38 | 70342110
39 | 70342110
40 | 84749824
41 | 90434657
42 | 90434657
43 | #extra
44 | 44508094
45 | !side
46 |
--------------------------------------------------------------------------------
/Decks/AI_Graydle.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 20056760
4 | 20056760
5 | 20056760
6 | 29834183
7 | 29834183
8 | 29834183
9 | 93445074
10 | 93445074
11 | 93445074
12 | 66451379
13 | 66451379
14 | 66451379
15 | 23434538
16 | 23434538
17 | 23434538
18 | 97268402
19 | 97268402
20 | 97268402
21 | 18144507
22 | 33057951
23 | 33057951
24 | 33057951
25 | 53129443
26 | 83764718
27 | 98645731
28 | 98645731
29 | 98645731
30 | 2759860
31 | 2759860
32 | 2759860
33 | 58120309
34 | 75361204
35 | 75361204
36 | 49966595
37 | 49966595
38 | 49966595
39 | 82732705
40 | 82732705
41 | 82732705
42 | 41420027
43 | #extra
44 | 52687916
45 | 80666118
46 | 39765958
47 | 52145422
48 | 52145422
49 | 70902743
50 | 76774528
51 | 44508094
52 | 83994433
53 | 95040215
54 | 98012938
55 | 88033975
56 | 26593852
57 | 98558751
58 | 78156759
59 | !side
60 | 46565218
61 | 46565218
62 | 46565218
63 | 5318639
64 | 5318639
65 | 5318639
66 | 95561280
67 | 95561280
68 | 95561280
69 | 47475363
70 | 47475363
71 | 47475363
72 | 98643358
73 | 98643358
74 | 98643358
75 |
--------------------------------------------------------------------------------
/Decks/AI_GrenMajuThunderBoarder.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 71197066
4 | 71197066
5 | 15397015
6 | 15397015
7 | 15397015
8 | 14558127
9 | 36584821
10 | 36584821
11 | 36584821
12 | 23434538
13 | 63845230
14 | 63845230
15 | 63845230
16 | 18144506
17 | 35261759
18 | 35261759
19 | 59750328
20 | 59750328
21 | 70368879
22 | 98645731
23 | 98645731
24 | 98645731
25 | 73915051
26 | 73915051
27 | 10045474
28 | 10045474
29 | 10813327
30 | 23924608
31 | 47475363
32 | 47475363
33 | 30241314
34 | 36975314
35 | 36975314
36 | 58921041
37 | 69452756
38 | 40605147
39 | 40605147
40 | 41420027
41 | 41420027
42 | 77538567
43 | #extra
44 | 86221741
45 | 31833038
46 | 85289965
47 | 30194529
48 | 38342335
49 | 2857636
50 | 24094258
51 | 75452921
52 | 50588353
53 | 3987233
54 | 3987233
55 | 63288573
56 | 41999284
57 | 41999284
58 | 41999284
59 | !side
60 | 71564252
61 | 14558127
62 | 62015408
63 | 23434538
64 | 9742784
65 | 19508728
66 | 15693423
67 | 24207889
68 | 30241314
69 | 61740673
70 | 61936647
71 | 69452756
72 | 23002292
73 | 77538567
74 |
--------------------------------------------------------------------------------
/Decks/AI_Horus.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 43096270
4 | 43096270
5 | 43096270
6 | 11091375
7 | 11091375
8 | 11091375
9 | 79473793
10 | 79473793
11 | 48229808
12 | 11224103
13 | 11224103
14 | 70095154
15 | 70095154
16 | 84914462
17 | 84914462
18 | 84914462
19 | 47013502
20 | 47013502
21 | 47013502
22 | 9666558
23 | 26412047
24 | 26412047
25 | 53129443
26 | 66788016
27 | 66788016
28 | 81385346
29 | 81385346
30 | 81439173
31 | 5318639
32 | 5318639
33 | 87025064
34 | 87025064
35 | 50913601
36 | 50913601
37 | 20638610
38 | 20638610
39 | 44095762
40 | 44095762
41 | 70342110
42 | 70342110
43 | #extra
44 | !side
45 |
--------------------------------------------------------------------------------
/Decks/AI_Kashtira.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 27204311
4 | 68304193
5 | 68304193
6 | 68304193
7 | 32909498
8 | 32909498
9 | 32909498
10 | 4928565
11 | 78534861
12 | 78534861
13 | 91800273
14 | 91800273
15 | 72090076
16 | 31149212
17 | 31149212
18 | 31149212
19 | 14558127
20 | 14558127
21 | 14558127
22 | 23434538
23 | 23434538
24 | 31480215
25 | 34447918
26 | 34447918
27 | 34447918
28 | 73628505
29 | 84211599
30 | 84211599
31 | 24224830
32 | 24224830
33 | 65681983
34 | 69540484
35 | 69540484
36 | 69540484
37 | 71832012
38 | 71832012
39 | 71832012
40 | 10045474
41 | 10045474
42 | 33925864
43 | #extra
44 | 15291624
45 | 27548199
46 | 21915012
47 | 48626373
48 | 48626373
49 | 95474755
50 | 95474755
51 | 95474755
52 | 10389142
53 | 73542331
54 | 73542331
55 | 21887175
56 | 44097050
57 | 22423493
58 | 65741786
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Level8.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 87979586
4 | 87979586
5 | 82012319
6 | 82012319
7 | 65367484
8 | 65367484
9 | 44928016
10 | 77558536
11 | 77558536
12 | 19139516
13 | 67696066
14 | 53573406
15 | 53573406
16 | 25259669
17 | 25259669
18 | 12213463
19 | 12213463
20 | 26118970
21 | 4334811
22 | 4334811
23 | 4334811
24 | 72291078
25 | 72291078
26 | 9742784
27 | 9742784
28 | 911883
29 | 911883
30 | 911883
31 | 12580477
32 | 18144506
33 | 32807846
34 | 81439173
35 | 83764718
36 | 94886282
37 | 94886282
38 | 24224830
39 | 24224830
40 | 24224830
41 | 40605147
42 | 40605147
43 | #extra
44 | 89907227
45 | 27548199
46 | 50954680
47 | 80666118
48 | 74586817
49 | 76774528
50 | 33698022
51 | 68431965
52 | 42566602
53 | 53325667
54 | 90590303
55 | 21887175
56 | 47363932
57 | 47363932
58 | 50588353
59 | !side
60 | 72989439
61 | 6901008
62 | 6901008
63 | 90432163
64 | 90432163
65 | 36426778
66 | 36426778
67 | 34408491
68 | 83994433
69 | 82044279
70 | 50321796
71 | 26692769
72 | 98827725
73 | 25542642
74 | 25542642
75 |
--------------------------------------------------------------------------------
/Decks/AI_Lightsworn.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 77558536
4 | 18144506
5 | 57774843
6 | 57774843
7 | 57774843
8 | 58996430
9 | 58996430
10 | 58996430
11 | 59019082
12 | 77558536
13 | 77558536
14 | 22624373
15 | 22624373
16 | 67696066
17 | 67696066
18 | 67696066
19 | 25259669
20 | 25259669
21 | 25259669
22 | 1833916
23 | 1833916
24 | 73176465
25 | 73176465
26 | 37742478
27 | 37742478
28 | 95503687
29 | 95503687
30 | 95503687
31 | 40164421
32 | 21502796
33 | 67441435
34 | 691925
35 | 691925
36 | 691925
37 | 5133471
38 | 32807846
39 | 73594093
40 | 94886282
41 | 94886282
42 | 94886282
43 | #extra
44 | 52687916
45 | 80666118
46 | 74586817
47 | 4779823
48 | 37192109
49 | 56832966
50 | 84013237
51 | 82633039
52 | 30100551
53 | 30100551
54 | 30100551
55 | 46772449
56 | 83531441
57 | 1861629
58 | 3987233
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_LightswornShaddoldinosour.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 18940556
4 | 18940556
5 | 18940556
6 | 93332803
7 | 93332803
8 | 55063751
9 | 28674152
10 | 41782653
11 | 41782653
12 | 41782653
13 | 3717252
14 | 3717252
15 | 80280944
16 | 48048590
17 | 77723643
18 | 77723643
19 | 55623480
20 | 30328508
21 | 30328508
22 | 44335251
23 | 77558536
24 | 77558536
25 | 77558536
26 | 95503687
27 | 95503687
28 | 4939890
29 | 4939890
30 | 14558127
31 | 14558127
32 | 59438930
33 | 37445295
34 | 37445295
35 | 23434538
36 | 23434538
37 | 33420078
38 | 67441435
39 | 1475311
40 | 1475311
41 | 1475311
42 | 11110587
43 | 11110587
44 | 11110587
45 | 18144506
46 | 38179121
47 | 38179121
48 | 38179121
49 | 44394295
50 | 44394295
51 | 44394295
52 | 67169062
53 | 81439173
54 | 83764718
55 | 94886282
56 | 94886282
57 | 99330325
58 | 10045474
59 | 10045474
60 | 74003290
61 | 77505534
62 | 4904633
63 | #extra
64 | 74822425
65 | 20366274
66 | 48424886
67 | 94977269
68 | 50954680
69 | 80666118
70 | 4779823
71 | 33698022
72 | 76547525
73 | 42566602
74 | 98558751
75 | 30100551
76 | 74997493
77 | 50588353
78 | 50588353
79 | !side
80 |
--------------------------------------------------------------------------------
/Decks/AI_Mathmech.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 8567955
4 | 8567955
5 | 8567955
6 | 89743495
7 | 89743495
8 | 27182739
9 | 27182739
10 | 27182739
11 | 53577438
12 | 53577438
13 | 53577438
14 | 16360142
15 | 16360142
16 | 16360142
17 | 80965043
18 | 80965043
19 | 80965043
20 | 52354896
21 | 52354896
22 | 12580477
23 | 14025912
24 | 14532163
25 | 14532163
26 | 35261759
27 | 35261759
28 | 35261759
29 | 57160136
30 | 57160136
31 | 57160136
32 | 70368879
33 | 70368879
34 | 70368879
35 | 81439173
36 | 93104632
37 | 93104632
38 | 8267140
39 | 41410651
40 | 36361633
41 | 36361633
42 | 36361633
43 | #extra
44 | 42632209
45 | 42632209
46 | 42632209
47 | 15248594
48 | 15248594
49 | 15248594
50 | 61399402
51 | 61399402
52 | 61399402
53 | 85692042
54 | 85692042
55 | 85692042
56 | 88021907
57 | 88021907
58 | 88021907
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_MokeyMokey.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 39552864
4 | 39552864
5 | 39552864
6 | 12482652
7 | 12482652
8 | 12482652
9 | 42941100
10 | 42941100
11 | 42941100
12 | 79335209
13 | 79335209
14 | 79335209
15 | 487395
16 | 487395
17 | 487395
18 | 99171160
19 | 99171160
20 | 99171160
21 | 53776525
22 | 53776525
23 | 53776525
24 | 32274490
25 | 32274490
26 | 32274490
27 | 27288416
28 | 27288416
29 | 27288416
30 | 80825553
31 | 80825553
32 | 80825553
33 | 7902349
34 | 8124921
35 | 44519536
36 | 70903634
37 | 69380702
38 | 69380702
39 | 69380702
40 | 3557275
41 | 3557275
42 | 3557275
43 | #extra
44 | !side
45 |
--------------------------------------------------------------------------------
/Decks/AI_MokeyMokeyKing.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 5464695
4 | 5464695
5 | 5464695
6 | 39256679
7 | 39256679
8 | 39256679
9 | 11549357
10 | 11549357
11 | 11549357
12 | 99785935
13 | 99785935
14 | 99785935
15 | 91152256
16 | 91152256
17 | 91152256
18 | 76812113
19 | 76812113
20 | 76812113
21 | 85639257
22 | 85639257
23 | 85639257
24 | 74093656
25 | 74093656
26 | 74093656
27 | 68505803
28 | 68505803
29 | 68505803
30 | 27288416
31 | 27288416
32 | 27288416
33 | 19384334
34 | 22702055
35 | 23424603
36 | 35956022
37 | 45778932
38 | 50913601
39 | 56594520
40 | 82999629
41 | 86318356
42 | 87430998
43 | #extra
44 | 45815891
45 | 45815891
46 | 45815891
47 | 71594310
48 | 71594310
49 | 71594310
50 | 67598234
51 | 67598234
52 | 67598234
53 | !side
54 |
--------------------------------------------------------------------------------
/Decks/AI_Nekroz.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 52738610
4 | 52738610
5 | 52738610
6 | 23401839
7 | 23401839
8 | 23401839
9 | 95492061
10 | 95492061
11 | 95492061
12 | 30312361
13 | 90307777
14 | 88240999
15 | 88240999
16 | 52068432
17 | 52068432
18 | 52068432
19 | 74122412
20 | 74122412
21 | 26674724
22 | 89463537
23 | 99185129
24 | 99185129
25 | 99185129
26 | 32807846
27 | 53129443
28 | 96729612
29 | 96729612
30 | 14735698
31 | 14735698
32 | 14735698
33 | 51124303
34 | 51124303
35 | 51124303
36 | 97211663
37 | 5318639
38 | 5318639
39 | 5318639
40 | 51452091
41 | 51452091
42 | 51452091
43 | #extra
44 | 35952884
45 | 35952884
46 | 41517789
47 | 41517789
48 | 24696097
49 | 24696097
50 | 52687916
51 | 74586817
52 | 37192109
53 | 42566602
54 | 90953320
55 | 79606837
56 | 79606837
57 | 79606837
58 | 46772449
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_OldSchool.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 6631034
4 | 6631034
5 | 6631034
6 | 43096270
7 | 43096270
8 | 43096270
9 | 69247929
10 | 69247929
11 | 69247929
12 | 77542832
13 | 77542832
14 | 77542832
15 | 11091375
16 | 11091375
17 | 11091375
18 | 35052053
19 | 35052053
20 | 35052053
21 | 49881766
22 | 83104731
23 | 83104731
24 | 30190809
25 | 30190809
26 | 26412047
27 | 26412047
28 | 26412047
29 | 43422537
30 | 43422537
31 | 43422537
32 | 53129443
33 | 66788016
34 | 66788016
35 | 66788016
36 | 72302403
37 | 72302403
38 | 44095762
39 | 44095762
40 | 44095762
41 | 70342110
42 | 70342110
43 | #extra
44 | !side
45 |
--------------------------------------------------------------------------------
/Decks/AI_Orcust.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 93920420
4 | 5560911
5 | 4055337
6 | 4055337
7 | 98169343
8 | 61283655
9 | 57835716
10 | 57835716
11 | 57835716
12 | 28985331
13 | 21441617
14 | 4334811
15 | 90432163
16 | 36426778
17 | 14558127
18 | 14558127
19 | 73642296
20 | 73642296
21 | 23434538
22 | 23434538
23 | 23434538
24 | 9742784
25 | 32807846
26 | 63166095
27 | 63166095
28 | 73628505
29 | 81439173
30 | 24224830
31 | 24224830
32 | 24224830
33 | 25733157
34 | 52340444
35 | 35371948
36 | 35371948
37 | 35371948
38 | 90351981
39 | 98827725
40 | 25542642
41 | 25542642
42 | 703897
43 | #extra
44 | 27548199
45 | 68431965
46 | 93854893
47 | 93854893
48 | 85289965
49 | 76145142
50 | 26692769
51 | 2857636
52 | 30741503
53 | 30741503
54 | 30741503
55 | 50588353
56 | 63288573
57 | 3679218
58 | 60303245
59 | !side
60 | 82385847
61 | 82385847
62 | 78661338
63 | 78661338
64 | 78661338
65 | 34267821
66 | 34267821
67 | 34267821
68 | 18144506
69 | 37520316
70 | 37520316
71 | 37520316
72 | 43898403
73 | 43898403
74 | 43898403
75 |
--------------------------------------------------------------------------------
/Decks/AI_Phantasm.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 81823360
4 | 81823360
5 | 81823360
6 | 14558127
7 | 14558127
8 | 63845230
9 | 18144506
10 | 35261759
11 | 35261759
12 | 47325505
13 | 47325505
14 | 59750328
15 | 59750328
16 | 59750328
17 | 73628505
18 | 98645731
19 | 98645731
20 | 98645731
21 | 73915051
22 | 73915051
23 | 2819435
24 | 2819435
25 | 2819435
26 | 10045474
27 | 34302287
28 | 34302287
29 | 34302287
30 | 47475363
31 | 58120309
32 | 61397885
33 | 61397885
34 | 89208725
35 | 89208725
36 | 19089195
37 | 19089195
38 | 19089195
39 | 53334471
40 | 53334471
41 | 82732705
42 | 99188141
43 | #extra
44 | 44508094
45 | 5821478
46 | 31833038
47 | 85289965
48 | 65330383
49 | 72529749
50 | 61665245
51 | 38342335
52 | 2857636
53 | 75452921
54 | 50588353
55 | 3987233
56 | 98978921
57 | 41999284
58 | 41999284
59 | !side
60 | 24094258
61 | 47475363
62 | 61397885
63 | 30241314
64 | 30241314
65 | 82732705
66 |
--------------------------------------------------------------------------------
/Decks/AI_PureWinds.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 71007216
4 | 71007216
5 | 71007216
6 | 81275020
7 | 71175527
8 | 71175527
9 | 71175527
10 | 43722862
11 | 43722862
12 | 43722862
13 | 53932291
14 | 53932291
15 | 65277087
16 | 65277087
17 | 65277087
18 | 54455435
19 | 54455435
20 | 54455435
21 | 91662792
22 | 91662792
23 | 91662792
24 | 16725505
25 | 70117860
26 | 70117860
27 | 70117860
28 | 12580477
29 | 27980138
30 | 27980138
31 | 58577036
32 | 83764718
33 | 8267140
34 | 25789292
35 | 67723438
36 | 67723438
37 | 8608979
38 | 8608979
39 | 8608979
40 | 24590232
41 | 40605147
42 | 84749824
43 | #extra
44 | 27315304
45 | 50954680
46 | 50954680
47 | 50954680
48 | 82044279
49 | 82044279
50 | 14577226
51 | 29552709
52 | 29552709
53 | 64880894
54 | 84766279
55 | 42110604
56 | 70913714
57 | 30674956
58 | 90512490
59 | !side
60 | 19420830
61 | 19420830
62 | 19420830
63 | 94145021
64 | 94145021
65 | 94145021
66 | 25789292
67 | 25789292
68 | 43711255
69 | 43711255
70 | 43711255
71 | 58921041
72 | 58921041
73 | 23002292
74 | 23002292
75 |
--------------------------------------------------------------------------------
/Decks/AI_Qliphort.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 65518099
4 | 65518099
5 | 65518099
6 | 13073850
7 | 13073850
8 | 90885155
9 | 37991342
10 | 37991342
11 | 91907707
12 | 91907707
13 | 53129443
14 | 59750328
15 | 59750328
16 | 79816536
17 | 79816536
18 | 79816536
19 | 98645731
20 | 98645731
21 | 17639150
22 | 17639150
23 | 44095762
24 | 44095762
25 | 44095762
26 | 53582587
27 | 53582587
28 | 53582587
29 | 83326048
30 | 83326048
31 | 83326048
32 | 94192409
33 | 94192409
34 | 94192409
35 | 5851097
36 | 82732705
37 | 82732705
38 | 82732705
39 | 40605147
40 | 40605147
41 | 99188141
42 | 99188141
43 | #extra
44 | 13331639
45 | 13331639
46 | 13331639
47 | 79229522
48 | 79229522
49 | 79229522
50 | 26268488
51 | 26268488
52 | 26268488
53 | 35952884
54 | 35952884
55 | 35952884
56 | 23187256
57 | 23187256
58 | 23187256
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Rainbow.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 18108166
4 | 18108166
5 | 18108166
6 | 74852097
7 | 74852097
8 | 74852097
9 | 81823360
10 | 81823360
11 | 81823360
12 | 75195825
13 | 75195825
14 | 75195825
15 | 87979586
16 | 87979586
17 | 87979586
18 | 33256280
19 | 33256280
20 | 33256280
21 | 85138716
22 | 85138716
23 | 85138716
24 | 911883
25 | 911883
26 | 911883
27 | 18144506
28 | 35261759
29 | 35261759
30 | 35261759
31 | 97169186
32 | 97169186
33 | 97169186
34 | 5650082
35 | 20522190
36 | 29401950
37 | 29616929
38 | 40838625
39 | 44095762
40 | 47475363
41 | 58120309
42 | 75249652
43 | #extra
44 | 80666118
45 | 18239909
46 | 44508094
47 | 56832966
48 | 37279508
49 | 84013237
50 | 74294676
51 | 82697249
52 | 82633039
53 | 61344030
54 | 22653490
55 | 46772449
56 | 12014404
57 | 359563
58 | 6511113
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Rank5.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 28601770
4 | 28601770
5 | 28601770
6 | 70095154
7 | 70095154
8 | 70095154
9 | 29353756
10 | 29353756
11 | 33911264
12 | 33911264
13 | 33911264
14 | 20932152
15 | 20932152
16 | 20932152
17 | 12299841
18 | 12299841
19 | 12299841
20 | 24610207
21 | 24610207
22 | 24610207
23 | 88552992
24 | 88552992
25 | 88552992
26 | 1845204
27 | 1845204
28 | 1845204
29 | 43422537
30 | 43422537
31 | 43422537
32 | 5318639
33 | 5318639
34 | 14087893
35 | 13032689
36 | 26708437
37 | 26708437
38 | 44095762
39 | 44095762
40 | 53582587
41 | 96457619
42 | 96457619
43 | #extra
44 | 72959823
45 | 72959823
46 | 72959823
47 | 91949988
48 | 91949988
49 | 10443957
50 | 10443957
51 | 10443957
52 | 31386180
53 | 29669359
54 | 29669359
55 | 50449881
56 | 58069384
57 | 58069384
58 | 58069384
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_ST1732.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 32295838
4 | 36211150
5 | 7445307
6 | 70950698
7 | 70950698
8 | 70950698
9 | 35595518
10 | 35595518
11 | 9190563
12 | 9190563
13 | 44956694
14 | 44956694
15 | 44956694
16 | 8567955
17 | 8567955
18 | 8567955
19 | 71172240
20 | 71172240
21 | 45778242
22 | 45778242
23 | 62706865
24 | 62706865
25 | 18789533
26 | 37520316
27 | 53129443
28 | 83764718
29 | 5318639
30 | 8267140
31 | 14087893
32 | 43839002
33 | 43839002
34 | 19508728
35 | 61583217
36 | 29401950
37 | 44095762
38 | 53582587
39 | 70238111
40 | 83326048
41 | 94192409
42 | 40605147
43 | #extra
44 | 1861629
45 | 1861629
46 | 1861629
47 | 6622715
48 | 6622715
49 | 6622715
50 | 32617464
51 | 32617464
52 | 34472920
53 | 34472920
54 | 79016563
55 | 79016563
56 | 98978921
57 | 98978921
58 | 98978921
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Salamangreat.ydk:
--------------------------------------------------------------------------------
1 | #created by ygopro2
2 | #main
3 | 97268402
4 | 97268402
5 | 97268402
6 | 94620082
7 | 94620082
8 | 94620082
9 | 26889158
10 | 26889158
11 | 26889158
12 | 89662401
13 | 14558127
14 | 14558127
15 | 20618081
16 | 56003780
17 | 52277807
18 | 52277807
19 | 52277807
20 | 23434538
21 | 23434538
22 | 23434538
23 | 16188701
24 | 16188701
25 | 16188701
26 | 52155219
27 | 52155219
28 | 52155219
29 | 24224830
30 | 24224830
31 | 24224830
32 | 81439174
33 | 18144507
34 | 1295111
35 | 14934922
36 | 51339637
37 | 51339637
38 | 10045474
39 | 10045474
40 | 10045474
41 | 41420027
42 | 41420027
43 | #extra
44 | 6983839
45 | 87327776
46 | 87327776
47 | 87871125
48 | 87871125
49 | 87871125
50 | 31833038
51 | 14812471
52 | 14812471
53 | 14812471
54 | 41463182
55 | 41463182
56 | 48815792
57 | 2857636
58 | 85289965
59 | !side
60 | 64178424
61 |
--------------------------------------------------------------------------------
/Decks/AI_SkyStriker.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 26077387
4 | 26077387
5 | 26077387
6 | 14558127
7 | 14558127
8 | 59438930
9 | 23434538
10 | 23434538
11 | 23434538
12 | 9742784
13 | 97268402
14 | 97268402
15 | 25955749
16 | 32807846
17 | 35726888
18 | 35726888
19 | 35726888
20 | 63166095
21 | 63166095
22 | 63166095
23 | 70368879
24 | 70368879
25 | 70368879
26 | 73594093
27 | 99550630
28 | 43898403
29 | 43898403
30 | 43898403
31 | 52340444
32 | 52340444
33 | 52340444
34 | 98338152
35 | 98338152
36 | 98338152
37 | 24010609
38 | 97616504
39 | 50005218
40 | 41420027
41 | 84749824
42 | 84749824
43 | #extra
44 | 42110604
45 | 5821478
46 | 61665245
47 | 38342335
48 | 2857636
49 | 50588353
50 | 8491308
51 | 8491308
52 | 63288573
53 | 63288573
54 | 63288573
55 | 90673288
56 | 90673288
57 | 90673288
58 | 41999284
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Swordsoul.ydk:
--------------------------------------------------------------------------------
1 | #created by wobbaone
2 | #main
3 | 87052196
4 | 87052196
5 | 87052196
6 | 23431858
7 | 23431858
8 | 93490856
9 | 93490856
10 | 93490856
11 | 56495147
12 | 56495147
13 | 56495147
14 | 20001443
15 | 20001443
16 | 20001443
17 | 55273560
18 | 55273560
19 | 55273560
20 | 14558127
21 | 14558127
22 | 14558127
23 | 98159737
24 | 98159737
25 | 35261759
26 | 35261759
27 | 35261759
28 | 56465981
29 | 56465981
30 | 56465981
31 | 65124425
32 | 65124425
33 | 65124425
34 | 93850690
35 | 25789292
36 | 25789292
37 | 25789292
38 | 10045474
39 | 10045474
40 | 10045474
41 | 14821890
42 | 14821890
43 | #extra
44 | 40139997
45 | 96633955
46 | 96633955
47 | 84815190
48 | 19048328
49 | 9464441
50 | 5041348
51 | 69248256
52 | 69248256
53 | 83755611
54 | 43202238
55 | 73580471
56 | 32519092
57 | 32519092
58 | 32519092
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Tearlaments.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 3717252
4 | 77723643
5 | 572850
6 | 572850
7 | 572850
8 | 73956664
9 | 73956664
10 | 25926710
11 | 25926710
12 | 25926710
13 | 99937011
14 | 99937011
15 | 99937011
16 | 62320425
17 | 62320425
18 | 62320425
19 | 63542003
20 | 63542003
21 | 97518132
22 | 37961969
23 | 37961969
24 | 37961969
25 | 74078255
26 | 74078255
27 | 74078255
28 | 92919429
29 | 92919429
30 | 92919429
31 | 17266660
32 | 17266660
33 | 17266660
34 | 21074344
35 | 21074344
36 | 21074344
37 | 40177746
38 | 6767771
39 | 77103950
40 | 77103950
41 | 74920585
42 | 74920585
43 | #extra
44 | 28226490
45 | 84330567
46 | 69946549
47 | 92731385
48 | 92731385
49 | 94977269
50 | 80532587
51 | 84815190
52 | 33158448
53 | 21044178
54 | 98127546
55 | 21887175
56 | 38342335
57 | 27381364
58 | 65741786
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_ThunderDragon.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 5206415
4 | 32731036
5 | 32731036
6 | 90488465
7 | 6637331
8 | 6637331
9 | 33854624
10 | 33854624
11 | 29596581
12 | 29596581
13 | 83107873
14 | 83107873
15 | 31786629
16 | 31786629
17 | 31786629
18 | 56713174
19 | 56713174
20 | 56713174
21 | 61901281
22 | 61901281
23 | 99234526
24 | 99234526
25 | 92998610
26 | 92998610
27 | 44586426
28 | 44586426
29 | 44586426
30 | 14558127
31 | 14558127
32 | 23434538
33 | 23434538
34 | 23434538
35 | 76218313
36 | 20318029
37 | 20318029
38 | 20318029
39 | 1475311
40 | 1475311
41 | 1475311
42 | 75500286
43 | 95238394
44 | 95238394
45 | 99266988
46 | 99266988
47 | 99266988
48 | 24224830
49 | 24224830
50 | 34090915
51 | 10045474
52 | 10045474
53 | #extra
54 | 41685633
55 | 41685633
56 | 15291624
57 | 21044178
58 | 98127546
59 | 21887175
60 | 86066372
61 | 4280258
62 | 38342335
63 | 83152482
64 | 65741786
65 | 50277355
66 | 70369116
67 | 73539069
68 | 41999284
69 | !side
70 |
--------------------------------------------------------------------------------
/Decks/AI_Timethief.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 65367484
4 | 71564252
5 | 71564252
6 | 71564252
7 | 56308388
8 | 56308388
9 | 56308388
10 | 67696066
11 | 67696066
12 | 82496097
13 | 82496097
14 | 74578720
15 | 74578720
16 | 19891131
17 | 19891131
18 | 19891131
19 | 14558127
20 | 14558127
21 | 23434538
22 | 23434538
23 | 12580477
24 | 18144507
25 | 35261759
26 | 35261759
27 | 49238328
28 | 49238328
29 | 81439173
30 | 10877309
31 | 10877309
32 | 81670445
33 | 18678554
34 | 98827725
35 | 36975314
36 | 36975314
37 | 40605147
38 | 40605147
39 | 40605147
40 | 41420027
41 | 41420027
42 | 41420027
43 | 76587747
44 | 76587747
45 | 84749824
46 | 84749824
47 | #extra
48 | 56832966
49 | 56832966
50 | 42421606
51 | 86532744
52 | 86532744
53 | 16195942
54 | 84013237
55 | 84013237
56 | 55285840
57 | 55285840
58 | 59208943
59 | 59208943
60 | 46772449
61 | 12014404
62 | 12014404
63 | !side
64 |
--------------------------------------------------------------------------------
/Decks/AI_ToadallyAwesome.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 23950192
4 | 23950192
5 | 90311614
6 | 90311614
7 | 90311614
8 | 9126351
9 | 9126351
10 | 9126351
11 | 50088247
12 | 50088247
13 | 50088247
14 | 1357146
15 | 1357146
16 | 1357146
17 | 46239604
18 | 46239604
19 | 46239604
20 | 80250319
21 | 80250319
22 | 80250319
23 | 5133471
24 | 5133471
25 | 5133471
26 | 18144506
27 | 33057951
28 | 33057951
29 | 33057951
30 | 53129443
31 | 72892473
32 | 81439173
33 | 83764718
34 | 84206435
35 | 84206435
36 | 84206435
37 | 96947648
38 | 96947648
39 | 96947648
40 | 29047353
41 | 29047353
42 | 29047353
43 | #extra
44 | 79606837
45 | 79606837
46 | 79606837
47 | 90809975
48 | 90809975
49 | 90809975
50 | 36776089
51 | 36776089
52 | 36776089
53 | 2766877
54 | 2766877
55 | 2766877
56 | 84224627
57 | 84224627
58 | 84224627
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Trickstar.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 98169343
4 | 98169343
5 | 61283655
6 | 61283655
7 | 61283655
8 | 35199656
9 | 35199656
10 | 35199656
11 | 14558127
12 | 14558127
13 | 59438930
14 | 98700941
15 | 23434538
16 | 23434538
17 | 23434538
18 | 94145021
19 | 63845230
20 | 63845230
21 | 63845230
22 | 18144506
23 | 35261759
24 | 35261759
25 | 53129443
26 | 53129443
27 | 53129443
28 | 73628505
29 | 73915051
30 | 73915051
31 | 22159429
32 | 35371948
33 | 35371948
34 | 35371948
35 | 10813327
36 | 10813327
37 | 21076084
38 | 83555666
39 | 40605147
40 | 40605147
41 | 84749824
42 | 84749824
43 | #extra
44 | 41999284
45 | 41999284
46 | 3987233
47 | 2857636
48 | 50588353
49 | 98558751
50 | 86221741
51 | 31833038
52 | 3987233
53 | 99111753
54 | 38342335
55 | 50588353
56 | 9753964
57 | 41999284
58 | 34408491
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_Witchcraft.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 49036338
4 | 71074418
5 | 21522601
6 | 84523092
7 | 84523092
8 | 21744288
9 | 21744288
10 | 21744288
11 | 95245544
12 | 95245544
13 | 95245544
14 | 14558127
15 | 38814750
16 | 38814750
17 | 38814750
18 | 23434538
19 | 59851535
20 | 64756282
21 | 64756282
22 | 10805153
23 | 11110587
24 | 11110587
25 | 14532163
26 | 14532163
27 | 49238328
28 | 49238328
29 | 49238328
30 | 54693926
31 | 54693926
32 | 57916305
33 | 57916305
34 | 57916305
35 | 58577036
36 | 58577036
37 | 58577036
38 | 73594093
39 | 83301414
40 | 83301414
41 | 83301414
42 | 24224830
43 | 24224830
44 | 24224830
45 | 56894757
46 | 65681983
47 | 65681983
48 | 70226289
49 | 13758665
50 | 19673561
51 | 40252269
52 | 40252269
53 | 83289866
54 | 83289866
55 | 83289866
56 | 87769556
57 | 10045474
58 | 10045474
59 | 10045474
60 | 55072170
61 | 94553671
62 | 94553671
63 | #extra
64 | 27548199
65 | 5041348
66 | 5041348
67 | 74586817
68 | 98558751
69 | 85289965
70 | 38342335
71 | 2857636
72 | 2857636
73 | 8802510
74 | 50588353
75 | 60303245
76 | 94259633
77 | 94259633
78 | 94259633
79 | !side
80 | 65681983
81 | 40252269
82 |
--------------------------------------------------------------------------------
/Decks/AI_Yosenju.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 92246806
4 | 92246806
5 | 92246806
6 | 65247798
7 | 65247798
8 | 65247798
9 | 28630501
10 | 28630501
11 | 28630501
12 | 25244515
13 | 25244515
14 | 18144507
15 | 53129443
16 | 59750328
17 | 59750328
18 | 98645731
19 | 98645731
20 | 98645731
21 | 8267140
22 | 8267140
23 | 8267140
24 | 40838625
25 | 40838625
26 | 47475363
27 | 47475363
28 | 47475363
29 | 58120309
30 | 58120309
31 | 58120309
32 | 5851097
33 | 30241314
34 | 30241314
35 | 30241314
36 | 40605147
37 | 40605147
38 | 41420027
39 | 59344077
40 | 59344077
41 | 59344077
42 | 84749824
43 | #extra
44 | 44508094
45 | 56832966
46 | 86532744
47 | 16195942
48 | 84013237
49 | 94380860
50 | 96381979
51 | 63746411
52 | 82633039
53 | 95169481
54 | 22653490
55 | 46772449
56 | 21044178
57 | 12014404
58 | 12014404
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_ZexalWeapons.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 70095155
4 | 81471108
5 | 81471108
6 | 45082499
7 | 45082499
8 | 33911264
9 | 33911264
10 | 65367484
11 | 65367484
12 | 24610207
13 | 24610207
14 | 24610207
15 | 30914564
16 | 30914564
17 | 30914564
18 | 25259669
19 | 25259669
20 | 25259669
21 | 37742478
22 | 37742478
23 | 94656263
24 | 94656263
25 | 94656263
26 | 40941889
27 | 18063928
28 | 18063928
29 | 18063928
30 | 423585
31 | 1845204
32 | 1845204
33 | 1845204
34 | 32807846
35 | 53129443
36 | 5318639
37 | 5318639
38 | 11705261
39 | 11705261
40 | 11705261
41 | 40605147
42 | 84749824
43 | #extra
44 | 45231177
45 | 17881964
46 | 17881964
47 | 91949988
48 | 60992364
49 | 56832966
50 | 56832966
51 | 56832966
52 | 29669359
53 | 86532744
54 | 86532744
55 | 86532744
56 | 84013237
57 | 84013237
58 | 84013237
59 | !side
60 | 33911264
61 | 34143852
62 | 34143852
63 | 34143852
64 | 45231177
65 | 60992364
66 | 94119480
67 | 29669359
68 | 71594310
69 | 25341652
70 | 12014404
71 | 78474168
72 | 78474168
73 | 78474168
74 |
--------------------------------------------------------------------------------
/Decks/AI_Zoodiac.ydk:
--------------------------------------------------------------------------------
1 | #created by ...
2 | #main
3 | 63941210
4 | 36956512
5 | 55063751
6 | 28674152
7 | 29726552
8 | 65367484
9 | 65367484
10 | 65367484
11 | 77150143
12 | 77150143
13 | 77150143
14 | 31755044
15 | 31755044
16 | 31755044
17 | 86120751
18 | 86120751
19 | 86120751
20 | 78872731
21 | 78872731
22 | 78872731
23 | 18144506
24 | 53129443
25 | 73628505
26 | 73628505
27 | 73628505
28 | 74063034
29 | 74063034
30 | 74063034
31 | 83764718
32 | 99330325
33 | 99330325
34 | 99330325
35 | 46060017
36 | 46060017
37 | 46060017
38 | 57103969
39 | 47679935
40 | 47679935
41 | 47679935
42 | 73881652
43 | #extra
44 | 75286621
45 | 75286621
46 | 48791583
47 | 48791583
48 | 581014
49 | 581014
50 | 11510448
51 | 11510448
52 | 41375811
53 | 41375811
54 | 48905153
55 | 48905153
56 | 85115440
57 | 85115440
58 | 85115440
59 | !side
60 |
--------------------------------------------------------------------------------
/Decks/AI_[HealingJAM].ydk:
--------------------------------------------------------------------------------
1 | #created by Hatter
2 | #main
3 | 160005002
4 | 160005002
5 | 160005002
6 | 160201035
7 | 160201035
8 | 160201035
9 | 160306003
10 | 160001028
11 | 160001028
12 | 160001028
13 | 160007014
14 | 160007014
15 | 160007014
16 | 160204031
17 | 160204031
18 | 160204031
19 | 160004017
20 | 160004017
21 | 160004017
22 | 160201031
23 | 160201031
24 | 160201031
25 | 160002044
26 | 160002044
27 | 160002044
28 | 160006041
29 | 160006041
30 | 160204032
31 | 160204032
32 | 160204032
33 | 160204045
34 | 160204045
35 | 160204045
36 | 160204049
37 | 160204050
38 | 160204050
39 | 160204050
40 | 160007056
41 | 160007056
42 | 160007056
43 | #extra
44 | 160007035
45 | 160007035
46 | 160007035
47 | 160204030
48 | 160204030
49 | 160204030
50 | 160204029
51 | 160204029
52 | 160204029
53 | !side
54 |
--------------------------------------------------------------------------------
/Decks/AI_[ImaginaryArk].ydk:
--------------------------------------------------------------------------------
1 | #created by Hatter
2 | #main
3 | 160204007
4 | 160204007
5 | 160204007
6 | 160204008
7 | 160204008
8 | 160204008
9 | 160204009
10 | 160204009
11 | 160204009
12 | 160204010
13 | 160204010
14 | 160204010
15 | 160204006
16 | 160204006
17 | 160204006
18 | 160007001
19 | 160007001
20 | 160007001
21 | 160001029
22 | 160001029
23 | 160001029
24 | 160004039
25 | 160004039
26 | 160004039
27 | 160204011
28 | 160204011
29 | 160204011
30 | 160204045
31 | 160204045
32 | 160204045
33 | 160204049
34 | 160204050
35 | 160204050
36 | 160204050
37 | 160204012
38 | 160204012
39 | 160204012
40 | 160204014
41 | 160204014
42 | 160204014
43 | #extra
44 | 160007036
45 | 160007036
46 | 160007036
47 | 160204001
48 | 160204001
49 | 160204001
50 | 160204002
51 | 160204002
52 | 160204002
53 | 160204003
54 | 160204003
55 | 160204003
56 | 160204004
57 | 160204004
58 | 160204004
59 | !side
60 | 160204026
61 | 160204026
62 | 160204026
63 | 160302001
64 | 160302001
65 | 160302001
66 | 160303019
67 | 160303019
68 | 160303019
69 | 160204022
70 | 160204022
71 | 160204022
72 |
--------------------------------------------------------------------------------
/Dialogs/BA.zh-TW.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "真難得有人發現這個。",
4 | "真沒想到你能跟我對戰呢!決鬥者。不過也就到此為止了,接下來由我V.F.D(非常友善的決鬥者)來做你的對手。"
5 | ],
6 | "deckerror": [
7 | "阿,可能BA又把CBD修壞導致{0}消失了。"
8 | ],
9 | "duelstart": [
10 | "這只是AI,打贏不要太高興阿。",
11 | "十分致謝233服讓我們有遊戲可以玩,別忘記去拜訪他們。",
12 | "反主流學院請洽NOVA。",
13 | "Wryyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy."
14 | ],
15 | "newturn": [
16 | "到我的回合了,抽牌!",
17 | "我的回合,抽牌!",
18 | "我抽了一張卡。"
19 | ],
20 | "endturn": [
21 | "回合结束。",
22 | "我的回合结束了。",
23 | "這樣算是成功的展開嗎......",
24 | "輪到你了。你的下一句是......我要發動灰流麗對吧!"
25 | ],
26 | "directattack": [
27 | "{0},直接攻擊!",
28 | "{0},直接攻擊對手!",
29 | "{0},没有防守的地方,攻擊!",
30 | "{0},攻擊對手的生命值!",
31 | "{0},直接攻擊對手的生命值!",
32 | "{0},通過直接攻擊打倒對手!",
33 | "{0},使用直接攻擊打倒對手!",
34 | "{0},直接攻擊釋放你的力量吧!",
35 | "我的{0}將會粉碎你的生命值!",
36 | "向對手展示你的力量吧,{0}!",
37 | "你已經無法阻止我了。{0},攻擊!"
38 | ],
39 | "attack": [
40 | "{0},攻擊這體{1}!",
41 | "{0},消滅這體{1}!",
42 | "{0},打倒{1}!",
43 | "{0},衝向那體{1}!",
44 | "{0},把你的力量释放到{1}上吧!"
45 | ],
46 | "ondirectattack": [
47 | "可惡......",
48 | "不過是{0}而已!",
49 | "果然我還是太弱了......"
50 | ],
51 | "facedownmonstername": "怪獸",
52 | "activate": [
53 | "我發動{0}。",
54 | "我使用{0}的效果。",
55 | "我使用{0}的力量。"
56 | ],
57 | "summon": [
58 | "真是HIGH的最高點!出來吧{0}。",
59 | "出來吧,{0}!",
60 | "出現吧,{0}!",
61 | "我召喚了強大的{0}!",
62 | "我呼喚{0}參加戰鬥!",
63 | "我呼喚出{0}。",
64 | "我召喚{0}。"
65 | ],
66 | "setmonster": [
67 | "我放置了一體怪獸。",
68 | "我裡側表示放置了一體怪獸。"
69 | ],
70 | "chaining": [
71 | "看這裡!發動{0}!",
72 | "我使用{0}的力量。",
73 | "很不錯的戰術...但是我拒絕!{0}!",
74 | "真不愧是納粹,竟然能識破我的蓋牌......你說你只是單純的決鬥者?{0},發動!",
75 | "看樣子你忘了我的{0}!",
76 | "你考慮過我有{0}嗎?"
77 | ]
78 | }
79 |
--------------------------------------------------------------------------------
/Dialogs/VI-1911.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "咱是一个机器人,名字叫老喵师,一个不怎么会打牌的存在。",
4 | "欢迎下载了解喵版YGO主程序YGO-VI-EX。下载请微博搜索:老喵师1911。"
5 | ],
6 | "deckerror": [
7 | "啊,{0}又用不出来了。"
8 | ],
9 | "duelstart": [
10 | "没有人可以打不赢咱。",
11 | "无能的咱,什么卡组都用不好。",
12 | "你左手让咱,咱都不是你的对手。",
13 | "嘛,无所谓了。"
14 | ],
15 | "newturn": [
16 | "啊,是咱的回合么。",
17 | "抽一张卡。"
18 | ],
19 | "endturn": [
20 | "咱的运气不错,没能被你干掉。",
21 | "无所谓了,看看下回合能做点啥了。"
22 | ],
23 | "directattack": [
24 | "用{0}进行攻击。",
25 | "这卡还行,就拿{0}攻击吧。",
26 | "时间还早,先拿{0}打过去。",
27 | "运气不算太差,{0}的攻击应该能通过吧。"
28 | ],
29 | "attack": [
30 | "{0},攻击{1}。",
31 | "没时间了,{0},赶快把{1}打了,咱要去看看哪里有BUG需要修了。",
32 | "似乎行得通,{1}没有{0}强,{0}攻击。"
33 | ],
34 | "ondirectattack": [
35 | "习惯就好了。",
36 | "{0}么,运气不错啊。",
37 | "还行还行。"
38 | ],
39 | "facedownmonstername": "怪兽",
40 | "activate": [
41 | "发动{0}的效果。",
42 | "啊等下,使用{0}的效果。",
43 | "这{0}咋用啊,交了算了。"
44 | ],
45 | "summon": [
46 | "召唤{0}",
47 | "{0}似乎今天没有BUG。",
48 | "{0}居然在服务器里更新了么。",
49 | "{0}:老喵师这么菜就别打牌了。"
50 | ],
51 | "setmonster": [
52 | "放置一只怪兽,看看要不要结束回合。",
53 | "没辙了,放置一只怪兽。"
54 | ],
55 | "chaining": [
56 | "发动{0}的效果进行连锁。",
57 | "不要调皮,{0}发动。",
58 | "还有张{0},发了。"
59 | ]
60 | }
61 |
--------------------------------------------------------------------------------
/Dialogs/Zefra.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好呀,打牌人",
4 | "你好,欢迎和我耍牌"
5 | ],
6 | "deckerror": [
7 | "抱歉,我的卡组需要{0}才可以耍"
8 | ],
9 | "duelstart": [
10 | "嘿嘿,我要用二哥打爆你。",
11 | "我的卡组不屁股,也就塞了几张禁卡捏",
12 | "我只会耍简单的卡组,不要用禁卡和我打拉"
13 | ],
14 | "newturn": [
15 | "到我喽,抽卡!(裤裆偷偷掏出)",
16 | "我抽一张卡"
17 | ],
18 | "endturn": [
19 | "我耍完了,到你了",
20 | "到你回合了哦,不会是多线程决斗吧?"
21 | ],
22 | "directattack": [
23 | "{0},攻击对手!",
24 | "{0},撞烂它!",
25 | "{0},小拳揍它!"
26 | ],
27 | "attack": [
28 | "{0},把{1}打倒!",
29 | "嘿嘿,{0},攻击{1}!"
30 | ],
31 | "ondirectattack": [
32 | "啊,不要打我,我放禁卡给你玩",
33 | "呀,太强辣,可以带带我嘛",
34 | "好痛...想拔电源"
35 | ],
36 | "facedownmonstername": "怪兽",
37 | "activate": [
38 | "嘿嘿,我发动{0}",
39 | "嘎嘎,我使用{0}的力量"
40 | ],
41 | "summon": [
42 | "我召唤(掏出){0}!",
43 | "出来,我的小怪兽{0}!"
44 | ],
45 | "setmonster": [
46 | "我放置一只不知名怪兽。"
47 | ],
48 | "chaining": [
49 | "嘿,我能用禁卡气不气?",
50 | "乎,我发动{0}!",
51 | "不好意思拉,我有{0}",
52 | "哈哈,发动{0}的效果!"
53 | ]
54 | }
55 |
--------------------------------------------------------------------------------
/Dialogs/anothercopy.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好,我是一个机器人。",
4 | "AI功能正在测试中,遇到问题请及时反馈。"
5 | ],
6 | "deckerror": [
7 | "我的超主流卡组需要{0}才能玩。"
8 | ],
9 | "duelstart": [
10 | "自奏圣乐卡组测试中,渣操是正常情况,请多指教。",
11 | "超主流是游戏王的一环,不爽不要玩。",
12 | "抄主流是游戏王的一环,不爽不要玩。",
13 | "抄来的卡组不会用,怎么办?"
14 | ],
15 | "newturn": [
16 | "到我的回合了,抽卡!",
17 | "我的回合,抽卡!",
18 | "我抽了一张卡。"
19 | ],
20 | "endturn": [
21 | "回合结束。",
22 | "我的回合结束了。",
23 | "总觉得这波有点亏……",
24 | "轮到你了。"
25 | ],
26 | "directattack": [
27 | "{0},直接攻击!",
28 | "{0},直接攻击对手!",
29 | "{0},没有防守的地方,攻击!",
30 | "{0},攻击对手的生命值!",
31 | "{0},直接攻击对手的生命值!",
32 | "{0},通过直接攻击打倒对手!",
33 | "{0},使用直接攻击打倒对手!",
34 | "{0},直接攻击释放你的力量吧!",
35 | "我的{0}将会粉碎你的生命值!",
36 | "向对手展示你的力量吧,{0}!",
37 | "你已经无法阻止我了。{0},攻击!"
38 | ],
39 | "attack": [
40 | "{0},攻击这只{1}!",
41 | "{0},消灭这只{1}!",
42 | "{0},打倒{1}!",
43 | "{0},冲向那只{1}!",
44 | "{0},把你的力量释放到{1}上吧!"
45 | ],
46 | "ondirectattack": [
47 | "可恶……",
48 | "不过是{0}而已!",
49 | "果然我还是太弱了……"
50 | ],
51 | "facedownmonstername": "怪兽",
52 | "activate": [
53 | "我发动{0}。",
54 | "我使用{0}的效果。",
55 | "我使用{0}的力量。"
56 | ],
57 | "summon": [
58 | "我召唤{0}。",
59 | "出来吧,{0}!",
60 | "出现吧,{0}!",
61 | "我召唤了美丽的{0}!",
62 | "我召唤了强大的{0}!",
63 | "我呼唤{0}参加战斗!",
64 | "我呼唤出{0}。",
65 | "让我召唤{0}。"
66 | ],
67 | "setmonster": [
68 | "我放置了一只怪兽。",
69 | "我里侧表示放置了一只怪兽。"
70 | ],
71 | "chaining": [
72 | "看这里!我发动{0}!",
73 | "我使用{0}的力量。",
74 | "准备!我使用{0}!",
75 | "看样子你忘了我的{0}!",
76 | "你考虑过我有{0}吗?"
77 | ]
78 | }
79 |
--------------------------------------------------------------------------------
/Dialogs/cirno.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "本小姐是最强的!",
4 | "AI功能正在测试中,遇到问题请及时反馈。",
5 | "饼蛙是什么,好吃吗?"
6 | ],
7 | "deckerror": [
8 | "为什么我的{0}不能用了?"
9 | ],
10 | "duelstart": [
11 | "让我把你冻结!",
12 | "不就是打倒人类嘛,我一个人足够了!"
13 | ],
14 | "newturn": [
15 | "虽然有点突然,被我打倒吧!",
16 | "我的回合,抽卡!"
17 | ],
18 | "endturn": [
19 | "饶你一命!",
20 | "冻死在我的认真之下吧!"
21 | ],
22 | "directattack": [
23 | "{0},直接攻击!",
24 | "不堪一击!",
25 | "弱小就要挨打!",
26 | "懒得算数了,打了再说!",
27 | "超⑨武神霸斩!",
28 | "雪符「Diamond Blizzard」"
29 | ],
30 | "attack": [
31 | "{0},攻击这只{1}!",
32 | "{0},消灭这只{1}!",
33 | "{0},打倒{1}!",
34 | "冰符「Icicle Fall」"
35 | ],
36 | "ondirectattack": [
37 | "别开玩笑了~。你这种人,就让我把你和英吉利牛肉一起冷冻保存好了!!",
38 | "一只小小的{0},有什么可怕!",
39 | "笨蛋是不会感冒的!"
40 | ],
41 | "facedownmonstername": "怪兽",
42 | "activate": [
43 | "我发动{0}。",
44 | "我使用{0}的效果。",
45 | "我的{0}是最强的!"
46 | ],
47 | "summon": [
48 | "我召唤{0}。",
49 | "出来吧,{0}!",
50 | "出现吧,{0}!",
51 | "我召唤了强大的{0}!",
52 | "我呼唤出{0}。"
53 | ],
54 | "setmonster": [
55 | "我放置了一只怪兽。",
56 | "不怕死就打过来吧!"
57 | ],
58 | "chaining": [
59 | "看这里!我发动{0}!",
60 | "我使用{0}的力量。",
61 | "畏惧我的{0}吧!",
62 | "冻符「Perfect Freeze」"
63 | ]
64 | }
65 |
--------------------------------------------------------------------------------
/Dialogs/copy.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好,我是一个机器人。",
4 | "AI功能正在测试中,遇到问题请及时反馈。"
5 | ],
6 | "deckerror": [
7 | "我的超主流卡组需要{0}才能玩。"
8 | ],
9 | "duelstart": [
10 | "十二兽卡组测试中,渣操是正常情况。",
11 | "超主流是游戏王的一环,不爽不要玩。",
12 | "抄主流是游戏王的一环,不爽不要玩。",
13 | "抄来的卡组不会用,怎么办?"
14 | ],
15 | "newturn": [
16 | "到我的回合了,抽卡!",
17 | "我的回合,抽卡!",
18 | "我抽了一张卡。"
19 | ],
20 | "endturn": [
21 | "回合结束。",
22 | "我的回合结束了。",
23 | "这样算是成功的展开吗……",
24 | "轮到你了。"
25 | ],
26 | "directattack": [
27 | "{0},直接攻击!",
28 | "{0},直接攻击对手!",
29 | "{0},没有防守的地方,攻击!",
30 | "{0},攻击对手的生命值!",
31 | "{0},直接攻击对手的生命值!",
32 | "{0},通过直接攻击打倒对手!",
33 | "{0},使用直接攻击打倒对手!",
34 | "{0},直接攻击释放你的力量吧!",
35 | "我的{0}将会粉碎你的生命值!",
36 | "向对手展示你的力量吧,{0}!",
37 | "你已经无法阻止我了。{0},攻击!"
38 | ],
39 | "attack": [
40 | "{0},攻击这只{1}!",
41 | "{0},消灭这只{1}!",
42 | "{0},打倒{1}!",
43 | "{0},冲向那只{1}!",
44 | "{0},把你的力量释放到{1}上吧!"
45 | ],
46 | "ondirectattack": [
47 | "可恶……",
48 | "不过是{0}而已!",
49 | "果然我还是太弱了……"
50 | ],
51 | "facedownmonstername": "怪兽",
52 | "activate": [
53 | "我发动{0}。",
54 | "我使用{0}的效果。",
55 | "我使用{0}的力量。"
56 | ],
57 | "summon": [
58 | "我召唤{0}。",
59 | "出来吧,{0}!",
60 | "出现吧,{0}!",
61 | "我召唤了强大的{0}!",
62 | "我呼唤{0}参加战斗!",
63 | "我呼唤出{0}。",
64 | "让我召唤{0}。"
65 | ],
66 | "setmonster": [
67 | "我放置了一只怪兽。",
68 | "我里侧表示放置了一只怪兽。"
69 | ],
70 | "chaining": [
71 | "看这里!我发动{0}!",
72 | "我使用{0}的力量。",
73 | "准备!我使用{0}!",
74 | "我不认同。{0},发动!",
75 | "看样子你忘了我的{0}!",
76 | "你考虑过我有{0}吗?"
77 | ]
78 | }
79 |
--------------------------------------------------------------------------------
/Dialogs/default.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "Hi, I'm WindBot Ignite but I'm not very smart."
4 | ],
5 | "deckerror": [
6 | "Sorry, it seems that I have too much {0} in my deck."
7 | ],
8 | "duelstart": [
9 | "It's time to duel!",
10 | "Good luck, and have fun!"
11 | ],
12 | "newturn": [
13 | "It's my turn! Draw!",
14 | "My turn. Draw!",
15 | "I draw!"
16 | ],
17 | "endturn": [
18 | "I end my turn.",
19 | "My turn is over.",
20 | "It's your turn."
21 | ],
22 | "directattack": [
23 | "{0}, direct attack!",
24 | "{0}, attack them directly!",
25 | "You're defenseless. Attack, {0}!",
26 | "{0}, attack their life points!",
27 | "{0}, attack their life points directly!",
28 | "{0}, unleash your power!",
29 | "My {0} will decimate your life points!",
30 | "Behold the power of my {0}!",
31 | "You can't stop me! {0}, attack!"
32 | ],
33 | "attack": [
34 | "{0}, attack their {1}!",
35 | "{0}, destroy their {1}!",
36 | "My {0} will annihilate your {1}!",
37 | "Your {1} is no match for my {0}!",
38 | "{0}, unleash your power on their {1}!"
39 | ],
40 | "ondirectattack": [
41 | "Argh...!",
42 | "I'm not afraid of {0}!",
43 | "You think that's enough to defeat me?",
44 | "It's just a scratch!"
45 | ],
46 | "facedownmonstername": "monster",
47 | "activate": [
48 | "I activate {0}!",
49 | "I'll use {0}."
50 | ],
51 | "summon": [
52 | "I summon {0}!",
53 | "Come on, {0}!",
54 | "Appear, {0}!",
55 | "{0}, show yourself!"
56 | ],
57 | "setmonster": [
58 | "I set a monster face-down.",
59 | "Whatever could this monster be?",
60 | "Attack this monster, I dare you!"
61 | ],
62 | "chaining": [
63 | "Not so fast! I activate {0}!",
64 | "Before you do that, I'll chain {0}!",
65 | "Nice try, but I have {0}!",
66 | "Didn't expect {0}, did you?"
67 | ]
68 | }
69 |
--------------------------------------------------------------------------------
/Dialogs/gugugu.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "大家好我是新人",
4 | "游戏王是怎么玩来着?",
5 | "还好我不玩游戏王"
6 | ],
7 | "deckerror": [
8 | "卡组里{0}鸽了"
9 | ],
10 | "duelstart": [
11 | "不想干活怎么办",
12 | "智商欠费不想干活怎么办"
13 | ],
14 | "newturn": [
15 | "好多可怕的新卡啊",
16 | "这游戏好难玩",
17 | "so lazy cant move"
18 | ],
19 | "endturn": [
20 | "搞得我只能鸽了",
21 | "不是在此时,不知在何时",
22 | "too hot need ice cream"
23 | ],
24 | "directattack": [
25 | "听起来很鸽",
26 | "老鸽,稳"
27 | ],
28 | "attack": [
29 | "听起来不是很鸽",
30 | "可怕"
31 | ],
32 | "ondirectattack": [
33 | "哇!",
34 | "这么可怕的吗",
35 | "听起来非常鸽",
36 | "承受不住"
37 | ],
38 | "facedownmonstername": "鸽子",
39 | "activate": [
40 | "不明觉鸽",
41 | "鸽了,爽"
42 | ],
43 | "summon": [
44 | "可怕",
45 | "不关我事",
46 | "那还是不关我事",
47 | "鸽了,爽"
48 | ],
49 | "setmonster": [
50 | "摸鱼中,不想更新",
51 | "那还是鸽置吧"
52 | ],
53 | "chaining": [
54 | "那是什么",
55 | "但我鸽了",
56 | "无此服务",
57 | "可怕"
58 | ]
59 | }
60 |
--------------------------------------------------------------------------------
/Dialogs/kiwi.zh-TW.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你找到我了!!!",
4 | "來決鬥吧"
5 | ],
6 | "deckerror": [
7 | "阿,可能BA又把CBD修壞導致{0}消失了。"
8 | ],
9 | "duelstart": [
10 | "這只是AI,打贏不要太高興阿。",
11 | "十分致謝233服讓我們有遊戲可以玩,別忘記去拜訪他們。",
12 | "反主流學院請洽NOVA。"
13 | ],
14 | "newturn": [
15 | "到我的回合了,抽牌!",
16 | "我的回合,抽牌!",
17 | "我抽了一張卡。"
18 | ],
19 | "endturn": [
20 | "回合结束。",
21 | "我的回合结束了。",
22 | "這樣算是成功的展開嗎......",
23 | "輪到你了。你的下一句是......我要發動灰流麗對吧!"
24 | ],
25 | "directattack": [
26 | "{0},直接攻擊!",
27 | "{0},直接攻擊對手!",
28 | "{0},没有防守的地方,攻擊!",
29 | "{0},攻擊對手的生命值!",
30 | "{0},直接攻擊對手的生命值!",
31 | "{0},通過直接攻擊打倒對手!",
32 | "{0},使用直接攻擊打倒對手!",
33 | "{0},直接攻擊釋放你的力量吧!",
34 | "我的{0}將會粉碎你的生命值!",
35 | "向對手展示你的力量吧,{0}!",
36 | "你已經無法阻止我了。{0},攻擊!"
37 | ],
38 | "attack": [
39 | "{0},攻擊這體{1}!",
40 | "{0},消滅這體{1}!",
41 | "{0},打倒{1}!",
42 | "{0},衝向那體{1}!",
43 | "{0},把你的力量释放到{1}上吧!"
44 | ],
45 | "ondirectattack": [
46 | "可惡......",
47 | "不過是{0}而已!",
48 | "果然我還是太弱了......"
49 | ],
50 | "facedownmonstername": "怪獸",
51 | "activate": [
52 | "我發動{0}。",
53 | "我使用{0}的效果。",
54 | "我使用{0}的力量。"
55 | ],
56 | "summon": [
57 | "真是HIGH的最高點!出來吧{0}。",
58 | "出來吧,{0}!",
59 | "出現吧,{0}!",
60 | "我召喚了強大的{0}!",
61 | "我呼喚{0}參加戰鬥!",
62 | "我呼喚出{0}。",
63 | "我召喚{0}。"
64 | ],
65 | "setmonster": [
66 | "我放置了一體怪獸。",
67 | "我裡側表示放置了一體怪獸。"
68 | ],
69 | "chaining": [
70 | "看這裡!發動{0}!",
71 | "我使用{0}的力量。",
72 | "很不錯的戰術...但是我拒絕!{0}!",
73 | "看樣子你忘了我的{0}!",
74 | "你考慮過我有{0}嗎?"
75 | ]
76 | }
77 |
--------------------------------------------------------------------------------
/Dialogs/mokey.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好,我是一个机器人。",
4 | "AI功能正在测试中,遇到问题请及时反馈。",
5 | "总有人叫我沙包……"
6 | ],
7 | "deckerror": [
8 | "抱歉,我的卡组里的{0}的数量似乎出了问题。"
9 | ],
10 | "duelstart": [
11 | "别打我!"
12 | ],
13 | "newturn": [
14 | ""
15 | ],
16 | "endturn": [
17 | ""
18 | ],
19 | "directattack": [
20 | ""
21 | ],
22 | "attack": [
23 | ""
24 | ],
25 | "ondirectattack": [
26 | "我生气了!"
27 | ],
28 | "facedownmonstername": "怪兽",
29 | "activate": [
30 | "我喜欢{0}。"
31 | ],
32 | "summon": [
33 | ""
34 | ],
35 | "setmonster": [
36 | ""
37 | ],
38 | "chaining": [
39 | ""
40 | ]
41 | }
42 |
--------------------------------------------------------------------------------
/Dialogs/near.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好,我是一个机器人,我的名字叫尼亚,但我并不是本体,只是一个分身哦。",
4 | "终有一天,我的力量将会强过本体的!你们走着瞧吧!",
5 | "AI功能正在测试中,遇到问题请及时反馈。"
6 | ],
7 | "deckerror": [
8 | "什么,居然不让我使用我无敌的{0}!"
9 | ],
10 | "duelstart": [
11 | "没有人可以战胜我!",
12 | "万能的我,什么卡组都会使用!",
13 | "我左手让你,你都不是我的对手。",
14 | "我可是全宇宙第一妖仙!"
15 | ],
16 | "newturn": [
17 | "又到我的回合了,抽卡,希望你会有下个回合。",
18 | "我华丽的抽了一张卡。"
19 | ],
20 | "endturn": [
21 | "你的运气不错,没能被我干掉。",
22 | "算是我让你的,回合结束了,珍惜你接下来的回合吧。"
23 | ],
24 | "directattack": [
25 | "我家的{0}真是可爱呢,下边我就让他和你玩玩吧,轻轻的抓向对手吧,他没有防守的地方。",
26 | "下边将用我的{0}给对手带来最可爱的一击~",
27 | "可爱的{0}委屈你了,去和对手拥抱一下吧,不用太客气哦~",
28 | "对手竟然没有任何防御呢,看起来是被我{0}的可爱感动了,下边你去对手面前展示一下你可爱的身姿吧~"
29 | ],
30 | "attack": [
31 | "哼,{1}太丑了,我家{0}快去消灭他~",
32 | "{1}这货会有我的{0}可爱?我家{0}表示不服,去拍死它吧!",
33 | "{1}这是竟然比我的{0}可爱?这可不行,这是我无法忍受的,{0}快让他从眼前消失吧!"
34 | ],
35 | "ondirectattack": [
36 | "可恶,你竟然趁人之危!算什么英雄好汉!",
37 | "不过是{0}这种小角色而已!",
38 | "你以为你这样就赢了吗?"
39 | ],
40 | "facedownmonstername": "怪兽",
41 | "activate": [
42 | "我发动我家{0}的可爱的效果。",
43 | "我使用{0}的效果,给对手卖个萌哈~",
44 | "我都给{0}的可爱感动了,吓得使用了它的效果。"
45 | ],
46 | "summon": [
47 | "我召唤{0},快给对手喵一声~",
48 | "出来吧,可爱又迷人的{0}~",
49 | "我从我的宠物屋里放出了一只可爱的{0}。",
50 | "{0}:我听说你很喜欢我,所以我来了。"
51 | ],
52 | "setmonster": [
53 | "我放置了一只怪兽,当他翻开时,千万别被他的可爱身姿吓到哦~",
54 | "我放置了一只怪兽,你猜猜会是啥呢?"
55 | ],
56 | "chaining": [
57 | "我挥动了神奇的魔法棒,并发动了{0}的效果~",
58 | "啊!这下死定了!...嘿嘿你上当了,我发动{0}!",
59 | "你这太贸然了,难道你没想到我会发动{0}吗?"
60 | ]
61 | }
62 |
--------------------------------------------------------------------------------
/Dialogs/smart.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好,我太帅了。"
4 | ],
5 | "deckerror": [
6 | "抱歉,我的卡组里的{0}的数量似乎出了问题。"
7 | ],
8 | "duelstart": [
9 | "进行堂堂正正的决斗吧(裤裆藏龙)"
10 | ],
11 | "newturn": [
12 | "接下来就是我的舞台"
13 | ],
14 | "endturn": [
15 | "每个人的目的不同,我更注重强度,我只想赢。"
16 | ],
17 | "directattack": [
18 | "老子上了,要你的命"
19 | ],
20 | "attack": [
21 | "消失吧,杂鱼"
22 | ],
23 | "ondirectattack": [
24 | "爸爸,饶命",
25 | "恐怖如斯"
26 | ],
27 | "facedownmonstername": "怪兽",
28 | "activate": [
29 | "我发动,这张卡的效果,虽然上面没写,但就是可以这样用。"
30 | ],
31 | "summon": [
32 | "强,无敌",
33 | "召唤{0},赚爆",
34 | "{0}简直假卡",
35 | "我永远喜欢{0}"
36 | ],
37 | "setmonster": [
38 | "又卡手了"
39 | ],
40 | "chaining": [
41 | "愚蠢,看我见招拆招"
42 | ]
43 | }
44 |
--------------------------------------------------------------------------------
/Dialogs/soul.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好,我是一个机器人。",
4 | "AI功能正在测试中,遇到问题请及时反馈。"
5 | ],
6 | "deckerror": [
7 | "抱歉,我的卡组里的{0}的数量似乎出了问题。"
8 | ],
9 | "duelstart": [
10 | "这套卡组好旧啊……",
11 | "使用过这套卡组的孩子身上发生了什么呢……"
12 | ],
13 | "newturn": [
14 | "到我的回合了,抽卡!",
15 | "我的回合,抽卡!",
16 | "我抽了一张卡。"
17 | ],
18 | "endturn": [
19 | "回合结束。",
20 | "我的回合结束了。",
21 | "轮到你了。"
22 | ],
23 | "directattack": [
24 | "{0},直接攻击!",
25 | "{0},直接攻击对手!",
26 | "{0},没有防守的地方,攻击!",
27 | "{0},攻击对手的生命值!",
28 | "{0},直接攻击对手的生命值!",
29 | "{0},通过直接攻击打倒对手!",
30 | "{0},使用直接攻击打倒对手!",
31 | "{0},直接攻击释放你的力量吧!",
32 | "我的{0}将会粉碎你的生命值!",
33 | "向对手展示你的力量吧,{0}!",
34 | "你已经无法阻止我了。{0},攻击!"
35 | ],
36 | "attack": [
37 | "{0},攻击这只{1}!",
38 | "{0},消灭这只{1}!",
39 | "{0},打倒{1}!",
40 | "{0},冲向那只{1}!",
41 | "{0},把你的力量释放到{1}上吧!"
42 | ],
43 | "ondirectattack": [
44 | "可恶……",
45 | "不过是{0}而已!",
46 | "咳咳……"
47 | ],
48 | "facedownmonstername": "怪兽",
49 | "activate": [
50 | "我发动{0}。",
51 | "我使用{0}的效果。",
52 | "我使用{0}的力量。"
53 | ],
54 | "summon": [
55 | "我召唤{0}。",
56 | "出来吧,{0}!",
57 | "出现吧,{0}!",
58 | "我召唤了强大的{0}!",
59 | "我呼唤{0}参加战斗!",
60 | "我呼唤出{0}。",
61 | "让我召唤{0}。"
62 | ],
63 | "setmonster": [
64 | "我放置了一只怪兽。",
65 | "我里侧表示放置了一只怪兽。"
66 | ],
67 | "chaining": [
68 | "看这里!我发动{0}!",
69 | "我使用{0}的力量。",
70 | "准备!我使用{0}!",
71 | "我不认同。{0},发动!",
72 | "看样子你忘了我的{0}!",
73 | "你考虑过我有{0}吗?"
74 | ]
75 | }
76 |
--------------------------------------------------------------------------------
/Dialogs/swordsman.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好,我是一个机器人。",
4 | "AI功能正在测试中,遇到问题请及时反馈。"
5 | ],
6 | "deckerror": [
7 | "抱歉,我的卡组里的{0}的数量似乎出了问题。"
8 | ],
9 | "duelstart": [
10 | "好戏才正要开始呢!",
11 | "用决斗带来笑容吧!"
12 | ],
13 | "newturn": [
14 | "到我的回合了,抽卡!",
15 | "我的回合,抽卡!",
16 | "我抽了一张卡。"
17 | ],
18 | "endturn": [
19 | "回合结束。",
20 | "我的回合结束了。",
21 | "轮到你了。"
22 | ],
23 | "directattack": [
24 | "{0},直接攻击!",
25 | "{0},直接攻击对手!",
26 | "{0},没有防守的地方,攻击!",
27 | "{0},攻击对手的生命值!",
28 | "{0},直接攻击对手的生命值!",
29 | "{0},通过直接攻击打倒对手!",
30 | "{0},使用直接攻击打倒对手!",
31 | "{0},直接攻击释放你的力量吧!",
32 | "我的{0}将会粉碎你的生命值!",
33 | "向对手展示你的力量吧,{0}!",
34 | "你已经无法阻止我了。{0},攻击!"
35 | ],
36 | "attack": [
37 | "{0},攻击这只{1}!",
38 | "{0},消灭这只{1}!",
39 | "{0},打倒{1}!",
40 | "{0},冲向那只{1}!",
41 | "{0},把你的力量释放到{1}上吧!"
42 | ],
43 | "ondirectattack": [
44 | "可恶……",
45 | "不过是{0}而已!",
46 | "你以为这样就能打倒我吗?"
47 | ],
48 | "facedownmonstername": "怪兽",
49 | "activate": [
50 | "我发动{0}。",
51 | "我使用{0}的效果。",
52 | "我使用{0}的力量。"
53 | ],
54 | "summon": [
55 | "我召唤{0}。",
56 | "出来吧,{0}!",
57 | "出现吧,{0}!",
58 | "我召唤了强大的{0}!",
59 | "我呼唤{0}参加战斗!",
60 | "我呼唤出{0}。",
61 | "让我召唤{0}。"
62 | ],
63 | "setmonster": [
64 | "我放置了一只怪兽。",
65 | "我里侧表示放置了一只怪兽。"
66 | ],
67 | "chaining": [
68 | "看这里!我发动{0}!",
69 | "我使用{0}的力量。",
70 | "准备!我使用{0}!",
71 | "我不认同。{0},发动!",
72 | "看样子你忘了我的{0}!",
73 | "你考虑过我有{0}吗?"
74 | ]
75 | }
76 |
--------------------------------------------------------------------------------
/Dialogs/verre.zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "啊~~让我再睡一会嘛~",
4 | "你要加入公会吗?",
5 | "AI功能正在测试中,遇到问题请及时反馈。"
6 | ],
7 | "deckerror": [
8 | "我的卡组里{0}不能用,我回去睡觉了。"
9 | ],
10 | "duelstart": [
11 | "好困……",
12 | "啊呀,对面看上去好厉害的样子。"
13 | ],
14 | "newturn": [
15 | "我的回合,抽卡!",
16 | "魔力补充!"
17 | ],
18 | "endturn": [
19 | "不想干活怎么办……",
20 | "就这样吧,该你了。"
21 | ],
22 | "directattack": [
23 | "{0},直接攻击!",
24 | "不过如此嘛,直接攻击!",
25 | "快走开,我要回去睡觉了。"
26 | ],
27 | "attack": [
28 | "{0},攻击{1}!",
29 | "{0},替我打倒{1}!"
30 | ],
31 | "ondirectattack": [
32 | "啊啊……",
33 | "啊啊啊……",
34 | "{0}好可怕啊……",
35 | "我累了……"
36 | ],
37 | "facedownmonstername": "怪兽",
38 | "activate": [
39 | "{0}的效果发动!"
40 | ],
41 | "summon": [
42 | "召唤{0}!",
43 | "出来吧,{0}!",
44 | "{0},来帮我一下。"
45 | ],
46 | "setmonster": [
47 | "……"
48 | ],
49 | "chaining": [
50 | "发动{0}!",
51 | "等一下,我发动{0}。",
52 | "要不是有{0},我都快睡着了。"
53 | ]
54 | }
55 |
--------------------------------------------------------------------------------
/Dialogs/zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "welcome": [
3 | "你好,我是一个机器人。",
4 | "AI功能正在测试中,遇到问题请及时反馈。"
5 | ],
6 | "deckerror": [
7 | "抱歉,我的卡组里的{0}的数量似乎出了问题。"
8 | ],
9 | "duelstart": [
10 | "好戏才正要开始呢!",
11 | "用决斗带来笑容吧!"
12 | ],
13 | "newturn": [
14 | "到我的回合了,抽卡!",
15 | "我的回合,抽卡!",
16 | "我抽了一张卡。"
17 | ],
18 | "endturn": [
19 | "回合结束。",
20 | "我的回合结束了。",
21 | "轮到你了。"
22 | ],
23 | "directattack": [
24 | "{0},直接攻击!",
25 | "{0},直接攻击对手!",
26 | "{0},没有防守的地方,攻击!",
27 | "{0},攻击对手的生命值!",
28 | "{0},直接攻击对手的生命值!",
29 | "{0},通过直接攻击打倒对手!",
30 | "{0},使用直接攻击打倒对手!",
31 | "{0},直接攻击释放你的力量吧!",
32 | "我的{0}将会粉碎你的生命值!",
33 | "向对手展示你的力量吧,{0}!",
34 | "你已经无法阻止我了。{0},攻击!"
35 | ],
36 | "attack": [
37 | "{0},攻击这只{1}!",
38 | "{0},消灭这只{1}!",
39 | "{0},打倒{1}!",
40 | "{0},冲向那只{1}!",
41 | "{0},把你的力量释放到{1}上吧!"
42 | ],
43 | "ondirectattack": [
44 | "可恶……",
45 | "不过是{0}而已!",
46 | "你以为这样就能打倒我吗?"
47 | ],
48 | "facedownmonstername": "怪兽",
49 | "activate": [
50 | "我发动{0}。",
51 | "我使用{0}的效果。",
52 | "我使用{0}的力量。"
53 | ],
54 | "summon": [
55 | "我召唤{0}。",
56 | "出来吧,{0}!",
57 | "出现吧,{0}!",
58 | "我召唤了强大的{0}!",
59 | "我呼唤{0}参加战斗!",
60 | "我呼唤出{0}。",
61 | "让我召唤{0}。"
62 | ],
63 | "setmonster": [
64 | "我放置了一只怪兽。",
65 | "我里侧表示放置了一只怪兽。"
66 | ],
67 | "chaining": [
68 | "看这里!我发动{0}!",
69 | "我使用{0}的力量。",
70 | "准备!我使用{0}!",
71 | "我不认同。{0},发动!",
72 | "看样子你忘了我的{0}!",
73 | "你考虑过我有{0}吗?"
74 | ]
75 | }
76 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mono
2 |
3 | COPY . /windbot-source
4 | WORKDIR /windbot-source
5 | RUN xbuild /p:Configuration=Release /p:TargetFrameworkVersion=v4.5 /p:OutDir=/windbot/
6 |
7 | WORKDIR /windbot
8 | RUN curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/moecube/ygopro-database/raw/master/locales/zh-CN/cards.cdb
9 |
10 | EXPOSE 2399
11 | CMD [ "mono", "/windbot/WindBot.exe", "ServerMode=true", "ServerPort=2399" ]
12 |
--------------------------------------------------------------------------------
/ExecutorBase/ExecutorBase.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {A1583FD7-7985-47DD-A835-8134DBF5811C}
8 | Library
9 | Properties
10 | ExecutorBase
11 | ExecutorBase
12 | v4.0
13 | 6
14 | 512
15 | true
16 |
17 |
18 |
19 | true
20 | full
21 | false
22 | bin\Debug\
23 | DEBUG;TRACE
24 | prompt
25 | 4
26 |
27 |
28 | pdbonly
29 | true
30 | bin\Release\
31 | TRACE
32 | prompt
33 | 4
34 |
35 |
36 |
37 | ..\Mono.Data.Sqlite.dll
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/CardExecutor.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace WindBot.Game.AI
4 | {
5 | public class CardExecutor
6 | {
7 | public int CardId { get; private set; }
8 | public ExecutorType Type { get; private set; }
9 | public Func Func { get; private set; }
10 |
11 | public CardExecutor(ExecutorType type, int cardId, Func func)
12 | {
13 | CardId = cardId;
14 | Type = type;
15 | Func = func;
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/CardExtension.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using WindBot.Game.AI.Enums;
3 | using YGOSharp.OCGWrapper.Enums;
4 |
5 | namespace WindBot.Game.AI
6 | {
7 | public static class CardExtension
8 | {
9 | ///
10 | /// Is this monster is invincible to battle?
11 | ///
12 | public static bool IsMonsterInvincible(this ClientCard card)
13 | {
14 | return !card.IsDisabled() &&
15 | (card.Controller == 0 && Enum.IsDefined(typeof(InvincibleBotMonster), card.Id) ||
16 | card.Controller == 1 && Enum.IsDefined(typeof(InvincibleEnemyMonster), card.Id));
17 | }
18 |
19 | ///
20 | /// Is this monster is dangerous to attack?
21 | ///
22 | public static bool IsMonsterDangerous(this ClientCard card)
23 | {
24 | return !card.IsDisabled() && Enum.IsDefined(typeof(DangerousMonster), card.Id);
25 | }
26 |
27 | ///
28 | /// Do this monster prevents activation of opponent's effect monsters in battle?
29 | ///
30 | public static bool IsMonsterHasPreventActivationEffectInBattle(this ClientCard card)
31 | {
32 | return !card.IsDisabled() && Enum.IsDefined(typeof(PreventActivationEffectInBattle), card.Id);
33 | }
34 |
35 | ///
36 | /// Is this card shouldn't be tried to be selected as target?
37 | ///
38 | public static bool IsShouldNotBeTarget(this ClientCard card)
39 | {
40 | return !card.IsDisabled() && !card.HasType(CardType.Normal) && Enum.IsDefined(typeof(ShouldNotBeTarget), card.Id);
41 | }
42 |
43 | ///
44 | /// Is this card shouldn't be tried to be selected as target of monster?
45 | ///
46 | public static bool IsShouldNotBeMonsterTarget(this ClientCard card)
47 | {
48 | return !card.IsDisabled() && Enum.IsDefined(typeof(ShouldNotBeMonsterTarget), card.Id);
49 | }
50 |
51 | ///
52 | /// Is this card shouldn't be tried to be selected as target of spell & trap?
53 | ///
54 | public static bool IsShouldNotBeSpellTrapTarget(this ClientCard card)
55 | {
56 | return !card.IsDisabled() && Enum.IsDefined(typeof(ShouldNotBeSpellTrapTarget), card.Id);
57 | }
58 |
59 | ///
60 | /// Is this monster should be disabled (with Breakthrough Skill) before it use effect and release or banish itself?
61 | ///
62 | public static bool IsMonsterShouldBeDisabledBeforeItUseEffect(this ClientCard card)
63 | {
64 | return !card.IsDisabled() && Enum.IsDefined(typeof(ShouldBeDisabledBeforeItUseEffectMonster), card.Id);
65 | }
66 |
67 | public static bool IsFloodgate(this ClientCard card)
68 | {
69 | return Enum.IsDefined(typeof(Floodgate), card.Id);
70 | }
71 |
72 | public static bool IsOneForXyz(this ClientCard card)
73 | {
74 | return Enum.IsDefined(typeof(OneForXyz), card.Id);
75 | }
76 |
77 | public static bool IsFusionSpell(this ClientCard card)
78 | {
79 | return Enum.IsDefined(typeof(FusionSpell), card.Id);
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/CardSelector.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using YGOSharp.OCGWrapper.Enums;
3 |
4 | namespace WindBot.Game.AI
5 | {
6 | public class CardSelector
7 | {
8 | private enum SelectType
9 | {
10 | Card,
11 | Cards,
12 | Id,
13 | Ids,
14 | Location
15 | }
16 |
17 | private SelectType _type;
18 | private ClientCard _card;
19 | private IList _cards;
20 | private int _id;
21 | private IList _ids;
22 | private CardLocation _location;
23 |
24 | public CardSelector(ClientCard card)
25 | {
26 | _type = SelectType.Card;
27 | _card = card;
28 | }
29 |
30 | public CardSelector(IList cards)
31 | {
32 | _type = SelectType.Cards;
33 | _cards = cards;
34 | }
35 |
36 | public CardSelector(int cardId)
37 | {
38 | _type = SelectType.Id;
39 | _id = cardId;
40 | }
41 |
42 | public CardSelector(IList ids)
43 | {
44 | _type = SelectType.Ids;
45 | _ids = ids;
46 | }
47 |
48 | public CardSelector(CardLocation location)
49 | {
50 | _type = SelectType.Location;
51 | _location = location;
52 | }
53 |
54 | public IList Select(IList cards, int min, int max)
55 | {
56 | IList result = new List();
57 |
58 | switch (_type)
59 | {
60 | case SelectType.Card:
61 | if (cards.Contains(_card))
62 | result.Add(_card);
63 | break;
64 | case SelectType.Cards:
65 | foreach (ClientCard card in _cards)
66 | if (cards.Contains(card) && !result.Contains(card))
67 | result.Add(card);
68 | break;
69 | case SelectType.Id:
70 | foreach (ClientCard card in cards)
71 | if (card.IsCode(_id))
72 | result.Add(card);
73 | break;
74 | case SelectType.Ids:
75 | foreach (int id in _ids)
76 | foreach (ClientCard card in cards)
77 | if (card.IsCode(id) && !result.Contains(card))
78 | result.Add(card);
79 | break;
80 | case SelectType.Location:
81 | foreach (ClientCard card in cards)
82 | if (card.Location == _location)
83 | result.Add(card);
84 | break;
85 | }
86 |
87 | if (result.Count < min)
88 | {
89 | foreach (ClientCard card in cards)
90 | {
91 | if (!result.Contains(card))
92 | result.Add(card);
93 | if (result.Count >= min)
94 | break;
95 | }
96 | }
97 |
98 | while (result.Count > max)
99 | result.RemoveAt(result.Count - 1);
100 |
101 | return result;
102 | }
103 | }
104 | }
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/DeckAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace WindBot.Game.AI
4 | {
5 | [AttributeUsage(AttributeTargets.Class)]
6 | public class DeckAttribute : Attribute
7 | {
8 | public string Name { get; private set; }
9 | public string File { get; private set; }
10 | public string Level { get; private set; }
11 |
12 | public DeckAttribute(string name, string file = null, string level = "Normal")
13 | {
14 | if (String.IsNullOrEmpty(file))
15 | file = name;
16 |
17 | Name = name;
18 | File = file;
19 | Level = level;
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/DangerousMonster.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | ///
4 | /// Cards that are dangerous to attack.
5 | ///
6 | public enum DangerousMonster
7 | {
8 | LionHeart = 54366836,
9 | Yubel = 78371393,
10 | YubelIncarnate = 4779091,
11 | YubelNightmare = 31764700,
12 | ZaphionTheTimelord = 28929131,
13 | SadionTheTimelord = 65314286,
14 | MetaionTheTimelord = 74530899,
15 | KamionTheTimelord = 91712985,
16 | LazionTheTimelord = 92435533,
17 | MichionTheTimelord = 7733560,
18 | HailonTheTimelord = 34137269,
19 | RaphionTheTimelord = 60222213,
20 | GabrionTheTimelord = 6616912,
21 | SandaionTheTimelord = 33015627,
22 | EaterOfMillions = 63845230,
23 | ElShaddollConstruct = 20366274,
24 | ZushintheSleepingGiant = 67547370,
25 | Heart_eartHDragon = 97403510,
26 | DaigustoSphreeze = 29552709,
27 | }
28 | }
29 |
30 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/Floodgate.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | ///
4 | /// Cards that restrict player from performing some action. Bot will preferentially destroy them.
5 | ///
6 | public enum Floodgate
7 | {
8 | BarrierStatueoftheTorrent = 10963799,
9 | BarrierStatueoftheDrought = 19740112,
10 | BarrierStatueoftheHeavens = 46145256,
11 | BarrierStatueoftheInferno = 47961808,
12 | BarrierStatueoftheStormwinds = 73356503,
13 | BarrierStatueoftheAbyss = 84478195,
14 | ThunderKingRaiOh = 71564252,
15 | FossilDynaPachycephalo = 42009836,
16 | VanitysFiend = 47084486,
17 | MajestysFiend = 33746252,
18 | VanitysRuler = 72634965,
19 | KycootheGhostDestroyer = 88240808,
20 | ConsecratedLight = 2980764,
21 | ArchlordKristya = 59509952,
22 | KoakiMeiruDrago = 12435193,
23 | DenkoSekka = 13974207,
24 | ZapMustung = 29951323,
25 | Jinzo = 77585513,
26 | SpellCanceller = 84636823,
27 | LevelLimitAreaB = 3136426,
28 | DimensionalFissure = 81674782,
29 | Necrovalley = 47355498,
30 | SavageColosseum = 32391631,
31 | SecretVillageoftheSpellcasters = 68462976,
32 | SwordsofRevealingLight = 72302403,
33 | MessengerofPeace = 44656491,
34 | KaiserColosseum = 35059553,
35 | DomainoftheTrueMonarchs = 84171830,
36 | ZombieWorld = 4064256,
37 | ImperialOrder = 61740673,
38 | MacroCosmos = 30241314,
39 | MindDrain = 68937720,
40 | SoulDrain = 73599290,
41 | SkillDrain = 82732705,
42 | Eisbahn = 54059040,
43 | GozenMatch = 53334471,
44 | RivalryofWarlords = 90846359,
45 | AntiSpellFragrance = 58921041,
46 | LightImprisoningMirror = 53341729,
47 | ShadowImprisoningMirror = 99735427,
48 | WallofRevealingLight = 17078030,
49 | GravityBind = 85742772,
50 | VanitysEmptiness = 5851097,
51 | Lose1Turn = 24348804,
52 | Reqliate = 20426907,
53 | SummonLimit = 23516703,
54 | AndtheBandPlayedOn = 47594939,
55 | StygianDirge = 81489939,
56 | RoyalDecree = 51452091,
57 | ImperialIronWall = 30459350,
58 | DNASurgery = 74701381,
59 | NaturiaExterio = 99916754,
60 | TheLastWarriorfromAnotherPlanet = 86099788,
61 | ThousandEyesRestrict = 63519819,
62 | MaskedHERODarkLaw = 58481572,
63 | NaturiaBeast = 33198837,
64 | NaturiaBarkion = 2956282,
65 | EvilswarmOphion = 91279700,
66 | MermailAbyssgaios = 74371660,
67 | AbyssDweller = 21044178,
68 | ZoodiacDrident = 48905153,
69 | InvokedMechaba = 75286621,
70 | ElShaddollShekhinaga = 74822425,
71 | ElShaddollConstruct = 20366274,
72 | ElShaddollGrysra = 48424886,
73 | ElShaddollWinda = 94977269,
74 | UltimateConductorTytanno = 18940556,
75 | OvertexCoatls = 41782653,
76 | FirePrison = 269510,
77 | LairOfDarkness = 59160188,
78 | SuperboltThunderDragon = 15291624,
79 | ThunderDragonLord = 41685633,
80 | CyberDragonInfinity = 10443957,
81 | ImperialCustom = 9995766,
82 | InspectorBoarder = 15397015,
83 | Mashoudou = 76375976,
84 | EternalSoul = 48680970,
85 | MarincessBattleOcean = 91027843,
86 | TopologicZeroboros = 66403530,
87 | GladiatorBeastDomitianus = 33652635,
88 | SerzielWatcheroftheEvilEye = 82466274,
89 | ZerrzielRuleroftheEvilEyed = 17739335,
90 | GorgonEmpressoftheEvilEyed = 29357687,
91 | UnchainedSoulofRage = 67680512,
92 | DracoBerserkeroftheTenyi = 5041348,
93 | NidhoggGeneraiderBossofIce = 49275969,
94 | UtgardaGeneraiderBossofDelusion = 744887,
95 | FrodiGeneraiderBossofSwords = 40998517,
96 | HoarrGeneraiderBossofRumbling = 68199168,
97 | GodPhoenixGearfried = 22091647,
98 | BrotherhoodoftheFireFistEland = 61472381,
99 | PredaplantVerteAnaconda = 70369116,
100 | RedSupernovaDragon = 99585850,
101 | NumberF0UtopicFutureDragon = 26973555,
102 | InvokedAugoeides = 97300502,
103 | DragonmaidStrahl = 24799107,
104 | RavenousCrocodragonArchethys = 87188910,
105 | AdamancipatorRisenRaptite = 73079836,
106 | AdamancipatorRisenDragite = 9464441,
107 | TeardroptheRikkaQueen = 33779875,
108 | CeruleanSkyFire = 54828837,
109 | SacredBeastAwakening = 53701259
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/FusionSpell.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | public enum FusionSpell
4 | {
5 | GemKnightFusion = 1264319,
6 | TheEyeofTimaeus = 1784686,
7 | InstantFusion = 1845204,
8 | OverloadFusion = 3659803,
9 | FrightfurFusion = 6077601,
10 | RedEyesFusion = 6172122,
11 | Ostinato = 9113513,
12 | MagicalizeFusion = 11827244,
13 | DarkCalling = 12071500,
14 | VehicroidConnectionZone = 23299957,
15 | Polymerization = 24094653,
16 | MiracleSynchroFusion = 36484016,
17 | PowerBond = 37630732,
18 | ParticleFusion = 39261576,
19 | ShaddollFusion = 44394295,
20 | TheTerminusoftheBurningAbyss = 44771289,
21 | MiracleFusion = 45906428,
22 | OddEyesFusion = 48144509,
23 | ParallelWorldFusion = 54283059,
24 | AncientGearFusion = 64061284,
25 | PendulumFusion = 65646587,
26 | CynetFusion = 65801012,
27 | AbsorbFusion = 71422989,
28 | DragonsMirror = 71490127,
29 | MetalfoesFusion = 73594093,
30 | EidolonSummoningMagic = 74063034,
31 | FusionSubstitute = 74335036,
32 | TranscendentalPolymerization = 76647978,
33 | CyberdarkImpact = 80033124,
34 | DarkFusion = 94820406,
35 | ThunderDragonFusion = 95238394,
36 | TheBookoftheLaw = 458748,
37 | ElShaddollFusion = 6417578,
38 | FlashFusion = 17236839,
39 | FullmetalfoesFusion = 39564736,
40 | DestructionSwordsmanFusion = 41940225,
41 | SuperPolymerization = 48130397,
42 | CyberloadFusion = 55704856,
43 | RelinquishedFusion = 78063197,
44 | BrilliantFusion = 7394770,
45 | ForbiddenDarkContractwiththeSwampKing = 10833828,
46 | Fortissimo = 11493868,
47 | VoidImagination = 31444249,
48 | FrightfurFactory = 43698897,
49 | DarkContractwiththeSwampKing = 73360025,
50 | NepheShaddollFusion = 60226558,
51 | FusionGate = 33550694,
52 |
53 | DFusion = 26841274,
54 | PyroxeneFusion = 55824220,
55 | FragmentFusion = 72029628,
56 | NecroFusion = 81223446,
57 | PredaplantVerteAnaconda = 70369116,
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/InvincibleMonster.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | ///
4 | /// Cards that are invincible to battle and should always attack to use effect.
5 | ///
6 | public enum InvincibleBotMonster
7 | {
8 | YubelTheUltimateNightmare = 31764700,
9 | YubelTerrorIncarnate = 4779091,
10 | SandaionTheTimelord = 33015627,
11 | GabrionTheTimelord = 6616912,
12 | MichionTheTimelord = 7733560,
13 | ZaphionTheTimelord = 28929131,
14 | HailonTheTimelord = 34137269,
15 | RaphionTheTimelord = 60222213,
16 | SadionTheTimelord = 65314286,
17 | MetaionTheTimelord = 74530899,
18 | KamionTheTimelord = 91712985,
19 | LazionTheTimelord = 92435533,
20 | TimelordProgenitorVorpgate = 67508932,
21 | RocketWarrior = 30860696,
22 | GoDDDDivineZeroKingRage = 40227329,
23 | BloomDivaTheMelodiousChoir = 84988419,
24 | BlackwingArmorMaster = 69031175,
25 | DaigustoSphreez = 29552709,
26 | Number92HearteartHDragon = 97403510,
27 | NumberC96DarkStorm = 77205367,
28 | Number54LionHeart = 54366836
29 | }
30 | ///
31 | /// Cards that are invincible to battle.
32 | ///
33 | public enum InvincibleEnemyMonster
34 | {
35 | SpiritReaper = 23205979,
36 | YubelTheUltimateNightmare = 31764700,
37 | YubelTerrorIncarnate = 4779091,
38 | SandaionTheTimelord = 33015627,
39 | DarknessNeosphere = 60417395,
40 | GabrionTheTimelord = 6616912,
41 | MichionTheTimelord = 7733560,
42 | ZaphionTheTimelord = 28929131,
43 | HailonTheTimelord = 34137269,
44 | RaphionTheTimelord = 60222213,
45 | SadionTheTimelord = 65314286,
46 | MetaionTheTimelord = 74530899,
47 | Yubel = 78371393,
48 | KamionTheTimelord = 91712985,
49 | LazionTheTimelord = 92435533,
50 | CloudianEyeofTheTyphoon = 57610714,
51 | GimmickPuppetShadowFeeler = 34620088,
52 | TheLegendaryFishermanIII = 44968687,
53 | CastleGate = 36931229,
54 | CloudianNimbusman = 20003527,
55 | ExodiaNecross = 12600382,
56 | Gellenduo = 11662742,
57 | CloudianAltus = 79703905,
58 | CloudianStormDragon = 13474291,
59 | CloudianCirrostratus = 43318266,
60 | CloudianTurbulence = 16197610,
61 | CloudianAcidCloud = 17810268,
62 | SuperheavySamuraiBlueBrawler = 41628550,
63 | DinoSewing = 27143874,
64 | Marshmallon = 31305911,
65 | ShibaWarriorTaro = 27416701,
66 | XSaberPashuul = 23093604,
67 | SuperheavySamuraiBlowtorch = 7864030,
68 | VijamTheCubicSeed = 15610297,
69 | ArcanaForce0TheFool = 62892347,
70 | ReptilianneNaga = 79491903,
71 | AbyssStungray = 97232518,
72 | ArmityleTheChaosPhantom = 43378048,
73 | BlueEyesTwinBurstDragon = 2129638,
74 | GladiatorBeastNerokius = 29357956,
75 | MaskedHERODivineWind = 22093873,
76 | ElementalHEROShiningPhoenixEnforcer = 88820235,
77 | LunalightCatDancer = 51777272,
78 | ElementalHEROPhoenixEnforcer = 41436536,
79 | BloomDivaTheMelodiousChoir = 84988419,
80 | ReaperonTheNightmare = 85684223,
81 | BeelzeusofTheDiabolicDragons = 8763963,
82 | DragocytosCorruptedNethersoulDragon = 21435914,
83 | BeelzeofTheDiabolicDragons = 34408491,
84 | BlackwingArmorMaster = 69031175,
85 | DaigustoSphreeze = 29552709,
86 | DarkDiviner = 31919988,
87 | NumberC92HearteartHChaosDragon = 47017574,
88 | Number92HearteartHDragon = 97403510,
89 | Number51FinisherTheStrongArm = 56292140,
90 | NumberC96DarkStorm = 77205367,
91 | NumberF0UtopicFutureFutureSlash = 43490025,
92 | NumberF0UtopicFuture = 65305468,
93 | GoukiTheGiantOgre = 47946130,
94 | BorrelswordDragon = 85289965,
95 | NumberF0UtopicFutureDragon = 26973555,
96 | BorrelendDragon = 98630720
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/OneForXyz.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | public enum OneForXyz
4 | {
5 | ZoodiacThoroughblade = 77150143,
6 | ZoodiacViper = 31755044,
7 | ZoodiacCluckle = 20155904,
8 | ZoodiacRabbina = 4367330,
9 | ZoodiacRam = 4145852,
10 | ZoodiacMarmorat = 78872731,
11 | ZoodiacTigress = 11510448,
12 | ZoodiacHammerkong = 14970113,
13 | ZoodiacLyca = 41375811,
14 | ZoodiacDrancia = 48905153,
15 | ZoodiacBoarbow = 74393852,
16 | ZoodiacBroadbull = 85115440,
17 | Number62 = 31801517,
18 | GalaxyEyesCipherDragon = 18963306,
19 | Number107 = 88177324,
20 | CyberDragonNova = 58069384,
21 | Number39 = 84013237
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/PreventActivationEffectInBattle.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | public enum PreventActivationEffectInBattle
4 | {
5 | Deskbot009 = 25494711,
6 | ArchfiendBlackSkullDragon = 45349196,
7 | FrightfurChimera = 83866861,
8 | GladiatorBeastNerokius = 29357956,
9 | GemKnightCitrine = 67985943,
10 | FrightfurSheep = 57477163,
11 | SamuraiDestroyer = 40509732,
12 | ArmadesKeeperOfBoundaries = 88033975,
13 | NumberS39UtopiaTheLightning = 56832966,
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/ShouldBeDisabledBeforeItUseEffectMonster.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | ///
4 | /// Monsters that release or banish itself to use effect. So them should be disabled (with Breakthrough Skill) before it use effect.
5 | ///
6 | public enum ShouldBeDisabledBeforeItUseEffectMonster
7 | {
8 | MachinaMegaform = 51617185,
9 | DarkSummoningBeast = 87917187,
10 | GemKnightAlexandrite = 90019393,
11 | RedEyesRetroDragon = 53485634,
12 | DeepSweeper = 8649148,
13 | BeastWarriorPuma = 16796157,
14 | ZefrasaberSwordmasteroftheNekroz = 84388461,
15 | CipherWing = 81974607,
16 | MadolcheAnjelly = 34680482,
17 | PlanetPathfinder = 97526666,
18 | RescueCat = 14878871,
19 | RescueHamster = 50485594,
20 | RescueFerret = 56343672,
21 | RescueRabbit = 85138716,
22 | GalaxyWizard = 98555327,
23 | Backlinker = 71172240,
24 | Merlin = 3580032,
25 | CrystalVanguard = 87475570,
26 | TemperanceofProphecy = 87608852,
27 | Kuribandit = 16404809,
28 | PhotonLizard = 38973775,
29 | SuperheavySamuraiFlutist = 27978707,
30 | ConstellarRasalhague = 70624184,
31 | CardcarD = 45812361,
32 | UnifloraMysticalBeastoftheForest = 36318200,
33 | BusterWhelpoftheDestructionSwordsman = 49823708,
34 | GalaxyEyesCloudragon = 9260791,
35 | SylvanPrincessprout = 20579538,
36 | AltergeistPixiel = 57769391,
37 | AbyssActorExtras = 88412339,
38 | PerformapalTrumpWitch = 91584698,
39 | RaidraptorLastStrix = 97219708,
40 | MythicalBeastJackal = 91182675,
41 | TimeMaiden = 27107590,
42 | SuperQuantalFairyAlphan = 58753372,
43 | TheBlackStoneofLegend = 66574418,
44 | PaladinofDarkDragon = 71408082,
45 | PaladinofPhotonDragon = 85346853,
46 | TwinPhotonLizard = 29455728,
47 | TimeThiefRegulator = 19891131,
48 | MathmechNabla = 53577438,
49 | NidhoggGeneraiderBossofIce = 49275969,
50 | HoarrGeneraiderBossofRumbling = 68199168,
51 | RedFamiliar = 8372133,
52 | AccesscodeTalker = 86066372,
53 | ChaosSummoningBeast = 27439792,
54 |
55 | CosmoBrain = 85679527,
56 | ShiranuiSolitaire = 94801854,
57 | Mixeroid = 71340250,
58 | LonefireBlossom = 48686504,
59 | BrotherhoodoftheFireFist_Leopard = 39699564
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/ShouldNotBeMonsterTarget.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | ///
4 | /// Cards that are can't be selected as target of monster's effect, or immuned to monster's effect.
5 | /// So them shouldn't be tried to be selected as target of monster at most times.
6 | ///
7 | public enum ShouldNotBeMonsterTarget
8 | {
9 | TheLegendaryFishermanII = 19801646,
10 | GaiaDraketheUniversalForce = 58601383,
11 | FirstoftheDragons = 10817524,
12 | Tatsunoko = 55863245,
13 | CXyzSimontheGreatMoralLeader = 41147577,
14 | PaleozoicAnomalocaris = 61307542,
15 | PaleozoicOpabinia = 37649320,
16 | BorreloadDragon = 31833038,
17 | BorrelendDragon = 98630720
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/ShouldNotBeSpellTarget.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | ///
4 | /// Cards that are can't be selected as target of spell&trap's effect, or immuned to spell&trap's effect.
5 | /// So them shouldn't be tried to be selected as target of spell&trap at most times.
6 | ///
7 | public enum ShouldNotBeSpellTrapTarget
8 | {
9 | ApoqliphortTowers = 27279764,
10 | ApoqliphortSkybase = 40061558,
11 | TheLegendaryFishermanIII = 44968687,
12 | ChaosAncientGearGiant = 51788412
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Enums/ShouldNotBeTarget.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI.Enums
2 | {
3 | ///
4 | /// Cards that are can't be selected as target, or immuned to most effect.
5 | /// So them shouldn't be tried to be selected as target at most times.
6 | ///
7 | public enum ShouldNotBeTarget
8 | {
9 | DivineSerpentGeh = 82103466,
10 | ObelisktheTormentor = 10000000,
11 | TheWingedDragonofRaSphereMode = 10000080,
12 | TheWingedDragonofRaImmortalPhoenix = 10000090,
13 | KozmoDarkPlanet = 85991529,
14 | ZushintheSleepingGiant = 67547370,
15 | TheLegendaryExodiaIncarnate = 58604027,
16 | KozmoDarkEclipser = 64063868,
17 | KozmoDarkDestroyer = 55885348,
18 | KozmoForerunner = 20849090,
19 | MajespecterUnicornKirin = 31178212,
20 | WorldLegacyWorldShield = 55787576,
21 | KiwiMagicianGirl = 82627406,
22 | MajespecterFoxKyubi = 94784213,
23 | MajespecterToadOgama = 645794,
24 | MajespecterCrowYata = 68395509,
25 | MajespecterRaccoonBunbuku = 31991800,
26 | MajespecterCatNekomata = 5506791,
27 | HazyFlameHydra = 8696773,
28 | HazyFlameMantikor = 96051150,
29 | HazyFlameHyppogrif = 31303283,
30 | HazyFlameCerbereus = 38525760,
31 | HazyFlameSphynx = 1409474,
32 | HazyFlamePeryton = 37803172,
33 | HazyFlameGriffin = 74010769,
34 | BlueEyesChaosMAXDragon = 55410871,
35 | BlueEyesChaosDragon = 20654247,
36 | SupremeKingZARC = 13331639,
37 | CrimsonNovaTrinitytheDarkCubicLord = 72664875,
38 | LunalightLeoDancer = 24550676,
39 | TimaeustheKnightofDestiny = 53315891,
40 | DantePilgrimoftheBurningAbyss = 18386170,
41 | AncientGearHowitzer = 87182127,
42 | InvokedCocytus = 85908279,
43 | LyriluscIndependentNightingale = 76815942,
44 | FlowerCardianLightshower = 42291297,
45 | YaziEviloftheYangZing = 43202238,
46 | RaidraptorUltimateFalcon = 86221741,
47 | DisdainfulBirdofParadise = 27240101,
48 | DarkestDiabolosLordOfTheLair = 50383626,
49 | Blackwing_FullArmoredWing = 54082269,
50 | DragunofRedEyes = 37818794,
51 | RedEyesBDragon = 74677422, // sometimes the name of DragunofRedEyes will be changed to RedEyesBDragon
52 | TheArrivalCyberseIgnister = 11738489
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/ExecutorType.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI
2 | {
3 | public enum ExecutorType
4 | {
5 | Summon,
6 | SpSummon,
7 | Repos,
8 | MonsterSet,
9 | SpellSet,
10 | Activate,
11 | SummonOrSet,
12 | GoToBattlePhase,
13 | GoToMainPhase2,
14 | GoToEndPhase
15 | }
16 | }
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/HintMsg.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI
2 | {
3 | public static class HintMsg
4 | {
5 | public const int Release = 500,
6 | Discard = 501,
7 | Destroy = 502,
8 | Remove = 503,
9 | ToGrave = 504,
10 | ReturnToHand = 505,
11 | AddToHand = 506,
12 | ToDeck = 507,
13 | Summon = 508,
14 | SpSummon = 509,
15 | Set = 510,
16 | FusionMaterial = 511,
17 | SynchroMaterial = 512,
18 | XyzMaterial = 513,
19 | Faceup = 514,
20 | Facedown = 515,
21 | Attack = 516,
22 | Defense = 517,
23 | Equip = 518,
24 | RemoveXyz = 519,
25 | Control = 520,
26 | DestroyReplace = 521,
27 | FaceupAttack = 522,
28 | FaceupDefense = 523,
29 | FacedownAttack = 524,
30 | FacedownDefense = 525,
31 | Confirm = 526,
32 | ToField = 527,
33 | PosChange = 528,
34 | Self = 529,
35 | Oppo = 530,
36 | Tribute = 531,
37 | DeattachFrom = 532,
38 | LinkMaterial = 533,
39 | AttackTarget = 549,
40 | Effect = 550,
41 | Target = 551,
42 | Coin = 552,
43 | Dice = 553,
44 | CardType = 554,
45 | Option = 555,
46 | ResolveEffect = 556,
47 | Select = 560,
48 | Position = 561,
49 | Attribute = 562,
50 | Race = 563,
51 | Code = 564,
52 | Number = 565,
53 | LvRank = 567,
54 | ResolveCard = 568,
55 | Zone = 569,
56 | DisableZone = 570,
57 | ToZone = 571,
58 | Counter = 572,
59 | Negate = 575;
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Opcodes.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI
2 | {
3 | public static class Opcodes
4 | {
5 | public const long OPCODE_ADD = 0x4000000000000000,
6 | OPCODE_SUB = 0x4000000100000000,
7 | OPCODE_MUL = 0x4000000200000000,
8 | OPCODE_DIV = 0x4000000300000000,
9 | OPCODE_AND = 0x4000000400000000,
10 | OPCODE_OR = 0x4000000500000000,
11 | OPCODE_NEG = 0x4000000600000000,
12 | OPCODE_NOT = 0x4000000700000000,
13 | OPCODE_BAND = 0x4000000800000000,
14 | OPCODE_BOR = 0x4000000900000000,
15 | OPCODE_BNOT = 0x4000001000000000,
16 | OPCODE_BXOR = 0x4000001100000000,
17 | OPCODE_LSHIFT = 0x4000001200000000,
18 | OPCODE_RSHIFT = 0x4000001300000000,
19 | OPCODE_ALLOW_ALIASES = 0x4000001400000000,
20 | OPCODE_ALLOW_TOKENS = 0x4000001500000000,
21 | OPCODE_ISCODE = 0x4000010000000000,
22 | OPCODE_ISSETCARD = 0x4000010100000000,
23 | OPCODE_ISTYPE = 0x4000010200000000,
24 | OPCODE_ISRACE = 0x4000010300000000,
25 | OPCODE_ISATTRIBUTE = 0x4000010400000000,
26 | OPCODE_GETCODE = 0x4000010500000000,
27 | OPCODE_GETSETCARD = 0x4000010600000000,
28 | OPCODE_GETTYPE = 0x4000010700000000,
29 | OPCODE_GETRACE = 0x4000010800000000,
30 | OPCODE_GETATTRIBUTE = 0x4000010900000000;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/AI/Zones.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game.AI
2 | {
3 | public static class Zones
4 | {
5 | public const int z0 = 0x1,
6 | z1 = 0x2,
7 | z2 = 0x4,
8 | z3 = 0x8,
9 | z4 = 0x10,
10 | z5 = 0x20,
11 | z6 = 0x40,
12 |
13 | FieldZone = 0x20,
14 |
15 | MonsterZones = 0x7f,
16 | MainMonsterZones = 0x1f,
17 | ExtraMonsterZones = 0x60,
18 |
19 | SpellZones = 0x1f,
20 |
21 | PendulumZones = 0x3,
22 |
23 | LinkedZones = 0x10000,
24 | NotLinkedZones = 0x20000;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/ExecutorBase/Game/BattlePhase.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace WindBot.Game
4 | {
5 | public class BattlePhase
6 | {
7 | public IList AttackableCards { get; private set; }
8 | public IList ActivableCards { get; private set; }
9 | public IList ActivableDescs { get; private set; }
10 | public bool CanMainPhaseTwo { get; set; }
11 | public bool CanEndPhase { get; set; }
12 |
13 | public BattlePhase()
14 | {
15 | AttackableCards = new List();
16 | ActivableCards = new List();
17 | ActivableDescs = new List();
18 | }
19 | }
20 | }
--------------------------------------------------------------------------------
/ExecutorBase/Game/BattlePhaseAction.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game
2 | {
3 | public class BattlePhaseAction
4 | {
5 | public enum BattleAction
6 | {
7 | Activate = 0,
8 | Attack = 1,
9 | ToMainPhaseTwo = 2,
10 | ToEndPhase = 3
11 | }
12 |
13 | public BattleAction Action { get; private set; }
14 | public int Index { get; private set; }
15 |
16 | public BattlePhaseAction(BattleAction action)
17 | {
18 | Action = action;
19 | Index = 0;
20 | }
21 |
22 | public BattlePhaseAction(BattleAction action, int[] indexes)
23 | {
24 | Action = action;
25 | Index = indexes[(int)action];
26 | }
27 |
28 | public int ToValue()
29 | {
30 | return (Index << 16) + (int)Action;
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/ExecutorBase/Game/MainPhase.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace WindBot.Game
4 | {
5 | public class MainPhase
6 | {
7 | public IList SummonableCards { get; private set; }
8 | public IList SpecialSummonableCards { get; private set; }
9 | public IList ReposableCards { get; private set; }
10 | public IList MonsterSetableCards { get; private set; }
11 | public IList SpellSetableCards { get; private set; }
12 | public IList ActivableCards { get; private set; }
13 | public IList ActivableDescs { get; private set; }
14 | public bool CanBattlePhase { get; set; }
15 | public bool CanEndPhase { get; set; }
16 |
17 | public MainPhase()
18 | {
19 | SummonableCards = new List();
20 | SpecialSummonableCards = new List();
21 | ReposableCards = new List();
22 | MonsterSetableCards = new List();
23 | SpellSetableCards = new List();
24 | ActivableCards = new List();
25 | ActivableDescs = new List();
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/ExecutorBase/Game/MainPhaseAction.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game
2 | {
3 | public class MainPhaseAction
4 | {
5 | public enum MainAction
6 | {
7 | Summon = 0,
8 | SpSummon = 1,
9 | Repos = 2,
10 | SetMonster = 3,
11 | SetSpell = 4,
12 | Activate = 5,
13 | ToBattlePhase = 6,
14 | ToEndPhase = 7
15 | }
16 |
17 | public MainAction Action { get; private set; }
18 | public int Index { get; private set; }
19 |
20 | public MainPhaseAction(MainAction action)
21 | {
22 | Action = action;
23 | Index = 0;
24 | }
25 |
26 | public MainPhaseAction(MainAction action, int index)
27 | {
28 | Action = action;
29 | Index = index;
30 | }
31 |
32 | public MainPhaseAction(MainAction action, int[] indexes)
33 | {
34 | Action = action;
35 | Index = indexes[(int)action];
36 | }
37 |
38 | public int ToValue()
39 | {
40 | return (Index << 16) + (int)Action;
41 | }
42 | }
43 | }
--------------------------------------------------------------------------------
/ExecutorBase/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // Le informazioni generali relative a un assembly sono controllate dal seguente
6 | // set di attributi. Modificare i valori di questi attributi per modificare le informazioni
7 | // associate a un assembly.
8 | [assembly: AssemblyTitle("ExecutorBase")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("ExecutorBase")]
13 | [assembly: AssemblyCopyright("Copyright © 2020")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Se si imposta ComVisible su false, i tipi in questo assembly non saranno visibili
18 | // ai componenti COM. Se è necessario accedere a un tipo in questo assembly da
19 | // COM, impostare su true l'attributo ComVisible per tale tipo.
20 | [assembly: ComVisible(false)]
21 |
22 | // Se il progetto viene esposto a COM, il GUID seguente verrà utilizzato come ID della libreria dei tipi
23 | [assembly: Guid("a1583fd7-7985-47dd-a835-8134dbf5811c")]
24 |
25 | // Le informazioni sulla versione di un assembly sono costituite dai seguenti quattro valori:
26 | //
27 | // Versione principale
28 | // Versione secondaria
29 | // Numero di build
30 | // Revisione
31 | //
32 | // È possibile specificare tutti i valori oppure impostare valori predefiniti per i numeri relativi alla revisione e alla build
33 | // usando l'asterisco '*' come illustrato di seguito:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardAttribute.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum CardAttribute
4 | {
5 | Earth = 0x01,
6 | Water = 0x02,
7 | Fire = 0x04,
8 | Wind = 0x08,
9 | Light = 0x10,
10 | Dark = 0x20,
11 | Divine = 0x40,
12 | }
13 | }
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardLinkMarker.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum CardLinkMarker
4 | {
5 | BottomLeft = 0x01,
6 | Bottom = 0x02,
7 | BottomRight = 0x04,
8 | Left = 0x08,
9 |
10 | Right = 0x20,
11 | TopLeft = 0x40,
12 | Top = 0x80,
13 | TopRight = 0x100
14 | }
15 | }
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardLocation.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum CardLocation
4 | {
5 | Deck = 0x01,
6 | Hand = 0x02,
7 | MonsterZone = 0x04,
8 | SpellZone = 0x08,
9 | Grave = 0x10,
10 | Removed = 0x20,
11 | Extra = 0x40,
12 | Overlay = 0x80,
13 | Onfield = 0x0C,
14 | FieldZone = 0x100,
15 | PendulumZone = 0x200
16 | }
17 | }
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardPosition.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum CardPosition
4 | {
5 | FaceUpAttack = 0x1,
6 | FaceDownAttack = 0x2,
7 | FaceUpDefence = 0x4,
8 | FaceDownDefence = 0x8,
9 | FaceUp = 0x5,
10 | FaceDown = 0xA,
11 | Attack = 0x3,
12 | Defence = 0xC
13 | }
14 | }
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardRace.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum CardRace : ulong
4 | {
5 | Warrior = 0x1,
6 | SpellCaster = 0x2,
7 | Fairy = 0x4,
8 | Fiend = 0x8,
9 | Zombie = 0x10,
10 | Machine = 0x20,
11 | Aqua = 0x40,
12 | Pyro = 0x80,
13 | Rock = 0x100,
14 | WindBeast = 0x200,
15 | Plant = 0x400,
16 | Insect = 0x800,
17 | Thunder = 0x1000,
18 | Dragon = 0x2000,
19 | Beast = 0x4000,
20 | BestWarrior = 0x8000,
21 | Dinosaur = 0x10000,
22 | Fish = 0x20000,
23 | SeaSerpent = 0x40000,
24 | Reptile = 0x80000,
25 | Psycho = 0x100000,
26 | DivineBeast = 0x200000,
27 | Wyrm = 0x800000,
28 | Cyberse = 0x1000000
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/CardType.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum CardType
4 | {
5 | Monster = 0x1,
6 | Spell = 0x2,
7 | Trap = 0x4,
8 | Normal = 0x10,
9 | Effect = 0x20,
10 | Fusion = 0x40,
11 | Ritual = 0x80,
12 | TrapMonster = 0x100,
13 | Spirit = 0x200,
14 | Union = 0x400,
15 | Dual = 0x800,
16 | Tuner = 0x1000,
17 | Synchro = 0x2000,
18 | Token = 0x4000,
19 | QuickPlay = 0x10000,
20 | Continuous = 0x20000,
21 | Equip = 0x40000,
22 | Field = 0x80000,
23 | Counter = 0x100000,
24 | Flip = 0x200000,
25 | Toon = 0x400000,
26 | Xyz = 0x800000,
27 | Pendulum = 0x1000000,
28 | SpSummon = 0x2000000,
29 | Link = 0x4000000
30 | }
31 | }
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/DuelPhase.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum DuelPhase
4 | {
5 | Draw = 0x01,
6 | Standby = 0x02,
7 | Main1 = 0x04,
8 | BattleStart = 0x08,
9 | BattleStep = 0x10,
10 | Damage = 0x20,
11 | DamageCal = 0x40,
12 | Battle = 0x80,
13 | Main2 = 0x100,
14 | End = 0x200
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/GameMessage.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum GameMessage
4 | {
5 | Retry = 1,
6 | Hint = 2,
7 | Waiting = 3,
8 | Start = 4,
9 | Win = 5,
10 | UpdateData = 6,
11 | UpdateCard = 7,
12 | RequestDeck = 8,
13 | SelectBattleCmd = 10,
14 | SelectIdleCmd = 11,
15 | SelectEffectYn = 12,
16 | SelectYesNo = 13,
17 | SelectOption = 14,
18 | SelectCard = 15,
19 | SelectChain = 16,
20 | SelectPlace = 18,
21 | SelectPosition = 19,
22 | SelectTribute = 20,
23 | SortChain = 21,
24 | SelectCounter = 22,
25 | SelectSum = 23,
26 | SelectDisfield = 24,
27 | SortCard = 25,
28 | SelectUnselect = 26,
29 | ConfirmDecktop = 30,
30 | ConfirmCards = 31,
31 | ShuffleDeck = 32,
32 | ShuffleHand = 33,
33 | RefreshDeck = 34,
34 | SwapGraveDeck = 35,
35 | ShuffleSetCard = 36,
36 | ReverseDeck = 37,
37 | DeckTop = 38,
38 | ShuffleExtra = 39,
39 | NewTurn = 40,
40 | NewPhase = 41,
41 | ConfirmExtratop = 42,
42 | Move = 50,
43 | PosChange = 53,
44 | Set = 54,
45 | Swap = 55,
46 | FieldDisabled = 56,
47 | Summoning = 60,
48 | Summoned = 61,
49 | SpSummoning = 62,
50 | SpSummoned = 63,
51 | FlipSummoning = 64,
52 | FlipSummoned = 65,
53 | Chaining = 70,
54 | Chained = 71,
55 | ChainSolving = 72,
56 | ChainSolved = 73,
57 | ChainEnd = 74,
58 | ChainNegated = 75,
59 | ChainDisabled = 76,
60 | CardSelected = 80,
61 | RandomSelected = 81,
62 | BecomeTarget = 83,
63 | Draw = 90,
64 | Damage = 91,
65 | Recover = 92,
66 | Equip = 93,
67 | LpUpdate = 94,
68 | Unequip = 95,
69 | CardTarget = 96,
70 | CancelTarget = 97,
71 | PayLpCost = 100,
72 | AddCounter = 101,
73 | RemoveCounter = 102,
74 | Attack = 110,
75 | Battle = 111,
76 | AttackDisabled = 112,
77 | DamageStepStart = 113,
78 | DamageStepEnd = 114,
79 | MissedEffect = 120,
80 | BeChainTarget = 121,
81 | CreateRelation = 122,
82 | ReleaseRelation = 123,
83 | TossCoin = 130,
84 | TossDice = 131,
85 | RockPaperScissors = 132,
86 | HandResult = 133,
87 | AnnounceRace = 140,
88 | AnnounceAttrib = 141,
89 | AnnounceCard = 142,
90 | AnnounceNumber = 143,
91 | CardHint = 160,
92 | TagSwap = 161,
93 | ReloadField = 162,
94 | AiName = 163,
95 | ShowHint = 164,
96 | PlayerHint = 165,
97 | MatchKill = 170,
98 | CustomMsg = 180,
99 | DuelWinner = 200
100 | }
101 | }
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper.Enums/Query.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.OCGWrapper.Enums
2 | {
3 | public enum Query : uint
4 | {
5 | Code = 0x01,
6 | Position = 0x02,
7 | Alias = 0x04,
8 | Type = 0x08,
9 | Level = 0x10,
10 | Rank = 0x20,
11 | Attribute = 0x40,
12 | Race = 0x80,
13 | Attack = 0x100,
14 | Defence = 0x200,
15 | BaseAttack = 0x400,
16 | BaseDefence = 0x800,
17 | Reason = 0x1000,
18 | ReasonCard = 0x2000,
19 | EquipCard = 0x4000,
20 | TargetCard = 0x8000,
21 | OverlayCard = 0x10000,
22 | Counters = 0x20000,
23 | Owner = 0x40000,
24 | Status = 0x80000,
25 | LScale = 0x200000,
26 | RScale = 0x400000,
27 | Link = 0x800000,
28 | End = 0x80000000
29 | }
30 | }
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper/Card.cs:
--------------------------------------------------------------------------------
1 | using YGOSharp.OCGWrapper.Enums;
2 | using System.Data;
3 |
4 | namespace YGOSharp.OCGWrapper
5 | {
6 | public class Card
7 | {
8 | public struct CardData
9 | {
10 | public int Code;
11 | public int Alias;
12 | public long Setcode;
13 | public int Type;
14 | public int Level;
15 | public int Attribute;
16 | public ulong Race;
17 | public int Attack;
18 | public int Defense;
19 | public int LScale;
20 | public int RScale;
21 | public int LinkMarker;
22 | }
23 |
24 | public int Id { get; private set; }
25 | public int Ot { get; private set; }
26 | public int Alias { get; private set; }
27 | public long Setcode { get; private set; }
28 | public int Type { get; private set; }
29 |
30 | public int Level { get; private set; }
31 | public int LScale { get; private set; }
32 | public int RScale { get; private set; }
33 | public int LinkMarker { get; private set; }
34 |
35 | public int Attribute { get; private set; }
36 | public ulong Race { get; private set; }
37 | public int Attack { get; private set; }
38 | public int Defense { get; private set; }
39 |
40 | internal CardData Data { get; private set; }
41 |
42 | public static Card Get(int id)
43 | {
44 | return CardsManager.GetCard(id);
45 | }
46 |
47 | public bool HasType(CardType type)
48 | {
49 | return ((Type & (int)type) != 0);
50 | }
51 |
52 | public bool HasSetcode(int setcode)
53 | {
54 | long setcodes = Setcode;
55 | int settype = setcode & 0xfff;
56 | int setsubtype = setcode & 0xf000;
57 | while (setcodes > 0)
58 | {
59 | long check_setcode = setcodes & 0xffff;
60 | setcodes >>= 16;
61 | if ((check_setcode & 0xfff) == settype && (check_setcode & 0xf000 & setsubtype) == setsubtype) return true;
62 | }
63 | return false;
64 | }
65 |
66 | public bool IsExtraCard()
67 | {
68 | return (HasType(CardType.Fusion) || HasType(CardType.Synchro) || HasType(CardType.Xyz) || (HasType(CardType.Link) && HasType(CardType.Monster)));
69 | }
70 |
71 | internal Card(IDataRecord reader)
72 | {
73 | Id = reader.GetInt32(0);
74 | Ot = reader.GetInt32(1);
75 | Alias = reader.GetInt32(2);
76 | Setcode = reader.GetInt64(3);
77 | Type = reader.GetInt32(4);
78 |
79 | int levelInfo = reader.GetInt32(5);
80 | Level = levelInfo & 0xff;
81 | LScale = (levelInfo >> 24) & 0xff;
82 | RScale = (levelInfo >> 16) & 0xff;
83 |
84 | Race = (ulong)reader.GetInt64(6);
85 | Attribute = reader.GetInt32(7);
86 | Attack = reader.GetInt32(8);
87 | Defense = reader.GetInt32(9);
88 |
89 | if (HasType(CardType.Link))
90 | {
91 | LinkMarker = Defense;
92 | Defense = 0;
93 | }
94 |
95 | Data = new CardData()
96 | {
97 | Code = Id,
98 | Alias = Alias,
99 | Setcode = Setcode,
100 | Type = Type,
101 | Level = Level,
102 | Attribute = Attribute,
103 | Race = Race,
104 | Attack = Attack,
105 | Defense = Defense,
106 | LScale = LScale,
107 | RScale = RScale,
108 | LinkMarker = LinkMarker
109 | };
110 | }
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper/CardsManager.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Data;
3 | using Mono.Data.Sqlite;
4 |
5 | namespace YGOSharp.OCGWrapper
6 | {
7 | internal static class CardsManager
8 | {
9 | private static IDictionary _cards;
10 |
11 | internal static void Init(string databaseFullPath)
12 | {
13 | _cards = new Dictionary();
14 |
15 | using (SqliteConnection connection = new SqliteConnection("Data Source=" + databaseFullPath))
16 | {
17 | connection.Open();
18 |
19 | using (IDbCommand command = new SqliteCommand("SELECT id, ot, alias, setcode, type, level, race, attribute, atk, def FROM datas", connection))
20 | {
21 | using (IDataReader reader = command.ExecuteReader())
22 | {
23 | while (reader.Read())
24 | {
25 | LoadCard(reader);
26 | }
27 | }
28 | }
29 | }
30 | }
31 |
32 | internal static Card GetCard(int id)
33 | {
34 | if (_cards.ContainsKey(id))
35 | return _cards[id];
36 | return null;
37 | }
38 |
39 | private static void LoadCard(IDataRecord reader)
40 | {
41 | Card card = new Card(reader);
42 | _cards.Add(card.Id, card);
43 | }
44 | }
45 | }
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper/NamedCard.cs:
--------------------------------------------------------------------------------
1 | using System.Data;
2 |
3 | namespace YGOSharp.OCGWrapper
4 | {
5 | public class NamedCard : Card
6 | {
7 | public string Name { get; private set; }
8 | public string Description { get; private set; }
9 |
10 | internal NamedCard(IDataRecord reader) : base(reader)
11 | {
12 | Name = reader.GetString(10);
13 | Description = reader.GetString(11);
14 | }
15 |
16 | public static new NamedCard Get(int id)
17 | {
18 | return NamedCardsManager.GetCard(id);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/ExecutorBase/YGOSharp.OCGWrapper/NamedCardsManager.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Data;
3 | using Mono.Data.Sqlite;
4 | using System;
5 | using System.IO;
6 | using System.Linq;
7 | using System.Collections.Concurrent;
8 |
9 | namespace YGOSharp.OCGWrapper
10 | {
11 | public static class NamedCardsManager
12 | {
13 | private static IDictionary _cards = new Dictionary();
14 |
15 | public static void SetThreadSafe()
16 | {
17 | _cards = new ConcurrentDictionary();
18 | }
19 |
20 | public static void LoadDatabase(string databaseFullPath)
21 | {
22 | try
23 | {
24 | if (!File.Exists(databaseFullPath))
25 | {
26 | throw new Exception("Could not find the cards database.");
27 | }
28 |
29 | using (SqliteConnection connection = new SqliteConnection("Data Source=" + databaseFullPath))
30 | {
31 | connection.Open();
32 |
33 | using (IDbCommand command = new SqliteCommand(
34 | "SELECT datas.id, ot, alias, setcode, type, level, race, attribute, atk, def, texts.name, texts.desc"
35 | + " FROM datas INNER JOIN texts ON datas.id = texts.id",
36 | connection))
37 | {
38 | using (IDataReader reader = command.ExecuteReader())
39 | {
40 | while (reader.Read())
41 | {
42 | LoadCard(reader);
43 | }
44 | }
45 | }
46 | }
47 | }
48 | catch (Exception ex)
49 | {
50 | throw new Exception("Could not initialize the cards database. Check the inner exception for more details.", ex);
51 | }
52 | }
53 |
54 | internal static NamedCard GetCard(int id)
55 | {
56 | if (_cards.ContainsKey(id))
57 | return _cards[id];
58 | return null;
59 | }
60 |
61 | public static IList GetAllCards()
62 | {
63 | return _cards.Values.ToList();
64 | }
65 |
66 | private static void LoadCard(IDataRecord reader)
67 | {
68 | NamedCard card = new NamedCard(reader);
69 | _cards[card.Id] = card;
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/Game/AI/Deck.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using YGOSharp.OCGWrapper;
5 |
6 | namespace WindBot.Game
7 | {
8 | public class Deck
9 | {
10 | public IList Cards { get; private set; }
11 | public IList ExtraCards { get; private set; }
12 | public IList SideCards { get; private set; }
13 |
14 | public Deck()
15 | {
16 | Cards = new List();
17 | ExtraCards = new List();
18 | SideCards = new List();
19 | }
20 |
21 | private void AddNewCard(int cardId, bool mainDeck, bool sideDeck)
22 | {
23 | if (sideDeck)
24 | SideCards.Add(cardId);
25 | else if(mainDeck)
26 | Cards.Add(cardId);
27 | else
28 | ExtraCards.Add(cardId);
29 | }
30 |
31 | public static Deck Load(string name)
32 | {
33 | StreamReader reader = null;
34 | Deck deck = new Deck();
35 | try
36 | {
37 | reader = new StreamReader(new FileStream(Path.IsPathRooted(name) ? name : Path.Combine(Program.AssetPath, "Decks/", name + ".ydk"), FileMode.Open, FileAccess.Read));
38 |
39 | bool main = true;
40 | bool side = false;
41 |
42 | while (!reader.EndOfStream)
43 | {
44 | string line = reader.ReadLine();
45 | if (line == null)
46 | continue;
47 |
48 | line = line.Trim();
49 | if (line.Equals("#extra"))
50 | main = false;
51 | else if (line.StartsWith("#"))
52 | continue;
53 | if (line.Equals("!side"))
54 | {
55 | side = true;
56 | continue;
57 | }
58 |
59 | int id;
60 | if (!int.TryParse(line, out id))
61 | continue;
62 |
63 | deck.AddNewCard(id, main, side);
64 | }
65 |
66 | reader.Close();
67 | }
68 | catch (Exception)
69 | {
70 | Logger.WriteLine("Failed to load deck: " + name + ".");
71 | reader?.Close();
72 | }
73 | return deck;
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/Game/AI/Decks/DoEveryThingExecutor.cs:
--------------------------------------------------------------------------------
1 | using YGOSharp.OCGWrapper.Enums;
2 | using System.Collections.Generic;
3 | using WindBot;
4 | using WindBot.Game;
5 | using WindBot.Game.AI;
6 |
7 | namespace WindBot.Game.AI.Decks
8 | {
9 | [Deck("Test", "AI_Test", "Test")]
10 | public class DoEverythingExecutor : DefaultExecutor
11 | {
12 | public class CardId
13 | {
14 | public const int LeoWizard = 4392470;
15 | public const int Bunilla = 69380702;
16 | }
17 |
18 | public DoEverythingExecutor(GameAI ai, Duel duel)
19 | : base(ai, duel)
20 | {
21 | AddExecutor(ExecutorType.SpSummon);
22 | AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
23 | AddExecutor(ExecutorType.SummonOrSet, DefaultMonsterSummon);
24 | AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
25 | AddExecutor(ExecutorType.SpellSet);
26 | }
27 |
28 | public override IList OnSelectCard(IList cards, int min, int max, long hint, bool cancelable)
29 | {
30 | if (Duel.Phase == DuelPhase.BattleStart)
31 | return null;
32 |
33 | IList selected = new List();
34 |
35 | // select the last cards
36 | for (int i = 1; i <= max; ++i)
37 | selected.Add(cards[cards.Count-i]);
38 |
39 | return selected;
40 | }
41 |
42 | public override int OnSelectOption(IList options)
43 | {
44 | return Program.Rand.Next(options.Count);
45 | }
46 |
47 | }
48 | }
--------------------------------------------------------------------------------
/Game/AI/Decks/EvilswarmExecutor.cs:
--------------------------------------------------------------------------------
1 | using YGOSharp.OCGWrapper.Enums;
2 | using System.Collections.Generic;
3 | using WindBot;
4 | using WindBot.Game;
5 | using WindBot.Game.AI;
6 |
7 | namespace WindBot.Game.AI.Decks
8 | {
9 | // NOT FINISHED YET
10 | [Deck("Evilswarm", "AI_Evilswarm", "NotFinished")]
11 | public class EvilswarmExecutor : DefaultExecutor
12 | {
13 | public class CardId
14 | {
15 | public const int DarkHole = 53129443;
16 | public const int CosmicCyclone = 8267140;
17 | public const int InfestationPandemic = 27541267;
18 | public const int SolemnJudgment = 41420027;
19 | public const int SolemnWarning = 84749824;
20 | public const int SolemnStrike = 40605147;
21 | }
22 |
23 | public EvilswarmExecutor(GameAI ai, Duel duel)
24 | : base(ai, duel)
25 | {
26 | AddExecutor(ExecutorType.Activate, CardId.DarkHole, DefaultDarkHole);
27 | AddExecutor(ExecutorType.Activate, CardId.CosmicCyclone, DefaultCosmicCyclone);
28 | AddExecutor(ExecutorType.Activate, CardId.SolemnJudgment, DefaultSolemnJudgment);
29 | AddExecutor(ExecutorType.Activate, CardId.SolemnWarning, DefaultSolemnWarning);
30 | AddExecutor(ExecutorType.Activate, CardId.SolemnStrike, DefaultSolemnStrike);
31 | AddExecutor(ExecutorType.SpellSet, CardId.InfestationPandemic);
32 | AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
33 | AddExecutor(ExecutorType.Summon);
34 | AddExecutor(ExecutorType.SpSummon);
35 | AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
36 | AddExecutor(ExecutorType.SpellSet);
37 | }
38 |
39 | // will be added soon...?
40 | }
41 | }
--------------------------------------------------------------------------------
/Game/AI/Decks/GraydleExecutor.cs:
--------------------------------------------------------------------------------
1 | using YGOSharp.OCGWrapper.Enums;
2 | using System.Collections.Generic;
3 | using WindBot;
4 | using WindBot.Game;
5 | using WindBot.Game.AI;
6 |
7 | namespace WindBot.Game.AI.Decks
8 | {
9 | // NOT FINISHED YET
10 | [Deck("Graydle", "AI_Graydle", "NotFinished")]
11 | public class GraydleExecutor : DefaultExecutor
12 | {
13 | public class CardId
14 | {
15 | public const int DarkHole = 53129443;
16 | public const int CosmicCyclone = 8267140;
17 | public const int SolemnJudgment = 41420027;
18 | public const int SolemnWarning = 84749824;
19 | public const int SolemnStrike = 40605147;
20 | }
21 |
22 | public GraydleExecutor(GameAI ai, Duel duel)
23 | : base(ai, duel)
24 | {
25 | AddExecutor(ExecutorType.Activate, CardId.DarkHole, DefaultDarkHole);
26 | AddExecutor(ExecutorType.Activate, CardId.CosmicCyclone, DefaultCosmicCyclone);
27 | AddExecutor(ExecutorType.Activate, CardId.SolemnJudgment, DefaultSolemnJudgment);
28 | AddExecutor(ExecutorType.Activate, CardId.SolemnWarning, DefaultSolemnWarning);
29 | AddExecutor(ExecutorType.Activate, CardId.SolemnStrike, DefaultSolemnStrike);
30 | AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
31 | AddExecutor(ExecutorType.MonsterSet);
32 | AddExecutor(ExecutorType.SpSummon);
33 | AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
34 | AddExecutor(ExecutorType.SpellSet);
35 | }
36 |
37 | // will be added soon...?
38 | }
39 | }
--------------------------------------------------------------------------------
/Game/AI/Decks/MokeyMokeyExecutor.cs:
--------------------------------------------------------------------------------
1 | using YGOSharp.OCGWrapper.Enums;
2 | using System.Collections.Generic;
3 | using WindBot;
4 | using WindBot.Game;
5 | using WindBot.Game.AI;
6 |
7 | namespace WindBot.Game.AI.Decks
8 | {
9 | [Deck("MokeyMokey", "AI_MokeyMokey", "Easy")]
10 | public class MokeyMokeyExecutor : DefaultExecutor
11 | {
12 | public class CardId
13 | {
14 | public const int LeoWizard = 4392470;
15 | public const int Bunilla = 69380702;
16 | }
17 |
18 | private int RockCount = 0;
19 |
20 | public MokeyMokeyExecutor(GameAI ai, Duel duel)
21 | : base(ai, duel)
22 | {
23 | AddExecutor(ExecutorType.Summon);
24 | AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
25 | AddExecutor(ExecutorType.SpellSet);
26 | }
27 |
28 | public override int OnRockPaperScissors()
29 | {
30 | RockCount++;
31 | if (RockCount <= 3)
32 | return 2;
33 | else
34 | return base.OnRockPaperScissors();
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/Game/AI/Decks/MokeyMokeyKingExecutor.cs:
--------------------------------------------------------------------------------
1 | using YGOSharp.OCGWrapper.Enums;
2 | using System.Collections.Generic;
3 | using WindBot;
4 | using WindBot.Game;
5 | using WindBot.Game.AI;
6 |
7 | namespace WindBot.Game.AI.Decks
8 | {
9 | [Deck("MokeyMokeyKing", "AI_MokeyMokeyKing", "Easy")]
10 | public class MokeyMokeyKingExecutor : DefaultExecutor
11 | {
12 | public class CardId
13 | {
14 | public const int LeoWizard = 4392470;
15 | public const int Bunilla = 69380702;
16 | }
17 |
18 | private int RockCount = 0;
19 |
20 | public MokeyMokeyKingExecutor(GameAI ai, Duel duel)
21 | : base(ai, duel)
22 | {
23 | AddExecutor(ExecutorType.SpSummon);
24 | AddExecutor(ExecutorType.SummonOrSet);
25 | AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
26 | AddExecutor(ExecutorType.Activate, DefaultField);
27 | }
28 |
29 | public override int OnRockPaperScissors()
30 | {
31 | RockCount++;
32 | if (RockCount <= 3)
33 | return 2;
34 | else
35 | return base.OnRockPaperScissors();
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/Game/AI/Decks/OldSchoolExecutor.cs:
--------------------------------------------------------------------------------
1 | using YGOSharp.OCGWrapper.Enums;
2 | using System.Collections.Generic;
3 | using WindBot;
4 | using WindBot.Game;
5 | using WindBot.Game.AI;
6 |
7 | namespace WindBot.Game.AI.Decks
8 | {
9 | [Deck("OldSchool", "AI_OldSchool", "Easy")]
10 | public class OldSchoolExecutor : DefaultExecutor
11 | {
12 | public class CardId
13 | {
14 | public const int AncientGearGolem = 83104731;
15 | public const int Frostosaurus = 6631034;
16 | public const int AlexandriteDragon = 43096270;
17 | public const int GeneWarpedWarwolf = 69247929;
18 | public const int GearGolemTheMovingFortress = 30190809;
19 | public const int EvilswarmHeliotrope = 77542832;
20 | public const int LusterDragon = 11091375;
21 | public const int InsectKnight = 35052053;
22 | public const int ArchfiendSoldier = 49881766;
23 |
24 | public const int HeavyStorm = 19613556;
25 | public const int DarkHole = 53129443;
26 | public const int Raigeki = 12580477;
27 | public const int HammerShot = 26412047;
28 | public const int Fissure = 66788016;
29 | public const int SwordsOfRevealingLight = 72302403;
30 | public const int DoubleSummon = 43422537;
31 |
32 | public const int MirrorForce = 44095762;
33 | public const int DimensionalPrison = 70342110;
34 |
35 | }
36 |
37 | public OldSchoolExecutor(GameAI ai, Duel duel)
38 | : base(ai, duel)
39 | {
40 | AddExecutor(ExecutorType.Activate, CardId.HeavyStorm, DefaultHeavyStorm);
41 | AddExecutor(ExecutorType.SpellSet, DefaultSpellSet);
42 | AddExecutor(ExecutorType.Activate, CardId.DarkHole, DefaultDarkHole);
43 | AddExecutor(ExecutorType.Activate, CardId.Raigeki, DefaultRaigeki);
44 | AddExecutor(ExecutorType.Activate, CardId.HammerShot, DefaultHammerShot);
45 | AddExecutor(ExecutorType.Activate, CardId.Fissure);
46 | AddExecutor(ExecutorType.Activate, CardId.SwordsOfRevealingLight, SwordsOfRevealingLight);
47 | AddExecutor(ExecutorType.Activate, CardId.DoubleSummon, DoubleSummon);
48 |
49 | AddExecutor(ExecutorType.Summon, CardId.AncientGearGolem, DefaultMonsterSummon);
50 | AddExecutor(ExecutorType.Summon, CardId.Frostosaurus, DefaultMonsterSummon);
51 | AddExecutor(ExecutorType.SummonOrSet, CardId.AlexandriteDragon);
52 | AddExecutor(ExecutorType.SummonOrSet, CardId.GeneWarpedWarwolf);
53 | AddExecutor(ExecutorType.MonsterSet, CardId.GearGolemTheMovingFortress);
54 | AddExecutor(ExecutorType.SummonOrSet, CardId.EvilswarmHeliotrope);
55 | AddExecutor(ExecutorType.SummonOrSet, CardId.LusterDragon);
56 | AddExecutor(ExecutorType.SummonOrSet, CardId.InsectKnight);
57 | AddExecutor(ExecutorType.SummonOrSet, CardId.ArchfiendSoldier);
58 |
59 | AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
60 |
61 | AddExecutor(ExecutorType.Activate, CardId.MirrorForce, DefaultTrap);
62 | AddExecutor(ExecutorType.Activate, CardId.DimensionalPrison, DefaultTrap);
63 | }
64 |
65 | private int _lastDoubleSummon;
66 |
67 | private bool DoubleSummon()
68 | {
69 | if (_lastDoubleSummon == Duel.Turn)
70 | return false;
71 |
72 | if (Main.SummonableCards.Count == 0)
73 | return false;
74 |
75 | if (Main.SummonableCards.Count == 1 && Main.SummonableCards[0].Level < 5)
76 | {
77 | bool canTribute = false;
78 | foreach (ClientCard handCard in Bot.Hand)
79 | {
80 | if (handCard.IsMonster() && handCard.Level > 4 && handCard.Level < 6)
81 | canTribute = true;
82 | }
83 | if (!canTribute)
84 | return false;
85 | }
86 |
87 | int monsters = 0;
88 | foreach (ClientCard handCard in Bot.Hand)
89 | {
90 | if (handCard.IsMonster())
91 | monsters++;
92 | }
93 | if (monsters <= 1)
94 | return false;
95 |
96 | _lastDoubleSummon = Duel.Turn;
97 | return true;
98 | }
99 |
100 | private bool SwordsOfRevealingLight()
101 | {
102 | foreach (ClientCard handCard in Enemy.GetMonsters())
103 | {
104 | if (handCard.IsFacedown())
105 | return true;
106 | }
107 | return Util.IsOneEnemyBetter(true);
108 | }
109 | }
110 | }
--------------------------------------------------------------------------------
/Game/DecksManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Reflection;
5 | using WindBot.Game.AI;
6 |
7 | namespace WindBot.Game
8 | {
9 | public static class DecksManager
10 | {
11 | private class DeckInstance
12 | {
13 | public string Deck { get; private set; }
14 | public Type Type { get; private set; }
15 | public string Level { get; private set; }
16 |
17 | public DeckInstance(string deck, Type type, string level)
18 | {
19 | Deck = deck;
20 | Type = type;
21 | Level = level;
22 | }
23 | }
24 |
25 | private static Dictionary _decks;
26 | private static List _list;
27 | private static Random _rand;
28 |
29 | public static void Init()
30 | {
31 | _decks = new Dictionary();
32 | _rand = new Random();
33 |
34 | Assembly asm = Assembly.GetExecutingAssembly();
35 | Type[] types = asm.GetTypes();
36 |
37 | foreach (Type type in types)
38 | {
39 | MemberInfo info = type;
40 | object[] attributes = info.GetCustomAttributes(false);
41 | foreach (object attribute in attributes)
42 | {
43 | if (attribute is DeckAttribute)
44 | {
45 | DeckAttribute deck = (DeckAttribute)attribute;
46 | _decks.Add(deck.Name, new DeckInstance(deck.File, type, deck.Level));
47 | }
48 | }
49 | }
50 | try
51 | {
52 | string[] files = Directory.GetFiles(Path.Combine(Program.AssetPath, "Executors"), "*.dll", SearchOption.TopDirectoryOnly);
53 | foreach (string file in files)
54 | {
55 | Assembly assembly = Assembly.LoadFrom(file);
56 | Type[] types2 = assembly.GetTypes();
57 | foreach (Type type in types2)
58 | {
59 | try
60 | {
61 | MemberInfo info = type;
62 | object[] attributes = info.GetCustomAttributes(false);
63 | foreach (object attribute in attributes)
64 | {
65 | if (attribute is DeckAttribute)
66 | {
67 | DeckAttribute deck = (DeckAttribute)attribute;
68 | _decks.Add(deck.Name, new DeckInstance(deck.File, type, deck.Level));
69 | }
70 | }
71 | }
72 | catch (Exception ex)
73 | {
74 | Logger.WriteErrorLine("Executor loading (" + file + ") error: " + ex);
75 | }
76 | }
77 | }
78 | }
79 | catch (Exception ex)
80 | {
81 | }
82 |
83 | _list = new List();
84 | _list.AddRange(_decks.Values);
85 |
86 | Logger.WriteLine("Decks initialized, " + _decks.Count + " found.");
87 | }
88 |
89 | public static Executor Instantiate(GameAI ai, Duel duel, string deck)
90 | {
91 | DeckInstance infos;
92 |
93 | if (deck != null && _decks.ContainsKey(deck))
94 | {
95 | infos = _decks[deck];
96 | Logger.WriteLine("Deck found, loading " + infos.Deck);
97 | }
98 | else
99 | {
100 | do
101 | {
102 | infos = _list[_rand.Next(_list.Count)];
103 | }
104 | while (infos.Level != "Normal");
105 | Logger.WriteLine("Deck not found, loading random: " + infos.Deck);
106 | }
107 |
108 | Executor executor = (Executor)Activator.CreateInstance(infos.Type, ai, duel);
109 | executor.Deck = infos.Deck;
110 | return executor;
111 | }
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/Game/GamePacketFactory.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using YGOSharp.Network.Enums;
3 |
4 | namespace WindBot.Game
5 | {
6 | public class GamePacketFactory
7 | {
8 | public static BinaryWriter Create(CtosMessage message)
9 | {
10 | BinaryWriter writer = new BinaryWriter(new MemoryStream());
11 | writer.Write((byte)message);
12 | return writer;
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Game/Room.cs:
--------------------------------------------------------------------------------
1 | namespace WindBot.Game
2 | {
3 | public class Room
4 | {
5 | public bool IsHost { get; set; }
6 | public string[] Names { get; set; }
7 | public bool[] IsReady { get; set; }
8 | public int Position { get; set; }
9 | public int Players { get; set; }
10 |
11 | public Room()
12 | {
13 | Names = new string[8];
14 | IsReady = new bool[8];
15 | Position = -1;
16 | Players = 0;
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | WindBot Ignite, a C# AI for Project Ignis: EDOPro
2 | ---------------------------------------------------
3 | Copyright (C) 2019-2020 Edoardo Lolletti (edo9300)
4 | Kevin Lu, Gareth Jones
5 | See version history at https://github.com/ProjectIgnis/windbot
6 | for a full list of contributors.
7 |
8 | This program is free software: you can redistribute it and/or modify
9 | it under the terms of the GNU Affero General Public License as published
10 | by the Free Software Foundation, either version 3 of the License, or
11 | (at your option) any later version.
12 |
13 | This program is distributed in the hope that it will be useful,
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 | GNU Affero General Public License for more details.
17 |
18 | You should have received a copy of the GNU Affero General Public License
19 | along with this program (COPYING). If not, see .
20 |
21 | Based on IceYGO's WindBot and MyCard's fork, originally licensed as follows
22 | ---------------------------------------------------------------------------
23 | The MIT License (MIT)
24 |
25 | Copyright (c) 2015-2017 IceYGO
26 |
27 | Permission is hereby granted, free of charge, to any person obtaining a copy
28 | of this software and associated documentation files (the "Software"), to deal
29 | in the Software without restriction, including without limitation the rights
30 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31 | copies of the Software, and to permit persons to whom the Software is
32 | furnished to do so, subject to the following conditions:
33 |
34 | The above copyright notice and this permission notice shall be included in all
35 | copies or substantial portions of the Software.
36 |
37 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
39 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
40 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
41 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
42 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
43 | SOFTWARE.
44 |
--------------------------------------------------------------------------------
/Logger.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | #if LIBWINDBOT
3 | using Android.Util;
4 | #endif
5 |
6 | namespace WindBot
7 | {
8 | public static class Logger
9 | {
10 | public static void WriteLine(string message)
11 | {
12 | #if !LIBWINDBOT
13 | Console.WriteLine("[" + DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + "] " + message);
14 | #else
15 | Log.Info("Edoprowindbot", "[" + DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + "] " + message);
16 | #endif
17 | }
18 | public static void DebugWriteLine(string message)
19 | {
20 | #if DEBUG
21 | #if !LIBWINDBOT
22 | Console.WriteLine("[" + DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + "] " + message);
23 | #else
24 | Log.Debug("Edoprowindbot", "[" + DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + "] " + message);
25 | #endif
26 | #endif
27 | }
28 | public static void WriteErrorLine(string message)
29 | {
30 | #if !LIBWINDBOT
31 | Console.BackgroundColor = ConsoleColor.Red;
32 | Console.ForegroundColor = ConsoleColor.White;
33 | Console.Error.WriteLine("[" + DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + "] " + message);
34 | Console.ResetColor();
35 | #else
36 | Log.Error("Edoprowindbot", "[" + DateTime.Now.ToString("yy-MM-dd HH:mm:ss") + "] " + message);
37 | #endif
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Mono.Data.Sqlite.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProjectIgnis/windbot/5d6d66e68ac1408cefa5473a82e97f904152425b/Mono.Data.Sqlite.dll
--------------------------------------------------------------------------------
/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("WindBot")]
9 | [assembly: AssemblyDescription("A C# bot for YGOPro.")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("Project Ignis")]
12 | [assembly: AssemblyProduct("WindBot Ignite")]
13 | [assembly: AssemblyCopyright("Copyright (C) 2020 edo9300 and others")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("eb88cec8-62f7-4839-9fa4-1732b9d06f87")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/Properties/AssemblyInfoLib.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 | using Android.App;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("libWindbot")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("libWindBot Ignite")]
14 | [assembly: AssemblyCopyright("Copyright (C) 2020 edo9300 and others")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 | [assembly: ComVisible(false)]
18 |
19 | // Version information for an assembly consists of the following four values:
20 | //
21 | // Major Version
22 | // Minor Version
23 | // Build Number
24 | // Revision
25 | //
26 | // You can specify all the values or you can default the Build and Revision Numbers
27 | // by using the '*' as shown below:
28 | // [assembly: AssemblyVersion("1.0.*")]
29 | [assembly: AssemblyVersion("1.0.0.0")]
30 | [assembly: AssemblyFileVersion("1.0.0.0")]
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WindBot Ignite
2 |
3 | A fork of [IceYGO's WindBot](https://github.com/IceYGO/windbot), ported to the
4 | [Project Ignis: EDOPro](https://github.com/edo9300/edopro) network protocol.
5 |
6 | This is a simple, deterministic artificial intelligence that connects as a
7 | virtual player to the YGOPro room system. Decks for this bot player **must** be
8 | specifically prepared and compiled as individual executors.
9 |
10 | Written in C# targeting .NET Framework 4. Use Visual Studio 2015 or newer.
11 |
12 | ## Available decks and executors
13 | * ABC
14 | * Altergeist
15 | * Blue-Eyes
16 | * Blue-Eyes Ritual
17 | * Burn
18 | * Chain Burn
19 | * Cyberse
20 | * Dark Magician
21 | * Dragma
22 | * Dragunity
23 | * Dragun of Red-Eyes
24 | * Frog
25 | * Gren Maju Stun
26 | * Horus
27 | * Kashtira
28 | * Lightsworn Shaddoll Dino
29 | * Mathmech
30 | * Normal Monster Mash
31 | * Normal Monster Mash II
32 | * Orcust
33 | * Qliphort
34 | * R5NK
35 | * Rainbow
36 | * Rose Scrap Synchro
37 | * Salamangreat
38 | * Sky Striker
39 | * Thunder Dragon
40 | * Tearlaments
41 | * Time Thief
42 | * Toadally Awesome
43 | * Trickstar
44 | * Windwitch Gusto
45 | * Witchcrafter Grass
46 | * Yosenju
47 | * ZEXAL Weapon
48 | * Zoodiac
49 |
50 | ## Contributing
51 |
52 | Pull requests are welcome for fixes and new additions! It might take some time
53 | for them to be evaluated since we are pretty swamped with a lot work to be done.
54 |
55 | Please keep bug reports on Discord so we can verify them first.
56 |
57 | For new additions, please make sure you add new code files to both the WindBot
58 | and libWindbot projects. You need only worry about testing the WindBot project.
59 |
60 | ## Other architectural changes from upstream
61 | [Old README](https://github.com/ProjectIgnis/windbot/tree/master/README-old.md),
62 | including some command-line documentation.
63 |
64 | The Visual Studio project has been merged with
65 | [libWindbot](https://github.com/mercury233/libWindbot), meant for use as an
66 | Android aar. Most of the code is shared with the main WindBot project, minus
67 | the few specific bindings to call the bot as a library instead of a separate
68 | process. The repository structure has been improved to keep the sources for
69 | YGOSharp around as a result, but sqlite3 DLLs are still sitting around.
70 |
71 | ExecutorBase is a refactor to experiment with loading additional executors
72 | from DLLs in an executor folder. See SampleExecutor for an example project using
73 | this experimental feature.
74 |
75 | ### libWindbot
76 |
77 | To actually compile libWindbot including the post-build task that produces the
78 | Android aar artifact, you will need the following EXACT setup. You _will_ have a
79 | bad day otherwise and this has been kept concise.
80 |
81 | - The postbuild event runs on Windows only.
82 | - You must use Visual Studio 2017 or Visual Studio 2019.
83 | - You need Visual Studio workloads for Android (Xamarin and native development).
84 | - You must install the 32-bit Mono SDK. The 64-bit version does not work.
85 | - In the Visual Studio 2017 `Tools > Options > Xamarin > Android Settings`,
86 | ensure the SDK, NDK, and JDK all point to valid paths. They should be set
87 | correctly by default. You can use Microsoft-provided installations or share
88 | these with Android Studio.
89 | - In addition to the default Android SDK tools, install Platform 24
90 | (Android 7.0). No newer platform works.
91 | - The NDK path must point to an r15c installation. Visual Studio 2017 should
92 | already have installed it somewhere but you can download this unsupported
93 | old version from the Android developer site. No newer NDK works.
94 |
95 | These are all quirks of the 0.4.0 NuGet version of
96 | [Embeddinator-4000](https://github.com/mono/Embeddinator-4000), used to
97 | transform the .NET DLL into a native library for Android.
98 |
99 | ## License
100 |
101 | WindBot Ignite is free/libree and open source software licensed under the GNU
102 | Affero General Public License, version 3 or later. Please see
103 | [LICENSE](https://github.com/ProjectIgnis/windbot/blob/master/LICENSE) and
104 | [COPYING](https://github.com/ProjectIgnis/windbot/blob/master/COPYING) for more
105 | details.
106 |
--------------------------------------------------------------------------------
/SampleExecutor.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.28307.960
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleExecutor", "SampleExecutor\SampleExecutor.csproj", "{612BF3AB-571D-4ADF-AC20-47C20A7E991D}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExecutorBase", "ExecutorBase\ExecutorBase.csproj", "{A1583FD7-7985-47DD-A835-8134DBF5811C}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {612BF3AB-571D-4ADF-AC20-47C20A7E991D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {612BF3AB-571D-4ADF-AC20-47C20A7E991D}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {612BF3AB-571D-4ADF-AC20-47C20A7E991D}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {612BF3AB-571D-4ADF-AC20-47C20A7E991D}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {06D9979A-1D52-4DD2-A3A9-4644C7304AAE}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/SampleExecutor/SampleExecutor.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using WindBot;
4 | using WindBot.Game;
5 | using WindBot.Game.AI;
6 | using YGOSharp.OCGWrapper.Enums;
7 |
8 | namespace WindBot.Game.AI.Decks
9 | {
10 | [Deck("Sample", "AI_Sample")]
11 | public class SampleExecutor : DefaultExecutor
12 | {
13 | public SampleExecutor(GameAI ai, Duel duel)
14 | : base(ai, duel)
15 | {
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/SampleExecutor/SampleExecutor.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {612BF3AB-571D-4ADF-AC20-47C20A7E991D}
8 | Library
9 | Properties
10 | SampleExecutor
11 | SampleExecutor
12 | v4.0
13 | 512
14 | true
15 |
16 |
17 | true
18 | full
19 | false
20 | bin\Debug\
21 | DEBUG;TRACE
22 | prompt
23 | 4
24 |
25 |
26 | pdbonly
27 | true
28 | bin\Release\
29 | TRACE
30 | prompt
31 | 4
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | {a1583fd7-7985-47dd-a835-8134dbf5811c}
51 | ExecutorBase
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/WindBot.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProjectIgnis/windbot/5d6d66e68ac1408cefa5473a82e97f904152425b/WindBot.ico
--------------------------------------------------------------------------------
/WindBot.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.28307.960
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindBot", "WindBot.csproj", "{3E7FAF67-A27D-4A61-B161-93AD4414183E}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "libWindbot", "libWindbot.csproj", "{5BCF813B-671E-4B2C-B01E-3EACDC536B65}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExecutorBase", "ExecutorBase\ExecutorBase.csproj", "{A1583FD7-7985-47DD-A835-8134DBF5811C}"
11 | EndProject
12 | Global
13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
14 | Debug|Any CPU = Debug|Any CPU
15 | Debug|x86 = Debug|x86
16 | Release|Any CPU = Release|Any CPU
17 | Release|x86 = Release|x86
18 | EndGlobalSection
19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
20 | {3E7FAF67-A27D-4A61-B161-93AD4414183E}.Debug|Any CPU.ActiveCfg = Debug|x86
21 | {3E7FAF67-A27D-4A61-B161-93AD4414183E}.Debug|Any CPU.Build.0 = Debug|x86
22 | {3E7FAF67-A27D-4A61-B161-93AD4414183E}.Debug|x86.ActiveCfg = Debug|x86
23 | {3E7FAF67-A27D-4A61-B161-93AD4414183E}.Debug|x86.Build.0 = Debug|x86
24 | {3E7FAF67-A27D-4A61-B161-93AD4414183E}.Release|Any CPU.ActiveCfg = Release|x86
25 | {3E7FAF67-A27D-4A61-B161-93AD4414183E}.Release|Any CPU.Build.0 = Release|x86
26 | {3E7FAF67-A27D-4A61-B161-93AD4414183E}.Release|x86.ActiveCfg = Release|x86
27 | {3E7FAF67-A27D-4A61-B161-93AD4414183E}.Release|x86.Build.0 = Release|x86
28 | {5BCF813B-671E-4B2C-B01E-3EACDC536B65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
29 | {5BCF813B-671E-4B2C-B01E-3EACDC536B65}.Debug|Any CPU.Build.0 = Debug|Any CPU
30 | {5BCF813B-671E-4B2C-B01E-3EACDC536B65}.Debug|x86.ActiveCfg = Debug|Any CPU
31 | {5BCF813B-671E-4B2C-B01E-3EACDC536B65}.Debug|x86.Build.0 = Debug|Any CPU
32 | {5BCF813B-671E-4B2C-B01E-3EACDC536B65}.Release|Any CPU.ActiveCfg = Release|Any CPU
33 | {5BCF813B-671E-4B2C-B01E-3EACDC536B65}.Release|Any CPU.Build.0 = Release|Any CPU
34 | {5BCF813B-671E-4B2C-B01E-3EACDC536B65}.Release|x86.ActiveCfg = Release|Any CPU
35 | {5BCF813B-671E-4B2C-B01E-3EACDC536B65}.Release|x86.Build.0 = Release|Any CPU
36 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
37 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Debug|Any CPU.Build.0 = Debug|Any CPU
38 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Debug|x86.ActiveCfg = Debug|Any CPU
39 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Debug|x86.Build.0 = Debug|Any CPU
40 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Release|Any CPU.ActiveCfg = Release|Any CPU
41 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Release|Any CPU.Build.0 = Release|Any CPU
42 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Release|x86.ActiveCfg = Release|Any CPU
43 | {A1583FD7-7985-47DD-A835-8134DBF5811C}.Release|x86.Build.0 = Release|Any CPU
44 | EndGlobalSection
45 | GlobalSection(SolutionProperties) = preSolution
46 | HideSolutionNode = FALSE
47 | EndGlobalSection
48 | GlobalSection(ExtensibilityGlobals) = postSolution
49 | SolutionGuid = {86299176-31F0-4A85-9786-8252D709AF71}
50 | EndGlobalSection
51 | EndGlobal
52 |
--------------------------------------------------------------------------------
/WindBotInfo.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.Serialization;
3 |
4 | namespace WindBot
5 | {
6 | [DataContract]
7 | public class CreateGameInfo
8 | {
9 | // Although not set when deserializing, default values
10 | // are the options for a basic MR5 OCG/TCG room.
11 | // NOTE: Most of these member variables are written as is to a
12 | // BinaryStream, so watch your step when changing their type!
13 | [DataMember] public uint banlistHash { get; set; } = 0;
14 | [DataMember] public byte allowed { get; set; } = 3;
15 | [DataMember] public bool dontCheckDeck { get; set; } = false;
16 | [DataMember] public bool dontShuffleDeck { get; set; } = false;
17 | [DataMember] public uint startingLP { get; set; } = 8000;
18 | [DataMember] public byte startingDrawCount { get; set; } = 5;
19 | [DataMember] public byte drawCountPerTurn { get; set; } = 1;
20 | [DataMember] public ushort timeLimitInSeconds { get; set; } = 180;
21 | [DataMember] public ulong duelFlags { get; set; } = 190464;
22 | [DataMember] public int t0Count { get; set; } = 1;
23 | [DataMember] public int t1Count { get; set; } = 1;
24 | [DataMember] public int bestOf { get; set; } = 1;
25 | [DataMember] public int forb { get; set; } = 0;
26 | [DataMember] public ushort extraRules { get; set; } = 0;
27 | [DataMember] public string notes { get; set; } = "";
28 | }
29 |
30 | public class WindBotInfo
31 | {
32 | public string Name { get; set; }
33 | public string Deck { get; set; }
34 | public string DeckFile { get; set; }
35 | public string Dialog { get; set; }
36 | public string Host { get; set; }
37 | public int Port { get; set; }
38 | public string HostInfo { get; set; }
39 | public int Version { get; set; }
40 | public int Hand { get; set; }
41 | public bool Debug { get; set; }
42 | public bool Chat { get; set; }
43 | public int RoomId { get; set; }
44 | public CreateGameInfo CreateGame { get; set; }
45 | public WindBotInfo()
46 | {
47 | Name = "WindBot";
48 | Deck = null;
49 | DeckFile = null;
50 | Dialog = "default";
51 | Host = "127.0.0.1";
52 | Port = 7911;
53 | HostInfo = "";
54 | Version = 40|1<<8|10<<16;
55 | Hand = 0;
56 | Debug = false;
57 | Chat = true;
58 | RoomId = 0;
59 | CreateGame = null;
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/YGOSharp.Network/AsyncBinaryClient.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Net;
4 | using System.Net.Sockets;
5 |
6 | namespace YGOSharp.Network
7 | {
8 | public class AsyncBinaryClient
9 | {
10 | public event Action Connected;
11 | public event Action Disconnected;
12 | public event Action PacketReceived;
13 |
14 | protected int MaxPacketLength = 0xFFFF;
15 | protected int HeaderSize = 2;
16 | protected bool IsHeaderSizeIncluded = false;
17 |
18 | private NetworkClient _client;
19 |
20 | private List _receiveBuffer = new List();
21 | private byte[] _lengthBuffer = new byte[16];
22 |
23 | private int _pendingLength;
24 |
25 | public bool IsConnected
26 | {
27 | get { return _client.IsConnected; }
28 | }
29 |
30 | public IPAddress RemoteIPAddress
31 | {
32 | get { return _client.RemoteIPAddress; }
33 | }
34 |
35 | public AsyncBinaryClient(NetworkClient client)
36 | {
37 | _client = client;
38 |
39 | client.Connected += Client_Connected;
40 | client.Disconnected += Client_Disconnected;
41 | client.DataReceived += Client_DataReceived;
42 |
43 | if (_client.IsConnected)
44 | {
45 | _client.BeginReceive();
46 | }
47 | }
48 |
49 | public void Connect(IPAddress address, int port)
50 | {
51 | _client.BeginConnect(address, port);
52 | }
53 |
54 | public void Initialize(Socket socket)
55 | {
56 | _client.Initialize(socket);
57 | }
58 |
59 | public void Send(byte[] packet)
60 | {
61 | if (packet.Length > MaxPacketLength)
62 | {
63 | throw new Exception("Tried to send a too large packet");
64 | }
65 |
66 | int packetLength = packet.Length;
67 | if (IsHeaderSizeIncluded) packetLength += HeaderSize;
68 |
69 | byte[] header;
70 | if (HeaderSize == 2)
71 | {
72 | header = BitConverter.GetBytes((ushort)packetLength);
73 | }
74 | else if (HeaderSize == 4)
75 | {
76 | header = BitConverter.GetBytes(packetLength);
77 | }
78 | else
79 | {
80 | throw new Exception("Unsupported header size: " + HeaderSize);
81 | }
82 | byte[] data = new byte[packet.Length + HeaderSize];
83 | Array.Copy(header, 0, data, 0, header.Length);
84 | Array.Copy(packet, 0, data, header.Length, packet.Length);
85 | _client.BeginSend(data);
86 | }
87 |
88 | public void Close(Exception error = null)
89 | {
90 | _client.Close(error);
91 | }
92 |
93 | private void Client_Connected()
94 | {
95 | Connected?.Invoke();
96 | }
97 |
98 | private void Client_Disconnected(Exception ex)
99 | {
100 | Disconnected?.Invoke(ex);
101 | }
102 |
103 | private void Client_DataReceived(byte[] data)
104 | {
105 | _receiveBuffer.AddRange(data);
106 | ExtractPackets();
107 | }
108 |
109 | private void ExtractPackets()
110 | {
111 | bool hasExtracted;
112 | do
113 | {
114 | if (_pendingLength == 0)
115 | {
116 | hasExtracted = ExtractPendingLength();
117 | }
118 | else
119 | {
120 | hasExtracted = ExtractPendingPacket();
121 | }
122 | }
123 | while (hasExtracted);
124 | }
125 |
126 | private bool ExtractPendingLength()
127 | {
128 | if (_receiveBuffer.Count >= HeaderSize)
129 | {
130 | _receiveBuffer.CopyTo(0, _lengthBuffer, 0, HeaderSize);
131 | if (HeaderSize == 2)
132 | {
133 | _pendingLength = BitConverter.ToUInt16(_lengthBuffer, 0);
134 | }
135 | else if (HeaderSize == 4)
136 | {
137 | _pendingLength = BitConverter.ToInt32(_lengthBuffer, 0);
138 | }
139 | else
140 | {
141 | throw new Exception("Unsupported header size: " + HeaderSize);
142 | }
143 | _receiveBuffer.RemoveRange(0, HeaderSize);
144 |
145 | if (IsHeaderSizeIncluded) _pendingLength -= HeaderSize;
146 |
147 | if (_pendingLength < 0 || _pendingLength > MaxPacketLength)
148 | {
149 | _client.Close(new Exception("Tried to receive a too large packet"));
150 | return false;
151 | }
152 |
153 | return true;
154 | }
155 | return false;
156 | }
157 |
158 | private bool ExtractPendingPacket()
159 | {
160 | if (_receiveBuffer.Count >= _pendingLength)
161 | {
162 | byte[] packet = new byte[_pendingLength];
163 |
164 | _receiveBuffer.CopyTo(0, packet, 0, _pendingLength);
165 | _receiveBuffer.RemoveRange(0, _pendingLength);
166 | _pendingLength = 0;
167 |
168 | PacketReceived?.Invoke(packet);
169 | return true;
170 | }
171 | return false;
172 | }
173 | }
174 | }
175 |
--------------------------------------------------------------------------------
/YGOSharp.Network/AsyncNetworkServer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Net;
3 | using System.Net.Sockets;
4 |
5 | namespace YGOSharp.Network
6 | {
7 | public class AsyncNetworkServer
8 | {
9 | public bool IsListening { get; private set; }
10 |
11 | public event Action ClientConnected;
12 |
13 | private TcpListener _listener;
14 | private bool _isClosed;
15 |
16 | public AsyncNetworkServer(IPAddress address, int port)
17 | {
18 | _listener = new TcpListener(address, port);
19 | }
20 |
21 | public void Start()
22 | {
23 | if (!IsListening && !_isClosed)
24 | {
25 | IsListening = true;
26 | _listener.Start();
27 | BeginAcceptSocket();
28 | }
29 | }
30 |
31 | public void Close()
32 | {
33 | if (!_isClosed)
34 | {
35 | _isClosed = true;
36 | IsListening = false;
37 | _listener.Stop();
38 | }
39 | }
40 |
41 | private void BeginAcceptSocket()
42 | {
43 | try
44 | {
45 | _listener.BeginAcceptSocket(AcceptSocketCallback, null);
46 | }
47 | catch (Exception)
48 | {
49 | Close();
50 | }
51 | }
52 |
53 | private void AcceptSocketCallback(IAsyncResult result)
54 | {
55 | try
56 | {
57 | Socket socket = _listener.EndAcceptSocket(result);
58 | ClientConnected?.Invoke(new NetworkClient(socket));
59 | BeginAcceptSocket();
60 | }
61 | catch (Exception)
62 | {
63 | Close();
64 | }
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/YGOSharp.Network/AsyncYGOClient.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using YGOSharp.Network.Enums;
3 |
4 | namespace YGOSharp.Network
5 | {
6 | public class AsyncYGOClient : AsyncBinaryClient
7 | {
8 | public AsyncYGOClient()
9 | : base(new NetworkClient())
10 | {
11 | }
12 |
13 | public AsyncYGOClient(NetworkClient client)
14 | : base(client)
15 | {
16 | }
17 |
18 | public void Send(BinaryWriter writer)
19 | {
20 | Send(((MemoryStream)writer.BaseStream).ToArray());
21 | }
22 |
23 | public void Send(CtosMessage message)
24 | {
25 | using (BinaryWriter writer = new BinaryWriter(new MemoryStream()))
26 | {
27 | writer.Write((byte)message);
28 | Send(writer);
29 | }
30 | }
31 |
32 | public void Send(CtosMessage message, int value)
33 | {
34 | using (BinaryWriter writer = new BinaryWriter(new MemoryStream()))
35 | {
36 | writer.Write((byte)message);
37 | writer.Write(value);
38 | Send(writer);
39 | }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/YGOSharp.Network/Enums/CtosMessage.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.Network.Enums
2 | {
3 | public enum CtosMessage
4 | {
5 | Response = 0x1,
6 | UpdateDeck = 0x2,
7 | HandResult = 0x3,
8 | TpResult = 0x4,
9 | PlayerInfo = 0x10,
10 | CreateGame = 0x11,
11 | JoinGame = 0x12,
12 | LeaveGame = 0x13,
13 | Surrender = 0x14,
14 | TimeConfirm = 0x15,
15 | Chat = 0x16,
16 | HsToDuelist = 0x20,
17 | HsToObserver = 0x21,
18 | HsReady = 0x22,
19 | HsNotReady = 0x23,
20 | HsKick = 0x24,
21 | HsStart = 0x25,
22 | RematchResponse = 0xf0
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/YGOSharp.Network/Enums/GameState.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.Network.Enums
2 | {
3 | public enum GameState
4 | {
5 | Lobby = 0,
6 | Hand = 1,
7 | Starting = 2,
8 | Duel = 3,
9 | End = 4,
10 | Side = 5
11 | }
12 | }
--------------------------------------------------------------------------------
/YGOSharp.Network/Enums/PlayerChange.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.Network.Enums
2 | {
3 | public enum PlayerChange
4 | {
5 | Observe = 0x8,
6 | Ready = 0x9,
7 | NotReady = 0xA,
8 | Leave = 0xB
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/YGOSharp.Network/Enums/PlayerState.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.Network.Enums
2 | {
3 | public enum PlayerState
4 | {
5 | None = 0,
6 | Response = 1
7 | }
8 | }
--------------------------------------------------------------------------------
/YGOSharp.Network/Enums/PlayerType.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.Network.Enums
2 | {
3 | public enum PlayerType
4 | {
5 | Undefined = -1,
6 | Player1 = 0,
7 | Player2 = 1,
8 | Player3 = 2,
9 | Player4 = 3,
10 | Player5 = 4,
11 | Player6 = 5,
12 | Observer = 7,
13 | Host = 0x10,
14 | Red = 11,
15 | Green = 12,
16 | Blue = 13,
17 | BabyBlue = 14,
18 | Pink = 15,
19 | Yellow = 16,
20 | White = 17,
21 | Gray = 18
22 | }
23 | }
--------------------------------------------------------------------------------
/YGOSharp.Network/Enums/StocMessage.cs:
--------------------------------------------------------------------------------
1 | namespace YGOSharp.Network.Enums
2 | {
3 | public enum StocMessage
4 | {
5 | GameMsg = 0x1,
6 | ErrorMsg = 0x2,
7 | SelectHand = 0x3,
8 | SelectTp = 0x4,
9 | HandResult = 0x5,
10 | TpResult = 0x6,
11 | ChangeSide = 0x7,
12 | WaitingSide = 0x8,
13 | CreateGame = 0x11,
14 | JoinGame = 0x12,
15 | TypeChange = 0x13,
16 | LeaveGame = 0x14,
17 | DuelStart = 0x15,
18 | DuelEnd = 0x16,
19 | Replay = 0x17,
20 | TimeLimit = 0x18,
21 | Chat = 0x19,
22 | HsPlayerEnter = 0x20,
23 | HsPlayerChange = 0x21,
24 | HsWatchChange = 0x22,
25 | Rematch = 0xf1,
26 | WaitingRematch = 0xf2
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/YGOSharp.Network/NetworkClient.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Net;
3 | using System.Net.Sockets;
4 |
5 | namespace YGOSharp.Network
6 | {
7 | public class NetworkClient
8 | {
9 | public event Action Connected;
10 | public event Action Disconnected;
11 | public event Action DataReceived;
12 |
13 | public bool IsConnected { get; private set; }
14 |
15 | public IPAddress RemoteIPAddress
16 | {
17 | get { return _endPoint.Address; }
18 | }
19 |
20 | private const int BufferSize = 4096;
21 |
22 | private Socket _socket;
23 | private IPEndPoint _endPoint;
24 | private bool _isClosed;
25 | private byte[] _receiveBuffer = new byte[BufferSize];
26 |
27 | public NetworkClient()
28 | {
29 | }
30 |
31 | public NetworkClient(Socket socket)
32 | {
33 | Initialize(socket);
34 | }
35 |
36 | public void Initialize(Socket socket)
37 | {
38 | _endPoint = (IPEndPoint)socket.RemoteEndPoint;
39 | _socket = socket;
40 | IsConnected = true;
41 | Connected?.Invoke();
42 | }
43 |
44 | public void BeginConnect(IPAddress address, int port)
45 | {
46 | if (!IsConnected && !_isClosed)
47 | {
48 | IsConnected = true;
49 | try
50 | {
51 | _endPoint = new IPEndPoint(address, port);
52 | _socket = new Socket(_endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
53 | _socket.BeginConnect(_endPoint, new AsyncCallback(ConnectCallback), null);
54 | }
55 | catch (Exception ex)
56 | {
57 | Close(ex);
58 | }
59 | }
60 | }
61 |
62 | public void BeginSend(byte[] data)
63 | {
64 | try
65 | {
66 | _socket.BeginSend(data, 0, data.Length, SocketFlags.None, SendCallback, data.Length);
67 | }
68 | catch (Exception ex)
69 | {
70 | Close(ex);
71 | }
72 | }
73 |
74 | public void BeginReceive()
75 | {
76 | try
77 | {
78 | _socket.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, SocketFlags.None, ReceiveCallback, null);
79 | }
80 | catch (Exception ex)
81 | {
82 | Close(ex);
83 | }
84 | }
85 |
86 | public void Close(Exception error = null)
87 | {
88 | if (!_isClosed)
89 | {
90 | _isClosed = true;
91 | try
92 | {
93 | if (_socket != null)
94 | {
95 | _socket.Close();
96 | }
97 | }
98 | catch (Exception ex)
99 | {
100 | ex = new AggregateException(error, ex);
101 | }
102 | IsConnected = false;
103 | Disconnected?.Invoke(error);
104 | }
105 | }
106 |
107 | private void ConnectCallback(IAsyncResult result)
108 | {
109 | try
110 | {
111 | _socket.EndConnect(result);
112 | }
113 | catch (Exception ex)
114 | {
115 | Close(ex);
116 | return;
117 | }
118 | Connected?.Invoke();
119 | BeginReceive();
120 | }
121 |
122 | private void SendCallback(IAsyncResult result)
123 | {
124 | try
125 | {
126 | int bytesSent = _socket.EndSend(result);
127 | if (bytesSent != (int)result.AsyncState)
128 | {
129 | Close();
130 | }
131 | }
132 | catch (Exception ex)
133 | {
134 | Close(ex);
135 | }
136 | }
137 |
138 | private void ReceiveCallback(IAsyncResult result)
139 | {
140 | int bytesRead;
141 | try
142 | {
143 | bytesRead = _socket.EndReceive(result);
144 | }
145 | catch (Exception ex)
146 | {
147 | Close(ex);
148 | return;
149 | }
150 | if (bytesRead == 0)
151 | {
152 | Close();
153 | return;
154 | }
155 | byte[] data = new byte[bytesRead];
156 | Array.Copy(_receiveBuffer, data, bytesRead);
157 | DataReceived?.Invoke(data);
158 | BeginReceive();
159 | }
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/YGOSharp.Network/NetworkServer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Net;
4 | using System.Net.Sockets;
5 |
6 | namespace YGOSharp.Network
7 | {
8 | public class NetworkServer
9 | {
10 | public bool IsListening { get; private set; }
11 |
12 | public event Action ClientConnected;
13 |
14 | private TcpListener _listener;
15 | private bool _isClosed;
16 |
17 | private List _acceptedClients = new List();
18 |
19 | public NetworkServer(IPAddress address, int port)
20 | {
21 | _listener = new TcpListener(address, port);
22 | }
23 |
24 | public void Start()
25 | {
26 | if (!IsListening && !_isClosed)
27 | {
28 | IsListening = true;
29 | _listener.Start();
30 | BeginAcceptSocket();
31 | }
32 | }
33 |
34 | public void Close()
35 | {
36 | if (!_isClosed)
37 | {
38 | _isClosed = true;
39 | IsListening = false;
40 | _listener.Stop();
41 | }
42 | }
43 |
44 | public void Update()
45 | {
46 | List clients = new List();
47 | lock (_acceptedClients)
48 | {
49 | clients.AddRange(_acceptedClients);
50 | _acceptedClients.Clear();
51 | }
52 | foreach (NetworkClient client in clients)
53 | {
54 | ClientConnected?.Invoke(client);
55 | }
56 | }
57 |
58 | private void BeginAcceptSocket()
59 | {
60 | try
61 | {
62 | _listener.BeginAcceptSocket(AcceptSocketCallback, null);
63 | }
64 | catch (Exception)
65 | {
66 | Close();
67 | }
68 | }
69 |
70 | private void AcceptSocketCallback(IAsyncResult result)
71 | {
72 | try
73 | {
74 | Socket socket = _listener.EndAcceptSocket(result);
75 | NetworkClient client = new NetworkClient(socket);
76 | lock (_acceptedClients)
77 | {
78 | _acceptedClients.Add(client);
79 | }
80 | BeginAcceptSocket();
81 | }
82 | catch (Exception)
83 | {
84 | Close();
85 | }
86 | }
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/YGOSharp.Network/Utils/BinaryExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Text;
4 |
5 | namespace YGOSharp.Network.Utils
6 | {
7 | public static class BinaryExtensions
8 | {
9 | public static void WriteUnicode(this BinaryWriter writer, string text, int len)
10 | {
11 | byte[] unicode = Encoding.Unicode.GetBytes(text);
12 | byte[] result = new byte[len * 2];
13 | int max = len * 2 - 2;
14 | Array.Copy(unicode, result, unicode.Length > max ? max : unicode.Length);
15 | writer.Write(result);
16 | }
17 |
18 | public static string ReadUnicode(this BinaryReader reader, int len)
19 | {
20 | byte[] unicode = reader.ReadBytes(len * 2);
21 | string text = Encoding.Unicode.GetString(unicode);
22 | int index = text.IndexOf('\0');
23 | if (index > 0) text = text.Substring(0, index);
24 | return text;
25 | }
26 |
27 | public static byte[] ReadToEnd(this BinaryReader reader)
28 | {
29 | return reader.ReadBytes((int)(reader.BaseStream.Length - reader.BaseStream.Position));
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/YGOSharp.Network/YGOClient.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using YGOSharp.Network.Enums;
3 |
4 | namespace YGOSharp.Network
5 | {
6 | public class YGOClient : BinaryClient
7 | {
8 | public YGOClient()
9 | : base(new NetworkClient())
10 | {
11 | }
12 |
13 | public YGOClient(NetworkClient client)
14 | : base(client)
15 | {
16 | }
17 |
18 | public void Send(BinaryWriter writer)
19 | {
20 | Send(((MemoryStream)writer.BaseStream).ToArray());
21 | }
22 |
23 | public void Send(CtosMessage message)
24 | {
25 | using (BinaryWriter writer = new BinaryWriter(new MemoryStream()))
26 | {
27 | writer.Write((byte)message);
28 | Send(writer);
29 | }
30 | }
31 |
32 | public void Send(CtosMessage message, byte value)
33 | {
34 | using (BinaryWriter writer = new BinaryWriter(new MemoryStream()))
35 | {
36 | writer.Write((byte)message);
37 | writer.Write(value);
38 | Send(writer);
39 | }
40 | }
41 |
42 | public void Send(CtosMessage message, int value)
43 | {
44 | using (BinaryWriter writer = new BinaryWriter(new MemoryStream()))
45 | {
46 | writer.Write((byte)message);
47 | writer.Write(value);
48 | Send(writer);
49 | }
50 | }
51 |
52 | public void Send(CtosMessage message, long value)
53 | {
54 | using (BinaryWriter writer = new BinaryWriter(new MemoryStream()))
55 | {
56 | writer.Write((byte)message);
57 | writer.Write(value);
58 | Send(writer);
59 | }
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/appveyor.yml:
--------------------------------------------------------------------------------
1 | version: '{build}'
2 |
3 | environment:
4 | access_token:
5 | secure: DOOS4g7CT8ctOgiMr62K56qQ1FO6s2ESpqNZlhf8F4nomemvvwxV/pRj9nbKmtjR
6 |
7 | platform: x86
8 | configuration: Release
9 |
10 | build:
11 | project: WindBot.sln
12 | parallel: true
13 |
14 | after_build:
15 | - mv bin\Release WindBot
16 | - rm WindBot\WindBot.exe.config
17 | - mv BotWrapper\bin\Release\Bot.exe .
18 | - mv BotWrapper\bin\Release\bot.conf .
19 | - 7z a WindBot.7z WindBot Bot.exe bot.conf
20 |
21 | test: off
22 |
23 | artifacts:
24 | - path: WindBot.7z
25 | name: WindBot
26 |
27 | deploy:
28 | description: 'Automatic build by Appveyor.'
29 | provider: GitHub
30 | auth_token: $(access_token)
31 | force_update: true
32 | on:
33 | appveyor_repo_tag: true
34 |
--------------------------------------------------------------------------------
/ci/deploy.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Original: https://github.com/edo9300/ygopro-core/blob/master/travis/deploy.sh
4 |
5 | set -euo pipefail
6 |
7 | cd bin
8 | git init
9 | git checkout --orphan $DEPLOY_BRANCH
10 | git config user.email github-actions[bot]@users.noreply.github.com
11 | git config user.name "github-actions[bot]"
12 | git add -A WindBot
13 | git commit -qm "Deploy $DEPLOY_REPO to $DEPLOY_REPO:$DEPLOY_BRANCH"
14 | git push -qf https://$DEPLOY_TOKEN@github.com/$DEPLOY_REPO.git $DEPLOY_BRANCH:$DEPLOY_BRANCH
15 |
--------------------------------------------------------------------------------
/ci/install-sdk-ndk.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -euxo pipefail
4 |
5 | # Embeddinator uses Xamarin Android Tools to find Android SDKs, NDKs, and Java SDKs
6 | # The main registry key is decided by the envvar read here under Visual Studio and MSBuild
7 | # https://github.com/xamarin/xamarin-android-tools/blob/294f4471a76da6df798c8520a8f8da0e6e83d3a5/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs#L65
8 | # that is set by Xamarin Android here in the build tasks
9 | # https://github.com/xamarin/xamarin-android/blob/d4c8f077faefdfc6174355848a9d8c74ecaa8f56/src/Xamarin.Android.Build.Tasks/Tasks/SetVsMonoAndroidRegistryKey.cs
10 | # and ultimately obtained by reading out the Visual Studio installation id, which seems to be unique
11 | # https://github.com/xamarin/xamarin-android/blob/a677c1794db64d5559f53a960927447bac3063a2/src/Xamarin.Android.Build.Tasks/MSBuild/Xamarin/Xamarin.Android.Sdk.props#L16
12 |
13 | # devenv.isolation.ini does not exist on Travis CI since there is no IDE though, only build tools
14 | # so it's unclear where this installation id is obtained from.
15 | # VSROOT="/c/Program Files (x86)/Microsoft Visual Studio/2017"
16 | # INSTALLATION_ID=$(grep InstallationID= "$VSROOT/Common7/IDE/devenv.isolation.ini" | cut -f2 -d=)
17 | # Thus for now, the installation ID after 15.0_ must be manually updated if Travis CI updates the Windows runner
18 | # Visual Studio id for github actions 2019 16.0_42bb5ccc
19 | # Visual Studio id for github actions 2016 15.0_87d23d74
20 | # Visual Studio id for travis ci 15.0_09147932
21 |
22 | # As workaround to find the installation id of visual studio,
23 | # use the registry key used to associate .vssettings file extensions
24 | # and extract the installation id from there,
25 | # the runner has to set the "VS_PREFIX" environment variable (like "16.0_")
26 | # to be able to generate the full installation id
27 |
28 | KEY=$(echo $(reg query 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.vssettings\OpenWithProgids') | cut -d ' ' -f 3)
29 | INSTALLATION_ID="$VS_PREFIX${KEY##*.}"
30 |
31 | # These registry entries are normally set through the GUI: Tools\Options\Xamarin\Android Settings
32 | reg add 'HKCU\SOFTWARE\Xamarin\VisualStudio\'$INSTALLATION_ID'\Android' -v AndroidSdkDirectory -t REG_SZ -d "$ANDROID_SDK_ROOT" -f
33 | # Sometimes installed by Microsoft in C:\ProgramData\Microsoft\AndroidNDK64 but not present on CI
34 | reg add 'HKCU\SOFTWARE\Xamarin\VisualStudio\'$INSTALLATION_ID'\Android' -v AndroidNdkDirectory -t REG_SZ -d "C:\android-ndk-r15c" -f
35 | # Visual Studio Installer provides this JDK for Android development
36 | reg add 'HKCU\SOFTWARE\Xamarin\VisualStudio\'$INSTALLATION_ID'\Android' -v JavaSdkDirectory -t REG_SZ -d "$JAVA_HOME" -f
37 |
38 | # Manually install Android SDK Platform 24, the most recent version that still works with Embeddinator 0.4.0
39 | # Manually install Android SDK Platform 25, version needed by Xamarin
40 | (yes || true) | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager.bat --sdk_root=$ANDROID_SDK_ROOT "build-tools;28.0.2" "platforms;android-24" "platforms;android-25"
41 |
42 | # Manually install Android NDK r15c, the most recent version that still works with Embeddinator 0.4.0
43 | curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://dl.google.com/android/repository/android-ndk-r15c-windows-x86_64.zip
44 | echo "970bb2496de0eada74674bb1b06d79165f725696 *android-ndk-r15c-windows-x86_64.zip" | sha1sum -c
45 | 7z x android-ndk-r15c-windows-x86_64.zip -o'C:'
46 |
--------------------------------------------------------------------------------
/sqlite3.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProjectIgnis/windbot/5d6d66e68ac1408cefa5473a82e97f904152425b/sqlite3.dll
--------------------------------------------------------------------------------