Run it
Copy the script and paste it into your executor.
Players = :()
RunService = :()
UserInputService = :()
Player = Players.LocalPlayer
PlayerGui = Player:()
(class, props)
obj = .(class)
props
k,v (props)
obj[k] = v
obj
math_random = .random
.(() % )
screenGui = (, {Name=, ResetOnSpawn=, Parent=PlayerGui, ZIndexBehavior=.ZIndexBehavior.Sibling})
mainFrame = (, {
Parent = screenGui,
Name = ,
Size = .(,,,),
Position = .(,-,,-),
BackgroundColor3 = .(,,),
BorderSizePixel = ,
})
mainFrame.Active =
mainFrame.Draggable =
(, {Parent = mainFrame, CornerRadius = .(,)})
header = (, {
Parent = mainFrame,
Size = .(,,,),
Position = .(,,,),
BackgroundTransparency = ,
})
headerLabel = (, {
Parent = header,
Size = .(,-,,),
Position = .(,,,),
BackgroundTransparency = ,
Text = ,
TextColor3 = .(,,),
Font = .Font.GothamBold,
TextSize = ,
TextXAlignment = .TextXAlignment.Left,
TextYAlignment = .TextYAlignment.Center
})
headerClose = (, {
Parent = header,
Size = .(,,,),
Position = .(,-,,),
BackgroundColor3 = .(,,),
BorderSizePixel = ,
Text = ,
TextColor3 = .(,,),
Font = .Font.GothamBold,
TextSize =
})
(, {Parent = headerClose, CornerRadius = .(,)})
headerClose.MouseButton1Click:(() screenGui:() )
content = (, {
Parent = mainFrame,
Size = .(,-,,-),
Position = .(,,,),
BackgroundTransparency = ,
})
scroll = (, {
Parent = content,
Size = .(,,,),
Position = .(,,,),
CanvasSize = .(,,,),
ScrollingDirection = .ScrollingDirection.Y,
ScrollBarThickness = ,
BackgroundTransparency = ,
BorderSizePixel =
})
scroll.AutomaticCanvasSize = .AutomaticSize.Y
bigLabel = (, {
Parent = scroll,
Size = .(, -, , ),
Position = .(, , , ),
BackgroundTransparency = ,
Text = ,
Font = .Font.GothamBold,
TextSize = ,
TextWrapped = ,
TextColor3 = .(,,),
RichText = ,
TextXAlignment = .TextXAlignment.Left,
TextYAlignment = .TextYAlignment.Top,
})
bigLabel:():(()
h = .(, bigLabel.TextBounds.Y + )
bigLabel.Size = .(, -, , h)
inputBox inputBox.Parent == scroll
inputBox.Size = bigLabel.Size
inputBox.Position = bigLabel.Position
scroll.CanvasSize = .(, , , h + )
)
bottomBar = (, {
Parent = mainFrame,
Size = .(,-,,),
Position = .(,,,-),
BackgroundTransparency =
})
inputBox = (, {
Parent = scroll,
Size = bigLabel.Size,
Position = bigLabel.Position,
BackgroundColor3 = .(,,),
Text = ,
Font = .Font.Gotham,
TextSize = ,
TextColor3 = .(,,),
PlaceholderText = ,
ClearTextOnFocus = ,
BorderSizePixel = ,
})
inputBox.BackgroundTransparency =
inputBox.PlaceholderColor3 = .(,,)
inputBox.TextEditable =
inputBox.ZIndex = bigLabel.ZIndex +
controls = (, {
Parent = bottomBar,
Size = .(,,,),
Position = .(,,,),
BackgroundTransparency =
})
modeButton = (, {
Parent = controls,
Size = .(,,,),
Position = .(,,,),
BackgroundColor3 = .(,,),
Text = ,
TextColor3 = .(,,),
Font = .Font.GothamBold,
TextSize = ,
BorderSizePixel =
})
(, {Parent = modeButton, CornerRadius = .(,)})
resetBtn = (, {
Parent = controls,
Size = .(,,,),
Position = .(,,,),
BackgroundColor3 = .(,,),
Text = ,
TextColor3 = .(,,),
Font = .Font.Gotham,
TextSize = ,
BorderSizePixel =
})
(, {Parent = resetBtn, CornerRadius = .(,)})
dropdown = (, {
Parent = mainFrame,
Size = .(,,,),
Position = .(,-,,),
BackgroundColor3 = .(,,),
BorderSizePixel = ,
ClipsDescendants =
})
(, {Parent = dropdown, CornerRadius = .(,)})
list = (, {Parent = dropdown, Padding = .(,), FillDirection = .FillDirection.Vertical})
list.HorizontalAlignment = .HorizontalAlignment.Center
list.SortOrder = .SortOrder.LayoutOrder
infoBar = (, {
Parent = mainFrame,
Size = .(,-,,),
Position = .(,,,-),
BackgroundTransparency =
})
timerLabel = (, {
Parent = infoBar,
Size = .(,,,),
Position = .(,,,),
BackgroundTransparency = ,
Text = ,
TextXAlignment = .TextXAlignment.Left,
TextColor3 = .(,,),
Font = .Font.Gotham,
TextSize =
})
wpmLabel = (, {
Parent = infoBar,
Size = .(,,,),
Position = .(,,,),
BackgroundTransparency = ,
Text = ,
TextXAlignment = .TextXAlignment.Right,
TextColor3 = .(,,),
Font = .Font.GothamBold,
TextSize =
})
resultLabel = (, {
Parent = mainFrame,
Size = .(,-,,),
Position = .(,,,-),
BackgroundTransparency = ,
Text = ,
TextColor3 = .(,,),
Font = .Font.GothamBold,
TextSize = ,
TextXAlignment = .TextXAlignment.Left
})
modes = {
Easy = {name = , count = , pool = {}},
Medium = {name = , count = , pool = {}},
Hard = {name = , count = , pool = {}},
Extreme = {name = , count = , pool = {}},
Stenographer = {name = , count = , pool = {}},
}
easyPools = {
,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,,,
,,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,,,
,,,,,,,,,,,,,,
,,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,,
,,,,,,,,,,,,
}
midPools = {
,,,,,,,,,,
,,,,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
}
hardPools = {
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,
}
extremePools = {
,,,,
,,,,
,,,,
,,,,
,,,,
,,,
}
stenoPools = {
,,,
,,,
,,,
,,,
,,,
,,
}
modes.Easy.pool = easyPools
modes.Medium.pool = {}
_,v (easyPools) .(modes.Medium.pool, v)
_,v (midPools) .(modes.Medium.pool, v)
modes.Hard.pool = {}
_,v (hardPools) .(modes.Hard.pool, v)
_,v (midPools) .(modes.Hard.pool, v)
modes.Extreme.pool = {}
_,v (extremePools) .(modes.Extreme.pool, v)
_,v (hardPools) .(modes.Extreme.pool, v)
modes.Stenographer.pool = {}
_,v (stenoPools) .(modes.Stenographer.pool, v)
_,v (extremePools) .(modes.Stenographer.pool, v)
currentModeKey =
modeButton.Text = modes.Easy.name
(t)
i = #t, , -
j = (i)
t[i], t[j] = t[j], t[i]
(pool, count)
tmp = {}
_,w (pool) tmp[#tmp+] = w
(tmp)
out = {}
i=, .(count, #tmp) out[#out+] = tmp[i]
out
(ch)
ch ==
ch ==
ch ==
ch
(fullText, typed)
typed = typed
result = {}
fullLen = #fullText
typedLen = #typed
i = , fullLen
ch = .(fullText, i, i)
safe = (ch)
i <= typedLen
tch = .(typed, i, i)
tch == ch
result[#result+] = ..safe..
result[#result+] = ..safe..
result[#result+] = ..safe..
.(result)
sequence = {}
sequenceText =
startTime =
finished =
lastTyped =
correctCharsAtEnd =
(modeKey)
cfg = modes[modeKey]
picked = (cfg.pool, cfg.count)
sequence = picked
sequenceText = .(picked, )
(keepMode)
startTime =
finished =
lastTyped =
correctCharsAtEnd =
inputBox.Text =
timerLabel.Text =
wpmLabel.Text =
resultLabel.Text =
keepMode
(currentModeKey)
bigLabel.RichText =
bigLabel.Text = (sequenceText, )
inputBox.Size = bigLabel.Size
inputBox.Position = bigLabel.Position
(full, typed)
total = #full
typedLen = #typed
correct =
i=, .(total, typedLen)
.(full, i, i) == .(typed, i, i)
correct = correct +
correct, typedLen - correct, total
(secs)
ms = .((secs - .(secs)) * )
s = .(secs % )
m = .(secs / )
.(, m, s, ms)
()
startTime finished
now = () - startTime
timerLabel.Text = .. (now)
correct, incorrect, total = (sequenceText, inputBox.Text)
minutes = .(now / , /)
wpm = (correct / ) / minutes
acc = (correct / .(#inputBox.Text,)) *
wpmLabel.Text = .(, wpm, acc)
()
finished
finished =
totalTime = () - (startTime ())
correct, incorrect, total = (sequenceText, inputBox.Text)
finalWPM = (correct / ) / .((totalTime / ), /)
finalAcc = (correct / .(#inputBox.Text,)) *
timerLabel.Text = .. (totalTime)
wpmLabel.Text = .(, finalWPM, finalAcc)
resultLabel.Text = .(, (totalTime), finalWPM, finalAcc, correct, total)
correctCharsAtEnd = correct
inputBox:():(()
finished
sequenceText sequenceText ==
startTime == #inputBox.Text >
startTime = ()
#inputBox.Text > #sequenceText
inputBox.Text = .(inputBox.Text, , #sequenceText)
bigLabel.Text = (sequenceText, inputBox.Text)
correct, incorrect, total = (sequenceText, inputBox.Text)
#inputBox.Text >= #sequenceText
()
)
RunService.Heartbeat:(()
()
)
modeButton.MouseButton1Click:(()
dropdown.Size.Y.Offset ==
count =
_ (modes) count = count +
h = .(count * + , , )
dropdown:(.(,,,h), .EasingDirection.Out, .EasingStyle.Quad, , )
dropdown:(.(,,,), .EasingDirection.Out, .EasingStyle.Quad, , )
)
(key, def)
b = (, {
Parent = dropdown,
Size = .(,-,,),
BackgroundColor3 = .(,,),
BorderSizePixel = ,
Text = def.name,
TextColor3 = .(,,),
Font = .Font.Gotham,
TextSize =
})
(, {Parent = b, CornerRadius = .(,)})
b.MouseButton1Click:(()
currentModeKey = key
modeButton.Text = def.name
dropdown:(.(,,,), .EasingDirection.Out, .EasingStyle.Quad, , )
(key)
()
)
k,v (modes)
(k,v)
resetBtn.MouseButton1Click:(()
()
)
()
(currentModeKey)
()
()
(currentModeKey)
()
()
headerLabel.Text =
inputBox.Focused:(()
h = mainFrame.AbsoluteSize.Y
screenH = .CurrentCamera .CurrentCamera.ViewportSize.Y
UserInputService.TouchEnabled
newY = .( * screenH, , screenH/)
mainFrame.Position = .(, -mainFrame.Size.X.Offset/, , )
()
scroll.CanvasPosition = .(, .(, bigLabel.AbsoluteSize.Y - (mainFrame.AbsoluteSize.Y * )))
)
inputBox.FocusLost:((enter)
enter
finished #inputBox.Text >= #sequenceText
()
UserInputService.TouchEnabled
mainFrame.Position = .(,-mainFrame.Size.X.Offset/,,-)
)
UserInputService.InputBegan:((input, gameProcessed)
gameProcessed
input.KeyCode == .KeyCode.Return
finished
()
#inputBox.Text >= #sequenceText
()
)
headerClose.MouseButton1Click:(()
screenGui:()
)Not Good for mobile.

Universal