Commit b7592a90 authored by 苍蓝's avatar 苍蓝

传说更新

parent 90f88870
Pipeline #19983 passed with stage
in 2 minutes and 16 seconds
......@@ -6,12 +6,12 @@
!齿车戒龙
Name=齿车戒龙 Deck=MokeyMokey Dialog=rd-a
卡组。
卡组。
SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!破坏剑士
Name=破坏剑士 Deck=MokeyMokeyKing Dialog=zh-CN
加强版龙法卡组。需勾选不检查卡组才能对战
加强版龙魔卡组
SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!大恐龙驾
......@@ -32,4 +32,9 @@ SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!幻宇子
Name=幻宇子 Deck=Mituzi Dialog=Mituzi.zh-CN
新手友好型幻龙卡组。
SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
\ No newline at end of file
SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
!P2-自选卡组
Name=P2 Deck=Lucky Dialog=gugugu.zh-CN
人机卡组由你选择。随缘出牌。
SELECT_DECKFILE SUPPORT_MASTER_RULE_3 SUPPORT_NEW_MASTER_RULE SUPPORT_MASTER_RULE_2020
\ No newline at end of file
#created by ...
#main
2563463
81866673
72090076
63362460
30680659
30680659
30680659
26202165
26202165
26202165
91646304
14558127
14558127
14558127
72291078
72291078
23434538
23434538
9742784
97268402
3285551
3285551
3285551
18144506
52947044
52947044
52947044
81439173
83764718
24224830
24224830
65681983
65681983
39568067
38745520
10045474
10045474
10045474
40605147
40605147
#extra
15291624
60461804
84815190
92519087
27548199
42566602
90953320
98558751
21915012
44097050
50588353
70369116
98978921
98978921
60303245
!side
55063751
55063751
55063751
34267821
34267821
34267821
43534808
43534808
43534808
94145021
94145021
94145021
14532163
14532163
14532163
#created by ygomobile
#created by ...
#main
120151006
120151006
......@@ -9,6 +9,7 @@
120151005
120151005
120151005
120194001
120130029
120130029
120130029
......@@ -21,25 +22,23 @@
120151013
120151013
120151011
120151011
120151009
120151009
120151009
120151010
120151010
120151010
120151015
120151015
120151016
120151018
120151018
120151018
120151015
120151015
120151017
120151017
120151016
120151020
120151020
120151020
120151019
120232005
#extra
!side
\ No newline at end of file
!side
#created by ...
#main
120238019
120199020
120199020
120199020
120155024
120155024
120155024
120151029
120151029
120155002
......@@ -8,17 +15,11 @@
120155001
120155001
120155001
120155022
120155022
120155024
120155024
120155024
120192010
120192010
120192010
120192011
120192011
120192011
120183034
120183034
120183034
......@@ -37,8 +38,8 @@
120155042
120151033
120151033
120155053
120155053
120155054
120155053
120198003
#extra
!side
#created by ...
#main
120151023
120170000
120110001
120110001
......@@ -8,8 +7,6 @@
120105001
120105001
120105001
120110005
120110005
120105005
120105005
120145001
......@@ -18,8 +15,6 @@
120105006
120105006
120105006
120145014
120145014
120120018
120120018
120120018
......@@ -29,16 +24,20 @@
120110009
120110009
120110009
120228031
120228031
120226013
120226013
120226013
120231069
120228050
120105012
120105012
120105012
120110012
120110012
120105013
120105013
120105013
120105014
120170065
120150019
#extra
......
#created by ...
#main
120170000
120170000
120170000
120120000
120120000
120120000
120110001
120110001
120110001
120145000
120145000
120105001
120105005
120105005
120105005
120145001
120145001
120145001
120105006
120105006
120105006
120145014
120145014
120120018
120228031
120228031
120228031
120120018
120120018
120130016
......@@ -27,18 +26,20 @@
120130016
120110009
120110009
120151023
120105012
120110009
120181003
120194004
120231069
120203028
120203028
120105012
120105012
120110012
120110012
120105013
120105013
120105013
120105014
120150019
120150019
120150019
120232005
120198003
#extra
!side
#created by ...
#main
120193002
120183002
120183031
120155015
120155015
120155015
120181011
120181011
120181011
120183054
120183054
120181001
120193002
120193002
120183002
120183002
120183002
120181001
120181001
120155015
120155015
120183024
120183024
120208000
120193002
120193002
120193002
120183002
120224010
120224010
120224010
120183031
120183031
120183030
120183030
120183030
120151010
120183031
120183031
120183031
120181011
120181011
120181011
120193003
120193003
120193003
120199052
120199052
120183054
120183054
120231069
120130039
120130039
120183054
120151023
120155060
120155060
120183062
120183063
120183063
120170061
120183064
120198003
#extra
!side
......@@ -3,42 +3,42 @@
120120000
120120000
120120000
120170000
120170000
120110001
120110001
120155000
120194001
120130000
120130000
120130000
120208000
120194002
120194002
120194002
120194003
120194003
120194003
120151010
120151010
120110009
120110009
120110009
120170035
120170035
120223101
120223101
120223101
120214001
120214001
120214001
120199032
120199032
120199032
120120017
120120017
120120017
120194004
120151023
120151023
120151023
120181003
120181003
120181003
120151018
120151018
120194005
120194005
120194005
120150019
120150019
120203028
120203028
120130041
120130041
120214010
120194004
120214003
120217100
120150019
120198003
120198003
120198003
#extra
!side
\ No newline at end of file
!side
#created by ...
#main
5206415
32731036
32731036
90488465
6637331
6637331
33854624
33854624
29596581
29596581
83107873
83107873
31786629
31786629
31786629
56713174
56713174
56713174
61901281
61901281
99234526
99234526
92998610
92998610
44586426
44586426
44586426
14558127
14558127
23434538
23434538
23434538
76218313
20318029
20318029
20318029
1475311
1475311
1475311
75500286
95238394
95238394
99266988
99266988
99266988
24224830
24224830
34090915
10045474
10045474
#extra
41685633
41685633
15291624
21044178
98127546
21887175
86066372
4280258
38342335
83152482
65741786
50277355
70369116
73539069
41999284
!side
{
"welcome": [
"你好呀,打牌人",
"你好,欢迎和我耍牌"
],
"deckerror": [
"抱歉,我的卡组需要{0}才可以耍"
],
"duelstart": [
"嘿嘿,我要用二哥打爆你。",
"我的卡组不屁股,也就塞了几张禁卡捏",
"我只会耍简单的卡组,不要用禁卡和我打拉"
],
"newturn": [
"到我喽,抽卡!(裤裆偷偷掏出)",
"我抽一张卡"
],
"endturn": [
"我耍完了,到你了",
"到你回合了哦,不会是多线程决斗吧?"
],
"directattack": [
"{0},攻击对手!",
"{0},撞烂它!",
"{0},小拳揍它!"
],
"attack": [
"{0},把{1}打倒!",
"嘿嘿,{0},攻击{1}!"
],
"ondirectattack": [
"啊,不要打我,我放禁卡给你玩",
"呀,太强辣,可以带带我嘛",
"好痛...想拔电源"
],
"facedownmonstername": "怪兽",
"activate": [
"嘿嘿,我发动{0}",
"嘎嘎,我使用{0}的力量"
],
"summon": [
"我召唤(掏出){0}!",
"出来,我的小怪兽{0}!"
],
"setmonster": [
"我放置一只不知名怪兽。"
],
"chaining": [
"嘿,我能用禁卡气不气?",
"乎,我发动{0}!",
"不好意思拉,我有{0}",
"哈哈,发动{0}的效果!"
]
}
......@@ -12,7 +12,7 @@
"接下来就是我的舞台"
],
"endturn": [
"我的回合结束,试试来击溃我吧"
"每个人的目的不同,我更注重强度,我只想赢。"
],
"directattack": [
"老子上了,要你的命"
......
......@@ -22,7 +22,7 @@
"directattack": [
"{0},直接攻击!",
"不过如此嘛,直接攻击!",
"快走开,我要回去睡觉了。",
"快走开,我要回去睡觉了。"
],
"attack": [
"{0},攻击{1}!",
......
......@@ -23,7 +23,10 @@ namespace WindBot.Game.AI
{
return !card.IsDisabled() && Enum.IsDefined(typeof(DangerousMonster), card.Id);
}
public static bool IsMonsterImmuneTrap(this ClientCard card)
{
return !card.IsDisabled() && Enum.IsDefined(typeof(ImmuneTrapMonster), card.Id);
}
/// <summary>
/// Do this monster prevents activation of opponent's effect monsters in battle?
/// </summary>
......
This diff is collapsed.
......@@ -51,18 +51,20 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Summon, CardId.成金恐龙王, 成金恐龙王Summon);
AddExecutor(ExecutorType.Activate, CardId.恐龙粉碎, 恐龙粉碎Effect);
AddExecutor(ExecutorType.SummonOrSet, CardId.荒野盗龙, DefaultMonsterSummon);
AddExecutor(ExecutorType.SummonOrSet, CardId.名流雷龙, DefaultMonsterSummon);
AddExecutor(ExecutorType.SummonOrSet, CardId.名流雷龙, DefaultMonsterSummon);
AddExecutor(ExecutorType.MonsterSet, _CardId.千年盾, DefaultMonsterSummon);
AddExecutor(ExecutorType.MonsterSet, CardId.大恐龙驾L, MAXLset);
AddExecutor(ExecutorType.MonsterSet, CardId.大恐龙驾R, MAXRset);
AddExecutor(ExecutorType.MonsterSet, CardId.抑龙);
AddExecutor(ExecutorType.MonsterSet, CardId.成金恐龙王);
AddExecutor(ExecutorType.MonsterSet, CardId.名流雷龙, monsterset);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Activate, CardId.侏罗纪世界);
AddExecutor(ExecutorType.Activate, CardId.恐力重压);
AddExecutor(ExecutorType.Activate, CardId.超越进化, 超越进化Effect);
AddExecutor(ExecutorType.SpellSet);
AddExecutor(ExecutorType.SpellSet);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Repos, 圣防Repos);
//AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
}
......
......@@ -523,7 +523,7 @@ namespace WindBot.Game.AI.Decks
targets.Add(e_c);
if (targets.Count >= 5)
{
AI.SelectCard(targets);
AI.SelectMaterials(targets, HintMsg.Remove);
/*AI.SelectCard(new[] {
CardId.BingirsuTheWorldChaliceWarrior,
CardId.TopologicTrisbaena,
......@@ -548,7 +548,7 @@ namespace WindBot.Game.AI.Decks
targets.Add(s_c);
if (targets.Count >= 5)
{
AI.SelectCard(targets);
AI.SelectMaterials(targets, HintMsg.Remove);
return true;
}
}
......
......@@ -13,16 +13,22 @@ namespace WindBot.Game.AI.Decks
public LuckyExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, _CardId.黑洞, 黑洞Effect);
AddExecutor(ExecutorType.Activate, ImFeelingLucky);
AddExecutor(ExecutorType.SpSummon, ImFeelingLucky);
AddExecutor(ExecutorType.SpSummon, ImFeelingUnlucky);
AddExecutor(ExecutorType.Activate, ImFeelingUnlucky);
AddExecutor(ExecutorType.SummonOrSet, ImFeelingLazy);
AddExecutor(ExecutorType.SpellSet, DefaultSpellSet);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Activate, _CardId.大风暴, 大风暴Effect);
AddExecutor(ExecutorType.Activate, _CardId.魔法筒, 魔法筒Effect);
AddExecutor(ExecutorType.Activate, _CardId.炸甲, 炸甲Effect);
AddExecutor(ExecutorType.Activate, _CardId.落穴, 落穴Effect);
AddExecutor(ExecutorType.Activate, _CardId.激流葬, 激流葬Effect);
AddExecutor(ExecutorType.Activate, _CardId.圣防, 圣防Effect);
AddExecutor(ExecutorType.Activate, _CardId.暗黑释放, 圣防Effect);
AddExecutor(ExecutorType.Activate, _CardId.手枪龙, 手枪龙Effect);
AddExecutor(ExecutorType.Activate, _CardId.MysticalSpaceTyphoon, DefaultMysticalSpaceTyphoon);
AddExecutor(ExecutorType.Activate, _CardId.CosmicCyclone, DefaultCosmicCyclone);
AddExecutor(ExecutorType.Activate, _CardId.GalaxyCyclone, DefaultGalaxyCyclone);
......@@ -81,6 +87,13 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Summon, _CardId.LeftLegofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.RightArmofTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.ExodiaTheForbiddenOne, JustDontIt);
AddExecutor(ExecutorType.Summon, _CardId.伟大魔兽, 伟大魔兽Sum);
AddExecutor(ExecutorType.MonsterSet, _CardId.千年盾, DefaultMonsterSummon);
AddExecutor(ExecutorType.Activate, _CardId.死供, 死供Effect);
AddExecutor(ExecutorType.Repos, 圣防Repos);
AddExecutor(ExecutorType.Activate, _CardId.死苏, 死苏Effect);
AddExecutor(ExecutorType.Activate, _CardId.死苏2, 死苏Effect);
AddExecutor(ExecutorType.SpellSet, DefaultSpellSet);
}
private List<int> HintMsgForEnemy = new List<int>
......
......@@ -15,6 +15,7 @@ namespace WindBot.Game.AI.Decks
{
public class CardId
{
public const int 起重龙 = 120199020;
public const int 幻龙重骑 = 120155022;
public const int 建造龙 = 120155024;
public const int 幻刃破龙 = 120151029;
......@@ -38,36 +39,45 @@ namespace WindBot.Game.AI.Decks
}
public int[] priList = { CardId.建造龙, CardId.幻龙重骑, CardId.幻刃破龙 };
public int[] rePriList = { CardId.幻刃破龙, CardId.幻龙重骑, CardId.建造龙 };
public int[] priList = { CardId.起重龙, CardId.建造龙, CardId.幻龙重骑, CardId.幻刃破龙 };
public int[] rePriList = { CardId.幻刃破龙, CardId.幻龙重骑, CardId.建造龙, CardId.起重龙, };
public MituziExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, _CardId.黑洞, 黑洞Effect);
AddExecutor(ExecutorType.SpSummon);
AddExecutor(ExecutorType.Activate, _CardId.魔法筒, 魔法筒Effect);
AddExecutor(ExecutorType.Activate, _CardId.炸甲, 炸甲Effect);
AddExecutor(ExecutorType.Activate, _CardId.落穴, 落穴Effect);
AddExecutor(ExecutorType.Activate, _CardId.激流葬, 激流葬Effect);
AddExecutor(ExecutorType.Activate, _CardId.圣防, 圣防Effect);
AddExecutor(ExecutorType.Activate, CardId.阴阳封阵, 阴阳封阵Effect);
AddExecutor(ExecutorType.SpellSet, CardId.阴阳封阵);
AddExecutor(ExecutorType.Activate, CardId.透幻乡险峻,DefaultField);
AddExecutor(ExecutorType.Repos, 圣防Repos);
AddExecutor(ExecutorType.Repos, 幻刃急攻Repos);
AddExecutor(ExecutorType.Activate, CardId.);
AddExecutor(ExecutorType.Activate,CardId.丰沃蟠龙,丰沃蟠龙Effect);
AddExecutor(ExecutorType.Activate, CardId.荒废蟠龙, 荒废蟠龙Effect);
AddExecutor(ExecutorType.Activate, CardId.搅拌龙, 搅拌龙Effect);
AddExecutor(ExecutorType.Activate, CardId.风车鳞虫);
AddExecutor(ExecutorType.Activate, CardId.镐头龙, 镐头龙Effect);
AddExecutor(ExecutorType.Activate, CardId.起重龙);
AddExecutor(ExecutorType.Activate, CardId.建造龙, 建造龙Effect);
AddExecutor(ExecutorType.Activate, CardId.镐头龙, 镐头龙Effect);
AddExecutor(ExecutorType.Summon, CardId.镐头龙, 镐头龙Summon);
AddExecutor(ExecutorType.Summon, CardId.搅拌龙, 搅拌龙Summon);
AddExecutor(ExecutorType.MonsterSet, 幻刃急攻Set);
AddExecutor(ExecutorType.Summon, 幻刃急攻Summon);
AddExecutor(ExecutorType.Activate, CardId.死者苏生, 者苏生Effect);
AddExecutor(ExecutorType.SummonOrSet, DefaultMonsterSummon);
AddExecutor(ExecutorType.Activate, CardId.死者苏生, Effect);
AddExecutor(ExecutorType.Activate, CardId.贯通, 贯通Effect);
AddExecutor(ExecutorType.Summon, _CardId.伟大魔兽, 伟大魔兽Sum);
AddExecutor(ExecutorType.Activate, CardId.幻刃复归, 幻刃复归Effect);
AddExecutor(ExecutorType.Activate, CardId.幻刃封锁, 幻刃封锁Effect);
AddExecutor(ExecutorType.Activate, CardId.幻刃急攻, 幻刃急攻Effect);
AddExecutor(ExecutorType.Activate, CardId.透幻乡险峻);
AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Repos, 圣防Repos);
AddExecutor(ExecutorType.SpellSet, TrapCardSet);
AddExecutor(ExecutorType.SpellSet);
}
......@@ -173,7 +183,7 @@ namespace WindBot.Game.AI.Decks
private bool 镐头龙Summon()
{
if (Bot.HasInMonstersZone(CardId.幻刃破龙) && Bot.HasInHand(CardId.建造龙))
if (Bot.HasInMonstersZone(CardId.幻刃破龙) && Bot.HasInHand(CardId.建造龙) && Bot.HasInHand(CardId.起重龙))
return Discord1Draw1Eff(CardRace.Wyrm, false, true);
return Discord1Draw1Eff(CardRace.Wyrm, false, false);
}
......@@ -330,7 +340,7 @@ namespace WindBot.Game.AI.Decks
}
private bool 镐头龙Effect()
{
if (Bot.HasInMonstersZone(CardId.幻刃破龙) && Bot.HasInHand(CardId.建造龙))
if (Bot.HasInMonstersZone(CardId.幻刃破龙) && Bot.HasInHand(CardId.建造龙) && Bot.HasInHand(CardId.起重龙))
return Discord1Draw1Eff(CardRace.Wyrm, true, true);
return Discord1Draw1Eff(CardRace.Wyrm, true, false);
}
......@@ -514,7 +524,7 @@ namespace WindBot.Game.AI.Decks
{
if (isAISelect)
{
int[] localList = new int[] { CardId.建造龙, CardId.幻龙重骑 };
int[] localList = new int[] { CardId.建造龙, CardId.幻龙重骑, CardId.起重龙 };
if (Bot.HasInMonstersZone(CardId.建造龙) && 建造龙Effect(true, false))
{
if (Bot.HasInGraveyard(localList[0]) || Bot.HasInGraveyard(localList[1]))
......@@ -616,23 +626,6 @@ namespace WindBot.Game.AI.Decks
AI.SelectNextCard(Duel.LastSummonedCards);
return true;
}
private bool 死者苏生Effect()
{
if (Enemy.Graveyard.GetMatchingCardsCount(card => card.Level > 6)+
Bot.Graveyard.GetMatchingCardsCount(card => card.Level > 6)>0)
{
IList<ClientCard>
EmList = Enemy.Graveyard.GetMatchingCards(card => card.Level > 6),
BotList = Bot.Graveyard.GetMatchingCards(card => card.Level > 6),
unionList = EmList.Concat(BotList).ToList();
AI.SelectCard(unionList.OrderByDescending(card=>card.Attack).FirstOrDefault());
AI.SelectPosition(CardPosition.FaceUpAttack);
return true;
}
return false;
}
//泛用墓地回收函数,内置AISelectCard, slcNum:回收数量,idList优先回收ID表,keepNums保留数量表,执行成功返回true
private bool GraveReturnSelect(int slcNum ,int[] idList,int[] keepNums)
......@@ -677,14 +670,5 @@ namespace WindBot.Game.AI.Decks
}
return false;
}
private bool 圣防Repos()
{
if (Enemy.Graveyard.GetMatchingCardsCount(card => (card.Race & (int)CardRace.SpellCaster) > 0) >= 4 && Enemy.GetSpellCountWithoutField() >= 1 && Enemy.Graveyard.GetMatchingCardsCount(card => card.IsCode(CardId.暗黑释放)) < 3)
{
if (Card.IsAttack() && Card.Level>6 && Bot.MonsterZone.GetMatchingCardsCount(card => card.IsAttack() && card.Level >= 5) >= 2 && !Bot.HasDefendingMonster())
return true;
}
return false;
}
}
}
......@@ -23,6 +23,7 @@ namespace WindBot.Game.AI.Decks
public const int 七星道魔术师 = 120105001;
public const int 雅灭鲁拉 = 120120029;
public const int 耳语妖精 = 120120018;
public const int 侏儒兔 = 120228031;
public const int 神秘庄家 = 120105006;
public const int 光芒巫师 = 120145001;
public const int 暗黑巫师 = 120105005;
......@@ -39,9 +40,11 @@ namespace WindBot.Game.AI.Decks
public MokeyMokeyExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, _CardId.黑洞, 黑洞Effect);
AddExecutor(ExecutorType.SpSummon);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Activate, CardId.七星道法师,七星道法师Effect);
AddExecutor(ExecutorType.Activate, CardId.侏儒兔,侏儒兔Effect);
AddExecutor(ExecutorType.Activate, CardId.七星道法师, 七星道法师Effect);
AddExecutor(ExecutorType.Activate, CardId.对死者的供奉, 死供Eff);
AddExecutor(ExecutorType.SummonOrSet, CardId.青眼白龙, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.破坏之剑士, DefaultMonsterSummon);
......@@ -53,24 +56,29 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Summon, CardId.七星道魔术师, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.人造人, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.神秘庄家);
AddExecutor(ExecutorType.Summon, CardId.侏儒兔, 侏儒兔Summon);
AddExecutor(ExecutorType.Activate, CardId.神秘庄家, draweffect);
AddExecutor(ExecutorType.SpellSet, CardId.暗黑释放, 圣防Effect);
AddExecutor(ExecutorType.SpellSet, CardId.落穴);
AddExecutor(ExecutorType.Activate, _CardId.魔法筒, 魔法筒Effect);
AddExecutor(ExecutorType.Activate, _CardId.炸甲, 炸甲Effect);
AddExecutor(ExecutorType.Activate, CardId.落穴, 落穴Effect);
AddExecutor(ExecutorType.Activate, _CardId.激流葬, 激流葬Effect);
AddExecutor(ExecutorType.Activate, _CardId.圣防, 圣防Effect);
AddExecutor(ExecutorType.Activate, CardId.对死者的供奉, 死供Effect);
AddExecutor(ExecutorType.SpellSet, CardId.对死者的供奉);
AddExecutor(ExecutorType.Activate, CardId.凤凰龙);
AddExecutor(ExecutorType.Summon, CardId.凤凰龙, 凤凰龙summon);
AddExecutor(ExecutorType.MonsterSet, CardId.凤凰龙);
AddExecutor(ExecutorType.MonsterSet, CardId.侏儒兔);
AddExecutor(ExecutorType.MonsterSet, CardId.火星心少女, Monsterset);
AddExecutor(ExecutorType.MonsterSet, CardId.七星道法师, Monsterset);
AddExecutor(ExecutorType.MonsterSet, CardId.耳语妖精, Monsterset);
AddExecutor(ExecutorType.Summon, CardId.七星道法师);
AddExecutor(ExecutorType.Summon, _CardId.结界像);
AddExecutor(ExecutorType.SummonOrSet, DefaultMonsterSummon);
AddExecutor(ExecutorType.Repos, CardId.青眼白龙, 圣防Repos);
AddExecutor(ExecutorType.Repos, CardId.破坏之剑士, 圣防Repos);
AddExecutor(ExecutorType.SpellSet);
//AddExecutor(ExecutorType.Activate, CardId.sionmax, sionmaxEffect);
AddExecutor(ExecutorType.Activate, CardId.耳语妖精, 耳语妖精Effect);
......@@ -80,6 +88,8 @@ namespace WindBot.Game.AI.Decks
//AddExecutor(ExecutorType.Activate, CardId.斗牛士, 斗牛士Effect);
AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
AddExecutor(ExecutorType.Repos, CardId.青眼白龙, 圣防Repos);
AddExecutor(ExecutorType.Repos, CardId.破坏之剑士, 圣防Repos);
}
......@@ -169,23 +179,8 @@ namespace WindBot.Game.AI.Decks
targets.Add(card);
}
return true;
}
private bool 落穴Effect()
{
foreach (ClientCard n in Duel.LastSummonedCards)
{
if (n.Attack >= 1900) return true;
if (Util.GetTotalAttackingMonsterAttack(1) - Util.GetTotalAttackingMonsterAttack(0) > Bot.LifePoints && !Bot.HasDefendingMonster()) return true;
}
return false;
}
private bool 圣防Effect()
{
if (Util.GetTotalAttackingMonsterAttack(1) > 1900) return true;
if (Util.GetTotalAttackingMonsterAttack(1) - Util.GetTotalAttackingMonsterAttack(0) > Bot.LifePoints && !Bot.HasDefendingMonster()) return true;
return false;
}
private bool 火星心少女Effect()
{
foreach (ClientCard m in Bot.Hand)
......@@ -194,25 +189,6 @@ namespace WindBot.Game.AI.Decks
AI.SelectYesNo(true);
return true;
}
private bool 死供Effect()
{
if (Util.IsOneEnemyBetterThanValue(1900, false))
{
foreach (ClientCard m in Bot.Hand)
AI.SelectCard(m);
foreach (ClientCard mon in Enemy.GetMonsters())
if (mon.Level >= 9)
AI.SelectNextCard(mon);
else if (mon.Level >= 8)
AI.SelectNextCard(mon);
else if (mon.Level >= 7)
AI.SelectNextCard(mon);
else if (mon.Level >= 5)
AI.SelectNextCard(mon);
return true;
}
return false;
}
private bool 死供Eff()
{
if (Util.IsOneEnemyBetterThanValue(2600, false))
......@@ -230,6 +206,28 @@ namespace WindBot.Game.AI.Decks
}
return false;
}
private bool 侏儒兔Summon()
{
if (Bot.HasInHandOrHasInMonstersZone(new[] {
CardId.七星道魔术师,
CardId.连击龙,
CardId.青眼白龙,
CardId.人造人,
CardId.恶魔召唤,
CardId.雅灭鲁拉,
CardId.破坏之剑士,
CardId.真红眼黑龙,
CardId.黑魔术师
}))
return true;
return false;
}
private bool 侏儒兔Effect()
{
AI.SelectYesNo(false);
return true;
}
private bool 七星道法师Effect()
{
AI.SelectCard(Enemy.GetMonsters().GetHighestAttackMonster());
......@@ -246,7 +244,7 @@ namespace WindBot.Game.AI.Decks
return false;
}
else
AI.SelectCard(CardId.七星道法师, CardId.火星心少女, CardId.耳语妖精, CardId.神秘庄家, CardId.光芒巫师, CardId.暗黑巫师);
AI.SelectCard(CardId.七星道法师, CardId.火星心少女, CardId.侏儒兔, CardId.耳语妖精, CardId.神秘庄家, CardId.光芒巫师, CardId.暗黑巫师);
return true;
}
private bool 凤凰龙summon()
......@@ -259,15 +257,6 @@ namespace WindBot.Game.AI.Decks
}
return false;
}
private bool 圣防Repos()
{
if (Enemy.Graveyard.GetMatchingCardsCount(card => (card.Race & (int)CardRace.SpellCaster) > 0) >= 4 && Enemy.GetSpellCountWithoutField() >= 1 && !Bot.HasInMonstersZone(CardId.人造人) && Enemy.Graveyard.GetMatchingCardsCount(card => card.IsCode(CardId.暗黑释放)) < 3)
{
if (Bot.MonsterZone.GetMatchingCardsCount(card => card.IsAttack() && card.Level >= 5) >= 2 && !Bot.HasDefendingMonster())
return true;
}
return false;
}
}
......
......@@ -27,6 +27,7 @@ namespace WindBot.Game.AI.Decks
public const int 雅灭鲁拉 = 120120029;
public const int 耳语妖精 = 120120018;
public const int 神秘庄家 = 120105006;
public const int 侏儒兔 = 120228031;
public const int 光芒巫师 = 120145001;
public const int 暗黑巫师 = 120105005;
public const int 火星心少女 = 120145014;
......@@ -45,11 +46,13 @@ namespace WindBot.Game.AI.Decks
public MokeyMokeyKingExecutor(GameAI ai, Duel duel)
: base(ai, duel)
{
AddExecutor(ExecutorType.Activate, _CardId.黑洞, 黑洞Effect);
AddExecutor(ExecutorType.Activate, _CardId.疾风弹, 疾风弹Effect);
AddExecutor(ExecutorType.SpSummon);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.Activate, CardId.七星道法师, 七星道法师Effect);
AddExecutor(ExecutorType.Activate, CardId.侏儒兔, 侏儒兔Effect);
AddExecutor(ExecutorType.Activate, CardId.对死者的供奉, 死供Eff);
AddExecutor(ExecutorType.SummonOrSet, CardId.青眼白龙, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.青眼白龙, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.破坏之剑士, DefaultMonsterSummon);
AddExecutor(ExecutorType.SummonOrSet, CardId.恶魔召唤, DefaultMonsterSummon);
AddExecutor(ExecutorType.SummonOrSet, CardId.连击龙, DefaultMonsterSummon);
......@@ -59,33 +62,39 @@ namespace WindBot.Game.AI.Decks
AddExecutor(ExecutorType.Summon, CardId.七星道魔术师, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.人造人, DefaultMonsterSummon);
AddExecutor(ExecutorType.Summon, CardId.神秘庄家);
AddExecutor(ExecutorType.Summon, CardId.侏儒兔, 侏儒兔Summon);
AddExecutor(ExecutorType.Activate, CardId.神秘庄家, draweffect);
AddExecutor(ExecutorType.SpellSet, CardId.暗黑释放, 圣防Effect);
AddExecutor(ExecutorType.SpellSet, CardId.落穴);
AddExecutor(ExecutorType.Activate, _CardId.魔法筒, 魔法筒Effect);
AddExecutor(ExecutorType.Activate, _CardId.炸甲, 炸甲Effect);
AddExecutor(ExecutorType.Activate, CardId.落穴, 落穴Effect);
AddExecutor(ExecutorType.Activate, _CardId.激流葬, 激流葬Effect);
AddExecutor(ExecutorType.Activate, _CardId.圣防, 圣防Effect);
AddExecutor(ExecutorType.Activate, CardId.对死者的供奉, 死供Effect);
AddExecutor(ExecutorType.SpellSet, CardId.对死者的供奉);
AddExecutor(ExecutorType.Activate, CardId.凤凰龙);
AddExecutor(ExecutorType.Summon, CardId.凤凰龙, 凤凰龙summon);
AddExecutor(ExecutorType.MonsterSet, CardId.凤凰龙);
AddExecutor(ExecutorType.MonsterSet, CardId.侏儒兔);
AddExecutor(ExecutorType.MonsterSet, CardId.火星心少女, Monsterset);
AddExecutor(ExecutorType.MonsterSet, CardId.七星道法师, Monsterset);
AddExecutor(ExecutorType.MonsterSet, CardId.耳语妖精, Monsterset);
AddExecutor(ExecutorType.Summon, CardId.七星道法师);
AddExecutor(ExecutorType.Repos, DefaultMonsterRepos);
AddExecutor(ExecutorType.SummonOrSet, DefaultMonsterSummon);
AddExecutor(ExecutorType.Repos, CardId.青眼白龙, 圣防Repos);
AddExecutor(ExecutorType.Repos, CardId.破坏之剑士, 圣防Repos);
AddExecutor(ExecutorType.SpellSet);
AddExecutor(ExecutorType.Repos, CardId.破坏之剑士, 圣防Repos);
//AddExecutor(ExecutorType.Activate, CardId.sionmax, sionmaxEffect);
AddExecutor(ExecutorType.Activate, CardId.耳语妖精, 耳语妖精Effect);
AddExecutor(ExecutorType.Activate, CardId.火星心少女, 火星心少女Effect);
AddExecutor(ExecutorType.Activate, CardId.连击龙);
AddExecutor(ExecutorType.Activate, CardId.七星道魔术师);
//AddExecutor(ExecutorType.Activate, CardId.斗牛士, 斗牛士Effect);
AddExecutor(ExecutorType.Activate, _CardId.死苏, 死苏Effect);
AddExecutor(ExecutorType.Activate, _CardId.死苏2, 死苏Effect);
AddExecutor(ExecutorType.Activate, DefaultDontChainMyself);
AddExecutor(ExecutorType.SpellSet);
}
......@@ -181,39 +190,27 @@ namespace WindBot.Game.AI.Decks
AI.SelectCard(Enemy.GetMonsters().GetHighestAttackMonster());
return true;
}
private bool 落穴Effect()
{
foreach (ClientCard n in Duel.LastSummonedCards)
{
if (n.Attack >= 1900) return true;
if (Util.GetTotalAttackingMonsterAttack(1) - Util.GetTotalAttackingMonsterAttack(0) > Bot.LifePoints && !Bot.HasDefendingMonster()) return true;
}
return false;
}
private bool 圣防Effect()
private bool 侏儒兔Summon()
{
if (Util.GetTotalAttackingMonsterAttack(1) > 1900) return true;
if (Util.GetTotalAttackingMonsterAttack(1) - Util.GetTotalAttackingMonsterAttack(0) > Bot.LifePoints && !Bot.HasDefendingMonster()) return true;
if (Bot.HasInHandOrHasInMonstersZone(new[] {
CardId.七星道魔术师,
CardId.连击龙,
CardId.青眼白龙,
CardId.人造人,
CardId.恶魔召唤,
CardId.雅灭鲁拉,
CardId.破坏之剑士,
CardId.真红眼黑龙,
CardId.黑魔术师
}))
return true;
return false;
}
private bool 死供Effect()
private bool 侏儒兔Effect()
{
if (Util.IsOneEnemyBetterThanValue(1900, false))
{
foreach (ClientCard m in Bot.Hand)
AI.SelectCard(m);
foreach (ClientCard mon in Enemy.GetMonsters())
if (mon.Level >= 9)
AI.SelectNextCard(mon);
else if (mon.Level >= 8)
AI.SelectNextCard(mon);
else if (mon.Level >= 7)
AI.SelectNextCard(mon);
else if (mon.Level >= 5)
AI.SelectNextCard(mon);
return true;
}
return false;
AI.SelectYesNo(false);
return true;
}
private bool 死供Eff()
{
......@@ -251,7 +248,7 @@ namespace WindBot.Game.AI.Decks
return false;
}
else
AI.SelectCard(CardId.七星道法师, CardId.火星心少女, CardId.耳语妖精, CardId.神秘庄家, CardId.光芒巫师, CardId.暗黑巫师);
AI.SelectCard(CardId.七星道法师, CardId.火星心少女,CardId.侏儒兔, CardId.耳语妖精, CardId.神秘庄家, CardId.光芒巫师, CardId.暗黑巫师);
return true;
}
private bool 凤凰龙summon()
......@@ -264,15 +261,6 @@ namespace WindBot.Game.AI.Decks
}
return false;
}
private bool 圣防Repos()
{
if (Enemy.Graveyard.GetMatchingCardsCount(card => (card.Race & (int)CardRace.SpellCaster) > 0) >= 4 && Enemy.GetSpellCountWithoutField() >= 1 && !Bot.HasInMonstersZone(CardId.人造人) && Enemy.Graveyard.GetMatchingCardsCount(card => card.IsCode(CardId.暗黑释放)) < 3)
{
if (Bot.MonsterZone.GetMatchingCardsCount(card => card.IsAttack() && card.Level >= 5) >= 2 && !Bot.HasDefendingMonster())
return true;
}
return false;
}
}
}
\ No newline at end of file
......@@ -468,13 +468,13 @@ namespace WindBot.Game.AI.Decks
IList<ClientCard> material_list = new List<ClientCard>();
if(Bot.HasInExtra(CardId.BorreloadDragon))
{
AI.SelectCard(
AI.SelectMaterials(new[] {
CardId.TopologicBomberDragon,
CardId.TopologicTrisbaena,
CardId.KnightmareGryphon,
CardId.SummonSorceress,
CardId.BorreloadDragon
);
}, HintMsg.Remove);
}
else
{
......@@ -483,6 +483,7 @@ namespace WindBot.Game.AI.Decks
if (material_list.Count == 5) break;
material_list.Add(m);
}
AI.SelectMaterials(material_list, HintMsg.Remove);
}
return true;
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -709,7 +709,7 @@ namespace WindBot.Game.AI.Decks
targets.Add(e_c);
if (targets.Count >= 5)
{
AI.SelectCard(targets);
AI.SelectMaterials(targets, HintMsg.Remove);
return true;
}
}
......@@ -719,7 +719,7 @@ namespace WindBot.Game.AI.Decks
targets.Add(s_c);
if (targets.Count >= 5)
{
AI.SelectCard(targets);
AI.SelectMaterials(targets, HintMsg.Remove);
return true;
}
}
......
This diff is collapsed.
......@@ -25,4 +25,21 @@
Heart_eartHDragon = 97403510,
DaigustoSphreeze = 29552709,
}
public enum ImmuneTrapMonster
{
幻龙重骑 = 120155022,
天帝龙树 = 120150011,
大连击龙 = 120210002,
超魔机神 = 120150002,
超魔机神2 = 120231005,
超魔辉兽 = 120217002,
灰霸炎神 = 120170015,
大恐龙驾 = 120151007,
终焰魔神 = 120231007,
焰魔神 = 120231011,
三日月之剑豪将军 = 120196033,
新种掠夺萝卜 = 120228035,
武枪 = 120231052,
极乐鹰巨人 = 120227001,
}
}
......@@ -10,6 +10,8 @@
z5 = 0x20,
z6 = 0x40,
FieldZone = 0x20,
MonsterZones = 0x7f,
MainMonsterZones = 0x1f,
ExtraMonsterZones = 0x60,
......
......@@ -248,6 +248,11 @@ namespace WindBot.Game
return HasInHand(cardId) || HasInGraveyard(cardId);
}
public bool HasInGraveyardOrInBanished(int cardId)
{
return HasInBanished(cardId) || HasInGraveyard(cardId);
}
public bool HasInMonstersZoneOrInGraveyard(int cardId)
{
return HasInMonstersZone(cardId) || HasInGraveyard(cardId);
......
......@@ -88,7 +88,7 @@ namespace WindBot.Game
ClientCard card = cards[seq];
if (card == null || subSeq >= card.Overlays.Count)
return null;
return null; // TODO card.Overlays[subSeq]
return new ClientCard(card.Overlays[subSeq], CardLocation.Overlay, 0, 0);
}
return cards[seq];
......
......@@ -98,6 +98,7 @@ namespace WindBot.Game
m_position.Clear();
m_selector_pointer = -1;
m_materialSelector = null;
m_materialSelectorHint = 0;
m_option = -1;
m_yesno = -1;
m_announce = 0;
......@@ -267,8 +268,16 @@ namespace WindBot.Game
}
else
{
// Update the next selector.
selector = GetSelectedCards();
if (m_materialSelector != null && hint == m_materialSelectorHint)
{
//Logger.DebugWriteLine("m_materialSelector hint match");
selector = m_materialSelector;
}
else
{
// Update the next selector.
selector = GetSelectedCards();
}
}
// If we selected a card, use this card.
......@@ -464,13 +473,13 @@ namespace WindBot.Game
/// <returns>Index of the selected option.</returns>
public int OnSelectOption(IList<int> options)
{
if (m_option != -1 && m_option < options.Count)
return m_option;
int result = Executor.OnSelectOption(options);
if (result != -1)
return result;
if (m_option != -1 && m_option < options.Count)
return m_option;
return 0; // Always select the first option.
}
......@@ -745,6 +754,7 @@ namespace WindBot.Game
private CardSelector m_materialSelector;
private int m_materialSelectorHint;
private int m_place;
private int m_option;
private int m_number;
......@@ -912,34 +922,40 @@ namespace WindBot.Game
m_selector.Insert(m_selector_pointer, new CardSelector(loc));
}
public void SelectMaterials(ClientCard card)
public void SelectMaterials(ClientCard card, int hint = 0)
{
m_materialSelector = new CardSelector(card);
m_materialSelectorHint = hint;
}
public void SelectMaterials(IList<ClientCard> cards)
public void SelectMaterials(IList<ClientCard> cards, int hint = 0)
{
m_materialSelector = new CardSelector(cards);
m_materialSelectorHint = hint;
}
public void SelectMaterials(int cardId)
public void SelectMaterials(int cardId, int hint = 0)
{
m_materialSelector = new CardSelector(cardId);
m_materialSelectorHint = hint;
}
public void SelectMaterials(IList<int> ids)
public void SelectMaterials(IList<int> ids, int hint = 0)
{
m_materialSelector = new CardSelector(ids);
m_materialSelectorHint = hint;
}
public void SelectMaterials(CardLocation loc)
public void SelectMaterials(CardLocation loc, int hint = 0)
{
m_materialSelector = new CardSelector(loc);
m_materialSelectorHint = hint;
}
public void CleanSelectMaterials()
{
m_materialSelector = null;
m_materialSelectorHint = 0;
}
public bool HaveSelectedCards()
......
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using WindBot.Game.AI;
using YGOSharp.Network;
......@@ -93,6 +94,7 @@ namespace WindBot.Game
_messages.Add(GameMessage.ShuffleHand, OnShuffleHand);
_messages.Add(GameMessage.ShuffleExtra, OnShuffleExtra);
_messages.Add(GameMessage.ShuffleSetCard, OnShuffleSetCard);
_messages.Add(GameMessage.SwapGraveDeck, OnSwapGraveDeck);
_messages.Add(GameMessage.TagSwap, OnTagSwap);
_messages.Add(GameMessage.NewTurn, OnNewTurn);
_messages.Add(GameMessage.NewPhase, OnNewPhase);
......@@ -442,6 +444,36 @@ namespace WindBot.Game
}
}
private void OnSwapGraveDeck(BinaryReader packet)
{
int player = GetLocalPlayer(packet.ReadByte());
IList<ClientCard> tmpDeckList = _duel.Fields[player].Deck.ToList();
_duel.Fields[player].Deck.Clear();
int seq = 0;
foreach(var card in _duel.Fields[player].Graveyard)
{
if (card.IsExtraCard())
{
_duel.Fields[player].ExtraDeck.Add(card);
card.Location = CardLocation.Extra;
card.Position = (int)CardPosition.FaceDown;
// TODO: face-up P cards
}
else
{
_duel.Fields[player].Deck.Add(card);
card.Location = CardLocation.Deck;
card.Sequence = seq++;
}
}
_duel.Fields[player].Graveyard.Clear();
foreach (var card in tmpDeckList)
{
_duel.Fields[player].Graveyard.Add(card);
card.Location = CardLocation.Grave;
}
}
private void OnTagSwap(BinaryReader packet)
{
int player = GetLocalPlayer(packet.ReadByte());
......@@ -992,6 +1024,7 @@ namespace WindBot.Game
int seq = packet.ReadByte();
packet.ReadByte(); // pos
}
if (count2 == 0) cancelable = false;
IList<ClientCard> selected = func(cards, (finishable ? 0 : 1), 1, _select_hint, cancelable);
......@@ -1250,6 +1283,12 @@ namespace WindBot.Game
location = CardLocation.SpellZone;
filter = (field >> 8) & Zones.SpellZones;
}
else if ((field & 0x2000) != 0)
{
player = 0;
location = CardLocation.FieldZone;
filter = Zones.FieldZone;
}
else if ((field & 0xc000) != 0)
{
player = 0;
......@@ -1268,6 +1307,12 @@ namespace WindBot.Game
location = CardLocation.SpellZone;
filter = (field >> 24) & Zones.SpellZones;
}
else if ((field & 0x20000000) != 0)
{
player = 1;
location = CardLocation.FieldZone;
filter = Zones.FieldZone;
}
else
{
player = 1;
......@@ -1281,7 +1326,7 @@ namespace WindBot.Game
byte[] resp = new byte[3];
resp[0] = (byte)GetLocalPlayer(player);
if (location != CardLocation.PendulumZone)
if (location != CardLocation.PendulumZone && location != CardLocation.FieldZone)
{
resp[1] = (byte)location;
if ((selected & filter) > 0)
......@@ -1301,8 +1346,9 @@ namespace WindBot.Game
if ((selected & filter) > 0)
filter &= selected;
if ((filter & Zones.z0) != 0) resp[2] = 6;
if ((filter & Zones.z1) != 0) resp[2] = 7;
if ((filter & Zones.FieldZone) != 0) resp[2] = 5;
if ((filter & Zones.z0) != 0) resp[2] = 6; // left pendulum zone
if ((filter & Zones.z1) != 0) resp[2] = 7; // right pendulum zone
}
BinaryWriter reply = GamePacketFactory.Create(CtosMessage.Response);
......
......@@ -52,6 +52,9 @@ namespace WindBot
if (!File.Exists(absolutePath))
// In case windbot is placed in a folder under ygopro folder
absolutePath = Path.GetFullPath("../" + databasePath);
if (!File.Exists(absolutePath))
// In case windbot is placed in a folder under ygopro2 folder
absolutePath = Path.GetFullPath("../cdb/" + databasePath);
if (!File.Exists(absolutePath))
{
Logger.WriteErrorLine("Can't find cards database file.");
......
......@@ -76,6 +76,8 @@ WindBot can run as a "server", provide a http interface to create bot.
* BlueEyesMaxDragon
* Brave
* ChainBurn
* DarkMagician
......@@ -106,6 +108,8 @@ WindBot can run as a "server", provide a http interface to create bot.
* ST1732
* ThunderDragon
* Toadally Awesome
* Trickstar
......
......@@ -24,7 +24,7 @@ namespace WindBot
Host = "127.0.0.1";
Port = 7911;
HostInfo = "";
Version = 0x1353;
Version = 0x1354;
Hand = 0;
Debug = false;
Chat = true;
......
......@@ -18,12 +18,12 @@
},
{
"name": "最强战旗",
"deck": "MathMech",
"deck": "SaikyoBattleFlag",
"dialog": "rd-d"
},
{
"name": "传说子",
"deck": "Dragun",
"deck": "TheLegend",
"dialog": "rd"
},
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment