# Path finder demo
# http://www.willmcgugan.com

SCREEN_SIZE = (768, 576)

import pygame
from pygame.locals import *
from math import sqrt
from PathFinder import *
from time import sleep
from pygame.rect import Rect
from random import random

blocked = {}

def run():
    instructions_txt = "Draw map with left mouse button. "
    instructions_txt += "Press right mouse button (or Shift+LMB) to swim."
    title = "Path Finding Demo"
    
    fish_speed = 300.
    
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
    pygame.display.set_caption(title)
    
    default_font = pygame.font.get_default_font()
    font = pygame.font.SysFont(default_font, 26)
    instructions = font.render(instructions_txt, True, (0, 0, 0))
    
    rects = []
    
    width, height = SCREEN_SIZE
    
    class ParallaxNode(SquareNode):
	size = 10
	
	def __init__(self, coords):
		self.coord = tuple([int(p / self.size) for p in coords])
	
	def TestPoint(self, coord):
		return len([r for r in rects if r.collidepoint(coord)])
	
	def GetAdjacent(self):
		return [self.__class__(((self.coord[0] + x) * self.size, (self.coord[1] + y) * self.size)) for x, y in self.adj if self.TestPoint(((self.coord[0] + x) * self.size, (self.coord[1] + y) * self.size))]
	
	def GetCoord(self):
		return tuple([x * self.size for x in self.coord])
    
    fish_coord = (0, 0)
    route = []
    clock = pygame.time.Clock()
    p = PathFinder()
    
    while True:
	for event in pygame.event.get():
	    if event.type == QUIT:
		return
	    
	    if event.type == MOUSEBUTTONDOWN:
	        if event.button == 1:
	            rects.append(Rect((event.pos[0], event.pos[1], 1, 1)))
	        
	        if event.button == 3:
	            if ParallaxNode(fish_coord).TestPoint(fish_coord):
		    	src = ParallaxNode(fish_coord)
			dest = ParallaxNode(tuple(event.pos))
			src.dest = tuple(event.pos)
	    		route = p.FindRoute(src, dest)
		    else:
		    	fish_coord = tuple(event.pos)
	
	    if event.type == MOUSEMOTION:
	        if event.buttons[0] == 1:
	            rects[-1].width = event.pos[0] - rects[-1].left
	            rects[-1].height = event.pos[1] - rects[-1].top
	    
	screen.fill((255,255,255))
	
	time_passed = clock.tick()
	time_passed_seconds = time_passed / 1000.0
	
	if route:
	    if len(route) > 1:
		pygame.draw.aalines(screen, (255, 150, 150), False, [r.GetCoord() for r in route], 1)
	    
	    destination = route[0]
	    if fish_coord == destination.GetCoord():
		route = route[1:]
	    else:
		fish_coord = destination.GetCoord()
	
	[pygame.draw.rect(screen, (255, 0, 0), r, 1) for r in rects]
	
	pygame.draw.circle(screen, (0, 0, 255), fish_coord, 3)
	
	screen.blit(instructions, (5, 5))
	
	pygame.display.update()
	sleep(0.1)

if __name__ == "__main__":
    run()


