Mousetat

Minesweeper by eshkation

Jan 10th, 2017
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.63 KB | None | 0 0
  1. tfm.exec.disableAutoNewGame(true)
  2. tfm.exec.disableAfkDeath(true)
  3. tfm.exec.disableAutoShaman(true)
  4.  
  5. mine = {
  6. --[[ default configuration ]]--
  7. width = 17;
  8. height = 17;
  9. bombs = 50;
  10. block = 20;
  11. area = {};
  12. minechar = '☀';
  13. flagchar = '◄';
  14. flagbchar = '|';
  15. startx = 300;
  16. starty = 50;
  17. positions = {}; -- [[ for bomb's random choice ]] --
  18. player = 'Eshkation';
  19. flagmode = false;
  20. gamend = true;
  21. clicks = 0;
  22. flagsleft = 'notset';
  23. cellsleft = 0;
  24. flagcp = 0
  25. }
  26.  
  27. function mine:init()
  28. tfm.exec.newGame('@6221354')
  29. system.bindMouse(mine.player, true)
  30. tfm.exec.bindKeyboard(mine.player, 32, true, true)
  31. id = 0
  32. mine.positions = {}
  33. mine.flagcp = 0
  34. mine.flagsleft = mine.bombs+1
  35. mine.flagmode = false
  36. mine.clicks = 0
  37. mine.cellsleft = mine.width*mine.height;
  38. math.randomseed(os.time())
  39. tfm.exec.addPhysicObject(-1, mine.startx+(mine.block*mine.width)/2-mine.block/2, mine.starty+(mine.block*mine.height)/2-mine.block/2, {type = 12, color = 0xA2A2A2, width = mine.width*mine.block+2, height = mine.height*mine.block+2, miceCollision = false})
  40. for lin = mine.width, 1, -1 do
  41. mine.area[lin] = {}
  42. for col = mine.height, 1, -1 do
  43. id = id+1
  44. mine.area[lin][col] = {ismine = false, isflagged = false, isexposed = false, objectid = id}
  45. table.insert(mine.positions, {lin, col})
  46. tfm.exec.addPhysicObject(id, ((lin-1)*mine.block)+mine.startx, ((col-1)*mine.block)+mine.starty, {type = 12, color = 0xBFBFBF, width = mine.block-2, height = mine.block-2, miceCollision = false})
  47. end
  48. end
  49. mine:setbombs()
  50. for lin = mine.width, 1, -1 do
  51. for col = mine.height, 1, -1 do
  52. mine.area[lin][col].neighmines = mine:getneighbors(lin-1, col-1, lin+1, col+1, function(x, y) if mine.area[x][y].ismine then count = count+1 end end)
  53. end
  54. end
  55. mine.gamend = false;
  56. end
  57.  
  58. function mine:getcell(posx, posy)
  59. data = {false, false}
  60. for lin = mine.width, 1, -1 do
  61. for col = mine.height, 1, -1 do
  62. if mine:checkinrange(lin*mine.block, col*mine.block, posx-mine.startx+mine.block, posy-mine.starty+mine.block, mine.block/2) then
  63. data = {lin, col}
  64. end
  65. end
  66. end
  67. return data
  68. end
  69.  
  70. function mine:checkinrange(posx, posy, posx2, posy2, range)
  71. return ((posx - posx2)^2 + (posy - posy2)^2 < range^2)
  72. end
  73.  
  74. function mine:getneighbors(posx, posy, posx2, posy2, functionto, discover)
  75. count = 0
  76. for lin = math.max(posx, 1), math.min(posx2, mine.width) do
  77. for col = math.max(posy, 1), math.min(posy2, mine.height) do
  78. if mine.area[lin] ~= nil and mine.area[lin][col] ~= nil then
  79. if not mine.area[lin][col].isexposed then
  80. functionto(lin, col)
  81. if discover then
  82. if mine.area[lin][col].neighmines == 0 then
  83. mine:getneighbors(lin-1, col-1, lin+1, col+1, function(x, y) if not mine.area[x][y].ismine then mine:removecell(x, y) end end, true)
  84. end
  85. end
  86. end
  87. end
  88. end
  89. end
  90. return count
  91. end
  92.  
  93. function mine:removecell(posx, posy)
  94. if not mine.area[posx][posy].ismine and not mine.area[posx][posy].isflagged then
  95. mine.cellsleft = mine.cellsleft-1
  96. count = mine.area[posx][posy].neighmines
  97. mine.area[posx][posy].isexposed = true
  98. cellscolors = {[0] = '#A2A2A2', [1] = '#0000FE', [2] = '#007F00', [3] = '#FE0000', [4] = '#00007F', [5] = '#7F0100', [6] = '#007F80', [7] = '#000000', [8] = '#BEBEBE'}
  99. tfm.exec.removePhysicObject(mine.area[posx][posy].objectid)
  100. text = string.format('<b><font color="%s" size="15" face="Lucida Console">%s', cellscolors[count], count)
  101. ui.addTextArea(mine.area[posx][posy].objectid, text, nil, (((posx-1)*mine.block)+mine.startx)-6, (((posy-1)*mine.block)+mine.starty)-6, nil, nil, 0, 0, 1, true)
  102. end
  103. end
  104.  
  105. function eventKeyboard(player, keyid, down, x, y)
  106. if (keyid == 32) then
  107. if mine.flagmode then
  108. mine.flagmode = false
  109. else
  110. mine.flagmode = true
  111. end
  112. end
  113. end
  114.  
  115. function eventTextAreaCallback(id, player, callback)
  116. if callback == 'newgame' then
  117. ui.removeTextArea(-3)
  118. ui.removeTextArea(-4)
  119. for lin = mine.width, 1, -1 do
  120. for col = mine.height, 1, -1 do
  121. ui.removeTextArea(mine.area[lin][col].objectid)
  122. ui.removeTextArea(-mine.area[lin][col].objectid)
  123. ui.removeTextArea('-1'..mine.area[lin][col].objectid)
  124. end
  125. end
  126. mine:init()
  127. end
  128. end
  129.  
  130. function eventMouse(player, posx, posy)
  131. if not mine.gamend then
  132. pos = mine:getcell(posx, posy)
  133. lin = pos[1]
  134. col = pos[2]
  135. if lin then
  136. mine.clicks = mine.clicks+1
  137. if not mine.flagmode then
  138. if not mine.area[lin][col].ismine then
  139. if not mine.area[lin][col].isflagged then
  140. d = mine.area[lin][col].neighmines
  141. mine:getneighbors(lin-1, col-1, lin+1, col+1, function(x, y) if not mine.area[x][y].ismine then mine:removecell(x, y) end end, true)
  142. end
  143. end
  144. if mine.area[lin][col].ismine then
  145. for lin = mine.width, 1, -1 do
  146. for col = mine.height, 1, -1 do
  147. if mine.area[lin][col].ismine then
  148. mine.gamend = true
  149. tfm.exec.addPhysicObject(mine.area[lin][col].objectid, ((lin-1)*mine.block)+mine.startx, ((col-1)*mine.block)+mine.starty, {type = 12, color = 0xBC0000, width = mine.block-2, height = mine.block-2, miceCollision = false})
  150. text = '<b><font color="#000000" size="15" face="Lucida Console">'..mine.minechar
  151. ui.addTextArea(mine.area[lin][col].objectid, text, nil, (((lin-1)*mine.block)+mine.startx)-8, (((col-1)*mine.block)+mine.starty)-7, nil, nil, 0, 0, 1, true)
  152. end
  153. end
  154. end
  155. ui.addTextArea(-4, '', nil, -500, -500, 9000, 9000, 0x000001, 0x000001, 0.6, true)
  156. ui.addTextArea(-3, '<R><font size="40" face="Lucida Console"><p align="center">Booooooom!</font>\n<font size="15"><N><a href="event:newgame">new game', nil, 270, 200, nil, nil, 0x0, 0x0, 0, true)
  157. end
  158. else
  159. if not mine.area[lin][col].isflagged then
  160. if mine.flagsleft > 0 then
  161. mine.flagsleft = mine.flagsleft-1
  162. mine.area[lin][col].isflagged = true
  163. text = '<b><font color="#FF0000" size="15" face="Lucida Console">'..mine.flagchar
  164. text2 = '<b><font color="#000000" size="15" face="Lucida Console">'..mine.flagbchar
  165. ui.addTextArea(mine.area[lin][col].objectid, text, nil, (((lin-1)*mine.block)+mine.startx)-7, (((col-1)*mine.block)+mine.starty)-12, nil, nil, 0, 0, 1, false)
  166. ui.addTextArea('-1'..mine.area[lin][col].objectid, text2, nil, (((lin-1)*mine.block)+mine.startx)-3, (((col-1)*mine.block)+mine.starty)-9, nil, nil, 0, 0, 1, false)
  167. tfm.exec.addPhysicObject(mine.area[lin][col].objectid, ((lin-1)*mine.block)+mine.startx, ((col-1)*mine.block)+mine.starty, {type = 12, color = 0xCDC327, width = mine.block-2, height = mine.block-2, miceCollision = false})
  168. if mine.area[lin][col].ismine then
  169. mine.flagcp = mine.flagcp+1
  170. if mine.flagcp == mine.bombs+1 then
  171. mine.gamend = true
  172. for x = 120, 0, -1 do
  173. tfm.exec.displayParticle(29, 400, 200, math.random(-2, 2), math.random(-2, 2), math.random(-2, 2), math.random(-2, 2))
  174. math.randomseed(x*x)
  175. end
  176. ui.addTextArea(-4, '', nil, -500, -500, 9000, 9000, 0x000001, 0x000001, 0.6, true)
  177. ui.addTextArea(-3, '<BV><font size="40" face="Lucida Console"><p align="center">You found all mines!</font>\n<font size="15"><N><a href="event:newgame">new game', nil, 230, 200, nil, nil, 0x0, 0x0, 0, true)
  178. end
  179. end
  180. end
  181. else
  182. if mine.area[lin][col].isflagged then
  183. mine.area[lin][col].isflagged = false
  184. tfm.exec.addPhysicObject(mine.area[lin][col].objectid, ((lin-1)*mine.block)+mine.startx, ((col-1)*mine.block)+mine.starty, {type = 12, color = 0xBFBFBF, width = mine.block-2, height = mine.block-2, miceCollision = false})
  185. ui.removeTextArea(mine.area[lin][col].objectid)
  186. ui.removeTextArea('-1'..mine.area[lin][col].objectid)
  187. mine.flagsleft = mine.flagsleft+1
  188. if mine.area[lin][col].ismine then
  189. mine.flagcp = mine.flagcp-1
  190. end
  191. end
  192. end
  193. end
  194. end
  195. end
  196. end
  197.  
  198. function mine:setbombs()
  199. for id = mine.bombs, 0, -1 do
  200. math.randomseed(os.time()*id)
  201. posid = math.random(#mine.positions)
  202. lin = mine.positions[posid][1]
  203. col = mine.positions[posid][2]
  204. mine.area[lin][col].ismine = true
  205. table.remove(mine.positions, posid)
  206. end
  207. end
  208.  
  209. mine:init()
  210.  
  211. function eventLoop()
  212. if not gamend then
  213. text = '<font face="Lucida Console"><font size="20"><VP>MINESWEEPER<font size="12">\n\n<VP>Player: <N>%s\n<VP>Cells left: <N>%s\n<VP>Mines: <N>%s\n<VP>Flags left: <N>%s\n<VP>Clicks: <N>%s\n<J>Flag mode: <N>%s\n</font>'
  214. ui.addTextArea(-2, string.format(text, mine.player, mine.cellsleft, mine.bombs, mine.flagsleft, mine.clicks, tostring(mine.flagmode)), nil, 20, 100, nil, nil, 0x7F7F7F, 0x7F7F7F, 1, true)
  215. end
  216. end
Add Comment
Please, Sign In to add comment