using Nocturnis.Communicators;
using Nocturnis.Enigmos.Modules;
using TabulaSmaragdina;
using TabulaSmaragdina.Constants;
using TabulaSmaragdina.Controls;
namespace Enigmos.Modules.Extensions;
public static class CommunicateModuleExtension
{
public static bool Paired(this ICommunicateModule module) => module.PairedCommunicator != null;
///
/// Determine if the module can be paired with given communicator
///
public static bool IsMatch(this ICommunicateModule module, IBaseCommunicator communicator) =>
module.CommunicationDataType == communicator.CommunicationDataType &&
GlobalProvider.EnigmosProvider.CommunicationDirectionCompatible(
module.CommunicationDirection,
communicator.CommunicationDirection
);
///
/// Pair the module with given communicator
///
public static void Pair(this ICommunicateModule module, IBaseCommunicator communicator)
{
if(module.Paired())
module.Unpair();
module.PairedCommunicator = communicator;
communicator.PairedModule = module;
}
///
/// Unpair the module with its paired communicator
///
public static void Unpair(this ICommunicateModule module)
{
if (!module.Paired())
return;
module.PairedCommunicator.PairedModule = null;
module.PairedCommunicator = null;
}
public static void SendData(this ICommunicateModule module)
{
if (!module.Paired() || module.CommunicationDirection == EnigmosConstant.CommunicationDirections.Receive)
return;
module.PairedCommunicator.DataBuffer.Assign(module.DataBuffer, module.CommunicationDataType);
}
public static void ReceiveData(this ICommunicateModule module)
{
if (!module.Paired() || module.CommunicationDirection == EnigmosConstant.CommunicationDirections.Send)
return;
module.DataBuffer.Assign(module.PairedCommunicator.DataBuffer, module.CommunicationDataType);
}
public static IBaseCommunicator[] CompatibleCommunicators(this ICommunicateModule module) =>
CreatureControl.Instance.CurrentCharacter!.DashboardTab.AllCommunicators
.Where(module.IsMatch)
.ToArray();
}