using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LzFramework;
namespace DisComputer
{
///
/// 指令集视图
///
public class ProgressView : MonoBehaviour
{
[SerializeField]
private GameObject actItemGo;
//垂直间距
[SerializeField]
private float v_offset = 55;
private Dictionary actCommandItems = new Dictionary();
// Start is called before the first frame update
void Start()
{
}
///
/// 初始化
///
public void InitActItems()
{
this.gameObject.SetActive(true);
CommandData data = VonNeumann.data;
List randomList = FuncTools.CreateRanArrVal(data.ActCommandList.Count, data.ActCommandList.Count);
int v_index = 0;
for(int i = 0;i < data.ActCommandList.Count; i++)
{
string val = data.ActCommandList[randomList[i]];
if (!actCommandItems.ContainsKey(val))
{
GameObject tempGo = Instantiate(actItemGo, transform);
tempGo.SetActive(true);
tempGo.transform.localPosition = new Vector3(actItemGo.transform.localPosition.x, actItemGo.transform.localPosition.y - v_offset * v_index, 0);
ActCommandItem actCommand = tempGo.GetComponent();
if (val == "mov3")
{
actCommand.SetBtn(val, OnClickMov3);
}
else if (val == "add")
{
actCommand.SetBtn(val, OnClickAdd);
}
else if (val == "out")
{
actCommand.SetBtn(val, OnClickOut);
}
else if (val == "halt")
{
actCommand.SetBtn(val, OnClickHalt);
}
else if (val == "div")
{
actCommand.SetBtn(val, OnClickDiv);
}
else if (val == "mul")
{
actCommand.SetBtn(val, OnClickMul);
}
else if (val == "sub")
{
actCommand.SetBtn(val, OnClickSub);
}
else if (val == "in")
{
actCommand.SetBtn(val, OnClickIn);
}
actCommandItems.Add(val, actCommand);
v_index++;
}
}
List jamList = FuncTools.CreateRanArrVal(data.JamCommandList.Count, data.JamCommandList.Count);
int limit_index = 3;
for(int i = 0;i < jamList.Count; i++)
{
string val = data.JamCommandList[jamList[i]];
if (!actCommandItems.ContainsKey(val))
{
GameObject tempGo = Instantiate(actItemGo, transform);
tempGo.SetActive(true);
tempGo.transform.localPosition = new Vector3(actItemGo.transform.localPosition.x, actItemGo.transform.localPosition.y - v_offset * v_index, 0);
ActCommandItem actCommand = tempGo.GetComponent();
actCommand.SetBtn(val, OnClickWrong);
v_index++;
limit_index--;
}
if (limit_index <= 0)
break;
}
}
///
/// 清理命令指令
///
public void ClearItem()
{
actCommandItems.Clear();
ActCommandItem[] childGos = this.transform.GetComponentsInChildren();
for(int i = 0;i< childGos.Length; i++)
{
Destroy(childGos[i].gameObject);
}
this.gameObject.SetActive(false);
}
void OnClickMov3()
{
if (JudgeRight("mov3"))
{
int num = VonNeumann.CommandIndex == 0 ? VonNeumann.data.num01 : VonNeumann.data.num02;
VonNeumann.data.ActName = "mov3 "+ (VonNeumann.CommandIndex + 1).ToString()+" "+ num.ToString();
VonNeumannControll.Instance.OnMov3();
}
else
{
}
}
//加法
void OnClickAdd()
{
if (JudgeRight("add"))
{
VonNeumann.data.ActName = "add 1 2";
VonNeumannControll.Instance.OnAdd();
}
else
{
}
}
//减法
void OnClickSub()
{
if (JudgeRight("sub"))
{
VonNeumann.data.ActName = "sub 1 2";
VonNeumannControll.Instance.OnSub();
}
else
{
}
}
//乘法
void OnClickMul()
{
if (JudgeRight("mul"))
{
VonNeumann.data.ActName = "mul 1 2";
VonNeumannControll.Instance.OnMul();
}
else
{
}
}
//除法
void OnClickDiv()
{
if (JudgeRight("div"))
{
VonNeumann.data.ActName = "div 1 2";
VonNeumannControll.Instance.OnDiv();
}
else
{
}
}
//终止
void OnClickHalt()
{
if (JudgeRight("halt"))
{
VonNeumann.data.ActName = "halt";
VonNeumannControll.Instance.OnHalt();
}
else
{
}
}
//输入
void OnClickIn()
{
if (JudgeRight("in"))
{
VonNeumann.data.ActName = "in";
VonNeumannControll.Instance.OnIn();
}
else
{
}
}
//点击错误
void OnClickWrong()
{
if (JudgeRight("Wrong"))
{
}
}
//输出
void OnClickOut()
{
if (JudgeRight("out"))
{
VonNeumann.data.ActName = "out 1";
VonNeumannControll.Instance.OnOut();
}
else
{
}
}
bool JudgeRight(string key)
{
if (VonNeumann.isRunning)
{
MessageContainer.SendMessage("指令正在运行中,请等待", this, MsgName.TipVonneumannPoint);
return false;
}
if (string.Equals(VonNeumann.data.ActCommandList[VonNeumann.CommandIndex],key))
return true;
MessageContainer.SendMessage("你当前选择步骤有误!",this,MsgName.TipVonneumannPoint);
return false;
}
}
}