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 fe4328b..e9b029c 100644 Binary files a/font.ttf and b/font.ttf differ diff --git a/main.lua b/main.lua index f95a605..7a4c33c 100644 --- a/main.lua +++ b/main.lua @@ -1,1723 +1,1557 @@ -io.stdout:setvbuf('no') -Class = require 'class' -require 'paddle' -require 'simpleScale' -require 'TSerial' -require 'eball' -require 'fullScreener' -require 'superPowerControl' -require 'mainMenu' -require 'music' -require 'animator' -local serialize = require 'ser' -local shader_code = [[ -vec4 effect(vec4 color, Image image, vec2 uvs, vec2 screen_coords) { - vec4 pixel = Texel(image,uvs); - return pixel * color; -} -]] -timeIsSlow = false -timeIsSlow2 = false -debug.shake = false -originalSpeed = 200 -explosionRange = 0 -blockinput = false -wall1width = 30 -nuclearanimation = 3 -easternum = 0 -ball_DIR = 0 -RED = 255 -hitNum = {} -hitNum[1] = 0 -hitNum[2] = 0 -hitNum[3] = 0 -hitNum[4] = 0 -p1bonus = 0 -p2bonus = 0 -hitNum[5] = 0 -hitNum[6] = 0 -GREEN = 255 -BLUE = 255 -updateTEXT = 'Chalkboard Update' -maxBalls = 1 -playerCount = 1 -WINDOW_WIDTH = 1280 -WINDOW_HEIGHT = 720 -player1reverbav = 0 -playertext = '1v1' -player2reverbav = 0 -elapsed = 0 -rotation = 0 -TEXT = 'Nuclear Pong' -VIRTUAL_WIDTH = 1280 -VIRTUAL_HEIGHT = 720 -currentKey = " " -ptw = 10 -danger = 'none' -danger2 = 'none' -nuckemodactive = 0 -maxspeed = 700 -DIFFERENCE_X = 1 -DIFFERENCE_Y = 1 -paddle_SPEED = 20 -textamount = 15 -AI_STRIKEMOD = 1000 -resolutionWin = 0 -AGAINST_AI = 0 -RESOLUTION_SET = 0 -AI_NUKEMOD = 1000 -animstart = true -AI_SPEED = 30 -craz = 0 -AI_LEVEL = 500 -isFullscreen = 0 -prtext = 'Easy' -MAP_TYPE = 2 -difficultyl = 300 -req = 'pp' -ballSet = 200 -p1control = {up = 'a', down = 'z', super = 's', counter = 'x'} -p2control = {up = ';', down = '.', super = 'l', counter = ','} -synctext = "Independent" -synctype = 0 -function newButton(text, fn) - return { - text = text, - fn = fn, - now = false, - last = false - } -end -function love.keyboard.mouseWasReleased() - return love.keyboard.mouseisReleased -end -function autoSave(dt) - autoTimer = autoTimer + dt -end - -function balancer() - if (player2score == 9 or player1score == 9) then - shakeDuration = 10 - -- love.window.setTitle("ALMOST WIN") - end - if (player1score < player2score) then - p1bonus = (player2score - player1score) * 5 - else - p1bonus = 0 - end - if (player2score < player1score) then - p2bonus = (player1score - player2score) * 5 - else - p2bonus = 0 - end - - - end -function newWall(wallx, wally, wallwidth, wallheight) - return { - wallx = wallx, - wally = wally, - walwidth = wallwidth, - wallheight = wallheight - } -end -speedParameters = {} -buttons = {} -difbuttons = {} -settings = {} -walls = {} -editorpicks = {} -controlSettings = {} -modeSelectorButtons= {} -pracdiff = {} -playerCountButtons = {} -function controlChanger() - if (gameState == 'assign') then - love.graphics.clear(50/255,50/255,50/255,255) - love.graphics.printf('SELECT BUTTON',0,VIRTUAL_HEIGHT / 2,VIRTUAL_WIDTH,'center') - end -end -function love.load() - simpleScale.setWindow(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT) - configfile = io.open('config.lua', "r") - configsave = io.open('config.lua', "w") - shader = love.graphics.newShader(shader_code) - time_1 = 0 - 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', 30) - scorefont = love.graphics.newFont('font.ttf', 90) - love.graphics.setFont(smallfont) - - --push:setupScreen(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, { - -- fullscreen = isFullscreen, - -- resizable = true, - -- vsync = true, - --}) -player1score = 0 -player2score = 0 -areanuclear = 0 -player1nukescore = 0 -player2nukescore = 0 -striken = 0 -soundtype = 1 -soundturn = 1 -potentialstrike1 = 0 -potentialstrike2 = 0 -potentialnuke1 = 0 -potentialnuke2 = 0 -player1striken = 0 -player2striken = 0 -randomtext = 0 -selecting = 0 -number = 0 -elec = 1 -INDIC = { - '', '', '', '' -} ---playe1nuke -player1 = paddle(0,30,10,100, 1) -player2 = paddle(VIRTUAL_WIDTH * 0.99, VIRTUAL_HEIGHT * 0.88, 10, 100, 2) -player3 = paddle(5000, 5000, 10, 100) -player4 = paddle(5000, 5000, 10, 100) -ball = {} -ball[1] = eball(VIRTUAL_WIDTH / 2 , VIRTUAL_HEIGHT / 2 - 2, 16, 16) -ball[2] = eball(VIRTUAL_WIDTH / 1.9 , VIRTUAL_HEIGHT / 2 - 2, 16, 16) -ball[3] = eball(VIRTUAL_WIDTH / 1.8, VIRTUAL_HEIGHT / 2 - 2, 16, 16) -ball[4] = eball(VIRTUAL_WIDTH / 2.2, VIRTUAL_HEIGHT / 2 - 2, 16, 16) -ball[5] = eball(VIRTUAL_WIDTH / 2.1, VIRTUAL_HEIGHT / 2 - 2, 16, 16) -myscreen = fullScreener(RESOLUTION_SET, isFullscreen, DIFFERENCE_X, DIFFERENCE_Y) -mymenu = mainMenu() - -ballSpeed = 200 - - -ballDX = math.random(2) == 1 and 100 or -100 -ballDY = math.random(-50, 50) - -gameState = 'animation' -end -t = 0 -shakeDuration = 0 -shakeMagnitude = 1 -function startShake(duration, magnitude) - t, shakeDuration, shakeMagnitude = 0, duration or 1, magnitude or 5 -end -function displayFPS() -love.window.setTitle(love.timer.getFPS()) -end - -function speedControl() - if (ballSpeed > 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