Class = require 'class'
require 'paddle'
require 'simpleScale'
require 'TSerial'
require 'eball'
require 'fullScreener'
require 'mainMenu'
require 'music'
local serialize = require 'ser'
local shader_code = [[
vec4 effect(vec4 color, Image image, vec2 uvs, vec2 screen_coords) {
    vec4 pixel = Texel(image,uvs);
    return pixel * color;
}
]]
timeIsSlow = false 
timeIsSlow2 = false 
originalSpeed = 200
explosionRange = 0
blockinput = false
wall1width = 30
nuclearanimation = 3
easternum = 0
ball_DIR = 0
RED = 255
hitNum = {}
hitNum[1] = 0
hitNum[2] = 0
hitNum[3] = 0
hitNum[4] = 0
p1bonus = 0
p2bonus = 0
hitNum[5] = 0
hitNum[6] = 0
GREEN = 255
BLUE = 255
updateTEXT = 'Chalkboard Update'
maxBalls = 1
playerCount = 1
WINDOW_WIDTH = 1280
WINDOW_HEIGHT = 720
player1reverbav = 0
playertext = '1v1'
player2reverbav = 0
elapsed = 0
rotation = 0
TEXT = 'Nuclear Pong'
VIRTUAL_WIDTH = 1280
VIRTUAL_HEIGHT = 720
currentKey = " "
ptw = 10
danger = 'none'
danger2 = 'none'
nuckemodactive = 0
maxspeed = 700
DIFFERENCE_X = 1
DIFFERENCE_Y = 1
paddle_SPEED = 20
textamount = 15
AI_STRIKEMOD = 1000
resolutionWin = 0
AGAINST_AI = 0
RESOLUTION_SET = 0
AI_NUKEMOD = 1000
animstart = true
AI_SPEED = 30
craz = 0
AI_LEVEL = 500
isFullscreen = 0
prtext = 'Easy'
MAP_TYPE = 2
difficultyl = 300
req = 'pp'
ballSet = 200
p1control = {up = 'a', down = 'z', super = 's', counter = 'x'}
p2control = {up = ';', down = '.', super = 'l', counter = ','}
synctext = "Independent"
synctype = 0
function newButton(text, fn)
    return {
        text = text, 
        fn = fn,
        now = false,
        last = false
    }
end
function love.keyboard.mouseWasReleased()
    return love.keyboard.mouseisReleased
end
function autoSave(dt)
    autoTimer = autoTimer + dt
end

function balancer()
    if (player2score == 9 or player1score == 9) then 
        shakeDuration = 10
       -- love.window.setTitle("ALMOST WIN")
    end
        if (player1score < player2score) then 
            p1bonus = (player2score - player1score) * 5
        else
            p1bonus = 0
        end
                if (player2score < player1score) then 
            p2bonus = (player1score - player2score) * 5
        else
            p2bonus = 0
        end


    end
function newWall(wallx, wally, wallwidth, wallheight)
    return {
        wallx = wallx,
        wally = wally,
        walwidth = wallwidth,
        wallheight = wallheight
    }
end
speedParameters = {}
buttons = {}
difbuttons = {}
settings = {}
walls = {}
editorpicks = {}
controlSettings = {}
modeSelectorButtons= {}
pracdiff = {}
playerCountButtons = {}
function controlChanger()
    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 love.load()
    simpleScale.setWindow(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT)
    configfile = io.open('config.lua', "r")
    configsave = io.open('config.lua', "w")
    shader = love.graphics.newShader(shader_code)
    time_1 = 0

--load

testwalls = love.filesystem.load('save.lua')() 
if testwalls ~= nil then 
    walls = love.filesystem.load('save.lua')()
end



    light = 0
    image = love.graphics.newImage("Madi.png")
    table.insert(editorpicks, newButton("C", function() for k in pairs (walls) do walls[k] = nil end end))
    table.insert(editorpicks, newButton("S", function() love.filesystem.write('save.lua', serialize(walls)) end))
    table.insert(editorpicks, newButton("L", function() walls = love.filesystem.load('save.lua')() end))
    table.insert(buttons, newButton("Singleplayer", function() gameState = 'gameMode' end))
    table.insert(buttons, newButton("Multiplayer", function() gameState = 'multiMode' end))
    table.insert(buttons, newButton("Settings", function() AGAINST_AI = 0 gameState = 'windowsettings' end))
    table.insert(buttons, newButton("Exit", function() love.event.quit(0) end))
    table.insert(difbuttons, newButton("Easy", function() hardmanager('easy') end))
    table.insert(difbuttons, newButton("Normal", function() hardmanager('normal') end))
    table.insert(difbuttons, newButton("Hard", function() hardmanager('hard') end))
    table.insert(settings, newButton("Change Map", function() MAP_TYPE = MAP_TYPE + 1 end))
    table.insert(settings, newButton("Toggle Fullscreen", function() myscreen:toggle(VIRTUAL_HEIGHT, VIRTUAL_WIDTH) DIFFERENCE_X = myscreen.c DIFFERENCE_Y = myscreen.d end)) 
    table.insert(settings, newButton("Editor", function() gameState = 'editor' end))
    table.insert(settings, newButton("Speed Settings", function() gameState = 'speedSettings' end))
    table.insert(settings, newButton("Control Settings", function() gameState = 'controlSettings' end))
    table.insert(settings, newButton("Back to Menu", function() gameState = 'menu' end))
    table.insert(speedParameters, newButton("Back to Menu", function() gameState = 'windowsettings' end))
    --table.insert(speedParameters, newButton("Ball Speed: ", function() speedSetter('ball') end))
    table.insert(playerCountButtons, newButton("Ball Speed: ", function() speedSetter('ball') end))
    --table.insert(speedParameters, newButton("snc", function() speedSetter('snc') end))
    table.insert(playerCountButtons, newButton("snc", function() speedSetter('snc') end))
    table.insert(speedParameters, newButton("NUCLEAR MODE", function() speedSetter('nuclearmod') end))  
    table.insert(controlSettings, newButton("1up", function() gameState = 'assign' req = 'p1up' end))   
    table.insert(controlSettings, newButton("1down", function() gameState = 'assign' req = 'p1down' end))
    table.insert(controlSettings, newButton("1special",function() gameState = 'assign' req = 'p1super' end))
    table.insert(controlSettings, newButton("1ct", function() gameState = 'assign' req = 'p1ct' end))
    table.insert(controlSettings, newButton("2up", function() gameState = 'assign' req = 'p2up' end))   
    table.insert(controlSettings, newButton("2down", function() gameState = 'assign' req = 'p2down' end))
    table.insert(controlSettings, newButton("2special", function() gameState = 'assign' req = 'p2super' end))
    table.insert(controlSettings, newButton("2ct", function() gameState = 'assign' req = 'p2ct' end))
    table.insert(controlSettings, newButton("Default", function() p1control = {up = 'a', down = 'z', super = 's', counter = 'x'} p2control = {up = ';', down = '.', super = 'l', counter = ','} end))
    table.insert(controlSettings, newButton("Return", function() gameState = 'windowsettings' end))
    table.insert(modeSelectorButtons, newButton("Nuclear Pong", function() gameState = 'difficulty' end))
    table.insert(modeSelectorButtons, newButton("Nuclear Practice", function() gameState = 'prdiff' end))
    table.insert(modeSelectorButtons, newButton("Main Menu", function() gameState = 'menu' end))
    table.insert(pracdiff, newButton("Silverblade", function() speedSetter('practice') end))
    table.insert(pracdiff, newButton("Return", function() speedSetter('reset') gameState = 'gameMode' end))
    table.insert(pracdiff, newButton("Go!", function() gameMode = 'practice' hardmanager('practice') end))
    --table.insert(playerCountButtons, newButton("1v1", function() speedSetter('pc') end))
    table.insert(playerCountButtons, newButton("ballCount", function() speedSetter('ballz') end))
    table.insert(playerCountButtons, newButton("Return", function() speedSetter('reset') gameState = 'menu' end))
    table.insert(playerCountButtons, newButton("ptw", function() speedSetter('ptw') end))
    table.insert(playerCountButtons, newButton("Play", function() AGAINST_AI = 0 gameState = '1serve' end))


       
    --table.insert(speedParameters, newButton("Ball Speed: ", function() speedSetter() end))

         
    love.window.setTitle('NUCLEAR PONG')
    textphrases = {
        "Amazing", "Superb", "Absolutely beautiful!", "Awesome", "Look at That!", "Great", "Nice", "Boom!", "Dangerous!", "Astonishing!", "u/ebernerd saved me", "Absolutely Wonderful!", "Exsquisite", "Delicate", "Pow!", "Great Hit", "all hail nazarbayev"
    }
    sounds = {
        ['updateMusic'] = love.audio.newSource("audio/theme1.mp3", "static"),
        ['gayTheme'] = love.audio.newSource("audio/theme2.mp3", "static"),
        ['gayTheme2'] = love.audio.newSource("audio/theme3.mp3", "static"),
        ['gayTheme3'] = love.audio.newSource("audio/theme4.mp3", "static"),
        ['beep'] = love.audio.newSource("audio/hit1.mp3", "static"),
        ['wallhit'] = love.audio.newSource("audio/hit2.wav", "static"),
        ['win'] = love.audio.newSource("win.wav", "static"),
        ['score'] = love.audio.newSource("audio/score.wav", "static"),
        ['nuke'] = love.audio.newSource("audio/bomb.wav", "static"),
        ['striking'] = love.audio.newSource("audio/superhit.wav", "static"),
        ['nuclearhit'] = love.audio.newSource("audio/hit1.mp3", "static"),
        ['time'] = love.audio.newSource("audio/time.wav", "static")
    }
	love.graphics.setDefaultFilter('nearest', 'nearest')
	--comic sans lmao
    math.randomseed(os.time())
	smallfont = love.graphics.newFont('font.ttf', 30)
    scorefont = love.graphics.newFont('font.ttf', 90)
    love.graphics.setFont(smallfont)

	--push:setupScreen(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, {
	--	fullscreen = isFullscreen,
	--	resizable = true,
	--	vsync = true,
	--})
player1score = 0
player2score = 0
areanuclear = 0
player1nukescore = 0
player2nukescore = 0
striken = 0
soundtype = 1
soundturn = 1
potentialstrike1 = 0
potentialstrike2 = 0
potentialnuke1 = 0
potentialnuke2 = 0
player1striken = 0
player2striken = 0
randomtext = 0
selecting = 0
number = 0
elec = 1
INDIC = {
    '', '', '', ''
}
--playe1nuke
player1 = paddle(0,30,10,100, 1)
player2 = paddle(VIRTUAL_WIDTH * 0.99, VIRTUAL_HEIGHT * 0.88, 10, 100, 2)
player3 = paddle(5000, 5000, 10, 100)
player4 = paddle(5000, 5000, 10, 100)
ball = {}
ball[1] = eball(VIRTUAL_WIDTH / 2 , VIRTUAL_HEIGHT / 2 - 2, 16, 16)
ball[2] = eball(VIRTUAL_WIDTH / 1.9 , VIRTUAL_HEIGHT / 2 - 2, 16, 16)
ball[3] = eball(VIRTUAL_WIDTH / 1.8, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
ball[4] = eball(VIRTUAL_WIDTH / 2.2, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
ball[5] = eball(VIRTUAL_WIDTH / 2.1, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
myscreen = fullScreener(RESOLUTION_SET, isFullscreen, DIFFERENCE_X, DIFFERENCE_Y)
mymenu = mainMenu()

ballSpeed = 200


ballDX = math.random(2) == 1 and 100 or -100
ballDY = math.random(-50, 50)

gameState = 'animation'
end
t = 0
shakeDuration = 0
shakeMagnitude = 1
function startShake(duration, magnitude)
    t, shakeDuration, shakeMagnitude = 0, duration or 1, magnitude or 5
end
function displayFPS()
--love.window.setTitle(maxBalls)
end

function speedControl()
	if (ballSpeed > maxspeed and gameState == 'play') then
		ballSpeed = maxspeed
	end
end

function love.update(dt)
    displayFPS()
    if areanuclear == 1  then 
        if nuclearanimation > 0 then 
        gameState = 'nuclearExplosion'
        nuclearanimation = nuclearanimation - dt
        explosionRange = explosionRange + dt*24
        elseif (gameState ~= 'play') then 
        gameState = 'play'
        explosionRange = 0
        end
    end
    if player1nukescore > 300 then 
        player1nukescore = 300 end 
    if player2nukescore > 300 then 
        player2nukescore = 300 end
	speedControl()
    balancer()
    dangerChecker()
	musicController('norm', 1)
	palleteController()
        if (gameState == 'animation') then 
            animator(dt)
    end
	    if t < shakeDuration then
        t = t + dt
    end
        elapsed = elapsed + dt  
    rotation = math.sin(elapsed * 2.5) * 0.7
   -- if (gameState == 'quickanim') then 
   -- time_1 = time_1 + dt
   -- light = 255 - time_1 * 150
   -- if (light < 0) then 
    --	time_1 = 0
    --	light = 0
    --    gameState = 'play'
    --end    	
    --	end
    for i=1, maxBalls do
    if (AGAINST_AI == 1 or gameState == 'start') then 
        for i = 1, maxBalls do
        if (ball[i].y - player2.y >= 50 and player2.x - ball[i].x < AI_LEVEL) then 
            player2.dy = AI_SPEED
        elseif (player2.y - ball[i].y >= -20 and player2.x - ball[i].x < AI_LEVEL) then 
            player2.dy = -AI_SPEED
        else 
            player2.dy = 0
        end
        if difficultyl == 350 and player2reverbav == true and VIRTUAL_WIDTH - ball[i].x < 90 and math.abs(ball[i].y - player2.y) > 150 then 
            sounds["time"]:play()  player2reverbav = false timeIsSlow2 = true originalPaddle = paddle_SPEED originalSpeed = ballSpeed player2reverbav = 0 potentialnuke2 = 0 potentialstrike2 = 0
        end

        if (player2nukescore > AI_STRIKEMOD and striken == 0)
            then 
                player2striken = 1
        elseif (player2nukescore > AI_NUKEMOD and striken == 1)
            then 
         if (areanuclear == 1) then maxspeed = maxspeed + 50 end
        sounds['nuke']:play()
        potentialstrike2 = 0
        areanuclear = 1
        ballSpeed = ballSpeed * 2
        if (synctype == 0)
        	then 
        paddle_SPEED = paddle_SPEED * 2 end
    if (synctype == 1)
    	then 
            paddle_SPEED = ballSpeed/10
            
    	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
        player2reverbav = 0
        potentialnuke2 = 0
    end
    end


            
    end
    if (ball[i].x < 0 - ballSpeed*0.5) then 
        if (gameMode ~= 'practice') then
        sounds['score']:play()
    end
            if (nuckemodactive == 0) then 
    areanuclear = 0
    nuclearanimation = 3
end
        striken = 0
        player1striken = 0
        player2striken = 0

        ballSpeed = ballSet
                if (synctype == 0)
        	then 
        paddle_SPEED = ballSet/10 end
        if (synctype == 1)
    	then 
    		paddle_SPEED = ballSpeed/10
    	end

        AI_SPEED = difficultyl/10
        player2score = player2score + 1
        if (player2score ==ptw and gameMode ~= 'practice') then
            for i = 1, maxBalls do
            ball[i]:reset(i)
        end
            sounds['win']:play() 
            gameState = 'done'
            TEXT = 'Player 2 Won!'
        else 
        gameState = '1serve'
        serveBot()
        for i = 1, maxBalls do
        ball[i]:reset(i)
    end
    end
    end
    if (ball[i].x > VIRTUAL_WIDTH + ballSpeed*0.5) then

        sounds['score']:play()
            if (nuckemodactive == 0) then 
    areanuclear = 0
    nuclearanimation = 3
end
        striken = 0
        player1striken = 0
        player2striken = 0
        ballSpeed = ballSet 

                if (synctype == 0)
        	then 
        paddle_SPEED = ballSet/10 
        AI_SPEED = ballSet/10 end
    if (synctype == 1)
    	then 
    		paddle_SPEED = ballSpeed/10
    		AI_SPEED = ballSpeed/10
    	end

        AI_SPEED = difficultyl/10
        player1score = player1score + 1
        if (player1score == ptw) then 
       
            ball[i]:reset(i)
    
            sounds['win']:play()
            gameState = 'done'
            TEXT = 'Player 1 Won!'
        else 

        gameState = '2serve'

        serveBot()
    
        ball[i]:reset(i)
    
end
    end
    end

    if (player1nukescore >= 20 and player1nukescore < 140) then
        potentialstrike1 = 1
        if (love.keyboard.isDown(p1control.super)) then
        player1striken = 1
        player1reverbav = 0
        --player1nukescore = 0
        end
    end
    if (player1nukescore >= 140) and timeIsSlow2 == false and timeIsSlow == false and maxBalls == 1 and ball[1].x < VIRTUAL_WIDTH/2 then player1reverbav = 1 if love.keyboard.isDown(p1control.counter) then powerControl(1, 'special') end end
    if (player1nukescore >= 200) then
        --sounds['nukeready']:play()
        potentialnuke1 = 1
        if (love.keyboard.isDown(p1control.super)) then
            sounds['nuke']:play()
            if areanuclear == 1 then maxspeed = maxspeed + 50 end
        areanuclear = 1
        potentialstrike1 = 0
        striken = 0
        ballSpeed = ballSpeed * 2
                if (synctype == 0)
        	then 
        paddle_SPEED = paddle_SPEED * 2 end
     if (synctype == 1)
    	then 
    		paddle_SPEED = ballSpeed/10
    	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 <= 140) then
        potentialstrike2 = 1 
        if (AGAINST_AI == 0) then    
        if (love.keyboard.isDown(p2control.super)) then 
        player2striken = 1
                player2reverbav = 0

        end
    end
    end
    if (player2nukescore >= 140) and timeIsSlow == false and timeIsSlow2 == false and maxBalls == 1 and ball[1].x > VIRTUAL_WIDTH/2 then player2reverbav = 1 
    	if love.keyboard.isDown(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
       -- sounds['nukeready']:play()
        potentialnuke2 = 1
        if (love.keyboard.isDown(p2control.super) and AGAINST_AI == 0) then
            sounds['nuke']:play()
            if areanuclear == 1 then maxspeed = maxspeed + 50 end
        potentialstrike2 = 0
        areanuclear = 1
                player2reverbav = 0
        --player2nukescore = 0
        ballSpeed = ballSpeed * 2
                if (synctype == 0)
        	then 
        paddle_SPEED = paddle_SPEED * 2 end
    if (synctype == 1)
    	then 
    		paddle_SPEED = ballSpeed/10
    	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  


        if (love.keyboard.isDown(p1control.up)) 
        then
        player1.dy = (paddle_SPEED + p1bonus) * -1
        elseif (love.keyboard.isDown(p1control.down))
        then 
        player1.dy = paddle_SPEED + p1bonus

        else
        player1.dy = 0
    end
    if (AGAINST_AI == 0) then 
        if (love.keyboard.isDown(p2control.up)) 
        then
        player2.dy = (paddle_SPEED + p2bonus) * -1
        elseif (love.keyboard.isDown(p2control.down)) 
        then
        player2.dy = paddle_SPEED + p2bonus
        else 
        player2.dy = 0
        end    
    end
        if gameState == 'play' then
            --love.window.setTitle('VOID')
            for i = 1, maxBalls do
            if ball[i]:collides(player1) then
                --gameState = 'quickanim'
                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
                    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
                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.2
                        if (synctype == 0)
        	then 
        paddle_SPEED = paddle_SPEED * 1.10
    elseif (synctype == 1)
    	then 
    		paddle_SPEED = ballSpeed / 10
    	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
                end 
                player1nukescore = player1nukescore + 10
                ball[i].dx = -ball[i].dx
                ball[i].x = player1.x + 30
                
                if (love.keyboard.isDown(p1control.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 love.keyboard.isDown(p1control.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
            if ball[i]:collides(player3) then
                --gameState = 'quickanim'
                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
                    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
                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 /10 
        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
                end 
                player1nukescore = player1nukescore + 10
                ball[i].dx = -ball[i].dx
                ball[i].x = player1.x + 30
                
                if (love.keyboard.isDown(p1control.up)) then 
                    ball[i].dy = math.random(-2, -1)
                elseif love.keyboard.isDown(p1control.down) then 
                    ball[i].dy = math.random(1, 2)
                else 
                if ball[i].dy < 0 then 

                    ball[i].dy = math.random(-2, -1)
                else
                    ball[i].dy = math.random(1, 2)
                end
            end
            end
            if ball[i]:collides(player2) then 
                --ameState = 'quickanim'
                t = 0
                shakeDuration = 1
                                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
                    striken=1
                    player2striken = 0
                    potentialnuke2 = 0
                    player2nukescore = 0
                    potentialstrike2 = 0
                    
                                	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/10 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
                                                	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 AI_SPEED < 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 
                elseif love.keyboard.isDown(p2control.down) or AI_SPEED > 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 
                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 ball[i]:collides(player4) then 
                --ameState = 'quickanim'
                t = 0
                shakeDuration = 1
                                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
                    striken=1
                    player2striken = 0
                    potentialnuke2 = 0
                    player2nukescore = 0
                    potentialstrike2 = 0
                    
                                    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/10 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
                                                    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 AI_SPEED < 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 
                elseif love.keyboard.isDown(p2control.down) or AI_SPEED > 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 
                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 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 = 30
                    ballSpeed = ballSpeed / (1+(dt*2))
                end
                player1nukescore = player1nukescore - (dt*50) 
                if player1nukescore < 1 or ball[1].dx > 0 then
                    timeIsSlow = false 
                    player1reverbav = false
                    ballSpeed = originalSpeed
                    sounds["time"]:stop()
                    paddle_SPEED = originalPaddle
                end 
            end
            if timeIsSlow2 then  
                if ballSpeed > originalSpeed/3 then 
                    ballSpeed = ballSpeed / (1+(dt*2))
                end
                player2nukescore = player2nukescore - (dt*50) 
                if player2nukescore < 1 or ball[1].dx < 0 then
                    paddle_SPEED = 30
                    timeIsSlow2 = false 
                    player2reverbav = false
                    ballSpeed = originalSpeed
                    sounds["time"]:stop()
                    paddle_SPEED = originalPaddle
                end 
            end
            ball[i]:update(dt)
        end
        end
    
        player1:update(dt)
        player2:update(dt) 
        player3:update(dt)
        player4:update(dt)
        
    end
    function wallbreaker(x,y)
        if (gameState == 'editor') then 
    for i, wall in ipairs(walls) do
        

    if math.abs(wall.wallx - x) < 10  and math.abs(wall.wally - y) < 10 
        then 
            table.remove(walls, i)
        end
    end 
end
end
function editor()
    if (gameState == 'editor')
        then 
            local mx, my = love.mouse.getPosition()
            mx = mx * DIFFERENCE_X
            my = my * DIFFERENCE_Y
            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
            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
            
            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
end
function hardmanager(diff)
 selecting = 1
 if (diff == 'easy')
    then 
    INDIC[1] = '>'
    AGAINST_AI = 1
    AI_SPEED = ballSet/10
    AI_STRIKEMOD = 100
    AI_NUKEMOD = 1000
    difficultyl = 200
    selecting = 0
    gameState = '1serve'
end
 if (diff == 'normal')
    then 
    INDIC[2] = '>'
    AI_SPEED = ballSet/10
    AI_LEVEL = 500
    AI_NUKEMOD = 250
    AI_STRIKEMOD = 60
    AGAINST_AI = 1
    difficultyl = 300
    selecting = 0
    gameState = '1serve'
end
  if (diff == 'hard')
    then 
    INDIC[3] = '>'
    AI_SPEED = ballSpeed * 1.1 + 50 
    AI_SPEED = AI_SPEED / 10
    AI_LEVEL = 700
    AI_NUKEMOD = 200
    AI_STRIKEMOD = 20
    selecting = 0
    difficultyl = 350
    AGAINST_AI = 1
    gameState = '1serve'
end
if (diff == 'practice') then 
    INDIC[3] = '>'
    AI_SPEED = ballSpeed * 500 + 50
    AI_SPEED = AI_SPEED / 10
    AI_LEVEL = 700
    AI_NUKEMOD = 9000000000
    AI_STRIKEMOD = 90000000
    selecting = 0
    difficultyl = 350
    AGAINST_AI = 1
    gameState = '1serve'    
    end
end

    
function dangerChecker()
if (p1control.up == p1control.down) then danger = '1up' danger2 = '1down' 
elseif (p1control.up == p1control.super) then danger = '1up' danger2 = '1special' 
elseif (p1control.up == p1control.counter) then danger = '1up' danger2 = '1ct'  
elseif (p1control.down == p1control.super) then danger = '1down' danger2 = '1special' 
elseif (p1control.down == p1control.counter) then danger = '1ct' danger2 = '1down'
elseif (p1control.super == p1control.counter) then danger = '1special' danger2 = '1ct' 
elseif (p2control.down == p2control.up) then danger = '2down' danger2 = '2up' 
elseif (p2control.down == p2control.super) then danger = '2down' danger2 = '2special'
elseif (p2control.down == p2control.counter) then danger = '2down' danger2 = '2ct'
elseif (p2control.up == p2control.super) then danger = '2up' danger2 = '2special'
elseif (p2control.up == p2control.counter) then danger = '2ct' danger2 = '2up'    
elseif (p2control.super == p2control.counter) then danger = '2special' danger2 = '2ct'  

else
    danger = "none"
    danger2 = "none"
end


end
function love.keypressed(key)
    if gameState == 'assign' then 
        if (req == 'p1up') then p1control.up = key
    currentKey = key
    --love.window.setTitle(key)
    gameState = 'controlSettings'
end
        if (req == 'p2up') then p2control.up = key
    currentKey = key
    --love.window.setTitle(key)
    gameState = 'controlSettings'
end
        if (req == 'p1down') then p1control.down = key
    currentKey = key
    --love.window.setTitle(key)
    gameState = 'controlSettings'
end
        if (req == 'p2down') then p2control.down = key
    currentKey = key
   -- love.window.setTitle(key)
    gameState = 'controlSettings'
end
        if (req == 'p1super') then p1control.super = key
    currentKey = key
   -- love.window.setTitle(key)
    gameState = 'controlSettings'
end
        if (req == 'p2super') then p2control.super = key
    currentKey = key
   -- love.window.setTitle(key)
    gameState = 'controlSettings'
end
        if (req == 'p1ct') then p1control.counter = key
    currentKey = key
  --  love.window.setTitle(key)
    gameState = 'controlSettings'
end
        if (req == 'p2ct') then p2control.counter = key
    currentKey = key
    --love.window.setTitle(key)
    gameState = 'controlSettings'
end
    end
	if key == 'escape' then 
		TEXT = 'Escape Key'
		love.event.quit()
    elseif key == 'enter' or key == 'return' then
       
    if gameState == 'start' then 
        resettinggenius()
    gameState = 'menu'
    hardmanager()
elseif (gameState == 'done') then 
    if (player1score > player2score) then 
        gameState = '2serve'
           potentialnuke1 = 0
    potentialnuke2 = 0
    striken = 0
    if (nuckemodactive == 0) then 
    areanuclear = 0
    nuclearanimation = 3
end
    potentialstrike1 = 0
    potentialstrike2 = 0
    player1nukescore = 0
    player2nukescore = 0
    else 
        gameState = '1serve'
    resettinggenius()
    for i = 1, maxBalls do 
    ball[i]:reset(i)
end
   end
    else
        gameState = 'menu'
        if (love.math.random(0, 10) == 1)
            then 
                TEXT = "Nuclear Ching Chong"
        else 
        TEXT = 'Nuclear Pong'
    end
        resettinggenius()
        for i = 1, maxBalls do
        ball[i]:reset(i)
    end
    end
end

end

function love.keyreleased(key) 
    currentKey = " "

    end
function speedSetter(requesttype)
	if (requesttype == 'ball') then 	
		if (ballSet > 550) then 
		ballSet = 0
		paddle_SPEED = 0
		
	else 
		ballSet = ballSet + 50
		paddle_SPEED = paddle_SPEED + 5
    end
    ballSpeed = ballSet
	end
	if (requesttype == 'snc') then
		synctype = synctype + 1
		if (synctype > 1) then 
			synctype = 0
		end
	   
	   if synctype == 0 then synctext = 'Independent' end
	   if synctype == 1 then synctext = 'Synchronised' end
	end
	if (requesttype == 'nuclearmod')
		then
			
		nuckemodactive = nuckemodactive + 1
		if (nuckemodactive > 1) then  

			nuckemodactive = 0		
		end
		if (nuckemodactive == 0)
			then 
            areanuclear = 0
            nuclearanimation = 3
			ballSet = 200 
			TEXT = "Nuclear Pong"

            synctype = 0
            maxspeed = 700
            synctext = 'Independent'
            paddle_SPEED = ballSet/10
            AI_SPEED = ballSet/10

		end
		if (nuckemodactive == 1)
			then
			areanuclear = 1
			ballSet = 2000
            maxspeed = 2000
            paddle_SPEED = ballSet/10
            AI_SPEED = ballSet/10
            synctext = "death is imminent"
		end
		ballSpeed = ballSet
	end
    if (requesttype == 'practice') then 
    if (ballSpeed > 999) then 
    ballSpeed = 200
    ballSet = 200
    end
    if (ballSpeed > 799) then 
    prtext = 'Insane'
    maxBalls = 5
elseif ballSpeed > 599 then 
    prtext = 'Hard'
    maxBalls = 4
elseif ballSpeed > 399 then 
    prtext = 'Normal'
    maxBalls = 3
elseif ballSpeed > 199 then 
    prtext = 'Easy'
    maxBalls = 3
end
    ballSpeed = ballSpeed + 200
    ballSet = ballSet + 200
    end
    if (requesttype == 'reset')
        then
        ballSpeed = 200
        ballSet = 200
        synctype = 0
        prtext = 'Easy' 
        maxBalls = 1
        end
    if (requesttype == 'pc') then 
        if (playerCount == 2) then 
    playerCount = 1
    playertext = '1v1'
    elseif (playerCount == 1) then 
    playerCount = playerCount + 1
    player3.x = player1.x + VIRTUAL_WIDTH / 2
    player3.y = player3.y
    playertext = '2v2'
end


    end
    if (requesttype == 'ballz') then 
if (maxBalls > 1) then 
    maxBalls = 1
    --love.window.setTitle("more than 4")
    else
    maxBalls = maxBalls + 1
end

    end
    if requesttype == 'ptw' then 
        if ptw == 10 then 
            ptw = 1
        else
            ptw = ptw + 1
        end
    end

	end

function gameModeChanger()
if (gameState == 'gameMode') then  
 local button_width = VIRTUAL_WIDTH * (1/3)
        local BUTTON_HEIGHT = 50
        local margin = 20
        local hot = false
        local cursor_y = 0
        local total_height = (BUTTON_HEIGHT + margin) * #buttons
        for i, button in ipairs(modeSelectorButtons) do 
            button.last = button.now
            local bx = (VIRTUAL_WIDTH*0.5) - (button_width * 0.5)
            local by = (VIRTUAL_HEIGHT * 0.5) - (total_height * 0.5) + cursor_y
            local color = {255, 255, 255, 255}
            local mx, my = love.mouse.getPosition()
            mx = mx * DIFFERENCE_X
            my = my * DIFFERENCE_Y
            hot = (mx > bx and mx < bx + button_width and my > by and my < by + BUTTON_HEIGHT) and i
            if (hot == i) then 
                color = {10, 10, 0, 255}
            end
            button.now = love.mouse.isDown(1)
            if button.now and not button.last and hot == i then 
                                love.graphics.setColor(0,0,0,1)
                love.graphics.rectangle("fill", 0, 0, VIRTUAL_WIDTH, VIRTUAL_HEIGHT)
                sounds['wallhit']:play()
             button.fn()
         end
            love.graphics.setColor(unpack(color))
            love.graphics.rectangle("fill", bx, by, button_width, BUTTON_HEIGHT)
            love.graphics.setColor(0, 0, 0, 255)
            local textW = smallfont:getWidth(button.text)
            local textH = smallfont:getHeight(button.text)
            love.graphics.print(button.text, smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5)
            love.graphics.setColor(255, 255, 255, 255)
            cursor_y = cursor_y + (BUTTON_HEIGHT + margin)
            
        end
    end
if (gameState == 'multiMode')
    then 
 local button_width = VIRTUAL_WIDTH * (1/3)
        local BUTTON_HEIGHT = 50
        local margin = 20
        local hot = false
        local cursor_y = 0
        local total_height = (BUTTON_HEIGHT + margin) * #buttons
        for i, button in ipairs(playerCountButtons) do 
            button.last = button.now

            local bx = (VIRTUAL_WIDTH*0.5) - (button_width * 0.5)

            local by = (VIRTUAL_HEIGHT * 0.3) - (total_height * 0.5) + cursor_y
            if (button.text == 'Play') then 
                by = by + by/1.8
            end
            local color = {255, 255, 255, 255}
            local mx, my = love.mouse.getPosition()
            mx = mx * DIFFERENCE_X
            my = my * DIFFERENCE_Y
            hot = (mx > bx and mx < bx + button_width and my > by and my < by + BUTTON_HEIGHT) and i
            if (hot == i) then 
                if (button.text == 'Play') then color = {0/255, 255/255, 0/255, 255} else
                color = {10, 10, 0, 255}
                end
            end
            button.now = love.mouse.isDown(1)
            if button.now and not button.last and hot == i then 
                love.graphics.setColor(0,0,0,1)
                love.graphics.rectangle("fill", 0, 0, VIRTUAL_WIDTH, VIRTUAL_HEIGHT)
                sounds['wallhit']:play()
                if button.text == "Ball Speed: " and nuckemodactive == 1 then  
              else
                     
             button.fn()

         end
         end
            love.graphics.setColor(unpack(color))
            love.graphics.rectangle("fill", bx, by, button_width, BUTTON_HEIGHT)
            love.graphics.setColor(0, 0, 0, 255)
            local textW = smallfont:getWidth(button.text)
            local textH = smallfont:getHeight(button.text)
            if (button.text == '1v1') then love.graphics.print(playertext, smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5) 
                            elseif button.text == 'snc' then 
                if (nuckemodactive == 1) then
                                    love.graphics.setColor(1,0,0,1)
                love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5)
                love.graphics.setColor(1,1,1,1)
                love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5)
                love.graphics.setColor(0,0,0,1) 
                else
                     --
                love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH*0.45 - textW*0.5, by+textH*0.5)
            end
            elseif (button.text == 'ballCount') then love.graphics.print("Ball Count: " .. maxBalls, smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5)
                            elseif (button.text == "Ball Speed: ") then 
                if (nuckemodactive == 1) then 
                love.graphics.setColor(1,0,0,1)
                love.graphics.print("shaitan machina", smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5)
                love.graphics.setColor(1,1,1,1)
                love.graphics.print("shaitan machina", smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5)
                love.graphics.setColor(0,0,0,1) 

                else
                love.graphics.print(button.text .. ballSet, smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5)
            end
        elseif button.text == 'ptw' then love.graphics.print("Points to Win: " .. ptw, smallfont,VIRTUAL_WIDTH*0.5 - textW * 1.5, by+textH*0.5)
            else
            love.graphics.print(button.text, smallfont, VIRTUAL_WIDTH*0.5 - textW*0.5, by+textH*0.5)
        end
            love.graphics.setColor(255, 255, 255, 255)
            cursor_y = cursor_y + (BUTTON_HEIGHT + margin)
            
        end


    end


end
function love.draw()
    simpleScale.set()
  --  resolutionChanger()
    --love.graphics.scale( 1.5, 1.5 )
   -- love.graphics.translate( (WINDOW_WIDTH*1.5 - WINDOW_WIDTH), WINDOW_HEIGHT*1.5 - WINDOW_HEIGHT )
--	push:apply('start')
        --resolutionButtons()
        if gameState == 'nuclearExplosion' then 
            love.graphics.setColor(1,1,1,1)
            love.graphics.circle("fill", ball[1].x, ball[1].y , explosionRange*100, 100)
            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()
        elseif gameState == 'animation' then 
            callAnimator()
        else
            mapChanger()
            if t < shakeDuration then
            	--love.window.setTitle("lamo")
                local dx = love.math.random(-shakeMagnitude, shakeMagnitude)
                local dy = love.math.random(-shakeMagnitude, shakeMagnitude)
                love.graphics.translate(dx, dy)
            end
            if (gameState == 'menu') then 
                updateTEXT = '0.7 Chalkboard Update'
            end
            serveBot()
            hardmanager()
 
            if (areanuclear == 1) then 
                love.graphics.setShader(shader)
                love.graphics.clear(1,1,1,1)
            else 
                love.graphics.setShader()
	            love.graphics.clear(40/255, 40/255, 40/255, 1) --BACKGROUND COLOR
            end
            if (gameMode == 'practice') then 
                love.graphics.rectangle('fill', VIRTUAL_WIDTH, 0, 10, VIRTUAL_HEIGHT)
            end
            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
            love.graphics.setFont(scorefont)
            if gameState == 'play' or gameState == '1serve' or gameState == '2serve' then 
                love.graphics.setFont(smallfont)
            end
            
            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')
            love.graphics.setFont(scorefont)
            love.graphics.print(tostring(math.floor(player1score)), VIRTUAL_WIDTH / 2 - 500, VIRTUAL_HEIGHT / 12)
            if (gameMode ~= 'practice') then 
                love.graphics.print(tostring(math.floor(player2score)), VIRTUAL_WIDTH / 2 + 400, VIRTUAL_HEIGHT / 12)
            end
            love.graphics.setFont(smallfont)
        
            if (potentialstrike1 == 1 and potentialnuke1 == 0 and player1reverbav == 0) then 
                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) 
            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 and gameMode ~= 'practice') then 
                    love.graphics.print(tostring(math.floor(player2nukescore) .. '['..p2control.super..']'), VIRTUAL_WIDTH / 2 + 430, VIRTUAL_HEIGHT / 60)
                elseif (gameMode ~= 'practice') then 
    	            love.graphics.print(tostring('READY'), VIRTUAL_WIDTH / 2 + 430, VIRTUAL_HEIGHT / 60)
                end
            elseif (potentialnuke2 == 1 and gameMode ~= 'practice') 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 + 430, VIRTUAL_HEIGHT / 60) 
    	    elseif (gameMode ~= 'practice') then 
                love.graphics.print(tostring(math.floor(player2nukescore)), VIRTUAL_WIDTH / 2 + 430, VIRTUAL_HEIGHT / 60)
            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
            if gameState ~= 'assign' then
                player1:render()
                player3:render()
            if gameMode ~= 'practice' then 
                player2:render()
                player4:render()
            end
            for i = 1, maxBalls do
                if areanuclear == 1 then 
                    ball[i]:render('black')
                    --love.window.setTitle('rendering black')    
                else 
                    ball[i]:render(' ')
                    --love.window.setTitle('rendering white')
                end
            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 == '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, 'playercount')
                love.keyboard.mouseisReleased = false
            end        
            if gameState == 'prdiff' then 
                mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, pracdiff, sounds, 'playercount')
                love.keyboard.mouseisReleased = false
            end
        end
        editor()
        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.print("Press Enter to Start", WINDOW_WIDTH / -10 , VIRTUAL_HEIGHT / 8)
            love.graphics.setColor(255,255,255,255)
            love.graphics.pop()  
  

        end
    end
    if gameState == 'assign' then 
        controlChanger()
    end
  simpleScale.unSet()
end
   --    push:apply('end')
    function controllerSer()
        for i = 1, maxBalls do
    if (ball[i].dy == 0) then
        hitNum[i] = hitNum[i] +1
        --love.window.setTitle(hitNum[i])
        if hitNum[i] >= 10 then
        ball[i].dy = 1
        hitNum[i] = 0 
        end
    else 
        hitNum[i] = 0
    end
end

    end
        function palleteController()
        if (areanuclear == 0) then player1.RED = 1 player1.GREEN = 1 player1.BLUE = 1 end
        if (areanuclear == 0) then player2.RED = 1 player2.GREEN = 1 player2.BLUE = 1 end
        if (areanuclear == 1) then player1.RED = 0 player1.GREEN = 0 player1.BLUE = 0 end
        if (areanuclear == 1) then player2.RED = 0 player2.GREEN = 0 player2.BLUE = 0 end       
        end
    




function love.wheelmoved(x, y)
if (y < 0 and wall1width > 0) then 
    wall1width = wall1width - 5
elseif y > 0 and wall1width < 900 then wall1width = wall1width + 5
end

    end

function serveBot()
if (gameState == '1serve') then 
    updateTEXT = ''
            if (gameMode ~= 'practice') then 
    TEXT = 'PLAYER 1, serve!(q)'
end
    if (love.keyboard.isDown('q') or gameMode == 'practice') then
        TEXT = 'Lets Begin!'
        ball_DIR = 1
        for i = 1, maxBalls do 
    ball[i]:reset(i)

end
    --love.window.setTitle("An atttttttt")
        gameState = 'play'
    end
end
if (gameState == '2serve') then 
    TEXT = 'PLAYER 2, serve!(p)'
    if (AGAINST_AI == 1) then 
        TEXT = ''
        ball_DIR = -1
        for i = 1, maxBalls do
    ball[i]:reset(i)
end
    --love.window.setTitle("An atttttttt")
        gameState = 'play'
    end  
    if (love.keyboard.isDown('p') and AGAINST_AI == 0) then 
        TEXT = 'Lets Begin'
        ball_DIR = -1
            for i = 1, maxBalls do
    ball[i]:reset(i)
end
    --love.window.setTitle("An atttttttt")
        gameState = 'play'
    end
end
end
function mapChanger()
    for i = 1, maxBalls do
    if (gameState == 'editor') then MAP_TYPE = 2 end
    if (MAP_TYPE > 2) then 
        MAP_TYPE = 0
    end
    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
        
end
function resolutionChanger()
    if (RESOLUTION_SET > 1) then 
        RESOLUTION_SET = 0
    end
    if (RESOLUTION_SET == 0 ) then
    if (isFullscreen == 1) then
            DIFFERENCE_X = 1
        DIFFERENCE_Y = 1
        simpleScale.updateWindow(WINDOW_WIDTH, WINDOW_HEIGHT,{fullscreen = false})
        isFullscreen = 0
    end

        end
        if (RESOLUTION_SET == 1) then
    if (isFullscreen == 0) then 
        simpleScale.updateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, {fullscreen = true})
        local newWidth = love.graphics.getWidth()
        local newHeight = love.graphics.getHeight()
        DIFFERENCE_X = VIRTUAL_WIDTH / newWidth
        DIFFERENCE_Y = VIRTUAL_HEIGHT / newHeight
        isFullscreen = 1

    end
end

    
end
function resettinggenius()
    maxBalls = 1
    for i =1, maxBalls do
        ball[i]:reset(i)
    end
    paddle_SPEED = 20
    nuclearanimation = 3
    timeIsSlow =false 
    timeIsSlow2 = false 
    originalSpeed = 200
    gameState = 'menu'
    gameMode = 'notpracticd'
    ballSet = 200
    ballSpeed = ballSet
            player2.GREEN = 255
        player2.BLUE = 255
        player1.GREEN = 255
        player1.BLUE = 255
                player1score = 0
        player2score = 0
           potentialnuke1 = 0
    potentialnuke2 = 0
    striken = 0
    areanuclear = 0
    potentialstrike1 = 0
    potentialstrike2 = 0
    player1nukescore = 0
    player2nukescore = 0
    player1reverbav = 0
    player2reverbav = 0
    selecting = 0
    AGAINST_AI = 0
    end

function animator(dt)
    if (gameState == 'animation') then
    time_1 = time_1 + dt
    light = 255 - time_1 * 85
    if (light < 0) then 
        time_1 = 0
        light = 0
        gameState = 'start'
    end
end
   

end
function callAnimator()
            love.graphics.setColor(255,255,255,light/255)
        love.graphics.draw(image,0,0)
    end
function love.mousereleased(x, y, button)
love.keyboard.mouseisReleased = true
    if (gameState == 'editor') then
        if (#walls < 1000 and button == 1 and blockinput ~= true) then 
        table.insert(walls, newWall(x*DIFFERENCE_X,y*DIFFERENCE_Y, 10, wall1width))
        end 
    end
end