Esempio n. 1
0
        /// <summary>
        /// The main method of the custom AI.
        /// </summary>
        ///
        /// <param name="instance">A reference to an object instance of the original AI.</param>
        /// <param name="citizenId">The ID of the citizen to process.</param>
        /// <param name="citizen">A <see cref="Citizen"/> reference to process.</param>
        public void UpdateLocation(TAI instance, uint citizenId, ref TCitizen citizen)
        {
            if (!EnsureCitizenValid(citizenId, ref citizen))
            {
                return;
            }

            if (CitizenProxy.IsDead(ref citizen))
            {
                ProcessCitizenDead(instance, citizenId, ref citizen);
                return;
            }

            if ((CitizenProxy.IsSick(ref citizen) && ProcessCitizenSick(instance, citizenId, ref citizen)) ||
                (CitizenProxy.IsArrested(ref citizen) && ProcessCitizenArrested(ref citizen)))
            {
                return;
            }

            ResidentState residentState = GetResidentState(ref citizen);

            switch (residentState)
            {
            case ResidentState.LeftCity:
                CitizenMgr.ReleaseCitizen(citizenId);
                break;

            case ResidentState.MovingHome:
                ProcessCitizenMoving(instance, citizenId, ref citizen, false);
                break;

            case ResidentState.AtHome:
                ProcessCitizenAtHome(instance, citizenId, ref citizen);
                break;

            case ResidentState.MovingToTarget:
                ProcessCitizenMoving(instance, citizenId, ref citizen, true);
                break;

            case ResidentState.AtSchoolOrWork:
                ProcessCitizenAtSchoolOrWork(instance, citizenId, ref citizen);
                break;

            case ResidentState.AtLunch:
            case ResidentState.Shopping:
            case ResidentState.AtLeisureArea:
            case ResidentState.Visiting:
                ProcessCitizenVisit(instance, residentState, citizenId, ref citizen);
                break;

            case ResidentState.Evacuating:
                ProcessCitizenEvacuation(instance, citizenId, ref citizen);
                break;

            case ResidentState.InShelter:
                CitzenReturnsFromShelter(instance, citizenId, ref citizen);
                return;
            }
        }
Esempio n. 2
0
        /// <summary>The entry method of the custom AI.</summary>
        /// <param name="instance">A reference to an object instance of the original AI.</param>
        /// <param name="citizenId">The ID of the citizen to process.</param>
        /// <param name="citizen">A <typeparamref name="TCitizen"/> reference to process.</param>
        public void UpdateLocation(TAI instance, uint citizenId, ref TCitizen citizen)
        {
            if (!EnsureCitizenCanBeProcessed(citizenId, ref citizen))
            {
                return;
            }

            if (CitizenProxy.IsDead(ref citizen))
            {
                ProcessCitizenDead(instance, citizenId, ref citizen);
                return;
            }

            if ((CitizenProxy.IsSick(ref citizen) && ProcessCitizenSick(instance, citizenId, ref citizen)) ||
                (CitizenProxy.IsArrested(ref citizen) && ProcessCitizenArrested(ref citizen)))
            {
                return;
            }

            ResidentState residentState = GetResidentState(ref citizen);
            bool          isVirtual;

            switch (residentState)
            {
            case ResidentState.MovingHome:
                ProcessCitizenMoving(instance, citizenId, ref citizen, false);
                break;

            case ResidentState.AtHome:
                isVirtual = IsCitizenVirtual(instance, ref citizen, ShouldRealizeCitizen);
                ProcessCitizenAtHome(instance, citizenId, ref citizen, isVirtual);
                break;

            case ResidentState.MovingToTarget:
                ProcessCitizenMoving(instance, citizenId, ref citizen, true);
                break;

            case ResidentState.AtSchoolOrWork:
                isVirtual = IsCitizenVirtual(instance, ref citizen, ShouldRealizeCitizen);
                ProcessCitizenAtSchoolOrWork(instance, citizenId, ref citizen, isVirtual);
                break;

            case ResidentState.AtLunch:
            case ResidentState.Shopping:
            case ResidentState.AtLeisureArea:
            case ResidentState.Visiting:
                isVirtual = IsCitizenVirtual(instance, ref citizen, ShouldRealizeCitizen);
                ProcessCitizenVisit(instance, residentState, citizenId, ref citizen, isVirtual);
                break;

            case ResidentState.OnTour:
                ProcessCitizenOnTour(instance, citizenId, ref citizen);
                break;

            case ResidentState.Evacuating:
                ProcessCitizenEvacuation(instance, citizenId, ref citizen);
                break;

            case ResidentState.InShelter:
                isVirtual = IsCitizenVirtual(instance, ref citizen, ShouldRealizeCitizen);
                CitizenReturnsFromShelter(instance, citizenId, ref citizen, isVirtual);
                break;

            case ResidentState.Unknown:
                Log.Debug(TimeInfo.Now, $"WARNING: {GetCitizenDesc(citizenId, ref citizen, null)} is in an UNKNOWN state! Teleporting back home");
                if (CitizenProxy.GetHomeBuilding(ref citizen) != 0)
                {
                    CitizenProxy.SetLocation(ref citizen, Citizen.Location.Home);
                }

                break;
            }
        }