def draw(self, screen, focus, area):
        self.advanceFrame()

        pic = self.app.theme.sprites.bigZoneLetter(self.zone.defn.label)
        r = pic.get_rect()
        r.center = mapPosToScreen(self.zone.defn.pos, focus, area)
        screen.blit(pic, r)

        if (self.worldGUI.universe.uiOptions.showNets and self.zone.defn
                in self.worldGUI.map.layout.getTrosballTargetZones()):
            pic = self.app.theme.sprites.netOrb()
            frame = None
            r = pic.get_rect()
        else:
            if self.zone.owner:
                colour = self.zone.owner.colour
            else:
                colour = (128, 128, 128)
            pic = self.app.theme.sprites.orbs.get(colour)
            frame = self.getSpriteSheetRect()
            r = pygame.Rect(frame)
        r.center = mapPosToScreen(self.zone.defn.pos, focus, area)
        screen.blit(pic, r, frame)

        self.drawIndicator(screen, focus, area, 'F', -1, -1)
        self.drawIndicator(screen, focus, area, 'H', 0, -1)
        self.drawIndicator(screen, focus, area, 'B', 1, -1)
        self.drawIndicator(screen, focus, area, 'B', -1, 1)
        self.drawIndicator(screen, focus, area, 'H', 0, 1)
        self.drawIndicator(screen, focus, area, 'F', 1, 1)
Пример #2
0
    def draw(self, screen, area, focus):
        if not self.app.displaySettings.showObstacles:
            return

        from trosnoth.model.obstacles import Obstacle, Corner

        player = self.universe.universe.getPlayer(globaldebug.localPlayerId)
        attachedObstacle = player.attachedObstacle if player else None

        worldRect = viewRectToMap(focus, area)
        for block in getBlocksInRect(self.universe, worldRect):
            for obs in block.defn.obstacles:
                if isinstance(obs, Obstacle):
                    pt1 = mapPosToScreen(obs.pt1, focus, area)
                    pt2 = mapPosToScreen(obs.pt2, focus, area)
                    c = (0, 255, 0) if obs is attachedObstacle else (255, 0, 0)
                    pygame.draw.line(screen, c, pt1, pt2, 2)
                elif isinstance(obs, Corner):
                    pt1 = mapPosToScreen(
                        [obs.pt[i] - obs.offset[i] * 10 for i in (0, 1)],
                        focus, area)
                    pt2 = mapPosToScreen([
                        obs.pt[i] - (obs.offset[i] + obs.delta[i]) * 10
                        for i in (0, 1)
                    ], focus, area)
                    c = (0 if obs is attachedObstacle else 255, 255, 0)
                    pygame.draw.line(screen, c, pt1, pt2, 2)
                    pt2 = (int(pt2[0]), int(pt2[1]))
                    pygame.draw.circle(screen, c, pt2, 3, 0)
Пример #3
0
    def draw(self, screen, area, focus):
        worldRect = viewRectToMap(focus, area)

        for zone in getZonesInRect(self.universe, worldRect):
            pic = self.app.theme.sprites.bigZoneLetter(zone.defn.label)
            r = pic.get_rect()
            r.center = mapPosToScreen(zone.defn.pos, focus, area)
            screen.blit(pic, r)

            if (self.universe.universe.uiOptions.showNets and zone.defn
                    in self.universe.map.layout.getTrosballTargetZones()):
                pic = self.app.theme.sprites.netOrb()
            else:
                pic = self.app.theme.sprites.orb(zone.owner)
            r = pic.get_rect()
            r.center = mapPosToScreen(zone.defn.pos, focus, area)
            screen.blit(pic, r)
 def drawSprite(sprite, pos=None):
     # Calculate the position of the sprite.
     if pos is None:
         pos = sprite.pos
     sprite.rect.center = mapPosToScreen(pos, focus, area)
     if sprite.rect.colliderect(area):
         sprite.update()
         screen.blit(sprite.image, sprite.rect)
 def drawIndicator(self, screen, focus, area, kind, xDir, yDir):
     nextZone = self.zone.getNextZone(xDir, yDir)
     if nextZone is None:
         return
     img = self.app.theme.sprites.orbIndicator(kind, nextZone.owner)
     r = img.get_rect()
     x, y = self.zone.defn.pos
     xOffset, yOffset = self.INDICATOR_OFFSETS[xDir, yDir]
     r.center = mapPosToScreen((x + xOffset, y + yOffset), focus, area)
     screen.blit(img, r)
Пример #6
0
    def draw(self, surface):
        trajectory = self.getTrajectory()
        if trajectory is None:
            return

        focus = self.viewManager._focus
        area = self.viewManager.sRect

        points = list(trajectory.predictedTrajectoryPoints())
        numPoints = len(points)
        if numPoints == 0:
            return
        greenToYellow = [(i, 255, 0) for i in range(
            0, 255, 255 // (numPoints // 2 + numPoints % 2))]
        yellowToRed = [(255, i, 0) for i in range(
            255, 0, -255 // (numPoints // 2))]

        colours = [(0, 255, 0)] + greenToYellow + yellowToRed

        lastPoint = None
        for item in zip(points, colours):
            point = item[0]
            colour = item[1]
            # Set first point
            if lastPoint is None:
                lastPoint = point
                adjustedPoint = mapPosToScreen(point, focus, area)
                pygame.draw.circle(surface, colour, adjustedPoint, 2)
                continue


            adjustedPoint = mapPosToScreen(point, focus, area)
            adjustedLastPoint = mapPosToScreen(lastPoint, focus, area)

            pygame.draw.line(surface, colour, adjustedLastPoint, adjustedPoint, 5)

            lastPoint = point

        pygame.draw.circle(surface, colour, adjustedPoint, 2)

        radius = int(trajectory.explosionRadius() * MAP_TO_SCREEN_SCALE)
        if radius > 0:
            pygame.draw.circle(surface, (0,0,0), adjustedPoint, radius, 2)
    def draw(self, screen, area, focus):
        worldRect = viewRectToMap(focus, area)

        regions = []
        for block in getBlocksInRect(self.universe, worldRect):
            bd = block.defn
            pos = mapPosToScreen(bd.pos, focus, area)
            if bd.kind in ('top', 'btm'):
                if bd.zone is None:
                    regions.append(pygame.Rect(pos, BODY_BLOCK_SCREEN_SIZE))
                    continue
            elif bd.zone1 is None or bd.zone2 is None:
                regions.append(pygame.Rect(pos, INTERFACE_BLOCK_SCREEN_SIZE))
                continue

        x0, y0 = mapPosToScreen((0, 0), focus, area)
        if area.top < y0:
            r = pygame.Rect(area)
            r.bottom = y0
            regions.append(r)
        if area.left < x0:
            r = pygame.Rect(area)
            r.right = x0
            regions.append(r)

        x1, y1 = mapPosToScreen(self.universe.map.layout.worldSize, focus,
                                area)
        if area.bottom > y1:
            r = pygame.Rect(area)
            r.top = y1
            regions.append(r)
        if area.right > x1:
            r = pygame.Rect(area)
            r.left = x1
            regions.append(r)

        clip = screen.get_clip()
        for region in regions:
            region = region.clip(clip)
            screen.set_clip(region)
            self.drawRegion(screen, region, worldRect.topleft)
        screen.set_clip(clip)
Пример #8
0
    def showPathFinding(self, viewManager, screen, sprite):
        '''
        For debugging, displays the player's predicted path.
        '''
        import pygame.draw
        from trosnoth.trosnothgui.ingame.utils import mapPosToScreen

        if self.player.dead:
            return

        focus = viewManager._focus
        area = viewManager.sRect

        lastPos = mapPosToScreen(sprite.pos, focus, area)
        colour = (64, 255, 255)
        for record in self.future.actionRecords:
            for pos in record.simulator.positions:
                screenPos = mapPosToScreen(pos, focus, area)
                pygame.draw.circle(screen, colour, screenPos, 3)
                pygame.draw.line(screen, colour, lastPos, screenPos)
                lastPos = screenPos
Пример #9
0
    def getAngle(self, playerPos=None):
        if playerPos is None:
            livePlayer = self.player.clone()
            livePlayer.respawn()
            playerPos = livePlayer.pos

        focus = self.viewManager._focus
        area = self.viewManager.sRect
        playerScreenPos = mapPosToScreen(playerPos, focus, area)
        targetPos = pygame.mouse.get_pos()
        return atan2(targetPos[0] - playerScreenPos[0],
                     -(targetPos[1] - playerScreenPos[1]))
Пример #10
0
    def _drawPointsUntil(self, ticksNow, screen, focus, area):
        if not self.drawPoints:
            return

        ticks0, pos = self.drawPoints[0]
        screenPos0 = mapPosToScreen(pos, focus, area)
        points = [screenPos0]
        for ticks1, pos in self.drawPoints[1:]:
            screenPos1 = mapPosToScreen(pos, focus, area)
            if ticks1 > ticksNow:
                fraction = (ticksNow - ticks0) / (ticks1 - ticks0)
                points.append((
                    fadeValues(screenPos0[0], screenPos1[0], fraction),
                    fadeValues(screenPos0[1], screenPos1[1], fraction),
                ))
                break

            points.append(screenPos1)
            screenPos0 = screenPos1
            ticks0 = ticks1

        if len(points) > 1:
            self.drawLines(screen, area, self.colour, points, thickness=6)
Пример #11
0
    def draw(self, screen, area, focus):
        if not __debug__:
            return
        if not (globaldebug.enabled and globaldebug.showObstacles):
            return

        worldRect = viewRectToMap(focus, area)
        for leafNode in self.universe.universe.layout.getCandidatePolygons(
                worldRect.left, worldRect.top, worldRect.right,
                worldRect.bottom):
            points = [
                mapPosToScreen(pt, focus, area) for pt in leafNode.getPoints()
            ]
            if leafNode.isLedge():
                c = (255, 255, 0)
                closed = False
            else:
                c = (255, 0, 0)
                closed = True
                pygame.draw.polygon(screen, (128, 64, 128), points)
            pygame.draw.lines(screen, c, closed, points)
Пример #12
0
    def drawOverlay(self, screen):
        area = self.sRect

        target = self.getTargetPlayer()
        if target is not None and self.app.displaySettings.showRange:
            physics = target.world.physics
            gunRange = physics.shotLifetime * physics.shotSpeed
            gunRange += max(target.X_SHOULDERS_TO_GUN,
                            target.Y_SHOULDERS_TO_GUN)
            radius = int(gunRange * MAP_TO_SCREEN_SCALE + 0.5)
            pygame.draw.circle(screen, (192, 64, 64), area.center, radius, 1)

        if target and target.ninja:
            radius = int(200 * MAP_TO_SCREEN_SCALE + 0.5)
            for zone in getZonesInRect(target.world, self.getMapRect()):
                if target.isFriendsWithTeam(zone.owner):
                    continue
                pos = mapPosToScreen(zone.defn.pos, self._focus, area)
                pygame.draw.circle(screen, (128, 64, 128), pos, radius, 1)

        if self.universe.universe.uiOptions.showPauseMessage:
            self._drawPauseMessage(screen)
Пример #13
0
    def drawShiftingBackground(self, screen, area, focus, trosballLocation):
        worldRect = viewRectToMap(focus, area)

        for block in getBlocksInRect(self.universe, worldRect):
            blueBlock = self.bkgCache.getForTeam(0, block)
            redBlock = self.bkgCache.getForTeam(1, block)
            if blueBlock is None or redBlock is None:
                continue

            blockHorizontalPosition = block.defn.pos[0]
            relativeLocation = trosballLocation - blockHorizontalPosition
            blockWidth = block.defn.rect.width
            relativeLocation = max(0, min(blockWidth, relativeLocation))

            x = int(relativeLocation * MAP_TO_SCREEN_SCALE + 0.5)
            topleft = mapPosToScreen(block.defn.pos, focus, area)

            r = blueBlock.get_rect()
            r.width = x
            screen.blit(blueBlock, topleft, r)

            r = redBlock.get_rect()
            r.left = x
            screen.blit(redBlock, (topleft[0] + x, topleft[1]), r)
Пример #14
0
    def _drawSprites(self, screen):
        focus = self._focus
        area = self.sRect

        # Go through and update the positions of the players on the screen.
        ntGroup = set()
        visPlayers = set()

        for player in self.universe.iterPlayers():
            self.addSpritesForPlayer(player, visPlayers, ntGroup)
            hook = player.items.get(GrapplingHook)
            if hook and hook.hookState != HOOK_NOT_ACTIVE:
                pygame.draw.line(
                    screen, (255, 0, 0),
                    mapPosToScreen(player.pos, focus, area),
                    mapPosToScreen(hook.hookPosition, focus, area), 5)

        # Draw the on-screen players and nametags.
        for s in visPlayers:
            s.update()
            screen.blit(s.image, s.rect)
        for s in ntGroup:
            screen.blit(s.image, s.rect)

        def drawSprite(sprite, pos=None):
            # Calculate the position of the sprite.
            if pos is None:
                pos = sprite.pos
            sprite.rect.center = mapPosToScreen(pos, focus, area)
            if sprite.rect.colliderect(area):
                sprite.update()
                screen.blit(sprite.image, sprite.rect)

        # Draw the shots.
        for shot in self.universe.iterShots():
            drawSprite(shot)

        for coin in self.universe.iterCollectableCoins():
            drawSprite(coin)

        try:
            # Draw the grenades.
            for grenade in self.universe.iterGrenades():
                drawSprite(grenade)
        except Exception as e:
            log.exception(str(e))

        for sprite in self.universe.iterExtras():
            drawSprite(sprite)

        if __debug__ and globaldebug.enabled:
            if globaldebug.showSpriteCircles:
                for pos, radius in globaldebug.getSpriteCircles():
                    screenPos = mapPosToScreen(pos, focus, area)
                    pygame.draw.circle(screen, (255, 255, 0), screenPos,
                                       radius, 2)

            for sprite in visPlayers:
                sprite.player.onOverlayDebugHook(self, screen, sprite)

            for region in self.universe.universe.regions:
                region.debug_draw(self, screen)
Пример #15
0
 def drawStandardBackground(self, screen, area, focus):
     worldRect = viewRectToMap(focus, area)
     for block in getBlocksInRect(self.universe, worldRect):
         pic = self.bkgCache.get(block)
         if pic is not None:
             screen.blit(pic, mapPosToScreen(block.defn.pos, focus, area))
Пример #16
0
    def _drawSprites(self, screen):
        focus = self._focus
        area = self.sRect

        # Go through and update the positions of the players on the screen.
        ntGroup = set()
        visPlayers = set()

        ropeColour = self.app.theme.colours.ropeColour
        thickness = 2

        targetPlayer = self.getTargetPlayer()
        for player in self.universe.iterPlayers():
            self.addSpritesForPlayer(player, visPlayers, ntGroup)
            if player.dead:
                continue
            hook = player.getGrapplingHook()
            if hook.hookState != HOOK_NOT_ACTIVE:
                showRope = (not player.invisible or targetPlayer is None
                            or player.isFriendsWith(targetPlayer.player))
                if not showRope:
                    continue
                # TODO: rope bending around corners
                x0, y0 = mapPosToScreen(player.pos, focus, area)
                x1, y1 = mapPosToScreen(player.hookPos, focus, area)
                if (x0, y0) != (x1, y1):
                    angle = math.atan2(y1 - y0, x1 - x0)
                else:
                    angle = 0
                sinTheta = math.sin(angle)
                cosTheta = math.cos(angle)

                points = (
                    (x0 - thickness * sinTheta, y0 + thickness * cosTheta),
                    (x0 - thickness * cosTheta, y0 - thickness * sinTheta),
                    (x0 + thickness * sinTheta, y0 - thickness * cosTheta),
                    (x1 + thickness * sinTheta, y1 - thickness * cosTheta),
                    (x1 + thickness * cosTheta, y1 + thickness * sinTheta),
                    (x1 - thickness * sinTheta, y1 + thickness * cosTheta),
                )
                pygame.gfxdraw.filled_polygon(screen, points, ropeColour)
                pygame.gfxdraw.aapolygon(screen, points, ropeColour)

        # Draw the on-screen players and nametags.
        for s in visPlayers:
            s.update()
            screen.blit(s.image, s.rect)
        for s in ntGroup:
            screen.blit(s.image, s.rect)

        def drawSprite(sprite, pos=None):
            # Calculate the position of the sprite.
            if pos is None:
                pos = sprite.pos
            sprite.rect.center = mapPosToScreen(pos, focus, area)
            if sprite.rect.colliderect(area):
                sprite.update()
                screen.blit(sprite.image, sprite.rect)

        for coin in self.universe.iterCollectableCoins():
            drawSprite(coin)

        try:
            # Draw the grenades.
            for grenade in self.universe.iterGrenades():
                drawSprite(grenade)
        except Exception as e:
            log.exception(str(e))

        # Draw the shots.
        for shot in self.universe.iterShots():
            shot.draw(screen, focus, area)

        for sprite in self.universe.iterExtras():
            drawSprite(sprite)

        if __debug__ and globaldebug.enabled:
            if globaldebug.showSpriteCircles:
                for pos, radius in globaldebug.getSpriteCircles():
                    screenPos = mapPosToScreen(pos, focus, area)
                    pygame.draw.circle(screen, (255, 255, 0), screenPos,
                                       radius, 2)

            for sprite in visPlayers:
                sprite.player.onOverlayDebugHook(self, screen, sprite)

            if self.universe.universe.isServer:
                for region in self.universe.universe.regions:
                    region.debug_draw(self, screen)
Пример #17
0
    def addSpritesForPlayer(self, player, visPlayers, ntGroup):
        focus = self._focus
        area = self.sRect

        targetPlayer = self.getTargetPlayer()
        showPlayer = (not player.invisible or targetPlayer is None
                      or player.isFriendsWith(targetPlayer.player))

        if showPlayer:
            # Calculate the position of the player.
            if player is targetPlayer:
                player.rect.center = area.center
            else:
                player.rect.center = mapPosToScreen(player.pos, focus, area)

            # Check if this player needs its nametag shown.
            if player.rect.colliderect(area):
                visPlayers.add(player)

                if ntGroup is None:
                    return

                if player.unit.items.has(Bomber):
                    player.countdown.update()
                    player.countdown.rect.midbottom = player.rect.midtop
                    ntGroup.add(player.countdown)

                lastPoint = player.rect.midbottom

                shield = player.unit.items.get(Shield)
                if shield:
                    shieldBar = player.shieldBar
                    shieldBar.setHealth(shield.protections,
                                        shield.maxProtections)
                    if shieldBar.visible:
                        ntGroup.add(shieldBar)
                        shieldBar.rect.midtop = lastPoint
                        lastPoint = shieldBar.rect.midbottom

                healthBar = player.healthBar
                healthBar.setHealth(
                    player.unit.health,
                    player.unit.world.physics.playerRespawnHealth)
                if healthBar.visible:
                    ntGroup.add(healthBar)
                    healthBar.rect.midtop = lastPoint
                    lastPoint = healthBar.rect.midbottom

                player.nametag.rect.midtop = lastPoint

                # Check that entire nametag's on screen.
                if player.nametag.rect.left < area.left:
                    player.nametag.rect.left = area.left
                elif player.nametag.rect.right > area.right:
                    player.nametag.rect.right = area.right
                if player.nametag.rect.top < area.top:
                    player.nametag.rect.top = area.top
                elif player.nametag.rect.bottom > area.bottom:
                    player.nametag.rect.bottom = area.bottom
                ntGroup.add(player.nametag)

                if not player.dead:
                    # Place the coin rectangle below the nametag.
                    mx, my = player.nametag.rect.midbottom
                    player.coinTally.setCoins(player.getCoinDisplayCount())
                    player.coinTally.rect.midtop = (mx, my - 5)
                    ntGroup.add(player.coinTally)