A pong clone, but with a twist!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.lua 46 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681
  1. --CALLING OTHER LUA FILES
  2. require "src/dependencies"
  3. io.stdout:setvbuf("no")
  4. --CANCELLED ATTEMPETED SHADING (NOT WORKING)
  5. local shader_code =
  6. [[
  7. vec4 effect(vec4 color, Image image, vec2 uvs, vec2 screen_coords) {
  8. vec4 pixel = Texel(image,uvs);
  9. return pixel * color;
  10. }
  11. ]]
  12. debug = true
  13. --GLOBAL VARIABLES
  14. status = "offline"
  15. gameMode = "normal"
  16. ts = 0
  17. globalState = "menu"
  18. timeIsSlow = false
  19. timeIsSlow2 = false
  20. originalSpeed = 200
  21. explosionRange = 0
  22. blockinput = false
  23. wall1width = 30
  24. nuclearanimation = 3
  25. easternum = 0
  26. ball_DIR = 0
  27. updaterate = 0.015
  28. RED = 255
  29. hitNum = {}
  30. hitNum[1] = 0
  31. hitNum[2] = 0
  32. hitNum[3] = 0
  33. confirmation = "N"
  34. hitNum[4] = 0
  35. p1bonus = 0
  36. p2bonus = 0
  37. hitNum[5] = 0
  38. hitNum[6] = 0
  39. GREEN = 255
  40. IP = '45.76.95.31'
  41. BLUE = 255
  42. updateTEXT = "Chalkboard Update"
  43. maxBalls = 1
  44. playerCount = 1
  45. player1reverbav = 0
  46. playertext = "1v1"
  47. player2reverbav = 0
  48. elapsed = 0
  49. rotation = 0
  50. TEXT = "Nuclear Pong"
  51. currentKey = " "
  52. ptw = 10
  53. --CHECKING IF CONTROLS ARE TAKEN
  54. danger = "none"
  55. danger2 = "none"
  56. nuckemodactive = 0
  57. maxspeed = 700
  58. DIFFERENCE_X = 1
  59. DIFFERENCE_Y = 1
  60. paddle_SPEED = 20
  61. textamount = 15
  62. AI_STRIKEMOD = 1000
  63. resolutionWin = 0
  64. AGAINST_AI = 0
  65. RESOLUTION_SET = 0
  66. AI_NUKEMOD = 1000
  67. animstart = true
  68. AI_SPEED = 30
  69. craz = 0
  70. AI_LEVEL = 500
  71. isFullscreen = 0
  72. prtext = "Easy"
  73. lastSentKey = "c"
  74. MAP_TYPE = 0
  75. lastSentKeyClient = "c"
  76. difficultyl = 300
  77. req = "pp"
  78. ballSet = 200
  79. p1control = {up = "a", down = "z", super = "s", counter = "x"}
  80. p2control = {up = ";", down = ".", super = "l", counter = ","}
  81. synctext = "Independent"
  82. synctype = 0
  83. function newButton(text, fn)
  84. return {
  85. text = text,
  86. fn = fn,
  87. now = false,
  88. last = false
  89. }
  90. end
  91. function love.keyboard.mouseWasReleased()
  92. return love.keyboard.mouseisReleased
  93. end
  94. function autoSave(dt)
  95. autoTimer = autoTimer + dt
  96. end
  97. function balancer()
  98. if (player2score == 9 or player1score == 9) then
  99. shakeDuration = 5
  100. if debug then
  101. --print("Shaking set to match almost over")
  102. end
  103. end
  104. if (player1score < player2score) then
  105. p1bonus = (player2score - player1score) * 5
  106. else
  107. p1bonus = 0
  108. end
  109. if (player2score < player1score) then
  110. p2bonus = (player1score - player2score) * 5
  111. else
  112. p2bonus = 0
  113. end
  114. end
  115. function newWall(wallx, wally, wallwidth, wallheight)
  116. return {
  117. wallx = wallx,
  118. wally = wally,
  119. walwidth = wallwidth,
  120. wallheight = wallheight
  121. }
  122. end
  123. speedParameters = {}
  124. buttons = {}
  125. IPselect = {}
  126. difbuttons = {}
  127. settings = {}
  128. walls = {}
  129. editorpicks = {}
  130. controlSettings = {}
  131. modeSelectorButtons = {}
  132. pracdiff = {}
  133. playerCountButtons = {}
  134. function controlChanger()
  135. if (gameState == "assign") then
  136. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  137. love.graphics.printf("SELECT BUTTON", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  138. end
  139. end
  140. function love.load()
  141. love.keyboard.setKeyRepeat(true)
  142. simpleScale.setWindow(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT)
  143. configfile = io.open("config.lua", "r")
  144. configsave = io.open("config.lua", "w")
  145. shader = love.graphics.newShader(shader_code)
  146. time_1 = 0
  147. --print("Debug active")
  148. --load
  149. testwalls = love.filesystem.load("save.lua")()
  150. if testwalls ~= nil then
  151. walls = love.filesystem.load("save.lua")()
  152. end
  153. light = 0
  154. image = love.graphics.newImage("Madi.png")
  155. table.insert(
  156. editorpicks,
  157. newButton(
  158. "C",
  159. function()
  160. for k in pairs(walls) do
  161. walls[k] = nil
  162. end
  163. end
  164. )
  165. )
  166. table.insert(
  167. editorpicks,
  168. newButton(
  169. "S",
  170. function()
  171. love.filesystem.write("save.lua", serialize(walls))
  172. end
  173. )
  174. )
  175. table.insert(
  176. editorpicks,
  177. newButton(
  178. "L",
  179. function()
  180. walls = love.filesystem.load("save.lua")()
  181. end
  182. )
  183. )
  184. table.insert(
  185. buttons,
  186. newButton(
  187. "Singleplayer",
  188. function()
  189. gameState = "gameMode"
  190. end
  191. )
  192. )
  193. table.insert(
  194. buttons,
  195. newButton(
  196. "Online",
  197. function()
  198. MAP_TYPE = 0
  199. gameState = "chooseIP"
  200. end
  201. )
  202. )
  203. table.insert(
  204. IPselect,
  205. newButton(
  206. "Host",
  207. function()
  208. globalState = "nettest"
  209. AGAINST_AI = 0
  210. gameState = "1serve"
  211. ball[1]:reset(1, 1)
  212. end
  213. )
  214. )
  215. table.insert(
  216. IPselect,
  217. newButton(
  218. "Guest",
  219. function()
  220. globalState = "clienttest"
  221. AGAINST_AI = 0
  222. gameState = "1serve"
  223. ball[1]:reset(1, 1)
  224. end
  225. )
  226. )
  227. table.insert(
  228. buttons,
  229. newButton(
  230. "Multiplayer",
  231. function()
  232. gameState = "multiMode"
  233. end
  234. )
  235. )
  236. table.insert(
  237. buttons,
  238. newButton(
  239. "Settings",
  240. function()
  241. AGAINST_AI = 0
  242. gameState = "windowsettings"
  243. end
  244. )
  245. )
  246. table.insert(
  247. buttons,
  248. newButton(
  249. "Exit",
  250. function()
  251. love.event.quit(0)
  252. end
  253. )
  254. )
  255. table.insert(
  256. difbuttons,
  257. newButton(
  258. "Easy",
  259. function()
  260. hardmanager("easy")
  261. end
  262. )
  263. )
  264. table.insert(
  265. difbuttons,
  266. newButton(
  267. "Normal",
  268. function()
  269. hardmanager("normal")
  270. end
  271. )
  272. )
  273. table.insert(
  274. difbuttons,
  275. newButton(
  276. "Hard",
  277. function()
  278. hardmanager("hard")
  279. end
  280. )
  281. )
  282. table.insert(
  283. difbuttons,
  284. newButton(
  285. "Smart",
  286. function()
  287. hardmanager("smart")
  288. end
  289. )
  290. )
  291. --table.insert(
  292. -- settings,
  293. -- newButton(
  294. -- "Change Map",
  295. -- function()
  296. -- MAP_TYPE = MAP_TYPE + 1
  297. -- end
  298. -- )
  299. --)
  300. table.insert(
  301. settings,
  302. newButton(
  303. "Toggle Fullscreen",
  304. function()
  305. myscreen:toggle(VIRTUAL_HEIGHT, VIRTUAL_WIDTH)
  306. DIFFERENCE_X = myscreen.c
  307. DIFFERENCE_Y = myscreen.d
  308. end
  309. )
  310. )
  311. table.insert(
  312. settings,
  313. newButton(
  314. "Editor",
  315. function()
  316. gameState = "editor"
  317. end
  318. )
  319. )
  320. table.insert(
  321. settings,
  322. newButton(
  323. "Speed Settings",
  324. function()
  325. gameState = "speedSettings"
  326. end
  327. )
  328. )
  329. table.insert(
  330. settings,
  331. newButton(
  332. "Control Settings",
  333. function()
  334. gameState = "controlSettings"
  335. end
  336. )
  337. )
  338. table.insert(
  339. settings,
  340. newButton(
  341. "Back to Menu",
  342. function()
  343. gameState = "menu"
  344. end
  345. )
  346. )
  347. table.insert(
  348. speedParameters,
  349. newButton(
  350. "Back to Menu",
  351. function()
  352. gameState = "windowsettings"
  353. end
  354. )
  355. )
  356. --table.insert(speedParameters, newButton("Ball Speed: ", function() speedSetter('ball') end))
  357. table.insert(
  358. playerCountButtons,
  359. newButton(
  360. "Ball Speed: ",
  361. function()
  362. speedSetter("ball")
  363. end
  364. )
  365. )
  366. --table.insert(speedParameters, newButton("snc", function() speedSetter('snc') end))
  367. table.insert(
  368. playerCountButtons,
  369. newButton(
  370. "snc",
  371. function()
  372. speedSetter("snc")
  373. end
  374. )
  375. )
  376. table.insert(
  377. speedParameters,
  378. newButton(
  379. "NUCLEAR MODE",
  380. function()
  381. speedSetter("nuclearmod")
  382. end
  383. )
  384. )
  385. table.insert(
  386. controlSettings,
  387. newButton(
  388. "1up",
  389. function()
  390. gameState = "assign"
  391. req = "p1up"
  392. end
  393. )
  394. )
  395. table.insert(
  396. controlSettings,
  397. newButton(
  398. "1down",
  399. function()
  400. gameState = "assign"
  401. req = "p1down"
  402. end
  403. )
  404. )
  405. table.insert(
  406. controlSettings,
  407. newButton(
  408. "1special",
  409. function()
  410. gameState = "assign"
  411. req = "p1super"
  412. end
  413. )
  414. )
  415. table.insert(
  416. controlSettings,
  417. newButton(
  418. "1ct",
  419. function()
  420. gameState = "assign"
  421. req = "p1ct"
  422. end
  423. )
  424. )
  425. table.insert(
  426. controlSettings,
  427. newButton(
  428. "2up",
  429. function()
  430. gameState = "assign"
  431. req = "p2up"
  432. end
  433. )
  434. )
  435. table.insert(
  436. controlSettings,
  437. newButton(
  438. "2down",
  439. function()
  440. gameState = "assign"
  441. req = "p2down"
  442. end
  443. )
  444. )
  445. table.insert(
  446. controlSettings,
  447. newButton(
  448. "2special",
  449. function()
  450. gameState = "assign"
  451. req = "p2super"
  452. end
  453. )
  454. )
  455. table.insert(
  456. controlSettings,
  457. newButton(
  458. "2ct",
  459. function()
  460. gameState = "assign"
  461. req = "p2ct"
  462. end
  463. )
  464. )
  465. table.insert(
  466. controlSettings,
  467. newButton(
  468. "Default",
  469. function()
  470. p1control = {up = "a", down = "z", super = "s", counter = "x"}
  471. p2control = {up = ";", down = ".", super = "l", counter = ","}
  472. end
  473. )
  474. )
  475. table.insert(
  476. controlSettings,
  477. newButton(
  478. "Return",
  479. function()
  480. gameState = "windowsettings"
  481. end
  482. )
  483. )
  484. table.insert(
  485. modeSelectorButtons,
  486. newButton(
  487. "Nuclear Pong",
  488. function()
  489. gameState = "difficulty"
  490. end
  491. )
  492. )
  493. table.insert(
  494. modeSelectorButtons,
  495. newButton(
  496. "Main Menu",
  497. function()
  498. gameState = "menu"
  499. end
  500. )
  501. )
  502. table.insert(
  503. pracdiff,
  504. newButton(
  505. "Silverblade",
  506. function()
  507. speedSetter("practice")
  508. end
  509. )
  510. )
  511. table.insert(
  512. pracdiff,
  513. newButton(
  514. "Return",
  515. function()
  516. speedSetter("reset")
  517. gameState = "gameMode"
  518. end
  519. )
  520. )
  521. table.insert(
  522. pracdiff,
  523. newButton(
  524. "Go!",
  525. function()
  526. gameMode = "practice"
  527. hardmanager("practice")
  528. end
  529. )
  530. )
  531. --table.insert(playerCountButtons, newButton("1v1", function() speedSetter('pc') end))
  532. table.insert(
  533. playerCountButtons,
  534. newButton(
  535. "ballCount",
  536. function()
  537. speedSetter("ballz")
  538. end
  539. )
  540. )
  541. table.insert(
  542. difbuttons,
  543. newButton(
  544. "ballCount",
  545. function()
  546. speedSetter("ballz")
  547. end
  548. )
  549. )
  550. table.insert(
  551. playerCountButtons,
  552. newButton(
  553. "Return",
  554. function()
  555. speedSetter("reset")
  556. gameState = "menu"
  557. end
  558. )
  559. )
  560. table.insert(
  561. playerCountButtons,
  562. newButton(
  563. "ptw",
  564. function()
  565. speedSetter("ptw")
  566. end
  567. )
  568. )
  569. table.insert(
  570. playerCountButtons,
  571. newButton(
  572. "Play",
  573. function()
  574. AGAINST_AI = 0
  575. gameState = "1serve"
  576. globalState = "base"
  577. end
  578. )
  579. )
  580. table.insert(
  581. playerCountButtons,
  582. newButton(
  583. "Reverse Play",
  584. function()
  585. gameState = "1serve"
  586. gameMode = "reversegame"
  587. globalState = "base"
  588. end
  589. )
  590. )
  591. --table.insert(speedParameters, newButton("Ball Speed: ", function() speedSetter() end))
  592. love.window.setTitle("NUCLEAR PONG")
  593. textphrases = {
  594. "Amazing",
  595. "Superb",
  596. "Absolutely beautiful!",
  597. "Awesome",
  598. "Look at That!",
  599. "Great",
  600. "Nice",
  601. "Boom!",
  602. "Dangerous!",
  603. "Astonishing!",
  604. "u/ebernerd saved me",
  605. "Absolutely Wonderful!",
  606. "Exsquisite",
  607. "Delicate",
  608. "Pow!",
  609. "Great Hit",
  610. "all hail nazarbayev"
  611. }
  612. sounds = {
  613. ["updateMusic"] = love.audio.newSource("audio/theme1.mp3", "static"),
  614. ["gayTheme"] = love.audio.newSource("audio/theme2.mp3", "static"),
  615. ["gayTheme2"] = love.audio.newSource("audio/theme3.mp3", "static"),
  616. ["gayTheme3"] = love.audio.newSource("audio/theme4.mp3", "static"),
  617. ["beep"] = love.audio.newSource("audio/hit1.mp3", "static"),
  618. ["wallhit"] = love.audio.newSource("audio/hit2.wav", "static"),
  619. ["win"] = love.audio.newSource("win.wav", "static"),
  620. ["score"] = love.audio.newSource("audio/score.wav", "static"),
  621. ["nuke"] = love.audio.newSource("audio/bomb.wav", "static"),
  622. ["striking"] = love.audio.newSource("audio/superhit.wav", "static"),
  623. ["nuclearhit"] = love.audio.newSource("audio/hit1.mp3", "static"),
  624. ["time"] = love.audio.newSource("audio/time.wav", "static")
  625. }
  626. love.graphics.setDefaultFilter("nearest", "nearest")
  627. --comic sans lmao
  628. math.randomseed(os.time())
  629. smallfont = love.graphics.newFont("font.ttf", 25)
  630. scorefont = love.graphics.newFont("font.ttf", 60)
  631. love.graphics.setFont(smallfont)
  632. --push:setupScreen(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, {
  633. -- fullscreen = isFullscreen,
  634. -- resizable = true,
  635. -- vsync = true,
  636. --})
  637. player1score = 0
  638. player2score = 0
  639. areanuclear = 0
  640. player1nukescore = 0
  641. player2nukescore = 0
  642. striken = 0
  643. soundtype = 1
  644. soundturn = 1
  645. potentialstrike1 = 0
  646. potentialstrike2 = 0
  647. potentialnuke1 = 0
  648. potentialnuke2 = 0
  649. player1striken = 0
  650. player2striken = 0
  651. randomtext = 0
  652. selecting = 0
  653. number = 0
  654. elec = 1
  655. INDIC = {
  656. "",
  657. "",
  658. "",
  659. ""
  660. }
  661. --playe1nuke
  662. player1 = paddle(0, 30, 10, 100, 1)
  663. player2 = paddle(VIRTUAL_WIDTH * 0.99, VIRTUAL_HEIGHT * 0.88, 10, 100, 2)
  664. player3 = paddle(5000, 5000, 10, 100)
  665. player4 = paddle(5000, 5000, 10, 100)
  666. ball = {}
  667. ball[1] = eball(VIRTUAL_WIDTH / 2, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  668. ball[2] = eball(VIRTUAL_WIDTH / 1.9, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  669. ball[3] = eball(VIRTUAL_WIDTH / 1.8, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  670. ball[4] = eball(VIRTUAL_WIDTH / 2.2, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  671. ball[5] = eball(VIRTUAL_WIDTH / 2.1, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  672. myscreen = fullScreener(RESOLUTION_SET, isFullscreen, DIFFERENCE_X, DIFFERENCE_Y)
  673. mymenu = mainMenu()
  674. ballSpeed = 200
  675. ballDX = math.random(2) == 1 and 100 or -100
  676. ballDY = math.random(-50, 50)
  677. gameState = "animation"
  678. end
  679. t = 0
  680. shakeDuration = 0
  681. shakeMagnitude = 1
  682. function startShake(duration, magnitude)
  683. t, shakeDuration, shakeMagnitude = 0, duration or 1, magnitude or 5
  684. end
  685. function displayFPS()
  686. --love.window.setTitle(love.timer.getFPS())
  687. love.window.setTitle(globalState .. " " .. gameState)
  688. if love.keyboard.isDown("space") then
  689. player1nukescore = 200
  690. player1score = player1score + 0.2
  691. player2nukescore = 200
  692. end
  693. end
  694. function speedControl()
  695. if (ballSpeed > maxspeed and gameState == "play") then
  696. ballSpeed = maxspeed
  697. end
  698. end
  699. function love.update(dt)
  700. --print("IMPORTANT!!!!!" .. globalState .. gameState)
  701. staticanimatorcounter(dt)
  702. if gameState == "chooseIP" then
  703. checkCurrentServer(dt)
  704. end
  705. musicController('norm', 1)
  706. if debug then
  707. displayFPS()
  708. end
  709. if globalState == "base" then
  710. basegame(dt)
  711. end
  712. if globalState == "menu" then
  713. debugCheck(dt)
  714. end
  715. if globalState == "nettest" then
  716. --print("Confcode: " .. confirmation)
  717. if confirmation == "N" then
  718. basegame(dt)
  719. end
  720. nettest(dt)
  721. end
  722. if globalState == "clienttest" then
  723. ts = ts + dt
  724. if confirmation == "N" then
  725. lastSentKeyP1 = lastSentKeyClient
  726. clientsBaseGame(dt)
  727. end
  728. clienttest(dt)
  729. end
  730. end
  731. serverinit = false
  732. datawaspassedtimer = 0
  733. clientinit = false
  734. function love.textinput(t)
  735. if gameState == "chooseIP" then
  736. IP = IP .. t
  737. end
  738. end
  739. function nettest(dt)
  740. if serverinit == false then
  741. local socket = require "socket"
  742. local address, port = IP, 12345
  743. print(address)
  744. udp = socket.udp()
  745. udp:setpeername(address, port)
  746. udp:settimeout(0)
  747. serverinit = true
  748. end
  749. for i = 1, maxBalls do
  750. ts = ts + dt
  751. if ts > updaterate then
  752. udp:send(tostring(lastSentKey) ..
  753. '|' .. tostring(ball[1].dy) ..
  754. '|' .. tostring(player2.y) ..
  755. '|' .. tostring(player1.y) ..
  756. '|' .. tostring(player1score) ..
  757. '|' .. tostring(player2score) ..
  758. '|' .. tostring(player1nukescore) ..
  759. '|' .. tostring(player2nukescore) ..
  760. '|' .. tostring(ball[1].x) ..
  761. '|' .. tostring(ball[1].y) ..
  762. '|' .. gameState ..
  763. '|' .. tostring(ball[1].dx) ..
  764. '|' .. tostring(ballSpeed) ..
  765. '|' .. tostring(paddle_SPEED) ..
  766. "|HOST")
  767. ts = 0
  768. end
  769. end
  770. local data
  771. local datanumtest = 0
  772. local datawaspassed = false
  773. repeat
  774. datanumtest = datanumtest + 1
  775. print("LATENCY: " .. tostring(datanumtest))
  776. data = udp:receive()
  777. if data then
  778. datawaspassed = true
  779. print("ReceivedINFO: " .. data)
  780. confirmation = "N"
  781. local p = split(data, '|')
  782. if p[15] then
  783. if tonumber(p[16]) > 90 then
  784. confirmation = "L"
  785. end
  786. if p[15] ~= "CLIENT" then
  787. confirmation = "U"
  788. end
  789. elseif p[1] == "RESPONSE" then
  790. if p[2] == "1" then
  791. elseif p[2] == "2" then
  792. elseif p[2] == "3" then
  793. end
  794. else
  795. confirmation = "U"
  796. end
  797. if ball[1].disabled and ball[1].x > 20 and ball[1].x < VIRTUAL_WIDTH - 20 then
  798. ball[1].disabled = false
  799. print("illegal disabling")
  800. end
  801. if (ball[1].x > VIRTUAL_WIDTH/2) then
  802. if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
  803. die = tonumber(p[2])
  804. lastSentKeyClient,
  805. ball[1].dy,
  806. player2.y,
  807. player1score,
  808. player2score,
  809. player1nukescore,
  810. player2nukescore,
  811. ball[1].x,
  812. ball[1].y,
  813. gameState,
  814. ball[1].dx,
  815. ballSpeed,
  816. paddle_SPEED = p[1], die, tonumber(p[4]), tonumber(p[5]), tonumber(p[6]), tonumber(p[7]), tonumber(p[8]), tonumber(p[9]), tonumber(p[10]), p[11], tonumber(p[12]), tonumber(p[13]), tonumber(p[14])
  817. print("ACCEPTED")
  818. else
  819. print("DECLINED")
  820. end
  821. else
  822. if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
  823. die = tonumber(p[2])
  824. lastSentKeyClient,
  825. ball[1].dy,
  826. player2.y,
  827. player1score,
  828. player2score,
  829. player1nukescore,
  830. player2nukescore,
  831. ball[1].x,
  832. ball[1].y,
  833. gameState,
  834. ball[1].dx,
  835. ballSpeed,
  836. paddle_SPEED = p[1], die, tonumber(p[4]), tonumber(p[5]), tonumber(p[6]), tonumber(p[7]), tonumber(p[8]), tonumber(p[9]), tonumber(p[10]), p[11], tonumber(p[12]), tonumber(p[13]), tonumber(p[14])
  837. print("ACCEPTED")
  838. else
  839. print("ENFORCED" .. ball[1].x .. " " .. ball[1].dx)
  840. lastSentKeyClient = p[1]
  841. player2.y = tonumber(p[4])
  842. end
  843. end
  844. end
  845. until not data
  846. if not datawaspassed then
  847. datawaspassedtimer = datawaspassedtimer + 1
  848. if datawaspassedtimer > 5 then
  849. confirmation = "D"
  850. datawaspassedtimer = 0
  851. end
  852. else
  853. datawaspassedtimer = 0
  854. end
  855. end
  856. function clienttest(dt)
  857. if clientinit == false then
  858. local socket = require "socket"
  859. local address, port = IP, 12345
  860. udp = socket.udp()
  861. udp:setpeername(address, port)
  862. udp:settimeout(0)
  863. clientinit = true
  864. end
  865. ts = ts + dt
  866. if ts > updaterate then
  867. udp:send(tostring(lastSentKey) ..
  868. '|' .. tostring(ball[1].dy) ..
  869. '|' .. tostring(player1.y) ..
  870. '|' .. tostring(player2.y) ..
  871. '|' .. tostring(player1score) ..
  872. '|' .. tostring(player2score) ..
  873. '|' .. tostring(player1nukescore) ..
  874. '|' .. tostring(player2nukescore) ..
  875. '|' .. tostring(ball[1].x) ..
  876. '|' .. tostring(ball[1].y) ..
  877. '|' .. gameState ..
  878. '|' .. tostring(ball[1].dx) ..
  879. '|' .. tostring(ballSpeed) ..
  880. '|' .. tostring(paddle_SPEED) ..
  881. "|CLIENT")
  882. ts = 0
  883. end
  884. local data
  885. local datanumtest = 0
  886. local datawaspassed = false
  887. repeat
  888. datanumtest = datanumtest + 1
  889. print("LATENCY: " .. tostring(datanumtest))
  890. data = udp:receive()
  891. if data then
  892. print("RECEIVED DATA: " .. data)
  893. datawaspassed = true
  894. print("SENT TO SERVER:" .. lastSentKey)
  895. confirmation = "N"
  896. local p = split(data, '|')
  897. if p[15] then
  898. if p[15] ~= "HOST" then
  899. confirmation = "U"
  900. end
  901. if tonumber(p[16]) > 90 then
  902. confirmation = "L"
  903. end
  904. for i = 1, maxBalls do
  905. local die = tonumber(p[2])
  906. if (ball[i].x <= VIRTUAL_WIDTH/2) then
  907. if tonumber(p[9]) <= VIRTUAL_WIDTH/2 then
  908. lastSentKeyClient, ball[i].dy, player1.y, player1score, player2score, player1nukescore, player2nukescore, ball[i].x, ball[i].y, gameState, ball[i].dx, ballSpeed, paddle_SPEED = p[1], die, tonumber(p[4]), tonumber(p[5]), tonumber(p[6]), tonumber(p[7]), tonumber(p[8]), tonumber(p[9]), tonumber(p[10]), p[11], tonumber(p[12]), tonumber(p[13]), tonumber(p[14])
  909. print("ACCEPTED")
  910. else
  911. print("DECLINED")
  912. end
  913. else
  914. if tonumber(p[9]) <= VIRTUAL_WIDTH/2 then
  915. lastSentKeyClient, ball[i].dy, player1.y, player1score, player2score, player1nukescore, player2nukescore, ball[i].x, ball[i].y, gameState, ball[i].dx, ballSpeed, paddle_SPEED = p[1], die, tonumber(p[4]), tonumber(p[5]), tonumber(p[6]), tonumber(p[7]), tonumber(p[8]), tonumber(p[9]), tonumber(p[10]), p[11], tonumber(p[12]), tonumber(p[13]), tonumber(p[14])
  916. print("REROUTED")
  917. else lastSentKeyClient = p[1]
  918. player1.y = tonumber(p[4])
  919. print("ENFORCED")
  920. end
  921. end
  922. end
  923. else
  924. confirmation = "U"
  925. end
  926. end
  927. print("GOT: " .. lastSentKeyClient)
  928. until not data
  929. if not datawaspassed then
  930. datawaspassedtimer = datawaspassedtimer + 1
  931. if datawaspassedtimer > 5 then
  932. confirmation = "D"
  933. datawaspassedtimer = 0
  934. end
  935. else
  936. datawaspassedtimer = 0
  937. end
  938. end
  939. function wallbreaker(x, y)
  940. if (gameState == "editor") then
  941. for i, wall in ipairs(walls) do
  942. if math.abs(wall.wallx - x) < 10 and math.abs(wall.wally - y) < 10 then
  943. table.remove(walls, i)
  944. end
  945. end
  946. end
  947. end
  948. function hardmanager(diff)
  949. selecting = 1
  950. if (diff == "easy") then
  951. INDIC[1] = ">"
  952. AGAINST_AI = 1
  953. AI_SPEED = ballSet / 10
  954. AI_STRIKEMOD = 100
  955. AI_NUKEMOD = 1000
  956. AI_LEVEL = 350
  957. difficultyl = 200
  958. selecting = 0
  959. gameState = "1serve"
  960. globalState = "base"
  961. end
  962. if (diff == "normal") then
  963. INDIC[2] = ">"
  964. AI_SPEED = ballSet / 10
  965. AI_LEVEL = 500
  966. AI_NUKEMOD = 250
  967. AI_STRIKEMOD = 60
  968. AGAINST_AI = 1
  969. difficultyl = 300
  970. selecting = 0
  971. gameState = "1serve"
  972. globalState = "base"
  973. end
  974. if (diff == "hard") then
  975. INDIC[3] = ">"
  976. AI_SPEED = ballSpeed * 1.1 + 50
  977. AI_SPEED = AI_SPEED / 10
  978. AI_LEVEL = 700
  979. AI_NUKEMOD = 200
  980. AI_STRIKEMOD = 20
  981. selecting = 0
  982. difficultyl = 350
  983. AGAINST_AI = 1
  984. gameState = "1serve"
  985. globalState = "base"
  986. end
  987. if (diff == "smart") then
  988. INDIC[3] = ">"
  989. AI_SPEED = ballSpeed * 1.1 + 50
  990. AI_SPEED = AI_SPEED / 10
  991. AI_LEVEL = 1500
  992. AI_NUKEMOD = 200
  993. AI_STRIKEMOD = 20
  994. selecting = 0
  995. difficultyl = 350
  996. AGAINST_AI = 1
  997. gameState = "1serve"
  998. globalState = "base"
  999. end
  1000. if (diff == "practice") then
  1001. INDIC[3] = ">"
  1002. AI_SPEED = ballSpeed * 500 + 50
  1003. AI_SPEED = AI_SPEED / 10
  1004. AI_LEVEL = 700
  1005. AI_NUKEMOD = 9000000000
  1006. AI_STRIKEMOD = 90000000
  1007. selecting = 0
  1008. difficultyl = 350
  1009. AGAINST_AI = 1
  1010. gameState = "base"
  1011. end
  1012. end
  1013. function dangerChecker() --CHECK IF CONTROLS ARE DUPLICATING
  1014. if (p1control.up == p1control.down) then
  1015. danger = "1up"
  1016. danger2 = "1down"
  1017. elseif (p1control.up == p1control.super) then
  1018. danger = "1up"
  1019. danger2 = "1special"
  1020. elseif (p1control.up == p1control.counter) then
  1021. danger = "1up"
  1022. danger2 = "1ct"
  1023. elseif (p1control.down == p1control.super) then
  1024. danger = "1down"
  1025. danger2 = "1special"
  1026. elseif (p1control.down == p1control.counter) then
  1027. danger = "1ct"
  1028. danger2 = "1down"
  1029. elseif (p1control.super == p1control.counter) then
  1030. danger = "1special"
  1031. danger2 = "1ct"
  1032. elseif (p2control.down == p2control.up) then
  1033. danger = "2down"
  1034. danger2 = "2up"
  1035. elseif (p2control.down == p2control.super) then
  1036. danger = "2down"
  1037. danger2 = "2special"
  1038. elseif (p2control.down == p2control.counter) then
  1039. danger = "2down"
  1040. danger2 = "2ct"
  1041. elseif (p2control.up == p2control.super) then
  1042. danger = "2up"
  1043. danger2 = "2special"
  1044. elseif (p2control.up == p2control.counter) then
  1045. danger = "2ct"
  1046. danger2 = "2up"
  1047. elseif (p2control.super == p2control.counter) then
  1048. danger = "2special"
  1049. danger2 = "2ct"
  1050. else
  1051. danger = "none"
  1052. danger2 = "none"
  1053. end
  1054. end
  1055. function love.keypressed(key)
  1056. lastSentKey = key
  1057. if gameState == "chooseIP" then
  1058. if key == "backspace" then
  1059. -- get the byte offset to the last UTF-8 character in the string.
  1060. local byteoffset = utf8.offset(IP, -1)
  1061. if byteoffset then
  1062. -- remove the last UTF-8 character.
  1063. -- string.sub operates on bytes rather than UTF-8 characters, so we couldn't do string.sub(text, 1, -2).
  1064. IP = string.sub(IP, 1, byteoffset - 1)
  1065. end
  1066. end
  1067. end
  1068. if gameState == "assign" then
  1069. if (req == "p1up") then
  1070. p1control.up = key
  1071. currentKey = key
  1072. --love.window.setTitle(key)
  1073. gameState = "controlSettings"
  1074. end
  1075. if (req == "p2up") then
  1076. p2control.up = key
  1077. currentKey = key
  1078. --love.window.setTitle(key)
  1079. gameState = "controlSettings"
  1080. end
  1081. if (req == "p1down") then
  1082. p1control.down = key
  1083. currentKey = key
  1084. --love.window.setTitle(key)
  1085. gameState = "controlSettings"
  1086. end
  1087. if (req == "p2down") then
  1088. p2control.down = key
  1089. currentKey = key
  1090. -- love.window.setTitle(key)
  1091. gameState = "controlSettings"
  1092. end
  1093. if (req == "p1super") then
  1094. p1control.super = key
  1095. currentKey = key
  1096. -- love.window.setTitle(key)
  1097. gameState = "controlSettings"
  1098. end
  1099. if (req == "p2super") then
  1100. p2control.super = key
  1101. currentKey = key
  1102. -- love.window.setTitle(key)
  1103. gameState = "controlSettings"
  1104. end
  1105. if (req == "p1ct") then
  1106. p1control.counter = key
  1107. currentKey = key
  1108. -- love.window.setTitle(key)
  1109. gameState = "controlSettings"
  1110. end
  1111. if (req == "p2ct") then
  1112. p2control.counter = key
  1113. currentKey = key
  1114. --love.window.setTitle(key)
  1115. gameState = "controlSettings"
  1116. end
  1117. end
  1118. if key == "escape" then
  1119. TEXT = "Escape Key"
  1120. love.event.quit()
  1121. elseif key == "enter" or key == "return" then
  1122. if gameState == "start" then
  1123. resettinggenius()
  1124. gameState = "menu"
  1125. globalState = "menu"
  1126. hardmanager()
  1127. elseif (gameState == "done") then
  1128. if (player1score > player2score) then
  1129. gameState = "2serve"
  1130. potentialnuke1 = 0
  1131. potentialnuke2 = 0
  1132. striken = 0
  1133. if (nuckemodactive == 0) then
  1134. areanuclear = 0
  1135. nuclearanimation = 3
  1136. end
  1137. potentialstrike1 = 0
  1138. potentialstrike2 = 0
  1139. player1nukescore = 0
  1140. player2nukescore = 0
  1141. else
  1142. gameState = "1serve"
  1143. resettinggenius()
  1144. for i = 1, maxBalls do
  1145. ball[i]:reset(i, 1)
  1146. end
  1147. end
  1148. else
  1149. gameState = "menu"
  1150. globalState = "menu"
  1151. if (love.math.random(0, 10) == 1) then
  1152. TEXT = "Nuclear Ching Chong"
  1153. else
  1154. TEXT = "Nuclear Pong"
  1155. end
  1156. resettinggenius()
  1157. for i = 1, maxBalls do
  1158. ball[i]:reset(i)
  1159. end
  1160. end
  1161. end
  1162. end
  1163. function love.keyreleased(key)
  1164. currentKey = " "
  1165. if lastSentKey == key then
  1166. lastSentKey = "g"
  1167. end
  1168. end
  1169. function speedSetter(requesttype)
  1170. if (requesttype == "ball") then
  1171. if (ballSet > 550) then
  1172. ballSet = 0
  1173. paddle_SPEED = 0
  1174. else
  1175. ballSet = ballSet + 50
  1176. paddle_SPEED = paddle_SPEED + 5
  1177. end
  1178. ballSpeed = ballSet
  1179. end
  1180. if (requesttype == "snc") then
  1181. synctype = synctype + 1
  1182. if (synctype > 1) then
  1183. synctype = 0
  1184. end
  1185. if synctype == 0 then
  1186. synctext = "Independent"
  1187. end
  1188. if synctype == 1 then
  1189. synctext = "Synchronised"
  1190. end
  1191. end
  1192. if (requesttype == "nuclearmod") then
  1193. nuckemodactive = nuckemodactive + 1
  1194. if (nuckemodactive > 1) then
  1195. nuckemodactive = 0
  1196. end
  1197. if (nuckemodactive == 0) then
  1198. areanuclear = 0
  1199. nuclearanimation = 3
  1200. ballSet = 200
  1201. TEXT = "Nuclear Pong"
  1202. synctype = 0
  1203. maxspeed = 700
  1204. synctext = "Independent"
  1205. paddle_SPEED = ballSet / 10
  1206. AI_SPEED = ballSet / 10
  1207. end
  1208. if (nuckemodactive == 1) then
  1209. areanuclear = 1
  1210. ballSet = 2000
  1211. maxspeed = 2000
  1212. paddle_SPEED = ballSet / 10
  1213. AI_SPEED = ballSet / 10
  1214. synctext = "death is imminent"
  1215. end
  1216. ballSpeed = ballSet
  1217. end
  1218. if (requesttype == "practice") then
  1219. if (ballSpeed > 999) then
  1220. ballSpeed = 200
  1221. ballSet = 200
  1222. end
  1223. if (ballSpeed > 799) then
  1224. prtext = "Insane"
  1225. maxBalls = 5
  1226. elseif ballSpeed > 599 then
  1227. prtext = "Hard"
  1228. maxBalls = 4
  1229. elseif ballSpeed > 399 then
  1230. prtext = "Normal"
  1231. maxBalls = 3
  1232. elseif ballSpeed > 199 then
  1233. prtext = "Easy"
  1234. maxBalls = 3
  1235. end
  1236. ballSpeed = ballSpeed + 200
  1237. ballSet = ballSet + 200
  1238. end
  1239. if (requesttype == "reset") then
  1240. ballSpeed = 200
  1241. ballSet = 200
  1242. synctype = 0
  1243. prtext = "Easy"
  1244. maxBalls = 1
  1245. end
  1246. if (requesttype == "pc") then
  1247. if (playerCount == 2) then
  1248. playerCount = 1
  1249. playertext = "1v1"
  1250. elseif (playerCount == 1) then
  1251. playerCount = playerCount + 1
  1252. player3.x = player1.x + VIRTUAL_WIDTH / 2
  1253. player3.y = player3.y
  1254. playertext = "2v2"
  1255. end
  1256. end
  1257. if (requesttype == "ballz") then
  1258. if (maxBalls > 1) then
  1259. --love.window.setTitle("more than 4")
  1260. maxBalls = 1
  1261. else
  1262. maxBalls = maxBalls + 1
  1263. end
  1264. end
  1265. if requesttype == "ptw" then
  1266. if ptw == 10 then
  1267. ptw = 1
  1268. else
  1269. ptw = ptw + 1
  1270. end
  1271. end
  1272. end
  1273. function gameModeChanger()
  1274. if (gameState == "gameMode") then
  1275. local button_width = VIRTUAL_WIDTH * (1 / 3)
  1276. local BUTTON_HEIGHT = 50
  1277. local margin = 20
  1278. local hot = false
  1279. local cursor_y = 0
  1280. local total_height = (BUTTON_HEIGHT + margin) * #buttons
  1281. for i, button in ipairs(modeSelectorButtons) do
  1282. button.last = button.now
  1283. local bx = (VIRTUAL_WIDTH * 0.5) - (button_width * 0.5)
  1284. local by = (VIRTUAL_HEIGHT * 0.5) - (total_height * 0.5) + cursor_y
  1285. local color = {255, 255, 255, 255}
  1286. local mx, my = love.mouse.getPosition()
  1287. mx = mx * DIFFERENCE_X
  1288. my = my * DIFFERENCE_Y
  1289. hot = (mx > bx and mx < bx + button_width and my > by and my < by + BUTTON_HEIGHT) and i
  1290. if (hot == i) then
  1291. color = {10, 10, 0, 255}
  1292. end
  1293. button.now = love.mouse.isDown(1)
  1294. if button.now and not button.last and hot == i then
  1295. love.graphics.setColor(0, 0, 0, 1)
  1296. love.graphics.rectangle("fill", 0, 0, VIRTUAL_WIDTH, VIRTUAL_HEIGHT)
  1297. sounds["wallhit"]:play()
  1298. button.fn()
  1299. end
  1300. love.graphics.setColor(unpack(color))
  1301. love.graphics.rectangle("fill", bx, by, button_width, BUTTON_HEIGHT)
  1302. love.graphics.setColor(0, 0, 0, 255)
  1303. local textW = smallfont:getWidth(button.text)
  1304. local textH = smallfont:getHeight(button.text)
  1305. love.graphics.print(button.text, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1306. love.graphics.setColor(255, 255, 255, 255)
  1307. cursor_y = cursor_y + (BUTTON_HEIGHT + margin)
  1308. end
  1309. end
  1310. if (gameState == "multiMode") then
  1311. local button_width = VIRTUAL_WIDTH * (1 / 3)
  1312. local BUTTON_HEIGHT = 50
  1313. local margin = 20
  1314. local hot = false
  1315. local cursor_y = 0
  1316. local total_height = (BUTTON_HEIGHT + margin) * #buttons
  1317. for i, button in ipairs(playerCountButtons) do
  1318. button.last = button.now
  1319. local bx = (VIRTUAL_WIDTH * 0.5) - (button_width * 0.5)
  1320. local by = (VIRTUAL_HEIGHT * 0.3) - (total_height * 0.5) + cursor_y
  1321. if (button.text == "Play") then
  1322. by = by + by / 1.8
  1323. end
  1324. local color = {255, 255, 255, 255}
  1325. local mx, my = love.mouse.getPosition()
  1326. mx = mx * DIFFERENCE_X
  1327. my = my * DIFFERENCE_Y
  1328. hot = (mx > bx and mx < bx + button_width and my > by and my < by + BUTTON_HEIGHT) and i
  1329. if (hot == i) then
  1330. if (button.text == "Play") then
  1331. color = {0 / 255, 255 / 255, 0 / 255, 255}
  1332. else
  1333. color = {10, 10, 0, 255}
  1334. end
  1335. end
  1336. button.now = love.mouse.isDown(1)
  1337. if button.now and not button.last and hot == i then
  1338. love.graphics.setColor(0, 0, 0, 1)
  1339. love.graphics.rectangle("fill", 0, 0, VIRTUAL_WIDTH, VIRTUAL_HEIGHT)
  1340. sounds["wallhit"]:play()
  1341. if button.text == "Ball Speed: " and nuckemodactive == 1 then
  1342. else
  1343. button.fn()
  1344. end
  1345. end
  1346. love.graphics.setColor(unpack(color))
  1347. love.graphics.rectangle("fill", bx, by, button_width, BUTTON_HEIGHT)
  1348. love.graphics.setColor(0, 0, 0, 255)
  1349. local textW = smallfont:getWidth(button.text)
  1350. local textH = smallfont:getHeight(button.text)
  1351. if (button.text == "1v1") then
  1352. love.graphics.print(playertext, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1353. elseif button.text == "snc" then
  1354. if (nuckemodactive == 1) then
  1355. love.graphics.setColor(1, 0, 0, 1)
  1356. love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1357. love.graphics.setColor(1, 1, 1, 1)
  1358. love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1359. love.graphics.setColor(0, 0, 0, 1)
  1360. else
  1361. --
  1362. love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH * 0.45 - textW * 0.5, by + textH * 0.5)
  1363. end
  1364. elseif (button.text == "ballCount") then
  1365. love.graphics.print(
  1366. "Ball Count: " .. maxBalls,
  1367. smallfont,
  1368. VIRTUAL_WIDTH * 0.5 - textW * 0.5,
  1369. by + textH * 0.5
  1370. )
  1371. elseif (button.text == "Ball Speed: ") then
  1372. if (nuckemodactive == 1) then
  1373. love.graphics.setColor(1, 0, 0, 1)
  1374. love.graphics.print(
  1375. "shaitan machina",
  1376. smallfont,
  1377. VIRTUAL_WIDTH * 0.5 - textW * 0.5,
  1378. by + textH * 0.5
  1379. )
  1380. love.graphics.setColor(1, 1, 1, 1)
  1381. love.graphics.print(
  1382. "shaitan machina",
  1383. smallfont,
  1384. VIRTUAL_WIDTH * 0.5 - textW * 0.5,
  1385. by + textH * 0.5
  1386. )
  1387. love.graphics.setColor(0, 0, 0, 1)
  1388. else
  1389. love.graphics.print(
  1390. button.text .. ballSet,
  1391. smallfont,
  1392. VIRTUAL_WIDTH * 0.5 - textW * 0.5,
  1393. by + textH * 0.5
  1394. )
  1395. end
  1396. elseif button.text == "ptw" then
  1397. love.graphics.print(
  1398. "Points to Win: " .. ptw,
  1399. smallfont,
  1400. VIRTUAL_WIDTH * 0.5 - textW * 1.5,
  1401. by + textH * 0.5
  1402. )
  1403. else
  1404. love.graphics.print(button.text, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1405. end
  1406. love.graphics.setColor(255, 255, 255, 255)
  1407. cursor_y = cursor_y + (BUTTON_HEIGHT + margin)
  1408. end
  1409. end
  1410. end
  1411. function love.draw(dt)
  1412. simpleScale.set()
  1413. baseDraw()
  1414. if (globalState == "nettest" or globalState == "clienttest") and confirmation == "D" then
  1415. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  1416. love.graphics.printf("WAIT FOR OPPONENT", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  1417. end
  1418. if (globalState == "nettest" or globalState == "clienttest") and confirmation == "U" then
  1419. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  1420. love.graphics.printf("LOBBY FULL OR WRONG MODE CHOSEN", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  1421. end
  1422. if (globalState == "nettest" or globalState == "clienttest") and confirmation == "L" then
  1423. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  1424. love.graphics.printf("POOR CONNECTION TO SERVER", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  1425. end
  1426. simpleScale.unSet()
  1427. end
  1428. --Check if controls are duplicating
  1429. function controllerSer()
  1430. for i = 1, maxBalls do
  1431. if (ball[i].dy == 0) then
  1432. hitNum[i] = hitNum[i] + 1
  1433. if hitNum[i] >= 10 then
  1434. ball[i].dy = 1
  1435. hitNum[i] = 0
  1436. end
  1437. else
  1438. hitNum[i] = 0
  1439. end
  1440. end
  1441. end
  1442. function palleteController() --!!!!LEGACY CODE, MIGRATED TO Paddle.lua!!!!
  1443. if (areanuclear == 0) then
  1444. player1.RED = 1
  1445. player1.GREEN = 1
  1446. player1.BLUE = 1
  1447. end
  1448. if (areanuclear == 0) then
  1449. player2.RED = 1
  1450. player2.GREEN = 1
  1451. player2.BLUE = 1
  1452. end
  1453. if (areanuclear == 1) then
  1454. player1.RED = 0
  1455. player1.GREEN = 0
  1456. player1.BLUE = 0
  1457. end
  1458. if (areanuclear == 1) then
  1459. player2.RED = 0
  1460. player2.GREEN = 0
  1461. player2.BLUE = 0
  1462. end
  1463. end
  1464. function love.wheelmoved(x, y)
  1465. if (y < 0 and wall1width > 0) then
  1466. wall1width = wall1width - 5
  1467. elseif y > 0 and wall1width < 900 then
  1468. wall1width = wall1width + 5
  1469. end
  1470. end
  1471. function serveBot() --THIS IS USED TO CHANGE TEXT/BALL DIRECTION ON DIFFERENT SERVES
  1472. --print("servebot called")
  1473. if (gameState == "1serve") then
  1474. updateTEXT = ""
  1475. if (gameMode ~= "practice") then
  1476. TEXT = "PLAYER 1, serve!(q)"
  1477. end
  1478. if ((globalState ~= "clienttest" and love.keyboard.isDown("q")) or (globalState == "clienttest" and lastSentKeyP1 == "q")) then
  1479. TEXT = "Lets Begin!"
  1480. ball_DIR = 1
  1481. for i = 1, maxBalls do
  1482. ball[i]:reset(i, 1)
  1483. end
  1484. gameState = "play"
  1485. end
  1486. end
  1487. if (gameState == "2serve") then
  1488. TEXT = "PLAYER 2, serve!(p)"
  1489. if (AGAINST_AI == 1) then
  1490. TEXT = ""
  1491. ball_DIR = -1
  1492. for i = 1, maxBalls do
  1493. ball[i]:reset(i, 2)
  1494. end
  1495. gameState = "play"
  1496. end
  1497. if (((globalState == "nettest" and lastSentKeyClient == "p") or ((globalState ~= "nettest") and love.keyboard.isDown("p")))and AGAINST_AI == 0) then
  1498. TEXT = "Lets Begin"
  1499. ball_DIR = -1
  1500. for i = 1, maxBalls do
  1501. ball[i]:reset(i, 2)
  1502. end
  1503. --love.window.setTitle("An atttttttt")
  1504. gameState = "play"
  1505. end
  1506. end
  1507. end
  1508. function mapChanger()
  1509. if (gameState == "editor") then
  1510. MAP_TYPE = 2
  1511. end
  1512. if (MAP_TYPE > 2) then
  1513. MAP_TYPE = 0
  1514. end
  1515. end
  1516. function resolutionChanger()
  1517. if (RESOLUTION_SET > 1) then
  1518. RESOLUTION_SET = 0
  1519. end
  1520. if (RESOLUTION_SET == 0) then
  1521. if (isFullscreen == 1) then
  1522. DIFFERENCE_X = 1
  1523. DIFFERENCE_Y = 1
  1524. simpleScale.updateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, {fullscreen = false})
  1525. isFullscreen = 0
  1526. end
  1527. end
  1528. if (RESOLUTION_SET == 1) then
  1529. if (isFullscreen == 0) then
  1530. simpleScale.updateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, {fullscreen = true})
  1531. local newWidth = love.graphics.getWidth()
  1532. local newHeight = love.graphics.getHeight()
  1533. DIFFERENCE_X = VIRTUAL_WIDTH / newWidth
  1534. DIFFERENCE_Y = VIRTUAL_HEIGHT / newHeight
  1535. isFullscreen = 1
  1536. end
  1537. end
  1538. end
  1539. function resettinggenius()
  1540. maxBalls = 1
  1541. for i = 1, maxBalls do
  1542. ball[i]:reset(i)
  1543. end
  1544. paddle_SPEED = 20
  1545. nuclearanimation = 3
  1546. timeIsSlow = false
  1547. timeIsSlow2 = false
  1548. originalSpeed = 200
  1549. gameState = "menu"
  1550. globalState = "menu"
  1551. gameMode = "normal"
  1552. player1.height = 100
  1553. player2.height = 100
  1554. ballSet = 200
  1555. ballSpeed = ballSet
  1556. player2.GREEN = 255
  1557. player2.BLUE = 255
  1558. player1.GREEN = 255
  1559. player1.BLUE = 255
  1560. player1score = 0
  1561. player2score = 0
  1562. potentialnuke1 = 0
  1563. potentialnuke2 = 0
  1564. striken = 0
  1565. areanuclear = 0
  1566. potentialstrike1 = 0
  1567. potentialstrike2 = 0
  1568. player1nukescore = 0
  1569. player2nukescore = 0
  1570. player1reverbav = 0
  1571. player2reverbav = 0
  1572. selecting = 0
  1573. AGAINST_AI = 0
  1574. end
  1575. function love.mousereleased(x, y, button)
  1576. love.keyboard.mouseisReleased = true
  1577. if (gameState == "editor") then
  1578. if (#walls < 1000 and button == 1 and blockinput ~= true) then
  1579. table.insert(walls, newWall(x * DIFFERENCE_X, y * DIFFERENCE_Y, 10, wall1width))
  1580. end
  1581. end
  1582. end
  1583. function ballsAlive()
  1584. for i = 1, maxBalls do
  1585. if ball[i].disabled == false then
  1586. print("Ball " .. i .. " is not disabled")
  1587. return true
  1588. end
  1589. end
  1590. return false
  1591. end
  1592. function split(s, delimiter)
  1593. result = {}
  1594. for match in (s..delimiter):gmatch("(.-)"..delimiter) do
  1595. table.insert(result, match)
  1596. end
  1597. return result
  1598. end
  1599. function checkCurrentServer(dt)
  1600. ts = ts + dt
  1601. local socket = require "socket"
  1602. local address, port = IP, 12345
  1603. udp = socket.udp()
  1604. udp:setpeername(address, port)
  1605. udp:settimeout(0)
  1606. if ts > updaterate then
  1607. print("sent ping")
  1608. udp:send("HELLO")
  1609. ts = 0
  1610. end
  1611. status = "offline"
  1612. local data
  1613. local datanumtest = 0
  1614. local datawaspassed = false
  1615. data = udp:receive()
  1616. repeat
  1617. datanumtest = datanumtest + 1
  1618. print("LATENCY: " .. tostring(datanumtest))
  1619. data = udp:receive()
  1620. if data then
  1621. datawaspassed = true
  1622. print("ReceivedINFO: " .. data)
  1623. local p = split(data, '|')
  1624. end
  1625. until not data
  1626. end