|  |  | @@ -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 |