def save_relative_start_values(self, objective_guid64, data_object): buff_uptime = TimeSpan(0) for buff_tuning in self.buffs_to_check: buff_uptime += data_object.get_total_buff_uptime(buff_tuning) data_object.set_starting_values(objective_guid64, [buff_uptime.in_ticks()])
def _start_voting_timer(self, voting_time_of_week, callback): (time, voting_time) = self._times_from_voting_time_of_week(services.time_service().sim_now, voting_time_of_week) if voting_time.in_ticks() <= 0: voting_time = TimeSpan(voting_time.in_ticks() + sim_ticks_per_week()) voting_alarm = alarms.add_alarm(self, voting_time, callback, cross_zone=True) return (time, voting_alarm)
class SituationGoalInteractionTime(SituationGoal): __qualname__ = 'SituationGoalInteractionTime' DURATION_RUN = 'duration_run' REMOVE_INSTANCE_TUNABLES = ('_post_tests', ) INSTANCE_TUNABLES = { '_goal_test': TunableInteractionOfInterest( description= '\n Interaction and duration that this situation goal will use.\n Example: Bartend for 10 sim minutes.\n ', tuning_group=GroupNames.TESTS) } def __init__(self, *args, reader=None, **kwargs): super().__init__(reader=reader, *args, **kwargs) self._total_time_ran = TimeSpan.ZERO self._last_started_time = None self._alarm_handle = None self._total_duration = interval_in_sim_hours(self._goal_test.duration) self._test_events = set() self._test_events.add( event_testing.test_events.TestEvent.InteractionStart) self._test_events.add( event_testing.test_events.TestEvent.InteractionComplete) services.get_event_manager().register(self, self._test_events) if reader is not None: duration_run = reader.read_uint64(self.DURATION_RUN, 0) self._total_time_ran = TimeSpan(duration_run) self._sims_running_interaction = set() if self._situation is None and self._sim_info is not None: self._sims_running_interaction.add(self._actor_ref().id) else: for sim in self._situation.all_sims_in_situation_gen(): while sim.si_state.is_running_affordance( self._goal_test.affordance): self._sims_running_interaction.add(sim.id) if self._sims_running_interaction: self._start_alarm() def create_seedling(self): if self._alarm_handle is not None: self._start_alarm() seedling = super().create_seedling() writer = seedling.writer writer.write_uint64(self.DURATION_RUN, self._total_time_ran.in_ticks()) return seedling def decommision(self): services.get_event_manager().unregister(self, self._test_events) self._stop_alarm() super().decommision() def _on_hour_reached(self, alarm_handle=None): self._stop_alarm() if self._total_time_ran >= self._total_duration: super()._on_goal_completed() else: self._on_iteration_completed() self._start_alarm() def _start_alarm(self): self._stop_alarm() if not self._sims_running_interaction: return next_hour = interval_in_sim_hours( int(self._total_time_ran.in_hours()) + 1) time_till_completion = (next_hour - self._total_time_ran) / len( self._sims_running_interaction) self._alarm_handle = alarms.add_alarm(self, time_till_completion, self._on_hour_reached) self._last_started_time = services.time_service().sim_now def _stop_alarm(self): if self._alarm_handle is not None: alarms.cancel_alarm(self._alarm_handle) self._alarm_handle = None self._last_started_time = None def _run_goal_completion_tests(self, sim_info, event, resolver): if not resolver(self._goal_test): return False self._stop_alarm() if event == event_testing.test_events.TestEvent.InteractionStart: self._sims_running_interaction.add(sim_info.id) else: self._sims_running_interaction.discard(sim_info.id) self._start_alarm() return False @property def completed_iterations(self): return int(self._total_time_ran.in_hours()) @property def max_iterations(self): return self._goal_test.duration
class SituationGoalInteractionTime(SituationGoal): __qualname__ = 'SituationGoalInteractionTime' DURATION_RUN = 'duration_run' REMOVE_INSTANCE_TUNABLES = ('_post_tests',) INSTANCE_TUNABLES = {'_goal_test': TunableInteractionOfInterest(description='\n Interaction and duration that this situation goal will use.\n Example: Bartend for 10 sim minutes.\n ', tuning_group=GroupNames.TESTS)} def __init__(self, *args, reader=None, **kwargs): super().__init__(reader=reader, *args, **kwargs) self._total_time_ran = TimeSpan.ZERO self._last_started_time = None self._alarm_handle = None self._total_duration = interval_in_sim_hours(self._goal_test.duration) self._test_events = set() self._test_events.add(event_testing.test_events.TestEvent.InteractionStart) self._test_events.add(event_testing.test_events.TestEvent.InteractionComplete) services.get_event_manager().register(self, self._test_events) if reader is not None: duration_run = reader.read_uint64(self.DURATION_RUN, 0) self._total_time_ran = TimeSpan(duration_run) self._sims_running_interaction = set() if self._situation is None and self._sim_info is not None: self._sims_running_interaction.add(self._actor_ref().id) else: for sim in self._situation.all_sims_in_situation_gen(): while sim.si_state.is_running_affordance(self._goal_test.affordance): self._sims_running_interaction.add(sim.id) if self._sims_running_interaction: self._start_alarm() def create_seedling(self): if self._alarm_handle is not None: self._start_alarm() seedling = super().create_seedling() writer = seedling.writer writer.write_uint64(self.DURATION_RUN, self._total_time_ran.in_ticks()) return seedling def decommision(self): services.get_event_manager().unregister(self, self._test_events) self._stop_alarm() super().decommision() def _on_hour_reached(self, alarm_handle=None): self._stop_alarm() if self._total_time_ran >= self._total_duration: super()._on_goal_completed() else: self._on_iteration_completed() self._start_alarm() def _start_alarm(self): self._stop_alarm() if not self._sims_running_interaction: return next_hour = interval_in_sim_hours(int(self._total_time_ran.in_hours()) + 1) time_till_completion = (next_hour - self._total_time_ran)/len(self._sims_running_interaction) self._alarm_handle = alarms.add_alarm(self, time_till_completion, self._on_hour_reached) self._last_started_time = services.time_service().sim_now def _stop_alarm(self): if self._alarm_handle is not None: alarms.cancel_alarm(self._alarm_handle) self._alarm_handle = None self._last_started_time = None def _run_goal_completion_tests(self, sim_info, event, resolver): if not resolver(self._goal_test): return False self._stop_alarm() if event == event_testing.test_events.TestEvent.InteractionStart: self._sims_running_interaction.add(sim_info.id) else: self._sims_running_interaction.discard(sim_info.id) self._start_alarm() return False @property def completed_iterations(self): return int(self._total_time_ran.in_hours()) @property def max_iterations(self): return self._goal_test.duration