SHOW:
|
|
- or go back to the newest paste.
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 = 5; |
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)-9, 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)-8, 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 |