public override bool InRabbitHole() { try { LotManager.SetAutoGameSpeed(); bool succeeded = false; BeginCommodityUpdates(); // Custom if (IsAllowedToWork(mCareer) || mCareer.ShouldBeAtWork()) { DateAndTime previousDateAndTime = SimClock.CurrentTime(); float num2 = SimClock.HoursUntil(mCareer.CurLevel.FinishTime()) + mCareer.OvertimeHours; while (!Actor.WaitForExitReason(1f, ~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached)) && !mCareer.IsSpecialWorkTime) { if (mCareer.IsRegularWorkTime()) { break; } } if (Actor.HasExitReason(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached))) { EndCommodityUpdates(false); return(false); } mCareer.StartWorking(); succeeded = DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached), new InteractionInstance.InsideLoopFunction(LoopDelegate), null); mCareer.FinishWorking(); if (!succeeded) { EventTracker.SendEvent(EventTypeId.kWorkCanceled, Actor); } float num3 = SimClock.ElapsedTime(TimeUnit.Hours, previousDateAndTime); if ((num3 > num2) || (Math.Abs((float)(num3 - num2)) <= kStayLateThreshold)) { EventTracker.SendEvent(EventTypeId.kCareerOpportunity_StayedLate, Actor); } } EndCommodityUpdates(succeeded); ActiveTopic.AddToSim(Actor, "After Work"); return(succeeded); } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(Actor, Target, e); return(false); } }
public bool IncrementOneDay(SimDescription sim, ref Household.ReportCardHelper reportCardHelper) { try { mCurrentDay++; // Set for possible use in sub-routines AcademicCareer.GlobalTermLength = mLength; int length = (int)mLength * NRaas.Careers.Settings.mHomeworldUniversityTermLength; Common.DebugNotify("Increment One Day\n" + mCurrentDay + "\n" + length, sim); AcademicCareer academicCareer = sim.OccupationAsAcademicCareer; if (academicCareer == null) { return(false); } if (mCurrentDay >= length) { if (SimTypes.IsSelectable(sim)) { if (reportCardHelper == null) { reportCardHelper = new Household.ReportCardHelper(); } reportCardHelper.AddGPA(sim.SimDescriptionId, academicCareer.GetGradeAsLetter()); } AcademicCareerEx.OnTermCompleted(academicCareer); return(false); } else if (mCurrentDay == (length - 0x1)) { if (SimTypes.IsSelectable(sim)) { float num2 = SimClock.HoursUntil(Household.kWhenOneDayLeftTNSAppears); AlarmManager.Global.RemoveAlarm(sim.Household.mLastDayAlarm); sim.Household.mLastDayAlarm = AlarmManager.Global.AddAlarm(num2, TimeUnit.Hours, sim.Household.OneDayLeft, "One Day left TNS", AlarmType.AlwaysPersisted, sim); } } } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(sim, e); } return(true); }
private static void OneDayPassedVacationUpdates(Household ths) { if (GameStates.CurrentDayOfTrip == GameStates.TripLength) { if (!GameStates.IsTravelling) { StyledNotification.Format format = new StyledNotification.Format(Common.LocalizeEAString("Gameplay/Vacation:OneDayLeft"), StyledNotification.NotificationStyle.kSystemMessage); StyledNotification.Show(format); } ths.mLastDayAlarm = AlarmManager.Global.AddAlarm(SimClock.HoursUntil(12f), TimeUnit.Hours, ths.HalfDayLeft, "Half Day left TNS", AlarmType.AlwaysPersisted, ths); } else if (GameStates.CurrentDayOfTrip > GameStates.TripLength) { bool denyTravel = false; if (!GameStates.IsTravelling) { foreach (Sim sim in Households.AllSims(ths)) { sim.VisaManager.UpdateDaysSpentInWorld(GameUtils.GetCurrentWorld(), GameStates.CurrentDayOfTrip - 0x1); if (sim.IsDying()) { denyTravel = true; } } } if (!denyTravel) { GameStates.StopSnappingPicturesIfNeccessary(); Sims3.Gameplay.UI.HudModel hudModel = Sims3.Gameplay.UI.Responder.Instance.HudModel as Sims3.Gameplay.UI.HudModel; if (hudModel != null) { WorldName currentWorld = GameUtils.GetCurrentWorld(); string str = hudModel.LocationName(currentWorld); SimpleMessageDialog.Show(TravelUtil.LocalizeString("TripOverCaption", new object[0x0]), TravelUtil.LocalizeString("TripOverText", new object[] { str }), ModalDialog.PauseMode.PauseSimulator); } } if (!denyTravel) { Traveler.SaveGame(); TravelUtil.PlayerMadeTravelRequest = true; // Calls custom function GameStatesEx.UpdateTelemetryAndTriggerTravelBackToHomeWorld(); } } }
protected override void OnPerform() { if (GameUtils.IsUniversityWorld()) { return; } Corrections.CleanupAcademics(null); Dictionary <ulong, SimDescription> sims = SimListing.GetResidents(false); List <ulong> remove = new List <ulong>(); Household.ReportCardHelper reportCardHelper = null; foreach (KeyValuePair <ulong, AcademicController> controller in sControllers) { bool success = false; SimDescription sim; if (sims.TryGetValue(controller.Key, out sim)) { if (controller.Value.IncrementOneDay(sim, ref reportCardHelper)) { success = true; } } if (!success) { remove.Add(controller.Key); } } if (reportCardHelper != null) { float time = SimClock.HoursUntil(Household.kWhenReportCardArrives); AlarmManager.Global.AddAlarm(time, TimeUnit.Hours, reportCardHelper.ReportCardArrives, "Report Card Arrives", AlarmType.AlwaysPersisted, Sim.ActiveActor); } foreach (ulong value in remove) { sControllers.Remove(value); } }
private void calculateNextShowTime() { if (mShowIndex < ShowTimes.Length) { float timeUntilShow = SimClock.HoursUntil(ShowTimes[mShowIndex]); long timeAsLong = SimClock.ConvertToTicks(timeUntilShow, TimeUnit.Hours); this.mNextShowTime = SimClock.CurrentTicks + timeAsLong; if (Message.Sender.IsDebugging()) { Message.Sender.Debug(this, "Show " + mShowIndex + " is in " + timeUntilShow.ToString() + " hours"); } mShowIndex++; } else { mNextShowTime = long.MaxValue; } }
private static bool IsAGraduationCeremonyInitializedAndIfNecessaryStartOne(Annex ths) { if (!ths.mGraduationCeremonyInitialized) { ths.CleanUpGraduationCeremony(); float time = SimClock.HoursUntil(Annex.kGraduationTuning.kHourToShowGraduationMessage); ths.mDidIGraduationMessageAlarm = ths.AddAlarm(time, TimeUnit.Hours, ths.ShowIGraduationMessagesCallback, "Annex: I Graduated Message Alarm", AlarmType.AlwaysPersisted); float num2 = SimClock.HoursUntil(Annex.kGraduationTuning.kHourToShowGraduationInvitationMessage); ths.mGraduationInvitationAlarm = ths.AddAlarm(num2, TimeUnit.Hours, ths.ShowGraduationInvitationMessagesCallback, "Annex: Graduation Invitation Message Alarm", AlarmType.AlwaysPersisted); //float num3 = SimClock.HoursUntil(Annex.kGraduationTuning.kGraduationCeremonyStartHour); //ths.mStartGraduationCeremonyAlarm = ths.AddAlarm(num3, TimeUnit.Hours, ths.StartGraduationCeremonyCallback, "Annex: Graduation Ceremony Start Alarm", AlarmType.AlwaysPersisted); new StartGraduationCeremonyTask(ths); ths.mGraduationCeremonyInitialized = true; } return(ths.mGraduationCeremonyInitialized); }
public StartGraduationCeremonyTask(Annex ths) : base(SimClock.HoursUntil(Annex.kGraduationTuning.kGraduationCeremonyStartHour), TimeUnit.Hours) { mThs = ths; }
private static void OneDayPassedUniversityUpdates(Household ths) { try { if (GameStates.CurrentDayOfTrip == GameStates.TripLength) { Household.ReportCardHelper helper = null; foreach (SimDescription description in Households.All(ths)) { if (description == null) { continue; } if (description.OccupationAsAcademicCareer == null) { continue; } if (helper == null) { helper = new Household.ReportCardHelper(); } helper.AddGPA(description.SimDescriptionId, description.OccupationAsAcademicCareer.GetGradeAsLetter()); } if (helper != null) { AlarmManager.Global.AddAlarm(SimClock.HoursUntil(Household.kWhenReportCardArrives), TimeUnit.Hours, helper.ReportCardArrives, "Report Card Arrives", AlarmType.AlwaysPersisted, ths); } // Correction for potential error in OnTermCompleted() Corrections.CleanupAcademics(null); foreach (Household household in Household.sHouseholdList) { if (household == null) { continue; } if (household.IsPreviousTravelerHousehold) { continue; } foreach (SimDescription sim in household.SimDescriptions) { if (sim == null) { continue; } try { AcademicCareer occupationAsAcademicCareer = sim.OccupationAsAcademicCareer; if (occupationAsAcademicCareer != null) { AcademicCareerEx.OnTermCompleted(occupationAsAcademicCareer); } } catch (Exception e) { Common.Exception(sim, e); } } } AlarmManager.Global.RemoveAlarm(ths.mLastDayAlarm); ths.mLastDayAlarm = AlarmManager.Global.AddAlarm(SimClock.HoursUntil(Household.kWhenOneHourLeftTNSAppears), TimeUnit.Hours, ths.OneHourLeft, "One Hour left TNS", AlarmType.AlwaysPersisted, ths); AlarmManager.Global.RemoveAlarm(ths.mTriggerUniversityReturnFlowAlarm); ths.mTriggerUniversityReturnFlowAlarm = AlarmManager.Global.AddAlarm(SimClock.HoursUntil(Household.kWhenSimsStartLeaving), TimeUnit.Hours, BeginReturnFromUniversityFlow, "Start University Return Home Flow Alarm", AlarmType.AlwaysPersisted, ths); } else if (GameStates.CurrentDayOfTrip > GameStates.TripLength) { bool denyTravel = false; if (!GameStates.IsTravelling) { foreach (Sim sim in ths.AllActors) { if ((sim != null) && sim.IsDying()) { denyTravel = true; } } } GameStates.StopSnappingPicturesIfNeccessary(); if (Sims3.Gameplay.UI.Responder.Instance.HudModel is HudModel) { Common.FunctionTask.Perform(ths.ShowTripOverDialog); } if (!denyTravel) { Traveler.SaveGame(); TravelUtil.PlayerMadeTravelRequest = true; // Custom GameStatesEx.UpdateTelemetryAndTriggerTravelBackToHomeWorld(); } } else if (GameStates.CurrentDayOfTrip <= 0x1) { AlarmManager.Global.RemoveAlarm(Household.mAtUnivTutorialAlarm); Household.mAtUnivTutorialAlarm = AlarmHandle.kInvalidHandle; AlarmManager.Global.RemoveAlarm(Household.mDormsTutorialAlarm); Household.mDormsTutorialAlarm = AlarmHandle.kInvalidHandle; Household.mAtUnivTutorialAlarm = AlarmManager.Global.AddAlarmDay(Household.kTimeAtUnivTutorial, ~DaysOfTheWeek.None, Household.TriggerAtUniversityTutorial, "At University Lesson", AlarmType.AlwaysPersisted, null); Household.mDormsTutorialAlarm = AlarmManager.Global.AddAlarmDay(Household.kTimeDormsTutorial, ~DaysOfTheWeek.None, Household.TriggerDormsTutorial, "Dorms Lesson", AlarmType.AlwaysPersisted, null); } else if (GameStates.CurrentDayOfTrip == (GameStates.TripLength - 0x1)) { float num2 = SimClock.HoursUntil(Household.kWhenOneDayLeftTNSAppears); ths.mLastDayAlarm = AlarmManager.Global.AddAlarm(num2, TimeUnit.Hours, ths.OneDayLeft, "One Day left TNS", AlarmType.AlwaysPersisted, ths); } } catch (ResetException) { throw; } catch (Exception e) { Common.Exception(ths, e); } }
public static void SimulateRole(Role ths, float minPassed) { if (!Register.Settings.mAllowTourists) { ths.EndRole(); return; } if (ths.IsActive) { List <Lot> baseCamps = new List <Lot>(); foreach (Lot lot in LotManager.AllLots) { if ((lot.IsBaseCampLotType) || (lot.CommercialLotSubType == CommercialLotSubType.kEP10_Resort)) { baseCamps.Add(lot); } } // Drop the EndRole alarm foreach (AlarmHandle handle in ths.mAlarmHandles) { AlarmManager.Global.RemoveAlarm(handle); } ths.mAlarmHandles.Clear(); if (baseCamps.Count > 0) { Sim createdSim = ths.mSim != null ? ths.mSim.CreatedSim : null; if (createdSim != null) { if (ths.mMinInLot >= RoleExplorer.kMinPassToAllowSwitchingLots) { if (SimClock.IsTimeBetweenTimes((float)SimClock.Hours24, RoleExplorer.kTimeToGoBackToBaseCamp, RoleExplorer.kTimeToReleaseFromBaseCamp) && (!createdSim.LotCurrent.IsBaseCampLotType)) { if (RandomUtil.RandomChance(Register.Settings.mTouristChanceOfLeaving)) { RestoreFutureTrait(ths.mSim); ths.EndRole(); return; } } if (RandomUtil.CoinFlip()) { if (!createdSim.InteractionQueue.Add(GoToLotThatSatisfiesMyRoleEx.Singleton.CreateInstance(createdSim, createdSim, new InteractionPriority(InteractionPriorityLevel.High), true, true))) { Lot baseCamp = RandomUtil.GetRandomObjectFromList(baseCamps); createdSim.InteractionQueue.CancelAllInteractions(); InteractionInstance instance = VisitCommunityLot.Singleton.CreateInstance(baseCamp, createdSim, new InteractionPriority(InteractionPriorityLevel.CriticalNPCBehavior), false, true); createdSim.InteractionQueue.AddAfterCheckingForDuplicates(instance); ths.UpdateFulfillingLot(baseCamp.LotId); return; } } } if (createdSim.LotCurrent != null) { if (ths.mFulfillingLotId == 0x0L) { ths.mFulfillingLotId = createdSim.LotCurrent.LotId; ths.mMinInLot += minPassed; } else if (ths.mFulfillingLotId == createdSim.LotCurrent.LotId) { ths.mMinInLot += minPassed; } else if (!createdSim.IsRouting) { ths.UpdateFulfillingLot(createdSim.LotCurrent.LotId); } } } } else { // needs tuning check if (SimClock.HoursUntil(16) <= 6) { if (ths.mSim != null && ths.mSim.CreatedSim != null && ths.mSim.CreatedSim.CurrentInteraction == null) { if (ths.mSim.HomeWorld == WorldName.FutureWorld && ths.mSim.CreatedSim.Posture != null && ths.mSim.CreatedSim.Posture.ReactionAllowed()) { // this is fun but naturally it breaks because EA // ths.mSim.CreatedSim.PlayReaction(ReactionTypes.StandingAwe, ReactionSpeed.NowOrLater); } } ths.SimulateRole(minPassed); } else { if (ths.mSim != null) { RestoreFutureTrait(ths.mSim); } ths.EndRole(); return; } } } }