def createTractorBeamEvent(self) -> FutureEvent: # noinspection SpellCheckingInspection """ ```java schedule(FTBEAM, tk.expran(1.5 * (game.intime / game.state.remcom))); ``` """ inTime: float = self._gameState.inTime remainingCommanders: int = self._gameState.remainingCommanders if remainingCommanders == 0: futureEvent: FutureEvent = FutureEvent( type=FutureEventType.TRACTOR_BEAM, starDate=0.0, quadrantCoordinates=Coordinates(x=-1, y=-1)) futureEvent.schedulable = False else: elapsedStarDates: float = self._intelligence.exponentialRandom( 2.5 * (inTime / remainingCommanders)) eventStarDate: float = self._gameState.starDate + elapsedStarDates coordinates: Coordinates = self._gameState.currentQuadrantCoordinates futureEvent = FutureEvent(type=FutureEventType.TRACTOR_BEAM, starDate=eventStarDate, quadrantCoordinates=coordinates) futureEvent.callback = EventCallback( self._futureEventHandlers.tractorBeamEventHandler) return futureEvent
def testTractorBeamEventHandler(self): """ """ self.logger.debug(f'{self._gameState=}') # Simulate game start up enterprise: Enterprise = self._gameState.enterprise self._quadrant: Quadrant = self._galaxy.currentQuadrant self._gameState.currentQuadrantCoordinates = self._galaxy.currentQuadrant.coordinates self._quadrantMediator.enterQuadrant(quadrant=self._quadrant, enterprise=enterprise) eventHandlers: FutureEventHandlers = FutureEventHandlers( LogMessageConsole()) coordinates: Coordinates = self._galaxy.currentQuadrant.coordinates fEvent: FutureEvent = FutureEvent() fEvent.type = FutureEventType.SUPER_NOVA fEvent.starDate = self._gameState.starDate fEvent.quadrantCoordinates = coordinates previousOpTime: float = self._gameState.opTime eventHandlers.tractorBeamEventHandler(futureEvent=fEvent) self.logger.debug(f'testTractorBeamEventHandler - {self._gameState=}') currentOptTime: float = self._gameState.opTime self.assertNotEqual(previousOpTime, currentOptTime, 'Operation time did not change')
def testSuperNovaEventStarBaseDestroyedNeverNegative(self): """ Destroy all the StarBases and then try one more time """ self._setupGame() self.logger.debug( f'Before starbase count: {self._gameState.starBaseCount}') quadrant: Quadrant = self._getATestEventQuadrant() coordinates: Coordinates = quadrant.coordinates self.logger.debug( f'After starbase count: {self._gameState.starBaseCount}') fEvent: FutureEvent = FutureEvent() fEvent.type = FutureEventType.SUPER_NOVA fEvent.starDate = self._gameState.starDate fEvent.quadrantCoordinates = coordinates gameState: GameState = self._gameState maxSearches: int = 0 while self._gameState.starBaseCount > 0: if maxSearches > TestFutureEventHandlers.MAX_LOOPS: break if coordinates is None: self.logger.warning(f'Random starbase search failed try again') coordinates = self._galaxy.getStarBaseCoordinates() maxSearches += 1 continue else: fEvent.quadrantCoordinates = coordinates self._eventHandlers.superNovaEventHandler(futureEvent=fEvent) counts: str = ( f'{coordinates=} ' f'remainingKlingons={gameState.remainingKlingons} ' f'remainingCommanders={gameState.remainingCommanders} ' f'remainingSuperCommanders={gameState.remainingSuperCommanders} ' f'starBaseCount={gameState.starBaseCount}') self.logger.info(counts) coordinates = self._galaxy.getStarBaseCoordinates() maxSearches += 1 if maxSearches < TestFutureEventHandlers.MAX_LOOPS: self.assertEqual(0, self._gameState.starBaseCount, 'Did not destroy all StarBases') coordinates: Coordinates = self._intelligence.generateQuadrantCoordinates( ) fEvent.type = FutureEventType.SUPER_NOVA fEvent.starDate = self._gameState.starDate fEvent.quadrantCoordinates = coordinates self._eventHandlers.superNovaEventHandler(futureEvent=fEvent) self.assertEqual(0, self._gameState.starBaseCount, 'Should be zero all StarBases destroyed') else: self.logger.warning( f'Too many starbase searches; testSuperNovaEventStarBaseDestroyedNeverNegative did not run' )
def _setupEventMap(self): eventMap: EventMap = EventMap({}) for fsEventType in FutureEventType: if fsEventType != FutureEventType.SPY: eventMap[fsEventType] = FutureEvent(fsEventType) self._eventMap = eventMap
def _generateArtificialEvent(self, eventType: FutureEventType) -> FutureEvent: fEvent: FutureEvent = FutureEvent() fEvent.type = eventType fEvent.starDate = self._gameState.starDate quadrant: Quadrant = self._getATestEventQuadrant() fEvent.quadrantCoordinates = quadrant.coordinates return fEvent
def _debugActions(self, futureEvent: FutureEvent) -> FutureEvent: if futureEvent.type == FutureEventType.SUPER_NOVA and self._gameSettings.scheduleSuperNova is False: futureEvent.starDate = 0.0 futureEvent.quadrantCoordinates = cast(Coordinates, None) futureEvent.schedulable = False if futureEvent.type == FutureEventType.COMMANDER_ATTACKS_BASE and self._gameSettings.scheduleCommanderAttacksBase is False: futureEvent.starDate = 0.0 futureEvent.quadrantCoordinates = cast(Coordinates, None) futureEvent.schedulable = False if futureEvent.type == FutureEventType.TRACTOR_BEAM and self._gameSettings.scheduleTractorBeam is False: futureEvent.starDate = 0.0 futureEvent.quadrantCoordinates = cast(Coordinates, None) futureEvent.schedulable = False return futureEvent
def createSuperNovaEvent(self) -> FutureEvent: # noinspection SpellCheckingInspection """ ```java schedule (FSNOVA, tk.expran(0.5 * game.intime)); ``` """ elapsedStarDates: float = self._intelligence.exponentialRandom( 0.5 * self._gameState.inTime) eventStarDate: float = self._gameState.starDate + elapsedStarDates quadrantCoordinates: Coordinates = self._intelligence.generateQuadrantCoordinates( ) futureEvent: FutureEvent = FutureEvent( type=FutureEventType.SUPER_NOVA, starDate=eventStarDate, quadrantCoordinates=quadrantCoordinates) futureEvent.callback = EventCallback( self._futureEventHandlers.superNovaEventHandler) return futureEvent
def createCommanderAttacksBaseEvent(self) -> FutureEvent: # noinspection SpellCheckingInspection """ ```java schedule(FBATTAK, tk.expran(0.3*game.intime)); ``` """ elapsedStarDates: float = self._intelligence.exponentialRandom( 0.3 * self._gameState.inTime) eventStarDate: float = self._gameState.starDate + elapsedStarDates coordinates: Coordinates = self._galaxy.getStarBaseCoordinates() futureEvent: FutureEvent = FutureEvent( type=FutureEventType.COMMANDER_ATTACKS_BASE, starDate=eventStarDate, quadrantCoordinates=coordinates) futureEvent.callback = EventCallback( self._futureEventHandlers.commanderAttacksBaseEventHandler) return futureEvent
def _fireEvent(self, eventToFire: FutureEvent): self.logger.info(f'{eventToFire=}') if eventToFire.callback is not None: eventToFire.callback(eventToFire)