using Mir2Assistant.Common.Models;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mir2Assistant.Common.Functions
{
public static class NpcFunction
{
///
/// 提取对话命令
///
///
///
public static List GetTalkCmds(string dialog)
{
var ret = new List();
if (string.IsNullOrEmpty(dialog))
{
return ret;
}
var regex = new Regex(@"\<(.*?)\/(.*?)\>");
Match match = regex.Match(dialog);
while (match.Success)
{
if (match.Value.Contains("/@"))
{
ret.Add(match.Value.TrimStart('<').TrimEnd('>'));
}
match = match.NextMatch();
}
return ret;
}
private static async Task Talk(MirGameInstanceModel gameInstance, Action act)
{
var memoryUtil = gameInstance!.MemoryUtils!;
var addr1 = memoryUtil.GetMemoryAddress(gameInstance.MirConfig["对话框基址"], 0);
var addr2 = memoryUtil.GetMemoryAddress(addr1, 0x11c, 0);
act();
nint addr = 0;
if (!await TaskWrapper.Wait(() =>
{
addr = memoryUtil.GetMemoryAddress(addr1, 0x11c, 0);
return addr2 != addr;
}))
{
return "";
}
var length = memoryUtil.ReadToInt(memoryUtil.GetMemoryAddress(addr1, 0x20)) * 3;
var str = memoryUtil.ReadToString(addr, length);
gameInstance.TalkCmds = GetTalkCmds(str);
return str;
}
///
/// 点NPC
///
///
///
///
public static async Task ClickNPC(MirGameInstanceModel gameInstance, MonsterModel NPC)
{
return await Talk(gameInstance, () =>
{
var npcId = gameInstance.MemoryUtils!.ReadToInt(NPC.Addr + 4);
SendMirCall.Send(gameInstance, 3001, [npcId, gameInstance!.MirConfig["寻路参数"], gameInstance!.MirConfig["点NPCCALL地址"]]);
});
}
public static async Task ClickNPC(MirGameInstanceModel gameInstance, string NpcName)
{
MonsterModel? npc = null;
if (!await TaskWrapper.Wait(() =>
{
npc = gameInstance.Monsters.Values.FirstOrDefault(o => o.TypeStr == "NPC" && o.Name == NpcName);
return npc != null;
}))
{
return "";
}
return await ClickNPC(gameInstance, npc!);
}
///
/// 二级对话
///
///
///
public static async Task Talk2(MirGameInstanceModel gameInstance, string cmd)
{
return await Talk(gameInstance, () =>
{
SendMirCall.Send(gameInstance, 3002, new nint[] { gameInstance!.MirConfig["买物参数"], gameInstance!.MirConfig["小退参数"],
gameInstance!.MirConfig["二级对话CALL地址"] ,cmd.Length}.Concat(SendMirCall.String2NIntArray(cmd)).ToArray());
});
}
public static async Task Talk2Text(MirGameInstanceModel gameInstance, string text)
{
string? cmd = null;
if (!await TaskWrapper.Wait(() =>
{
cmd = gameInstance.TalkCmds.FirstOrDefault(o => o.Split("/")[0] == text);
return cmd != null;
}))
{
return "";
}
return await Talk2(gameInstance, cmd!.Split("/")[1]);
}
///
/// 等NPC出现
///
///
///
///
public static async Task WaitNPC(MirGameInstanceModel gameInstance, string npcName, int timeout = 50)
{
return await TaskWrapper.Wait(() => gameInstance.Monsters.Values.Any(o => o.TypeStr == "NPC" && o.Name == npcName), timeout);
}
}
}