Commit eea83a16 authored by SherryChaos's avatar SherryChaos

Hand Test

parent 93c940ec
using MDPro3.Duel.YGOSharp;
using MDPro3.Net;
using MDPro3.Servant;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using UnityEngine; using UnityEngine;
using MDPro3.Duel.YGOSharp;
using MDPro3.Net;
using System.Net;
using MDPro3.Servant;
namespace MDPro3 namespace MDPro3
{ {
...@@ -183,10 +185,12 @@ namespace MDPro3 ...@@ -183,10 +185,12 @@ namespace MDPro3
Program.instance.room.StocMessage_ErrorMsg(r); Program.instance.room.StocMessage_ErrorMsg(r);
break; break;
case StocMessage.SelectHand: case StocMessage.SelectHand:
Program.instance.room.StocMessage_SelectHand(r); if(!RoomServant.FromHandTest)
Program.instance.room.StocMessage_SelectHand(r);
break; break;
case StocMessage.SelectTp: case StocMessage.SelectTp:
Program.instance.room.StocMessage_SelectTp(r); if(!RoomServant.FromHandTest)
Program.instance.room.StocMessage_SelectTp(r);
break; break;
case StocMessage.HandResult: case StocMessage.HandResult:
Program.instance.room.StocMessage_HandResult(r); Program.instance.room.StocMessage_HandResult(r);
...@@ -342,6 +346,7 @@ namespace MDPro3 ...@@ -342,6 +346,7 @@ namespace MDPro3
} }
#region CtosMessage #region CtosMessage
public static void CtosMessage_Response(byte[] response) public static void CtosMessage_Response(byte[] response)
{ {
var message = new Package(); var message = new Package();
...@@ -607,6 +612,36 @@ namespace MDPro3 ...@@ -607,6 +612,36 @@ namespace MDPro3
} }
public static bool IsPortAvailable(int port) public static bool IsPortAvailable(int port)
{
if (port < IPEndPoint.MinPort || port > IPEndPoint.MaxPort)
{
throw new ArgumentException($"指定的端口号 {port} 超出有效范围。");
}
bool? systemQueryResult = IsPortOccupiedBySystem(port);
if (systemQueryResult == true)
return false;
return TryBindSocket(port);
}
private static bool? IsPortOccupiedBySystem(int port)
{
try
{
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] activeTcpListeners = ipProperties.GetActiveTcpListeners();
bool isInUse = activeTcpListeners.Any(endpoint => endpoint.Port == port);
return isInUse;
}
catch (Exception)
{
return null;
}
}
private static bool TryBindSocket(int port)
{ {
try try
{ {
...@@ -614,11 +649,16 @@ namespace MDPro3 ...@@ -614,11 +649,16 @@ namespace MDPro3
socket.Bind(new IPEndPoint(IPAddress.Loopback, port)); socket.Bind(new IPEndPoint(IPAddress.Loopback, port));
return true; return true;
} }
catch (SocketException)
{
return false;
}
catch catch
{ {
return false; return false;
} }
} }
} }
public class Package public class Package
......
...@@ -107,6 +107,7 @@ namespace MDPro3.Servant ...@@ -107,6 +107,7 @@ namespace MDPro3.Servant
RoomServant.FromSolo = false; RoomServant.FromSolo = false;
RoomServant.FromLocalHost = false; RoomServant.FromLocalHost = false;
RoomServant.FromHandTest = false;
TcpHelper.LinkStart(ip, name, port, password, false, null); TcpHelper.LinkStart(ip, name, port, password, false, null);
} }
...@@ -137,8 +138,11 @@ namespace MDPro3.Servant ...@@ -137,8 +138,11 @@ namespace MDPro3.Servant
serverArgs[9], serverArgs[9],
serverArgs[6], serverArgs[6],
"0"); "0");
RoomServant.FromSolo = false; RoomServant.FromSolo = false;
RoomServant.FromLocalHost = true; RoomServant.FromLocalHost = true;
RoomServant.FromHandTest = false;
YgoServer.StartServer(args); YgoServer.StartServer(args);
TcpHelper.LinkStart("127.0.0.1", Config.Get("DuelPlayerName0", Config.EMPTY_STRING), port.ToString(), string.Empty, true, null); TcpHelper.LinkStart("127.0.0.1", Config.Get("DuelPlayerName0", Config.EMPTY_STRING), port.ToString(), string.Empty, true, null);
} }
......
...@@ -38,6 +38,7 @@ namespace MDPro3.Servant ...@@ -38,6 +38,7 @@ namespace MDPro3.Servant
public static bool FromSolo; public static bool FromSolo;
public static bool SoloLockHand; public static bool SoloLockHand;
public static bool FromLocalHost; public static bool FromLocalHost;
public static bool FromHandTest;
public static int CoreShowing = 0; public static int CoreShowing = 0;
public class Player public class Player
...@@ -193,6 +194,8 @@ namespace MDPro3.Servant ...@@ -193,6 +194,8 @@ namespace MDPro3.Servant
OcgCore.lpLimit = StartLp; OcgCore.lpLimit = StartLp;
if(FromSolo) if(FromSolo)
Program.instance.ocgcore.returnServant = Program.instance.solo; Program.instance.ocgcore.returnServant = Program.instance.solo;
else if(FromHandTest)
Program.instance.ocgcore.returnServant = Program.instance.deckEditor;
else else
Program.instance.ocgcore.returnServant = Program.instance.online; Program.instance.ocgcore.returnServant = Program.instance.online;
if (SelfType == 7) if (SelfType == 7)
...@@ -410,7 +413,8 @@ namespace MDPro3.Servant ...@@ -410,7 +413,8 @@ namespace MDPro3.Servant
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
players[i] = null; players[i] = null;
Program.instance.ShiftToServant(Program.instance.room); if(!FromHandTest)
Program.instance.ShiftToServant(Program.instance.room);
} }
public void StocMessage_TypeChange(BinaryReader r) public void StocMessage_TypeChange(BinaryReader r)
...@@ -434,7 +438,8 @@ namespace MDPro3.Servant ...@@ -434,7 +438,8 @@ namespace MDPro3.Servant
if (Program.instance.deckEditor.showing) if (Program.instance.deckEditor.showing)
{ {
Program.instance.deckEditor.Hide(0); Program.instance.deckEditor.Hide(0);
MessageManager.Cast(InterString.Get("更换副卡组成功,请等待对手更换副卡组。")); if(!FromHandTest)
MessageManager.Cast(InterString.Get("更换副卡组成功,请等待对手更换副卡组。"));
} }
if (showing) if (showing)
......
...@@ -176,6 +176,14 @@ namespace MDPro3.Servant ...@@ -176,6 +176,14 @@ namespace MDPro3.Servant
Program.instance.ShiftToServant(Program.instance.room); Program.instance.ShiftToServant(Program.instance.room);
} }
} }
public void StartAIForHandTest(int port)
{
string aiCommand = GetWindBotCommand(0, false);
if (!string.IsNullOrEmpty(aiCommand))
StartWindBot(aiCommand, "127.0.0.1", port.ToString(), string.Empty, true, 0);
}
private string GetRandomBot(string flag) private string GetRandomBot(string flag)
{ {
IList<BotInfo> foundBots = new List<BotInfo>(); IList<BotInfo> foundBots = new List<BotInfo>();
...@@ -236,6 +244,7 @@ namespace MDPro3.Servant ...@@ -236,6 +244,7 @@ namespace MDPro3.Servant
else else
RoomServant.SoloLockHand = false; RoomServant.SoloLockHand = false;
RoomServant.FromLocalHost = false; RoomServant.FromLocalHost = false;
RoomServant.FromHandTest = false;
TcpHelper.LinkStart("127.0.0.1", Config.Get("DuelPlayerName0", Config.EMPTY_STRING), port, string.Empty, true TcpHelper.LinkStart("127.0.0.1", Config.Get("DuelPlayerName0", Config.EMPTY_STRING), port, string.Empty, true
, () => StartWindBot(command, "127.0.0.1", port, string.Empty, lockHand, 0)); , () => StartWindBot(command, "127.0.0.1", port, string.Empty, lockHand, 0));
......
using Cysharp.Threading.Tasks;
using DG.Tweening; using DG.Tweening;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using MDPro3.Servant;
using static MDPro3.Servant.DeckEditor;
using MDPro3.Duel.YGOSharp; using MDPro3.Duel.YGOSharp;
using MDPro3.Net; using MDPro3.Net;
using System.Collections; using MDPro3.Servant;
using MDPro3.Utility;
using System; using System;
using System.Collections;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using MDPro3.Utility; using UnityEditor.Experimental.GraphView;
using Cysharp.Threading.Tasks; using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using static MDPro3.Servant.DeckEditor;
namespace MDPro3.UI.ServantUI namespace MDPro3.UI.ServantUI
{ {
...@@ -199,7 +200,7 @@ namespace MDPro3.UI.ServantUI ...@@ -199,7 +200,7 @@ namespace MDPro3.UI.ServantUI
{ {
base.ShowEvent(); base.ShowEvent();
if (!gotoAppearance) if (!gotoAppearance && !RoomServant.FromHandTest)
{ {
if (condition != Condition.ChangeSide) if (condition != Condition.ChangeSide)
ShowBackButton(); ShowBackButton();
...@@ -209,6 +210,7 @@ namespace MDPro3.UI.ServantUI ...@@ -209,6 +210,7 @@ namespace MDPro3.UI.ServantUI
else else
{ {
gotoAppearance = false; gotoAppearance = false;
RoomServant.FromHandTest = false;
ShowBackButton(); ShowBackButton();
} }
...@@ -228,7 +230,7 @@ namespace MDPro3.UI.ServantUI ...@@ -228,7 +230,7 @@ namespace MDPro3.UI.ServantUI
{ {
base.AfterHideEvent(); base.AfterHideEvent();
if(!gotoAppearance) if(!gotoAppearance || !RoomServant.FromHandTest)
Dispose(); Dispose();
} }
...@@ -923,8 +925,59 @@ namespace MDPro3.UI.ServantUI ...@@ -923,8 +925,59 @@ namespace MDPro3.UI.ServantUI
public void OnHandTest() public void OnHandTest()
{ {
_ = HandTestAsync();
} }
private async UniTask HandTestAsync()
{
UIManager.UIBlackIn(0.3f);
await UniTask.WaitForSeconds(0.3f);
int port = 7911;
while (!TcpHelper.IsPortAvailable(port))
{
port++;
if (port == 65536)
port = 1;
}
string args = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11}",
port.ToString(),
BanlistManager.EmptyBanlistName,
"5", // Pool
"0", // Model
"F", //
"F", // Check
"F", // Shuffle
"8000", // Life Point
"5", // Hand
"1", // Time
"0", // Draw
"0"
);
RoomServant.FromSolo = false;
RoomServant.FromLocalHost = false;
RoomServant.FromHandTest = true;
YgoServer.StartServer(args);
await UniTask.Delay(50);
Program.instance.solo.StartAIForHandTest(port);
await UniTask.Delay(50);
bool joined = false;
TcpHelper.LinkStart("127.0.0.1", Config.Get("DuelPlayerName0", Config.EMPTY_STRING), port.ToString(), string.Empty, true, () => joined = true);
await UniTask.WaitUntil(() => joined);
var deck = DeckView.FromObjectDeckToCodedDeck();
TcpHelper.CtosMessage_UpdateDeck(deck);
TcpHelper.CtosMessage_HsReady();
await UniTask.Delay(50);
TcpHelper.CtosMessage_HandResult(2);
await UniTask.Delay(50);
TcpHelper.CtosMessage_TpResult(true);
}
private void OnClearDeck() private void OnClearDeck()
{ {
var codes = new List<int>(); var codes = new List<int>();
......
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