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.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using MDPro3.Duel.YGOSharp;
using MDPro3.Net;
using System.Net;
using MDPro3.Servant;
namespace MDPro3
{
......@@ -183,10 +185,12 @@ namespace MDPro3
Program.instance.room.StocMessage_ErrorMsg(r);
break;
case StocMessage.SelectHand:
Program.instance.room.StocMessage_SelectHand(r);
if(!RoomServant.FromHandTest)
Program.instance.room.StocMessage_SelectHand(r);
break;
case StocMessage.SelectTp:
Program.instance.room.StocMessage_SelectTp(r);
if(!RoomServant.FromHandTest)
Program.instance.room.StocMessage_SelectTp(r);
break;
case StocMessage.HandResult:
Program.instance.room.StocMessage_HandResult(r);
......@@ -342,6 +346,7 @@ namespace MDPro3
}
#region CtosMessage
public static void CtosMessage_Response(byte[] response)
{
var message = new Package();
......@@ -607,6 +612,36 @@ namespace MDPro3
}
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
{
......@@ -614,11 +649,16 @@ namespace MDPro3
socket.Bind(new IPEndPoint(IPAddress.Loopback, port));
return true;
}
catch (SocketException)
{
return false;
}
catch
{
return false;
}
}
}
public class Package
......
......@@ -107,6 +107,7 @@ namespace MDPro3.Servant
RoomServant.FromSolo = false;
RoomServant.FromLocalHost = false;
RoomServant.FromHandTest = false;
TcpHelper.LinkStart(ip, name, port, password, false, null);
}
......@@ -137,8 +138,11 @@ namespace MDPro3.Servant
serverArgs[9],
serverArgs[6],
"0");
RoomServant.FromSolo = false;
RoomServant.FromLocalHost = true;
RoomServant.FromHandTest = false;
YgoServer.StartServer(args);
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
public static bool FromSolo;
public static bool SoloLockHand;
public static bool FromLocalHost;
public static bool FromHandTest;
public static int CoreShowing = 0;
public class Player
......@@ -193,6 +194,8 @@ namespace MDPro3.Servant
OcgCore.lpLimit = StartLp;
if(FromSolo)
Program.instance.ocgcore.returnServant = Program.instance.solo;
else if(FromHandTest)
Program.instance.ocgcore.returnServant = Program.instance.deckEditor;
else
Program.instance.ocgcore.returnServant = Program.instance.online;
if (SelfType == 7)
......@@ -410,7 +413,8 @@ namespace MDPro3.Servant
for (int i = 0; i < 4; i++)
players[i] = null;
Program.instance.ShiftToServant(Program.instance.room);
if(!FromHandTest)
Program.instance.ShiftToServant(Program.instance.room);
}
public void StocMessage_TypeChange(BinaryReader r)
......@@ -434,7 +438,8 @@ namespace MDPro3.Servant
if (Program.instance.deckEditor.showing)
{
Program.instance.deckEditor.Hide(0);
MessageManager.Cast(InterString.Get("更换副卡组成功,请等待对手更换副卡组。"));
if(!FromHandTest)
MessageManager.Cast(InterString.Get("更换副卡组成功,请等待对手更换副卡组。"));
}
if (showing)
......
......@@ -176,6 +176,14 @@ namespace MDPro3.Servant
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)
{
IList<BotInfo> foundBots = new List<BotInfo>();
......@@ -236,6 +244,7 @@ namespace MDPro3.Servant
else
RoomServant.SoloLockHand = false;
RoomServant.FromLocalHost = false;
RoomServant.FromHandTest = false;
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));
......
using Cysharp.Threading.Tasks;
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.Net;
using System.Collections;
using MDPro3.Servant;
using MDPro3.Utility;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using MDPro3.Utility;
using Cysharp.Threading.Tasks;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using static MDPro3.Servant.DeckEditor;
namespace MDPro3.UI.ServantUI
{
......@@ -199,7 +200,7 @@ namespace MDPro3.UI.ServantUI
{
base.ShowEvent();
if (!gotoAppearance)
if (!gotoAppearance && !RoomServant.FromHandTest)
{
if (condition != Condition.ChangeSide)
ShowBackButton();
......@@ -209,6 +210,7 @@ namespace MDPro3.UI.ServantUI
else
{
gotoAppearance = false;
RoomServant.FromHandTest = false;
ShowBackButton();
}
......@@ -228,7 +230,7 @@ namespace MDPro3.UI.ServantUI
{
base.AfterHideEvent();
if(!gotoAppearance)
if(!gotoAppearance || !RoomServant.FromHandTest)
Dispose();
}
......@@ -923,8 +925,59 @@ namespace MDPro3.UI.ServantUI
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()
{
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