local counter = 0
function basegame(dt)
    if gameMode == "reversegame" then 
        reversegame(dt)
    end 
    if player1nukescore > 300 then 
        player1nukescore = 300 
    end 
    if player2nukescore > 300 then 
        player2nukescore = 300 
    end
    speedControl()
    balancer()
    effectControl()    
    if t < shakeDuration then
        t = t + dt
    end
   --print("T = " .. tostring(t))
    serveBot()
    if gameState == 'play' then 
        if (AGAINST_AI == 1) then
            AI(player2, maxBalls, AI_LEVEL)
        end
        if (love.keyboard.isDown(p1control.up) or sectortouched(2)) then
            player1.dy = (paddle_SPEED + p1bonus) * -1
        elseif (love.keyboard.isDown(p1control.down) or sectortouched(3)) then
            player1.dy = paddle_SPEED + p1bonus
        else
            player1.dy = 0
        end
        if (AGAINST_AI == 0) then
            if ((globalState ~= "nettest" and (love.keyboard.isDown(p2control.up) or sectortouched(1))) ) then
                player2.dy = (paddle_SPEED + p2bonus) * -1
            elseif ((globalState ~= "nettest" and (love.keyboard.isDown(p2control.down) or sectortouched(4)))) then
                player2.dy = paddle_SPEED + p2bonus
            elseif (globalState ~= "nettest") then 
                player2.dy = 0
            end
        end
       --print(areanuclear .. striken .. player1score .. player2score)
        for i = 1, maxBalls do
            if rules("p1hit", i) then
                --print("inserted")
                if (areanuclear == 0 and striken == 1 and (player1score > ptw*0.8 or player2score > ptw*0.8)) then
                   --print("Calling animation")
                  --print("AREA NUCLEAR?" .. areanuclear)
                    superanimator("tensehit", 1)
                end
                if gameMode == "practice" then
                    player1score = player1score + 1
                end
                t = 0
                if (ballSpeed > 200) then
                    shakeMagnitude = ballSpeed / 200
                else
                    shakeMagnitude = 0
                end
                shakeDuration = 1
                randomtext = love.math.random(1, #textphrases)
                TEXT = textphrases[randomtext]
                soundtype = love.math.random(1, 1.2)

                if (player1striken == 1) then
                    TEXT = "PLAYER 1 STRIKES"
                    ballSpeed = ballSpeed + player1nukescore
                    background_scroll_speed = ballSpeed / 20
                    potentialnuke1 = 0
                    player1striken = 0
                    player1nukescore = 0
                    potentialstrike1 = 0
                    striken = 1
                    if areanuclear == 0 then
                        sounds["striking"]:setPitch(ballSpeed / 250)
                        sounds["striking"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                   --print("AREA NUCLEAR?" .. areanuclear)
                    if areanuclear == 0 then 
                    superanimator("tensehit", 1)
                    end
                else
                    if areanuclear == 0 then
                        sounds["beep"]:setPitch(ballSpeed / 250)
                        sounds["beep"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                end
                if (striken == 1) then
                    
                    player1nukescore = player1nukescore * 1.5
                    if (synctype == 0) then
                        paddle_SPEED = paddle_SPEED * 1.10
                    elseif (synctype == 1) then
                        paddle_SPEED = ballSpeed
                    end
                    if (synctype == 0) then
                        AI_SPEED = AI_SPEED * 1.10
                    end
                    if (synctype == 1) then
                        AI_SPEED = ballSpeed * 1.1 / 10
                    end
                    ballSpeed = ballSpeed * 1.10
                    background_scroll_speed = ballSpeed / 20
                end
                player1nukescore = player1nukescore + 10
                ball[i].dx = -ball[i].dx
                ball[i].x = player1.x + 30

                if (love.keyboard.isDown(p1control.up) or sectortouched(2)) then
                    select = math.random(1, 5)
                    if select == 1 then
                        ball[i].dy = -1
                    elseif select == 2 then
                        ball[i].dy = -1.2
                    elseif select == 3 then
                        ball[i].dy = -1.5
                    elseif select == 4 then
                        ball[i].dy = -1.8
                    elseif select == 5 then
                        ball[i].dy = -2
                    end
                elseif love.keyboard.isDown(p1control.down) or sectortouched(3) then
                    select = math.random(1, 5)
                    if select == 1 then
                        ball[i].dy = 1
                    elseif select == 2 then
                        ball[i].dy = 1.2
                    elseif select == 3 then
                        ball[i].dy = 1.5
                    elseif select == 4 then
                        ball[i].dy = 1.8
                    elseif select == 5 then
                        ball[i].dy = 2
                    end
                else
                    if ball[i].dy < 0 then
                        select = math.random(1, 5)
                        if select == 1 then
                            ball[i].dy = -1
                        elseif select == 2 then
                            ball[i].dy = -1.2
                        elseif select == 3 then
                            ball[i].dy = -1.5
                        elseif select == 4 then
                            ball[i].dy = -1.8
                        elseif select == 5 then
                            ball[i].dy = -2
                        end
                    else
                        select = math.random(1, 5)
                        if select == 1 then
                            ball[i].dy = 1
                        elseif select == 2 then
                            ball[i].dy = 1.2
                        elseif select == 3 then
                            ball[i].dy = 1.5
                        elseif select == 4 then
                            ball[i].dy = 1.8
                        elseif select == 5 then
                            ball[i].dy = 2
                        end
                    end
                end
            end
            if rules("p2hit", i) then
                --ameState = 'quickanim'
                t = 0
                shakeDuration = 1
                if
                    (areanuclear == 0 and
                        (striken == 1 and (player1score > ptw*0.8 or player2score > ptw*0.8)))
                 then
                   --print("AREA NUCLEAR?" .. areanuclear)
                    superanimator("tensehit", 2)
                end
                if (ballSpeed > 200) then
                    shakeMagnitude = ballSpeed / 200
                else
                    shakeMagnitude = 0
                end
                randomtext = love.math.random(1, #textphrases)
                TEXT = textphrases[randomtext]
                soundtype = love.math.random(1, 1.2)

                if (player2striken == 1) then
                    TEXT = "PLAYER 2 STRIKES"
                    ballSpeed = ballSpeed + player2nukescore
                    background_scroll_speed = ballSpeed / 20
                    striken = 1
                    player2striken = 0
                    potentialnuke2 = 0
                    player2nukescore = 0
                    potentialstrike2 = 0
                   --print("AREA NUCLEAR?" .. areanuclear)
                    if areanuclear == 0 then 
                    superanimator("tensehit", 2)
                    end
                    if areanuclear == 0 then
                        sounds["striking"]:setPitch(ballSpeed / 250)
                        sounds["striking"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                elseif (striken == 1) then
                    
                    player2nukescore = player2nukescore * 1.5
                    if (synctype == 0) then
                        paddle_SPEED = paddle_SPEED * 1.10
                    end
                    if (synctype == 1) then
                        paddle_SPEED = ballSpeed
                    end
                    if (synctype == 0) then
                        AI_SPEED = AI_SPEED * 1.10
                    end
                    if (synctype == 1) then
                        AI_SPEED = ballSpeed * 1.1 / 10
                    end
                    ballSpeed = ballSpeed * 1.10
                    background_scroll_speed = ballSpeed / 20
                    if areanuclear == 0 then
                        sounds["beep"]:setPitch(ballSpeed / 250)
                        sounds["beep"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                else
                    if areanuclear == 0 then
                        sounds["beep"]:setPitch(ballSpeed / 250)
                        sounds["beep"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                end
                player2nukescore = player2nukescore + 10
                ball[i].dx = -ball[i].dx
                ball[i].x = player2.x - 30

                if ((globalState ~= "nettest" and (love.keyboard.isDown(p2control.up) or sectortouched(1)) ) or AI_SPEED < 0 or lastSentKeyClient == p2control.up) then
                    select = math.random(1, 5)
                    if select == 1 then
                        ball[i].dy = -1
                    elseif select == 2 then
                        ball[i].dy = -1.2
                    elseif select == 3 then
                        ball[i].dy = -1.5
                    elseif select == 4 then
                        ball[i].dy = -1.8
                    elseif select == 5 then
                        ball[i].dy = -2
                    end
                elseif (globalState ~= "nettest" and (love.keyboard.isDown(p2control.down)or sectortouched(4))) or AI_SPEED > 0 or lastSentKeyClient == p2control.down then
                    select = math.random(1, 5)
                    if select == 1 then
                        ball[i].dy = 1
                    elseif select == 2 then
                        ball[i].dy = 1.2
                    elseif select == 3 then
                        ball[i].dy = 1.5
                    elseif select == 4 then
                        ball[i].dy = 1.8
                    elseif select == 5 then
                        ball[i].dy = 2
                    end
                else
                    if ball[i].dy < 0 then
                        select = math.random(1, 5)
                        if select == 1 then
                            ball[i].dy = -1
                        elseif select == 2 then
                            ball[i].dy = -1.2
                        elseif select == 3 then
                            ball[i].dy = -1.5
                        elseif select == 4 then
                            ball[i].dy = -1.8
                        elseif select == 5 then
                            ball[i].dy = -2
                        end
                    else
                        select = math.random(1, 5)
                        if select == 1 then
                            ball[i].dy = 1
                        elseif select == 2 then
                            ball[i].dy = 1.2
                        elseif select == 3 then
                            ball[i].dy = 1.5
                        elseif select == 4 then
                            ball[i].dy = 1.8
                        elseif select == 5 then
                            ball[i].dy = 2
                        end
                    end
                end
            end
            hitIdentifier()
            if ball[i].y <= 0 then
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                ball[i].y = 0
                ball[i].dy = -ball[i].dy
            end

            -- -4 to account for the ball's size
            if ball[i].y >= VIRTUAL_HEIGHT - 40 then
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                ball[i].y = VIRTUAL_HEIGHT - 40
                ball[i].dy = -ball[i].dy
            end
            --love.window.setTitle('Trying to update the ball')
            if timeIsSlow then
                if ballSpeed > originalSpeed / 3 then
                    paddle_SPEED = 300
                    ballSpeed = ballSpeed / (1 + (dt * 2))
                    background_scroll_speed = ballSpeed / 20
                end
                player1nukescore = player1nukescore - (dt * 50)
                if player1nukescore < 1 or ball[1].dx > 0 then
                    timeIsSlow = false
                    player1reverbav = false
                    ballSpeed = originalSpeed
                    background_scroll_speed = ballSpeed / 20
                    sounds["time"]:stop()
                    paddle_SPEED = originalPaddle
                end
            end
            if timeIsSlow2 then
                if ballSpeed > originalSpeed / 3 then
                    ballSpeed = ballSpeed / (1 + (dt * 2))
                    background_scroll_speed = ballSpeed / 20
                end
                player2nukescore = player2nukescore - (dt * 50)
                if player2nukescore < 1 or ball[1].dx < 0 then
                    paddle_SPEED = 300
                    timeIsSlow2 = false
                    player2reverbav = false
                    ballSpeed = originalSpeed
                    background_scroll_speed = ballSpeed / 20

                    sounds["time"]:stop()
                    paddle_SPEED = originalPaddle
                end
            end
            ball[i]:update(dt)
        end
    end
    goalManager()
    powerAvailability()
    player1:update(dt)
    player2:update(dt)
end




function debugCheck(dt)
    
    if (gameState == "menu") then
        updateTEXT = "0.8 Galaxy"
    end
    dangerChecker()
    elapsed = elapsed + dt  
    rotation = math.sin(elapsed * 2.5) * 0.7

    editor()
    mapChanger()
end 

function goalManager()
    for i = 1, maxBalls do
        if (rules("p1miss", i)) then 
            ball[i].disabled = true 
            ball[i].x = 2000
            
            if ballsAlive() == false then 
                if (nuckemodactive == 0) then
                    areanuclear = 0
                    nuclearanimation = 3
                end
                striken = 0
                player1striken = 0
                player2striken = 0
                ballSpeed = ballSet
                background_scroll_speed = ballSpeed / 20
                if (synctype == 0) then
                    paddle_SPEED = ballSet
                end
                if (synctype == 1) then
                    paddle_SPEED = ballSpeed 
                end
        
                AI_SPEED = difficultyl 
                for i = 1, maxBalls do
                    ball[i]:reset(i, 2)
                end
                if (player2score+1 == ptw+maxBalls-1 and gameMode ~= "practice") then
                    for i = 1, maxBalls do
                        ball[i]:reset(i)
                    end
                    sounds["win"]:play()
                    gameState = "done"
                    TEXT = "Player 2 Won!"
                else
                    if globalState ~= "clienttest" or (globalState == "clienttest" and gameState == "1serve") then 
                        gameState = "1serve"
                        serveBot()
                        ball[i]:reset(i, 1)
                    end 
                end 
            end 

            player2score = player2score + 1
        end
        if (rules("p2miss", i)) then
            ball[i].disabled = true 
            ball[i].x = 2000
            if ballsAlive() == false then 
                if (nuckemodactive == 0) then
                    areanuclear = 0
                    nuclearanimation = 3
                end
                striken = 0
                player1striken = 0
                player2striken = 0
                ballSpeed = ballSet
                background_scroll_speed = ballSpeed / 20
                if (synctype == 0) then
                    paddle_SPEED = ballSet 
                    AI_SPEED = ballSet 
                end
                if (synctype == 1) then
                    paddle_SPEED = ballSpeed 
                    AI_SPEED = ballSpeed 
                end
    
                AI_SPEED = difficultyl 
                
                if (player1score+1 == ptw+maxBalls-1) then
                    ball[i]:reset(i)
    
                    sounds["win"]:play()
                    gameState = "done"
                    TEXT = "Player 1 Won"
                else
                    if globalState ~= "nettest" or (globalState == "nettest" and gameState == "2serve") then 
                    gameState = "2serve"
                    serveBot()
    
                    ball[i]:reset(i, 2)
                    end 
    

                end
            end 
            sounds["score"]:play()
            player1score = player1score + 1

        end
    end
end

function powerAvailability()
    if (player1nukescore >= 20 and player1nukescore < 200) then
        potentialstrike1 = 1
        if (((globalState ~= "clienttest" and (love.keyboard.isDown(p1control.super) or doubleclick1 == true)) or (globalState == "clienttest" and lastSentKeyP1 == p1control.super)) ) then
            player1striken = 1
            doubleclick1 = false 
            player1reverbav = 0
        end
    end
    if (player1nukescore >= 140) and timeIsSlow2 == false and timeIsSlow == false and (maxBalls > 1 or (ball[1].dx < 0 and ball[1].x < VIRTUAL_WIDTH/2))then
        player1reverbav = 1
        if ((globalState == "clienttest" and lastSentKeyP1 == p1control.counter) or (globalState ~= "clienttest" and (love.keyboard.isDown(p1control.counter) or hold1 == true))) then
            powerControl(1, "special")
        end
    end
    if (player1nukescore >= 200) then
        potentialnuke1 = 1
        if ((globalState == "clienttest" and (lastSentKeyP1 == p1control.super or doubleclick1 == true))or (globalState ~= "clienttest" and (love.keyboard.isDown(p1control.super) or doubleclick1 == true))) then
            sounds["nuke"]:play()
            doubleclick1 = false 
            if areanuclear == 1 then
                maxspeed = maxspeed + 50
            end
            areanuclear = 1
            potentialstrike1 = 0
            striken = 0
            ballSpeed = ballSpeed * 2
            background_scroll_speed = ballSpeed / 20
            if (synctype == 0) then
                paddle_SPEED = paddle_SPEED * 2
            end
            if (synctype == 1) then
                paddle_SPEED = ballSpeed 
            end
            if (synctype == 0) then
                AI_SPEED = AI_SPEED * 2.2
            end
            if (synctype == 1) then
                AI_SPEED = ballSpeed * 1.1 / 10
            end
            player1nukescore = 0
            player1reverbav = 0
            potentialnuke1 = 0
        end
    end
    if (player2nukescore >= 20 and player2nukescore < 200) then
        potentialstrike2 = 1
        if (AGAINST_AI == 0) then
            if ((globalState ~= "nettest" and (love.keyboard.isDown(p2control.super) or doubleclick2)) or lastSentKeyClient == p2control.super ) then
                player2striken = 1
                player2reverbav = 0
                doubleclick2 = false 
            end
        end
    end
    if (player2nukescore >= 140) and timeIsSlow == false and timeIsSlow2 == false and (maxBalls > 1 or (ball[1].dx > 0 and ball[1].x > VIRTUAL_WIDTH/2)) then
        player2reverbav = 1
       --print("Available counter, " .. globalState .. tostring(love.keyboard.isDown(p2control.counter)))
        if (globalState ~= "nettest" and (love.keyboard.isDown(p2control.counter) or hold2)) or lastSentKeyClient == p2control.counter then
            sounds["time"]:play()
            player2reverbav = false
            timeIsSlow2 = true
            originalPaddle = paddle_SPEED
            originalSpeed = ballSpeed
            player2reverbav = 0
            potentialnuke2 = 0
            potentialstrike2 = 0
        end
    end
    if (player2nukescore >= 200) then
        potentialnuke2 = 1
        if (((globalState ~= "nettest" and (love.keyboard.isDown(p2control.super) or doubleclick2)) or lastSentKeyClient == p2control.super)) and AGAINST_AI == 0 then
            sounds["nuke"]:play()
            doubleclick2 = false 
            if areanuclear == 1 then
                maxspeed = maxspeed + 50
            end
            potentialstrike2 = 0
            areanuclear = 1
            player2reverbav = 0
            ballSpeed = ballSpeed * 2
            background_scroll_speed = ballSpeed / 20
            if (synctype == 0) then
                paddle_SPEED = paddle_SPEED * 2
            end
            if (synctype == 1) then
                paddle_SPEED = ballSpeed
            end
            if (synctype == 0) then
                AI_SPEED = AI_SPEED * 2.2
            end
            if (synctype == 1) then
                AI_SPEED = ballSpeed * 1.1 / 10
            end
            player2nukescore = 0
            potentialnuke2 = 0
        end
    end
end

function editor()
    if (gameState == "editor") then
        if debug then 
            --print("Editor is active!")
        end 
        local mx, my = love.mouse.getPosition()
        mx = mx * DIFFERENCE_X
        my = my * DIFFERENCE_Y
        if (love.mouse.isDown(2)) then
            wallbreaker(mx, my)
        end
        if (love.mouse.isDown(3)) then
            table.insert(walls, newWall(mx, my, 10, wall1width))
        end
    end
end

function nuclearDraw()
    love.graphics.setColor(1, 1, 1, 1)
    for i = 1, maxBalls do 
    love.graphics.circle("fill", ball[i].x, ball[i].y, explosionRange * 100, 100)
    end 
    player1.RED, player1.GREEN, player1.BLUE, player2.RED, player2.GREEN, player2.BLUE =
        nuclearanimation / 3,
        nuclearanimation / 3,
        nuclearanimation / 3,
        nuclearanimation / 3,
        nuclearanimation / 3,
        nuclearanimation / 3


    for i = 1, maxBalls do
        love.graphics.setColor(nuclearanimation / 3, nuclearanimation / 3, nuclearanimation / 3, 1)
        ball[i]:render("controlled")
    end
    player1:render()
    player2:render()
end 

function winDraw(who)

    love.graphics.setColor(0, 0, 0, 1)
    if who == 1 then 
    love.graphics.circle("fill", player2.x, player2.y, explosionRange * 100, 100)
    love.graphics.setColor(0.7, 0.1, 0.1, 1)
    love.graphics.circle("fill", player2.x, player2.y, explosionRange * 90, 100)  
    love.graphics.setColor(0.1, 0.7, 0.1, 1)
    love.graphics.circle("fill", player2.x, player2.y, explosionRange * 80, 100)
    love.graphics.setColor(0.1, 0.1, 0.7, 1)
    love.graphics.circle("fill", player2.x, player2.y, explosionRange * 70, 100)
    love.graphics.setColor(0, 0, 0, 1)
    love.graphics.circle("fill", player2.x, player2.y, explosionRange * 60, 100)
    --print("cicrleexplostion at " .. explosionRange)
    else 
        love.graphics.circle("fill", player1.x, player1.y, explosionRange * 100, 100)
    love.graphics.setColor(0.7, 0.1, 0.1, 1)
    love.graphics.circle("fill", player1.x, player1.y, explosionRange * 90, 100)  
    love.graphics.setColor(0.1, 0.7, 0.1, 1)
    love.graphics.circle("fill", player1.x, player1.y, explosionRange * 80, 100)
    love.graphics.setColor(0.1, 0.1, 0.7, 1)
    love.graphics.circle("fill", player1.x, player1.y, explosionRange * 70, 100)
    love.graphics.setColor(0, 0, 0, 1)
    love.graphics.circle("fill", player1.x, player1.y, explosionRange * 60, 100)
    end 
    love.graphics.setColor(1, 1, 1, 1)
    love.graphics.printf(TEXT, 0, 20, VIRTUAL_WIDTH, "center")
end 

function normalDraw()
    if (areanuclear == 1) then
        love.graphics.clear(1, 1, 1, 1)
    else
        love.graphics.clear(40 / 255, 40 / 255, 40 / 255, 1)
        love.graphics.draw(background, 0, -backgroundScroll) 
    end
    if gameState == "assign" then
        love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
        love.graphics.printf("SELECT BUTTON", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
    end
    for i, explosion in ipairs(explosions) do 
        explosion:render()
        --print("exploding")
    end
    staticanimator()

    if MAP_TYPE == 1 then 
        love.graphics.setColor(1, 0, 0.20, 1)
        love.graphics.rectangle("fill", VIRTUAL_WIDTH * 0.5, 0, 10, VIRTUAL_HEIGHT * 0.3)
        love.graphics.rectangle("fill", VIRTUAL_WIDTH * 0.5, VIRTUAL_HEIGHT * 0.7, 10, VIRTUAL_HEIGHT * 0.3)
        love.graphics.setColor(1, 1, 1, 1)
    end 
    if MAP_TYPE == 2 then 
        for i, wall in ipairs(walls) do
            love.graphics.setColor(1, 1, 1, 1)
            love.graphics.rectangle("fill", wall.wallx, wall.wally, 10, wall.wallheight)
        end
    end

    pongDraw()
    love.graphics.setFont(smallfont)
    for i = 1, maxBalls do
        if areanuclear == 1 then
            --love.window.setTitle('rendering black')
            ball[i]:render("black")
        else
            --love.window.setTitle('rendering white')
            ball[i]:render(" ")
        end
    end
    
end 
function pongDraw()
    --print("Drawing classic pong")
    love.graphics.setColor(1, 1, 1, 1)
    love.graphics.printf(TEXT, 0, 20, VIRTUAL_WIDTH, "center")
    love.graphics.setFont(smallfont)
    love.graphics.setFont(scorefont)
    if (areanuclear == 1) then 
        love.graphics.setColor(0, 0, 0, 1)
    end
    love.graphics.print(tostring(math.floor(player1score)), VIRTUAL_WIDTH / 2 - 500, VIRTUAL_HEIGHT / 12)
    love.graphics.print(tostring(math.floor(player2score)), VIRTUAL_WIDTH / 2 + 400, VIRTUAL_HEIGHT / 12)
    love.graphics.setColor(1, 1, 1, 1)
    displayPoints()
    player1:render()
    player2:render()

end
function practiceDraw()
    player1:render()
    love.graphics.rectangle("fill", VIRTUAL_WIDTH-10, 0, 10, VIRTUAL_HEIGHT)
    love.graphics.setColor(1, 1, 1, 1)
    love.graphics.printf(TEXT, 0, 20, VIRTUAL_WIDTH, "center")
    love.graphics.setFont(smallfont)
    love.graphics.setFont(scorefont)
    love.graphics.print(tostring(math.floor(player1score)), VIRTUAL_WIDTH / 2 - 500, VIRTUAL_HEIGHT / 12)
end
function menuDraw()
    love.graphics.setColor(1, 1, 1, 1)
    love.graphics.printf(TEXT, 0, 20, VIRTUAL_WIDTH, "center")
    love.graphics.setFont(smallfont)
    love.graphics.printf(updateTEXT, 0, VIRTUAL_HEIGHT * 0.95, VIRTUAL_WIDTH, "left")
    if MAP_TYPE == 1 then 
        love.graphics.setColor(1, 0, 0.20, 1)
        love.graphics.rectangle("fill", VIRTUAL_WIDTH * 0.5, 0, 10, VIRTUAL_HEIGHT * 0.3)
        love.graphics.rectangle("fill", VIRTUAL_WIDTH * 0.5, VIRTUAL_HEIGHT * 0.7, 10, VIRTUAL_HEIGHT * 0.3)
        love.graphics.setColor(1, 1, 1, 1)
    end 
    if MAP_TYPE == 2 then 
        for i, wall in ipairs(walls) do
            love.graphics.setColor(1, 1, 1, 1)
            love.graphics.rectangle("fill", wall.wallx, wall.wally, 10, wall.wallheight)
        end
    end
    player1:render()
    player2:render()
    ball[1]:render("controlled")
    if gameState == "touchcontrols" then
        if doubleclick1 or doubleclick2 then 
            gameState = "menu"
            globalState = "menu"
            resettinggenius()
        end
        love.graphics.setFont(smallfont)
        love.graphics.printf("The green zones are for moving up and down, double tap the red zone for special attack or to start the serve.", 10, 150, VIRTUAL_WIDTH, "center")
        love.graphics.printf("Swipe from red to green for stopping time", 10, 450, VIRTUAL_WIDTH, "center")
    end
    if gameState == "windowsettings" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, settings, sounds, "right")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "editor" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, editorpicks, sounds, "right")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "speedSettings" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, speedParameters, sounds, "middle")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "controlSettings" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, controlSettings, sounds, "control")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "gameMode" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, modeSelectorButtons, sounds, "middle")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "chooseIP" then
        IPselect = {}
        if isAndroid then 
        table.insert(
            IPselect,
            newButton(
                IPnew,
                function()
                    love.keyboard.setTextInput( true, 0, VIRTUAL_HEIGHT, VIRTUAL_WIDTH, VIRTUAL_HEIGHT/3)
                end,
                true,
                1
            )
        )
        end 
        table.insert(
            IPselect,
            newButton(
                "LANHost",
                function()
                    globalState = "selfhost"
                    AGAINST_AI = 0 
                    gameState = "1serve"
                    ball[1]:reset(1, 1)
                    player2.dy = 0 
                end,
                true, 1
            )
        )
        table.insert(
            IPselect,
            newButton(
                "Check Server",
                function()
                    IP = IPnew
                    counter = 0
                end,
                true, 1
            )
        )
        if status == "offline" then 
            animateConnection()
        elseif status == "nettest" and IP == IPnew then 
            table.insert(
                IPselect,
                newButton(
                    "Connect as Host",
                    function()
                        resettinggenius()
                        globalState = "nettest"
                        AGAINST_AI = 0 
                        gameState = "1serve"
                        ball[1]:reset(1, 1)
                        player2.dy = 0 
                    end,
                    false, 1
                )
            )
            
        elseif status == "clienttest" and IP == IPnew  then 
            table.insert(
                IPselect,
                newButton(
                    "Connect as Guest",
                    function()
                        resettinggenius()
                        globalState = "clienttest"
                        AGAINST_AI = 0 
                        gameState = "1serve"
                        ball[1]:reset(1, 1)
                        player2.dy = 0 
                    end,
                    false, 1
                )
            )
        elseif status == "full" then 
            love.graphics.printf("SERVER FULL", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
        end
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, IPselect, sounds, "middle")
        love.keyboard.mouseisReleased = false
        if not isAndroid then 
        love.graphics.printf(IPnew, 0, VIRTUAL_HEIGHT / 4, VIRTUAL_WIDTH, "center")
        end 
        love.keyboard.mouseisReleased = false
    end
    if gameState == "menu" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, buttons, sounds, "middle")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "difficulty" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, difbuttons, sounds, "middle")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "multiMode" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, playerCountButtons, sounds, "middle")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "prdiff" then
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, pracdiff, sounds, "playercount")
        love.keyboard.mouseisReleased = false
    end
    if gameState == 'start' then 
        love.graphics.push()
        love.graphics.translate(VIRTUAL_WIDTH * 0.4, VIRTUAL_HEIGHT * 0.5)
        love.graphics.rotate(rotation)
        love.graphics.setFont(smallfont)
        love.graphics.setColor(200/255, 200/255, 200/255, 1)
        if isAndroid then 
            love.graphics.print("Tap to Start", WINDOW_WIDTH / -10, VIRTUAL_HEIGHT / 8)
        else
            love.graphics.print("Press Enter to Start", WINDOW_WIDTH / -10, VIRTUAL_HEIGHT / 8)
        end 
        love.graphics.setColor(255, 255, 255, 255)
        love.graphics.pop()
    end
end
function baseDraw()
    love.graphics.setColor(255, 255, 255, 1) 
    love.graphics.draw(background, 0,-backgroundScroll)

    if shakeDuration > t then 
            
        local dx = love.math.random(-shakeMagnitude, shakeMagnitude)
        local dy = love.math.random(-shakeMagnitude, shakeMagnitude)
        love.graphics.translate(dx, dy)
    end
    if globalState == 'menu' then 
       --print("Drawing menuDraw")
        if gameState == 'animation' then 
            
           --print("Drawing animation")
            intro()
        end
        if gameState ~= 'animation' then
           --print("Drawing notanimtaion") 
            love.graphics.setFont(scorefont)
            menuDraw()
        end
    end

    if globalState == 'base' or globalState == 'reverse' or globalState == 'nettest' or globalState == 'clienttest' then 

        love.graphics.setFont(smallfont)
        if gameState == 'nuclearExplosion' then 
            nuclearDraw()
        end 

        if gameState == 'play' or gameState == '1serve' or gameState == '2serve' or gameState == 'done' then 
          --print("Drawing normally")
            normalDraw()
            
        end 
        if gameState == 'done' and player1score > player2score then 
            winDraw(1)
        elseif gameState == 'done' and player1score < player2score then 
            winDraw(2)
        end
    end 
    if paused then 
    mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, pauseButtons, sounds, "middle")
    love.keyboard.mouseisReleased = false
    end 
    if gameState == "done" then 
        mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, doneButtons, sounds, "middle")
        love.keyboard.mouseisReleased = false
    end
    if gameState == "assign" then 
        love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
        love.graphics.printf("SELECT BUTTON", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
    end
end 
function androidDraw()
--HOME BUTTON HERE
mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, androidButtons, sounds, "android")
if showTouchControls then 
    love.graphics.setColor(15/255, 255/255, 15/255, 0.5)
    love.graphics.rectangle("fill", 0, 0, 100, VIRTUAL_HEIGHT)
    love.graphics.setColor(15/255, 255/255, 15/255, 0.5)
    love.graphics.rectangle("fill", VIRTUAL_WIDTH-100, 0, 50, VIRTUAL_HEIGHT)
    love.graphics.setColor(255/255, 15/255, 15/255, 0.5)
    love.graphics.rectangle("fill", 100, 0, VIRTUAL_WIDTH/2-100, VIRTUAL_HEIGHT)
    love.graphics.rectangle("fill", VIRTUAL_WIDTH/2, 0, VIRTUAL_WIDTH/2-100, VIRTUAL_HEIGHT)
    love.graphics.setColor(0, 0, 0, 0.5)
    love.graphics.rectangle("fill", VIRTUAL_WIDTH/2-5, 0, 10, VIRTUAL_HEIGHT)
end 
end 
function renderEditor()
    if not blockinput then
        love.graphics.setColor(1, 0, 0, 1)
        love.graphics.rectangle("fill", mx, my, 10, wall1width)
        love.graphics.setColor(1, 1, 1, 1)
    end
    for i, wall in ipairs(walls) do
        love.graphics.setColor(1, 1, 1, 1)
        love.graphics.rectangle("fill", wall.wallx, wall.wally, 10, wall.wallheight)
    end
end

function intro()
    love.graphics.draw(background, 0,0)
    love.graphics.setColor(255, 255, 255, light / 255)
    love.graphics.draw(image, 0, 0)
end


function displayPoints()
    love.graphics.setFont(smallfont)
    if areanuclear == 1 then 
        love.graphics.setColor(0,0,0,1)
    end
    if (potentialstrike1 == 1 and potentialnuke1 == 0 and player1reverbav == 0) then --FLAG: AVAILABLE SUPER
        if (player1striken == 0) then
            love.graphics.print(
                tostring(math.floor(player1nukescore) .. "[" .. p1control.super .. "]"),
                VIRTUAL_WIDTH / 2 - 500,
                VIRTUAL_HEIGHT / 60
            )
        else
            love.graphics.print(tostring("READY"), VIRTUAL_WIDTH / 2 - 500, VIRTUAL_HEIGHT / 60)
        end
    elseif (player1reverbav == 1 and potentialnuke1 == 0 ) then
        love.graphics.print(
            tostring(
                math.floor(player1nukescore) .. "[" .. p1control.super .. "]" .. " [" .. p1control.counter .. "]"
            ),
            VIRTUAL_WIDTH / 2 - 500,
            VIRTUAL_HEIGHT / 60
        )
    elseif (potentialnuke1 == 1) then
        love.graphics.setColor(255, 0, 0, 255)
        love.graphics.print(
            tostring(
                math.floor(player1nukescore) .. "[" .. p1control.super .. "]" .. " [" .. p1control.counter .. "]"
            ),
            VIRTUAL_WIDTH / 2 - 500,
            VIRTUAL_HEIGHT / 60
        )
        love.graphics.setColor(255, 255, 255, 255)
    elseif (potentialnuke1 == 1) then
        love.graphics.setColor(255, 0, 0, 255)
        love.graphics.print(
            tostring(
                math.floor(player1nukescore) .. "[" .. p1control.super .. "]" 
            ),
            VIRTUAL_WIDTH / 2 - 500,
            VIRTUAL_HEIGHT / 60
        )
        love.graphics.setColor(255, 255, 255, 255)
    else
        love.graphics.print(tostring(math.floor(player1nukescore)), VIRTUAL_WIDTH / 2 - 500, VIRTUAL_HEIGHT / 60)
    end
    if (potentialstrike2 == 1 and player2reverbav == 0) then
        if (player2striken == 0) then
            love.graphics.print(
                tostring(math.floor(player2nukescore) .. "[" .. p2control.super .. "]"),
                VIRTUAL_WIDTH / 2 + 430,
                VIRTUAL_HEIGHT / 60
            )
        else
            love.graphics.print(tostring("READY"), VIRTUAL_WIDTH / 2 + 430, VIRTUAL_HEIGHT / 60)
        end
    elseif (potentialnuke2 == 1) then
        love.graphics.setColor(255, 0, 0, 255)
        love.graphics.print(
            tostring(math.floor(player2nukescore) .. "[" .. p2control.super .. "] [" .. p2control.counter .. "]"),
            VIRTUAL_WIDTH / 2 + 400,
            VIRTUAL_HEIGHT / 60
        )
        love.graphics.setColor(255, 255, 255, 255)
    elseif (potentialnuke2 == 1 and maxBalls > 1) then 
        love.graphics.setColor(255, 0, 0, 255)
        love.graphics.print(
            tostring(math.floor(player2nukescore) .. "[" .. p2control.super .. "]"),
            VIRTUAL_WIDTH / 2 + 430,
            VIRTUAL_HEIGHT / 60
        )
        love.graphics.setColor(255, 255, 255, 255)       
    elseif (player2reverbav == 1 and potentialnuke2 == 0 ) then
        love.graphics.print(
            tostring(math.floor(player2nukescore) .. "[" .. p2control.super .. "] [" .. p2control.counter .. "]"),
            VIRTUAL_WIDTH / 2 + 400,
            VIRTUAL_HEIGHT / 60
        )
    else
        love.graphics.print(tostring(math.floor(player2nukescore)), VIRTUAL_WIDTH / 2 + 430, VIRTUAL_HEIGHT / 60)
    end
end

function hitIdentifier()
        if (gameMode == "practice") then
            MAP_TYPE = 0
            if ball[i].x > VIRTUAL_WIDTH * 0.99 then
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                if (ball[i].dx > 0) then
                    ball[i].x = ball[i].x - 20
                else
                    ball[i].x = ball[i].x + 20
                end
                ball[i].dx = -ball[i].dx
            end
        end
        if (MAP_TYPE == 1) then
            if
                ball[i].y < VIRTUAL_HEIGHT * 0.3 and ball[i].x > VIRTUAL_WIDTH * 0.5 and
                    ball[i].x < VIRTUAL_WIDTH * 0.5 + 5
                then
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                if (ball[i].dx > 0) then
                    ball[i].x = ball[i].x - 20
                else
                    ball[i].x = ball[i].x + 20
                end
                ball[i].dx = -ball[i].dx
            end
            if
                ball[i].y > VIRTUAL_HEIGHT * 0.7 and ball[i].x > VIRTUAL_WIDTH * 0.5 and
                    ball[i].x < VIRTUAL_WIDTH * 0.5 + 5
                then
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                if (ball[i].dx > 0) then
                    ball[i].x = ball[i].x - 20
                else
                    ball[i].x = ball[i].x + 20
                end
                ball[i].dx = -ball[i].dx
            end
        end
        if (MAP_TYPE == 2) then 
            for i, wall in ipairs(walls) do
                if
                    (ball[1].y > wall.wally and ball[1].y < wall.wally + wall.wallheight and
                        ball[1].x > wall.wallx - ballSpeed / 200 and
                        ball[1].x < wall.wallx + 10 + ballSpeed / 200)
                then
                    controllerSer()
                    soundtype = love.math.random(1, 5)
                    sounds["wallhit"]:setPitch(ballSpeed / 250)
                    sounds["wallhit"]:play()
                    if (ball[1].dx > 0) then
                        ball[1].x = ball[1].x - 1
                    else
                        ball[1].x = ball[1].x + 1
                    end
                    ball[1].dx = -ball[1].dx
                elseif
                    (ball[1].y > wall.wally - 15 and ball[1].y < wall.wally + wall.wallheight + 10 and
                        ball[1].x > wall.wallx and
                        ball[1].x < wall.wallx + 10)
                then
                    controllerSer()
                    soundtype = love.math.random(1, 5)
                    sounds["wallhit"]:setPitch(ballSpeed / 250)
                    sounds["wallhit"]:play()
                    if (ball[1].dy > 0) then
                        ball[1].y = ball[1].y - 1
                    else
                        ball[1].y = ball[1].y + 1
                    end
                    ball[1].dy = -ball[1].dy
                end
            end
        end
end 
function rules(query, i)
    if query == "p1hit" then 
        if gameMode == "normal" then  
        return ball[i]:collides(player1) 
        elseif gameMode == "reversegame" then 
        return ball[i].x < 0 and ball[i].disabled == false 
        end 
    end 
    if query == "p2hit" then 
        if gameMode == "normal" then 
            return ball[i]:collides(player2) 
        elseif gameMode == "reversegame" then 
            return ball[i].x > VIRTUAL_WIDTH-10 and ball[i].disabled == false 
        end
    end 
    if query == "p1miss" then 
        if gameMode == "reversegame" then  
            
            return ball[i]:collides(player1)
        elseif gameMode == "normal" then 
            return ball[i].x < -10 and ball[i].disabled == false 
        end
    end  
    if query == "p2miss" then 
        if gameMode == "reversegame" then 
            return ball[i]:collides(player2) 
        elseif gameMode == "normal" then 
            return ball[i].x > VIRTUAL_WIDTH and ball[i].disabled == false 
        end
    end 
end 
function clientsBaseGame(dt)
    if gameMode == "reverse" then 
        reversegame(dt)
    end 
    if player1nukescore > 300 then 
        player1nukescore = 300 
    end 
    if player2nukescore > 300 then 
        player2nukescore = 300 
    end
    speedControl()
    balancer()
    effectControl()
    if t < shakeDuration then
        t = t + dt
    end
    
    if (lastSentKeyP1 == p1control.up) then
        player1.dy = (paddle_SPEED + p2bonus) * -1
       --print("moving player1 up")
    elseif (lastSentKeyP1 == p1control.down) then
        player1.dy = paddle_SPEED + p2bonus
       --print("moving player1 down")
    else
        player1.dy = 0
       ----print("stopping player")
    end
    if ((love.keyboard.isDown(p2control.up) or sectortouched(1))) then
        player2.dy = (paddle_SPEED + p2bonus) * -1
    elseif ((love.keyboard.isDown(p2control.down)) or sectortouched(4)) then
        player2.dy = paddle_SPEED + p2bonus
    else
        player2.dy = 0
    end
   --print("T = " .. tostring(t))
    serveBot()
    if gameState == 'play' then 
        if (AGAINST_AI == 1) then
            AI(player2, maxBalls, AI_LEVEL)
        end
       --print(areanuclear .. striken .. player1score .. player2score)
        for i = 1, maxBalls do
            if rules("p1hit", i) then

                if (areanuclear == 0 and striken == 1 and (player1score > ptw*0.8 or player2score > ptw*0.8)) then
                   --print("Calling animation")
                    superanimator("tensehit", 1)
                   --print("AREA NUCLEAR?" .. areanuclear)
                end
                if gameMode == "practice" then
                    player1score = player1score + 1
                end
                t = 0
                if (ballSpeed > 200) then
                    shakeMagnitude = ballSpeed / 200
                else
                    shakeMagnitude = 0
                end
                shakeDuration = 1
                randomtext = love.math.random(1, #textphrases)
                TEXT = textphrases[randomtext]
                soundtype = love.math.random(1, 1.2)

                if (player1striken == 1) then
                    TEXT = "PLAYER 1 STRIKES"
                    ballSpeed = ballSpeed + player1nukescore
                    background_scroll_speed = ballSpeed / 20
                    potentialnuke1 = 0
                    player1striken = 0
                    player1nukescore = 0
                    potentialstrike1 = 0
                    striken = 1
                    if areanuclear == 0 then
                        sounds["striking"]:setPitch(ballSpeed / 250)
                        sounds["striking"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                    if areanuclear == 0 then 
                    superanimator("tensehit", 1)
                    end 
                else
                    if areanuclear == 0 then
                        sounds["beep"]:setPitch(ballSpeed / 250)
                        sounds["beep"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                end
                if (striken == 1) then
                    
                    player1nukescore = player1nukescore * 1.5
                    if (synctype == 0) then
                        paddle_SPEED = paddle_SPEED * 1.10
                    elseif (synctype == 1) then
                        paddle_SPEED = ballSpeed
                    end
                    if (synctype == 0) then
                        AI_SPEED = AI_SPEED * 1.10
                    end
                    if (synctype == 1) then
                        AI_SPEED = ballSpeed * 1.1 / 10
                    end
                    ballSpeed = ballSpeed * 1.10
                    background_scroll_speed = ballSpeed / 20
                end
                player1nukescore = player1nukescore + 10
                ball[i].dx = -ball[i].dx
                ball[i].x = player1.x + 30
            end
            if rules("p2hit", i) then
                --ameState = 'quickanim'
                t = 0
                shakeDuration = 1
                if
                    (areanuclear == 0 and
                        (striken == 1 and (player1score > ptw*0.8 or player2score > ptw*0.8)))
                 then
                   --print("AREA NUCLEAR?" .. areanuclear)
                    superanimator("tensehit", 2)
                end
                if (ballSpeed > 200) then
                    shakeMagnitude = ballSpeed / 200
                else
                    shakeMagnitude = 0
                end
                randomtext = love.math.random(1, #textphrases)
                TEXT = textphrases[randomtext]
                soundtype = love.math.random(1, 1.2)

                if (player2striken == 1) then
                    TEXT = "PLAYER 2 STRIKES"
                    ballSpeed = ballSpeed + player2nukescore
                    background_scroll_speed = ballSpeed / 20
                    striken = 1
                    player2striken = 0
                    potentialnuke2 = 0
                    player2nukescore = 0
                    potentialstrike2 = 0
                   --print("AREA NUCLEAR?" .. areanuclear)
                    if areanuclear == 0 then 
                    superanimator("tensehit", 2)
                    end
                    if areanuclear == 0 then
                        sounds["striking"]:setPitch(ballSpeed / 250)
                        sounds["striking"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                elseif (striken == 1) then
                    
                    player2nukescore = player2nukescore * 1.5
                    if (synctype == 0) then
                        paddle_SPEED = paddle_SPEED * 1.10
                    end
                    if (synctype == 1) then
                        paddle_SPEED = ballSpeed
                    end
                    if (synctype == 0) then
                        AI_SPEED = AI_SPEED * 1.10
                    end
                    if (synctype == 1) then
                        AI_SPEED = ballSpeed * 1.1 / 10
                    end
                    ballSpeed = ballSpeed * 1.10
                    background_scroll_speed = ballSpeed / 20
                    if areanuclear == 0 then
                        sounds["beep"]:setPitch(ballSpeed / 250)
                        sounds["beep"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                else
                    if areanuclear == 0 then
                        sounds["beep"]:setPitch(ballSpeed / 250)
                        sounds["beep"]:play()
                    else
                        sounds["nuclearhit"]:setPitch(1)
                        sounds["nuclearhit"]:play()
                    end
                end
                player2nukescore = player2nukescore + 10
                ball[i].dx = -ball[i].dx
                ball[i].x = player2.x - 30
                if ((love.keyboard.isDown(p2control.up)) or sectortouched(1)) then
                    select = math.random(1, 5)
                    if select == 1 then
                        ball[i].dy = -1
                    elseif select == 2 then
                        ball[i].dy = -1.2
                    elseif select == 3 then
                        ball[i].dy = -1.5
                    elseif select == 4 then
                        ball[i].dy = -1.8
                    elseif select == 5 then
                        ball[i].dy = -2
                    end
                elseif (love.keyboard.isDown(p2control.down) or sectortouched(4))then
                    select = math.random(1, 5)
                    if select == 1 then
                        ball[i].dy = 1
                    elseif select == 2 then
                        ball[i].dy = 1.2
                    elseif select == 3 then
                        ball[i].dy = 1.5
                    elseif select == 4 then
                        ball[i].dy = 1.8
                    elseif select == 5 then
                        ball[i].dy = 2
                    end
                else
                    if ball[i].dy < 0 then
                        select = math.random(1, 5)
                        if select == 1 then
                            ball[i].dy = -1
                        elseif select == 2 then
                            ball[i].dy = -1.2
                        elseif select == 3 then
                            ball[i].dy = -1.5
                        elseif select == 4 then
                            ball[i].dy = -1.8
                        elseif select == 5 then
                            ball[i].dy = -2
                        end
                    else
                        select = math.random(1, 5)
                        if select == 1 then
                            ball[i].dy = 1
                        elseif select == 2 then
                            ball[i].dy = 1.2
                        elseif select == 3 then
                            ball[i].dy = 1.5
                        elseif select == 4 then
                            ball[i].dy = 1.8
                        elseif select == 5 then
                            ball[i].dy = 2
                        end
                    end
                end
            end
            hitIdentifier()
            if ball[i].y <= 0 then
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                ball[i].y = 0
                ball[i].dy = -ball[i].dy
            end

            -- -4 to account for the ball's size
            if ball[i].y >= VIRTUAL_HEIGHT - 40 then
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                ball[i].y = VIRTUAL_HEIGHT - 40
                ball[i].dy = -ball[i].dy
               
            end
            --love.window.setTitle('Trying to update the ball')
            if timeIsSlow then
                if ballSpeed > originalSpeed / 3 then
                    paddle_SPEED = 300
                    ballSpeed = ballSpeed / (1 + (dt * 2))
                    background_scroll_speed = ballSpeed / 20
                end
                player1nukescore = player1nukescore - (dt * 50)
                if player1nukescore < 1 or ball[1].dx > 0 then
                    timeIsSlow = false
                    player1reverbav = false
                    ballSpeed = originalSpeed
                    background_scroll_speed = ballSpeed / 20
                    sounds["time"]:stop()
                    paddle_SPEED = originalPaddle
                end
            end
            if timeIsSlow2 then
                if ballSpeed > originalSpeed / 3 then
                    ballSpeed = ballSpeed / (1 + (dt * 2))
                    background_scroll_speed = ballSpeed / 20
                end
                player2nukescore = player2nukescore - (dt * 50)
                if player2nukescore < 1 or ball[1].dx < 0 then
                    paddle_SPEED = 300
                    timeIsSlow2 = false
                    player2reverbav = false
                    ballSpeed = originalSpeed
                    background_scroll_speed = ballSpeed / 20
                    sounds["time"]:stop()
                    paddle_SPEED = originalPaddle
                end
            end
            ball[i]:update(dt)
        end
    end
    goalManager()
    powerAvailability()
    player1:update(dt)
    player2:update(dt)
end 

function animateConnection()
    if GetIPType(IP) ~= 1 then 
        love.graphics.printf("WRONG SYNTAX", 0, VIRTUAL_HEIGHT-80, VIRTUAL_WIDTH, "center")
    else 
    counter = counter + 1 / love.timer.getFPS() 
    if counter < 0.8 then 
    love.graphics.printf("TRYING TO CONNECT.", 0, VIRTUAL_HEIGHT-80, VIRTUAL_WIDTH, "center")
    elseif counter < 1.6 then 
        love.graphics.printf("TRYING TO CONNECT..", 0, VIRTUAL_HEIGHT-80, VIRTUAL_WIDTH, "center")    
    elseif counter < 2.4 then 
        love.graphics.printf("TRYING TO CONNECT...", 0, VIRTUAL_HEIGHT-80, VIRTUAL_WIDTH, "center")
    else 
        love.graphics.printf("NO CONNECTION!", 0, VIRTUAL_HEIGHT-80, VIRTUAL_WIDTH, "center")
    end
end
end 
function GetIPType(ip)
    -- must pass in a string value
    if ip == nil or type(ip) ~= "string" then
        return 0
    end

    -- check for format 1.11.111.111 for ipv4
    local chunks = {ip:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")}
    if (#chunks == 4) then
        for _,v in pairs(chunks) do
            if (tonumber(v) < 0 or tonumber(v) > 255) then
                return 0
            end
        end
        return 1
    else
        return 0
    end

    -- check for ipv6 format, should be 8 'chunks' of numbers/letters
    local _, chunks = ip:gsub("[%a%d]+%:?", "")
    if chunks == 8 then
        return 2
    end

    -- if we get here, assume we've been given a random string
    return 3
end

function menuDemo(dt)
    paddle_SPEED = 200
    ballSpeed = 200
    background_scroll_speed = ballSpeed / 20
    if ball[1].dx > 0 then
    AI(player2, maxBalls, 1300)
    player1.goal = 360
    elseif ball[1].dx < 0 then 
    AI(player1, maxBalls, 1300)
    player2.goal = 360
    end 
    --print(neededTarget, neededTarget1)
   --print("menu demo active")
    ball[1]:update(dt)
    player1:update(dt)
    player2:update(dt)    
    if ball[1].x < player1.x+15 then 
        player1.y = ball[1].y-player1.height  
    end 
    if ball[1].x > player2.x-15 then 
        player2.y = ball[1].y-player2.height 
    end 
    if (MAP_TYPE == 2) then 
        for i, wall in ipairs(walls) do
            if
                (ball[1].y > wall.wally and ball[1].y < wall.wally + wall.wallheight and
                    ball[1].x > wall.wallx - ballSpeed / 200 and
                    ball[1].x < wall.wallx + 10 + ballSpeed / 200)
            then
                controllerSer()
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                if (ball[1].dx > 0) then
                    ball[1].x = ball[1].x - 1
                else
                    ball[1].x = ball[1].x + 1
                end
                ball[1].dx = -ball[1].dx
            elseif
                (ball[1].y > wall.wally - 15 and ball[1].y < wall.wally + wall.wallheight + 10 and
                    ball[1].x > wall.wallx and
                    ball[1].x < wall.wallx + 10)
            then
                controllerSer()
                soundtype = love.math.random(1, 5)
                sounds["wallhit"]:setPitch(ballSpeed / 250)
                sounds["wallhit"]:play()
                if (ball[1].dy > 0) then
                    ball[1].y = ball[1].y - 1
                else
                    ball[1].y = ball[1].y + 1
                end
                ball[1].dy = -ball[1].dy
            end
        end
    end
    if ball[1].x >= player2.x-7 then
        sounds["beep"]:setPitch(ballSpeed / 250)
        sounds["beep"]:play()
        select = math.random(1, 2)
    if ball[1].dy < 0 then
        select = math.random(1, 5)
        if select == 1 then
            ball[1].dy = -1
        elseif select == 2 then
            ball[1].dy = -1.2
        elseif select == 3 then
            ball[1].dy = -1.5
        elseif select == 4 then
            ball[1].dy = -1.8
        elseif select == 5 then
            ball[1].dy = -2
        end
    else
        select = math.random(1, 5)
        if select == 1 then
            ball[1].dy = 1
        elseif select == 2 then
            ball[1].dy = 1.2
        elseif select == 3 then
            ball[1].dy = 1.5
        elseif select == 4 then
            ball[1].dy = 1.8
        elseif select == 5 then
            ball[1].dy = 2
        end
    end
        ball[1].x = player2.x-8
        ball[1].dx = -ball[1].dx
    end 
    if ball[1].x <= player1.x+7 then
        sounds["beep"]:setPitch(ballSpeed / 250)
        sounds["beep"]:play()
        select = math.random(1, 2)
    if ball[1].dy < 0 then
        select = math.random(1, 5)
        if select == 1 then
            ball[1].dy = -1
        elseif select == 2 then
            ball[1].dy = -1.2
        elseif select == 3 then
            ball[1].dy = -1.5
        elseif select == 4 then
            ball[1].dy = -1.8
        elseif select == 5 then
            ball[1].dy = -2
        end
    else
        select = math.random(1, 5)
        if select == 1 then
            ball[1].dy = 1
        elseif select == 2 then
            ball[1].dy = 1.2
        elseif select == 3 then
            ball[1].dy = 1.5
        elseif select == 4 then
            ball[1].dy = 1.8
        elseif select == 5 then
            ball[1].dy = 2
        end
    end
        ball[1].x = player1.x+8
        ball[1].dx = -ball[1].dx
    end
    
    if ball[1].y <= 0 then
        soundtype = love.math.random(1, 5)
        sounds["wallhit"]:setPitch(ballSpeed / 250)
        sounds["wallhit"]:play()
        ball[1].y = 0
        ball[1].dy = -ball[1].dy
    end

    -- -4 to account for the ball's size
    if ball[1].y >= VIRTUAL_HEIGHT - 40 then
        soundtype = love.math.random(1, 5)
        sounds["wallhit"]:setPitch(ballSpeed / 250)
        sounds["wallhit"]:play()
        ball[1].y = VIRTUAL_HEIGHT - 40
        ball[1].dy = -ball[1].dy
       
    end
end 
function effectControl()
    for i, explosion in ipairs(explosions) do 
        if explosion.killed then 
            table.remove(explosions, i)
            --print("buried the body")
        end
    end
end 
--[[ 
THE SHIP FUNCTIONALITY HAS BEEN SCRAPPED AND WONT! BE COMING BACK.
function shipManager(dt)
    ship_timer = ship_timer + dt 
    if ship_timer > ship_goal then 
        print("summoning ship")
        ship_timer = 0
        ship_goal = love.math.random(2,20)
        table.insert(ships, ship())
    end 
    for k, ship in pairs(ships) do 
        ship:update(dt)

        if ship.y < -ship.height and ship.direction == 0 then 
            table.remove(ships, k)
        elseif ship.y > VIRTUAL_HEIGHT + ship.height and ship.direction == 1 then 
            table.remove(ships, k)
        end
    end
end 
]]