/// <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) || CitizenProxy.IsSick(ref citizen)) { CitizenMgr.ReleaseCitizen(citizenId); return; } switch (CitizenProxy.GetLocation(ref citizen)) { case Citizen.Location.Home: case Citizen.Location.Work: CitizenMgr.ReleaseCitizen(citizenId); break; case Citizen.Location.Visit: ProcessVisit(instance, citizenId, ref citizen); break; case Citizen.Location.Moving: ProcessMoving(instance, citizenId, ref citizen); break; } }
/// <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; } }
/// <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; } }