using System.Collections; using System.Collections.Generic; using UnityEngine; using LzFramework.UI; using LzFramework; using Newtonsoft.Json; using EduCoderTool; namespace DisComputer { /// /// 诺依曼总控制 /// public class VonNeumannControll : MonoBehaviour { public static VonNeumannControll Instance; [SerializeField] private CommandUnitSet commandUnitSet; [SerializeField] private IRegUnit iregUnit; [SerializeField] private PRegUnit pRegUnit; [SerializeField] private DecoderUnit decoderUnit; [SerializeField] private OperationUnitSet operationUnitSet; [SerializeField] private ALUUnit aLUUnit; [SerializeField] private RegsUnitSet regsUnitSet; [SerializeField] private MEMUnitSet mEMUnitSet; public CommandControl commandControl; private void Awake() { Instance = this; } // Start is called before the first frame update void Start() { TTUIPage.ShowPage(); Invoke("Rewind",0.05f); } /// /// 复原结构图 /// public void Rewind() { if (!this.gameObject.activeSelf) return; commandUnitSet.RewindCommand(); iregUnit.RewindUnit(); pRegUnit.RewindUnit(); decoderUnit.RewindUnit(); operationUnitSet.Rewind(); aLUUnit.RewindUnit(); regsUnitSet.RewinRegsUnitSet(); mEMUnitSet.RewindMEMUnitSet(); commandControl.progressView.ClearItem(); VonNeumann.CommandIndex = 0; } //移动指令 public void OnMov3() { Debug.LogFormat("OnMov3!!!!"); OnOperation(); } //加法 public void OnAdd() { Debug.LogFormat("OnAdd!!!!"); OnOperation(); } //减法 public void OnSub() { Debug.LogFormat("OnSub!!!!"); OnOperation(); } //乘法 public void OnMul() { Debug.LogFormat("OnMul!!!!"); OnOperation(); } //除法 public void OnDiv() { Debug.LogFormat("OnDiv!!!!"); OnOperation(); } //终止 public void OnHalt() { OnHaltAction(); } //输入 public void OnIn() { } //输出 public void OnOut() { OnOperation(); } /// /// 运算操作 /// void OnOperation() { VonNeumann.isRunning = true; iregUnit.nextUnit = decoderUnit.gameObject; iregUnit.pReg_unit = pRegUnit; commandUnitSet.Command(() => { if (iregUnit.pReg_unit != null) { iregUnit.SetInfoTxt(VonNeumann.data.ActName); //启动Ireg=> pReg iregUnit.ShowArrow(1, false, () => { string tempStr = GetMemoryAdd(); Debug.LogFormat(">>>>>>>>>>> {0}", tempStr); iregUnit.pReg_unit.SetInfoTxt(GetMemoryAdd()); //启动pReg=> command iregUnit.pReg_unit.Active(() => { //iReg结束回调 iregUnit.ShowArrow(0, false, () => { iregUnit.nextUnit.GetComponent().Active(); }); }, VonNeumann.CommandIndex+1); }); } }); } /// /// 终止动作 /// void OnHaltAction() { VonNeumann.isRunning = true; iregUnit.nextUnit = decoderUnit.gameObject; iregUnit.pReg_unit = pRegUnit; commandUnitSet.Command(() => { if (iregUnit.pReg_unit != null) { iregUnit.SetInfoTxt(VonNeumann.data.ActName); //启动Ireg=> pReg iregUnit.ShowArrow(1, false, () => { iregUnit.pReg_unit.SetInfoTxt(GetMemoryAdd()); //启动pReg=> command iregUnit.pReg_unit.Active(() => { //iReg结束回调 FinishCurStep(); }, VonNeumann.CommandIndex + 1); }); } }); } /// /// 当前步骤完成 /// public void FinishCurStep() { VonNeumann.CommandIndex++; VonNeumann.isRunning = false; if (VonNeumann.CommandIndex >= VonNeumann.data.ActCommandList.Count) { VonNeumann.isFinish = true; MessageContainer.SendMessage("恭喜闯关成功!!!", this, MsgName.TipVonneumannPoint); commandControl.progressView.ClearItem(); SendSuccessToWeb(); } } /// /// 发送通关成功 /// public void SendSuccessToWeb() { WebData webData = new WebData(); webData.Data = ""; webData.GameState = "Success"; string json = JsonConvert.SerializeObject(webData); WebConnecter.Singleton.SendDataToWeb(json); } /// /// 初始化指令图 /// public void InitCommandMap() { commandUnitSet.ShakeCommands(()=> { pRegUnit.ShakeUnit(); pRegUnit.SetInfoTxt("000"); pRegUnit.ShowArrow(0, false, () => { commandControl.progressView.InitActItems(); }); }); } string GetMemoryAdd() { int i = VonNeumann.CommandIndex+1; string val = "00" + (i).ToString(); return val; } } }