Advertisement
gamax92

pacman

Sep 1st, 2013
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 55.39 KB | None | 0 0
  1. --[[
  2. PacMan, written by Gamax92.
  3. Copy it, copy the code, copy the letters. Just give me credit.
  4. Documentaiton - Mainly for me:
  5.  * Terms used
  6. SNH - Some Number Here
  7.  
  8.  * Map Tiles:
  9. 0 - Air
  10. 1 - Dot
  11. 2 - Energizer
  12. 3 - Horiz line Up
  13. 4 - Horiz line Down
  14. 5 - Vert line Right
  15. 6 - Vert line Left
  16. 7 - UL Corner
  17. 8 - UR Corner
  18. 9 - BL Corner
  19. 10 - BR Corner
  20. 11 - Double Horiz line
  21. 12 - Double Vert line
  22. 13 - Double UL Corner
  23. 14 - Double UR Corner
  24. 15 - Double BL Corner
  25. 16 - Double BR Corner
  26. 17 - Double Left - Bottom
  27. 18 - Double Left - Top
  28. 19 - Double Right - Bottom
  29. 20 - Double Right - Top
  30. 21 - Double Top - Right
  31. 22 - Double Top - Left
  32. 23 - Double Bottom - Right
  33. 24 - Double Bottom - Left
  34. 25 - Bunker LGate
  35. 26 - Bunker RGate
  36. 27 - Bunker UL
  37. 28 - Bunker UR
  38. 29 - Bunker BL
  39. 30 - Bunker BR
  40. 31 - Barrier
  41. 32 - Tunnel
  42. 33 - Pacman Start
  43. 34 - RGhost
  44. 35 - BGhost
  45. 36 - PGhost
  46. 37 - OGhost
  47. 91 - Ghosts: Cannot move left
  48. 92 - Ghosts: Cannot move up
  49. 93 - Ghosts: Cannot move right
  50. 94 - Ghosts: Cannot move down
  51. 95 - Ghosts: Force move left
  52. 96 - Ghosts: Force move up
  53. 97 - Ghosts: Force move right
  54. 98 - Ghosts: Force move down
  55. 99 - Invisible wall
  56.  
  57. Tiles 8x8:
  58. SNH - Corresponds to Map Tile
  59.  
  60. Sprites 16x16:
  61. 0 - PacMan
  62. 1 - Ghost Left
  63. 2 - Ghost Up
  64. 3 - Ghost Down
  65. 4 - Energizer
  66. 5 - Frightened Ghost
  67. 6 - Logo
  68.  
  69. Sprite Palettes:
  70. 0 - Pacman
  71. 1 - Blinky
  72. 2 - Inky
  73. 3 - Pinky
  74. 4 - Clyde
  75. 6 - Scared Ghost
  76. 7 - Flashing Scared Ghost
  77. 8 - Ghost Eyes
  78. 9 - Logo Palette
  79. 99 - Empty Palette
  80.  
  81. Directions:
  82. 0 - Left
  83. 1 - Up
  84. 2 - Right
  85. 3 - Down
  86. --]]
  87. tpt.set_pause(1)
  88. local curMap, map, stage, distance, deepcopy, objects, pacobj, blinkobj, lives, advancekey
  89. local maps, omaps = {}, {}
  90. local level = 1
  91. local upTimer, dots, score, useShift, lScore = 0, 0, 0, 0, 0
  92. local bX, bY = 142, 10
  93. local startTimer = 600
  94. local scoreName = ""
  95. maps[1] = {
  96. {00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
  97. {00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
  98. {00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
  99. {14,11,11,11,11,11,11,11,11,11,11,11,11,17,19,11,11,11,11,11,11,11,11,11,11,11,11,13},
  100. {12,01,01,01,01,01,01,01,01,01,01,01,01,05,06,01,01,01,01,01,01,01,01,01,01,01,01,12},
  101. {12,01,08,04,04,07,01,08,04,04,04,07,01,05,06,01,08,04,04,04,07,01,08,04,04,07,01,12},
  102. {12,02,05,00,00,06,01,05,00,00,00,06,01,05,06,01,05,00,00,00,06,01,05,00,00,06,02,12},
  103. {12,01,10,03,03,09,01,10,03,03,03,09,01,10,09,01,10,03,03,03,09,01,10,03,03,09,01,12},
  104. {12,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,12},
  105. {12,01,08,04,04,07,01,08,07,01,08,04,04,04,04,04,04,07,01,08,07,01,08,04,04,07,01,12},
  106. {12,01,10,03,03,09,01,05,06,01,10,03,03,07,08,03,03,09,01,05,06,01,10,03,03,09,01,12},
  107. {12,01,01,01,01,01,01,05,06,01,01,01,01,05,06,01,01,01,01,05,06,01,01,01,01,01,01,12},
  108. {16,11,11,11,11,13,01,05,10,04,04,07,00,05,06,00,08,04,04,09,06,01,14,11,11,11,11,15},
  109. {00,00,00,00,00,12,01,05,08,03,03,09,00,10,09,00,10,03,03,07,06,01,12,00,00,00,00,00},
  110. {00,00,00,00,00,12,01,05,06,00,00,00,92,94,94,92,00,00,00,05,06,01,12,00,00,00,00,00},
  111. {00,00,00,00,00,12,01,05,06,00,28,11,25,31,31,26,11,27,00,05,06,01,12,00,00,00,00,00},
  112. {11,11,11,11,11,15,01,10,09,00,12,97,97,96,96,95,95,12,00,10,09,01,16,11,11,11,11,11},
  113. {32,32,32,32,32,32,01,00,00,00,12,96,96,96,96,96,96,12,00,00,00,01,32,32,32,32,32,32},
  114. {11,11,11,11,11,13,01,08,07,00,12,96,96,96,96,96,96,12,00,08,07,01,14,11,11,11,11,11},
  115. {00,00,00,00,00,12,01,05,06,00,30,11,11,11,11,11,11,29,00,05,06,01,12,00,00,00,00,00},
  116. {00,00,00,00,00,12,01,05,06,00,00,00,00,00,00,00,00,00,00,05,06,01,12,00,00,00,00,00},
  117. {00,00,00,00,00,12,01,05,06,00,08,04,04,04,04,04,04,07,00,05,06,01,12,00,00,00,00,00},
  118. {14,11,11,11,11,15,01,10,09,00,10,03,03,07,08,03,03,09,00,10,09,01,16,11,11,11,11,13},
  119. {12,01,01,01,01,01,01,01,01,01,01,01,01,05,06,01,01,01,01,01,01,01,01,01,01,01,01,12},
  120. {12,01,08,04,04,07,01,08,04,04,04,07,01,05,06,01,08,04,04,04,07,01,08,04,04,07,01,12},
  121. {12,01,10,03,07,06,01,10,03,03,03,09,01,10,09,01,10,03,03,03,09,01,05,08,03,09,01,12},
  122. {12,02,01,01,05,06,01,01,01,01,01,01,01,00,00,01,01,01,01,01,01,01,05,06,01,01,02,12},
  123. {21,04,07,01,05,06,01,08,07,01,08,04,04,04,04,04,04,07,01,08,07,01,05,06,01,08,04,22},
  124. {23,03,09,01,10,09,01,05,06,01,10,03,03,07,08,03,03,09,01,05,06,01,10,09,01,10,03,24},
  125. {12,01,01,01,01,01,01,05,06,01,01,01,01,05,06,01,01,01,01,05,06,01,01,01,01,01,01,12},
  126. {12,01,08,04,04,04,04,09,10,04,04,07,01,05,06,01,08,04,04,09,10,04,04,04,04,07,01,12},
  127. {12,01,10,03,03,03,03,03,03,03,03,09,01,10,09,01,10,03,03,03,03,03,03,03,03,09,01,12},
  128. {12,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,12},
  129. {16,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15},
  130. {00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
  131. {00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
  132. ['fX'] = 14, ['fY'] = 15}
  133. omaps[1] = {
  134. {33,14,27},
  135. {34,14,15},
  136. {35,12,17},
  137. {36,14,17},
  138. {37,16,17}}
  139.  
  140. local tiles = {}
  141.  tiles[0] =
  142. {"00000000",
  143.  "00000000",
  144.  "00000000",
  145.  "00000000",
  146.  "00000000",
  147.  "00000000",
  148.  "00000000",
  149.  "00000000"}
  150.  tiles[1] =
  151. {"00000000",
  152.  "00000000",
  153.  "00000000",
  154.  "00011000",
  155.  "00011000",
  156.  "00000000",
  157.  "00000000",
  158.  "00000000"}
  159.  tiles[2] =
  160. {"00111100",
  161.  "01111110",
  162.  "11111111",
  163.  "11111111",
  164.  "11111111",
  165.  "11111111",
  166.  "01111110",
  167.  "00111100"}
  168.  tiles[3] =
  169. {"00000000",
  170.  "00000000",
  171.  "00000000",
  172.  "11111111",
  173.  "00000000",
  174.  "00000000",
  175.  "00000000",
  176.  "00000000"}
  177.  tiles[4] =
  178. {"00000000",
  179.  "00000000",
  180.  "00000000",
  181.  "00000000",
  182.  "11111111",
  183.  "00000000",
  184.  "00000000",
  185.  "00000000"}
  186.  tiles[5] =
  187. {"00001000",
  188.  "00001000",
  189.  "00001000",
  190.  "00001000",
  191.  "00001000",
  192.  "00001000",
  193.  "00001000",
  194.  "00001000"}
  195.  tiles[6] =
  196. {"00010000",
  197.  "00010000",
  198.  "00010000",
  199.  "00010000",
  200.  "00010000",
  201.  "00010000",
  202.  "00010000",
  203.  "00010000"}
  204.  tiles[7] =
  205. {"00000000",
  206.  "00000000",
  207.  "00000000",
  208.  "00000000",
  209.  "11000000",
  210.  "00100000",
  211.  "00010000",
  212.  "00010000"}
  213.  tiles[8] =
  214. {"00000000",
  215.  "00000000",
  216.  "00000000",
  217.  "00000000",
  218.  "00000011",
  219.  "00000100",
  220.  "00001000",
  221.  "00001000"}
  222.  tiles[9] =
  223. {"00010000",
  224.  "00010000",
  225.  "00100000",
  226.  "11000000",
  227.  "00000000",
  228.  "00000000",
  229.  "00000000",
  230.  "00000000"}
  231.  tiles[10] =
  232. {"00001000",
  233.  "00001000",
  234.  "00000100",
  235.  "00000011",
  236.  "00000000",
  237.  "00000000",
  238.  "00000000",
  239.  "00000000"}
  240.  tiles[11] =
  241. {"00000000",
  242.  "00000000",
  243.  "11111111",
  244.  "00000000",
  245.  "00000000",
  246.  "11111111",
  247.  "00000000",
  248.  "00000000"}
  249.  tiles[12] =
  250. {"00100100",
  251.  "00100100",
  252.  "00100100",
  253.  "00100100",
  254.  "00100100",
  255.  "00100100",
  256.  "00100100",
  257.  "00100100"}
  258.  tiles[13] =
  259. {"00000000",
  260.  "00000000",
  261.  "11110000",
  262.  "00001000",
  263.  "00000100",
  264.  "11000100",
  265.  "00100100",
  266.  "00100100"}
  267.  tiles[14] =
  268. {"00000000",
  269.  "00000000",
  270.  "00001111",
  271.  "00010000",
  272.  "00100000",
  273.  "00100011",
  274.  "00100100",
  275.  "00100100"}
  276.  tiles[15] =
  277. {"00100100",
  278.  "00100100",
  279.  "11000100",
  280.  "00000100",
  281.  "00001000",
  282.  "11110000",
  283.  "00000000",
  284.  "00000000"}
  285.  tiles[16] =
  286. {"00100100",
  287.  "00100100",
  288.  "00100011",
  289.  "00100000",
  290.  "00010000",
  291.  "00001111",
  292.  "00000000",
  293.  "00000000"}
  294.  tiles[17] =
  295. {"00000000",
  296.  "00000000",
  297.  "11111111",
  298.  "00000000",
  299.  "00000000",
  300.  "11110000",
  301.  "00001000",
  302.  "00001000"}
  303.  tiles[19] =
  304. {"00000000",
  305.  "00000000",
  306.  "11111111",
  307.  "00000000",
  308.  "00000000",
  309.  "00001111",
  310.  "00010000",
  311.  "00010000"}
  312.  tiles[21] =
  313. {"00100100",
  314.  "00100100",
  315.  "00100100",
  316.  "00100100",
  317.  "00100011",
  318.  "00100000",
  319.  "00100000",
  320.  "00100000"}
  321.  tiles[22] =
  322. {"00100100",
  323.  "00100100",
  324.  "00100100",
  325.  "00100100",
  326.  "11000100",
  327.  "00000100",
  328.  "00000100",
  329.  "00000100"}
  330.  tiles[23] =
  331. {"00100000",
  332.  "00100000",
  333.  "00100000",
  334.  "00100011",
  335.  "00100100",
  336.  "00100100",
  337.  "00100100",
  338.  "00100100"}
  339.  tiles[24] =
  340. {"00000100",
  341.  "00000100",
  342.  "00000100",
  343.  "11000100",
  344.  "00100100",
  345.  "00100100",
  346.  "00100100",
  347.  "00100100"}
  348.  tiles[25] =
  349. {"00000000",
  350.  "00000000",
  351.  "11111111",
  352.  "00000001",
  353.  "00000001",
  354.  "11111111",
  355.  "00000000",
  356.  "00000000"}
  357.  tiles[26] =
  358. {"00000000",
  359.  "00000000",
  360.  "11111111",
  361.  "10000000",
  362.  "10000000",
  363.  "11111111",
  364.  "00000000",
  365.  "00000000"}
  366.  tiles[27] =
  367. {"00000000",
  368.  "00000000",
  369.  "11111100",
  370.  "00000100",
  371.  "00000100",
  372.  "11100100",
  373.  "00100100",
  374.  "00100100"}
  375.  tiles[28] =
  376. {"00000000",
  377.  "00000000",
  378.  "00111111",
  379.  "00100000",
  380.  "00100000",
  381.  "00100111",
  382.  "00100100",
  383.  "00100100"}
  384.  tiles[29] =
  385. {"00100100",
  386.  "00100100",
  387.  "11100100",
  388.  "00000100",
  389.  "00000100",
  390.  "11111100",
  391.  "00000000",
  392.  "00000000"}
  393.  tiles[30] =
  394. {"00100100",
  395.  "00100100",
  396.  "00100111",
  397.  "00100000",
  398.  "00100000",
  399.  "00111111",
  400.  "00000000",
  401.  "00000000"}
  402.  tiles[31] =
  403. {"00000000",
  404.  "00000000",
  405.  "00000000",
  406.  "11111111",
  407.  "11111111",
  408.  "00000000",
  409.  "00000000",
  410.  "00000000"}
  411.  tiles[32] = tiles[0]
  412.  tiles[33] =
  413. {"01111110",
  414.  "11111111",
  415.  "11111111",
  416.  "11111111",
  417.  "11111111",
  418.  "11111111",
  419.  "11111111",
  420.  "01111110"}
  421.   tiles[34] = tiles[33]
  422.   tiles[35] = tiles[33]
  423.   tiles[36] = tiles[33]
  424.   tiles[37] = tiles[33]
  425.   tiles[91] = tiles[33]
  426.   tiles[92] = tiles[33]
  427.   tiles[93] = tiles[33]
  428.   tiles[94] = tiles[33]
  429.   tiles[95] = tiles[33]
  430.   tiles[96] = tiles[33]
  431.   tiles[97] = tiles[33]
  432.   tiles[98] = tiles[33]
  433.   tiles[99] = tiles[0]
  434.  
  435. local tileC = {}
  436. tileC[0] = 0
  437. tileC[1] = 0xFFB9AF
  438. tileC[2] = 0xFFB9AF
  439. tileC[3] = 255
  440. tileC[4] = 255
  441. tileC[5] = 255
  442. tileC[6] = 255
  443. tileC[7] = 255
  444. tileC[8] = 255
  445. tileC[9] = 255
  446. tileC[10] = 255
  447. tileC[11] = 255
  448. tileC[12] = 255
  449. tileC[13] = 255
  450. tileC[14] = 255
  451. tileC[15] = 255
  452. tileC[16] = 255
  453. tileC[17] = 255
  454. tileC[19] = 255
  455. tileC[21] = 255
  456. tileC[22] = 255
  457. tileC[23] = 255
  458. tileC[24] = 255
  459. tileC[25] = 255
  460. tileC[26] = 255
  461. tileC[27] = 255
  462. tileC[28] = 255
  463. tileC[29] = 255
  464. tileC[30] = 255
  465. tileC[31] = 0xFFB8FF
  466. tileC[32] = 0
  467. tileC[33] = 0xFFFF00
  468. tileC[34] = 0xFF0000
  469. tileC[35] = 0x00FFFF
  470. tileC[36] = 0xFFB8FF
  471. tileC[37] = 0xFFB851
  472. tileC[91] = 0
  473. tileC[92] = 0
  474. tileC[93] = 0
  475. tileC[94] = 0
  476. tileC[95] = 0
  477. tileC[96] = 0
  478. tileC[97] = 0
  479. tileC[98] = 0
  480. tileC[99] = 0
  481.  
  482. local sprites = {}
  483. sprites[0] = {
  484. {"0000000000000000",
  485.  "0000011111000000",
  486.  "0001111111110000",
  487.  "0011111111111000",
  488.  "0011111111111000",
  489.  "0111111111111100",
  490.  "0111111111111100",
  491.  "0111111111111100",
  492.  "0111111111111100",
  493.  "0111111111111100",
  494.  "0011111111111000",
  495.  "0011111111111000",
  496.  "0001111111110000",
  497.  "0000011111000000",
  498.  "0000000000000000",
  499.  "0000000000000000"},
  500. {"0000000000000000",
  501.  "0000011111000000",
  502.  "0001111111110000",
  503.  "0011111111111000",
  504.  "0011111111111000",
  505.  "0000111111111100",
  506.  "0000000111111100",
  507.  "0000000000111100",
  508.  "0000000111111100",
  509.  "0000111111111100",
  510.  "0011111111111000",
  511.  "0011111111111000",
  512.  "0001111111110000",
  513.  "0000011111000000",
  514.  "0000000000000000",
  515.  "0000000000000000"},
  516. {"0000000000000000",
  517.  "0000011111000000",
  518.  "0000011111110000",
  519.  "0000001111111000",
  520.  "0000000111111000",
  521.  "0000000011111100",
  522.  "0000000001111100",
  523.  "0000000000111100",
  524.  "0000000001111100",
  525.  "0000000011111100",
  526.  "0000000111111000",
  527.  "0000001111111000",
  528.  "0000011111110000",
  529.  "0000011111000000",
  530.  "0000000000000000",
  531.  "0000000000000000"},
  532. {"0000000000000000",
  533.  "0000011111000000",
  534.  "0001111111110000",
  535.  "0011111111111000",
  536.  "0011111111111000",
  537.  "0000111111111100",
  538.  "0000000111111100",
  539.  "0000000000111100",
  540.  "0000000111111100",
  541.  "0000111111111100",
  542.  "0011111111111000",
  543.  "0011111111111000",
  544.  "0001111111110000",
  545.  "0000011111000000",
  546.  "0000000000000000",
  547.  "0000000000000000"}}
  548. sprites[1] = {
  549. {"0000000000000000",
  550.  "0000001111000000",
  551.  "0000111111110000",
  552.  "0001111111111000",
  553.  "0012211112211100",
  554.  "0022221122221100",
  555.  "0033221133221100",
  556.  "0133221133221110",
  557.  "0112211112211110",
  558.  "0111111111111110",
  559.  "0111111111111110",
  560.  "0111111111111110",
  561.  "0111111111111110",
  562.  "0110111001110110",
  563.  "0100011001100010",
  564.  "0000000000000000"},
  565. {"0000000000000000",
  566.  "0000001111000000",
  567.  "0000111111110000",
  568.  "0001111111111000",
  569.  "0012211112211100",
  570.  "0022221122221100",
  571.  "0033221133221100",
  572.  "0133221133221110",
  573.  "0112211112211110",
  574.  "0111111111111110",
  575.  "0111111111111110",
  576.  "0111111111111110",
  577.  "0111111111111110",
  578.  "0111101111011110",
  579.  "0011000110001100",
  580.  "0000000000000000"}}
  581. sprites[2] = {
  582. {"0000000000000000",
  583.  "0000001111000000",
  584.  "0000331111330000",
  585.  "0002332112332000",
  586.  "0012222112222100",
  587.  "0012222112222100",
  588.  "0011221111221100",
  589.  "0111111111111110",
  590.  "0111111111111110",
  591.  "0111111111111110",
  592.  "0111111111111110",
  593.  "0111111111111110",
  594.  "0111111111111110",
  595.  "0110111001110110",
  596.  "0100011001100010",
  597.  "0000000000000000"},
  598. {"0000000000000000",
  599.  "0000001111000000",
  600.  "0000331111330000",
  601.  "0002332112332000",
  602.  "0012222112222100",
  603.  "0012222112222100",
  604.  "0011221111221100",
  605.  "0111111111111110",
  606.  "0111111111111110",
  607.  "0111111111111110",
  608.  "0111111111111110",
  609.  "0111111111111110",
  610.  "0111111111111110",
  611.  "0111101111011110",
  612.  "0011000110001100",
  613.  "0000000000000000"}}
  614. sprites[3] = {
  615. {"0000000000000000",
  616.  "0000001111000000",
  617.  "0000111111110000",
  618.  "0001111111111000",
  619.  "0011111111111100",
  620.  "0011221111221100",
  621.  "0012222112222100",
  622.  "0112222112222110",
  623.  "0112332112332110",
  624.  "0111331111331110",
  625.  "0111111111111110",
  626.  "0111111111111110",
  627.  "0111111111111110",
  628.  "0110111001110110",
  629.  "0100011001100010",
  630.  "0000000000000000"},
  631. {"0000000000000000",
  632.  "0000001111000000",
  633.  "0000111111110000",
  634.  "0001111111111000",
  635.  "0011111111111100",
  636.  "0011221111221100",
  637.  "0012222112222100",
  638.  "0112222112222110",
  639.  "0112332112332110",
  640.  "0111331111331110",
  641.  "0111111111111110",
  642.  "0111111111111110",
  643.  "0111111111111110",
  644.  "0111101111011110",
  645.  "0011000110001100",
  646.  "0000000000000000"}}
  647. sprites[4] = {
  648. {"00111100",
  649.  "01111110",
  650.  "11111111",
  651.  "11111111",
  652.  "11111111",
  653.  "11111111",
  654.  "01111110",
  655.  "00111100"},
  656. {"00000000",
  657.  "00000000",
  658.  "00000000",
  659.  "00000000",
  660.  "00000000",
  661.  "00000000",
  662.  "00000000",
  663.  "00000000"}}
  664. sprites[5] = {
  665. {"0000000000000000",
  666.  "0000001111000000",
  667.  "0000111111110000",
  668.  "0001111111111000",
  669.  "0011111111111100",
  670.  "0011111111111100",
  671.  "0011122112211100",
  672.  "0111122112211110",
  673.  "0111111111111110",
  674.  "0111111111111110",
  675.  "0112211221122110",
  676.  "0121122112211210",
  677.  "0111111111111110",
  678.  "0110111001110110",
  679.  "0100011001100010",
  680.  "0000000000000000"},
  681. {"0000000000000000",
  682.  "0000001111000000",
  683.  "0000111111110000",
  684.  "0001111111111000",
  685.  "0011111111111100",
  686.  "0011111111111100",
  687.  "0011122112211100",
  688.  "0111122112211110",
  689.  "0111111111111110",
  690.  "0111111111111110",
  691.  "0112211221122110",
  692.  "0121122112211210",
  693.  "0111111111111110",
  694.  "0111101111011110",
  695.  "0011000110001100",
  696.  "0000000000000000"}}
  697. sprites[6] = {
  698. {"00444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444400",
  699.  "04440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004440",
  700.  "44403333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330444",
  701.  "44033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333044",
  702.  "44033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333044",
  703.  "44033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333033303333333333333330333333333333333333333333333333333333333333333333333333333333333044",
  704.  "44033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333000300333333333333300303333333333333333333333033003330000000000333333333333333333333044",
  705.  "44033333333333333000000000000000333333333330333303333333333333000000333333333333333333333333333010001033333333333010003033333333033033333333003010330111111110333333333333333333333044",
  706.  "44033333333333333011111111111111033333333301030303333333333300111000000333333333333333333333333010201103333333330110200033333330103033333333010011030111111110333333333333333333333044",
  707.  "44033333333333333010000000000000033333333301000010333333330011100222222003333333333333333333333010220110333333301102201033333330100103333333010201100100000000003333333333333333333044",
  708.  "44033333333333333010222222222222200333333010220110333333300110022222222220033333333333333333333010222011033333011022201033333301020110333333010220110102222222200333333333333333333044",
  709.  "44033333333333333010222222222222222033333010222011033333011002222222222222203333333333333333333010222201103330110222201033333010222010333333010222010102222222201033333333333333333044",
  710.  "44033333333333333010222222222222222203330102222011033330110222222222220022220333000000000003333010222220110301102222201033333010222011033333010222201102222222201033333333333333333044",
  711.  "44033333333333333010222222220022222220301022222201103330102222222222002220011033011111111103333010222222011011022222201033330102222201103333010222220102222222201033333333333333333044",
  712.  "44033333333333333010222222220022222220001022222220110301102222222200222001100333010000000000333010222222201110222222201033301022222220103333010222220102222222201033333333333333333044",
  713.  "44033333333333333010222222222220222220010222222220110301022222222222200110033333010222222220333010222222220102222222201033301022222220110333010222222002222222201033333333333333333044",
  714.  "44033333333333333010222222222220222220002222222222011001022222222220011003333333010222222220003010222222222022222222201033010222222222011033010222222202222222201033333333333333333044",
  715.  "44033333333333333010222222220002222203002222002222201101022222222200100333333333000222222220103010222222222222222222201030102222200222201033010222222222222222201033333333333333333044",
  716.  "44033333333333333010222222222222222033022222002222201101022222222222000333333333330222222220103010222222222222222222201001022222200222201103010222222222222222201033333333333333333044",
  717.  "44033333333333333010222222220000000330022222222022220110022222222222222003333333330000000000103010222222222222222222201001022222222202220110010222222222222222201033333333333333333044",
  718.  "44033333333333333010222222220333333300222222220222222010002222222220022220033333333301111111103010222222222222222220201010222222222022202010010222222222222220201033333333333333333044",
  719.  "44033333333333333010222222220303303002222222200222202011000222222222200222200033333300000000003010222222222222222220201002222222220022202011010222222222222220201033333333333333333044",
  720.  "44033333333333333010222222220303033022222222222222220201101022222222222022201103333333333333333010222222222222222220201002222222222222220201100222222222222220201033333333333333333044",
  721.  "44033333333333333010222222220303000222222222222220000220110102222222220222011033333333333333333000222222222222220000201022222222222220000220100222222222220000201033333333333333333044",
  722.  "44033333333333333000222222220303330222222222222222222222011010202222222200110333333333333333333330222222222222222222201022222222222222222220110222222222222222201033333333333333333044",
  723.  "44033333333333333330000000000303300000000000000000000000011011010000000011103333333333333333333330000000000000000000001000000000000000000000010000000000000000001033333333333333333044",
  724.  "44033333333333333333033333333303333011111111111111111111111100000011111110033333333333333333333333301111111111111111111010111111111111111111111011111111111111111033333333333333333044",
  725.  "44033333333333333333000000000003330000000000000000000000000003333300000003333333333333333333333333300000000000000000000000000000000000000000000000000000000000000033333333333333333044",
  726.  "44033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333044",
  727.  "44033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333044",
  728.  "44033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333044",
  729.  "44403333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330444",
  730.  "04440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004440",
  731.  "00444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444400"}}
  732.  
  733. local scores = {
  734. {5090,3,"Andrea Tomas"},
  735. {4990,3,"Xenophon Mirza"},
  736. {4520,2,"Oscar Mitica"},
  737. {4360,2,"Spyridon Niall"},
  738. {4260,2,"Pastor Heber"},
  739. {4080,2,"Pradeep Edan"},
  740. {3960,1,"Menachem Donar"},
  741. {3780,1,"Donato Iob"},
  742. {3620,1,"Amichai Nhung"},
  743. {3210,1,"Kerberos Wil"}}
  744.  
  745. local spriteC = {}
  746. spriteC[0] = {[1] = {255, 255, 0}}
  747. spriteC[1] = {[1] = {255, 0, 0},[2] = {223, 223, 255},[3] = {33, 33, 255}}
  748. spriteC[2] = {[1] = {0, 255, 255},[2] = {223, 223, 255},[3] = {33, 33, 255}}
  749. spriteC[3] = {[1] = {255, 185, 255},[2] = {223, 223, 255},[3] = {33, 33, 255}}
  750. spriteC[4] = {[1] = {255, 185, 81},[2] = {223, 223, 255},[3] = {33, 33, 255}}
  751. spriteC[5] = {[1] = {255, 185, 175}}
  752. spriteC[6] = {[1] = {33, 33, 255},[2] = {223, 223, 255},[3] = {223, 223, 255}}
  753. spriteC[7] = {[1] = {223,223,223},[2] = {255, 0, 0},[3] = {255, 0, 0}}
  754. spriteC[8] = {[1] = {0,0,0,0},[2] = {223, 223, 255},[3] = {33, 33, 255}}
  755. spriteC[9] = {[1] = {255, 255, 255},[2] = {255, 255, 0},[3] = {255, 191, 0},[4] = {255, 0, 0}}
  756. spriteC[99]={[1]={0,0,0,0},[2]={0,0,0,0},[3]={0,0,0,0},[4]={0,0,0,0},[5]={0,0,0,0},[6]={0,0,0,0},[7]={0,0,0,0},[8]={0,0,0,0},[9]={0,0,0,0}}
  757.  
  758. local spriteToObj = {}
  759. spriteToObj[33] = 0
  760. spriteToObj[34] = 1
  761. spriteToObj[35] = 2
  762. spriteToObj[36] = 3
  763. spriteToObj[37] = 4
  764. spriteToObj[2] = 5
  765.  
  766. local passTiles = {
  767. [0] = true,
  768. [1] = true,
  769. [2] = true,
  770. [32] = true,
  771. [91] = true,
  772. [92] = true,
  773. [93] = true,
  774. [94] = true,
  775. [95] = true,
  776. [96] = true,
  777. [97] = true,
  778. [98] = true}
  779.  
  780. local baseObj = {}
  781. baseObj[0] = {
  782. ['name'] = "pacman",
  783. ['sprite'] = 0,
  784. ['sprPal'] = 0,
  785. ['dir'] = 0,
  786. ['ndir'] = 0,
  787. ['sdir'] = 0,
  788. ['fspeed'] = 3,
  789. ['speed'] = 1,
  790. ['offX'] = 8,
  791. ['offY'] = 4,
  792. ['drawX'] = -8,
  793. ['drawY'] = -8,
  794. ['dologic'] = function(obj)
  795.     local tileX,tileY = math.floor(obj.posX / 8) + 1, math.floor(obj.posY / 8) + 1
  796.     local ntileX,ntileY
  797.     obj.speed = 1
  798.     if obj.ndir == 0 then
  799.         ntileX,ntileY = tileX - 1,tileY
  800.     elseif obj.ndir == 1 then
  801.         ntileX,ntileY = tileX,tileY - 1
  802.     elseif obj.ndir == 2 then
  803.         ntileX,ntileY = tileX + 1,tileY
  804.     elseif obj.ndir == 3 then
  805.         ntileX,ntileY = tileX,tileY + 1
  806.     end
  807.     local ltileX,ltileY
  808.     if obj.dir == 0 then
  809.         ltileX,ltileY = tileX - 1,tileY
  810.     elseif obj.dir == 1 then
  811.         ltileX,ltileY = tileX,tileY - 1
  812.     elseif obj.dir == 2 then
  813.         ltileX,ltileY = tileX + 1,tileY
  814.     elseif obj.dir == 3 then
  815.         ltileX,ltileY = tileX,tileY + 1
  816.     end
  817.     if curMap[ltileY][ltileX] == 1 then
  818.         obj.speed = 0.9
  819.     end
  820.     if (passTiles[curMap[ntileY][ntileX]] == true) and ((math.fmod(math.floor(obj.posX), 8) == 4 and math.fmod(math.floor(obj.posY), 8) == 4) or math.abs(obj.ndir - obj.dir) == 2) then
  821.         if obj.ndir ~= obj.dir then
  822.             obj.speed = 2
  823.         end
  824.         obj.dir = obj.ndir
  825.     end
  826.     obj.sdir = obj.dir
  827.     if obj.sdir == 2 then
  828.         obj.drawX = -9
  829.         obj.drawY = -8
  830.     elseif obj.sdir == 3 then
  831.         obj.drawX = -9
  832.         obj.drawY = -9
  833.     else
  834.         obj.drawX = -8
  835.         obj.drawY = -8
  836.     end
  837. end}
  838. baseObj[1] = {
  839. ['name'] = "blinky",
  840. ['sprite'] = 1,
  841. ['sprPal'] = 1,
  842. ['dir'] = 0,
  843. ['sdir'] = 0,
  844. ['fspeed'] = 8,
  845. ['speed'] = 0.9,
  846. ['offX'] = 8,
  847. ['offY'] = 4,
  848. ['drawX'] = -8,
  849. ['drawY'] = -8,
  850. ['scat'] = 1,
  851. ['scatX'] = 28,
  852. ['scatY'] = 1,
  853. ['mode'] = 2,
  854. ['timer'] = 420,
  855. ['dologic'] = function(obj)
  856.     local tileX,tileY = math.floor(obj.posX / 8) + 1, math.floor(obj.posY / 8) + 1
  857.     local targetX = math.floor(pacobj.posX / 8) + 1
  858.     local targetY = math.floor(pacobj.posY / 8) + 1
  859.     if obj.mode == 2 then
  860.         targetX = obj.scatX
  861.         targetY = obj.scatY
  862.     end
  863.     if obj.mode == 3 then
  864.         targetX = math.random(1,28)
  865.         targetY = math.random(1,26)
  866.     end
  867.     if obj.mode == 4 then
  868.         targetX = curMap.fX
  869.         targetY = curMap.fY
  870.     end
  871.     obj.timer = obj.timer - 1
  872.     if obj.timer <= 120 and obj.mode == 3 then
  873.         obj.sprPal = math.fmod(obj.timer,30) > 15 and 7 or 6
  874.     end
  875.     if obj.timer <= 0 then
  876.         if obj.mode == 1 then
  877.             if obj.scat < 4 then
  878.                 obj.scat = obj.scat + 1
  879.                 obj.mode = 2
  880.                 obj.timer = 420
  881.                 if obj.scat > 2 then obj.timer = 300 end
  882.                 obj.dir = math.fmod(obj.dir + 2, 4)
  883.             else
  884.                 obj.timer = 60
  885.             end
  886.         elseif obj.mode == 2 or obj.mode == 3 then
  887.             if obj.mode == 2 then obj.dir = math.fmod(obj.dir + 2, 4) end
  888.             obj.mode = 1
  889.             obj.sprPal = 1
  890.             obj.timer = 1200
  891.         end
  892.     end
  893.     if tileX == targetX and tileY == targetY and obj.mode == 4 then
  894.         obj.mode = 1
  895.         obj.timer = 1200
  896.         obj.sprPal = 1
  897.     end
  898.     if math.fmod(math.floor(obj.posX), 8) == 4 and math.fmod(math.floor(obj.posY), 8) == 4 then
  899.         local ndir = obj.dir
  900.         local empty = 0
  901.         if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] ~= 91 and obj.dir ~= 2 then empty = empty + 1 end
  902.         if (passTiles[curMap[tileY - 1][tileX]] == true or curMap[tileY - 1][tileX] == 31) and curMap[tileY][tileX] ~= 92 and obj.dir ~= 3 then empty = empty + 1 end
  903.         if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] ~= 93 and obj.dir ~= 0 then empty = empty + 1 end
  904.         if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] ~= 94 and obj.dir ~= 1 then empty = empty + 1 end
  905.         if empty > 0 then
  906.             local ldist = 99
  907.             if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] ~= 91 and obj.dir ~= 2 and distance(tileX - 1,tileY,targetX,targetY) <= ldist then ndir = 0 ldist = distance(tileX - 1,tileY,targetX,targetY) end
  908.             if (passTiles[curMap[tileY - 1][tileX]] == true) and curMap[tileY][tileX] ~= 92 and obj.dir ~= 3 and distance(tileX,tileY - 1,targetX,targetY) <= ldist then ndir = 1 ldist = distance(tileX,tileY - 1,targetX,targetY) end
  909.             if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] ~= 93 and obj.dir ~= 0 and distance(tileX + 1,tileY,targetX,targetY) <= ldist then ndir = 2 ldist = distance(tileX + 1,tileY,targetX,targetY) end
  910.             if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] ~= 94 and obj.dir ~= 1 and distance(tileX,tileY + 1,targetX,targetY) <= ldist then ndir = 3 ldist = distance(tileX,tileY + 1,targetX,targetY) end
  911.             if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] == 95 then ndir = 0 end
  912.             if (passTiles[curMap[tileY - 1][tileX]] == true or curMap[tileY - 1][tileX] == 31) and curMap[tileY][tileX] == 96 or curMap[tileY][tileX] == 31 then ndir = 1 end
  913.             if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] == 97 then ndir = 2 end
  914.             if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] == 98 then ndir = 3 end
  915.         end
  916.         obj.dir = ndir
  917.     end
  918.     if obj.mode == 1 or obj.mode == 2 then
  919.         if curMap[tileY][tileX] == 32 then
  920.             obj.speed = 0.5
  921.         else
  922.             obj.speed = 0.9
  923.         end
  924.     end
  925.     if obj.mode == 3 then
  926.         obj.sprite = 5
  927.     else
  928.         if obj.dir == 0 then
  929.             obj.sdir = 0
  930.             obj.sprite = 1
  931.         elseif obj.dir == 1 then
  932.             obj.sdir = 0
  933.             obj.sprite = 2
  934.         elseif obj.dir == 2 then
  935.             obj.sdir = 2
  936.             obj.sprite = 1
  937.         elseif obj.dir == 3 then
  938.             obj.sdir = 0
  939.             obj.sprite = 3
  940.         end
  941.     end
  942. end}
  943. baseObj[2] = {
  944. ['name'] = "inky",
  945. ['sprite'] = 2,
  946. ['sprPal'] = 2,
  947. ['dir'] = 0,
  948. ['sdir'] = 0,
  949. ['fspeed'] = 8,
  950. ['speed'] = 0.9,
  951. ['offX'] = 8,
  952. ['offY'] = 4,
  953. ['drawX'] = -8,
  954. ['drawY'] = -8,
  955. ['scat'] = 1,
  956. ['scatX'] = 28,
  957. ['scatY'] = 36,
  958. ['mode'] = 2,
  959. ['timer'] = 420,
  960. ['dologic'] = function(obj)
  961.     local tileX,tileY = math.floor(obj.posX / 8) + 1, math.floor(obj.posY / 8) + 1
  962.     local btileX,btileY = math.floor(blinkobj.posX / 8) + 1, math.floor(blinkobj.posY / 8) + 1
  963.     local ptileX,ptileY = math.floor(pacobj.posX / 8) + 1, math.floor(pacobj.posY / 8) + 1
  964.     local targetX = ptileX + pacobj.speedX * 2 + ((ptileX - btileX) * 2) + 1
  965.     local targetY = ptileY + pacobj.speedY * 2 + ((ptileY - btileY) * 2) + 1
  966.     if obj.mode == 2 then
  967.         targetX = obj.scatX
  968.         targetY = obj.scatY
  969.     end
  970.     if obj.mode == 3 then
  971.         targetX = math.random(1,28)
  972.         targetY = math.random(1,26)
  973.     end
  974.     if obj.mode == 4 then
  975.         targetX = curMap.fX
  976.         targetY = curMap.fY
  977.     end
  978.     obj.timer = obj.timer - 1
  979.     if obj.timer <= 120 and obj.mode == 3 then
  980.         obj.sprPal = math.fmod(obj.timer,30) > 15 and 7 or 6
  981.     end
  982.     if obj.timer <= 0 then
  983.         if obj.mode == 1 then
  984.             if obj.scat < 4 then
  985.                 obj.scat = obj.scat + 1
  986.                 obj.mode = 2
  987.                 obj.timer = 420
  988.                 if obj.scat > 2 then obj.timer = 300 end
  989.                 obj.dir = math.fmod(obj.dir + 2, 4)
  990.             else
  991.                 obj.timer = 60
  992.             end
  993.         elseif obj.mode == 2 or obj.mode == 3 then
  994.             if obj.mode == 2 then obj.dir = math.fmod(obj.dir + 2, 4) end
  995.             obj.mode = 1
  996.             obj.sprPal = 2
  997.             obj.timer = 1200
  998.         end
  999.     end
  1000.     if tileX == targetX and tileY == targetY and obj.mode == 4 then
  1001.         obj.mode = 1
  1002.         obj.timer = 1200
  1003.         obj.sprPal = 2
  1004.     end
  1005.     if math.fmod(math.floor(obj.posX), 8) == 4 and math.fmod(math.floor(obj.posY), 8) == 4 then
  1006.         local ndir = obj.dir
  1007.         local empty = 0
  1008.         if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] ~= 91 and obj.dir ~= 2 then empty = empty + 1 end
  1009.         if (passTiles[curMap[tileY - 1][tileX]] == true or curMap[tileY - 1][tileX] == 31) and curMap[tileY][tileX] ~= 92 and obj.dir ~= 3 then empty = empty + 1 end
  1010.         if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] ~= 93 and obj.dir ~= 0 then empty = empty + 1 end
  1011.         if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] ~= 94 and obj.dir ~= 1 then empty = empty + 1 end
  1012.         if empty > 0 then
  1013.             local ldist = 99
  1014.             if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] ~= 91 and obj.dir ~= 2 and distance(tileX - 1,tileY,targetX,targetY) <= ldist then ndir = 0 ldist = distance(tileX - 1,tileY,targetX,targetY) end
  1015.             if (passTiles[curMap[tileY - 1][tileX]] == true) and curMap[tileY][tileX] ~= 92 and obj.dir ~= 3 and distance(tileX,tileY - 1,targetX,targetY) <= ldist then ndir = 1 ldist = distance(tileX,tileY - 1,targetX,targetY) end
  1016.             if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] ~= 93 and obj.dir ~= 0 and distance(tileX + 1,tileY,targetX,targetY) <= ldist then ndir = 2 ldist = distance(tileX + 1,tileY,targetX,targetY) end
  1017.             if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] ~= 94 and obj.dir ~= 1 and distance(tileX,tileY + 1,targetX,targetY) <= ldist then ndir = 3 ldist = distance(tileX,tileY + 1,targetX,targetY) end
  1018.             if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] == 95 then ndir = 0 end
  1019.             if (passTiles[curMap[tileY - 1][tileX]] == true or curMap[tileY - 1][tileX] == 31) and curMap[tileY][tileX] == 96 or curMap[tileY][tileX] == 31 then ndir = 1 end
  1020.             if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] == 97 then ndir = 2 end
  1021.             if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] == 98 then ndir = 3 end
  1022.         end
  1023.         obj.dir = ndir
  1024.     end
  1025.     if obj.mode == 1 or obj.mode == 2 then
  1026.         if curMap[tileY][tileX] == 32 then
  1027.             obj.speed = 0.5
  1028.         else
  1029.             obj.speed = 0.9
  1030.         end
  1031.     end
  1032.     if obj.mode == 3 then
  1033.         obj.sprite = 5
  1034.     else
  1035.         if obj.dir == 0 then
  1036.             obj.sdir = 0
  1037.             obj.sprite = 1
  1038.         elseif obj.dir == 1 then
  1039.             obj.sdir = 0
  1040.             obj.sprite = 2
  1041.         elseif obj.dir == 2 then
  1042.             obj.sdir = 2
  1043.             obj.sprite = 1
  1044.         elseif obj.dir == 3 then
  1045.             obj.sdir = 0
  1046.             obj.sprite = 3
  1047.         end
  1048.     end
  1049. end}
  1050. baseObj[3] = {
  1051. ['name'] = "pinky",
  1052. ['sprite'] = 3,
  1053. ['sprPal'] = 3,
  1054. ['dir'] = 2,
  1055. ['sdir'] = 0,
  1056. ['fspeed'] = 8,
  1057. ['speed'] = 0.9,
  1058. ['offX'] = 8,
  1059. ['offY'] = 4,
  1060. ['drawX'] = -8,
  1061. ['drawY'] = -8,
  1062. ['scat'] = 1,
  1063. ['scatX'] = 1,
  1064. ['scatY'] = 1,
  1065. ['mode'] = 2,
  1066. ['timer'] = 420,
  1067. ['dologic'] = function(obj)
  1068.     local tileX,tileY = math.floor(obj.posX / 8) + 1, math.floor(obj.posY / 8) + 1
  1069.     local targetX = math.floor(pacobj.posX / 8) + pacobj.speedX * 4 + 1
  1070.     local targetY = math.floor(pacobj.posY / 8) + pacobj.speedY * 4 + 1
  1071.     if obj.mode == 2 then
  1072.         targetX = obj.scatX
  1073.         targetY = obj.scatY
  1074.     end
  1075.     if obj.mode == 3 then
  1076.         targetX = math.random(1,28)
  1077.         targetY = math.random(1,26)
  1078.     end
  1079.     if obj.mode == 4 then
  1080.         targetX = curMap.fX
  1081.         targetY = curMap.fY
  1082.     end
  1083.     obj.timer = obj.timer - 1
  1084.     if obj.timer <= 120 and obj.mode == 3 then
  1085.         obj.sprPal = math.fmod(obj.timer,30) > 15 and 7 or 6
  1086.     end
  1087.     if obj.timer <= 0 then
  1088.         if obj.mode == 1 then
  1089.             if obj.scat < 4 then
  1090.                 obj.scat = obj.scat + 1
  1091.                 obj.mode = 2
  1092.                 obj.timer = 420
  1093.                 if obj.scat > 2 then obj.timer = 300 end
  1094.                 obj.dir = math.fmod(obj.dir + 2, 4)
  1095.             else
  1096.                 obj.timer = 60
  1097.             end
  1098.         elseif obj.mode == 2 or obj.mode == 3 then
  1099.             if obj.mode == 2 then obj.dir = math.fmod(obj.dir + 2, 4) end
  1100.             obj.mode = 1
  1101.             obj.sprPal = 3
  1102.             obj.timer = 1200
  1103.         end
  1104.     end
  1105.     if tileX == targetX and tileY == targetY and obj.mode == 4 then
  1106.         obj.mode = 1
  1107.         obj.timer = 1200
  1108.         obj.sprPal = 3
  1109.     end
  1110.     if math.fmod(math.floor(obj.posX), 8) == 4 and math.fmod(math.floor(obj.posY), 8) == 4 then
  1111.         local ndir = obj.dir
  1112.         local empty = 0
  1113.         if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] ~= 91 and obj.dir ~= 2 then empty = empty + 1 end
  1114.         if (passTiles[curMap[tileY - 1][tileX]] == true or curMap[tileY - 1][tileX] == 31) and curMap[tileY][tileX] ~= 92 and obj.dir ~= 3 then empty = empty + 1 end
  1115.         if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] ~= 93 and obj.dir ~= 0 then empty = empty + 1 end
  1116.         if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] ~= 94 and obj.dir ~= 1 then empty = empty + 1 end
  1117.         if empty > 0 then
  1118.             local ldist = 99
  1119.             if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] ~= 91 and obj.dir ~= 2 and distance(tileX - 1,tileY,targetX,targetY) <= ldist then ndir = 0 ldist = distance(tileX - 1,tileY,targetX,targetY) end
  1120.             if (passTiles[curMap[tileY - 1][tileX]] == true) and curMap[tileY][tileX] ~= 92 and obj.dir ~= 3 and distance(tileX,tileY - 1,targetX,targetY) <= ldist then ndir = 1 ldist = distance(tileX,tileY - 1,targetX,targetY) end
  1121.             if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] ~= 93 and obj.dir ~= 0 and distance(tileX + 1,tileY,targetX,targetY) <= ldist then ndir = 2 ldist = distance(tileX + 1,tileY,targetX,targetY) end
  1122.             if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] ~= 94 and obj.dir ~= 1 and distance(tileX,tileY + 1,targetX,targetY) <= ldist then ndir = 3 ldist = distance(tileX,tileY + 1,targetX,targetY) end
  1123.             if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] == 95 then ndir = 0 end
  1124.             if (passTiles[curMap[tileY - 1][tileX]] == true or curMap[tileY - 1][tileX] == 31) and curMap[tileY][tileX] == 96 or curMap[tileY][tileX] == 31 then ndir = 1 end
  1125.             if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] == 97 then ndir = 2 end
  1126.             if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] == 98 then ndir = 3 end
  1127.         end
  1128.         obj.dir = ndir
  1129.     end
  1130.     if obj.mode == 1 or obj.mode == 2 then
  1131.         if curMap[tileY][tileX] == 32 then
  1132.             obj.speed = 0.5
  1133.         else
  1134.             obj.speed = 0.9
  1135.         end
  1136.     end
  1137.     if obj.mode == 3 then
  1138.         obj.sprite = 5
  1139.     else
  1140.         if obj.dir == 0 then
  1141.             obj.sdir = 0
  1142.             obj.sprite = 1
  1143.         elseif obj.dir == 1 then
  1144.             obj.sdir = 0
  1145.             obj.sprite = 2
  1146.         elseif obj.dir == 2 then
  1147.             obj.sdir = 2
  1148.             obj.sprite = 1
  1149.         elseif obj.dir == 3 then
  1150.             obj.sdir = 0
  1151.             obj.sprite = 3
  1152.         end
  1153.     end
  1154. end}
  1155. baseObj[4] = {
  1156. ['name'] = "clyde",
  1157. ['sprite'] = 2,
  1158. ['sprPal'] = 4,
  1159. ['dir'] = 2,
  1160. ['sdir'] = 0,
  1161. ['fspeed'] = 8,
  1162. ['speed'] = 0.9,
  1163. ['offX'] = 8,
  1164. ['offY'] = 4,
  1165. ['drawX'] = -8,
  1166. ['drawY'] = -8,
  1167. ['scat'] = 1,
  1168. ['scatX'] = 1,
  1169. ['scatY'] = 36,
  1170. ['mode'] = 2,
  1171. ['timer'] = 420,
  1172. ['dologic'] = function(obj)
  1173.     local tileX,tileY = math.floor(obj.posX / 8) + 1, math.floor(obj.posY / 8) + 1
  1174.     local targetX = math.floor(pacobj.posX / 8) + 1
  1175.     local targetY = math.floor(pacobj.posY / 8) + 1
  1176.     if distance(pacobj.posX,pacobj.posY,obj.posX,obj.posY) < 64 or obj.mode == 2 then
  1177.         targetX = obj.scatX
  1178.         targetY = obj.scatY
  1179.     end
  1180.     if obj.mode == 3 then
  1181.         targetX = math.random(1,28)
  1182.         targetY = math.random(1,26)
  1183.     end
  1184.     if obj.mode == 4 then
  1185.         targetX = curMap.fX
  1186.         targetY = curMap.fY
  1187.     end
  1188.     obj.timer = obj.timer - 1
  1189.     if obj.timer <= 120 and obj.mode == 3 then
  1190.         obj.sprPal = math.fmod(obj.timer,30) > 15 and 7 or 6
  1191.     end
  1192.     if obj.timer <= 0 then
  1193.         if obj.mode == 1 then
  1194.             if obj.scat < 4 then
  1195.                 obj.scat = obj.scat + 1
  1196.                 obj.mode = 2
  1197.                 obj.timer = 420
  1198.                 if obj.scat > 2 then obj.timer = 300 end
  1199.                 obj.dir = math.fmod(obj.dir + 2, 4)
  1200.             else
  1201.                 obj.timer = 60
  1202.             end
  1203.         elseif obj.mode == 2 or obj.mode == 3 then
  1204.             if obj.mode == 2 then obj.dir = math.fmod(obj.dir + 2, 4) end
  1205.             obj.mode = 1
  1206.             obj.sprPal = 4
  1207.             obj.timer = 1200
  1208.         end
  1209.     end
  1210.     if tileX == targetX and tileY == targetY and obj.mode == 4 then
  1211.         obj.mode = 1
  1212.         obj.timer = 1200
  1213.         obj.sprPal = 4
  1214.     end
  1215.     if math.fmod(math.floor(obj.posX), 8) == 4 and math.fmod(math.floor(obj.posY), 8) == 4 then
  1216.         local ndir = obj.dir
  1217.         local empty = 0
  1218.         if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] ~= 91 and obj.dir ~= 2 then empty = empty + 1 end
  1219.         if (passTiles[curMap[tileY - 1][tileX]] == true or curMap[tileY - 1][tileX] == 31) and curMap[tileY][tileX] ~= 92 and obj.dir ~= 3 then empty = empty + 1 end
  1220.         if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] ~= 93 and obj.dir ~= 0 then empty = empty + 1 end
  1221.         if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] ~= 94 and obj.dir ~= 1 then empty = empty + 1 end
  1222.         if empty > 0 then
  1223.             local ldist = 99
  1224.             if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] ~= 91 and obj.dir ~= 2 and distance(tileX - 1,tileY,targetX,targetY) <= ldist then ndir = 0 ldist = distance(tileX - 1,tileY,targetX,targetY) end
  1225.             if (passTiles[curMap[tileY - 1][tileX]] == true) and curMap[tileY][tileX] ~= 92 and obj.dir ~= 3 and distance(tileX,tileY - 1,targetX,targetY) <= ldist then ndir = 1 ldist = distance(tileX,tileY - 1,targetX,targetY) end
  1226.             if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] ~= 93 and obj.dir ~= 0 and distance(tileX + 1,tileY,targetX,targetY) <= ldist then ndir = 2 ldist = distance(tileX + 1,tileY,targetX,targetY) end
  1227.             if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] ~= 94 and obj.dir ~= 1 and distance(tileX,tileY + 1,targetX,targetY) <= ldist then ndir = 3 ldist = distance(tileX,tileY + 1,targetX,targetY) end
  1228.             if (passTiles[curMap[tileY][tileX - 1]] == true) and curMap[tileY][tileX] == 95 then ndir = 0 end
  1229.             if (passTiles[curMap[tileY - 1][tileX]] == true or curMap[tileY - 1][tileX] == 31) and curMap[tileY][tileX] == 96 or curMap[tileY][tileX] == 31 then ndir = 1 end
  1230.             if (passTiles[curMap[tileY][tileX + 1]] == true) and curMap[tileY][tileX] == 97 then ndir = 2 end
  1231.             if (passTiles[curMap[tileY + 1][tileX]] == true) and curMap[tileY][tileX] == 98 then ndir = 3 end
  1232.         end
  1233.         obj.dir = ndir
  1234.     end
  1235.     if obj.mode == 1 or obj.mode == 2 then
  1236.         if curMap[tileY][tileX] == 32 then
  1237.             obj.speed = 0.5
  1238.         else
  1239.             obj.speed = 0.9
  1240.         end
  1241.     end
  1242.     if obj.mode == 3 then
  1243.         obj.sprite = 5
  1244.     else
  1245.         if obj.dir == 0 then
  1246.             obj.sdir = 0
  1247.             obj.sprite = 1
  1248.         elseif obj.dir == 1 then
  1249.             obj.sdir = 0
  1250.             obj.sprite = 2
  1251.         elseif obj.dir == 2 then
  1252.             obj.sdir = 2
  1253.             obj.sprite = 1
  1254.         elseif obj.dir == 3 then
  1255.             obj.sdir = 0
  1256.             obj.sprite = 3
  1257.         end
  1258.     end
  1259. end}
  1260. baseObj[5] = {
  1261. ['name'] = "superdot",
  1262. ['sprite'] = 4,
  1263. ['sprPal'] = 5,
  1264. ['dir'] = 0,
  1265. ['sdir'] = 0,
  1266. ['fspeed'] = 10,
  1267. ['speed'] = 0,
  1268. ['offX'] = 4,
  1269. ['offY'] = 4,
  1270. ['drawX'] = -4,
  1271. ['drawY'] = -4,
  1272. ['dologic'] = function(obj) end}
  1273.  
  1274. gfx.drawPixel = function(x,y,red,green,blue,alpha)
  1275.     if red == nil then red,green,blue = 255,255,255 end
  1276.     alpha = alpha or 255
  1277.     if x >= 1 and y >= 1 and x <= 629 and y <= 424 then tpt.drawpixel(x,y,red,green,blue,alpha) end
  1278. end
  1279.  
  1280. local function drawpixel(x,y,red,green,blue,alpha)
  1281.     if red == nil then red,green,blue = 255,255,255 end
  1282.     alpha = alpha or 255
  1283.     if x >= bX and y >= bY and x <= bX + 223 and y <= bY + 287 then gfx.drawPixel(x,y,red,green,blue,alpha) end
  1284. end
  1285.  
  1286. function distance(x1,y1,x2,y2)
  1287.     return math.sqrt((x2 - x1)^2 + (y2 - y1)^2)
  1288. end
  1289.  
  1290. function deepcopy(orig)
  1291.     local orig_type = type(orig)
  1292.     local copy
  1293.     if orig_type == 'table' then
  1294.         copy = {}
  1295.         for orig_key, orig_value in next, orig, nil do
  1296.             copy[deepcopy(orig_key)] = deepcopy(orig_value)
  1297.         end
  1298.         setmetatable(copy, deepcopy(getmetatable(orig)))
  1299.     else
  1300.         copy = orig
  1301.     end
  1302.     return copy
  1303. end
  1304.  
  1305. string.rpad = function(str, len, char)
  1306.     if char == nil then char = ' ' end
  1307.     return string.rep(char, len - #str) .. str
  1308. end
  1309.  
  1310. local function drawTile(tile,bx,by,color)
  1311.     color = color or tileC[tile] + 0xFF000000
  1312.     for y = 1,8 do
  1313.         for x = 1,8 do
  1314.             tpt.delete(bx + x - 1,by + y - 1)
  1315.             if tiles[tile][y]:sub(x,x) == "1" then
  1316.                 tpt.create(bx + x - 1,by + y - 1,"DMND")
  1317.                 tpt.set_property("dcolour",color,bx + x - 1,by + y - 1)
  1318.             end
  1319.         end
  1320.     end
  1321. end
  1322.  
  1323. local function drawText(message,x,y,r,g,b)
  1324.     for i = 1, message:len() do
  1325.         tpt.drawtext((x + i - 2) * 8 + bX + (4 - (tpt.textwidth(message:sub(i,i)) / 2)), (y - 1) * 8 + bY, message:sub(i,i), r, g, b)
  1326.     end
  1327. end
  1328.  
  1329. local function drawSprite(sprite,palette,frame,dir,bx,by)
  1330.     bx = math.floor(bx)
  1331.     by = math.floor(by)
  1332.     for y = 1,#sprites[sprite][frame] do
  1333.         for x = 1,sprites[sprite][frame][y]:len() do
  1334.             if sprites[sprite][frame][y]:sub(x,x) ~= "0" then
  1335.                 if dir == 0 then
  1336.                     nx,ny=x,y
  1337.                 elseif dir == 1 then
  1338.                     nx,ny=y,x
  1339.                 elseif dir == 2 then
  1340.                     nx,ny=17-x,y
  1341.                 elseif dir == 3 then
  1342.                     nx,ny=17-y,17-x
  1343.                 end
  1344.                 drawpixel(bx + nx - 1, by + ny - 1, unpack(spriteC[palette][tonumber(sprites[sprite][frame][y]:sub(x,x))]))
  1345.             end
  1346.         end
  1347.     end
  1348. end
  1349.  
  1350. local function drawMap(map,bx,by)
  1351.     for y = 1,36 do
  1352.         for x = 1,28 do
  1353.             local tile = maps[map][y][x]
  1354.             if tile == 1 or tile == 2 then dots = dots + 1 end
  1355.             if spriteToObj[tile] ~= nil then
  1356.                 drawTile(0,(x - 1) * 8 + bx,(y - 1) * 8 + by)
  1357.             else
  1358.                 drawTile(tile,(x - 1) * 8 + bx,(y - 1) * 8 + by)
  1359.             end
  1360.         end
  1361.     end
  1362. end
  1363.  
  1364. local function clearMap(map,bx,by)
  1365.     for y = 1,36 do
  1366.         for x = 1,28 do
  1367.             drawTile(0,(x - 1) * 8 + bx,(y - 1) * 8 + by)
  1368.         end
  1369.     end
  1370. end
  1371.  
  1372. local function loadObject(tile,x,y,gsdots)
  1373.     if spriteToObj[tile] ~= nil then
  1374.         if (gsdots == true and tile ~= 2) or gsdots ~= true then
  1375.             table.insert(objects,deepcopy(baseObj[spriteToObj[tile]]))
  1376.             local v = objects[#objects]
  1377.             v.posX = (x - 1) * 8 + v.offX
  1378.             v.posY = (y - 1) * 8 + v.offY
  1379.             v.frame = 1
  1380.             v.fcount = 0
  1381.             if v.dir == 0 then
  1382.                 v.speedX = -v.speed
  1383.                 v.speedY = 0
  1384.             elseif v.dir == 1 then
  1385.                 v.speedX = 0
  1386.                 v.speedY = -v.speed
  1387.             elseif v.dir == 2 then
  1388.                 v.speedX = v.speed
  1389.                 v.speedY = 0
  1390.             elseif v.dir == 3 then
  1391.                 v.speedX = 0
  1392.                 v.speedY = v.speed
  1393.             end
  1394.             if v.name == "pacman" then pacobj = v end
  1395.             if v.name == "blinky" then blinkobj = v end
  1396.         end
  1397.     end
  1398. end
  1399.  
  1400. local function grabObjects(map, gsdots)
  1401.     objects = {}
  1402.     for y = 1,36 do
  1403.         for x = 1,28 do
  1404.             loadObject(maps[map][y][x],x,y,gsdots)
  1405.         end
  1406.     end
  1407.     for k,v in pairs(omaps[map]) do
  1408.         loadObject(v[1],v[2],v[3],gsdots)
  1409.     end
  1410. end
  1411.  
  1412. local stage = "start"
  1413. local function main()
  1414.     if stage == "start" then
  1415.         if advancekey == true then
  1416.             advancekey = false
  1417.             stage = "intro"
  1418.             introTimer = 120
  1419.             map = 1
  1420.             score = 0
  1421.             dots = 0
  1422.             lives = 3
  1423.             drawMap(map,bX,bY)
  1424.             grabObjects(map)
  1425.             curMap = deepcopy(maps[map])
  1426.             for y = 1,36 do
  1427.                 for x = 1,28 do
  1428.                     if spriteToObj[curMap[y][x]] ~= nil then
  1429.                         curMap[y][x] = 0
  1430.                     end
  1431.                 end
  1432.             end
  1433.         end
  1434.         if dotSpace == nil then dotSpace = 0 end
  1435.         if pacTimer == nil then pacTimer = 0 end
  1436.         if ghostTimer == nil then ghostTimer = 0 end
  1437.         if pacFrame == nil then pacFrame = 1 end
  1438.         if ghostFrame == nil then ghostFrame = 1 end
  1439.         pacTimer = pacTimer + 1
  1440.         ghostTimer = ghostTimer + 1
  1441.         startTimer = startTimer - 1
  1442.         dotSpace = math.fmod(dotSpace + 1, 8)
  1443.         if pacTimer >= 3 then pacFrame = math.fmod(pacFrame, 4) + 1 pacTimer = 0 end
  1444.         if ghostTimer >= 8 then ghostFrame = math.fmod(ghostFrame, 2) + 1 ghostTimer = 0 end
  1445.         if startTimer <= 0 then
  1446.             stage = "hiscore"
  1447.             startTimer = 600
  1448.         end
  1449.         for i = 168 - dotSpace, 200 - dotSpace, 8 do
  1450.             gfx.drawRect(i + bX, 142 + bY, 2, 2, 255, 185, 175)
  1451.         end
  1452.         drawSprite(1,1,ghostFrame,2,56 + bX,136 + bY)
  1453.         drawSprite(1,2,ghostFrame,2,80 + bX,136 + bY)
  1454.         drawSprite(1,3,ghostFrame,2,104 + bX,136 + bY)
  1455.         drawSprite(1,4,ghostFrame,2,128 + bX,136 + bY)
  1456.         drawSprite(0,0,pacFrame,2,152 + bX,136 + bY)
  1457.         drawSprite(6,9,1,0,21 + bX,32 + bY)
  1458.         if upTimer < 15 then
  1459.             drawText("1UP",4,1,222,222,255)
  1460.             drawText("PRESS ENTER!",09,15,255,255,0)
  1461.         end
  1462.         drawText("HIGH SCORE",10,1,222,222,255)
  1463.         drawText(tostring(score),8 - tostring(score):len(),2,222,222,255)
  1464.         drawText(tostring(math.max(scores[1][1],score)),18 - tostring(math.max(scores[1][1],score)):len(),2,222,222,255)
  1465.         upTimer = math.fmod(upTimer + 1,30)
  1466.     elseif stage == "hiscore" then
  1467.         if advancekey == true then
  1468.             advancekey = false
  1469.             stage = "intro"
  1470.             introTimer = 120
  1471.             map = 1
  1472.             score = 0
  1473.             dots = 0
  1474.             lives = 3
  1475.             drawMap(map,bX,bY)
  1476.             grabObjects(map)
  1477.             curMap = deepcopy(maps[map])
  1478.             for y = 1,36 do
  1479.                 for x = 1,28 do
  1480.                     if spriteToObj[curMap[y][x]] ~= nil then
  1481.                         curMap[y][x] = 0
  1482.                     end
  1483.                 end
  1484.             end
  1485.         end
  1486.         startTimer = startTimer - 1
  1487.         if startTimer <= 0 then
  1488.             stage = "start"
  1489.             startTimer = 600
  1490.         end
  1491.         drawSprite(6,9,1,0,21 + bX,32 + bY)
  1492.         local i = 0
  1493.         for k,v in pairs(scores) do
  1494.             drawText(string.rpad(tostring(v[1]),6,"0"),3,i * 2 + 12,255,255,255)
  1495.             drawText(string.rpad(tostring(v[2]),2,"0"),10,i * 2 + 12,255,255,255)
  1496.             drawText(v[3],13,i * 2 + 12,255,255,255)
  1497.             i = i + 1
  1498.         end
  1499.         if upTimer < 15 then
  1500.             drawText("1UP",4,1,222,222,255)
  1501.         end
  1502.         drawText("HIGH SCORE",10,1,222,222,255)
  1503.         drawText(tostring(score),8 - tostring(score):len(),2,222,222,255)
  1504.         drawText(tostring(math.max(scores[1][1],score)),18 - tostring(math.max(scores[1][1],score)):len(),2,222,222,255)
  1505.         upTimer = math.fmod(upTimer + 1,30)
  1506.     elseif stage == "intro" then
  1507.         introTimer = introTimer - 1
  1508.         if introTimer <= 0 then
  1509.             stage = "ready"
  1510.             readyTimer = 120
  1511.         end
  1512.         if upTimer < 15 then
  1513.             drawText("1UP",4,1,222,222,255)
  1514.         end
  1515.         drawText("HIGH SCORE",10,1,222,222,255)
  1516.         drawText(tostring(score),8 - tostring(score):len(),2,222,222,255)
  1517.         drawText("PLAYER ONE",10,15,0,255,255)
  1518.         drawText("READY!",12,21,255,255,0)
  1519.         upTimer = math.fmod(upTimer + 1,30)
  1520.         for i = 1,lives - 1 do
  1521.             drawSprite(0,0,3,2,(i * 16) + bX, (34 * 8) + bY)
  1522.         end
  1523.     elseif stage == "ready" then
  1524.         readyTimer = readyTimer - 1
  1525.         if readyTimer <= 0 then
  1526.             stage = "game"
  1527.             readyTimer = 120
  1528.         end
  1529.         for k,v in pairs(objects) do
  1530.             v.fcount = v.fcount + 1
  1531.             if v.fcount >= v.fspeed  then
  1532.                 v.frame = math.fmod(v.frame,#sprites[v.sprite]) + 1
  1533.                 v.fcount = 0
  1534.             end
  1535.         end
  1536.         for k,v in pairs(objects) do
  1537.             drawSprite(v.sprite,v.sprPal,v.frame,v.sdir,v.posX + bX + v.drawX, v.posY + bY + v.drawY)
  1538.         end
  1539.         if upTimer < 15 then
  1540.             drawText("1UP",4,1,222,222,255)
  1541.         end
  1542.         drawText("HIGH SCORE",10,1,222,222,255)
  1543.         drawText(tostring(score),8 - tostring(score):len(),2,222,222,255)
  1544.         drawText(tostring(math.max(scores[1][1],score)),18 - tostring(math.max(scores[1][1],score)):len(),2,222,222,255)
  1545.         drawText("READY!",12,21,255,255,0)
  1546.         upTimer = math.fmod(upTimer + 1,30)
  1547.         for i = 1,lives - 1 do
  1548.             drawSprite(0,0,3,2,(i * 16) + bX, (34 * 8) + bY)
  1549.         end
  1550.     elseif stage == "game" then
  1551.         for k,v in pairs(objects) do
  1552.             v:dologic()
  1553.         end
  1554.         for k,v in pairs(objects) do
  1555.             local tileX,tileY = (v.posX / 8) + 1, (v.posY / 8) + 1
  1556.             local ltileX,ltileY
  1557.             if v.dir == 0 then
  1558.                 ltileX,ltileY = math.floor(tileX - 0.625),math.floor(tileY)
  1559.             elseif v.dir == 1 then
  1560.                 ltileX,ltileY = math.floor(tileX),math.floor(tileY - 0.625)
  1561.             elseif v.dir == 2 then
  1562.                 ltileX,ltileY = math.floor(tileX + 0.625),math.floor(tileY)
  1563.             elseif v.dir == 3 then
  1564.                 ltileX,ltileY = math.floor(tileX),math.floor(tileY + 0.625)
  1565.             end
  1566.             tileX,tileY = math.floor(tileX),math.floor(tileY)
  1567.             if v.dir == 0 then
  1568.                 v.speedX = -v.speed
  1569.                 v.speedY = 0
  1570.             elseif v.dir == 1 then
  1571.                 v.speedX = 0
  1572.                 v.speedY = -v.speed
  1573.             elseif v.dir == 2 then
  1574.                 v.speedX = v.speed
  1575.                 v.speedY = 0
  1576.             elseif v.dir == 3 then
  1577.                 v.speedX = 0
  1578.                 v.speedY = v.speed
  1579.             end
  1580.             if (math.fmod(math.floor(v.posX),8) == 4 or math.fmod(math.floor(v.posY),8) == 4) and (math.fmod(math.floor(v.posX),2) == 0 and math.fmod(math.floor(v.posY),2) == 0) then
  1581.                 if passTiles[curMap[ltileY][ltileX]] == true or (v.name ~= "pacman" and curMap[ltileY][ltileX] == 31) then
  1582.                 else
  1583.                     v.speedX = 0
  1584.                     v.speedY = 0
  1585.                 end
  1586.             end
  1587.             if curMap[ltileY][ltileX] == nil then
  1588.                 if v.dir == 0 then
  1589.                     v.posX = v.posX + 224
  1590.                 elseif v.dir == 1 then
  1591.                     v.posX = v.posX + 288
  1592.                 elseif v.dir == 2 then
  1593.                     v.posX = v.posX - 224
  1594.                 elseif v.dir == 3 then
  1595.                     v.posX = v.posX - 288
  1596.                 end
  1597.             end
  1598.             v.posX = v.posX + v.speedX
  1599.             v.posY = v.posY + v.speedY
  1600.             if v.name == "pacman" then
  1601.                 if curMap[tileY][tileX] == 1 then
  1602.                     curMap[tileY][tileX] = 0
  1603.                     drawTile(0,(tileX - 1) * 8 + bX,(tileY - 1) * 8 + bY)
  1604.                     dots = dots - 1
  1605.                     score = score + 10
  1606.                 end
  1607.             end
  1608.         end
  1609.         for k,v in pairs(objects) do
  1610.             if v.name ~= "pacman" then
  1611.                 if distance(v.posX,v.posY,pacobj.posX,pacobj.posY) < 4 then
  1612.                     if v.name == "superdot" then
  1613.                         v.name = "deadobj"
  1614.                         v.sprPal = 99
  1615.                         v.speed = 0
  1616.                         v.dologic = function() end
  1617.                         score = score + 50
  1618.                         dots = dots - 1
  1619.                         for k,v in pairs(objects) do
  1620.                             if v.name == "blinky" or v.name == "pinky" or v.name == "inky" or v.name == "clyde" then
  1621.                                 if v.mode ~= 4 then
  1622.                                     v.timer = 300
  1623.                                     v.sprite = 5
  1624.                                     v.sprPal = 6
  1625.                                     v.speed = 0.6
  1626.                                     if v.mode ~= 3 then v.dir = math.fmod(v.dir + 2, 4) end
  1627.                                     v.mode = 3
  1628.                                 end
  1629.                             end
  1630.                         end
  1631.                     elseif v.name == "blinky" or v.name == "pinky" or v.name == "inky" or v.name == "clyde" then
  1632.                         if v.mode == 1 or v.mode == 2 then
  1633.                             stage = "death"
  1634.                             deathtimer = 120
  1635.                         elseif v.mode == 3 then
  1636.                             v.mode = 4
  1637.                             v.speed = 2
  1638.                             v.posX = math.floor(v.posX / 2) * 2
  1639.                             v.posY = math.floor(v.posY / 2) * 2
  1640.                             v.sprPal = 8
  1641.                             score = score + 300
  1642.                         end
  1643.                     end
  1644.                 end
  1645.             end
  1646.         end
  1647.         for k,v in pairs(objects) do
  1648.             v.fcount = v.fcount + 1
  1649.             if v.fcount >= v.fspeed  then
  1650.                 v.frame = math.fmod(v.frame,#sprites[v.sprite]) + 1
  1651.                 v.fcount = 0
  1652.             end
  1653.         end
  1654.         if score - lScore > 10000 then
  1655.             if lives < 6 then lives = lives + 1 end
  1656.             lScore = math.floor(score / 10000) * 10000
  1657.         end
  1658.         if dots <= 0 then
  1659.             stage = "win"
  1660.             wintimer = 180
  1661.         end
  1662.         for k,v in pairs(objects) do
  1663.             drawSprite(v.sprite,v.sprPal,v.frame,v.sdir,v.posX + bX + v.drawX, v.posY + bY + v.drawY)
  1664.         end
  1665.         if upTimer < 15 then
  1666.             drawText("1UP",4,1,222,222,255)
  1667.         end
  1668.         drawText("HIGH SCORE",10,1,222,222,255)
  1669.         drawText(tostring(score),8 - tostring(score):len(),2,222,222,255)
  1670.         drawText(tostring(math.max(scores[1][1],score)),18 - tostring(math.max(scores[1][1],score)):len(),2,222,222,255)
  1671.         upTimer = math.fmod(upTimer + 1,30)
  1672.         for i = 1,lives - 1 do
  1673.             drawSprite(0,0,3,2,(i * 16) + bX, (34 * 8) + bY)
  1674.         end
  1675.     elseif stage == "win" then
  1676.         for k,v in pairs(objects) do
  1677.             v.fcount = v.fcount + 1
  1678.             if v.fcount >= v.fspeed  then
  1679.                 v.frame = math.fmod(v.frame,#sprites[v.sprite]) + 1
  1680.                 v.fcount = 0
  1681.             end
  1682.         end
  1683.         for k,v in pairs(objects) do
  1684.             drawSprite(v.sprite,v.sprPal,v.frame,v.sdir,v.posX + bX + v.drawX, v.posY + bY + v.drawY)
  1685.         end
  1686.         wintimer = wintimer - 1
  1687.         if wintimer <= 0 then
  1688.             stage = "ready"
  1689.             dots = 0
  1690.             level = level + 1
  1691.             drawMap(map,bX,bY)
  1692.             grabObjects(map)
  1693.             curMap = deepcopy(maps[map])
  1694.             for y = 1,36 do
  1695.                 for x = 1,28 do
  1696.                     if spriteToObj[curMap[y][x]] ~= nil then
  1697.                         curMap[y][x] = 0
  1698.                     end
  1699.                 end
  1700.             end
  1701.         end
  1702.         if upTimer < 15 then
  1703.             drawText("1UP",4,1,222,222,255)
  1704.         end
  1705.         drawText("HIGH SCORE",10,1,222,222,255)
  1706.         drawText(tostring(score),8 - tostring(score):len(),2,222,222,255)
  1707.         upTimer = math.fmod(upTimer + 1,30)
  1708.         for i = 1,lives - 1 do
  1709.             drawSprite(0,0,3,2,(i * 16) + bX, (34 * 8) + bY)
  1710.         end
  1711.     elseif stage == "death" then
  1712.         for k,v in pairs(objects) do
  1713.             v.fcount = v.fcount + 1
  1714.             if v.fcount >= v.fspeed then
  1715.                 if v.name == "pacman" then
  1716.                     v.frame = 2
  1717.                     v.sdir = math.fmod(v.sdir + 1, 4)
  1718.                 else
  1719.                     v.frame = math.fmod(v.frame,#sprites[v.sprite]) + 1
  1720.                 end
  1721.                 v.fcount = 0
  1722.             end
  1723.         end
  1724.         for k,v in pairs(objects) do
  1725.             drawSprite(v.sprite,v.sprPal,v.frame,v.sdir,v.posX + bX + v.drawX, v.posY + bY + v.drawY)
  1726.         end
  1727.         deathtimer = deathtimer - 1
  1728.         if deathtimer <= 0 then
  1729.             lives = lives - 1
  1730.             if lives <= 0 then
  1731.                 stage = "start"
  1732.                 if score > scores[10][1] then stage = "score" end
  1733.                 clearMap(map,bX,bY)
  1734.             else
  1735.                 stage = "ready"
  1736.                 local sdots = {}
  1737.                 for k,v in pairs(objects) do
  1738.                     if v.name == "superdot" then table.insert(sdots,v) end
  1739.                 end
  1740.                 grabObjects(map, true)
  1741.                 for k,v in pairs(sdots) do
  1742.                     table.insert(objects,v)
  1743.                 end
  1744.             end
  1745.         end
  1746.         if upTimer < 15 then
  1747.             drawText("1UP",4,1,222,222,255)
  1748.         end
  1749.         drawText("HIGH SCORE",10,1,222,222,255)
  1750.         drawText(tostring(score),8 - tostring(score):len(),2,222,222,255)
  1751.         drawText(tostring(math.max(scores[1][1],score)),18 - tostring(math.max(scores[1][1],score)):len(),2,222,222,255)
  1752.         upTimer = math.fmod(upTimer + 1,30)
  1753.         for i = 1,lives - 1 do
  1754.             drawSprite(0,0,3,2,(i * 16) + bX, (34 * 8) + bY)
  1755.         end
  1756.     elseif stage == "score" then
  1757.         if upTimer < 15 then
  1758.             drawText("1UP",4,1,222,222,255)
  1759.         end
  1760.         drawText("HIGH SCORE",10,1,222,222,255)
  1761.         drawText(tostring(score),8 - tostring(score):len(),2,222,222,255)
  1762.         drawText(tostring(math.max(scores[1][1],score)),18 - tostring(math.max(scores[1][1],score)):len(),2,222,222,255)
  1763.         drawText("NEW HISCORE!",09,13,255,255,255)
  1764.         drawText(scoreName .. ((scoreName:len() < 14 and upTimer < 15) and "_" or ""),8,15,222,222,255)
  1765.         upTimer = math.fmod(upTimer + 1,30)
  1766.     end
  1767.     gfx.drawRect(bX - 1, bY - 1, 226, 290)
  1768. end
  1769.  
  1770. local function keyEvent(key, nkey, modify, event)
  1771.     if stage == "start" or stage == "hiscore" then
  1772.         if nkey == 13 and event == 1 then
  1773.             advancekey = true
  1774.         end
  1775.     elseif stage == "game" or stage == "ready" then
  1776.         local newdir
  1777.         if nkey == 276 then
  1778.             pacobj.ndir = 0
  1779.         elseif nkey == 273 then
  1780.             pacobj.ndir = 1
  1781.         elseif nkey == 275 then
  1782.             pacobj.ndir = 2
  1783.         elseif nkey == 274 then
  1784.             pacobj.ndir = 3
  1785.         end
  1786.     elseif stage == "score" then
  1787.         if nkey == 303 then useShift = event end
  1788.         if nkey == 8 and scoreName:len() > 0 and event == 1 then
  1789.             scoreName = scoreName:sub(1,-2)
  1790.         elseif nkey == 13 then
  1791.             for i = 1,10 do
  1792.                 if scores[i][1] < score then
  1793.                     table.insert(scores,i,{score,level,scoreName})
  1794.                     scores[11] = nil
  1795.                     break
  1796.                 end
  1797.             end
  1798.             stage = "start"
  1799.         elseif (nkey == 32 or (nkey > 47 and nkey < 57) or (nkey > 96 and nkey < 123)) and scoreName:len() < 14 and event == 1 then
  1800.             scoreName = scoreName .. (useShift == 1 and string.upper(key) or key)
  1801.         end
  1802.     end
  1803.     return false
  1804. end
  1805.  
  1806. tpt.register_keypress(keyEvent)
  1807. tpt.register_step(main)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement