Exemple #1
0
    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);
    }
Exemple #2
0
 /// <summary>
 /// 开始一个选举
 /// </summary>
 /// <returns></returns>
 public bool StartElection()
 {
     //使用一个新的选举号
     this.ElectionNo++;
     if (SendMessage("Vote", this))
     {
         this.Type = CitizenType.Leader;
         return(true);
     }
     return(false);
 }
Exemple #3
0
 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);
 }
Exemple #4
0
 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);
 }
Exemple #5
0
 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);
     }
 }
Exemple #6
0
 /// <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);
 }
Exemple #7
0
        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);
        }
Exemple #8
0
    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
    }
Exemple #9
0
 public void Init(CitizenType color)
 {
 }
Exemple #10
0
 public CitizenPerson(IDropTableScheme goodsDropTable, IDropResolver dropResolver)
 {
     CitizenType     = CitizenType.Trader;
     _goodsDropTable = goodsDropTable;
     _dropResolver   = dropResolver;
 }
Exemple #11
0
 public CitizenPerson(Dialog dialog)
 {
     CitizenType = CitizenType.QuestGiver;
     Dialog      = dialog;
 }
Exemple #12
0
 public CitizenPerson()
 {
     CitizenType = CitizenType.Unintresting;
 }