A pong clone, but with a twist!
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

main.lua 62 KiB

4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161
  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. --ANDROID EXLUSIVE VARIABLES
  13. touches = {}
  14. doubleclick1 = false
  15. doubleclick2 = false
  16. hold1 = false
  17. hold2 = false
  18. debug = true
  19. androidButtons = {}
  20. showTouchControls = false
  21. --GLOBAL VARIABLES
  22. frameratecap = 1/60
  23. realtimer = 0
  24. myip = "unknown"
  25. status = "offline"
  26. gameMode = "normal"
  27. ts = 0
  28. globalState = "menu"
  29. timeIsSlow = false
  30. timeIsSlow2 = false
  31. originalSpeed = 200
  32. explosionRange = 0
  33. blockinput = false
  34. wall1width = 30
  35. nuclearanimation = 3
  36. easternum = 0
  37. ball_DIR = 0
  38. updaterate = 0.015
  39. RED = 255
  40. hitNum = {}
  41. hitNum[1] = 0
  42. hitNum[2] = 0
  43. hitNum[3] = 0
  44. confirmation = "N"
  45. hitNum[4] = 0
  46. p1bonus = 0
  47. p2bonus = 0
  48. hitNum[5] = 0
  49. hitNum[6] = 0
  50. GREEN = 255
  51. IP = '45.76.95.31'
  52. IPnew = '45.76.95.31'
  53. BLUE = 255
  54. updateTEXT = "Chalkboard Update"
  55. maxBalls = 1
  56. playerCount = 1
  57. player1reverbav = 0
  58. playertext = "1v1"
  59. player2reverbav = 0
  60. elapsed = 0
  61. rotation = 0
  62. TEXT = "Nuclear Pong"
  63. currentKey = " "
  64. ptw = 10
  65. checkrate = 0.5
  66. --CHECKING IF CONTROLS ARE TAKEN
  67. danger = "none"
  68. danger2 = "none"
  69. nuckemodactive = 0
  70. maxspeed = 700
  71. DIFFERENCE_X = 1
  72. DIFFERENCE_Y = 1
  73. paddle_SPEED = 200
  74. textamount = 15
  75. AI_STRIKEMOD = 1000
  76. resolutionWin = 0
  77. AGAINST_AI = 0
  78. RESOLUTION_SET = 0
  79. AI_NUKEMOD = 1000
  80. animstart = true
  81. AI_SPEED = 300
  82. craz = 0
  83. AI_LEVEL = 500
  84. isFullscreen = 0
  85. prtext = "Easy"
  86. lastSentKey = "c"
  87. MAP_TYPE = 0
  88. lastSentKeyClient = "c"
  89. difficultyl = 300
  90. req = "pp"
  91. ballSet = 200
  92. p1control = {up = "a", down = "z", super = "s", counter = "x"}
  93. p2control = {up = ";", down = ".", super = "l", counter = ","}
  94. synctext = "Independent"
  95. synctype = 0
  96. function newTouch(id, x, y)
  97. return {
  98. id = id,
  99. x = x,
  100. y = y,
  101. originalX = x,
  102. originalY = y
  103. }
  104. end
  105. function newButton(text, fn)
  106. return {
  107. text = text,
  108. fn = fn,
  109. now = false,
  110. last = false
  111. }
  112. end
  113. function love.keyboard.mouseWasReleased()
  114. return love.keyboard.mouseisReleased
  115. end
  116. function autoSave(dt)
  117. autoTimer = autoTimer + dt
  118. end
  119. function balancer()
  120. if (player2score == 9 or player1score == 9) then
  121. shakeDuration = 5
  122. if debug then
  123. --print("Shaking set to match almost over")
  124. end
  125. end
  126. if (player1score < player2score) then
  127. p1bonus = (player2score - player1score) * 5
  128. else
  129. p1bonus = 0
  130. end
  131. if (player2score < player1score) then
  132. p2bonus = (player1score - player2score) * 5
  133. else
  134. p2bonus = 0
  135. end
  136. end
  137. function newWall(wallx, wally, wallwidth, wallheight)
  138. return {
  139. wallx = wallx,
  140. wally = wally,
  141. walwidth = wallwidth,
  142. wallheight = wallheight
  143. }
  144. end
  145. speedParameters = {}
  146. buttons = {}
  147. IPselect = {}
  148. difbuttons = {}
  149. settings = {}
  150. walls = {}
  151. editorpicks = {}
  152. controlSettings = {}
  153. modeSelectorButtons = {}
  154. pracdiff = {}
  155. playerCountButtons = {}
  156. function controlChanger()
  157. if (gameState == "assign") then
  158. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  159. love.graphics.printf("SELECT BUTTON", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  160. end
  161. end
  162. function love.load()
  163. love.keyboard.setKeyRepeat(true)
  164. simpleScale.setWindow(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT)
  165. configfile = io.open("config.lua", "r")
  166. configsave = io.open("config.lua", "w")
  167. shader = love.graphics.newShader(shader_code)
  168. time_1 = 0
  169. --print("Debug active")
  170. --load
  171. testwalls = love.filesystem.load("save.lua")()
  172. if testwalls ~= nil then
  173. walls = love.filesystem.load("save.lua")()
  174. end
  175. light = 0
  176. image = love.graphics.newImage("Madi.png")
  177. table.insert(
  178. androidButtons,
  179. newButton(
  180. "H",
  181. function()
  182. if gameState == "start" then
  183. resettinggenius()
  184. gameState = "menu"
  185. globalState = "menu"
  186. hardmanager()
  187. elseif (gameState == "done") then
  188. if (player1score > player2score) then
  189. gameState = "2serve"
  190. potentialnuke1 = 0
  191. potentialnuke2 = 0
  192. striken = 0
  193. if (nuckemodactive == 0) then
  194. areanuclear = 0
  195. nuclearanimation = 3
  196. end
  197. potentialstrike1 = 0
  198. potentialstrike2 = 0
  199. player1nukescore = 0
  200. player2nukescore = 0
  201. else
  202. gameState = "1serve"
  203. resettinggenius()
  204. for i = 1, maxBalls do
  205. ball[i]:reset(i, 1)
  206. end
  207. end
  208. else
  209. gameState = "menu"
  210. globalState = "menu"
  211. if (love.math.random(0, 10) == 1) then
  212. TEXT = "Nuclear Ching Chong"
  213. else
  214. TEXT = "Nuclear Pong"
  215. end
  216. resettinggenius()
  217. for i = 1, maxBalls do
  218. ball[i]:reset(i)
  219. end
  220. end
  221. end
  222. )
  223. )
  224. table.insert(
  225. editorpicks,
  226. newButton(
  227. "C",
  228. function()
  229. for k in pairs(walls) do
  230. walls[k] = nil
  231. end
  232. end
  233. )
  234. )
  235. table.insert(
  236. editorpicks,
  237. newButton(
  238. "S",
  239. function()
  240. love.filesystem.write("save.lua", serialize(walls))
  241. end
  242. )
  243. )
  244. table.insert(
  245. editorpicks,
  246. newButton(
  247. "L",
  248. function()
  249. walls = love.filesystem.load("save.lua")()
  250. end
  251. )
  252. )
  253. table.insert(
  254. buttons,
  255. newButton(
  256. "Singleplayer",
  257. function()
  258. gameState = "gameMode"
  259. end
  260. )
  261. )
  262. table.insert(
  263. buttons,
  264. newButton(
  265. "Online",
  266. function()
  267. MAP_TYPE = 0
  268. if isAndroid then
  269. love.keyboard.setTextInput( true, 0, VIRTUAL_HEIGHT, VIRTUAL_WIDTH, VIRTUAL_HEIGHT/3)
  270. end
  271. gameState = "chooseIP"
  272. end
  273. )
  274. )
  275. table.insert(
  276. IPselect,
  277. newButton(
  278. "Host",
  279. function()
  280. globalState = "nettest"
  281. AGAINST_AI = 0
  282. gameState = "1serve"
  283. ball[1]:reset(1, 1)
  284. end
  285. )
  286. )
  287. table.insert(
  288. IPselect,
  289. newButton(
  290. "Guest",
  291. function()
  292. globalState = "clienttest"
  293. AGAINST_AI = 0
  294. gameState = "1serve"
  295. ball[1]:reset(1, 1)
  296. end
  297. )
  298. )
  299. table.insert(
  300. buttons,
  301. newButton(
  302. "Multiplayer",
  303. function()
  304. gameState = "multiMode"
  305. end
  306. )
  307. )
  308. if not isAndroid then
  309. table.insert(
  310. buttons,
  311. newButton(
  312. "Settings",
  313. function()
  314. AGAINST_AI = 0
  315. gameState = "windowsettings"
  316. end
  317. )
  318. )
  319. else
  320. table.insert(
  321. buttons,
  322. newButton(
  323. "Show Controls",
  324. function()
  325. if showTouchControls then
  326. showTouchControls = false
  327. else
  328. showTouchControls = true
  329. end
  330. gameState = "touchcontrols"
  331. end
  332. )
  333. )
  334. end
  335. table.insert(
  336. buttons,
  337. newButton(
  338. "Exit",
  339. function()
  340. love.event.quit(0)
  341. end
  342. )
  343. )
  344. table.insert(
  345. difbuttons,
  346. newButton(
  347. "Easy",
  348. function()
  349. hardmanager("easy")
  350. end
  351. )
  352. )
  353. table.insert(
  354. difbuttons,
  355. newButton(
  356. "Normal",
  357. function()
  358. hardmanager("normal")
  359. end
  360. )
  361. )
  362. table.insert(
  363. difbuttons,
  364. newButton(
  365. "Hard",
  366. function()
  367. hardmanager("hard")
  368. end
  369. )
  370. )
  371. table.insert(
  372. difbuttons,
  373. newButton(
  374. "Smart",
  375. function()
  376. hardmanager("smart")
  377. end
  378. )
  379. )
  380. --table.insert(
  381. -- settings,
  382. -- newButton(
  383. -- "Change Map",
  384. -- function()
  385. -- MAP_TYPE = MAP_TYPE + 1
  386. -- end
  387. -- )
  388. --)
  389. table.insert(
  390. settings,
  391. newButton(
  392. "Toggle Fullscreen",
  393. function()
  394. myscreen:toggle(VIRTUAL_HEIGHT, VIRTUAL_WIDTH)
  395. DIFFERENCE_X = myscreen.c
  396. DIFFERENCE_Y = myscreen.d
  397. end
  398. )
  399. )
  400. table.insert(
  401. settings,
  402. newButton(
  403. "Editor",
  404. function()
  405. gameState = "editor"
  406. end
  407. )
  408. )
  409. table.insert(
  410. settings,
  411. newButton(
  412. "Speed Settings",
  413. function()
  414. gameState = "speedSettings"
  415. end
  416. )
  417. )
  418. table.insert(
  419. settings,
  420. newButton(
  421. "Control Settings",
  422. function()
  423. gameState = "controlSettings"
  424. end
  425. )
  426. )
  427. table.insert(
  428. settings,
  429. newButton(
  430. "Back to Menu",
  431. function()
  432. gameState = "menu"
  433. end
  434. )
  435. )
  436. table.insert(
  437. speedParameters,
  438. newButton(
  439. "Back to Menu",
  440. function()
  441. gameState = "windowsettings"
  442. end
  443. )
  444. )
  445. --table.insert(speedParameters, newButton("Ball Speed: ", function() speedSetter('ball') end))
  446. table.insert(
  447. playerCountButtons,
  448. newButton(
  449. "Ball Speed: ",
  450. function()
  451. speedSetter("ball")
  452. end
  453. )
  454. )
  455. --table.insert(speedParameters, newButton("snc", function() speedSetter('snc') end))
  456. table.insert(
  457. playerCountButtons,
  458. newButton(
  459. "snc",
  460. function()
  461. speedSetter("snc")
  462. end
  463. )
  464. )
  465. table.insert(
  466. speedParameters,
  467. newButton(
  468. "NUCLEAR MODE",
  469. function()
  470. speedSetter("nuclearmod")
  471. end
  472. )
  473. )
  474. table.insert(
  475. controlSettings,
  476. newButton(
  477. "1up",
  478. function()
  479. gameState = "assign"
  480. req = "p1up"
  481. end
  482. )
  483. )
  484. table.insert(
  485. controlSettings,
  486. newButton(
  487. "1down",
  488. function()
  489. gameState = "assign"
  490. req = "p1down"
  491. end
  492. )
  493. )
  494. table.insert(
  495. controlSettings,
  496. newButton(
  497. "1special",
  498. function()
  499. gameState = "assign"
  500. req = "p1super"
  501. end
  502. )
  503. )
  504. table.insert(
  505. controlSettings,
  506. newButton(
  507. "1ct",
  508. function()
  509. gameState = "assign"
  510. req = "p1ct"
  511. end
  512. )
  513. )
  514. table.insert(
  515. controlSettings,
  516. newButton(
  517. "2up",
  518. function()
  519. gameState = "assign"
  520. req = "p2up"
  521. end
  522. )
  523. )
  524. table.insert(
  525. controlSettings,
  526. newButton(
  527. "2down",
  528. function()
  529. gameState = "assign"
  530. req = "p2down"
  531. end
  532. )
  533. )
  534. table.insert(
  535. controlSettings,
  536. newButton(
  537. "2special",
  538. function()
  539. gameState = "assign"
  540. req = "p2super"
  541. end
  542. )
  543. )
  544. table.insert(
  545. controlSettings,
  546. newButton(
  547. "2ct",
  548. function()
  549. gameState = "assign"
  550. req = "p2ct"
  551. end
  552. )
  553. )
  554. table.insert(
  555. controlSettings,
  556. newButton(
  557. "Default",
  558. function()
  559. p1control = {up = "a", down = "z", super = "s", counter = "x"}
  560. p2control = {up = ";", down = ".", super = "l", counter = ","}
  561. end
  562. )
  563. )
  564. table.insert(
  565. controlSettings,
  566. newButton(
  567. "Return",
  568. function()
  569. gameState = "windowsettings"
  570. end
  571. )
  572. )
  573. table.insert(
  574. modeSelectorButtons,
  575. newButton(
  576. "Nuclear Pong",
  577. function()
  578. gameState = "difficulty"
  579. end
  580. )
  581. )
  582. table.insert(
  583. modeSelectorButtons,
  584. newButton(
  585. "Main Menu",
  586. function()
  587. gameState = "menu"
  588. end
  589. )
  590. )
  591. table.insert(
  592. pracdiff,
  593. newButton(
  594. "Silverblade",
  595. function()
  596. speedSetter("practice")
  597. end
  598. )
  599. )
  600. table.insert(
  601. pracdiff,
  602. newButton(
  603. "Return",
  604. function()
  605. speedSetter("reset")
  606. gameState = "gameMode"
  607. end
  608. )
  609. )
  610. table.insert(
  611. pracdiff,
  612. newButton(
  613. "Go!",
  614. function()
  615. gameMode = "practice"
  616. hardmanager("practice")
  617. end
  618. )
  619. )
  620. --table.insert(playerCountButtons, newButton("1v1", function() speedSetter('pc') end))
  621. table.insert(
  622. playerCountButtons,
  623. newButton(
  624. "ballCount",
  625. function()
  626. speedSetter("ballz")
  627. end
  628. )
  629. )
  630. table.insert(
  631. difbuttons,
  632. newButton(
  633. "ballCount",
  634. function()
  635. speedSetter("ballz")
  636. end
  637. )
  638. )
  639. table.insert(
  640. playerCountButtons,
  641. newButton(
  642. "Return",
  643. function()
  644. speedSetter("reset")
  645. gameState = "menu"
  646. end
  647. )
  648. )
  649. table.insert(
  650. playerCountButtons,
  651. newButton(
  652. "ptw",
  653. function()
  654. speedSetter("ptw")
  655. end
  656. )
  657. )
  658. table.insert(
  659. playerCountButtons,
  660. newButton(
  661. "Play",
  662. function()
  663. AGAINST_AI = 0
  664. gameState = "1serve"
  665. globalState = "base"
  666. end
  667. )
  668. )
  669. table.insert(
  670. playerCountButtons,
  671. newButton(
  672. "Reverse Play",
  673. function()
  674. gameState = "1serve"
  675. gameMode = "reversegame"
  676. globalState = "base"
  677. end
  678. )
  679. )
  680. --table.insert(speedParameters, newButton("Ball Speed: ", function() speedSetter() end))
  681. love.window.setTitle("NUCLEAR PONG")
  682. textphrases = {
  683. "Amazing",
  684. "Superb",
  685. "Absolutely beautiful!",
  686. "Awesome",
  687. "Look at That!",
  688. "Great",
  689. "Nice",
  690. "Boom!",
  691. "Dangerous!",
  692. "Astonishing!",
  693. "u/ebernerd saved me",
  694. "Absolutely Wonderful!",
  695. "Exsquisite",
  696. "Delicate",
  697. "Pow!",
  698. "Great Hit",
  699. "all hail nazarbayev"
  700. }
  701. sounds = {
  702. ["updateMusic"] = love.audio.newSource("audio/theme1.mp3", "static"),
  703. ["gayTheme"] = love.audio.newSource("audio/theme2.mp3", "static"),
  704. ["gayTheme2"] = love.audio.newSource("audio/theme3.mp3", "static"),
  705. ["gayTheme3"] = love.audio.newSource("audio/theme4.mp3", "static"),
  706. ["beep"] = love.audio.newSource("audio/hit1.mp3", "static"),
  707. ["wallhit"] = love.audio.newSource("audio/hit2.wav", "static"),
  708. ["win"] = love.audio.newSource("win.wav", "static"),
  709. ["score"] = love.audio.newSource("audio/score.wav", "static"),
  710. ["nuke"] = love.audio.newSource("audio/bomb.wav", "static"),
  711. ["striking"] = love.audio.newSource("audio/superhit.wav", "static"),
  712. ["nuclearhit"] = love.audio.newSource("audio/hit1.mp3", "static"),
  713. ["time"] = love.audio.newSource("audio/time.wav", "static")
  714. }
  715. love.graphics.setDefaultFilter("nearest", "nearest")
  716. --comic sans lmao
  717. math.randomseed(os.time())
  718. smallfont = love.graphics.newFont("font.ttf", 25)
  719. scorefont = love.graphics.newFont("font.ttf", 60)
  720. love.graphics.setFont(smallfont)
  721. --push:setupScreen(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, {
  722. -- fullscreen = isFullscreen,
  723. -- resizable = true,
  724. -- vsync = true,
  725. --})
  726. player1score = 0
  727. player2score = 0
  728. areanuclear = 0
  729. player1nukescore = 0
  730. player2nukescore = 0
  731. striken = 0
  732. soundtype = 1
  733. soundturn = 1
  734. potentialstrike1 = 0
  735. potentialstrike2 = 0
  736. potentialnuke1 = 0
  737. potentialnuke2 = 0
  738. player1striken = 0
  739. player2striken = 0
  740. randomtext = 0
  741. selecting = 0
  742. number = 0
  743. elec = 1
  744. INDIC = {
  745. "",
  746. "",
  747. "",
  748. ""
  749. }
  750. --playe1nuke
  751. player1 = paddle(0, 30, 10, 100, 1)
  752. player2 = paddle(VIRTUAL_WIDTH * 0.99, VIRTUAL_HEIGHT * 0.88, 10, 100, 2)
  753. player3 = paddle(5000, 5000, 10, 100)
  754. player4 = paddle(5000, 5000, 10, 100)
  755. ball = {}
  756. ball[1] = eball(VIRTUAL_WIDTH / 2, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  757. ball[2] = eball(VIRTUAL_WIDTH / 1.9, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  758. ball[3] = eball(VIRTUAL_WIDTH / 1.8, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  759. ball[4] = eball(VIRTUAL_WIDTH / 2.2, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  760. ball[5] = eball(VIRTUAL_WIDTH / 2.1, VIRTUAL_HEIGHT / 2 - 2, 16, 16)
  761. myscreen = fullScreener(RESOLUTION_SET, isFullscreen, DIFFERENCE_X, DIFFERENCE_Y)
  762. if isAndroid then
  763. myscreen:toggle(VIRTUAL_HEIGHT, VIRTUAL_WIDTH)
  764. DIFFERENCE_X = myscreen.c
  765. DIFFERENCE_Y = myscreen.d
  766. end
  767. mymenu = mainMenu()
  768. ballSpeed = 200
  769. ballDX = math.random(2) == 1 and 100 or -100
  770. ballDY = math.random(-50, 50)
  771. gameState = "animation"
  772. end
  773. t = 0
  774. shakeDuration = 0
  775. shakeMagnitude = 1
  776. function startShake(duration, magnitude)
  777. t, shakeDuration, shakeMagnitude = 0, duration or 1, magnitude or 5
  778. end
  779. function displayFPS()
  780. --love.window.setTitle(love.timer.getFPS())
  781. love.window.setTitle(globalState .. " " .. gameState .. " " .. paddle_SPEED .. " " .. p1bonus .. " " .. player1.dy)
  782. if love.keyboard.isDown("space") then
  783. player1nukescore = 200
  784. player1score = player1score + 0.2
  785. player2nukescore = 200
  786. end
  787. end
  788. function speedControl()
  789. if (ballSpeed > maxspeed and gameState == "play") then
  790. ballSpeed = maxspeed
  791. end
  792. end
  793. function love.update(dt)
  794. --print("IMPORTANT!!!!!" .. globalState .. gameState)
  795. staticanimatorcounter(dt)
  796. musicController('norm', 1)
  797. if gameState == "chooseIP" then
  798. checkCurrentServer(dt)
  799. end
  800. if debug then
  801. displayFPS()
  802. end
  803. if globalState == "base" then
  804. basegame(dt)
  805. end
  806. if globalState == "menu" then
  807. debugCheck(dt)
  808. end
  809. if globalState == "nettest" then
  810. --print("Confcode: " .. confirmation)
  811. if confirmation == "N" then
  812. basegame(dt)
  813. end
  814. nettest(dt)
  815. end
  816. if globalState == "selfhost" then
  817. --print("Confcode: " .. confirmation)
  818. if confirmation == "N" then
  819. globalState = "nettest"
  820. basegame(dt)
  821. end
  822. globalState = "selfhost"
  823. selfHost(dt)
  824. IP = "127.0.0.1"
  825. end
  826. if globalState == "clienttest" then
  827. ts = ts + dt
  828. if confirmation == "N" then
  829. lastSentKeyP1 = lastSentKeyClient
  830. clientsBaseGame(dt)
  831. end
  832. clienttest(dt)
  833. end
  834. end
  835. serverinit = false
  836. dserverinit = false
  837. datawaspassedtimer = 0
  838. clientinit = false
  839. function love.textinput(t)
  840. if gameState == "chooseIP" then
  841. IPnew = IPnew .. t
  842. end
  843. end
  844. function nettest(dt)
  845. print("nettest running")
  846. if serverinit == false then
  847. local socket = require "socket"
  848. local address, port = IP, 12345
  849. print(address)
  850. udp = socket.udp()
  851. udp:setpeername(address, port)
  852. udp:settimeout(0)
  853. serverinit = true
  854. end
  855. for i = 1, maxBalls do
  856. ts = ts + dt
  857. if ts > updaterate then
  858. udp:send(tostring(lastSentKey) ..
  859. '|' .. tostring(ball[1].dy) ..
  860. '|' .. tostring(player2.y) ..
  861. '|' .. tostring(player1.y) ..
  862. '|' .. tostring(player1score) ..
  863. '|' .. tostring(player2score) ..
  864. '|' .. tostring(player1nukescore) ..
  865. '|' .. tostring(player2nukescore) ..
  866. '|' .. tostring(ball[1].x) ..
  867. '|' .. tostring(ball[1].y) ..
  868. '|' .. gameState ..
  869. '|' .. tostring(ball[1].dx) ..
  870. '|' .. tostring(ballSpeed) ..
  871. '|' .. tostring(paddle_SPEED) ..
  872. '|' .. tostring(player1striken) ..
  873. "|HOST")
  874. ts = 0
  875. end
  876. end
  877. local data
  878. local datanumtest = 0
  879. local datawaspassed = false
  880. repeat
  881. datanumtest = datanumtest + 1
  882. print("LATENCY: " .. tostring(datanumtest))
  883. data = udp:receive()
  884. if data then
  885. datawaspassed = true
  886. print("ReceivedINFO: " .. data)
  887. confirmation = "N"
  888. local p = split(data, '|')
  889. if p[16] then
  890. if tonumber(p[17]) > 90 then
  891. confirmation = "L"
  892. end
  893. if p[16] ~= "CLIENT" then
  894. confirmation = "U"
  895. end
  896. elseif p[1] == "RESPONSE" then
  897. if p[2] == "1" then
  898. elseif p[2] == "2" then
  899. elseif p[2] == "3" then
  900. end
  901. else
  902. confirmation = "U"
  903. end
  904. if p[16] then
  905. if ball[1].disabled and ball[1].x > 20 and ball[1].x < VIRTUAL_WIDTH - 20 then
  906. ball[1].disabled = false
  907. print("illegal disabling")
  908. end
  909. if gameState ~= "1serve" then
  910. if (ball[1].x > VIRTUAL_WIDTH/2) then
  911. if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
  912. die = tonumber(p[2])
  913. lastSentKeyClient,
  914. ball[1].dy,
  915. player2.y,
  916. player1score,
  917. player2score,
  918. player1nukescore,
  919. player2nukescore,
  920. ball[1].x,
  921. ball[1].y,
  922. gameState,
  923. ball[1].dx,
  924. ballSpeed,
  925. paddle_SPEED,
  926. player2striken = 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]), tonumber(p[15])
  927. print("ACCEPTED")
  928. else
  929. print("DECLINED")
  930. end
  931. else
  932. if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
  933. die = tonumber(p[2])
  934. lastSentKeyClient,
  935. ball[1].dy,
  936. player2.y,
  937. player1score,
  938. player2score,
  939. player1nukescore,
  940. player2nukescore,
  941. ball[1].x,
  942. ball[1].y,
  943. gameState,
  944. ball[1].dx,
  945. ballSpeed,
  946. paddle_SPEED, player2striken = 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]), tonumber(p[15])
  947. print("ACCEPTED")
  948. else
  949. print("ENFORCED" .. ball[1].x .. " " .. ball[1].dx)
  950. lastSentKeyClient = p[1]
  951. player2striken = tonumber(p[15])
  952. player2.y = tonumber(p[4])
  953. end
  954. end
  955. end
  956. end
  957. end
  958. until not data
  959. if not datawaspassed then
  960. datawaspassedtimer = datawaspassedtimer + 1
  961. if datawaspassedtimer > 5 then
  962. confirmation = "D"
  963. datawaspassedtimer = 0
  964. end
  965. else
  966. datawaspassedtimer = 0
  967. end
  968. end
  969. function clienttest(dt)
  970. if clientinit == false then
  971. local socket = require "socket"
  972. local address, port = IP, 12345
  973. udp = socket.udp()
  974. udp:setpeername(address, port)
  975. udp:settimeout(0)
  976. clientinit = true
  977. end
  978. ts = ts + dt
  979. if ts > updaterate then
  980. udp:send(tostring(lastSentKey) ..
  981. '|' .. tostring(ball[1].dy) ..
  982. '|' .. tostring(player1.y) ..
  983. '|' .. tostring(player2.y) ..
  984. '|' .. tostring(player1score) ..
  985. '|' .. tostring(player2score) ..
  986. '|' .. tostring(player1nukescore) ..
  987. '|' .. tostring(player2nukescore) ..
  988. '|' .. tostring(ball[1].x) ..
  989. '|' .. tostring(ball[1].y) ..
  990. '|' .. gameState ..
  991. '|' .. tostring(ball[1].dx) ..
  992. '|' .. tostring(ballSpeed) ..
  993. '|' .. tostring(paddle_SPEED) ..
  994. '|' .. tostring(player2striken) ..
  995. "|CLIENT")
  996. ts = 0
  997. end
  998. local data
  999. local datanumtest = 0
  1000. local datawaspassed = false
  1001. repeat
  1002. datanumtest = datanumtest + 1
  1003. print("LATENCY: " .. tostring(datanumtest))
  1004. data = udp:receive()
  1005. if data then
  1006. print("RECEIVED DATA: " .. data)
  1007. datawaspassed = true
  1008. print("SENT TO SERVER:" .. lastSentKey)
  1009. confirmation = "N"
  1010. local p = split(data, '|')
  1011. if p[16] then
  1012. if p[16] ~= "HOST" then
  1013. confirmation = "U"
  1014. end
  1015. if tonumber(p[17]) > 90 then
  1016. confirmation = "L"
  1017. end
  1018. for i = 1, maxBalls do
  1019. local die = tonumber(p[2])
  1020. if (ball[i].x <= VIRTUAL_WIDTH/2) then
  1021. if tonumber(p[9]) <= VIRTUAL_WIDTH/2 then
  1022. lastSentKeyClient, ball[i].dy, player1.y, player1score, player2score, player1nukescore, player2nukescore, ball[i].x, ball[i].y, gameState, ball[i].dx, ballSpeed, paddle_SPEED, player1striken = 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]), tonumber(p[15])
  1023. print("ACCEPTED")
  1024. else
  1025. print("DECLINED")
  1026. end
  1027. else
  1028. if tonumber(p[9]) <= VIRTUAL_WIDTH/2 then
  1029. lastSentKeyClient, ball[i].dy, player1.y, player1score, player2score, player1nukescore, player2nukescore, ball[i].x, ball[i].y, gameState, ball[i].dx, ballSpeed, paddle_SPEED, player1striken = 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]), tonumber(p[15])
  1030. print("REROUTED")
  1031. else lastSentKeyClient = p[1]
  1032. player1.y = tonumber(p[4])
  1033. player1striken = tonumber(p[15])
  1034. print("ENFORCED")
  1035. end
  1036. end
  1037. end
  1038. else
  1039. confirmation = "U"
  1040. end
  1041. end
  1042. print("GOT: " .. lastSentKeyClient)
  1043. until not data
  1044. if not datawaspassed then
  1045. datawaspassedtimer = datawaspassedtimer + 1
  1046. if datawaspassedtimer > 5 then
  1047. confirmation = "D"
  1048. datawaspassedtimer = 0
  1049. end
  1050. else
  1051. datawaspassedtimer = 0
  1052. end
  1053. end
  1054. function wallbreaker(x, y)
  1055. if (gameState == "editor") then
  1056. for i, wall in ipairs(walls) do
  1057. if math.abs(wall.wallx - x) < 10 and math.abs(wall.wally - y) < 10 then
  1058. table.remove(walls, i)
  1059. end
  1060. end
  1061. end
  1062. end
  1063. function hardmanager(diff)
  1064. selecting = 1
  1065. if (diff == "easy") then
  1066. INDIC[1] = ">"
  1067. AGAINST_AI = 1
  1068. AI_SPEED = ballSet
  1069. AI_STRIKEMOD = 100
  1070. AI_NUKEMOD = 1000
  1071. AI_LEVEL = 350
  1072. difficultyl = 200
  1073. selecting = 0
  1074. gameState = "1serve"
  1075. globalState = "base"
  1076. end
  1077. if (diff == "normal") then
  1078. INDIC[2] = ">"
  1079. AI_SPEED = ballSet
  1080. AI_LEVEL = 500
  1081. AI_NUKEMOD = 250
  1082. AI_STRIKEMOD = 60
  1083. AGAINST_AI = 1
  1084. difficultyl = 300
  1085. selecting = 0
  1086. gameState = "1serve"
  1087. globalState = "base"
  1088. end
  1089. if (diff == "hard") then
  1090. INDIC[3] = ">"
  1091. AI_SPEED = ballSpeed * 1.1 + 50
  1092. AI_LEVEL = 700
  1093. AI_NUKEMOD = 200
  1094. AI_STRIKEMOD = 20
  1095. selecting = 0
  1096. difficultyl = 350
  1097. AGAINST_AI = 1
  1098. gameState = "1serve"
  1099. globalState = "base"
  1100. end
  1101. if (diff == "smart") then
  1102. INDIC[3] = ">"
  1103. AI_SPEED = ballSpeed * 1.1 + 50
  1104. AI_LEVEL = 1500
  1105. AI_NUKEMOD = 200
  1106. AI_STRIKEMOD = 20
  1107. selecting = 0
  1108. difficultyl = 350
  1109. AGAINST_AI = 1
  1110. gameState = "1serve"
  1111. globalState = "base"
  1112. end
  1113. if (diff == "practice") then
  1114. INDIC[3] = ">"
  1115. AI_SPEED = ballSpeed * 500 + 50
  1116. AI_LEVEL = 700
  1117. AI_NUKEMOD = 9000000000
  1118. AI_STRIKEMOD = 90000000
  1119. selecting = 0
  1120. difficultyl = 350
  1121. AGAINST_AI = 1
  1122. gameState = "base"
  1123. end
  1124. end
  1125. function dangerChecker() --CHECK IF CONTROLS ARE DUPLICATING
  1126. if (p1control.up == p1control.down) then
  1127. danger = "1up"
  1128. danger2 = "1down"
  1129. elseif (p1control.up == p1control.super) then
  1130. danger = "1up"
  1131. danger2 = "1special"
  1132. elseif (p1control.up == p1control.counter) then
  1133. danger = "1up"
  1134. danger2 = "1ct"
  1135. elseif (p1control.down == p1control.super) then
  1136. danger = "1down"
  1137. danger2 = "1special"
  1138. elseif (p1control.down == p1control.counter) then
  1139. danger = "1ct"
  1140. danger2 = "1down"
  1141. elseif (p1control.super == p1control.counter) then
  1142. danger = "1special"
  1143. danger2 = "1ct"
  1144. elseif (p2control.down == p2control.up) then
  1145. danger = "2down"
  1146. danger2 = "2up"
  1147. elseif (p2control.down == p2control.super) then
  1148. danger = "2down"
  1149. danger2 = "2special"
  1150. elseif (p2control.down == p2control.counter) then
  1151. danger = "2down"
  1152. danger2 = "2ct"
  1153. elseif (p2control.up == p2control.super) then
  1154. danger = "2up"
  1155. danger2 = "2special"
  1156. elseif (p2control.up == p2control.counter) then
  1157. danger = "2ct"
  1158. danger2 = "2up"
  1159. elseif (p2control.super == p2control.counter) then
  1160. danger = "2special"
  1161. danger2 = "2ct"
  1162. else
  1163. danger = "none"
  1164. danger2 = "none"
  1165. end
  1166. end
  1167. function love.keypressed(key)
  1168. if not isAndroid then
  1169. lastSentKey = key
  1170. end
  1171. if gameState == "chooseIP" then
  1172. if key == "backspace" then
  1173. -- get the byte offset to the last UTF-8 character in the string.
  1174. local byteoffset = utf8.offset(IPnew, -1)
  1175. if byteoffset then
  1176. -- remove the last UTF-8 character.
  1177. -- string.sub operates on bytes rather than UTF-8 characters, so we couldn't do string.sub(text, 1, -2).
  1178. IPnew = string.sub(IPnew, 1, byteoffset - 1)
  1179. end
  1180. end
  1181. end
  1182. if gameState == "assign" then
  1183. if (req == "p1up") then
  1184. p1control.up = key
  1185. currentKey = key
  1186. --love.window.setTitle(key)
  1187. gameState = "controlSettings"
  1188. end
  1189. if (req == "p2up") then
  1190. p2control.up = key
  1191. currentKey = key
  1192. --love.window.setTitle(key)
  1193. gameState = "controlSettings"
  1194. end
  1195. if (req == "p1down") then
  1196. p1control.down = key
  1197. currentKey = key
  1198. --love.window.setTitle(key)
  1199. gameState = "controlSettings"
  1200. end
  1201. if (req == "p2down") then
  1202. p2control.down = key
  1203. currentKey = key
  1204. -- love.window.setTitle(key)
  1205. gameState = "controlSettings"
  1206. end
  1207. if (req == "p1super") then
  1208. p1control.super = key
  1209. currentKey = key
  1210. -- love.window.setTitle(key)
  1211. gameState = "controlSettings"
  1212. end
  1213. if (req == "p2super") then
  1214. p2control.super = key
  1215. currentKey = key
  1216. -- love.window.setTitle(key)
  1217. gameState = "controlSettings"
  1218. end
  1219. if (req == "p1ct") then
  1220. p1control.counter = key
  1221. currentKey = key
  1222. -- love.window.setTitle(key)
  1223. gameState = "controlSettings"
  1224. end
  1225. if (req == "p2ct") then
  1226. p2control.counter = key
  1227. currentKey = key
  1228. --love.window.setTitle(key)
  1229. gameState = "controlSettings"
  1230. end
  1231. end
  1232. if key == "escape" then
  1233. if not isAndroid then
  1234. TEXT = "Escape Key"
  1235. love.event.quit()
  1236. end
  1237. elseif key == "enter" or key == "return" then
  1238. if gameState == "start" then
  1239. resettinggenius()
  1240. gameState = "menu"
  1241. globalState = "menu"
  1242. hardmanager()
  1243. elseif (gameState == "done") then
  1244. if (player1score > player2score) then
  1245. gameState = "2serve"
  1246. potentialnuke1 = 0
  1247. potentialnuke2 = 0
  1248. striken = 0
  1249. if (nuckemodactive == 0) then
  1250. areanuclear = 0
  1251. nuclearanimation = 3
  1252. end
  1253. potentialstrike1 = 0
  1254. potentialstrike2 = 0
  1255. player1nukescore = 0
  1256. player2nukescore = 0
  1257. else
  1258. gameState = "1serve"
  1259. resettinggenius()
  1260. for i = 1, maxBalls do
  1261. ball[i]:reset(i, 1)
  1262. end
  1263. end
  1264. else
  1265. gameState = "menu"
  1266. globalState = "menu"
  1267. if (love.math.random(0, 20) == 1) then
  1268. TEXT = "Nuclear Ching Chong"
  1269. else
  1270. TEXT = "Nuclear Pong"
  1271. end
  1272. resettinggenius()
  1273. for i = 1, maxBalls do
  1274. ball[i]:reset(i)
  1275. end
  1276. end
  1277. end
  1278. end
  1279. function love.keyreleased(key)
  1280. currentKey = " "
  1281. if lastSentKey == key and not isAndroid then
  1282. lastSentKey = "g"
  1283. end
  1284. end
  1285. function speedSetter(requesttype)
  1286. if (requesttype == "ball") then
  1287. if (ballSet > 550) then
  1288. ballSet = 0
  1289. paddle_SPEED = 0
  1290. else
  1291. ballSet = ballSet + 50
  1292. paddle_SPEED = paddle_SPEED + 5
  1293. end
  1294. ballSpeed = ballSet
  1295. end
  1296. if (requesttype == "snc") then
  1297. synctype = synctype + 1
  1298. if (synctype > 1) then
  1299. synctype = 0
  1300. end
  1301. if synctype == 0 then
  1302. synctext = "Independent"
  1303. end
  1304. if synctype == 1 then
  1305. synctext = "Synchronised"
  1306. end
  1307. end
  1308. if (requesttype == "nuclearmod") then
  1309. nuckemodactive = nuckemodactive + 1
  1310. if (nuckemodactive > 1) then
  1311. nuckemodactive = 0
  1312. end
  1313. if (nuckemodactive == 0) then
  1314. areanuclear = 0
  1315. nuclearanimation = 3
  1316. ballSet = 200
  1317. TEXT = "Nuclear Pong"
  1318. synctype = 0
  1319. maxspeed = 700
  1320. synctext = "Independent"
  1321. paddle_SPEED = ballSet
  1322. AI_SPEED = ballSet
  1323. end
  1324. if (nuckemodactive == 1) then
  1325. areanuclear = 1
  1326. ballSet = 2000
  1327. maxspeed = 2000
  1328. paddle_SPEED = ballSet
  1329. AI_SPEED = ballSet
  1330. synctext = "death is imminent"
  1331. end
  1332. ballSpeed = ballSet
  1333. end
  1334. if (requesttype == "practice") then
  1335. if (ballSpeed > 999) then
  1336. ballSpeed = 200
  1337. ballSet = 200
  1338. end
  1339. if (ballSpeed > 799) then
  1340. prtext = "Insane"
  1341. maxBalls = 5
  1342. elseif ballSpeed > 599 then
  1343. prtext = "Hard"
  1344. maxBalls = 4
  1345. elseif ballSpeed > 399 then
  1346. prtext = "Normal"
  1347. maxBalls = 3
  1348. elseif ballSpeed > 199 then
  1349. prtext = "Easy"
  1350. maxBalls = 3
  1351. end
  1352. ballSpeed = ballSpeed + 200
  1353. ballSet = ballSet + 200
  1354. end
  1355. if (requesttype == "reset") then
  1356. ballSpeed = 200
  1357. ballSet = 200
  1358. synctype = 0
  1359. prtext = "Easy"
  1360. maxBalls = 1
  1361. end
  1362. if (requesttype == "pc") then
  1363. if (playerCount == 2) then
  1364. playerCount = 1
  1365. playertext = "1v1"
  1366. elseif (playerCount == 1) then
  1367. playerCount = playerCount + 1
  1368. player3.x = player1.x + VIRTUAL_WIDTH / 2
  1369. player3.y = player3.y
  1370. playertext = "2v2"
  1371. end
  1372. end
  1373. if (requesttype == "ballz") then
  1374. if (maxBalls > 1) then
  1375. --love.window.setTitle("more than 4")
  1376. maxBalls = 1
  1377. else
  1378. maxBalls = maxBalls + 1
  1379. end
  1380. end
  1381. if requesttype == "ptw" then
  1382. if ptw == 10 then
  1383. ptw = 1
  1384. else
  1385. ptw = ptw + 1
  1386. end
  1387. end
  1388. end
  1389. function gameModeChanger()
  1390. if (gameState == "gameMode") then
  1391. local button_width = VIRTUAL_WIDTH * (1 / 3)
  1392. local BUTTON_HEIGHT = 50
  1393. local margin = 20
  1394. local hot = false
  1395. local cursor_y = 0
  1396. local total_height = (BUTTON_HEIGHT + margin) * #buttons
  1397. for i, button in ipairs(modeSelectorButtons) do
  1398. button.last = button.now
  1399. local bx = (VIRTUAL_WIDTH * 0.5) - (button_width * 0.5)
  1400. local by = (VIRTUAL_HEIGHT * 0.5) - (total_height * 0.5) + cursor_y
  1401. local color = {255, 255, 255, 255}
  1402. local mx, my = love.mouse.getPosition()
  1403. mx = mx * DIFFERENCE_X
  1404. my = my * DIFFERENCE_Y
  1405. hot = (mx > bx and mx < bx + button_width and my > by and my < by + BUTTON_HEIGHT) and i
  1406. if (hot == i) then
  1407. color = {10, 10, 0, 255}
  1408. end
  1409. button.now = love.mouse.isDown(1)
  1410. if button.now and not button.last and hot == i then
  1411. love.graphics.setColor(0, 0, 0, 1)
  1412. love.graphics.rectangle("fill", 0, 0, VIRTUAL_WIDTH, VIRTUAL_HEIGHT)
  1413. sounds["wallhit"]:play()
  1414. button.fn()
  1415. end
  1416. love.graphics.setColor(unpack(color))
  1417. love.graphics.rectangle("fill", bx, by, button_width, BUTTON_HEIGHT)
  1418. love.graphics.setColor(0, 0, 0, 255)
  1419. local textW = smallfont:getWidth(button.text)
  1420. local textH = smallfont:getHeight(button.text)
  1421. love.graphics.print(button.text, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1422. love.graphics.setColor(255, 255, 255, 255)
  1423. cursor_y = cursor_y + (BUTTON_HEIGHT + margin)
  1424. end
  1425. end
  1426. if (gameState == "multiMode") then
  1427. local button_width = VIRTUAL_WIDTH * (1 / 3)
  1428. local BUTTON_HEIGHT = 50
  1429. local margin = 20
  1430. local hot = false
  1431. local cursor_y = 0
  1432. local total_height = (BUTTON_HEIGHT + margin) * #buttons
  1433. for i, button in ipairs(playerCountButtons) do
  1434. button.last = button.now
  1435. local bx = (VIRTUAL_WIDTH * 0.5) - (button_width * 0.5)
  1436. local by = (VIRTUAL_HEIGHT * 0.3) - (total_height * 0.5) + cursor_y
  1437. if (button.text == "Play") then
  1438. by = by + by / 1.8
  1439. end
  1440. local color = {255, 255, 255, 255}
  1441. local mx, my = love.mouse.getPosition()
  1442. mx = mx * DIFFERENCE_X
  1443. my = my * DIFFERENCE_Y
  1444. hot = (mx > bx and mx < bx + button_width and my > by and my < by + BUTTON_HEIGHT) and i
  1445. if (hot == i) then
  1446. if (button.text == "Play") then
  1447. color = {0 / 255, 255 / 255, 0 / 255, 255}
  1448. else
  1449. color = {10, 10, 0, 255}
  1450. end
  1451. end
  1452. button.now = love.mouse.isDown(1)
  1453. if button.now and not button.last and hot == i then
  1454. love.graphics.setColor(0, 0, 0, 1)
  1455. love.graphics.rectangle("fill", 0, 0, VIRTUAL_WIDTH, VIRTUAL_HEIGHT)
  1456. sounds["wallhit"]:play()
  1457. if button.text == "Ball Speed: " and nuckemodactive == 1 then
  1458. else
  1459. button.fn()
  1460. end
  1461. end
  1462. love.graphics.setColor(unpack(color))
  1463. love.graphics.rectangle("fill", bx, by, button_width, BUTTON_HEIGHT)
  1464. love.graphics.setColor(0, 0, 0, 255)
  1465. local textW = smallfont:getWidth(button.text)
  1466. local textH = smallfont:getHeight(button.text)
  1467. if (button.text == "1v1") then
  1468. love.graphics.print(playertext, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1469. elseif button.text == "snc" then
  1470. if (nuckemodactive == 1) then
  1471. love.graphics.setColor(1, 0, 0, 1)
  1472. love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1473. love.graphics.setColor(1, 1, 1, 1)
  1474. love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1475. love.graphics.setColor(0, 0, 0, 1)
  1476. else
  1477. --
  1478. love.graphics.print(synctext, smallfont, VIRTUAL_WIDTH * 0.45 - textW * 0.5, by + textH * 0.5)
  1479. end
  1480. elseif (button.text == "ballCount") then
  1481. love.graphics.print(
  1482. "Ball Count: " .. maxBalls,
  1483. smallfont,
  1484. VIRTUAL_WIDTH * 0.5 - textW * 0.5,
  1485. by + textH * 0.5
  1486. )
  1487. elseif (button.text == "Ball Speed: ") then
  1488. if (nuckemodactive == 1) then
  1489. love.graphics.setColor(1, 0, 0, 1)
  1490. love.graphics.print(
  1491. "shaitan machina",
  1492. smallfont,
  1493. VIRTUAL_WIDTH * 0.5 - textW * 0.5,
  1494. by + textH * 0.5
  1495. )
  1496. love.graphics.setColor(1, 1, 1, 1)
  1497. love.graphics.print(
  1498. "shaitan machina",
  1499. smallfont,
  1500. VIRTUAL_WIDTH * 0.5 - textW * 0.5,
  1501. by + textH * 0.5
  1502. )
  1503. love.graphics.setColor(0, 0, 0, 1)
  1504. else
  1505. love.graphics.print(
  1506. button.text .. ballSet,
  1507. smallfont,
  1508. VIRTUAL_WIDTH * 0.5 - textW * 0.5,
  1509. by + textH * 0.5
  1510. )
  1511. end
  1512. elseif button.text == "ptw" then
  1513. love.graphics.print(
  1514. "Points to Win: " .. ptw,
  1515. smallfont,
  1516. VIRTUAL_WIDTH * 0.5 - textW * 1.5,
  1517. by + textH * 0.5
  1518. )
  1519. else
  1520. love.graphics.print(button.text, smallfont, VIRTUAL_WIDTH * 0.5 - textW * 0.5, by + textH * 0.5)
  1521. end
  1522. love.graphics.setColor(255, 255, 255, 255)
  1523. cursor_y = cursor_y + (BUTTON_HEIGHT + margin)
  1524. end
  1525. end
  1526. end
  1527. function love.draw(dt)
  1528. simpleScale.set()
  1529. if globalState == "selfhost" then
  1530. globalState = "nettest"
  1531. baseDraw()
  1532. globalState = "selfhost"
  1533. else
  1534. baseDraw()
  1535. end
  1536. if (globalState == "nettest" or globalState == "clienttest" or globalState == "selfhost") and confirmation == "D" then
  1537. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  1538. love.graphics.printf("WAIT FOR OPPONENT", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  1539. end
  1540. if (globalState == "nettest" or globalState == "clienttest" or globalState == "selfhost") and confirmation == "U" then
  1541. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  1542. love.graphics.printf("LOBBY FULL OR WRONG MODE CHOSEN", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  1543. end
  1544. if (globalState == "nettest" or globalState == "clienttest" or globalState == "selfhost") and confirmation == "L" then
  1545. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  1546. love.graphics.printf("POOR CONNECTION TO SERVER", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  1547. end
  1548. if (globalState == "nettest" or globalState == "clienttest" or globalState == "selfhost") and confirmation == "S" then
  1549. love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
  1550. love.graphics.printf("INTERNAL SERVER WAITING", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
  1551. love.graphics.printf(myip, 0, VIRTUAL_HEIGHT / 2 + 120, VIRTUAL_WIDTH, "center")
  1552. end
  1553. simpleScale.unSet()
  1554. end
  1555. --Check if controls are duplicating
  1556. function controllerSer()
  1557. for i = 1, maxBalls do
  1558. if (ball[i].dy == 0) then
  1559. hitNum[i] = hitNum[i] + 1
  1560. if hitNum[i] >= 10 then
  1561. ball[i].dy = 1
  1562. hitNum[i] = 0
  1563. end
  1564. else
  1565. hitNum[i] = 0
  1566. end
  1567. end
  1568. end
  1569. function palleteController() --!!!!LEGACY CODE, MIGRATED TO Paddle.lua!!!!
  1570. if (areanuclear == 0) then
  1571. player1.RED = 1
  1572. player1.GREEN = 1
  1573. player1.BLUE = 1
  1574. end
  1575. if (areanuclear == 0) then
  1576. player2.RED = 1
  1577. player2.GREEN = 1
  1578. player2.BLUE = 1
  1579. end
  1580. if (areanuclear == 1) then
  1581. player1.RED = 0
  1582. player1.GREEN = 0
  1583. player1.BLUE = 0
  1584. end
  1585. if (areanuclear == 1) then
  1586. player2.RED = 0
  1587. player2.GREEN = 0
  1588. player2.BLUE = 0
  1589. end
  1590. end
  1591. function love.wheelmoved(x, y)
  1592. if (y < 0 and wall1width > 0) then
  1593. wall1width = wall1width - 5
  1594. elseif y > 0 and wall1width < 900 then
  1595. wall1width = wall1width + 5
  1596. end
  1597. end
  1598. function serveBot() --THIS IS USED TO CHANGE TEXT/BALL DIRECTION ON DIFFERENT SERVES
  1599. --print("servebot called")
  1600. if (gameState == "1serve") then
  1601. updateTEXT = ""
  1602. if (gameMode ~= "practice") then
  1603. if isAndroid then
  1604. TEXT = "PLAYER 1, serve!(double-click)"
  1605. else
  1606. TEXT = "PLAYER 1, serve!(q)"
  1607. end
  1608. end
  1609. if ((globalState ~= "clienttest" and love.keyboard.isDown("q")) or (globalState == "clienttest" and lastSentKeyP1 == "q") or doubleclick1) then
  1610. TEXT = "Lets Begin!"
  1611. ball_DIR = 1
  1612. if maxBalls == 1 then
  1613. ball[1]:reset(1, 1)
  1614. else
  1615. for i = 1, maxBalls do
  1616. ball[i]:reset(i)
  1617. end
  1618. end
  1619. gameState = "play"
  1620. end
  1621. end
  1622. if (gameState == "2serve") then
  1623. if (gameMode ~= "practice") then
  1624. if isAndroid then
  1625. TEXT = "PLAYER 2, serve!(double-click)"
  1626. else
  1627. TEXT = "PLAYER 2, serve!(p)"
  1628. end
  1629. end
  1630. if (AGAINST_AI == 1) then
  1631. TEXT = ""
  1632. ball_DIR = -1
  1633. if maxBalls == 1 then
  1634. ball[2]:reset(i, 2)
  1635. else
  1636. for i = 1, maxBalls do
  1637. ball[i]:reset(i)
  1638. end
  1639. end
  1640. gameState = "play"
  1641. end
  1642. if (((globalState == "nettest" and lastSentKeyClient == "p") or ((globalState ~= "nettest") and love.keyboard.isDown("p")) or doubleclick2)and AGAINST_AI == 0) then
  1643. TEXT = "Lets Begin"
  1644. ball_DIR = -1
  1645. if maxBalls == 1 then
  1646. ball[1]:reset(1, 2)
  1647. else
  1648. for i = 1, maxBalls do
  1649. ball[i]:reset(i)
  1650. end
  1651. end
  1652. --love.window.setTitle("An atttttttt")
  1653. gameState = "play"
  1654. end
  1655. end
  1656. end
  1657. function mapChanger()
  1658. if (gameState == "editor") then
  1659. MAP_TYPE = 2
  1660. end
  1661. if (MAP_TYPE > 2) then
  1662. MAP_TYPE = 0
  1663. end
  1664. end
  1665. function resolutionChanger()
  1666. if (RESOLUTION_SET > 1) then
  1667. RESOLUTION_SET = 0
  1668. end
  1669. if (RESOLUTION_SET == 0) then
  1670. if (isFullscreen == 1) then
  1671. DIFFERENCE_X = 1
  1672. DIFFERENCE_Y = 1
  1673. simpleScale.updateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, {fullscreen = false})
  1674. isFullscreen = 0
  1675. end
  1676. end
  1677. if (RESOLUTION_SET == 1) then
  1678. if (isFullscreen == 0) then
  1679. simpleScale.updateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, {fullscreen = true})
  1680. local newWidth = love.graphics.getWidth()
  1681. local newHeight = love.graphics.getHeight()
  1682. DIFFERENCE_X = VIRTUAL_WIDTH / newWidth
  1683. DIFFERENCE_Y = VIRTUAL_HEIGHT / newHeight
  1684. isFullscreen = 1
  1685. end
  1686. end
  1687. end
  1688. function resettinggenius()
  1689. maxBalls = 1
  1690. for i = 1, maxBalls do
  1691. ball[i]:reset(i)
  1692. end
  1693. paddle_SPEED = 200
  1694. nuclearanimation = 3
  1695. timeIsSlow = false
  1696. timeIsSlow2 = false
  1697. serverinit = false
  1698. ts = 0
  1699. originalSpeed = 200
  1700. gameState = "menu"
  1701. globalState = "menu"
  1702. gameMode = "normal"
  1703. player1.height = 100
  1704. player2.height = 100
  1705. ballSet = 200
  1706. ballSpeed = ballSet
  1707. player2.GREEN = 255
  1708. player2.BLUE = 255
  1709. player1.GREEN = 255
  1710. player1.BLUE = 255
  1711. player1score = 0
  1712. player2score = 0
  1713. potentialnuke1 = 0
  1714. potentialnuke2 = 0
  1715. striken = 0
  1716. areanuclear = 0
  1717. potentialstrike1 = 0
  1718. potentialstrike2 = 0
  1719. player1nukescore = 0
  1720. player2nukescore = 0
  1721. player1reverbav = 0
  1722. player2reverbav = 0
  1723. selecting = 0
  1724. AGAINST_AI = 0
  1725. end
  1726. function love.mousereleased(x, y, button)
  1727. love.keyboard.mouseisReleased = true
  1728. if (gameState == "editor") then
  1729. if (#walls < 1000 and button == 1 and blockinput ~= true) then
  1730. table.insert(walls, newWall(x * DIFFERENCE_X, y * DIFFERENCE_Y, 10, wall1width))
  1731. end
  1732. end
  1733. end
  1734. function ballsAlive()
  1735. for i = 1, maxBalls do
  1736. if ball[i].disabled == false then
  1737. print("Ball " .. i .. " is not disabled")
  1738. return true
  1739. end
  1740. end
  1741. return false
  1742. end
  1743. function split(s, delimiter)
  1744. result = {}
  1745. for match in (s..delimiter):gmatch("(.-)"..delimiter) do
  1746. table.insert(result, match)
  1747. end
  1748. return result
  1749. end
  1750. address, port = IP, 12345
  1751. function checkCurrentServer(dt)
  1752. if GetIPType(IP) ~= 1 then
  1753. status = "offline"
  1754. end
  1755. if GetIPType(IP) == 1 then
  1756. if dserverinit == false then
  1757. print("Switching IP")
  1758. socket = require "socket"
  1759. address, port = IP, 12345
  1760. print(address)
  1761. udp = socket.udp()
  1762. udp:setpeername(address, port)
  1763. udp:settimeout(0)
  1764. dserverinit = true
  1765. end
  1766. if IP ~= address then dserverinit = false print(IP .. " doesnt equal " .. address)
  1767. else
  1768. ts = ts + dt
  1769. --print(ts)
  1770. if ts > checkrate then
  1771. status = "offline"
  1772. print("sent ping")
  1773. udp:send("HELLO")
  1774. local data
  1775. data = udp:receive()
  1776. if data then
  1777. print("got answer!")
  1778. local p = split(data, '|')
  1779. status = p[1]
  1780. print("answer is " .. status)
  1781. else
  1782. print("no response!")
  1783. end
  1784. ts = 0
  1785. end
  1786. end
  1787. end
  1788. end
  1789. local gts = 0
  1790. hostinit = false
  1791. player1ip = "127.0.0.1"
  1792. player1port = "12345"
  1793. player2ip = "none"
  1794. player2port = nil
  1795. local p1ping = 0
  1796. local p2ping = 0
  1797. local requesterip
  1798. local requresterport
  1799. function selfHost(dt)
  1800. print("Server running")
  1801. if not hostinit then
  1802. local socket = require('socket')
  1803. udp = socket.udp()
  1804. udp:setsockname('*', 12345)
  1805. udp:settimeout(0)
  1806. local s = socket.udp()
  1807. s:setpeername("74.125.115.104",80)
  1808. myip, _ = s:getsockname()
  1809. hostinit = true
  1810. else
  1811. gts = gts + dt
  1812. if gts > 0.015 then
  1813. local data, msg_or_ip, port_or_nil
  1814. local p1data, p2data
  1815. repeat
  1816. data, msg_or_ip, port_or_nil = udp:receivefrom()
  1817. if data then
  1818. if data == "HELLO" then
  1819. requesterip = msg_or_ip
  1820. requesterport = port_or_nil
  1821. else
  1822. print(string.sub(data,1,1) .. "Playerlist: " .. player1ip .. " " .. player2ip)
  1823. if player2ip == msg_or_ip then
  1824. p2data = data .. '|' .. p2ping
  1825. p2ping = 0
  1826. else
  1827. if player2ip == "none" and msg_or_ip ~= player1ip then
  1828. player2ip = msg_or_ip
  1829. p2data = data .. '|' .. p2ping
  1830. p2ping = 0
  1831. player2port = port_or_nil
  1832. print("CONNECTED: PLAYER 2 FROM: " .. player2ip)
  1833. elseif (player1ip ~= msg_or_ip and player2ip ~= msg_or_ip) then
  1834. print("Lobby Full!" .. player1ip .. player2ip)
  1835. end
  1836. end
  1837. end
  1838. end
  1839. until not data
  1840. if player1ip ~= "none" then
  1841. p1ping = p1ping + 1
  1842. end
  1843. if player2ip == "none" then
  1844. confirmation = "S"
  1845. else
  1846. print("Player2: " .. player2ip)
  1847. p2ping = p2ping + 1
  1848. if p2ping > 100 then
  1849. for i = 1, maxBalls do
  1850. ts = ts + dt
  1851. if ts > updaterate then
  1852. udp:sendto(tostring(lastSentKey) ..
  1853. '|' .. tostring(ball[1].dy) ..
  1854. '|' .. tostring(player2.y) ..
  1855. '|' .. tostring(player1.y) ..
  1856. '|' .. tostring(player1score) ..
  1857. '|' .. tostring(player2score) ..
  1858. '|' .. tostring(player1nukescore) ..
  1859. '|' .. tostring(player2nukescore) ..
  1860. '|' .. tostring(ball[1].x) ..
  1861. '|' .. tostring(ball[1].y) ..
  1862. '|' .. gameState ..
  1863. '|' .. tostring(ball[1].dx) ..
  1864. '|' .. tostring(ballSpeed) ..
  1865. '|' .. tostring(paddle_SPEED) ..
  1866. "|HOST|".. p2ping, player2ip, player2port)
  1867. ts = 0
  1868. end
  1869. end
  1870. print("PLAYER 2 DISCONNECTED")
  1871. p2data = nil
  1872. player2ip = "none"
  1873. player2port = nil
  1874. end
  1875. end
  1876. if player2port then
  1877. for i = 1, maxBalls do
  1878. ts = ts + dt
  1879. if ts > updaterate then
  1880. udp:sendto(tostring(lastSentKey) ..
  1881. '|' .. tostring(ball[1].dy) ..
  1882. '|' .. tostring(player2.y) ..
  1883. '|' .. tostring(player1.y) ..
  1884. '|' .. tostring(player1score) ..
  1885. '|' .. tostring(player2score) ..
  1886. '|' .. tostring(player1nukescore) ..
  1887. '|' .. tostring(player2nukescore) ..
  1888. '|' .. tostring(ball[1].x) ..
  1889. '|' .. tostring(ball[1].y) ..
  1890. '|' .. gameState ..
  1891. '|' .. tostring(ball[1].dx) ..
  1892. '|' .. tostring(ballSpeed) ..
  1893. '|' .. tostring(paddle_SPEED) ..
  1894. "|HOST|".. p2ping, player2ip, player2port)
  1895. ts = 0
  1896. end
  1897. end
  1898. print("SENT TO " .. player2ip .. ":" .. player2port .. " : " ..lastSentKey)
  1899. end
  1900. local datanumtest = 0
  1901. local datawaspassed = false
  1902. if p2data and player1port then
  1903. datawaspassed = true
  1904. print("ReceivedINFO: " .. p2data)
  1905. confirmation = "N"
  1906. local p = split(p2data, '|')
  1907. if p[15] then
  1908. if tonumber(p[16]) > 90 then
  1909. confirmation = "L"
  1910. end
  1911. if p[15] ~= "CLIENT" then
  1912. confirmation = "U"
  1913. end
  1914. elseif p[1] == "RESPONSE" then
  1915. if p[2] == "1" then
  1916. elseif p[2] == "2" then
  1917. elseif p[2] == "3" then
  1918. end
  1919. else
  1920. confirmation = "U"
  1921. end
  1922. if p[15] then
  1923. if ball[1].disabled and ball[1].x > 20 and ball[1].x < VIRTUAL_WIDTH - 20 then
  1924. ball[1].disabled = false
  1925. print("illegal disabling")
  1926. end
  1927. if gameState ~= "1serve" then
  1928. if (ball[1].x > VIRTUAL_WIDTH/2) then
  1929. if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
  1930. die = tonumber(p[2])
  1931. lastSentKeyClient,
  1932. ball[1].dy,
  1933. player2.y,
  1934. player1score,
  1935. player2score,
  1936. player1nukescore,
  1937. player2nukescore,
  1938. ball[1].x,
  1939. ball[1].y,
  1940. gameState,
  1941. ball[1].dx,
  1942. ballSpeed,
  1943. 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])
  1944. print("ACCEPTED")
  1945. else
  1946. print("DECLINED")
  1947. end
  1948. else
  1949. if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
  1950. die = tonumber(p[2])
  1951. lastSentKeyClient,
  1952. ball[1].dy,
  1953. player2.y,
  1954. player1score,
  1955. player2score,
  1956. player1nukescore,
  1957. player2nukescore,
  1958. ball[1].x,
  1959. ball[1].y,
  1960. gameState,
  1961. ball[1].dx,
  1962. ballSpeed,
  1963. 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])
  1964. print("ACCEPTED")
  1965. else
  1966. print("ENFORCED" .. ball[1].x .. " " .. ball[1].dx)
  1967. lastSentKeyClient = p[1]
  1968. player2.y = tonumber(p[4])
  1969. end
  1970. end
  1971. end
  1972. end
  1973. print("SENT TO " .. player1ip .. ":" .. player1port .. " : " .. string.sub(p2data,1,1))
  1974. --print("1::" .. p1data)
  1975. --print("2::" .. p2data)
  1976. --print("SENT1: " .. player2ip .. " " .. player2port .. " " .. p1data)
  1977. --print("SENT2: " .. player1ip .. " " .. player1port .. " " .. p2data)
  1978. end
  1979. if requesterip then
  1980. print("getting pnged!")
  1981. if player2ip == "none" then
  1982. udp:sendto("clienttest", requesterip, requesterport)
  1983. print("clienttest av to: " .. requesterip)
  1984. else
  1985. udp:sendto("full", requesterip, requesterport)
  1986. print("full to: " .. msg_or_ip)
  1987. end
  1988. requesterip, requesterport = nil
  1989. end
  1990. gts = 0
  1991. end
  1992. end
  1993. end
  1994. local lastclick = 0
  1995. local clickInterval = 0.4
  1996. function love.touchpressed( id, x, y, dx, dy, pressure )
  1997. if isAndroid then
  1998. local existsingID = touchExists(id)
  1999. if existsingID ~= -1 then
  2000. touches[existsingID].x = x * DIFFERENCE_X
  2001. touches[existsingID].y = y * DIFFERENCE_Y
  2002. else
  2003. table.insert(touches, newTouch(id, x*DIFFERENCE_X, y*DIFFERENCE_Y))
  2004. local time = love.timer.getTime()
  2005. if x * DIFFERENCE_X < VIRTUAL_WIDTH/2 then
  2006. if time <= lastclick + clickInterval and x*DIFFERENCE_X > 50 then
  2007. doubleclick1 = true
  2008. if gameState == "1serve" then
  2009. lastSentKey = "q"
  2010. else
  2011. lastSentKey = p1control.super
  2012. end
  2013. else
  2014. doubleclick1 = false
  2015. lastclick = time
  2016. end
  2017. else
  2018. if time <= lastclick + clickInterval and x*DIFFERENCE_X > VIRTUAL_WIDTH-50 then
  2019. doubleclick2 = true
  2020. if gameState == "2serve" then
  2021. lastSentKey = "p"
  2022. else
  2023. lastSentKey = p2control.super
  2024. end
  2025. else
  2026. doubleclick2 = false
  2027. lastclick = time
  2028. end
  2029. end
  2030. end
  2031. end
  2032. end
  2033. function love.touchreleased( id, x, y, dx, dy, pressure )
  2034. if isAndroid then
  2035. if gameState == "start" then
  2036. resettinggenius()
  2037. gameState = "menu"
  2038. globalState = "menu"
  2039. hardmanager()
  2040. end
  2041. local existsingID = touchExists(id)
  2042. if existsingID ~= -1 then
  2043. table.remove(touches, existsingID)
  2044. end
  2045. end
  2046. end
  2047. function love.touchmoved( id, x, y, dx, dy, pressure )
  2048. if isAndroid then
  2049. local existsingID = touchExists(id)
  2050. if existsingID ~= -1 then
  2051. touches[existsingID].x = x * DIFFERENCE_X
  2052. touches[existsingID].y = y * DIFFERENCE_Y
  2053. if touches[existsingID].originalX - touches[existsingID].x > 200 and
  2054. touches[existsingID].originalX < VIRTUAL_WIDTH/2 then
  2055. hold1 = true
  2056. lastSentKey = p1control.counter
  2057. else
  2058. hold1 = false
  2059. end
  2060. if touches[existsingID].x - touches[existsingID].originalX > 200 and
  2061. touches[existsingID].originalX > VIRTUAL_WIDTH/2 then
  2062. hold2 = true
  2063. lastSentKey = p2control.counter
  2064. else
  2065. hold2 = false
  2066. end
  2067. end
  2068. end
  2069. end
  2070. function touchExists(ID)
  2071. for i, touch in ipairs(touches) do
  2072. if touch.id == ID then
  2073. return i
  2074. end
  2075. end
  2076. return -1
  2077. end
  2078. function table.empty (self)
  2079. for _, _ in pairs(self) do
  2080. return false
  2081. end
  2082. return true
  2083. end
  2084. function sectortouched(sector)
  2085. for i, touch in ipairs(touches) do
  2086. if sector == 1 and touch.x > VIRTUAL_WIDTH-60 and touch.y < VIRTUAL_HEIGHT/2 then
  2087. lastSentKey = p2control.up
  2088. return true
  2089. elseif sector == 2 and touch.x < 60 and touch.y < VIRTUAL_HEIGHT/2 then
  2090. lastSentKey = p1control.up
  2091. return true
  2092. elseif sector == 3 and touch.x < 60 and touch.y > VIRTUAL_HEIGHT/2 then
  2093. lastSentKey = p1control.down
  2094. return true
  2095. elseif sector == 4 and touch.x > VIRTUAL_WIDTH-60 and touch.y > VIRTUAL_HEIGHT/2 then
  2096. lastSentKey = p2control.down
  2097. return true
  2098. end
  2099. end
  2100. return false
  2101. end