# Arup Guha
# 6/12/2024
# dot class for dot game

import random
import math
import time
import pygame, sys
import dotconsts
from pygame.locals import *

# Dot class for Dot game.
class dot:

    # Default settings.
    x = 0
    y = 0
    dx = 0
    dy = 0
    diameter = 0
    r = 0
    color = pygame.Color(0,0,255)

    # Constructor.
    def __init__(self,myx,myy,mydx,mydy,mydiameter,mycolor):
        self.x = myx
        self.y = myy
        self.dx = mydx
        self.dy = mydy
        self.diameter = mydiameter
        self.color = mycolor
        self.r = self.diameter/2

    # Call each frame.
    def move(self):
        self.x += self.dx
        self.y += self.dy

    # Adds addDX to the the change in x per frame, and adds addDY to
    # the change in y per frame.
    def changeVelocity(self,addDX,addDY):
        self.dx += addDX
        self.dy += addDY

    # Draws this object on the display surface as a circle.
    # Likely to be overridden most of the time.
    def draw(self, DISPLAYSURF):
        pygame.draw.ellipse(DISPLAYSURF, self.color, (self.x, self.y, self.diameter, self.diameter), 0)
        
    # Returns true iff the two circles represented by self and other intersect.
    # Should be overridden for different objects.
    def hit(self, other):

        # We actually have to calculate the centers.
        center_dx = (self.x + self.diameter/2) - (other.x + other.diameter/2)
        center_dy = (self.y + self.diameter/2) - (other.y + other.diameter/2)
        dist_sq = center_dx*center_dx + center_dy*center_dy

        # This is the usual test.
        dist_sq_radii = (self.diameter//2 + other.diameter//2)*(self.diameter//2 + other.diameter//2)
        return dist_sq <= dist_sq_radii

    # Returns true iff self is bigger than other.
    def isBigger(self, other):
        return self.diameter > other.diameter

    # self eats other, this code adjust the diameter of self.
    def eat(self, other):
        self.diameter = int(2*((self.r**2 + other.r**2)**.5))

    # Returns true iff we ran off screen.
    def offScreen(self):
        return self.x < 0 or self.x+self.diameter >= dotconsts.SCREEN_W or self.y < 0 or self.y+self.diameter >= dotconsts.SCREEN_H
