def initiateActionEvent(self,event):
        pos = event.pos

        if self.minimap.rect.collidepoint(pos):
            mapClickPoint = self.minimap.clickToGridPos(pos)
            if mapClickPoint is not None:
                return 
            else:            
                cartPos = specialMath.isoToCart(pos)
                destCart = self.cartScrollLoc[0] + cartPos[0], \
                            self.cartScrollLoc[1] + cartPos[1]
        else:
            cartPos = specialMath.isoToCart(pos)
            destCart = self.cartScrollLoc[0] + cartPos[0], \
                        self.cartScrollLoc[1] + cartPos[1]
        
        clicked = specialMath.closestEntity(self.viewportEntities,pos)
        
        if clicked:
            drawRect = clicked.rect.move(clicked.drawOffset)
            drawRect.center = specialMath.cartToIso(drawRect.center)
        
            if not drawRect.collidepoint(pos):
                clicked = None
        
        if clicked is not None:
            self.currentMenu = self.contextualMenu.getMenu(self.selectedEntities,clicked)
        else:
            self.currentMenu = self.contextualMenu.getMenu(self.selectedEntities,WayPoint(*destCart))
            
        if self.currentMenu is not None:
            self.currentMenu.open(event.pos)
 def _gridPosToDrawPos(self,point):
     """
     Takes a cartesian position on the internal state grid and
     converts it to a drawing position on the minimap.
     """
     gridPos = float(point[0])/self.tileSize[1],float(point[1])/self.tileSize[1]
     rawPos = specialMath.cartToIso(gridPos)
     return self.offsetToDraw( \
             ( int(self.scale*rawPos[0]),int(self.scale*rawPos[1]) ) \
             )
 def completeActionEvent(self,event):
     attacking = False
     pos = event.pos
     
     # Performs action indicated by menu if menu is visible
     # and exists.  Otherwise, the menu reference is destroyed.
     if self.currentMenu is not None and self.currentMenu.visible:
         self.selectMenu(pos)
         return # Do not do anything else if the menu is selected
     else:
         self.currentMenu = None
     
     # Sets destination in cartesian coordinates
     # Handles minimap clicks
     if self.minimap.rect.collidepoint(pos):
         mapClickPoint = self.minimap.clickToGridPos(pos)
         if mapClickPoint is not None:
             destCart = mapClickPoint
         else:
             cartPos = specialMath.isoToCart(pos)
             destCart = (self.cartScrollLoc[0] + cartPos[0])%self.worldSize[0], \
                         (self.cartScrollLoc[1] + cartPos[1])%self.worldSize[1]
     else:
         cartPos = specialMath.isoToCart(pos)
         destCart = (self.cartScrollLoc[0] + cartPos[0])%self.worldSize[0], \
                     (self.cartScrollLoc[1] + cartPos[1])%self.worldSize[1]
     
     # Determines closest entity to a click
     clicked = specialMath.closestEntity(self.viewportEntities,pos)
     
     if clicked:
         drawRect = clicked.rect.move(clicked.drawOffset)
         drawRect.center = specialMath.cartToIso(drawRect.center)
     
         if not drawRect.collidepoint(pos):
             clicked = None
     
     # clicked is now either None or the closest Entity to the click
     if clicked:
         for selected in self.selectedEntities:
             attacking=True
             if isinstance(selected,Unit):
                 selected.initAction(clicked)
    
     if not attacking:
         eCenter = specialMath.centerOfEntityList(self.selectedEntities, self.worldSize)
         for entity in self.selectedEntities:
             if not entity.status==Locals.MOVING:
                 entity.dest=entity.realCenter
             if entity.movable: entity.status=Locals.MOVING
             dx = entity.rect.center[0] - eCenter[0]
             dy = entity.rect.center[1] - eCenter[1]
             newLoc = (dx+destCart[0],dy+destCart[1])
             entity.addToPath(newLoc)
    def clickEvent(self,event):
        """
        What works:
        single - clicking on units
        click on ground to deselect all (without a modifier)
        click a unit while holding a modifier to add to the selection
        click a selected unit while holding a modifier to remove from the selection
        """
        
        pos = event.pos
        
        if self.minimap.rect.collidepoint(pos):
            mapClickPoint = self.minimap.clickToGridPos(pos)
            if mapClickPoint is not None:
                self._setCartScrollLocation(mapClickPoint)
                return
        cartPos = specialMath.isoToCart(pos)
        destCart = (self.cartScrollLoc[0] + cartPos[0])/self.worldSize[0], \
                       (self.cartScrollLoc[1] + cartPos[1])/self.worldSize[1]
        
        # MAY BREAK THINGS - CHECK
        #clicked = specialMath.closestEntity(self.viewportEntities,pos)
        clicked = specialMath.closestEntity(self.myViewportEntities,pos)
        
        if clicked:
            drawRect = clicked.rect.move(clicked.drawOffset)
            drawRect.center = specialMath.cartToIso(drawRect.center)
            
            selectRect=clicked.getSelectionRect(drawRect)
            
            if not selectRect.collidepoint(pos):
                clicked = None
        
        if isinstance(event,Event.SelectionEvent):
            for e in self.selectedEntities:
                e.deselect()

            self.selectedEntities = []
            self._selectedEntitiesChanged = True

        if clicked and self.ownsEntity(clicked):
            # Determines if the closest entity is already selected.
            # If it is, it makes it no longer selected.
            if clicked.selected:
                clicked.deselect()
                self.selectedEntities.remove(clicked)
            else:
                clicked.select()
                self.selectedEntities.append(clicked)
                #print clicked.healthStr()
                #if isinstance(clicked, Unit): print '\n' + str(clicked.inventory)
            self._selectedEntitiesChanged = True
 def setFocusedEntities(self):
     rawMouseLoc = pygame.mouse.get_pos()
     viewportMouseLoc = rawMouseLoc[0]-self.loc[0],rawMouseLoc[1]-self.loc[1]
     
     for e in self.viewportEntities:
         
         drawRect = e.rect.move(e.drawOffset)
         drawRect.center = specialMath.cartToIso(drawRect.center)
         
         selectRect = e.getSelectionRect(drawRect)
         
         if selectRect.collidepoint(viewportMouseLoc):
             e.focus()
 def scrollBasedOnElapsedTime(self,elapsedTime):
     
     if not self.world == None and self.currentMenu == None:# FIXME and self.dragRect == None:
         newScrollLoc = list(self.scrollLoc)
         scrollAddX = self.scrollSpeed[0]*elapsedTime
         scrollAddY = self.scrollSpeed[1]*elapsedTime
         if not self.dragRect == None:
             self.dragRect.scroll((scrollAddX,scrollAddY)) 
         newScrollLoc[0] = (newScrollLoc[0]+scrollAddX)
         newScrollLoc[1] = (newScrollLoc[1]+scrollAddY)
         
         # used to calculate corner of scroll location in cartesian grid
         self.cartScrollLoc = self.isoToWrappedCart(newScrollLoc)
         
         newScrollLoc = specialMath.cartToIso(self.cartScrollLoc)
         self.scrollLoc = tuple(newScrollLoc)
    def _updateBaseSurface(self):
        """
        Initializes the self.baseSurface attribute.  This stores
        the image of the map.
        """

        #fill base surface with alphaColor -> transparent
        pygame.draw.rect(self.baseSurface,self.alphaColor,self.rect,0)

        for y in xrange(self.gridSize[1]):
            for x in xrange(self.gridSize[0]):
                
                # Grab average color value of the grid at loc x,y
                curColor = (self.gridDict[(x,y)]).getMiniMapColor()
                
                # Calculate corners of polygons
                topleft = specialMath.cartToIso((x*self.scale,y*self.scale))
                topright = specialMath.cartToIso(((x+1)*self.scale,y*self.scale))
                bottomright = specialMath.cartToIso(((x+1)*self.scale,(y+1)*self.scale))
                bottomleft = specialMath.cartToIso((x*self.scale,(y+1)*self.scale))
                
                # Apply offsets
                topleft = self.offsetToDraw(topleft)
                topright = self.offsetToDraw(topright)
                bottomright = self.offsetToDraw(bottomright)
                bottomleft = self.offsetToDraw(bottomleft)
                
                # Draws minimap to baseSurface
                pygame.draw.polygon(self.baseSurface, curColor, \
                    [topleft,topright,bottomright,bottomleft])
        
        tl = specialMath.cartToIso((0,0))
        tr = specialMath.cartToIso((self.gridSize[0]*self.scale,0))
        br = specialMath.cartToIso((self.gridSize[0]*self.scale,self.gridSize[1]*self.scale))
        bl = specialMath.cartToIso((0,self.gridSize[1]*self.scale))
        
        tl = (tl[0]+self.xOffset-self.borderWidth,tl[1]+self.yOffset)
        tr = (tr[0]+self.xOffset,tr[1]+self.yOffset)#-self.borderWidth)
        br = (br[0]+self.xOffset+self.borderWidth,br[1]+self.yOffset)
        bl = (bl[0]+self.xOffset,bl[1]+self.yOffset)#+self.borderWidth)
        
        if self.borderWidth:
            pygame.draw.polygon(self.baseSurface,self.borderColor, \
                [tl,tr,br,bl],self.borderWidth)
    def getScreenEntities(self,viewRects):
        """
        Receives a list of lists of coordinate tuples which define the
        coordinates of one view rectangle (the screen) in cartesian
        coordinates.
        
        Returns a list of references to entities which are visible
        in the given rectangles (called by the viewport).
        """

        # List of tuples - y position of rectangle (bottom) and entity
        entitySortList = []

        for entity in self.allEntities.values():
            
            # check all view rectangles
            for view in viewRects:
                
                # does the entity rectangle (cartesian) collide with
                # the rectangle of the screen transformed from isometric
                # to cartesian?
                if self.collideRectDiamond(entity.rect,view):
                    
                    # if it does, append it to the list
                    entitySortList.append((specialMath.cartToIso(entity.rect.center),entity))
                    
                    # set the drawOffset attribute of the entity for
                    # ease of drawing in the correct spot by the viewport
                    # once the list of references is returned
                    entity.drawOffset=-view[0][0],-view[0][1]
                    
                    break # if it collides, go to next loop

        # sort the list by y-position, such that the returned list
        # is in the correct order for drawing
        entitySortList.sort()
        
        # return only the list of entity references
        if len(entitySortList) > 0:
            ypos, screenEntities = zip(*entitySortList)
        else:
            screenEntities = []
            
        return screenEntities
    def dragSelect(self,event):
        """
        Fill this in.
        """
        if self.dragRect is not None:
            start = event.start
            end = event.curr
            
            if isinstance(event,Event.DragCompletedEvent):
                for e in self.selectedEntities:
                    e.deselect()
                    self._selectedEntitiesChanged = True
                self.selectedEntities = []
            #else: pass # if it is an Event.AddDragCompletedEvent, do
            # # not deselect
            
            #if self.dragRect.isOffScreen(self.size):
            #    searchList = self.world.allEntities.values()
            #else:
            #    searchList = self.viewportEntities
            searchList = self.myViewportEntities
            
            for entity in searchList:
            
                drawRect = entity.rect.move(entity.drawOffset)
                drawRect.center = specialMath.cartToIso(drawRect.center)
                
                selectRect=entity.getSelectionRect(drawRect)
            
                if selectRect.colliderect(MakeBoundingBox(start,end)):

                    if isinstance(event,Event.DragCompletedEvent):
                        entity.select()
                        self.selectedEntities.append(entity)
                        self._selectedEntitiesChanged = True
                    else: # Add drag completed event
                        if entity not in self.selectedEntities:
                            entity.select()
                            self.selectedEntities.append(entity)
                            self._selectedEntitiesChanged = True
 def _setCartScrollLocation(self,newCartLoc):
     self.cartScrollLoc = tuple(newCartLoc)
     self.scrollLoc = specialMath.cartToIso(self.cartScrollLoc)