using System.Collections.Generic;
using UnityEngine;
namespace AxibugEmuOnline.Client
{
public class CommandDispatcher : MonoBehaviour
{
public static CommandDispatcher Instance { get; private set; }
/// 平级注册对象,都会响应指令
List m_register = new List();
/// 独占注册对象,指令会被列表中最后一个对象独占
List m_registerHigh = new List();
Dictionary m_keyMapper = new Dictionary();
private void Awake()
{
Instance = this;
m_keyMapper[KeyCode.A] = EnumCommand.SelectItemLeft;
m_keyMapper[KeyCode.D] = EnumCommand.SelectItemRight;
m_keyMapper[KeyCode.W] = EnumCommand.SelectItemUp;
m_keyMapper[KeyCode.S] = EnumCommand.SelectItemDown;
m_keyMapper[KeyCode.K] = EnumCommand.Enter;
m_keyMapper[KeyCode.L] = EnumCommand.Back;
m_keyMapper[KeyCode.I] = EnumCommand.OptionMenu;
m_keyMapper[KeyCode.LeftArrow] = EnumCommand.SelectItemLeft;
m_keyMapper[KeyCode.RightArrow] = EnumCommand.SelectItemRight;
m_keyMapper[KeyCode.UpArrow] = EnumCommand.SelectItemUp;
m_keyMapper[KeyCode.DownArrow] = EnumCommand.SelectItemDown;
m_keyMapper[KeyCode.Return] = EnumCommand.Enter;
m_keyMapper[KeyCode.Escape] = EnumCommand.Back;
m_keyMapper[KeyCode.RightShift] = EnumCommand.OptionMenu;
m_keyMapper[KeyCode.LeftShift] = EnumCommand.OptionMenu;
if (Application.platform == RuntimePlatform.PSP2)
{
m_keyMapper[Common.PSVitaKey.Left] = EnumCommand.SelectItemLeft;
m_keyMapper[Common.PSVitaKey.Right] = EnumCommand.SelectItemRight;
m_keyMapper[Common.PSVitaKey.Up] = EnumCommand.SelectItemUp;
m_keyMapper[Common.PSVitaKey.Down] = EnumCommand.SelectItemDown;
m_keyMapper[Common.PSVitaKey.Circle] = EnumCommand.Enter;
m_keyMapper[Common.PSVitaKey.Cross] = EnumCommand.Back;
m_keyMapper[Common.PSVitaKey.Triangle] = EnumCommand.OptionMenu;
}
//手柄
else
{
}
}
private void OnDestroy()
{
Instance = null;
}
public void RegistController(CommandExecuter controller)
{
if (!controller.AloneMode)
{
if (m_register.Contains(controller)) { return; }
m_register.Add(controller);
}
else
{
if (m_registerHigh.Contains(controller)) { return; }
m_registerHigh.Add(controller);
}
}
public void UnRegistController(CommandExecuter menuItemController)
{
if (!menuItemController.AloneMode)
m_register.Remove(menuItemController);
else
m_registerHigh.Remove(menuItemController);
}
readonly List oneFrameRegister = new List();
private void Update()
{
foreach (var item in m_keyMapper)
{
peekRegister(oneFrameRegister);
if (Input.GetKeyDown(item.Key))
{
foreach (var controller in oneFrameRegister)
{
if (!controller.Enable) continue;
controller.ExecuteCommand(item.Value, false);
}
}
if (Input.GetKeyUp(item.Key))
{
foreach (var controller in oneFrameRegister)
{
if (!controller.Enable) continue;
controller.ExecuteCommand(item.Value, true);
}
}
}
}
private List peekRegister(List results)
{
results.Clear();
if (m_registerHigh.Count > 0)
{
for (int i = m_registerHigh.Count - 1; i >= 0; i--)
{
var controller = m_registerHigh[i];
if (controller.Enable)
{
results.Add(controller);
return results;
}
}
}
foreach (var controller in m_register)
{
if (!controller.Enable) continue;
results.Add(controller);
}
return results;
}
#if UNITY_EDITOR
public void GetRegisters(out IReadOnlyList normal, out IReadOnlyList alone)
{
normal = m_register;
alone = m_registerHigh;
}
#endif
}
}