├── .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 --------------------------------------------------------------------------------