View difference between Paste ID: cWzz7tQm and nprdvH5Y
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()