Commit 023c747a authored by wind2009's avatar wind2009

Merge branch 'master' into fapaiji

parents c6aad034 94cd3eb0
Pipeline #25505 passed with stage
in 25 seconds
#created by ...
#main
81497285
81497285
2347656
41165831
73602965
73602965
75730490
1225009
1225009
1225009
37629703
37629703
37629703
14558127
14558127
14558127
23434538
23434538
23434538
74018812
74018812
74018812
2511
2511
2511
49238328
49238328
5380979
5380979
6351147
6351147
10045474
10045474
10045474
30748475
53417695
83326048
92714517
92714517
92714517
#extra
22850702
22850702
93039339
93039339
29479265
93084621
93084621
24269961
24269961
24269961
67680512
67680512
29301450
71607202
94259633
!side
#created by ...
#main
83334932
83334932
83334932
82112494
82112494
82112494
19510093
19510093
34496660
34496660
34496660
90361010
90361010
90361010
78391364
78391364
56727340
56727340
14624296
95500396
10604644
23434538
23434538
23434538
14558127
14558127
14558127
49036338
38814750
38814750
97268402
97268402
73642296
73642296
59438930
59438930
59438930
94145021
94145021
94145021
#extra
64193046
84815190
30983281
44508094
27548199
76471944
74586817
28912357
38342335
27381364
22423493
65741786
33918636
33918636
33918636
!side
{
"welcome": [
"是宵夜哒哟!",
"什么灵摆卡组都会玩的哟!",
"什么?你说超重不是灵摆卡组?"
],
"deckerror": [
"{0}的数量不对!快去改成无禁限模式!。"
],
"duelstart": [
"给你展现一下超重的魅力!"
],
"newturn": [
"抽卡!弁庆你别上手救我了!",
"抽卡!P身子你别上手救我了!"
],
"endturn": [
"哼哼,到你的回合了!",
"喜不喜欢我的展开呢?"
],
"directattack": [
"我用{0}直接攻击!"
],
"attack": [
"我用{0}攻击{1}!"
],
"ondirectattack": [
"不许打!不许打呀!",
"呜哇!要被打倒惹~"
],
"facedownmonstername": "怪兽",
"activate": [
"呼呼呼,{0}的效果太厉害了!",
"呼呼呼,我使用{0}的效果。"
],
"summon": [
"呼呼呼,我召唤{0}!"
],
"setmonster": [
"呼呼呼,我盖放了一只怪兽。"
],
"chaining": [
"此刻!{0}的效果发动!"
]
}
...@@ -434,6 +434,15 @@ namespace WindBot.Game.AI ...@@ -434,6 +434,15 @@ namespace WindBot.Game.AI
if (selected.Count >= max) if (selected.Count >= max)
break; break;
} }
if (selected.Count < min)
{
#if DEBUG
throw new Exception("Not enough cards to CheckSelectCount");
#else
Logger.WriteErrorLine("Not enough cards to CheckSelectCount, using default");
return null;
#endif
}
} }
while (selected.Count > max) while (selected.Count > max)
{ {
......
...@@ -21,7 +21,8 @@ namespace WindBot.Game.AI ...@@ -21,7 +21,8 @@ namespace WindBot.Game.AI
/// </summary> /// </summary>
public static bool IsMonsterDangerous(this ClientCard card) public static bool IsMonsterDangerous(this ClientCard card)
{ {
return !card.IsDisabled() && Enum.IsDefined(typeof(DangerousMonster), card.Id); return !card.IsDisabled() &&
(Enum.IsDefined(typeof(DangerousMonster), card.Id) || (card.HasSetcode(0x18d) && (card.HasType(CardType.Ritual) || card.EquipCards.Count > 0)));
} }
/// <summary> /// <summary>
......
...@@ -3,6 +3,7 @@ using System.Collections.Generic; ...@@ -3,6 +3,7 @@ using System.Collections.Generic;
using WindBot; using WindBot;
using WindBot.Game; using WindBot.Game;
using WindBot.Game.AI; using WindBot.Game.AI;
using System.Linq;
namespace WindBot.Game.AI.Decks namespace WindBot.Game.AI.Decks
{ {
...@@ -324,23 +325,37 @@ namespace WindBot.Game.AI.Decks ...@@ -324,23 +325,37 @@ namespace WindBot.Game.AI.Decks
public int SelectSTPlace(ClientCard card=null, bool avoid_Impermanence = false) public int SelectSTPlace(ClientCard card=null, bool avoid_Impermanence = false)
{ {
List<int> list = new List<int> { 0, 1, 2, 3, 4 }; if (card == null) card = Card;
List<int> list = new List<int>();
for (int seq = 0; seq < 5; ++seq)
{
if (Bot.SpellZone[seq] == null)
{
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue;
list.Add(seq);
}
}
int n = list.Count; int n = list.Count;
while (n-- > 1) while (n-- > 1)
{ {
int index = Program.Rand.Next(n + 1); int index = Program.Rand.Next(list.Count);
int temp = list[index]; int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count;
list[index] = list[n]; int tempInt = list[index];
list[n] = temp; list[index] = list[nextIndex];
list[nextIndex] = tempInt;
} }
foreach (int seq in list) if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled()))
{ {
int zone = (int)System.Math.Pow(2, seq); foreach (int seq in list)
if (Bot.SpellZone[seq] == null)
{ {
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; ClientCard enemySpell = Enemy.SpellZone[4 - seq];
return zone; if (enemySpell != null && enemySpell.IsFacedown()) continue;
}; return (int)System.Math.Pow(2, seq);
}
}
foreach (int seq in list)
{
return (int)System.Math.Pow(2, seq);
} }
return 0; return 0;
} }
...@@ -2656,6 +2671,27 @@ namespace WindBot.Game.AI.Decks ...@@ -2656,6 +2671,27 @@ namespace WindBot.Game.AI.Decks
attacked_Meluseek.Clear(); attacked_Meluseek.Clear();
} }
public override void OnChaining(int player, ClientCard card)
{
if (card == null) return;
if (player == 1)
{
if (card.IsCode(_CardId.InfiniteImpermanence))
{
for (int i = 0; i < 5; ++i)
{
if (Enemy.SpellZone[i] == card)
{
Impermanence_list.Add(4-i);
break;
}
}
}
}
base.OnChaining(player, card);
}
public bool MonsterRepos() public bool MonsterRepos()
{ {
if (Card.Attack == 0) return (Card.IsAttack()); if (Card.Attack == 0) return (Card.IsAttack());
...@@ -2797,7 +2833,8 @@ namespace WindBot.Game.AI.Decks ...@@ -2797,7 +2833,8 @@ namespace WindBot.Game.AI.Decks
// throw all?? // throw all??
return null; return null;
} }
return null;
return base.OnSelectCard(cards, min, max, hint, cancelable);
} }
public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions) public override CardPosition OnSelectPosition(int cardId, IList<CardPosition> positions)
......
...@@ -146,7 +146,8 @@ namespace WindBot.Game.AI.Decks ...@@ -146,7 +146,8 @@ namespace WindBot.Game.AI.Decks
return Util.CheckSelectCount(result, cards, min, max); return Util.CheckSelectCount(result, cards, min, max);
} }
Logger.DebugWriteLine("Use default."); Logger.DebugWriteLine("Use default.");
return null;
return base.OnSelectCard(cards, min, max, hint, cancelable);
} }
public override IList<ClientCard> OnSelectXyzMaterial(IList<ClientCard> cards, int min, int max) public override IList<ClientCard> OnSelectXyzMaterial(IList<ClientCard> cards, int min, int max)
......
...@@ -2,8 +2,6 @@ using YGOSharp.OCGWrapper.Enums; ...@@ -2,8 +2,6 @@ using YGOSharp.OCGWrapper.Enums;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System; using System;
using System.CodeDom;
using System.Security.AccessControl;
namespace WindBot.Game.AI.Decks namespace WindBot.Game.AI.Decks
{ {
...@@ -62,6 +60,7 @@ namespace WindBot.Game.AI.Decks ...@@ -62,6 +60,7 @@ namespace WindBot.Game.AI.Decks
public const int DimensionalFissure = 81674782; public const int DimensionalFissure = 81674782;
public const int BanisheroftheRadiance = 94853057; public const int BanisheroftheRadiance = 94853057;
public const int BanisheroftheLight = 61528025; public const int BanisheroftheLight = 61528025;
public const int GhostMournerMoonlitChill = 52038441;
} }
public DogmatikaExecutor(GameAI ai, Duel duel) public DogmatikaExecutor(GameAI ai, Duel duel)
...@@ -133,6 +132,7 @@ namespace WindBot.Game.AI.Decks ...@@ -133,6 +132,7 @@ namespace WindBot.Game.AI.Decks
const int SetcodeOrcust = 0x11b; const int SetcodeOrcust = 0x11b;
const int SetcodeDogmatika = 0x145; const int SetcodeDogmatika = 0x145;
const int hintTimingMainEnd = 0x4; const int hintTimingMainEnd = 0x4;
const int hintDamageStep = 0x2000;
Dictionary<int, List<int>> DeckCountTable = new Dictionary<int, List<int>>{ Dictionary<int, List<int>> DeckCountTable = new Dictionary<int, List<int>>{
{3, new List<int> { CardId.DogmatikaEcclesia, _CardId.AshBlossom, _CardId.MaxxC, CardId.KnightmareCorruptorIblee, CardId.NadirServant, {3, new List<int> { CardId.DogmatikaEcclesia, _CardId.AshBlossom, _CardId.MaxxC, CardId.KnightmareCorruptorIblee, CardId.NadirServant,
...@@ -1081,7 +1081,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1081,7 +1081,7 @@ namespace WindBot.Game.AI.Decks
} }
} }
public override void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) public override void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation)
{ {
if (previousControler == 1 && currentLocation == (int)CardLocation.MonsterZone) if (previousControler == 1 && currentLocation == (int)CardLocation.MonsterZone)
{ {
...@@ -1093,13 +1093,29 @@ namespace WindBot.Game.AI.Decks ...@@ -1093,13 +1093,29 @@ namespace WindBot.Game.AI.Decks
} }
} }
base.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); base.OnMove(card, previousControler, previousLocation, currentControler, currentLocation);
} }
public override ClientCard OnSelectAttacker(IList<ClientCard> attackers, IList<ClientCard> defenders) public override BattlePhaseAction OnBattle(IList<ClientCard> attackers, IList<ClientCard> defenders)
{ {
if (attackers.Count() > 0) return attackers[attackers.Count() - 1]; if (attackers.Count() == 1 && defenders.Count() == 1)
return null; {
if (defenders[0].IsCode(CardId.KnightmareCorruptorIblee) && !confirmLink2) return new BattlePhaseAction(BattlePhaseAction.BattleAction.ToMainPhaseTwo);
}
if (attackers.Count() > 0 && defenders.Count() > 0)
{
List<ClientCard> sortedAttacker = attackers.OrderBy(card => card.Attack).ToList();
for (int k = 0; k < sortedAttacker.Count; ++k)
{
ClientCard attacker = sortedAttacker[k];
attacker.IsLastAttacker = k == sortedAttacker.Count - 1;
BattlePhaseAction result = OnSelectAttackTarget(attacker, defenders);
if (result != null)
return result;
}
}
return base.OnBattle(attackers, defenders);
} }
public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders) public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders)
...@@ -1113,6 +1129,9 @@ namespace WindBot.Game.AI.Decks ...@@ -1113,6 +1129,9 @@ namespace WindBot.Game.AI.Decks
if (attacker.RealPower > defender.RealPower) if (attacker.RealPower > defender.RealPower)
return AI.Attack(attacker, defender); return AI.Attack(attacker, defender);
if (attacker.RealPower == defender.RealPower && defender.IsAttack() && Bot.GetMonsterCount() >= Enemy.GetMonsterCount())
return AI.Attack(attacker, defender);
} }
if (attacker.CanDirectAttack) if (attacker.CanDirectAttack)
...@@ -1989,13 +2008,17 @@ namespace WindBot.Game.AI.Decks ...@@ -1989,13 +2008,17 @@ namespace WindBot.Game.AI.Decks
ClientCard lastChainCard = Util.GetLastChainCard(); ClientCard lastChainCard = Util.GetLastChainCard();
if (lastChainCard != null && lastChainCard.Controller == 1 && lastChainCard.IsMonster()) if (lastChainCard != null && lastChainCard.Controller == 1 && lastChainCard.IsMonster())
{ {
foreach (ClientCard chainTarget in Duel.LastChainTargets) bool negateFlag = lastChainCard.IsCode(_CardId.EffectVeiler, CardId.GhostMournerMoonlitChill);
if (Duel.Turn > 1 || !negateFlag)
{ {
if (selfCasterList.Contains(chainTarget)) foreach (ClientCard chainTarget in Duel.LastChainTargets)
{ {
selfTarget = chainTarget; if (selfCasterList.Contains(chainTarget) && (!negateFlag || !chainTarget.IsCode(CardId.DiabellstarTheBlackWitch)))
activateFlag = true; {
break; selfTarget = chainTarget;
activateFlag = true;
break;
}
} }
} }
} }
...@@ -2022,7 +2045,8 @@ namespace WindBot.Game.AI.Decks ...@@ -2022,7 +2045,8 @@ namespace WindBot.Game.AI.Decks
if (!onlyAlbaZoa) if (!onlyAlbaZoa)
{ {
List<ClientCard> toDestroyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup() List<ClientCard> toDestroyMonsterList = Enemy.GetMonsters().Where(card => card.IsFaceup()
&& card.Attack > 0 && card.Attack <= targetAttack && !currentDestroyCardList.Contains(card)).ToList(); && card.Attack > 0 && card.Attack <= targetAttack && !currentDestroyCardList.Contains(card)
&& (Duel.Player == 1 || card != Enemy.BattlingMonster)).ToList();
if (toDestroyMonsterList.Count() > 1) if (toDestroyMonsterList.Count() > 1)
{ {
activateFlag = true; activateFlag = true;
...@@ -2031,7 +2055,13 @@ namespace WindBot.Game.AI.Decks ...@@ -2031,7 +2055,13 @@ namespace WindBot.Game.AI.Decks
} }
// decrease attack // decrease attack
if (Bot.UnderAttack && !onlyAlbaZoa && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0)) int botWorstPower = Util.GetWorstBotMonster()?.GetDefensePower() ?? 0;
bool decreaseFlag = Duel.Player == 1 && Enemy.GetMonsters().Any(card => card.Attack >= botWorstPower
&& card.IsMonsterHasPreventActivationEffectInBattle()) && Duel.Phase > DuelPhase.Main1 && Duel.Phase < DuelPhase.Main2;
decreaseFlag |= (!onlyAlbaZoa || (Bot.BattlingMonster?.IsCode(CardId.DogmatikaAlbaZoa) ?? false))
&& (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0)
&& Duel.LastChainPlayer != 0 && (CurrentTiming & hintDamageStep) != 0 && CurrentTiming > 0;
if (decreaseFlag)
{ {
activateFlag = true; activateFlag = true;
} }
...@@ -2425,7 +2455,7 @@ namespace WindBot.Game.AI.Decks ...@@ -2425,7 +2455,7 @@ namespace WindBot.Game.AI.Decks
if (targetCard == null || extraToDiscard == null) if (targetCard == null || extraToDiscard == null)
{ {
bool check1 = DefaultOnBecomeTarget(); bool check1 = DefaultOnBecomeTarget();
bool check2 = Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0); bool check2 = Bot.UnderAttack && (Bot.BattlingMonster?.GetDefensePower() ?? 0) <= (Enemy.BattlingMonster?.GetDefensePower() ?? 0) && Duel.LastChainPlayer != 0;;
bool check3 = Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0; bool check3 = Duel.Player == 1 && Duel.Phase == DuelPhase.End && Duel.LastChainPlayer != 0;
bool check4 = Duel.Player == 1 && avoid2Monster && Enemy.GetMonsterCount() >= 2 && Duel.LastChainPlayer != 0; bool check4 = Duel.Player == 1 && avoid2Monster && Enemy.GetMonsterCount() >= 2 && Duel.LastChainPlayer != 0;
Logger.DebugWriteLine("===punishment check flag: " + check1 + " " + check2 + " " + check3 + " " + check4); Logger.DebugWriteLine("===punishment check flag: " + check1 + " " + check2 + " " + check3 + " " + check4);
...@@ -2820,7 +2850,7 @@ namespace WindBot.Game.AI.Decks ...@@ -2820,7 +2850,7 @@ namespace WindBot.Game.AI.Decks
if (Card.IsAttack() && enemyBetter) if (Card.IsAttack() && enemyBetter)
return true; return true;
if (Card.IsDefense() && !enemyBetter && selfAttack >= Card.Defense) if (Card.IsDefense() && !enemyBetter)
return true; return true;
return false; return false;
} }
......
...@@ -629,25 +629,42 @@ namespace WindBot.Game.AI.Decks ...@@ -629,25 +629,42 @@ namespace WindBot.Game.AI.Decks
/// <param name="avoidList">Whether need to avoid set in this place</param> /// <param name="avoidList">Whether need to avoid set in this place</param>
public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List<int> avoidList = null) public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List<int> avoidList = null)
{ {
List<int> list = new List<int> { 0, 1, 2, 3, 4 }; if (card == null) card = Card;
List<int> list = new List<int>();
for (int seq = 0; seq < 5; ++seq)
{
if (Bot.SpellZone[seq] == null)
{
if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue;
if (avoidList != null && avoidList.Contains(seq)) continue;
list.Add(seq);
}
}
int n = list.Count; int n = list.Count;
while (n-- > 1) while (n-- > 1)
{ {
int index = Program.Rand.Next(n + 1); int index = Program.Rand.Next(list.Count);
int temp = list[index]; int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count;
list[index] = list[n]; int tempInt = list[index];
list[n] = temp; list[index] = list[nextIndex];
list[nextIndex] = tempInt;
} }
foreach (int seq in list) if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled()))
{ {
int zone = (int)System.Math.Pow(2, seq); foreach (int seq in list)
if (Bot.SpellZone[seq] == null)
{ {
if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; ClientCard enemySpell = Enemy.SpellZone[4 - seq];
if (avoidList != null && avoidList.Contains(seq)) continue; if (enemySpell != null && enemySpell.IsFacedown()) continue;
int zone = (int)System.Math.Pow(2, seq);
AI.SelectPlace(zone); AI.SelectPlace(zone);
return; return;
}; }
}
foreach (int seq in list)
{
int zone = (int)System.Math.Pow(2, seq);
AI.SelectPlace(zone);
return;
} }
AI.SelectPlace(0); AI.SelectPlace(0);
} }
...@@ -816,6 +833,7 @@ namespace WindBot.Game.AI.Decks ...@@ -816,6 +833,7 @@ namespace WindBot.Game.AI.Decks
public override void OnNewTurn() public override void OnNewTurn()
{ {
if (Duel.Turn <= 1) calledbytheGraveCount.Clear();
enemyActivateMaxxC = false; enemyActivateMaxxC = false;
enemyActivateLockBird = false; enemyActivateLockBird = false;
infiniteImpermanenceList.Clear(); infiniteImpermanenceList.Clear();
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
...@@ -700,6 +700,7 @@ namespace WindBot.Game.AI.Decks ...@@ -700,6 +700,7 @@ namespace WindBot.Game.AI.Decks
public override void OnNewTurn() public override void OnNewTurn()
{ {
if (Duel.Turn <= 1) calledbytheGraveCount.Clear();
enemyActivateMaxxC = false; enemyActivateMaxxC = false;
enemyActivateLockBird = false; enemyActivateLockBird = false;
...@@ -780,7 +781,17 @@ namespace WindBot.Game.AI.Decks ...@@ -780,7 +781,17 @@ namespace WindBot.Game.AI.Decks
/// <param name="avoidList">Whether need to avoid set in this place</param> /// <param name="avoidList">Whether need to avoid set in this place</param>
public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List<int> avoidList = null) public void SelectSTPlace(ClientCard card = null, bool avoidImpermanence = false, List<int> avoidList = null)
{ {
List<int> list = new List<int> { 0, 1, 2, 3, 4 }; if (card == null) card = Card;
List<int> list = new List<int>();
for (int seq = 0; seq < 5; ++seq)
{
if (Bot.SpellZone[seq] == null)
{
if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue;
if (avoidList != null && avoidList.Contains(seq)) continue;
list.Add(seq);
}
}
int n = list.Count; int n = list.Count;
while (n-- > 1) while (n-- > 1)
{ {
...@@ -790,16 +801,22 @@ namespace WindBot.Game.AI.Decks ...@@ -790,16 +801,22 @@ namespace WindBot.Game.AI.Decks
list[index] = list[nextIndex]; list[index] = list[nextIndex];
list[nextIndex] = tempInt; list[nextIndex] = tempInt;
} }
foreach (int seq in list) if (avoidImpermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled()))
{ {
int zone = (int)System.Math.Pow(2, seq); foreach (int seq in list)
if (Bot.SpellZone[seq] == null)
{ {
if (card != null && card.Location == CardLocation.Hand && avoidImpermanence && infiniteImpermanenceList.Contains(seq)) continue; ClientCard enemySpell = Enemy.SpellZone[4 - seq];
if (avoidList != null && avoidList.Contains(seq)) continue; if (enemySpell != null && enemySpell.IsFacedown()) continue;
int zone = (int)System.Math.Pow(2, seq);
AI.SelectPlace(zone); AI.SelectPlace(zone);
return; return;
}; }
}
foreach (int seq in list)
{
int zone = (int)System.Math.Pow(2, seq);
AI.SelectPlace(zone);
return;
} }
AI.SelectPlace(0); AI.SelectPlace(0);
} }
......
...@@ -3,6 +3,7 @@ using System.Collections.Generic; ...@@ -3,6 +3,7 @@ using System.Collections.Generic;
using WindBot; using WindBot;
using WindBot.Game; using WindBot.Game;
using WindBot.Game.AI; using WindBot.Game.AI;
using System.Linq;
namespace WindBot.Game.AI.Decks namespace WindBot.Game.AI.Decks
{ {
...@@ -67,6 +68,7 @@ namespace WindBot.Game.AI.Decks ...@@ -67,6 +68,7 @@ namespace WindBot.Game.AI.Decks
return 1; return 1;
} }
List<int> Impermanence_list = new List<int>();
bool NormalSummoned = false; bool NormalSummoned = false;
ClientCard stage_locked = null; ClientCard stage_locked = null;
bool pink_ss = false; bool pink_ss = false;
...@@ -190,21 +192,39 @@ namespace WindBot.Game.AI.Decks ...@@ -190,21 +192,39 @@ namespace WindBot.Game.AI.Decks
return false; return false;
} }
public int SelectSTPlace() public int SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false)
{ {
List<int> list = new List<int> { 0, 1, 2, 3, 4 }; if (card == null) card = Card;
List<int> list = new List<int>();
for (int seq = 0; seq < 5; ++seq)
{
if (Bot.SpellZone[seq] == null)
{
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue;
list.Add(seq);
}
}
int n = list.Count; int n = list.Count;
while (n-- > 1) while (n-- > 1)
{ {
int index = Program.Rand.Next(n + 1); int index = Program.Rand.Next(list.Count);
int temp = list[index]; int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count;
list[index] = list[n]; int tempInt = list[index];
list[n] = temp; list[index] = list[nextIndex];
list[nextIndex] = tempInt;
} }
foreach(int seq in list) if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled()))
{ {
int zone = (int)System.Math.Pow(2, seq); foreach (int seq in list)
if (Bot.SpellZone[seq] == null) return zone; {
ClientCard enemySpell = Enemy.SpellZone[4 - seq];
if (enemySpell != null && enemySpell.IsFacedown()) continue;
return (int)System.Math.Pow(2, seq);
}
}
foreach (int seq in list)
{
return (int)System.Math.Pow(2, seq);
} }
return 0; return 0;
} }
...@@ -505,7 +525,7 @@ namespace WindBot.Game.AI.Decks ...@@ -505,7 +525,7 @@ namespace WindBot.Game.AI.Decks
if (selected == null) if (selected == null)
return false; return false;
AI.SelectCard(selected); AI.SelectCard(selected);
AI.SelectPlace(SelectSTPlace()); AI.SelectPlace(SelectSTPlace(Card, true));
return true; return true;
} }
...@@ -526,13 +546,13 @@ namespace WindBot.Game.AI.Decks ...@@ -526,13 +546,13 @@ namespace WindBot.Game.AI.Decks
if (self_card.IsCode(CardId.Galaxy)) if (self_card.IsCode(CardId.Galaxy))
return false; return false;
} }
AI.SelectPlace(SelectSTPlace()); AI.SelectPlace(SelectSTPlace(Card, true));
return true; return true;
} }
// activate when more than 2 cards // activate when more than 2 cards
if (Enemy.GetSpellCount() <= 1) if (Enemy.GetSpellCount() <= 1)
return false; return false;
AI.SelectPlace(SelectSTPlace()); AI.SelectPlace(SelectSTPlace(Card, true));
return true; return true;
} }
...@@ -627,7 +647,7 @@ namespace WindBot.Game.AI.Decks ...@@ -627,7 +647,7 @@ namespace WindBot.Game.AI.Decks
if (!spell_trap_activate()) return false; if (!spell_trap_activate()) return false;
if (Bot.Deck.Count > 15) if (Bot.Deck.Count > 15)
{ {
AI.SelectPlace(SelectSTPlace()); AI.SelectPlace(SelectSTPlace(Card, true));
return true; return true;
} }
return false; return false;
...@@ -1003,7 +1023,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1003,7 +1023,7 @@ namespace WindBot.Game.AI.Decks
if (!spell_trap_activate()) return false; if (!spell_trap_activate()) return false;
if (Duel.Phase <= DuelPhase.Main1 && Ts_reborn()) if (Duel.Phase <= DuelPhase.Main1 && Ts_reborn())
{ {
AI.SelectPlace(SelectSTPlace()); AI.SelectPlace(SelectSTPlace(Card, true));
return true; return true;
} }
return false; return false;
...@@ -1634,14 +1654,14 @@ namespace WindBot.Game.AI.Decks ...@@ -1634,14 +1654,14 @@ namespace WindBot.Game.AI.Decks
{ {
if (enemy.IsMonsterDangerous()) if (enemy.IsMonsterDangerous())
{ {
AI.SelectPlace(SelectSTPlace()); AI.SelectPlace(SelectSTPlace(Card, true));
return true; return true;
} }
if (enemy.IsFaceup() && (enemy.GetDefensePower() > bestenemy)) bestenemy = enemy.GetDefensePower(); if (enemy.IsFaceup() && (enemy.GetDefensePower() > bestenemy)) bestenemy = enemy.GetDefensePower();
} }
if (bestPower <= bestenemy) if (bestPower <= bestenemy)
{ {
AI.SelectPlace(SelectSTPlace()); AI.SelectPlace(SelectSTPlace(Card, true));
return true; return true;
} }
} }
...@@ -1697,6 +1717,11 @@ namespace WindBot.Game.AI.Decks ...@@ -1697,6 +1717,11 @@ namespace WindBot.Game.AI.Decks
public override void OnNewTurn() public override void OnNewTurn()
{ {
if (Duel.Turn <= 1)
{
GraveCall_count = 0;
GraveCall_id = 0;
}
NormalSummoned = false; NormalSummoned = false;
stage_locked = null; stage_locked = null;
pink_ss = false; pink_ss = false;
...@@ -1705,6 +1730,7 @@ namespace WindBot.Game.AI.Decks ...@@ -1705,6 +1730,7 @@ namespace WindBot.Game.AI.Decks
white_eff_used = false; white_eff_used = false;
lockbird_useful = false; lockbird_useful = false;
lockbird_used = false; lockbird_used = false;
Impermanence_list.Clear();
if (GraveCall_count > 0) if (GraveCall_count > 0)
{ {
if (--GraveCall_count <= 0) if (--GraveCall_count <= 0)
...@@ -1714,6 +1740,27 @@ namespace WindBot.Game.AI.Decks ...@@ -1714,6 +1740,27 @@ namespace WindBot.Game.AI.Decks
} }
} }
public override void OnChaining(int player, ClientCard card)
{
if (card == null) return;
if (player == 1)
{
if (card.IsCode(_CardId.InfiniteImpermanence))
{
for (int i = 0; i < 5; ++i)
{
if (Enemy.SpellZone[i] == card)
{
Impermanence_list.Add(4-i);
break;
}
}
}
}
base.OnChaining(player, card);
}
public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders) public override BattlePhaseAction OnSelectAttackTarget(ClientCard attacker, IList<ClientCard> defenders)
{ {
ClientCard lowestattack = null; ClientCard lowestattack = null;
......
...@@ -269,6 +269,7 @@ namespace WindBot.Game.AI.Decks ...@@ -269,6 +269,7 @@ namespace WindBot.Game.AI.Decks
// new turn reset // new turn reset
public override void OnNewTurn() public override void OnNewTurn()
{ {
if (Duel.Turn <= 1) CalledbytheGraveCount.Clear();
CrossoutDesignatorTarget = 0; CrossoutDesignatorTarget = 0;
MadameVerreGainedATK = false; MadameVerreGainedATK = false;
summoned = false; summoned = false;
...@@ -858,27 +859,44 @@ namespace WindBot.Game.AI.Decks ...@@ -858,27 +859,44 @@ namespace WindBot.Game.AI.Decks
/// <param name="card">Card to set(default current card)</param> /// <param name="card">Card to set(default current card)</param>
/// <param name="avoid_Impermanence">Whether need to avoid InfiniteImpermanence</param> /// <param name="avoid_Impermanence">Whether need to avoid InfiniteImpermanence</param>
/// <param name="avoid_list">Whether need to avoid set in this place</param> /// <param name="avoid_list">Whether need to avoid set in this place</param>
public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List<int> avoid_list=null) public void SelectSTPlace(ClientCard card = null, bool avoid_Impermanence = false, List<int> avoid_list = null)
{ {
List<int> list = new List<int> { 0, 1, 2, 3, 4 }; if (card == null) card = Card;
List<int> list = new List<int>();
for (int seq = 0; seq < 5; ++seq)
{
if (Bot.SpellZone[seq] == null)
{
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue;
if (avoid_list != null && avoid_list.Contains(seq)) continue;
list.Add(seq);
}
}
int n = list.Count; int n = list.Count;
while (n-- > 1) while (n-- > 1)
{ {
int index = Program.Rand.Next(n + 1); int index = Program.Rand.Next(list.Count);
int temp = list[index]; int nextIndex = (index + Program.Rand.Next(list.Count - 1)) % list.Count;
list[index] = list[n]; int tempInt = list[index];
list[n] = temp; list[index] = list[nextIndex];
list[nextIndex] = tempInt;
} }
foreach (int seq in list) if (avoid_Impermanence && Bot.GetMonsters().Any(c => c.IsFaceup() && !c.IsDisabled()))
{ {
int zone = (int)System.Math.Pow(2, seq); foreach (int seq in list)
if (Bot.SpellZone[seq] == null)
{ {
if (card != null && card.Location == CardLocation.Hand && avoid_Impermanence && Impermanence_list.Contains(seq)) continue; ClientCard enemySpell = Enemy.SpellZone[4 - seq];
if (avoid_list != null && avoid_list.Contains(seq)) continue; if (enemySpell != null && enemySpell.IsFacedown()) continue;
int zone = (int)System.Math.Pow(2, seq);
AI.SelectPlace(zone); AI.SelectPlace(zone);
return; return;
}; }
}
foreach (int seq in list)
{
int zone = (int)System.Math.Pow(2, seq);
AI.SelectPlace(zone);
return;
} }
AI.SelectPlace(0); AI.SelectPlace(0);
} }
......
...@@ -2115,7 +2115,9 @@ namespace WindBot.Game.AI.Decks ...@@ -2115,7 +2115,9 @@ namespace WindBot.Game.AI.Decks
result.AddRange(tRelease); result.AddRange(tRelease);
result.AddRange(nRelease); result.AddRange(nRelease);
} }
return Func.CheckSelectCount(Util, result, cards, min, max); IList<ClientCard> selectResult = Func.CheckSelectCount(Util, result, cards, min, max);
if (selectResult == null) return base.OnSelectCard(cards, min, max, hint, cancelable);
return selectResult;
} }
private bool HasInDeck(int id) private bool HasInDeck(int id)
{ {
......
This diff is collapsed.
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
Heart_eartHDragon = 97403510, Heart_eartHDragon = 97403510,
DaigustoSphreeze = 29552709, DaigustoSphreeze = 29552709,
OhimetheManifestedMikanko = 81260679, OhimetheManifestedMikanko = 81260679,
ArahimetheManifestedMikanko = 75771170 ArahimetheManifestedMikanko = 75771170,
YubelDasEwigLiebeWächter = 47172959
} }
} }
...@@ -71,6 +71,7 @@ ...@@ -71,6 +71,7 @@
ElShaddollConstruct = 20366274, ElShaddollConstruct = 20366274,
ElShaddollGrysra = 48424886, ElShaddollGrysra = 48424886,
ElShaddollWinda = 94977269, ElShaddollWinda = 94977269,
HotRedDragonArchfiendAbyss = 9753964,
UltimateConductorTytanno = 18940556, UltimateConductorTytanno = 18940556,
OvertexCoatls = 41782653, OvertexCoatls = 41782653,
FirePrison = 269510, FirePrison = 269510,
...@@ -210,6 +211,7 @@ ...@@ -210,6 +211,7 @@
TGGlaiveBlaster = 95973569, TGGlaiveBlaster = 95973569,
StellarNemesisTPHON_DoomsdayStar = 93039339, StellarNemesisTPHON_DoomsdayStar = 93039339,
SPLittleKnight = 29301450, SPLittleKnight = 29301450,
AngelRing = 40678060 AngelRing = 40678060,
SkullGuardianTheSilenforcingProtector = 10774240
} }
} }
...@@ -67,6 +67,7 @@ ...@@ -67,6 +67,7 @@
FaceCardFusion = 29062925, FaceCardFusion = 29062925,
MyutantFusion = 42577802, MyutantFusion = 42577802,
MyutantCry = 31855260, MyutantCry = 31855260,
FallenOfAlbaz = 68468459,
GreaterPolymerization = 7614732, GreaterPolymerization = 7614732,
UltimateFusion = 71143015, UltimateFusion = 71143015,
BrandedFusion = 44362883, BrandedFusion = 44362883,
......
...@@ -109,6 +109,11 @@ ...@@ -109,6 +109,11 @@
NightmareMagician = 40221691, NightmareMagician = 40221691,
ArahimetheManifestedMikanko = 75771170, ArahimetheManifestedMikanko = 75771170,
UFOLight = 9275482, UFOLight = 9275482,
TaotheGreatChanter = 34541543 TaotheGreatChanter = 34541543,
SpiritOfYubel = 90829280,
DarkGuardian = 26746975,
EnvoyOfTheWaxState = 87462901,
Fluffyfluff = 85401123,
YubelDasEwigLiebeWächter = 47172959
} }
} }
...@@ -49,6 +49,8 @@ ...@@ -49,6 +49,8 @@
Blackwing_FullArmoredWing = 54082269, Blackwing_FullArmoredWing = 54082269,
DragunofRedEyes = 37818794, DragunofRedEyes = 37818794,
RedEyesBDragon = 74677422, // sometimes the name of DragunofRedEyes will be changed to RedEyesBDragon RedEyesBDragon = 74677422, // sometimes the name of DragunofRedEyes will be changed to RedEyesBDragon
TheArrivalCyberseIgnister = 11738489 TheArrivalCyberseIgnister = 11738489,
MajespecterPorcupineYamaarashi = 51073802,
RaidraptorRisingRebellionFalcon = 71222868
} }
} }
...@@ -95,10 +95,21 @@ namespace WindBot.Game.AI ...@@ -95,10 +95,21 @@ namespace WindBot.Game.AI
// For overriding // For overriding
} }
public virtual void OnChainSolved(int chainIndex)
{
// For overriding
}
public virtual void OnChainEnd() public virtual void OnChainEnd()
{ {
// For overriding // For overriding
} }
public virtual void OnReceivingAnnouce(int player, int data)
{
// For overriding
}
public virtual void OnNewPhase() public virtual void OnNewPhase()
{ {
// Some AI need do something on new phase // Some AI need do something on new phase
...@@ -113,7 +124,7 @@ namespace WindBot.Game.AI ...@@ -113,7 +124,7 @@ namespace WindBot.Game.AI
// Some AI need do something on draw // Some AI need do something on draw
} }
public virtual void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) public virtual void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation)
{ {
// Some AI need do something on card's moving // Some AI need do something on card's moving
} }
......
...@@ -57,6 +57,11 @@ ...@@ -57,6 +57,11 @@
ToZone = 571, ToZone = 571,
Counter = 572, Counter = 572,
Disable = 573, Disable = 573,
OperateCard = 574; OperateCard = 574,
RITUAL = 1057,
FUSION = 1056,
SYNCHRO = 1063,
XYZ = 1073,
PENDULUM = 1074;
} }
} }
\ No newline at end of file
using System.Collections.Generic; using System.Collections.Generic;
using YGOSharp.OCGWrapper.Enums; using YGOSharp.OCGWrapper.Enums;
namespace WindBot.Game namespace WindBot.Game
...@@ -26,6 +26,8 @@ namespace WindBot.Game ...@@ -26,6 +26,8 @@ namespace WindBot.Game
public int LastSummonPlayer { get; set; } public int LastSummonPlayer { get; set; }
public IList<ClientCard> SummoningCards { get; set; } public IList<ClientCard> SummoningCards { get; set; }
public IList<ClientCard> LastSummonedCards { get; set; } public IList<ClientCard> LastSummonedCards { get; set; }
public int SolvingChainIndex { get; set; }
public IList<int> NegatedChainIndexList { get; set; }
public Duel() public Duel()
{ {
...@@ -41,6 +43,8 @@ namespace WindBot.Game ...@@ -41,6 +43,8 @@ namespace WindBot.Game
LastSummonPlayer = -1; LastSummonPlayer = -1;
SummoningCards = new List<ClientCard>(); SummoningCards = new List<ClientCard>();
LastSummonedCards = new List<ClientCard>(); LastSummonedCards = new List<ClientCard>();
SolvingChainIndex = 0;
NegatedChainIndexList = new List<int>();
} }
public ClientCard GetCard(int player, CardLocation loc, int seq) public ClientCard GetCard(int player, CardLocation loc, int seq)
...@@ -169,5 +173,16 @@ namespace WindBot.Game ...@@ -169,5 +173,16 @@ namespace WindBot.Game
{ {
return IsFirst ? player : 1 - player; return IsFirst ? player : 1 - player;
} }
public ClientCard GetCurrentSolvingChainCard()
{
if (SolvingChainIndex == 0 || SolvingChainIndex > CurrentChain.Count) return null;
return CurrentChain[SolvingChainIndex - 1];
}
public bool IsCurrentSolvingChainNegated()
{
return SolvingChainIndex > 0 && NegatedChainIndexList.Contains(SolvingChainIndex);
}
} }
} }
\ No newline at end of file
...@@ -119,9 +119,9 @@ namespace WindBot.Game ...@@ -119,9 +119,9 @@ namespace WindBot.Game
Executor.OnNewPhase(); Executor.OnNewPhase();
} }
public void OnMove(int cardId, int previousControler, int previousLocation, int currentControler, int currentLocation) public void OnMove(ClientCard card, int previousControler, int previousLocation, int currentControler, int currentLocation)
{ {
Executor.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); Executor.OnMove(card, previousControler, previousLocation, currentControler, currentLocation);
} }
/// <summary> /// <summary>
...@@ -141,6 +141,11 @@ namespace WindBot.Game ...@@ -141,6 +141,11 @@ namespace WindBot.Game
{ {
Executor.OnChaining(player,card); Executor.OnChaining(player,card);
} }
public void OnChainSolved(int chainIndex)
{
Executor.OnChainSolved(chainIndex);
}
/// <summary> /// <summary>
/// Called when a chain has been solved. /// Called when a chain has been solved.
...@@ -152,6 +157,16 @@ namespace WindBot.Game ...@@ -152,6 +157,16 @@ namespace WindBot.Game
Executor.OnChainEnd(); Executor.OnChainEnd();
} }
/// <summary>
/// Called when receiving annouce
/// </summary>
/// <param name="player">Player who announce.</param>
/// <param name="data">Annouced info.</param>
public void OnReceivingAnnouce(int player, int data)
{
Executor.OnReceivingAnnouce(player, data);
}
/// <summary> /// <summary>
/// Called when the AI has to do something during the battle phase. /// Called when the AI has to do something during the battle phase.
/// </summary> /// </summary>
...@@ -300,6 +315,8 @@ namespace WindBot.Game ...@@ -300,6 +315,8 @@ namespace WindBot.Game
// Always select the first available cards and choose the minimum. // Always select the first available cards and choose the minimum.
IList<ClientCard> selected = new List<ClientCard>(); IList<ClientCard> selected = new List<ClientCard>();
if (hint == HintMsg.AttackTarget && cancelable) return selected;
if (cards.Count >= min) if (cards.Count >= min)
{ {
for (int i = 0; i < min; ++i) for (int i = 0; i < min; ++i)
......
...@@ -109,6 +109,10 @@ namespace WindBot.Game ...@@ -109,6 +109,10 @@ namespace WindBot.Game
_messages.Add(GameMessage.AttackDisabled, OnAttackDisabled); _messages.Add(GameMessage.AttackDisabled, OnAttackDisabled);
_messages.Add(GameMessage.PosChange, OnPosChange); _messages.Add(GameMessage.PosChange, OnPosChange);
_messages.Add(GameMessage.Chaining, OnChaining); _messages.Add(GameMessage.Chaining, OnChaining);
_messages.Add(GameMessage.ChainSolving, OnChainSolving);
_messages.Add(GameMessage.ChainNegated, OnChainNegated);
_messages.Add(GameMessage.ChainDisabled, OnChainDisabled);
_messages.Add(GameMessage.ChainSolved, OnChainSolved);
_messages.Add(GameMessage.ChainEnd, OnChainEnd); _messages.Add(GameMessage.ChainEnd, OnChainEnd);
_messages.Add(GameMessage.SortCard, OnCardSorting); _messages.Add(GameMessage.SortCard, OnCardSorting);
_messages.Add(GameMessage.SortChain, OnChainSorting); _messages.Add(GameMessage.SortChain, OnChainSorting);
...@@ -343,6 +347,10 @@ namespace WindBot.Game ...@@ -343,6 +347,10 @@ namespace WindBot.Game
{ {
_select_hint = data; _select_hint = data;
} }
if (type == 4) // HINT_OPSELECTED
{
_ai.OnReceivingAnnouce(player, data);
}
} }
private void OnStart(BinaryReader packet) private void OnStart(BinaryReader packet)
...@@ -350,6 +358,11 @@ namespace WindBot.Game ...@@ -350,6 +358,11 @@ namespace WindBot.Game
int type = packet.ReadByte(); int type = packet.ReadByte();
_duel.IsFirst = (type & 0xF) == 0; _duel.IsFirst = (type & 0xF) == 0;
_duel.Turn = 0; _duel.Turn = 0;
_duel.LastChainLocation = 0;
_duel.LastChainPlayer = -1;
_duel.LastChainTargets.Clear();
_duel.LastSummonedCards.Clear();
_duel.LastSummonPlayer = -1;
int duel_rule = packet.ReadByte(); int duel_rule = packet.ReadByte();
_ai.Duel.IsNewRule = (duel_rule >= 4); _ai.Duel.IsNewRule = (duel_rule >= 4);
_ai.Duel.IsNewRule2020 = (duel_rule >= 5); _ai.Duel.IsNewRule2020 = (duel_rule >= 5);
...@@ -362,6 +375,19 @@ namespace WindBot.Game ...@@ -362,6 +375,19 @@ namespace WindBot.Game
extra = packet.ReadInt16(); extra = packet.ReadInt16();
_duel.Fields[GetLocalPlayer(1)].Init(deck, extra); _duel.Fields[GetLocalPlayer(1)].Init(deck, extra);
// in case of ending duel in chain's solving
_duel.LastChainPlayer = -1;
_duel.LastChainLocation = 0;
_duel.CurrentChain.Clear();
_duel.ChainTargets.Clear();
_duel.LastChainTargets.Clear();
_duel.ChainTargetOnly.Clear();
_duel.LastSummonPlayer = -1;
_duel.SummoningCards.Clear();
_duel.LastSummonedCards.Clear();
_duel.SolvingChainIndex = 0;
_duel.NegatedChainIndexList.Clear();
Logger.DebugWriteLine("Duel started: " + _room.Names[0] + " versus " + _room.Names[1]); Logger.DebugWriteLine("Duel started: " + _room.Names[0] + " versus " + _room.Names[1]);
_ai.OnStart(); _ai.OnStart();
} }
...@@ -636,7 +662,7 @@ namespace WindBot.Game ...@@ -636,7 +662,7 @@ namespace WindBot.Game
} }
} }
_ai.OnMove(cardId, previousControler, previousLocation, currentControler, currentLocation); _ai.OnMove(card, previousControler, previousLocation, currentControler, currentLocation);
} }
private void OnSwap(BinaryReader packet) private void OnSwap(BinaryReader packet)
...@@ -742,6 +768,30 @@ namespace WindBot.Game ...@@ -742,6 +768,30 @@ namespace WindBot.Game
} }
private void OnChainSolving(BinaryReader packet)
{
int chainIndex = packet.ReadByte();
_duel.SolvingChainIndex = chainIndex;
}
private void OnChainNegated(BinaryReader packet)
{
int chainIndex = packet.ReadByte();
_duel.NegatedChainIndexList.Add(chainIndex);
}
private void OnChainDisabled(BinaryReader packet)
{
int chainIndex = packet.ReadByte();
_duel.NegatedChainIndexList.Add(chainIndex);
}
private void OnChainSolved(BinaryReader packet)
{
int chainIndex = packet.ReadByte();
_ai.OnChainSolved(chainIndex);
}
private void OnChainEnd(BinaryReader packet) private void OnChainEnd(BinaryReader packet)
{ {
_ai.OnChainEnd(); _ai.OnChainEnd();
...@@ -751,6 +801,8 @@ namespace WindBot.Game ...@@ -751,6 +801,8 @@ namespace WindBot.Game
_duel.ChainTargets.Clear(); _duel.ChainTargets.Clear();
_duel.LastChainTargets.Clear(); _duel.LastChainTargets.Clear();
_duel.ChainTargetOnly.Clear(); _duel.ChainTargetOnly.Clear();
_duel.SolvingChainIndex = 0;
_duel.NegatedChainIndexList.Clear();
} }
private void OnCardSorting(BinaryReader packet) private void OnCardSorting(BinaryReader packet)
...@@ -1083,7 +1135,7 @@ namespace WindBot.Game ...@@ -1083,7 +1135,7 @@ namespace WindBot.Game
int count = packet.ReadByte(); int count = packet.ReadByte();
packet.ReadByte(); // specount packet.ReadByte(); // specount
bool forced = packet.ReadByte() != 0; bool forced = packet.ReadByte() != 0;
packet.ReadInt32(); // hint1 int hint1 = packet.ReadInt32(); // hint1
int hint2 = packet.ReadInt32(); // hint2 int hint2 = packet.ReadInt32(); // hint2
IList<ClientCard> cards = new List<ClientCard>(); IList<ClientCard> cards = new List<ClientCard>();
...@@ -1124,7 +1176,7 @@ namespace WindBot.Game ...@@ -1124,7 +1176,7 @@ namespace WindBot.Game
return; return;
} }
Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forced, hint2)); Connection.Send(CtosMessage.Response, _ai.OnSelectChain(cards, descs, forced, hint1 | hint2));
} }
private void OnSelectCounter(BinaryReader packet) private void OnSelectCounter(BinaryReader packet)
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
...@@ -104,10 +104,12 @@ ...@@ -104,10 +104,12 @@
<Compile Include="Game\AI\Decks\GraydleExecutor.cs" /> <Compile Include="Game\AI\Decks\GraydleExecutor.cs" />
<Compile Include="Game\AI\Decks\GrenMajuThunderBoarderExecutor.cs" /> <Compile Include="Game\AI\Decks\GrenMajuThunderBoarderExecutor.cs" />
<Compile Include="Game\AI\Decks\LightswornExecutor.cs" /> <Compile Include="Game\AI\Decks\LightswornExecutor.cs" />
<Compile Include="Game\AI\Decks\LabrynthExecutor.cs" />
<Compile Include="Game\AI\Decks\LightswornShaddoldinosourExecutor.cs" /> <Compile Include="Game\AI\Decks\LightswornShaddoldinosourExecutor.cs" />
<Compile Include="Game\AI\Decks\PhantasmExecutor.cs" /> <Compile Include="Game\AI\Decks\PhantasmExecutor.cs" />
<Compile Include="Game\AI\Decks\QliphortExecutor.cs" /> <Compile Include="Game\AI\Decks\QliphortExecutor.cs" />
<Compile Include="Game\AI\Decks\ST1732Executor.cs" /> <Compile Include="Game\AI\Decks\ST1732Executor.cs" />
<Compile Include="Game\AI\Decks\SuperheavySamuraiExecutor.cs" />
<Compile Include="Game\AI\Decks\SwordsoulExecutor.cs" /> <Compile Include="Game\AI\Decks\SwordsoulExecutor.cs" />
<Compile Include="Game\AI\Decks\TrickstarExecutor.cs" /> <Compile Include="Game\AI\Decks\TrickstarExecutor.cs" />
<Compile Include="Game\AI\Decks\WitchcraftExecutor.cs" /> <Compile Include="Game\AI\Decks\WitchcraftExecutor.cs" />
...@@ -186,4 +188,4 @@ ...@@ -186,4 +188,4 @@
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment