def __init__(self, state_factory, world_map_service, pathfinding_service, motion_service, secret_code_decoding_service, treasure_handling_service, hardware_status_collector_service, local_world_map_service): self._state_factory = state_factory self._state_factory.inject_dependency(self) self._state_factory.inject_dependency(world_map_service) self._state_factory.inject_dependency(pathfinding_service) self._state_factory.inject_dependency(motion_service) self._state_factory.inject_dependency(secret_code_decoding_service) self._state_factory.inject_dependency(treasure_handling_service) self._state_factory.inject_dependency(hardware_status_collector_service) self._state_factory.inject_dependency(local_world_map_service) self._register_states() self._current_cycle = 0 self._timer = Timer() self._init_game_cycle_state()
class GameCycleControlService(object): GAME_DURATION_MINUTES = 10 @property def elapsed_time(self): return self._timer.elapsed_time @property def remaining_time(self): game_duration = timedelta(0, 0, 0, 0, self.GAME_DURATION_MINUTES) return game_duration - self.elapsed_time @property def state(self): return self._state @state.setter def state(self, value): self._state = value @property def current_state_display_string(self): if self._paused: return str(self._state) + " (Paused)" else: return str(self._state) @property def current_cycle(self): return self._current_cycle def __init__(self, state_factory, world_map_service, pathfinding_service, motion_service, secret_code_decoding_service, treasure_handling_service, hardware_status_collector_service, local_world_map_service): self._state_factory = state_factory self._state_factory.inject_dependency(self) self._state_factory.inject_dependency(world_map_service) self._state_factory.inject_dependency(pathfinding_service) self._state_factory.inject_dependency(motion_service) self._state_factory.inject_dependency(secret_code_decoding_service) self._state_factory.inject_dependency(treasure_handling_service) self._state_factory.inject_dependency(hardware_status_collector_service) self._state_factory.inject_dependency(local_world_map_service) self._register_states() self._current_cycle = 0 self._timer = Timer() self._init_game_cycle_state() def _register_states(self): self._state_factory.register_state(CapacitorChargingState) self._state_factory.register_state(GameCycleCompletedState) self._state_factory.register_state(MovingTowardChargingStationState) self._state_factory.register_state(MovingTowardIslandState) self._state_factory.register_state(MovingTowardTreasureState) self._state_factory.register_state(SecretCodeDecodingState) self._state_factory.register_state(TreasureDropState) self._state_factory.register_state(TreasurePickupState) self._state_factory.register_state(WorldDetectionState) def _init_game_cycle_state(self): self._state = self._state_factory.create(InitialState) self._thread = None self._cycle_started = False self._paused = False def start_cycle(self): if self._cycle_started: raise GameCycleError("A game cycle is currently in progress.") self._init_game_cycle_state() self._timer.start() self._cycle_started = True self._current_cycle += 1 self._thread = Thread(target = self._start_cycle_thread, daemon = True) self._thread.start() def _start_cycle_thread(self): self._state.execute() def pause_cycle(self): self._paused = True self._timer.pause() self._state.pause() def resume_cycle(self): self._timer.resume() self._state.resume() self._paused = False def stop_cycle(self): self._state.reset() self._cycle_started = False self._timer.pause() def reset(self): self._state.reset() self._timer.stop() self._timer.reset() self._init_game_cycle_state() self._current_cycle = 0