Browse Source

Experimental Online

tags/chalkboard
madiwka3 4 years ago
parent
commit
8325401a5f
5 changed files with 472 additions and 569 deletions
  1. +5
    -1
      eball.lua
  2. +110
    -10
      main.lua
  3. +13
    -13
      src/AI.lua
  4. +344
    -81
      src/baseGame.lua
  5. +0
    -464
      src/reverseGame.lua

+ 5
- 1
eball.lua View File

@@ -9,6 +9,7 @@ function eball:init(x, y, width, height)
self.dy = math.random(-1, 1) self.dy = math.random(-1, 1)
self.dx = 1 self.dx = 1
self.disabled = false
end end
function eball:collides(paddle) function eball:collides(paddle)
@@ -39,6 +40,7 @@ else
else else
self.dx = ball_DIR self.dx = ball_DIR
end end
self.disabled = false
self.x = VIRTUAL_WIDTH /2 - 2 self.x = VIRTUAL_WIDTH /2 - 2
self.y = VIRTUAL_HEIGHT /2 - 2 self.y = VIRTUAL_HEIGHT /2 - 2
self.dy = math.random(-1, 1) self.dy = math.random(-1, 1)
@@ -79,8 +81,10 @@ function eball:update(dt)
else else
potentialnuke2 = 0 potentialnuke2 = 0
end end
if self.disabled == false then
self.x = self.x + ballSpeed * self.dx * dt self.x = self.x + ballSpeed * self.dx * dt
self.y = self.y + ballSpeed * self.dy * dt
self.y = self.y + ballSpeed * self.dy * dt
end
end end
function eball:render(color) function eball:render(color)


+ 110
- 10
main.lua View File

@@ -28,6 +28,7 @@ hitNum = {}
hitNum[1] = 0 hitNum[1] = 0
hitNum[2] = 0 hitNum[2] = 0
hitNum[3] = 0 hitNum[3] = 0
confirmation = "disconnected"
hitNum[4] = 0 hitNum[4] = 0
p1bonus = 0 p1bonus = 0
p2bonus = 0 p2bonus = 0
@@ -68,7 +69,9 @@ craz = 0
AI_LEVEL = 500 AI_LEVEL = 500
isFullscreen = 0 isFullscreen = 0
prtext = "Easy" prtext = "Easy"
lastSentKey = "c"
MAP_TYPE = 0 MAP_TYPE = 0
lastSentKeyClient = "c"
difficultyl = 300 difficultyl = 300
req = "pp" req = "pp"
ballSet = 200 ballSet = 200
@@ -95,7 +98,7 @@ function balancer()
if (player2score == 9 or player1score == 9) then if (player2score == 9 or player1score == 9) then
shakeDuration = 5 shakeDuration = 5
if debug then if debug then
print("Shaking set to match almost over")
--print("Shaking set to match almost over")
end end
end end
if (player1score < player2score) then if (player1score < player2score) then
@@ -140,7 +143,7 @@ function love.load()
configsave = io.open("config.lua", "w") configsave = io.open("config.lua", "w")
shader = love.graphics.newShader(shader_code) shader = love.graphics.newShader(shader_code)
time_1 = 0 time_1 = 0
print("Debug active")
--print("Debug active")
--load --load


testwalls = love.filesystem.load("save.lua")() testwalls = love.filesystem.load("save.lua")()
@@ -188,6 +191,28 @@ function love.load()
end end
) )
) )
table.insert(
buttons,
newButton(
"Online Test",
function()
globalState = "nettest"
AGAINST_AI = 0
gameState = "1serve"
end
)
)
table.insert(
buttons,
newButton(
"Client Test",
function()
globalState = "clienttest"
AGAINST_AI = 0
gameState = "1serve"
end
)
)
table.insert( table.insert(
buttons, buttons,
newButton( newButton(
@@ -548,7 +573,7 @@ function love.load()
"Reverse Play", "Reverse Play",
function() function()
gameState = "1serve" gameState = "1serve"
globalState = "reverse"
gameMode = "reversegame"
end end
) )
) )
@@ -679,13 +704,67 @@ function love.update(dt)
if globalState == "base" then if globalState == "base" then
basegame(dt) basegame(dt)
end end
if globalState == "reverse" then
reversegame(dt)
end
if globalState == "menu" then if globalState == "menu" then
debugCheck(dt) debugCheck(dt)
end end
if globalState == "nettest" then
basegame(dt)
nettest(dt)
end
if globalState == "clienttest" then
if confirmation ~= "disconnected" then
clientsBaseGame(dt)
end
clienttest(dt)
end
end
serverinit = false
clientinit = false
function nettest(dt)
if serverinit == false then
local socket = require('socket')
udp = socket.udp()
udp:setsockname('localhost', 142)
udp:settimeout(0)
serverinit = true
end
data, msg_or_ip, port_or_nil = udp:receivefrom()
if data then
print(data .. "FROM " .. msg_or_ip)
end
if data then
local p = split(data, '|')
lastSentKeyClient = p[1]
for i = 1, maxBalls do
print (tostring(ball[i].dy))
udp:sendto(tostring(lastSentKey) ..'|'.. tostring(ball[i].dy) .. '|' .. tostring(player2.y) .. '|' .. tostring(player1.y) .. '|' .. tostring(player1score) .. '|' .. tostring(player2score) .. '|' .. tostring(player1nukescore) .. '|' .. tostring(player2nukescore), msg_or_ip, port_or_nil)
print("SENT: " .. lastSentKey)
end
end
end
function clienttest(dt)
if clientinit == false then
local socket = require "socket"
local address, port = "45.76.95.31", 12345
udp = socket.udp()
udp:setpeername(address, port)
udp:settimeout(0)
clientinit = true
end
udp:send(tostring(lastSentKey))
print(lastSentKey)
data = udp:receive()
print(data)
if data then
local p = split(data, '|')
for i = 1, maxBalls do
local die = tonumber(p[2])
print(p[2])
print(p[2] + 0)
lastSentKeyClient, ball[i].dy, player2.y, player1.y, player1score, player2score, player1nukescore, player2nukescore, confirmation = p[1], die, tonumber(p[3]), tonumber(p[4]), tonumber(p[5]), tonumber(p[6]), tonumber(p[7]), tonumber(p[8]), p[9]
end
end

end end
function wallbreaker(x, y) function wallbreaker(x, y)
if (gameState == "editor") then if (gameState == "editor") then
@@ -806,6 +885,7 @@ function dangerChecker() --CHECK IF CONTROLS ARE DUPLICATING
end end
end end
function love.keypressed(key) function love.keypressed(key)
lastSentKey = key
if gameState == "assign" then if gameState == "assign" then
if (req == "p1up") then if (req == "p1up") then
p1control.up = key p1control.up = key
@@ -904,6 +984,9 @@ end


function love.keyreleased(key) function love.keyreleased(key)
currentKey = " " currentKey = " "
if lastSentKey == key then
lastSentKey = "g"
end
end end
function speedSetter(requesttype) function speedSetter(requesttype)
if (requesttype == "ball") then if (requesttype == "ball") then
@@ -1208,13 +1291,13 @@ function love.wheelmoved(x, y)
end end


function serveBot() --THIS IS USED TO CHANGE TEXT/BALL DIRECTION ON DIFFERENT SERVES function serveBot() --THIS IS USED TO CHANGE TEXT/BALL DIRECTION ON DIFFERENT SERVES
print("servebot called")
--print("servebot called")
if (gameState == "1serve") then if (gameState == "1serve") then
updateTEXT = "" updateTEXT = ""
if (gameMode ~= "practice") then if (gameMode ~= "practice") then
TEXT = "PLAYER 1, serve!(q)" TEXT = "PLAYER 1, serve!(q)"
end end
if (love.keyboard.isDown("q") or gameMode == "practice") then
if ((globalState ~= "clienttest" and love.keyboard.isDown("q")) or gameMode == "practice" or (lastSentKeyClient == "q" and globalState == "clienttest")) then
TEXT = "Lets Begin!" TEXT = "Lets Begin!"
ball_DIR = 1 ball_DIR = 1
for i = 1, maxBalls do for i = 1, maxBalls do
@@ -1236,7 +1319,7 @@ function serveBot() --THIS IS USED TO CHANGE TEXT/BALL DIRECTION ON DIFFERENT SE
gameState = "play" gameState = "play"
end end
if (love.keyboard.isDown("p") and AGAINST_AI == 0) then
if ((lastSentKeyClient == "p" or love.keyboard.isDown("p"))and AGAINST_AI == 0) then
TEXT = "Lets Begin" TEXT = "Lets Begin"
ball_DIR = -1 ball_DIR = -1
for i = 1, maxBalls do for i = 1, maxBalls do
@@ -1325,3 +1408,20 @@ function love.mousereleased(x, y, button)
end end
end end
end end

function ballsAlive()
for i = 1, maxBalls do
if ball[i].disabled == false then
print("Ball " .. i .. " is not disabled")
return true
end
end
return false
end
function split(s, delimiter)
result = {}
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match)
end
return result
end

+ 13
- 13
src/AI.lua View File

@@ -1,8 +1,8 @@
function AI(target, ballCnt, diff) function AI(target, ballCnt, diff)
currentTarget = evaluateClosestBall(target); currentTarget = evaluateClosestBall(target);
print("CLOSEST TARGET IS " .. currentTarget)
--print("CLOSEST TARGET IS " .. currentTarget)
if diff < 1200 then if diff < 1200 then
print ("Normal targeting ".. currentTarget .. " " .. target.x - ball[currentTarget].x .. " " .. ball[currentTarget].y - target.y)
--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 if (ball[currentTarget].y - target.y >= target.height and target.x - ball[currentTarget].x < diff) then
target.dy = AI_SPEED target.dy = AI_SPEED
elseif (target.y - ball[currentTarget].y >= -target.height/2 and target.x - ball[currentTarget].x < diff) then elseif (target.y - ball[currentTarget].y >= -target.height/2 and target.x - ball[currentTarget].x < diff) then
@@ -11,11 +11,11 @@ function AI(target, ballCnt, diff)
target.dy = 0 target.dy = 0
end end
else else
print("Complex targeting")
--print("Complex targeting")
neededTarget = predictBall(ball[currentTarget], target.x) neededTarget = predictBall(ball[currentTarget], target.x)
if neededTarget ~= -1 then if neededTarget ~= -1 then
print("Calculated target = " .. neededTarget)
--print("Calculated target = " .. neededTarget)
if (target.y - neededTarget >= -target.height/2) then if (target.y - neededTarget >= -target.height/2) then
target.dy = -AI_SPEED target.dy = -AI_SPEED
elseif (neededTarget - target.y >= target.height*0.9) then elseif (neededTarget - target.y >= target.height*0.9) then
@@ -78,27 +78,27 @@ function evaluateClosestBall(target)
return ans return ans
end end
function predictBall(target, px) function predictBall(target, px)
print("BALLSTATS:" .. target.x .. " " .. target.y)
--print("BALLSTATS:" .. target.x .. " " .. target.y)
if VIRTUAL_WIDTH - target.x < AI_SPEED then if VIRTUAL_WIDTH - target.x < AI_SPEED then
return target.y return target.y
elseif target.dx > 0 then elseif target.dx > 0 then
local ans = recursiveCalculations(px, target.x, target.y, target.dx, target.dy, 1) local ans = recursiveCalculations(px, target.x, target.y, target.dx, target.dy, 1)
return ans return ans
else else
print("GO TO CENTER!!")
--print("GO TO CENTER!!")
return VIRTUAL_HEIGHT/2 return VIRTUAL_HEIGHT/2
end end
end end
function recursiveCalculations(px, ex, ey, edx, edy, ifspecial) function recursiveCalculations(px, ex, ey, edx, edy, ifspecial)
if (edy > 0) then if (edy > 0) then
print ("normal" .. ex .." " .. ey .. " " .. edx .. " " .. edy)
--print ("normal" .. ex .." " .. ey .. " " .. edx .. " " .. edy)
local time = (VIRTUAL_HEIGHT-ey) / (ballSpeed * edy) local time = (VIRTUAL_HEIGHT-ey) / (ballSpeed * edy)
local distance = (ballSpeed * edx) * time local distance = (ballSpeed * edx) * time
print(distance .. " " .. edx .. " " .. time .. " " .. (px-ex))
--print(distance .. " " .. edx .. " " .. time .. " " .. (px-ex))
if distance > (px - ex) then if distance > (px - ex) then
local anstime = (px - ex) / (ballSpeed * edx) local anstime = (px - ex) / (ballSpeed * edx)
local bonus = (ballSpeed * edy) * anstime local bonus = (ballSpeed * edy) * anstime
print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (px-ex))
--print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (px-ex))
-- if (ifspecial == 0) then -- if (ifspecial == 0) then
return ey + bonus return ey + bonus
-- else -- else
@@ -112,10 +112,10 @@ function recursiveCalculations(px, ex, ey, edx, edy, ifspecial)
elseif edy == 0 then elseif edy == 0 then
return ey return ey
else else
print ("inverse" .. ex .." " .. ey .. " " .. edx .. " " .. edy)
--print ("inverse" .. ex .." " .. ey .. " " .. edx .. " " .. edy)
local time = (ey) / math.abs((ballSpeed * edy)) local time = (ey) / math.abs((ballSpeed * edy))
local distance = (ballSpeed * edx) * time local distance = (ballSpeed * edx) * time
print(distance .. " " .. edx .. " " .. time .. " " .. (px-ex))
--print(distance .. " " .. edx .. " " .. time .. " " .. (px-ex))


--print("Why th efuck ") --print("Why th efuck ")
@@ -123,7 +123,7 @@ function recursiveCalculations(px, ex, ey, edx, edy, ifspecial)
if distance > (px - ex) then if distance > (px - ex) then
local anstime = (px - ex) / (ballSpeed * edx) local anstime = (px - ex) / (ballSpeed * edx)
local bonus = (ballSpeed * edy) * anstime local bonus = (ballSpeed * edy) * anstime
print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (px-ex))
--print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (px-ex))
-- if (ifspecial == 0) then -- if (ifspecial == 0) then
return ey + bonus return ey + bonus
-- else -- else
@@ -132,7 +132,7 @@ function recursiveCalculations(px, ex, ey, edx, edy, ifspecial)
else else
local emulatedx = ex + distance local emulatedx = ex + distance
local emulatedy = 0 local emulatedy = 0
-- print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (VIRTUAL_WIDTH-ex))
----print("results: " .. bonus .. " " .. edx .. " " .. anstime .. " " .. (VIRTUAL_WIDTH-ex))
return recursiveCalculations(px, emulatedx, emulatedy, edx, -edy, 0) return recursiveCalculations(px, emulatedx, emulatedy, edx, -edy, 0)
end end
end end

+ 344
- 81
src/baseGame.lua View File

@@ -1,4 +1,7 @@
function basegame(dt) function basegame(dt)
if gameMode == "reverse" then
reversegame(dt)
end
if player1nukescore > 300 then if player1nukescore > 300 then
player1nukescore = 300 player1nukescore = 300
end end
@@ -11,7 +14,7 @@ function basegame(dt)
if t < shakeDuration then if t < shakeDuration then
t = t + dt t = t + dt
end end
print("T = " .. tostring(t))
--print("T = " .. tostring(t))
serveBot() serveBot()
if gameState == 'play' then if gameState == 'play' then
if (AGAINST_AI == 1) then if (AGAINST_AI == 1) then
@@ -25,20 +28,20 @@ function basegame(dt)
player1.dy = 0 player1.dy = 0
end end
if (AGAINST_AI == 0) then if (AGAINST_AI == 0) then
if (love.keyboard.isDown(p2control.up)) then
if ((confirmation == "up2" and love.keyboard.isDown(p2control.up)) or lastSentKeyP2 == p2control.up) then
player2.dy = (paddle_SPEED + p2bonus) * -1 player2.dy = (paddle_SPEED + p2bonus) * -1
elseif (love.keyboard.isDown(p2control.down)) then
elseif ((confirmation == "up2" and love.keyboard.isDown(p2control.down)) or lastSentKeyP2 == p2control.down) then
player2.dy = paddle_SPEED + p2bonus player2.dy = paddle_SPEED + p2bonus
else else
player2.dy = 0 player2.dy = 0
end end
end end
print(areanuclear .. striken .. player1score .. player2score)
--print(areanuclear .. striken .. player1score .. player2score)
for i = 1, maxBalls do for i = 1, maxBalls do
if ball[i]:collides(player1) then
if rules("p1hit", i) then
if (areanuclear == 0 and striken == 1 and (player1score > ptw-2 or player2score > ptw-2)) then if (areanuclear == 0 and striken == 1 and (player1score > ptw-2 or player2score > ptw-2)) then
print("Calling animation")
--print("Calling animation")
superanimator("tensehit", 1) superanimator("tensehit", 1)
end end
if gameMode == "practice" then if gameMode == "practice" then
@@ -156,7 +159,7 @@ function basegame(dt)
end end
end end
end end
if ball[i]:collides(player2) then
if rules("p2hit", i) then
--ameState = 'quickanim' --ameState = 'quickanim'
t = 0 t = 0
shakeDuration = 1 shakeDuration = 1
@@ -227,7 +230,7 @@ function basegame(dt)
ball[i].dx = -ball[i].dx ball[i].dx = -ball[i].dx
ball[i].x = player2.x - 30 ball[i].x = player2.x - 30


if (love.keyboard.isDown(p2control.up) or AI_SPEED < 0) then
if ((confirmation == "up2" and love.keyboard.isDown(p2control.up) ) or AI_SPEED < 0 or lastSentKeyP2 == p2control.up) then
select = math.random(1, 5) select = math.random(1, 5)
if select == 1 then if select == 1 then
ball[i].dy = -1 ball[i].dy = -1
@@ -240,7 +243,7 @@ function basegame(dt)
elseif select == 5 then elseif select == 5 then
ball[i].dy = -2 ball[i].dy = -2
end end
elseif love.keyboard.isDown(p2control.down) or AI_SPEED > 0 then
elseif (confirmation == "up2" and love.keyboard.isDown(p2control.down)) or AI_SPEED > 0 or lastSentKeyP2 == p2control.down then
select = math.random(1, 5) select = math.random(1, 5)
if select == 1 then if select == 1 then
ball[i].dy = 1 ball[i].dy = 1
@@ -358,77 +361,86 @@ end


function goalManager() function goalManager()
for i = 1, maxBalls do for i = 1, maxBalls do
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
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
if (synctype == 0) then
paddle_SPEED = ballSet / 10
end
if (synctype == 1) then
paddle_SPEED = ballSpeed / 10
end
AI_SPEED = difficultyl / 10
for i = 1, maxBalls do for i = 1, maxBalls do
ball[i]:reset(i) ball[i]:reset(i)
end end
sounds["win"]:play()
gameState = "done"
TEXT = "Player 2 Won!"
else
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" gameState = "1serve"
serveBot() serveBot()
for i = 1, maxBalls do
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
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
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) ball[i]:reset(i)
end end
end
end
if (ball[i].x > VIRTUAL_WIDTH + ballSpeed * 0.5) then
end
sounds["score"]:play() 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 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
end end
end end
@@ -436,20 +448,20 @@ end
function powerAvailability() function powerAvailability()
if (player1nukescore >= 20 and player1nukescore < 140) then if (player1nukescore >= 20 and player1nukescore < 140) then
potentialstrike1 = 1 potentialstrike1 = 1
if (love.keyboard.isDown(p1control.super)) then
if ((confirmation == "up1" and love.keyboard.isDown(p1control.super)) or (confirmation == "up2" and lastSentKeyP1 == p1control.super)) then
player1striken = 1 player1striken = 1
player1reverbav = 0 player1reverbav = 0
end end
end end
if (player1nukescore >= 140) and timeIsSlow2 == false and timeIsSlow == false and maxBalls == 1 and ball[1].x < VIRTUAL_WIDTH / 2 and ball[1].dx < 0 then if (player1nukescore >= 140) and timeIsSlow2 == false and timeIsSlow == false and maxBalls == 1 and ball[1].x < VIRTUAL_WIDTH / 2 and ball[1].dx < 0 then
player1reverbav = 1 player1reverbav = 1
if love.keyboard.isDown(p1control.counter) then
if ((confirmation == "up1" and love.keyboard.isDown(p1control.counter)) or (confirmation == "up2" and lastSentKeyP1 == p1control.counter)) then
powerControl(1, "special") powerControl(1, "special")
end end
end end
if (player1nukescore >= 200) then if (player1nukescore >= 200) then
potentialnuke1 = 1 potentialnuke1 = 1
if (love.keyboard.isDown(p1control.super)) then
if ((confirmation == "up1" and love.keyboard.isDown(p1control.super)) or (confirmation == "up2" and lastSentKeyP1 == p1control.super)) then
sounds["nuke"]:play() sounds["nuke"]:play()
if areanuclear == 1 then if areanuclear == 1 then
maxspeed = maxspeed + 50 maxspeed = maxspeed + 50
@@ -478,7 +490,7 @@ function powerAvailability()
if (player2nukescore >= 20 and player2nukescore <= 140) then if (player2nukescore >= 20 and player2nukescore <= 140) then
potentialstrike2 = 1 potentialstrike2 = 1
if (AGAINST_AI == 0) then if (AGAINST_AI == 0) then
if (love.keyboard.isDown(p2control.super)) then
if ((confirmation == "up2" and love.keyboard.isDown(p2control.super)) or lastSentKeyP2 == p2control.super) then
player2striken = 1 player2striken = 1
player2reverbav = 0 player2reverbav = 0
end end
@@ -486,7 +498,7 @@ function powerAvailability()
end end
if (player2nukescore >= 140) and timeIsSlow == false and timeIsSlow2 == false and maxBalls == 1 and ball[1].x > VIRTUAL_WIDTH / 2 and ball[1].dx > 0 then if (player2nukescore >= 140) and timeIsSlow == false and timeIsSlow2 == false and maxBalls == 1 and ball[1].x > VIRTUAL_WIDTH / 2 and ball[1].dx > 0 then
player2reverbav = 1 player2reverbav = 1
if love.keyboard.isDown(p2control.counter) then
if (confirmation == "up2" and love.keyboard.isDown(p2control.counter)) or lastSentKeyP2 == p2control.counter then
sounds["time"]:play() sounds["time"]:play()
player2reverbav = false player2reverbav = false
timeIsSlow2 = true timeIsSlow2 = true
@@ -499,7 +511,7 @@ function powerAvailability()
end end
if (player2nukescore >= 200) then if (player2nukescore >= 200) then
potentialnuke2 = 1 potentialnuke2 = 1
if (love.keyboard.isDown(p2control.super) and AGAINST_AI == 0) then
if (((confirmation == "up2" and love.keyboard.isDown(p2control.super)) or lastSentKeyP2 == p2control.super) and AGAINST_AI == 0) then
sounds["nuke"]:play() sounds["nuke"]:play()
if areanuclear == 1 then if areanuclear == 1 then
maxspeed = maxspeed + 50 maxspeed = maxspeed + 50
@@ -698,25 +710,25 @@ function baseDraw()
love.graphics.translate(dx, dy) love.graphics.translate(dx, dy)
end end
if globalState == 'menu' then if globalState == 'menu' then
print("Drawing menuDraw")
--print("Drawing menuDraw")
if gameState == 'animation' then if gameState == 'animation' then
print("Drawing animation")
--print("Drawing animation")
intro() intro()
end end
if gameState ~= 'animation' then if gameState ~= 'animation' then
print("Drawing notanimtaion")
--print("Drawing notanimtaion")
love.graphics.setFont(scorefont) love.graphics.setFont(scorefont)
menuDraw() menuDraw()
end end
end end
if globalState == 'base' or globalState == 'reverse' then
if globalState == 'base' or globalState == 'reverse' or globalState == 'nettest' or globalState == 'clienttest' then
love.graphics.setFont(smallfont) love.graphics.setFont(smallfont)
if gameState == 'nuclearExplosion' then if gameState == 'nuclearExplosion' then
nuclearDraw() nuclearDraw()
end end
if gameState == 'play' or gameState == '1serve' or gameState == '2serve' or gameState == 'done' then if gameState == 'play' or gameState == '1serve' or gameState == '2serve' or gameState == 'done' then
print("Drawing normally")
--print("Drawing normally")
normalDraw() normalDraw()
end end


@@ -906,4 +918,255 @@ function hitIdentifier()
end end
end 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 < 0 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-10 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()
if t < shakeDuration then
t = t + dt
end
if (lastSentKeyClient == p1control.up) then
player1.dy = (paddle_SPEED + p1bonus) * -1
elseif (lastSentKeyClient == p1control.down) then
player1.dy = paddle_SPEED + p1bonus
else
player1.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-2 or player2score > ptw-2)) then
--print("Calling animation")
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
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
superanimator("tensehit", 1)
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
end
if rules("p2hit", i) then
--ameState = 'quickanim'
t = 0
shakeDuration = 1
if
(areanuclear == 0 and
(striken == 1 and (player1score > ptw-2 or player2score > ptw-2)))
then
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
striken = 1
player2striken = 0
potentialnuke2 = 0
player2nukescore = 0
potentialstrike2 = 0
superanimator("tensehit", 2)
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
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
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
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
goalManager()
powerAvailability()
player1:update(dt)
player2:update(dt)
end end

+ 0
- 464
src/reverseGame.lua View File

@@ -12,468 +12,4 @@ function reversegame(dt)
elseif(player2.y > ball[1].y) then elseif(player2.y > ball[1].y) then
player2.y = player2.y - ballSpeed/50 player2.y = player2.y - ballSpeed/50
end end
if player1nukescore > 300 then
player1nukescore = 300
end
if player2nukescore > 300 then
player2nukescore = 300
end
speedControl()
balancer()
if t < shakeDuration then
t = t + dt
end
print("T = " .. tostring(t))
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
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
print(areanuclear .. striken .. player1score .. player2score)
for i = 1, maxBalls do
print(ball[i].x .. "BALLS")
if ball[i].x < 0 then
if (areanuclear == 0 and striken == 1 and (player1score > ptw-2 or player2score > ptw-2)) then
print("Calling animation")
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
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
superanimator("tensehit", 1)
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].x > VIRTUAL_WIDTH-10 then
--ameState = 'quickanim'
t = 0
shakeDuration = 1
if
(areanuclear == 0 and
(striken == 1 and (player1score > ptw-2 or player2score > ptw-2)))
then
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
striken = 1
player2striken = 0
potentialnuke2 = 0
player2nukescore = 0
potentialstrike2 = 0
superanimator("tensehit", 2)
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
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 = 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
goalManagerReverse()
powerAvailability()
player1:update(dt)
player2:update(dt)
end end

function goalManagerReverse()
for i = 1, maxBalls do
if (ball[i]:collides(player1)) 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]:collides(player2)) 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
end


Loading…
Cancel
Save