SHOW:
|
|
- or go back to the newest paste.
1 | --Made by KrYn0MoRe | |
2 | ||
3 | - | --DevSersponge helped w/ effects :> |
3 | + | --DevSersponge made win and draw effects |
4 | ||
5 | local partfolder = Instance.new("Folder") | |
6 | partfolder.Parent = script | |
7 | ||
8 | - | local clickX,clickO |
8 | + | |
9 | 1,2,3 | |
10 | 4,5,6 | |
11 | 7,8,9 | |
12 | ]] | |
13 | ||
14 | local ways = { | |
15 | {n1 = 1,n2 = 2,n3 = 3}, | |
16 | {n1 = 4,n2 = 5,n3 = 6}, | |
17 | {n1 = 7,n2 = 8,n3 = 9}, | |
18 | {n1 = 1,n2 = 5,n3 = 9}, | |
19 | {n1 = 3,n2 = 5,n3 = 7}, | |
20 | {n1 = 1,n2 = 4,n3 = 7}, | |
21 | {n1 = 2,n2 = 5,n3 = 8}, | |
22 | {n1 = 3,n2 = 6,n3 = 9}, | |
23 | } | |
24 | ||
25 | local plots = {} | |
26 | local parts = {} | |
27 | local win_songs = { | |
28 | {453967617,1,0}, | |
29 | {1843322216,1,0}, | |
30 | {2969532905,1,0}, | |
31 | {341673299,1,25}, | |
32 | {682070138,1,0}, | |
33 | {2586407163,0.8,10}, | |
34 | } | |
35 | ||
36 | local playing = false | |
37 | - | local total = 0 |
37 | + | |
38 | local multiplier = 3 | |
39 | local s = 3 | |
40 | local start_time = 5 | |
41 | local turn_time = 10 | |
42 | local win_time = 10 | |
43 | local line_size = 0.05 | |
44 | local tid = 0 | |
45 | local maintext,board,stand | |
46 | local curline=nil | |
47 | local firstpart=nil | |
48 | local lastpart=nil | |
49 | local currentwinner=0 | |
50 | ||
51 | ||
52 | function check() | |
53 | local winner = nil | |
54 | for i,way in pairs(ways) do | |
55 | if winner~=nil then break end | |
56 | pcall(function() | |
57 | local v1,v2,v3 = plots[way.n1], plots[way.n2], plots[way.n3] | |
58 | firstpart=v1 | |
59 | lastpart=v3 | |
60 | if (v1 and v2 and v3) then | |
61 | if (v1['plrval'].Value == X and v2['plrval'].Value == X and v3['plrval'].Value == X) then | |
62 | winner = X | |
63 | currentwinner=0 | |
64 | elseif (v1['plrval'].Value == O and v2['plrval'].Value == O and v3['plrval'].Value == O) then | |
65 | winner = O | |
66 | currentwinner=1 | |
67 | end | |
68 | end | |
69 | end) | |
70 | end | |
71 | if winner~=nil then | |
72 | local distance = (firstpart.CFrame.p+Vector3.new(0,.5,0)-lastpart.CFrame.p+Vector3.new(0,.5,0)).magnitude | |
73 | curline=Instance.new("Part",firstpart.Parent) | |
74 | curline.Anchored=true | |
75 | if currentwinner==0 then | |
76 | curline.Color=Color3.new(1,0,0) | |
77 | else | |
78 | curline.Color=Color3.new(0,0,1) | |
79 | end | |
80 | curline.Material="Neon" | |
81 | curline.Size=Vector3.new(.1,.5,.5) | |
82 | curline.CFrame=CFrame.new(lastpart.CFrame.p+Vector3.new(0,.5,0),firstpart.CFrame.p+Vector3.new(0,.5,0))*CFrame.Angles(0,math.rad(90),0) | |
83 | ||
84 | --sine | |
85 | spawn(function() | |
86 | for i=1,#parts do | |
87 | if parts[i]==nil then return end | |
88 | if parts[i]:IsA("BasePart") then | |
89 | spawn(function() | |
90 | local currentpart=parts[i] | |
91 | local pos=currentpart.Position | |
92 | for z=1,100 do | |
93 | local delta=z/100 | |
94 | pcall(function() | |
95 | currentpart.Position=pos+Vector3.new(0,1*math.sin(z*0.25),0) | |
96 | wait() | |
97 | end) | |
98 | end | |
99 | for z=1,20 do | |
100 | local delta=z/20 | |
101 | pcall(function() | |
102 | currentpart.Position=p.Position:lerp(pos,delta) | |
103 | wait() | |
104 | end) | |
105 | end | |
106 | currentpart.Position=pos | |
107 | coroutine.yield() | |
108 | end) | |
109 | end | |
110 | wait(.1) | |
111 | end | |
112 | coroutine.yield() | |
113 | end) | |
114 | ||
115 | --sine | |
116 | spawn(function() | |
117 | for i=1,150 do | |
118 | pcall(function() | |
119 | local delta=i/110 | |
120 | curline.Size = curline.Size:lerp(Vector3.new(distance+2,.5,.5),delta) --/ 2 | |
121 | curline.CFrame = curline.CFrame:lerp(CFrame.new(firstpart.CFrame.p+Vector3.new(0,.5,0),lastpart.CFrame.p+Vector3.new(0,.5,0)) *CFrame.new(0, 0, -distance/2)*CFrame.Angles(math.rad(0),math.rad(90),math.rad(0)),delta) | |
122 | wait() | |
123 | end) | |
124 | end | |
125 | coroutine.yield() | |
126 | end) | |
127 | end | |
128 | return winner | |
129 | end | |
130 | ||
131 | function set_turn(plr) | |
132 | local cid = tid | |
133 | local name = plr.Name | |
134 | turn = plr | |
135 | spawn(function() | |
136 | local _time = turn_time | |
137 | repeat | |
138 | _time -= 1; | |
139 | wait(1); | |
140 | if playing then | |
141 | update(name .. "'s Turn. (" .. _time .. ')') | |
142 | end | |
143 | until 0 >= _time or tid ~= cid or not playing | |
144 | if not playing then | |
145 | return | |
146 | - | until 0 >= _time or tid ~= cid or not playing or not X or not O |
146 | + | |
147 | - | if X and not O then |
147 | + | |
148 | - | get_result(X) |
148 | + | |
149 | set_turn(O) | |
150 | - | elseif O and not X then |
150 | + | |
151 | - | get_result(O) |
151 | + | |
152 | end | |
153 | end | |
154 | end) | |
155 | end | |
156 | ||
157 | function make(p1,p2,p3) | |
158 | board = Instance.new("Model") | |
159 | board.Parent = partfolder | |
160 | local total = 0 | |
161 | parts = {} | |
162 | for column = 1,multiplier do | |
163 | for row = 1,multiplier do | |
164 | local part = Instance.new("Part") | |
165 | part.Color = Color3.new(1,1,1) | |
166 | part.Anchored = true | |
167 | part.CanCollide = true | |
168 | part.Locked = true | |
169 | part.Material = Enum.Material.SmoothPlastic | |
170 | part.Size = Vector3.new(s,1,s) | |
171 | part.CFrame = CFrame.new(p1+((s+line_size*2)*row),p2,p3+((s+line_size*2)*column))*CFrame.Angles(0,math.rad(90),0) | |
172 | part.Name = tostring(((column-1)*multiplier)+row) | |
173 | part.Parent = board | |
174 | table.insert(parts,part) | |
175 | local grid = Instance.new("SelectionBox") | |
176 | grid.LineThickness = line_size | |
177 | grid.Color3 = Color3.new(0,0,0) | |
178 | grid.Adornee = part | |
179 | grid.Parent = part | |
180 | local plrval = Instance.new("ObjectValue",part) | |
181 | plrval.Name = "plrval" | |
182 | local SurfaceGui0 = Instance.new("SurfaceGui") | |
183 | local TextBox1 = Instance.new("TextBox") | |
184 | SurfaceGui0.Parent = part | |
185 | SurfaceGui0.LightInfluence = 1 | |
186 | SurfaceGui0.Face = Enum.NormalId.Top | |
187 | SurfaceGui0.PixelsPerStud = 50 | |
188 | SurfaceGui0.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud | |
189 | SurfaceGui0.ClipsDescendants = true | |
190 | SurfaceGui0.ZIndexBehavior = Enum.ZIndexBehavior.Sibling | |
191 | TextBox1.Parent = SurfaceGui0 | |
192 | TextBox1.Size = UDim2.new(1, 0, 1, 0) | |
193 | TextBox1.BackgroundTransparency = 1 | |
194 | TextBox1.Text = "" | |
195 | TextBox1.TextScaled = true | |
196 | local clicker = Instance.new("ClickDetector") | |
197 | clicker.MaxActivationDistance = 15 | |
198 | clicker.Parent = part | |
199 | local clicked = false | |
200 | clicker.MouseClick:Connect(function(plr) | |
201 | if plr and turn == plr and not clicked and playing then | |
202 | clicked = true | |
203 | tid += 1 | |
204 | local s = Instance.new("Sound") | |
205 | s.SoundId = 'rbxassetid://452267918' | |
206 | s.Volume = 1 | |
207 | s.Parent = part | |
208 | s:Play() | |
209 | if plr == X and turn == X then | |
210 | clicker:Destroy() | |
211 | TextBox1.Text = "X" | |
212 | plrval.Value = X | |
213 | set_turn(O) | |
214 | game:GetService("TweenService"):Create(grid,TweenInfo.new(1),{Color3 = Color3.new(1,0,0)}):Play() | |
215 | elseif plr == O and turn == O then | |
216 | clicker:Destroy() | |
217 | TextBox1.Text = "O" | |
218 | plrval.Value = O | |
219 | set_turn(X) | |
220 | game:GetService("TweenService"):Create(grid,TweenInfo.new(1),{Color3 = Color3.new(0,0,1)}):Play() | |
221 | end | |
222 | total += 1 | |
223 | plots[tonumber(part.Name)] = part | |
224 | local winner = check() | |
225 | if winner then | |
226 | playing = false | |
227 | local song = win_songs[math.random(1,#win_songs)] | |
228 | local win_s = Instance.new("Sound") | |
229 | win_s.SoundId = 'rbxassetid://' .. song[1] | |
230 | win_s.PlaybackSpeed = song[2] | |
231 | win_s.TimePosition = song[3] | |
232 | win_s.Volume = 3 | |
233 | win_s.Parent = part | |
234 | - | get_result(winner) |
234 | + | win_s:Resume() |
235 | for i = 1,win_time-1 do | |
236 | update(winner.Name .. " Won! (" .. tostring(win_time-i) .. ')') | |
237 | wait(1) | |
238 | end | |
239 | win_s:Destroy() | |
240 | start() | |
241 | - | function get_result(winner) |
241 | + | elseif total >= multiplier^2 then |
242 | - | if winner then |
242 | + | playing = false |
243 | - | playing = false |
243 | + | spawn(function() |
244 | - | local song = win_songs[math.random(1,#win_songs)] |
244 | + | for i=1,#parts do |
245 | - | local win_s = Instance.new("Sound") |
245 | + | local currentpart=parts[i] |
246 | - | win_s.SoundId = 'rbxassetid://' .. song[1] |
246 | + | spawn(function() |
247 | - | win_s.PlaybackSpeed = song[2] |
247 | + | local pos=currentpart.Position |
248 | - | win_s.TimePosition = song[3] |
248 | + | for z=1,100 do |
249 | - | win_s.Volume = 3 |
249 | + | local delta=z/100 |
250 | - | win_s.Parent = stand.PrimaryPart |
250 | + | pcall(function() |
251 | - | win_s:Resume() |
251 | + | currentpart.Size=currentpart.Size:lerp(Vector3.new(.1,.1,.1),delta) |
252 | - | for i = 1,win_time-1 do |
252 | + | currentpart.Rotation=currentpart.Rotation:lerp(Vector3.new(0,math.rad(90),math.rad(180)),delta) |
253 | - | update(winner.Name .. " Won! (" .. tostring(win_time-i) .. ')') |
253 | + | wait() |
254 | - | wait(1) |
254 | + | end) |
255 | end | |
256 | - | win_s:Destroy() |
256 | + | end) |
257 | - | start() |
257 | + | end |
258 | - | elseif total >= multiplier^2 then |
258 | + | |
259 | - | playing = false |
259 | + | for i = 1,win_time-1 do |
260 | update("Draw. (" .. tostring(win_time-i) .. ')') | |
261 | wait(1) | |
262 | - | local currentpart=parts[i] |
262 | + | |
263 | - | spawn(function() |
263 | + | start() |
264 | - | local pos=currentpart.Position |
264 | + | |
265 | - | for z=1,100 do |
265 | + | |
266 | - | local delta=z/100 |
266 | + | |
267 | - | pcall(function() |
267 | + | |
268 | - | currentpart.Size=currentpart.Size:lerp(Vector3.new(.1,.1,.1),delta) |
268 | + | |
269 | - | currentpart.Rotation=currentpart.Rotation:lerp(Vector3.new(0,math.rad(90),math.rad(180)),delta) |
269 | + | |
270 | - | wait() |
270 | + | |
271 | function prepare() | |
272 | stand = Instance.new("Model") | |
273 | local Part1 = Instance.new("Part") | |
274 | local Part2 = Instance.new("Part") | |
275 | local SurfaceGui3 = Instance.new("SurfaceGui") | |
276 | - | for i = 1,win_time-1 do |
276 | + | |
277 | - | update("Draw. (" .. tostring(win_time-i) .. ')') |
277 | + | |
278 | - | wait(1) |
278 | + | |
279 | local TextBox7 = Instance.new("TextBox") | |
280 | - | start() |
280 | + | |
281 | local SurfaceGui9 = Instance.new("SurfaceGui") | |
282 | maintext = Instance.new("TextBox") | |
283 | stand.Name = "choose" | |
284 | stand.Parent = partfolder | |
285 | Part1.Parent = stand | |
286 | Part1.CFrame = CFrame.new(-30.9599934, 4.33500385, 89.4899979, 1, 0, 0, 0, 1, 0, 0, 0, 1) | |
287 | Part1.Position = Vector3.new(-30.9599934, 4.33500385, 89.4899979) | |
288 | Part1.Color = Color3.new(0.0156863, 0.686275, 0.92549) | |
289 | Part1.Size = Vector3.new(17.0199986, 8.61000061, 2) | |
290 | Part1.Anchored = true | |
291 | Part1.BottomSurface = Enum.SurfaceType.Smooth | |
292 | Part1.BrickColor = BrickColor.new("Cyan") | |
293 | Part1.Locked = true | |
294 | Part1.TopSurface = Enum.SurfaceType.Smooth | |
295 | Part1.brickColor = BrickColor.new("Cyan") | |
296 | Part2.Name = "X" | |
297 | - | stand.PrimaryPart = Part1 |
297 | + | |
298 | Part2.CFrame = CFrame.new(-35.9699898, 2.83500385, 89.9899979, 1, 0, 0, 0, 1, 0, 0, 0, 1) | |
299 | Part2.Position = Vector3.new(-35.9699898, 2.83500385, 89.9899979) | |
300 | Part2.Color = Color3.new(0.686275, 0.866667, 1) | |
301 | Part2.Size = Vector3.new(5, 3.61000061, 2) | |
302 | Part2.Anchored = true | |
303 | Part2.BottomSurface = Enum.SurfaceType.Smooth | |
304 | Part2.BrickColor = BrickColor.new("Pastel light blue") | |
305 | Part2.Locked = true | |
306 | Part2.TopSurface = Enum.SurfaceType.Smooth | |
307 | Part2.brickColor = BrickColor.new("Pastel light blue") | |
308 | SurfaceGui3.Parent = Part2 | |
309 | SurfaceGui3.LightInfluence = 1 | |
310 | SurfaceGui3.Face = Enum.NormalId.Back | |
311 | SurfaceGui3.ClipsDescendants = true | |
312 | SurfaceGui3.ZIndexBehavior = Enum.ZIndexBehavior.Sibling | |
313 | SurfaceGui3.PixelsPerStud = 50 | |
314 | SurfaceGui3.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud | |
315 | TextBox4.Parent = SurfaceGui3 | |
316 | TextBox4.Size = UDim2.new(1, 0, 1, 0) | |
317 | TextBox4.BackgroundColor = BrickColor.new("Institutional white") | |
318 | TextBox4.BackgroundColor3 = Color3.new(1, 1, 1) | |
319 | TextBox4.BackgroundTransparency = 1 | |
320 | TextBox4.Font = Enum.Font.SourceSans | |
321 | TextBox4.FontSize = Enum.FontSize.Size14 | |
322 | TextBox4.Text = "X" | |
323 | TextBox4.TextColor = BrickColor.new("Really black") | |
324 | TextBox4.TextColor3 = Color3.new(0, 0, 0) | |
325 | TextBox4.TextScaled = true | |
326 | TextBox4.TextSize = 14 | |
327 | TextBox4.TextWrap = true | |
328 | TextBox4.TextWrapped = true | |
329 | Part5.Name = "O" | |
330 | Part5.Parent = stand | |
331 | Part5.CFrame = CFrame.new(-25.9699898, 2.83500385, 89.9899979, 1, 0, 0, 0, 1, 0, 0, 0, 1) | |
332 | Part5.Position = Vector3.new(-25.9699898, 2.83500385, 89.9899979) | |
333 | Part5.Color = Color3.new(0.686275, 0.866667, 1) | |
334 | Part5.Size = Vector3.new(5, 3.61000061, 2) | |
335 | Part5.Anchored = true | |
336 | Part5.BottomSurface = Enum.SurfaceType.Smooth | |
337 | Part5.BrickColor = BrickColor.new("Pastel light blue") | |
338 | Part5.Locked = true | |
339 | Part5.TopSurface = Enum.SurfaceType.Smooth | |
340 | Part5.brickColor = BrickColor.new("Pastel light blue") | |
341 | SurfaceGui6.Parent = Part5 | |
342 | SurfaceGui6.LightInfluence = 1 | |
343 | SurfaceGui6.Face = Enum.NormalId.Back | |
344 | SurfaceGui6.ClipsDescendants = true | |
345 | SurfaceGui6.ZIndexBehavior = Enum.ZIndexBehavior.Sibling | |
346 | SurfaceGui6.PixelsPerStud = 50 | |
347 | SurfaceGui6.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud | |
348 | TextBox7.Parent = SurfaceGui6 | |
349 | TextBox7.Size = UDim2.new(1, 0, 1, 0) | |
350 | TextBox7.BackgroundColor = BrickColor.new("Institutional white") | |
351 | TextBox7.BackgroundColor3 = Color3.new(1, 1, 1) | |
352 | TextBox7.BackgroundTransparency = 1 | |
353 | TextBox7.Font = Enum.Font.SourceSans | |
354 | TextBox7.FontSize = Enum.FontSize.Size14 | |
355 | TextBox7.Text = "O" | |
356 | TextBox7.TextColor = BrickColor.new("Really black") | |
357 | TextBox7.TextColor3 = Color3.new(0, 0, 0) | |
358 | TextBox7.TextScaled = true | |
359 | TextBox7.TextSize = 14 | |
360 | TextBox7.TextWrap = true | |
361 | TextBox7.TextWrapped = true | |
362 | Part8.Parent = stand | |
363 | Part8.CFrame = CFrame.new(-30.9699936, 6.79000378, 89.4899902, 1, 0, 0, 0, 1, 0, 0, 0, 1) | |
364 | Part8.Position = Vector3.new(-30.9699936, 6.79000378, 89.4899902) | |
365 | Part8.Color = Color3.new(0.686275, 0.866667, 1) | |
366 | Part8.Transparency = 1 | |
367 | Part8.Size = Vector3.new(15, 3.70000076, 2) | |
368 | Part8.Anchored = true | |
369 | Part8.BottomSurface = Enum.SurfaceType.Smooth | |
370 | Part8.BrickColor = BrickColor.new("Pastel light blue") | |
371 | Part8.CanCollide = false | |
372 | Part8.Locked = true | |
373 | Part8.TopSurface = Enum.SurfaceType.Smooth | |
374 | Part8.brickColor = BrickColor.new("Pastel light blue") | |
375 | SurfaceGui9.Parent = Part8 | |
376 | SurfaceGui9.LightInfluence = 1 | |
377 | SurfaceGui9.Face = Enum.NormalId.Back | |
378 | SurfaceGui9.ClipsDescendants = true | |
379 | SurfaceGui9.ZIndexBehavior = Enum.ZIndexBehavior.Sibling | |
380 | SurfaceGui9.PixelsPerStud = 50 | |
381 | SurfaceGui9.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud | |
382 | maintext.Parent = SurfaceGui9 | |
383 | maintext.Size = UDim2.new(1, 0, 1, 0) | |
384 | maintext.BackgroundColor = BrickColor.new("Institutional white") | |
385 | maintext.BackgroundColor3 = Color3.new(1, 1, 1) | |
386 | maintext.BackgroundTransparency = 1 | |
387 | maintext.Font = Enum.Font.SourceSans | |
388 | maintext.FontSize = Enum.FontSize.Size14 | |
389 | maintext.Text = ([[Tic Tac Toe | |
390 | Choose a player!]]) | |
391 | maintext.TextColor = BrickColor.new("Really black") | |
392 | maintext.TextColor3 = Color3.new(0, 0, 0) | |
393 | maintext.TextScaled = true | |
394 | maintext.TextSize = 14 | |
395 | maintext.TextWrap = true | |
396 | maintext.TextWrapped = true | |
397 | local clickX,clickO = Instance.new("ClickDetector"),Instance.new("ClickDetector") | |
398 | clickX.Parent = Part2 | |
399 | clickO.Parent = Part5 | |
400 | clickX.MaxActivationDistance = 20 | |
401 | clickO.MaxActivationDistance = 20 | |
402 | clickX.MouseClick:Connect(function(plr) | |
403 | - | maintext.Text = ([[ |
403 | + | if plr and plr ~= (O or X) then else return end |
404 | - | Tic Tac Toe |
404 | + | |
405 | - | Choose a player! |
405 | + | |
406 | - | ]]) |
406 | + | |
407 | end) | |
408 | clickO.MouseClick:Connect(function(plr) | |
409 | if plr and plr ~= (O or X) then else return end | |
410 | O = plr | |
411 | TextBox7.Text = plr.Name .. "(O) Selected!" | |
412 | clickO:Destroy() | |
413 | - | clickX,clickO = Instance.new("ClickDetector"),Instance.new("ClickDetector") |
413 | + | |
414 | repeat wait(1) until (X and O) | |
415 | for i = 1,start_time do | |
416 | update("Starting in " .. tostring(start_time-i) .. "..") | |
417 | wait(1) | |
418 | end | |
419 | - | if plr and (plr ~= O and plr ~= X) and not X then |
419 | + | |
420 | - | elseif plr and plr == X then |
420 | + | |
421 | - | X = nil |
421 | + | |
422 | - | TextBox4.Text = "X" |
422 | + | |
423 | function update(txt) | |
424 | - | else |
424 | + | |
425 | maintext.Text = txt | |
426 | end | |
427 | end | |
428 | ||
429 | function start() | |
430 | partfolder:ClearAllChildren() | |
431 | - | if plr and (plr ~= O and plr ~= X) and not O then |
431 | + | |
432 | - | elseif plr and plr == O then |
432 | + | |
433 | - | O = nil |
433 | + | |
434 | - | TextBox7.Text = "O" |
434 | + | |
435 | O = nil | |
436 | - | else |
436 | + | |
437 | prepare() | |
438 | make(-37, 0.5, 93) | |
439 | end | |
440 | ||
441 | start() |