MAME.Core/MAME.Unity/Assets/Script/UMAME/UniInterface/UniKeyboard.cs
2025-01-16 17:12:35 +08:00

276 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using MAME.Core;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class UniKeyboard : MonoBehaviour, IKeyboard
{
#region UIButton
public UILongClickButton btnP1;
public UILongClickButton btnCoin1;
public UILongClickButton btnA;
public UILongClickButton btnB;
public UILongClickButton btnC;
public UILongClickButton btnD;
//public UILongClickButton btnE;
//public UILongClickButton btnF;
public UILongClickButton btnAB;
public UILongClickButton btnCD;
public UILongClickButton btnABC;
public Transform tfKeyPad;
public FloatingJoystick mJoystick;
public List<UILongClickButton> mUIBtns = new List<UILongClickButton>();
#endregion
public static Dictionary<KeyCode, MotionKey> dictKeyCfgs = new Dictionary<KeyCode, MotionKey>();
public static KeyCode[] CheckList;
bool bReplayMode;
PlayMode mPlayMode;
ReplayMode mReplayMode;
ulong last_CurryInpuAllData_test = 0;
void Awake()
{
mJoystick = GameObject.Find("tfJoystick").GetComponent<FloatingJoystick>();
tfKeyPad = GameObject.Find("tfKeyPad").transform;
btnP1 = GameObject.Find("btnP1").GetComponent<UILongClickButton>();
btnCoin1 = GameObject.Find("btnCoin1").GetComponent<UILongClickButton>();
btnA = GameObject.Find("btnA").GetComponent<UILongClickButton>();
btnB = GameObject.Find("btnB").GetComponent<UILongClickButton>();
btnC = GameObject.Find("btnC").GetComponent<UILongClickButton>();
btnD = GameObject.Find("btnD").GetComponent<UILongClickButton>();
//btnE = GameObject.Find("btnE")?.GetComponent<UILongClickButton>();
//btnF = GameObject.Find("btnF")?.GetComponent<UILongClickButton>();
btnAB = GameObject.Find("btnAB").GetComponent<UILongClickButton>();
btnCD = GameObject.Find("btnCD").GetComponent<UILongClickButton>();
btnABC = GameObject.Find("btnABC").GetComponent<UILongClickButton>();
mUIBtns.Add(btnP1);
mUIBtns.Add(btnCoin1);
mUIBtns.Add(btnA);
mUIBtns.Add(btnB);
mUIBtns.Add(btnC);
mUIBtns.Add(btnD);
mUIBtns.Add(btnAB);
mUIBtns.Add(btnCD);
mUIBtns.Add(btnABC);
//if (btnE != null)
//{
// mUIBtns.Add(btnE);
// btnE.gameObject.SetActive(false);
//}
//else
//{
// mUIBtns.Add(btnF);
// btnF.gameObject.SetActive(false);
//}
#if UNITY_STANDALONE_WIN || UNITY_EDITOR
tfKeyPad.gameObject.SetActive(false);
#endif
Init(false);
}
public MotionKey[] GetPressedKeys()
{
MotionKey[] currkey;
ulong InputData;
if (!bReplayMode)
currkey = mPlayMode.GetPressedKeys(out InputData);
else
currkey = mReplayMode.GetPressedKeys(out InputData);
#if UNITY_EDITOR
if (last_CurryInpuAllData_test != InputData)
{
string TempStr = "";
foreach (var item in currkey)
{
TempStr += $"{item.ToString()}|";
}
Debug.Log($"{UMAME.instance.mUniVideoPlayer.mFrame} | {EmuTimer.get_current_time().attoseconds} |{EmuTimer.get_current_time().seconds} | {InputData} | {TempStr}");
last_CurryInpuAllData_test = InputData;
}
#endif
return currkey;
}
public void UpdateInputKey()
{
UpdateLogic();
}
#region
public void SetRePlay(bool IsReplay)
{
bReplayMode = IsReplay;
}
public void Init(bool IsReplay)
{
bReplayMode = IsReplay;
dictKeyCfgs.Clear();
//dictKeyCfgs.Add(KeyCode.P, MotionKey.EMU_PAUSED);
dictKeyCfgs.Add(KeyCode.Alpha1, MotionKey.P1_GAMESTART);
dictKeyCfgs.Add(KeyCode.Alpha5, MotionKey.P1_INSERT_COIN);
dictKeyCfgs.Add(KeyCode.W, MotionKey.P1_UP);
dictKeyCfgs.Add(KeyCode.S, MotionKey.P1_DOWN);
dictKeyCfgs.Add(KeyCode.A, MotionKey.P1_LEFT);
dictKeyCfgs.Add(KeyCode.D, MotionKey.P1_RIGHT);
dictKeyCfgs.Add(KeyCode.J, MotionKey.P1_BTN_1);
dictKeyCfgs.Add(KeyCode.K, MotionKey.P1_BTN_2);
dictKeyCfgs.Add(KeyCode.L, MotionKey.P1_BTN_3);
dictKeyCfgs.Add(KeyCode.U, MotionKey.P1_BTN_4);
dictKeyCfgs.Add(KeyCode.KeypadDivide, MotionKey.P2_GAMESTART);
dictKeyCfgs.Add(KeyCode.KeypadMultiply, MotionKey.P2_INSERT_COIN);
dictKeyCfgs.Add(KeyCode.UpArrow, MotionKey.P2_UP);
dictKeyCfgs.Add(KeyCode.DownArrow, MotionKey.P2_DOWN);
dictKeyCfgs.Add(KeyCode.LeftArrow, MotionKey.P2_LEFT);
dictKeyCfgs.Add(KeyCode.RightArrow, MotionKey.P2_RIGHT);
dictKeyCfgs.Add(KeyCode.Keypad1, MotionKey.P2_BTN_1);
dictKeyCfgs.Add(KeyCode.Keypad2, MotionKey.P2_BTN_2);
dictKeyCfgs.Add(KeyCode.Keypad3, MotionKey.P2_BTN_3);
dictKeyCfgs.Add(KeyCode.Keypad4, MotionKey.P2_BTN_4);
CheckList = dictKeyCfgs.Keys.ToArray();
btnP1.Key = new long[] { (long)MotionKey.P1_GAMESTART };
btnCoin1.Key = new long[] { (long)MotionKey.P1_INSERT_COIN };
btnA.Key = new long[] { (long)MotionKey.P1_BTN_1 };
btnB.Key = new long[] { (long)MotionKey.P1_BTN_2 };
btnC.Key = new long[] { (long)MotionKey.P1_BTN_3 };
btnD.Key = new long[] { (long)MotionKey.P1_BTN_4 };
//btnE.Key = new long[] { (long)MotionKey.P1_BTN_5 };
//btnF.Key = new long[] { (long)MotionKey.P1_BTN_6 };
btnAB.Key = new long[] { (long)MotionKey.P1_BTN_1, (long)MotionKey.P1_BTN_2 };
btnCD.Key = new long[] { (long)MotionKey.P1_BTN_3, (long)MotionKey.P1_BTN_4 };
btnABC.Key = new long[] { (long)MotionKey.P1_BTN_1, (long)MotionKey.P1_BTN_2, (long)MotionKey.P1_BTN_3 };
mPlayMode = new PlayMode(this);
mReplayMode = new ReplayMode();
}
public void UpdateLogic()
{
if (bReplayMode) return;
mPlayMode.UpdateLogic();
}
public class PlayMode
{
Dictionary<KeyCode, MotionKey> dictKeyCfgs => UniKeyboard.dictKeyCfgs;
UniKeyboard mUniKeyboard;
KeyCode[] CheckList => UniKeyboard.CheckList;
ulong tempInputAllData = 0;
List<MotionKey> temp = new List<MotionKey>();
public ulong CurryInpuAllData = 0;
public MotionKey[] mCurrKey = new MotionKey[0];
public PlayMode(UniKeyboard uniKeyboard)
{
this.mUniKeyboard = uniKeyboard;
}
public void UpdateLogic()
{
tempInputAllData = 0;
temp.Clear();
for (int i = 0; i < CheckList.Length; i++)
{
if (Input.GetKey(CheckList[i]))
{
MotionKey mk = dictKeyCfgs[CheckList[i]];
temp.Add(mk);
tempInputAllData |= (ulong)mk;
}
}
for (int i = 0; i < mUniKeyboard.mUIBtns.Count; i++)
{
if (mUniKeyboard.mUIBtns[i].bHotKey)
{
for (int j = 0; j < mUniKeyboard.mUIBtns[i].Key.Length; j++)
{
MotionKey mk = (MotionKey)mUniKeyboard.mUIBtns[i].Key[j];
temp.Add(mk);
tempInputAllData |= (ulong)mk;
}
}
}
Vector2Int inputV2 = mUniKeyboard.mJoystick.RawInputV2;
//Debug.Log($"{inputV2.x},{inputV2.y}");
if (inputV2.x > 0)
{
temp.Add(MotionKey.P1_RIGHT);
tempInputAllData |= (ulong)MotionKey.P1_RIGHT;
}
else if (inputV2.x < 0)
{
temp.Add(MotionKey.P1_LEFT);
tempInputAllData |= (ulong)MotionKey.P1_LEFT;
}
if (inputV2.y > 0)
{
temp.Add(MotionKey.P1_UP);
tempInputAllData |= (ulong)MotionKey.P1_UP;
}
else if (inputV2.y < 0)
{
temp.Add(MotionKey.P1_DOWN);
tempInputAllData |= (ulong)MotionKey.P1_DOWN;
}
CurryInpuAllData = tempInputAllData;
mCurrKey = temp.ToArray();
}
public MotionKey[] GetPressedKeys(out ulong InputData)
{
//UMAME.instance.mReplayWriter.NextFramebyFrameIdx((int)UMAME.instance.mUniVideoPlayer.mFrame, CurryInpuAllData);
UMAME.instance.mReplayWriter.NextFramebyFrameIdx((int)UMAME.instance.mUniVideoPlayer.mFrame, CurryInpuAllData);
InputData = CurryInpuAllData;
return mCurrKey;
}
}
public class ReplayMode
{
public MotionKey[] mCurrKey = new MotionKey[0];
MotionKey[] ReplayCheckKey;
public ReplayMode()
{
ReplayCheckKey = dictKeyCfgs.Values.ToArray();
}
public MotionKey[] GetPressedKeys(out ulong InputData)
{
List<MotionKey> temp = new List<MotionKey>();
//<2F>б
//if (UMAME.instance.mReplayReader.NextFrame(out AxiReplay.ReplayStep stepData))
int targetFrame = (int)UMAME.instance.mUniVideoPlayer.mFrame;
//if (UMAME.instance.mReplayReader.NextFramebyFrameIdx(targetFrame, out AxiReplay.ReplayStep stepData))
//{
// temp.Clear();
// //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// for (int i = 0; i < ReplayCheckKey.Length; i++)
// {
// if ((stepData.InPut & (ulong)ReplayCheckKey[i]) > 0)
// temp.Add(ReplayCheckKey[i]);
// }
// mCurrKey = temp.ToArray();
//}
UMAME.instance.mReplayReader.NextFramebyFrameIdx(targetFrame, out AxiReplay.ReplayStep stepData);
temp.Clear();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < ReplayCheckKey.Length; i++)
{
if ((stepData.InPut & (ulong)ReplayCheckKey[i]) > 0)
temp.Add(ReplayCheckKey[i]);
}
mCurrKey = temp.ToArray();
InputData = stepData.InPut;
return mCurrKey;
}
}
#endregion
}