bool Spawn(CitizenType type, int cnt) { HashSet <int> fullSpawnPlaneIndex = new HashSet <int>(); while (cnt != 0) { int terrIndex = Random.Range(0, SpawnPlanesList.Count); if (fullSpawnPlaneIndex.Contains(terrIndex)) { continue; } else { GameObject go = SpawnPlanesList[terrIndex]; Renderer r = go.GetComponent <Renderer>(); float xLenD2 = r.bounds.size.x / 2; float zLenD2 = r.bounds.size.z / 2; float xMax = go.transform.position.x + xLenD2; float xMin = go.transform.position.x - xLenD2; float zMax = go.transform.position.z + zLenD2; float zMin = go.transform.position.z - zLenD2; float newX = Random.Range(xMin, xMax); float newZ = Random.Range(zMin, zMax); int _loopTimes = 0; bool deadLoop = false; while (Physics.CheckSphere(new Vector3(newX, 0.141f, newZ), 0.3f, 1 << 8)) { newX = Random.Range(xMin, xMax); newZ = Random.Range(zMin, zMax); ++_loopTimes; if (_loopTimes > 10) { Debug.Log("找不到刷新地点,换下一个地形"); fullSpawnPlaneIndex.Add(terrIndex); deadLoop = true; if (fullSpawnPlaneIndex.Count == SpawnPlanesList.Count) { Debug.Log("人数太多,无法放下!"); return(false); } break; } } if (deadLoop) { continue; } GameObject prefab = Resources.Load <GameObject>(CITIZENPREFABPATH); Citizen newc = Instantiate <GameObject>(prefab, new Vector3(newX, prefab.transform.position.y, newZ), Quaternion.Euler(0, 90, 0), PersonsRoot).AddComponent <Citizen>(); int id = CitizensDict.Count; CitizensDict[id] = newc; newc.Init(id, type); --cnt; } } return(true); }
/// <summary> /// 开始一个选举 /// </summary> /// <returns></returns> public bool StartElection() { //使用一个新的选举号 this.ElectionNo++; if (SendMessage("Vote", this)) { this.Type = CitizenType.Leader; return(true); } return(false); }
public bool DoVote(int election_no, Citizen citizen) { if (election_no > this.VotedElectionNo) { this.VotedElectionNo = election_no; this.Type = CitizenType.Citizen; this.Leader = citizen; return(true); } return(false); }
public bool DoWrite(Bucket bucket, Citizen citizen) { if (bucket.LeaderNo < this.VotedElectionNo) { return(false); } if (bucket.LeaderNo > this.VotedElectionNo) { this.VotedElectionNo = bucket.LeaderNo; this.Type = CitizenType.Citizen; this.Leader = citizen; } //save bucket to local disk return(true); }
public Bucket Read(int index) { if (!EnsureRecovery(index)) { return(null); } if (SendMessage("Read", index)) { //get bucket from local disk return(new Bucket()); } else { this.Type = CitizenType.Citizen; return(null); } }
/// <summary> /// 发起一个写操作 /// </summary> /// <param name="bucket"></param> /// <returns></returns> public bool Write(int index, Bucket bucket) { bucket.LeaderNo = this.ElectionNo; bucket.VersionNo++; if (SendMessage("Write", bucket)) { //save data to local return(true); } //if (DateTime.Now - lastActiveTime >= TimeSpan.FromSeconds(30)) //{ // if (StartElection()) // { // return this.Write(index, bucket); // } //} this.Type = CitizenType.Citizen; return(false); }
public ICitizen GetCitizen(CitizenType type) { switch (type) { case CitizenType.Banker: ICitizen banker = new Banker(); return(banker); case CitizenType.Farmer: ICitizen farmer = new Farmer(); return(farmer); case CitizenType.Trader: ICitizen trader = new Trader(); return(trader); case CitizenType.Driver: ICitizen driver = new Driver(); return(driver); } return(null); }
public void Init(int id, CitizenType citizenType) { #region 初始化参数 timeAlive = 0; ID = id; CitizenType = citizenType; bWearingMask = false; bRecalculatePathKey = false; bCheckAmbulanceKey = false; CureTimeTotal = CitizenMgr.GenerateCureTime(); LatentTimeTotal = CitizenMgr.GenerateLatentTime(); ToHospTimeTotal = CitizenMgr.GenerateToHospitalTime(); AliveTimeTotal = CitizenMgr.GenerateAliveTime(); InfectRate = CitizenMgr.GenerateInfectRate(); #endregion #region 初始化组件 spriteRenderer = GetComponent <SpriteRenderer>(); navAgent = GetComponent <NavMeshAgent>(); animator = GetComponent <Animator>(); citizenStatus = GetComponent <CitizenStatus>(); boxCollider = GetComponent <BoxCollider>(); navAgent.updateRotation = false; citizenStatus.Init(transform); #endregion #region 初始化状态机 fsmSystem = new FSMSystem(); FSMHealthyState healthyState = new FSMHealthyState(fsmSystem); healthyState.AddTransition(FSMTransition.Infected, FSMStateID.LatentFSMStateID); FSMLatentState latentState = new FSMLatentState(fsmSystem); latentState.AddTransition(FSMTransition.AfterLatent, FSMStateID.IllFSMStateID); latentState.AddTransition(FSMTransition.TookByAmbulance, FSMStateID.ToHospitalFSMStateID); latentState.AddTransition(FSMTransition.CantTakeAmbulance, FSMStateID.WaitToHospFSMStateID); FSMIllState illState = new FSMIllState(fsmSystem); illState.AddTransition(FSMTransition.WantHealing, FSMStateID.WaitToHospFSMStateID); illState.AddTransition(FSMTransition.ToLate, FSMStateID.DeadFSMStateID); illState.AddTransition(FSMTransition.TookByAmbulance, FSMStateID.ToHospitalFSMStateID); illState.AddTransition(FSMTransition.CantTakeAmbulance, FSMStateID.WaitToHospFSMStateID); FSMWaitHospState waitToHospitalState = new FSMWaitHospState(fsmSystem); waitToHospitalState.AddTransition(FSMTransition.BedsAvailable, FSMStateID.ToHospitalFSMStateID); waitToHospitalState.AddTransition(FSMTransition.ToLate, FSMStateID.DeadFSMStateID); FSMToHospitalState toHospitalState = new FSMToHospitalState(fsmSystem); toHospitalState.AddTransition(FSMTransition.ReachHospital, FSMStateID.InHospitalFSMStateID); toHospitalState.AddTransition(FSMTransition.ToLate, FSMStateID.DeadFSMStateID); FSMInHospitalState inHospitalState = new FSMInHospitalState(fsmSystem); inHospitalState.AddTransition(FSMTransition.Healed, FSMStateID.CuredFSMStateID); inHospitalState.AddTransition(FSMTransition.HealingFailed, FSMStateID.DeadFSMStateID); inHospitalState.AddTransition(FSMTransition.ToLate, FSMStateID.DeadFSMStateID); FSMCuredState curedState = new FSMCuredState(fsmSystem); FSMDeadState deadState = new FSMDeadState(fsmSystem); List <FSMBaseState> statesList = new List <FSMBaseState> { healthyState, latentState, illState, waitToHospitalState, toHospitalState, inHospitalState, curedState, deadState }; foreach (FSMBaseState state in statesList) { state.Init(this, animator); } switch (citizenType) { case CitizenType.Healthy: fsmSystem.AddFSMSate(healthyState); CitizenType = CitizenType.Healthy; break; case CitizenType.Latent: fsmSystem.AddFSMSate(latentState); CitizenType = CitizenType.Latent; break; case CitizenType.Ill: fsmSystem.AddFSMSate(illState); CitizenType = CitizenType.Ill; break; case CitizenType.InHospital: fsmSystem.AddFSMSate(inHospitalState); CitizenType = CitizenType.InHospital; break; case CitizenType.Cured: fsmSystem.AddFSMSate(curedState); CitizenType = CitizenType.Cured; break; case CitizenType.Dead: fsmSystem.AddFSMSate(deadState); CitizenType = CitizenType.Dead; break; } foreach (FSMBaseState state in statesList) { fsmSystem.AddFSMSate(state); } #endregion #region 初始化动画 int controllerIndex = Random.Range(0, 4); AnimatorOverrideController controller = new AnimatorOverrideController(); switch (controllerIndex) { case 0: controller.runtimeAnimatorController = CitizenMgr.Instance.F1; break; case 1: controller.runtimeAnimatorController = CitizenMgr.Instance.F2; break; case 2: controller.runtimeAnimatorController = CitizenMgr.Instance.M1; break; case 3: controller.runtimeAnimatorController = CitizenMgr.Instance.M2; break; default: controller.runtimeAnimatorController = CitizenMgr.Instance.F1; break; } animator.runtimeAnimatorController = controller; #endregion }
public void Init(CitizenType color) { }
public CitizenPerson(IDropTableScheme goodsDropTable, IDropResolver dropResolver) { CitizenType = CitizenType.Trader; _goodsDropTable = goodsDropTable; _dropResolver = dropResolver; }
public CitizenPerson(Dialog dialog) { CitizenType = CitizenType.QuestGiver; Dialog = dialog; }
public CitizenPerson() { CitizenType = CitizenType.Unintresting; }