From d9a3cd56892a45f9398b80e718cd56f6699e54b7 Mon Sep 17 00:00:00 2001 From: madiwka3 Date: Tue, 7 Jul 2020 21:55:30 +0600 Subject: [PATCH] Improved life for me and other coders --- animator.lua | 19 + debuggame.sh | 3 +- font.ttf | Bin 19492 -> 116008 bytes main.lua | 3280 ++++++++++++++++++++---------------------- main2.lua | 1686 ++++++++++++++++++++++ music.lua | 21 +- paddle.lua | 9 + roadmap | 2 + src/baseGame.lua | 584 ++++++++ src/constantvars.lua | 4 + src/dependencies.lua | 14 + src/menus.lua | 3 + 12 files changed, 3890 insertions(+), 1735 deletions(-) create mode 100644 main2.lua create mode 100644 roadmap create mode 100644 src/baseGame.lua create mode 100644 src/constantvars.lua create mode 100644 src/dependencies.lua create mode 100644 src/menus.lua diff --git a/animator.lua b/animator.lua index 58ba31c..0ff97ea 100644 --- a/animator.lua +++ b/animator.lua @@ -17,6 +17,25 @@ function superanimator(type, param) end end function staticanimatorcounter(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 + 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 (player1anim) then print("Effect range: " .. effectRange[0]) effectRange[0] = effectRange[0] + dt*24 diff --git a/debuggame.sh b/debuggame.sh index 1ab7459..e9f9e07 100644 --- a/debuggame.sh +++ b/debuggame.sh @@ -2,4 +2,5 @@ rm game.love rm game.zip zip -r game * mv game.zip game.love -love2d game.love \ No newline at end of file +love2d game.love +rm game.love diff --git a/font.ttf b/font.ttf index fe4328b6accff5ea1c2554ef0148814ff3203ca4..e9b029c59f65b24bb486b3630eb17202e3151137 100644 GIT binary patch literal 116008 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 maxspeed and gameState == 'play') then - ballSpeed = maxspeed - end -end - -function love.update(dt) - staticanimatorcounter(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 - print(debug.shake) - if ((areanuclear == 0 and ((player1striken or player2striken) and (player1score > 9 or player2score > 9))) or debug.shake) then - print("Calling animation") - superanimator('tensehit', 1) - end - --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(player2) then - --ameState = 'quickanim' - t = 0 - shakeDuration = 1 - if ((areanuclear == 0 and ((player1striken or player2striken) and (player1score > 9 or player2score > 9))) or debug.shake) 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 - - 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() --This calls a fucking 100 year old animator. I dont even remember what it does. This has nothing to do with the new one - 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.1 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 - staticanimator() - 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.setColor(1,1,1,1) - love.graphics.printf(TEXT,0,20,VIRTUAL_WIDTH,'center') - love.graphics.setFont(smallfont) - love.graphics.printf(updateTEXT,0,VIRTUAL_HEIGHT * 0.95,VIRTUAL_WIDTH,'left') - 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 \ No newline at end of file +--CALLING OTHER LUA FILES +require "src/dependencies" +io.stdout:setvbuf("no") +--CANCELLED ATTEMPETED SHADING (NOT WORKING) +local shader_code = + [[ +vec4 effect(vec4 color, Image image, vec2 uvs, vec2 screen_coords) { + vec4 pixel = Texel(image,uvs); + return pixel * color; +} +]] + +debug = true + +--GLOBAL VARIABLES +globalState = "menu" +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 +player1reverbav = 0 +playertext = "1v1" +player2reverbav = 0 +elapsed = 0 +rotation = 0 +TEXT = "Nuclear Pong" +currentKey = " " +ptw = 10 + +--CHECKING IF CONTROLS ARE TAKEN +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 + if debug then + print("Shaking set to match almost over") + end + 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 + print("Debug active") + --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", 25) + scorefont = love.graphics.newFont("font.ttf", 60) + 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(love.timer.getFPS()) + if love.keyboard.isDown("space") then + player1nukescore = 200 + end +end + +function speedControl() + if (ballSpeed > maxspeed and gameState == "play") then + ballSpeed = maxspeed + end +end + +function love.update(dt) + staticanimatorcounter(dt) + if debug then + displayFPS() + end + if globalState == "base" then + basegame(dt) + end + if globalState == "menu" then + menumode(dt) + end +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 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" + globalState = "base" + 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" + globalState = "base" + 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" + globalState = "base" + 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 = "base" + end +end + +function dangerChecker() --CHECK IF CONTROLS ARE DUPLICATING + 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" + globalState = "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" + globalState = "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 + --love.window.setTitle("more than 4") + maxBalls = 1 + 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() + --LEGACY CODE (INGORE) + --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 --AWFUL WAY TO DO NUCLEAR EXPLOSIONS + 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() --This calls a fucking 100 year old animator. I dont even remember what it does. This has nothing to do with the new one + else + + if t < shakeDuration then + local dx = love.math.random(-shakeMagnitude, shakeMagnitude) + local dy = love.math.random(-shakeMagnitude, shakeMagnitude) + love.graphics.translate(dx, dy) + end + + + + 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 + staticanimator() + 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.setColor(1, 1, 1, 1) + love.graphics.printf(TEXT, 0, 20, VIRTUAL_WIDTH, "center") + love.graphics.setFont(smallfont) + love.graphics.printf(updateTEXT, 0, VIRTUAL_HEIGHT * 0.95, VIRTUAL_WIDTH, "left") + 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 + --love.window.setTitle('rendering black') + ball[i]:render("black") + else + --love.window.setTitle('rendering white') + ball[i]:render(" ") + 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 + + 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 + simpleScale.unSet() +end + +--Check if controls are duplicating +function controllerSer() + for i = 1, maxBalls do + if (ball[i].dy == 0) then + hitNum[i] = hitNum[i] + 1 + if hitNum[i] >= 10 then + ball[i].dy = 1 + hitNum[i] = 0 + end + else + hitNum[i] = 0 + end + end +end + +function palleteController() --!!!!LEGACY CODE, MIGRATED TO Paddle.lua!!!! + 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() --THIS IS USED TO CHANGE TEXT/BALL DIRECTION ON DIFFERENT SERVES + 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 + + gameState = "play" + globalState = "base" + 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 + + gameState = "play" + globalState = "base" + 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" + globalState = "base" + 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" + globalState = "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 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 diff --git a/main2.lua b/main2.lua new file mode 100644 index 0000000..214e731 --- /dev/null +++ b/main2.lua @@ -0,0 +1,1686 @@ +--CALLING OTHER LUA FILES +require 'src/dependencies' +io.stdout:setvbuf('no') +--CANCELLED ATTEMPETED SHADING (NOT WORKING) +local shader_code = [[ +vec4 effect(vec4 color, Image image, vec2 uvs, vec2 screen_coords) { + vec4 pixel = Texel(image,uvs); + return pixel * color; +} +]] + +debug = true + +--GLOBAL VARIABLES +globalState = 'menu' +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 +player1reverbav = 0 +playertext = '1v1' +player2reverbav = 0 +elapsed = 0 +rotation = 0 +TEXT = 'Nuclear Pong' +currentKey = " " +ptw = 10 + + + +--CHECKING IF CONTROLS ARE TAKEN +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 + if debug then + print("Shaking set to match almost over") + end + 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 + print("Debug active") +--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', 25) + scorefont = love.graphics.newFont('font.ttf', 60) + 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(love.timer.getFPS()) +if love.keyboard.isDown('space') then + player1nukescore = 200 +end +end + +function speedControl() + if (ballSpeed > maxspeed and gameState == 'play') then + ballSpeed = maxspeed + end +end + +function love.update(dt) + staticanimatorcounter(dt) + if debug then + displayFPS() + end + if globalState == 'base' then + basegame(dt) + end + if globalState == 'menu' then + menumode(dt) + end + 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 + 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 + 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 + if ((areanuclear == 0 and ((player1striken or player2striken) and (player1score > 9 or player2score > 9)))) then + print("Calling animation") + superanimator('tensehit', 1) + end + --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(player2) then + --ameState = 'quickanim' + t = 0 + shakeDuration = 1 + if ((areanuclear == 0 and ((player1striken or player2striken) and (player1score > 9 or player2score > 9)))) 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 + + 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' + globalState = 'base' +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' + globalState = 'base' +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' + globalState = 'base' +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 = 'base' + end +end + + +function dangerChecker() --CHECK IF CONTROLS ARE DUPLICATING + 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' + globalState = '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' + globalState = '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() + --LEGACY CODE (INGORE) + --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 --AWFUL WAY TO DO NUCLEAR EXPLOSIONS + 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() --This calls a fucking 100 year old animator. I dont even remember what it does. This has nothing to do with the new one + else + mapChanger() + if t < shakeDuration then + 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.1 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 + staticanimator() + 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.setColor(1,1,1,1) + love.graphics.printf(TEXT,0,20,VIRTUAL_WIDTH,'center') + love.graphics.setFont(smallfont) + love.graphics.printf(updateTEXT,0,VIRTUAL_HEIGHT * 0.95,VIRTUAL_WIDTH,'left') + 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 + +--Check if controls are duplicating +function controllerSer() + for i = 1, maxBalls do + if (ball[i].dy == 0) then + hitNum[i] = hitNum[i] +1 + if hitNum[i] >= 10 then + ball[i].dy = 1 + hitNum[i] = 0 + end + else + hitNum[i] = 0 + end + end +end + +function palleteController() --!!!!LEGACY CODE, MIGRATED TO Paddle.lua!!!! + 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() --THIS IS USED TO CHANGE TEXT/BALL DIRECTION ON DIFFERENT SERVES +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 + + gameState = 'play' + globalState = 'base' + 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 + + gameState = 'play' + globalState = 'base' + 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' + globalState = 'base' + 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' + globalState = '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 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 \ No newline at end of file diff --git a/music.lua b/music.lua index c3171c0..b8798f2 100644 --- a/music.lua +++ b/music.lua @@ -24,16 +24,15 @@ function musicController(orders, toggling) else end - elseif order ~= nil then - - sounds[orders]:setPitch(1) - sounds[orders]:setLooping(true) - sounds[orders]:setVolume(0.9) - sounds[orders]:play() - if (toggling == 1) then - sounds[orders]:setVolume(0.9) - else - sounds[orders]:setVolume(0) - end + elseif orders ~= nil then + sounds[orders]:setPitch(1) + sounds[orders]:setLooping(true) + sounds[orders]:setVolume(0.9) + sounds[orders]:play() + if (toggling == 1) then + sounds[orders]:setVolume(0.9) + else + sounds[orders]:stop() end + end end \ No newline at end of file diff --git a/paddle.lua b/paddle.lua index fd36b0c..15fa287 100644 --- a/paddle.lua +++ b/paddle.lua @@ -17,6 +17,15 @@ function paddle:init(x, y, width, height, player) end function paddle:update(dt) + if areanuclear == 0 then + self.RED = 1 + self.GREEN = 1 + self.BLUE = 1 + else + self.RED = 0 + self.GREEN = 0 + self.BLUE = 0 + end if ((self.player == 1 and timeIsSlow2) or self.player == 2 and timeIsSlow) then self.dy = self.dy / 2 end diff --git a/roadmap b/roadmap new file mode 100644 index 0000000..8ff8131 --- /dev/null +++ b/roadmap @@ -0,0 +1,2 @@ +TODO: Change nuclear explosions to be handled by the animatior --COMPLETE +TODO: For the love of god make love.draw limited to drawing only. \ No newline at end of file diff --git a/src/baseGame.lua b/src/baseGame.lua new file mode 100644 index 0000000..825bc6b --- /dev/null +++ b/src/baseGame.lua @@ -0,0 +1,584 @@ +function basegame(dt) + if player1nukescore > 300 then + player1nukescore = 300 + end + if player2nukescore > 300 then + player2nukescore = 300 + end + speedControl() + balancer() + musicController('norm', 1) + if t < shakeDuration then + t = t + dt + end + 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 + for i = 1, maxBalls do + if ball[i]:collides(player1) then + if (areanuclear == 0 and ((player1striken or player2striken) and (player1score > 9 or player2score > 9))) 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 + 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(player2) then + --ameState = 'quickanim' + t = 0 + shakeDuration = 1 + if + (areanuclear == 0 and + ((player1striken or player2striken) and (player1score > 9 or player2score > 9))) + 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 + + 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 + goalManager() + powerAvailability() + player1:update(dt) + player2:update(dt) +end +function menumode(dt) + if (gameState == "menu") then + updateTEXT = "0.7.1 Chalkboard Update" + end + dangerChecker() + elapsed = elapsed + dt + rotation = math.sin(elapsed * 2.5) * 0.7 + if gameState == "assign" then + controlChanger() + end + editor() + mapChanger() +end +function goalManager() + 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 + 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 +end + +function powerAvailability() + if (player1nukescore >= 20 and player1nukescore < 140) then + potentialstrike1 = 1 + if (love.keyboard.isDown(p1control.super)) then + player1striken = 1 + player1reverbav = 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 + 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 + 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 + 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 +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 \ No newline at end of file diff --git a/src/constantvars.lua b/src/constantvars.lua new file mode 100644 index 0000000..f76c793 --- /dev/null +++ b/src/constantvars.lua @@ -0,0 +1,4 @@ +VIRTUAL_WIDTH = 1280 +VIRTUAL_HEIGHT = 720 +WINDOW_WIDTH = 1280 +WINDOW_HEIGHT = 720 \ No newline at end of file diff --git a/src/dependencies.lua b/src/dependencies.lua new file mode 100644 index 0000000..35e22d7 --- /dev/null +++ b/src/dependencies.lua @@ -0,0 +1,14 @@ +Class = require 'class' +require 'paddle' +require 'simpleScale' +require 'TSerial' +require 'eball' +require 'fullScreener' +require 'superPowerControl' +require 'mainMenu' +require 'music' +require 'animator' +require 'src/baseGame' +require 'src/constantvars' +require 'src/menus' +serialize = require 'ser' \ No newline at end of file diff --git a/src/menus.lua b/src/menus.lua new file mode 100644 index 0000000..8d949bc --- /dev/null +++ b/src/menus.lua @@ -0,0 +1,3 @@ +function menumode() + dangerChecker() +end \ No newline at end of file