diff --git a/main.lua b/main.lua
index 3996d8a..d980bc3 100644
--- a/main.lua
+++ b/main.lua
@@ -243,6 +243,15 @@ function love.load()
             end
         )
     )
+    table.insert(
+        difbuttons,
+        newButton(
+            "Smart",
+            function()
+                hardmanager("smart")
+            end
+        )
+    )
     table.insert(
         settings,
         newButton(
@@ -493,6 +502,15 @@ function love.load()
             end
         )
     )
+    table.insert(
+        difbuttons,
+        newButton(
+            "ballCount",
+            function()
+                speedSetter("ballz")
+            end
+        )
+    )
     table.insert(
         playerCountButtons,
         newButton(
@@ -687,6 +705,7 @@ function hardmanager(diff)
         AI_SPEED = ballSet / 10
         AI_STRIKEMOD = 100
         AI_NUKEMOD = 1000
+        AI_LEVEL = 350
         difficultyl = 200
         selecting = 0
         gameState = "1serve"
@@ -717,6 +736,19 @@ function hardmanager(diff)
         gameState = "1serve"
         globalState = "base"
     end
+    if (diff == "smart") then
+        INDIC[3] = ">"
+        AI_SPEED = ballSpeed * 1.1 + 50
+        AI_SPEED = AI_SPEED / 10
+        AI_LEVEL = 1500
+        AI_NUKEMOD = 200
+        AI_STRIKEMOD = 20
+        selecting = 0
+        difficultyl = 350
+        AGAINST_AI = 1
+        gameState = "1serve"
+        globalState = "base"
+    end
     if (diff == "practice") then
         INDIC[3] = ">"
         AI_SPEED = ballSpeed * 500 + 50
diff --git a/music.lua b/music.lua
index 0fb9539..086cb14 100644
--- a/music.lua
+++ b/music.lua
@@ -26,7 +26,7 @@ function musicController(orders, toggling)
             sounds['gayTheme2']:setLooping(true)
             sounds['gayTheme2']:setVolume(0.5)
             sounds['gayTheme2']:play()          
-        elseif gameState == 'play' and player1score > ptw-4 or player2score > ptw-4 and areanuclear == 0 then 
+        elseif gameState == 'play' and player1score > ptw-5 or player2score > ptw-5 and areanuclear == 0 then 
             print(ptw-4)
             sounds['gayTheme']:stop()
             sounds['gayTheme2']:stop()
diff --git a/src/AI.lua b/src/AI.lua
new file mode 100644
index 0000000..8b27d4b
--- /dev/null
+++ b/src/AI.lua
@@ -0,0 +1,139 @@
+function AI(target, ballCnt, diff)
+    currentTarget = evaluateClosestBall(target);
+    print("CLOSEST TARGET IS " .. currentTarget)
+    if diff < 1200 then 
+        print ("Normal targeting ".. currentTarget .. " " .. target.x - ball[currentTarget].x .. " " .. ball[currentTarget].y - target.y)
+        if (ball[currentTarget].y - target.y >= target.height and target.x - ball[currentTarget].x < diff) then
+            target.dy = AI_SPEED
+        elseif (target.y - ball[currentTarget].y >= -target.height/2 and target.x - ball[currentTarget].x < diff) then
+            target.dy = -AI_SPEED
+        else
+            target.dy = 0
+        end
+    else 
+        print("Complex targeting")
+        
+            neededTarget = predictBall(ball[currentTarget], target.x)
+            if neededTarget ~= -1 then 
+            print("Calculated target = " .. neededTarget)
+            if (target.y - neededTarget >= -target.height/2) then 
+                target.dy = -AI_SPEED
+            elseif (neededTarget - target.y >= target.height*0.9) then 
+                target.dy = AI_SPEED
+            else
+                target.dy = 0
+            end 
+        end
+    end 
+    if
+        difficultyl == 350 and player2reverbav == true and VIRTUAL_WIDTH - ball[currentTarget].x < 90 and
+            math.abs(ball[currentTarget].y - targe.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
+function evaluateClosestBall(target)
+    local ans = 0
+    local min = 99999;
+    for i = 1, maxBalls do 
+        if math.abs(target.x - ball[i].x ) < min then 
+            min = math.abs(target.x - ball[i].x)
+            ans = i 
+        end 
+    end 
+    return ans
+end 
+function predictBall(target, px)
+    print("BALLSTATS:" .. target.x .. " " .. target.y)
+    if VIRTUAL_WIDTH - target.x < AI_SPEED then 
+        return target.y
+    elseif target.dx > 0 then 
+        local ans = recursiveCalculations(px, target.x, target.y, target.dx, target.dy, 1)
+        return ans
+    else 
+        print("GO TO CENTER!!")
+        return VIRTUAL_HEIGHT/2
+    end
+end 
+function recursiveCalculations(px, ex, ey, edx, edy, ifspecial)
+    if (edy > 0) then 
+        print ("normal" .. ex .." " .. ey .. " " .. edx .. " " .. edy)
+        local time = (VIRTUAL_HEIGHT-ey) / (ballSpeed * edy)
+        local distance = (ballSpeed * edx) * time
+        print(distance .. " " .. edx .. " " .. time .. " " .. (px-ex))
+        if distance > (px - ex) then 
+            local anstime = (px - ex) / (ballSpeed * edx) 
+            local bonus = (ballSpeed * edy) * anstime 
+            print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (px-ex))
+           -- if (ifspecial == 0) then  
+                return ey + bonus 
+           -- else 
+             --   return -1  
+            --end
+        else 
+            local emulatedx = ex + distance 
+            local emulatedy = VIRTUAL_HEIGHT
+            return recursiveCalculations(px, emulatedx, emulatedy, edx, -edy, 0)
+        end  
+    elseif edy == 0 then 
+        return ey
+    else
+        print ("inverse" .. ex .." " .. ey .. " " .. edx .. " " .. edy)
+        local time = (ey) / math.abs((ballSpeed * edy))
+        local distance = (ballSpeed * edx) * time 
+        print(distance .. " " .. edx .. " " .. time .. " " .. (px-ex))
+
+        
+       --print("Why th efuck ")
+
+        if distance > (px - ex) then 
+            local anstime = (px - ex) / (ballSpeed * edx) 
+            local bonus = (ballSpeed * edy) * anstime
+            print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (px-ex)) 
+   --         if (ifspecial == 0) then 
+                return ey + bonus 
+     --       else 
+       --         return -1 
+         --   end
+        else 
+            local emulatedx = ex + distance 
+            local emulatedy = 0
+ -- print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (VIRTUAL_WIDTH-ex)) 
+            return recursiveCalculations(px, emulatedx, emulatedy, edx, -edy, 0)
+        end
+    end
+end
\ No newline at end of file
diff --git a/src/baseGame.lua b/src/baseGame.lua
index e82c4e5..26a9049 100644
--- a/src/baseGame.lua
+++ b/src/baseGame.lua
@@ -15,55 +15,7 @@ function basegame(dt)
     serveBot()
     if gameState == 'play' then 
         if (AGAINST_AI == 1) 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
+            AI(player2, maxBalls, AI_LEVEL)
         end
         if (love.keyboard.isDown(p1control.up)) then
             player1.dy = (paddle_SPEED + p1bonus) * -1
@@ -392,7 +344,7 @@ end
 function debugCheck(dt)
     
     if (gameState == "menu") then
-        updateTEXT = "0.7.2 Chalkboard Update"
+        updateTEXT = "0.7.4 Chalkboard Update"
     end
     dangerChecker()
     elapsed = elapsed + dt  
diff --git a/src/dependencies.lua b/src/dependencies.lua
index 008c4c9..29735f6 100644
--- a/src/dependencies.lua
+++ b/src/dependencies.lua
@@ -11,5 +11,6 @@ require 'animator'
 require 'src/baseGame'
 require 'src/constantvars'
 require 'src/menus'
+require 'src/AI'
 require 'src/reverseGame'
 serialize = require 'ser'
\ No newline at end of file