示例#1
0
    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
示例#2
0
    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')
示例#3
0
    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'
            )
示例#4
0
    def _setupEventMap(self):

        eventMap: EventMap = EventMap({})

        for fsEventType in FutureEventType:
            if fsEventType != FutureEventType.SPY:
                eventMap[fsEventType] = FutureEvent(fsEventType)

        self._eventMap = eventMap
示例#5
0
    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
示例#6
0
    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
示例#7
0
    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
示例#8
0
    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
示例#9
0
    def _fireEvent(self, eventToFire: FutureEvent):

        self.logger.info(f'{eventToFire=}')
        if eventToFire.callback is not None:
            eventToFire.callback(eventToFire)