import pygame, sys, time, random

# Initialisation - stuff needed for setting up game
pygame.init()

frameclock = pygame.time.Clock()


PLAYER_TILE_DIVIDER = 1

GAME_SPEED_TICKS = 10 * PLAYER_TILE_DIVIDER

enemyMove = 0

TILE_WIDTH = 64
TILE_HEIGHT = 48

text_rect = pygame.Rect(0, 0, TILE_WIDTH, TILE_HEIGHT)


playerSprite = pygame.image.load("bob.png")
enemySprite = pygame.image.load("bob.png")

grass1Sprite = pygame.image.load("grass1.png")
grass2Sprite = pygame.image.load("grass2.png")
bush1Sprite = pygame.image.load("bush1.png")

levelone = [
   "######################",
   "#   #      #        o#",
   "#   #  #   #         #",
   "#   #  #   #         #",
   "### ## ###########   #",
   "#                    #",
   "#################### #",
   "#                    #",
   "#          ###########",
   "#                    #",
   "#                    #",
   "####  ####           #",
   "#           E        #",
   "#                    #",
   "#                    #",
   "#                    #",
   "#                    #",
   "#######             ##",
   "#                    #",
   "#                    #",
   "#                    #",
   "#                    #",
   "#                    #",
   "#                    #",
   "#                    #",
   "#                    #",
   "        #   ##       #",
   "######################",
    ]
level = levelone


maxX = level[0].__len__() - 1
maxY = level.__len__() - 1

screenXOffset = -TILE_WIDTH * (maxX + 1) / 16
screenYOffset = TILE_HEIGHT * (maxY + 1) / 2

screen = pygame.display.set_mode ((1024, 800))

enemyX = 0
enemyY = 0

nextEnemyX = 0
nextEnemyY = 0

enemyDirectionX = 1
enemyDirectionY = 0


playerX = 0
playerY = 0

nextPlayerX = 0
nextPlayerY = 0

y = 0
for row in level:
    x = 0
    for col in row:
        if col == "o":
            playerX = x * PLAYER_TILE_DIVIDER
            playerY = y * PLAYER_TILE_DIVIDER
            print("Found player coordinates (" + str(playerX) + "," + str(playerY) + ")")
        if col == "E":
            enemyX = x * PLAYER_TILE_DIVIDER
            enemyY = y * PLAYER_TILE_DIVIDER
        x = x + 1
    y = y + 1


print("Player coordinates (" + str(playerX) + "," + str(playerY) + ")")

while True:
    frameclock.tick(GAME_SPEED_TICKS)

    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()


    key = pygame.key.get_pressed()
    if key[pygame.K_ESCAPE]:
        pygame.quit()
        sys.exit()
    if key[pygame.K_a]:
        screenXOffset = screenXOffset + (TILE_WIDTH / 2)
    if key[pygame.K_d]:
        screenXOffset = screenXOffset - (TILE_WIDTH / 2)
    if key[pygame.K_w]:
        screenYOffset = screenYOffset + (TILE_HEIGHT / 2)
    if key[pygame.K_s]:
        screenYOffset = screenYOffset - (TILE_HEIGHT / 2)

    nextPlayerX = playerX
    nextPlayerY = playerY

    if key[pygame.K_KP6] or key[pygame.K_RIGHT] or key[pygame.K_6]:
        nextPlayerX = playerX + 1
        nextPlayerY = playerY + 1
    if key[pygame.K_KP4] or key[pygame.K_LEFT] or key[pygame.K_4]:
        nextPlayerX = playerX - 1
        nextPlayerY = playerY - 1
    if key[pygame.K_KP8] or key[pygame.K_UP] or key[pygame.K_8]:
        nextPlayerX = playerX + 1
        nextPlayerY = playerY - 1
    if key[pygame.K_KP2] or key[pygame.K_DOWN] or key[pygame.K_2]:
        nextPlayerX = playerX - 1
        nextPlayerY = playerY + 1
    if key[pygame.K_KP1] or key[pygame.K_1]:
        nextPlayerX = playerX - 1
    if key[pygame.K_KP3] or key[pygame.K_3]:
        nextPlayerY = playerY + 1
    if key[pygame.K_KP7] or key[pygame.K_7]:
        nextPlayerY = playerY - 1
    if key[pygame.K_KP9] or key[pygame.K_9]:
        nextPlayerX = playerX + 1

    playerMapX = nextPlayerX / PLAYER_TILE_DIVIDER
    playerMapY = nextPlayerY / PLAYER_TILE_DIVIDER
    tile = level[playerMapY][playerMapX]
    if tile != "#":
        playerX = nextPlayerX
        playerY = nextPlayerY

    playerMapX = playerX / PLAYER_TILE_DIVIDER
    playerMapY = playerY / PLAYER_TILE_DIVIDER

    enemyMove = enemyMove - 1
    if enemyMove < 0:
        enemyMove = 15
        nextEnemyX = enemyX + enemyDirectionX
        nextEnemyY = enemyY + enemyDirectionY

        tile = level[nextEnemyY][nextEnemyX]
        if tile != "#":
            enemyX = nextEnemyX
            enemyY = nextEnemyY
        else:
            randomEnemyDirection = random.randint(0, 3)
            if randomEnemyDirection == 0:
                enemyDirectionX = - 1
                enemyDirectionY = 0
            if randomEnemyDirection == 3:
                enemyDirectionX = 1
                enemyDirectionY = 0
            if randomEnemyDirection == 1:
                enemyDirectionX = 0
                enemyDirectionY = 1
            if randomEnemyDirection == 2:
                enemyDirectionX = 0
                enemyDirectionY = - 1
            print (randomEnemyDirection)
    xs = TILE_WIDTH * (enemyX + enemyY + 1 - PLAYER_TILE_DIVIDER) / (PLAYER_TILE_DIVIDER * 2) \
       + screenXOffset

    ys = TILE_HEIGHT * (enemyY - enemyX)  / (PLAYER_TILE_DIVIDER * 2) \
       + screenYOffset - TILE_HEIGHT

    enemyRect = pygame.Rect(xs, ys, TILE_WIDTH, TILE_HEIGHT) 

    # ==================================================================
    # Here we display all we need. We clear screen, render sprites, etc
    screen.fill((0, 128, 200))

    xs = TILE_WIDTH * playerX / (PLAYER_TILE_DIVIDER * 2) \
       + TILE_WIDTH * playerY / (PLAYER_TILE_DIVIDER * 2) \
       + screenXOffset

    ys = - TILE_HEIGHT * playerX / (PLAYER_TILE_DIVIDER * 2) \
       + TILE_HEIGHT * playerY / (PLAYER_TILE_DIVIDER * 2) \
       + screenYOffset - TILE_HEIGHT
    
    xs = TILE_WIDTH * (playerX + playerY + 1 - PLAYER_TILE_DIVIDER) / (PLAYER_TILE_DIVIDER * 2) \
       + screenXOffset

    ys = TILE_HEIGHT * (playerY - playerX)  / (PLAYER_TILE_DIVIDER * 2) \
       + screenYOffset - TILE_HEIGHT

    if xs < TILE_WIDTH:
        screenXOffset = screenXOffset + (TILE_WIDTH - xs)
    if xs > 800 - TILE_WIDTH:
        screenXOffset = screenXOffset + ((800 - TILE_WIDTH) - xs)
    
    if ys < TILE_HEIGHT:
        screenYOffset = screenYOffset + (TILE_HEIGHT - ys)
    if ys > 600 - TILE_HEIGHT:
        screenYOffset = screenYOffset + ((600 - TILE_HEIGHT) - ys)
    
    playerRect = pygame.Rect(xs, ys, TILE_WIDTH, TILE_HEIGHT) 

    # Put your screen rendering stuff here

    startY = 0
    startX = maxX    
    while startY <= maxY:
        startY = 0
        if startX < 0:
            startY = - startX

        x = startX
        if startX < 0:
            x = 0
            
        y = startY
        while x <= maxX and y <= maxY:
            tile = level[y][x]

            xs = (TILE_WIDTH / 2) * x + (TILE_WIDTH / 2) * y + screenXOffset
            ys = -(TILE_HEIGHT / 2) * x + (TILE_HEIGHT / 2) * y + screenYOffset
            rect = pygame.Rect(xs, ys, TILE_WIDTH, TILE_HEIGHT) 
            if tile == "#":
                screen.blit(grass2Sprite, rect)
                screen.blit(bush1Sprite, rect)

            else:
                screen.blit(grass1Sprite, rect)

            if x == playerMapX and y == playerMapY:
                screen.blit(playerSprite, playerRect)
                
            if x == enemyX and y == enemyY:
                screen.blit(enemySprite, enemyRect)
                
            x = x + 1
            y = y + 1
        startX = startX - 1

#    screen.blit(playerSprite, rect)
  

    

    font = pygame.font.SysFont("apple casual" , 50)
    text = font.render("Player coordinates (" + str(playerX) + "," + str(playerY) + ")", 1,(255, 255, 255))
#    screen.blit(text, text_rect)


    # ==================================================================
    # This is last line in the program. Nothing should go below this
    # next command
    pygame.display.flip()
    
