| @@ -94,4 +94,8 @@ function staticanimator() | |||
| love.graphics.setColor(40/255,40/255,40/255,1) | |||
| love.graphics.circle("fill", player2.x, player2.y , diseffectRange[1]*100, 100) | |||
| end | |||
| end | |||
| end | |||
| function animateExplosion(x, y, v, color) | |||
| love.graphics.setColor(color) | |||
| love.graphics.circle("fill", x, y, explosionRange * v, 100) | |||
| end | |||
| @@ -0,0 +1,27 @@ | |||
| explosion = Class{} | |||
| function explosion:init(x, y, v, color) | |||
| self.color = color | |||
| self.x = x | |||
| self.y = y | |||
| self.v = v | |||
| self.range = 0 | |||
| self.killed = false | |||
| print(self.i) | |||
| end | |||
| function explosion:update(dt) | |||
| self.range = self.range + dt * 24 | |||
| if self.range * self.v > VIRTUAL_WIDTH * 2 then | |||
| print("killing myself with range" .. self.range) | |||
| self.killed = true | |||
| end | |||
| end | |||
| function explosion:render() | |||
| print("rendering myself" .. self.x .. " " .. self.y .. " " .. self.range .. " " .. self.v) | |||
| love.graphics.setColor(color) | |||
| love.graphics.circle("fill", self.x, self.y, self.range * self.v, 100) | |||
| end | |||
| @@ -15,7 +15,7 @@ doubleclick1 = false | |||
| doubleclick2 = false | |||
| hold1 = false | |||
| hold2 = false | |||
| debug = false | |||
| debug = true | |||
| paused = false | |||
| androidButtons = {} | |||
| pauseButtons = {} | |||
| @@ -170,6 +170,8 @@ function controlChanger() | |||
| end | |||
| function love.load() | |||
| love.keyboard.setKeyRepeat(true) | |||
| tick.framerate = 60 | |||
| simpleScale.setWindow(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT) | |||
| configfile = io.open("config.lua", "r") | |||
| configsave = io.open("config.lua", "w") | |||
| @@ -871,6 +873,7 @@ function love.load() | |||
| player3 = paddle(5000, 5000, 10, 100) | |||
| player4 = paddle(5000, 5000, 10, 100) | |||
| ball = {} | |||
| explosions = {} | |||
| 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) | |||
| @@ -900,7 +903,7 @@ function startShake(duration, magnitude) | |||
| t, shakeDuration, shakeMagnitude = 0, duration or 1, magnitude or 5 | |||
| end | |||
| function displayFPS() | |||
| --love.window.setTitle(love.timer.getFPS()) | |||
| love.window.setTitle(love.timer.getFPS()) | |||
| --love.window.setTitle(globalState .. " " .. gameState .. " " .. paddle_SPEED .. " " .. p1bonus .. " " .. player1.dy) | |||
| if love.keyboard.isDown("space") then | |||
| player1nukescore = 200 | |||
| @@ -918,7 +921,9 @@ end | |||
| function love.update(dt) | |||
| --print("IMPORTANT!!!!!" .. globalState .. gameState) | |||
| for i, explosion in ipairs(explosions) do | |||
| explosion:update(dt) | |||
| end | |||
| staticanimatorcounter(dt) | |||
| player1.goal = -1 | |||
| player2.goal = -1 | |||
| @@ -1,5 +1,4 @@ | |||
| function AI(target, ballCnt, diff) | |||
| print("AI RUNNING") | |||
| currentTarget = evaluateClosestBall(target); | |||
| --print("CLOSEST TARGET IS " .. currentTarget) | |||
| if diff < 1200 then | |||
| @@ -11,7 +11,7 @@ function basegame(dt) | |||
| end | |||
| speedControl() | |||
| balancer() | |||
| effectControl() | |||
| if t < shakeDuration then | |||
| t = t + dt | |||
| end | |||
| @@ -40,7 +40,7 @@ function basegame(dt) | |||
| --print(areanuclear .. striken .. player1score .. player2score) | |||
| for i = 1, maxBalls do | |||
| if rules("p1hit", i) then | |||
| print("inserted") | |||
| if (areanuclear == 0 and striken == 1 and (player1score > ptw*0.8 or player2score > ptw*0.8)) then | |||
| --print("Calling animation") | |||
| --print("AREA NUCLEAR?" .. areanuclear) | |||
| @@ -370,7 +370,7 @@ end | |||
| function goalManager() | |||
| for i = 1, maxBalls do | |||
| if (rules("p1miss", i)) then | |||
| if (rules("p1miss", i)) then | |||
| ball[i].disabled = true | |||
| ball[i].x = 2000 | |||
| @@ -587,6 +587,8 @@ function nuclearDraw() | |||
| 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") | |||
| @@ -630,6 +632,10 @@ function normalDraw() | |||
| else | |||
| love.graphics.clear(40 / 255, 40 / 255, 40 / 255, 1) | |||
| end | |||
| for i, explosion in ipairs(explosions) do | |||
| explosion:render() | |||
| print("exploding") | |||
| end | |||
| staticanimator() | |||
| if MAP_TYPE == 1 then | |||
| @@ -747,7 +753,6 @@ function menuDraw() | |||
| ) | |||
| ) | |||
| end | |||
| if not isAndroid then | |||
| table.insert( | |||
| IPselect, | |||
| newButton( | |||
| @@ -761,7 +766,6 @@ function menuDraw() | |||
| end | |||
| ) | |||
| ) | |||
| end | |||
| table.insert( | |||
| IPselect, | |||
| newButton( | |||
| @@ -848,6 +852,7 @@ function menuDraw() | |||
| end | |||
| function baseDraw() | |||
| love.graphics.clear(40 / 255, 40 / 255, 40 / 255, 1) | |||
| if shakeDuration > t then | |||
| local dx = love.math.random(-shakeMagnitude, shakeMagnitude) | |||
| @@ -867,6 +872,7 @@ function baseDraw() | |||
| menuDraw() | |||
| end | |||
| end | |||
| if globalState == 'base' or globalState == 'reverse' or globalState == 'nettest' or globalState == 'clienttest' then | |||
| love.graphics.setFont(smallfont) | |||
| @@ -892,6 +898,7 @@ function baseDraw() | |||
| mymenu:butt(gameState, VIRTUAL_WIDTH, VIRTUAL_HEIGHT, doneButtons, sounds, "middle") | |||
| love.keyboard.mouseisReleased = false | |||
| end | |||
| end | |||
| function androidDraw() | |||
| --HOME BUTTON HERE | |||
| @@ -1107,6 +1114,7 @@ function rules(query, i) | |||
| end | |||
| if query == "p1miss" then | |||
| if gameMode == "reversegame" then | |||
| return ball[i]:collides(player1) | |||
| elseif gameMode == "normal" then | |||
| return ball[i].x < -10 and ball[i].disabled == false | |||
| @@ -1132,7 +1140,7 @@ function clientsBaseGame(dt) | |||
| end | |||
| speedControl() | |||
| balancer() | |||
| effectControl() | |||
| if t < shakeDuration then | |||
| t = t + dt | |||
| end | |||
| @@ -1163,7 +1171,7 @@ function clientsBaseGame(dt) | |||
| --print(areanuclear .. striken .. player1score .. player2score) | |||
| for i = 1, maxBalls do | |||
| if rules("p1hit", i) then | |||
| if (areanuclear == 0 and striken == 1 and (player1score > ptw*0.8 or player2score > ptw*0.8)) then | |||
| --print("Calling animation") | |||
| superanimator("tensehit", 1) | |||
| @@ -1471,7 +1479,7 @@ function menuDemo(dt) | |||
| AI(player1, maxBalls, 1300) | |||
| player2.goal = 360 | |||
| end | |||
| print(neededTarget, neededTarget1) | |||
| --print(neededTarget, neededTarget1) | |||
| --print("menu demo active") | |||
| ball[1]:update(dt) | |||
| player1:update(dt) | |||
| @@ -1568,4 +1576,19 @@ function menuDemo(dt) | |||
| ball[1].dy = -ball[1].dy | |||
| end | |||
| end | |||
| function effectControl() | |||
| if player1score > 0.8 * ptw or player2score > 0.8 * ptw then | |||
| for i = 1, maxBalls do | |||
| if math.abs(ball[i].x - VIRTUAL_WIDTH/2) < 10 and #explosions < 1 then | |||
| table.insert(explosions, explosion(love.math.random(100, VIRTUAL_WIDTH-100), love.math.random(player1.y, player2.y), 100, {player1.y/2.81/255,player2.y/2.81/255,ball[1].y/2.81/255,0.4})) | |||
| end | |||
| end | |||
| end | |||
| for i, explosion in ipairs(explosions) do | |||
| if explosion.killed then | |||
| table.remove(explosions, i) | |||
| print("buried the body") | |||
| end | |||
| end | |||
| end | |||
| @@ -13,5 +13,7 @@ require 'src/constantvars' | |||
| require 'src/menus' | |||
| require 'src/AI' | |||
| require 'src/reverseGame' | |||
| require 'explosion' | |||
| tick = require 'tick' | |||
| utf8 = require("utf8") | |||
| serialize = require 'ser' | |||
| @@ -0,0 +1,70 @@ | |||
| -- tick | |||
| -- https://github.com/bjornbytes/tick | |||
| -- MIT License | |||
| local tick = { | |||
| framerate = nil, | |||
| rate = .03, | |||
| timescale = 1, | |||
| sleep = .001, | |||
| dt = 0, | |||
| accum = 0, | |||
| tick = 1, | |||
| frame = 1 | |||
| } | |||
| local timer = love.timer | |||
| local graphics = love.graphics | |||
| love.run = function() | |||
| if not timer then | |||
| error('love.timer is required for tick') | |||
| end | |||
| if love.load then love.load(love.arg.parseGameArguments(arg), arg) end | |||
| timer.step() | |||
| local lastframe = 0 | |||
| love.update(0) | |||
| return function() | |||
| tick.dt = timer.step() * tick.timescale | |||
| tick.accum = tick.accum + tick.dt | |||
| while tick.accum >= tick.rate do | |||
| tick.accum = tick.accum - tick.rate | |||
| if love.event then | |||
| love.event.pump() | |||
| for name, a, b, c, d, e, f in love.event.poll() do | |||
| if name == 'quit' then | |||
| if not love.quit or not love.quit() then | |||
| return a or 0 | |||
| end | |||
| end | |||
| love.handlers[name](a, b, c, d, e, f) | |||
| end | |||
| end | |||
| tick.tick = tick.tick + 1 | |||
| if love.update then love.update(tick.rate) end | |||
| end | |||
| while tick.framerate and timer.getTime() - lastframe < 1 / tick.framerate do | |||
| timer.sleep(.0005) | |||
| end | |||
| lastframe = timer.getTime() | |||
| if graphics and graphics.isActive() then | |||
| graphics.origin() | |||
| graphics.clear(graphics.getBackgroundColor()) | |||
| tick.frame = tick.frame + 1 | |||
| if love.draw then love.draw() end | |||
| graphics.present() | |||
| end | |||
| timer.sleep(tick.sleep) | |||
| end | |||
| end | |||
| return tick | |||