--# selene: allow(unused_variable)
--!strict
type void = nil
local void = nil
--[[@globals]]
local RepStor = game:GetService('ReplicatedStorage')
--local BFM = require(game.ReplicatedStorage.BasicFunctionModule)
local framer = script.Parent.Framer
local speechText = framer.SpeechText
local decisions = framer.Decisions
--[[@class]]
local main = {} do
main.__index = {}
function main:DisplayText(
text: string,
options: {
[number]: {
["Text"]: string,
["KeyCode"]: Enum.KeyCode,
["ActionText"]: string
}
}?
)
text = tostring(text); assert(text ~= nil, "Impossible text string");
local guiObject = speechText
local function typeWrite(delayBetweenChars: number) -- from `create.roblox.com/docs`
guiObject.Visible = true
guiObject.AutoLocalize = false
local displayText = text
-- Replace line break tags so grapheme loop will not miss those characters
displayText = displayText:gsub("<br%s*/>", "\n")
-- Remove RichText tags since char-by-char animation will break the tags
displayText = displayText:gsub("<[^<>]->", "")
-- Set translated/modified text on parent
guiObject.Text = displayText
local index = 0
local function calculateDelay(character)
return (character:match("%p") and delayBetweenChars * 2) or delayBetweenChars
end
for first, last in utf8.graphemes(displayText) do
index += 1
guiObject.MaxVisibleGraphemes = index
task.wait(
calculateDelay(displayText:sub(last, last))
)
end
end
--typeWrite(0.2)
--assert(options, "No options given")
if not options or type(options) ~= "table" then
return
end
local function clearTextButtons()
for _, child in (decisions:GetChildren()) do
if child:IsA('TextButton') then
child:Destroy()
end -- <- Line 70
end
end
clearTextButtons()
for i in (options) do
local cloneBtn = script.DecisionA:Clone()
cloneBtn.Name = options[i].ActionText
local _success, keyCodeName = pcall(string.char, options[i].KeyCode.Value)
print(_success)
if not _success then
keyCodeName = options[i].KeyCode.Name
--RightControl -> RightCtrl
local dir = keyCodeName:match("(.-)Control$")
if dir then
keyCodeName = dir.. "Ctrl"
end
--ButtonX -> X
local gPadButton = keyCodeName:match('^Button(.-)')
if gPadButton then
keyCodeName = gPadButton
end
else
keyCodeName = keyCodeName:upper()
end
cloneBtn.KeyCodeLabel.Text, cloneBtn.ActionLabel.Text = `[{keyCodeName}]`, options[i].ActionText
cloneBtn.Parent = decisions
cloneBtn.LayoutOrder = i
cloneBtn.Activated:Once(function()
RepStor.remotes.DecisionEvent:FireServer(i)
clearTextButtons()
end)
end
end
end
return main;
string.char() is a Lua function that converts a list of integers to their corresponding characters in the ASCII table.
For example:
print(string.char(65)) -- Output: A
print(string.char(97)) -- Output: a
In this example, string.char(65) returns the character “A”, and string.char(97) returns the character “a”, as these are the ASCII representations of those numbers.
print("\65") -- Output: A
print("\97") -- Output: a
I put this in a pcall because it might not have an ascii representation.
I believe this is because you have a debugger attached with catch all exceptions instead of only ones that are not handled, try stepping over and see if you can run any other code
you have a debugger attached bro, you are debugging the code using the studio debugger that’s why you have that error UI and you go to your script and everything stops.
If you didn’t you would just get console output, show me your top bar of studio when you are inside of the script when erroring
Verbatim, I don’t have any debugger of sorts that is enabled…
The debugger options are greyed out so I can’t use it (don’t tell me how to use the debugger).
Output:
21:59:51.091 > require(game.StarterGui.NPC_Dialogue.ModuleScript):DisplayText("Bruh", {[1] = {["ActionText"] = 'Interact', ["KeyCode"] = Enum.KeyCode.N}, [2] = {["ActionText"] = "BRUH?", ["KeyCode"] = Enum.KeyCode.ButtonA}}) - Studio
21:59:51.092 true - Studio
21:59:51.093 invalid argument #1 to 'char' (invalid value) - Studio
21:59:51.093 Stack Begin - Studio
21:59:51.093 Script 'StarterGui.NPC_Dialogue.ModuleScript', Line 79 - function DisplayText - Studio
21:59:51.093 Script 'require(game.StarterGui.NPC_Dialogue.ModuleScript):DisplayText("Bruh", {[1] = {["ActionText"] = 'Interact', ["KeyCode"] = Enum.KeyCode.N}, [2] = {["ActionText"] = "BRUH?", ["KeyCode"] = Enum.KeyCode.ButtonA}})', Line 1 - Studio
21:59:51.093 Stack End - Studio
Instead of relying on pcall to catch the error, you could instead write your own function to check if the number is greater than 9, in which case you’d use the name.
I don’t think this works when I run it in the Command Bar.
But when I do it on play test, it doesn’t error anything and everything works fine.
Updated code:
local _success, keyCodeName
local function asciiRepresent()
_success, keyCodeName = pcall(string.char, option.KeyCode.Value)
if not _success then
keyCodeName = option.KeyCode.Name
--RightControl -> RightCtrl
local dir = keyCodeName:match("(.-)Control$")
if dir then
keyCodeName = dir.. " Ctrl"
return
end
--ButtonX -> X
local gPadButton = keyCodeName:match('^Button(.+)')
if gPadButton then
keyCodeName = gPadButton
return
end
else
keyCodeName = (`{keyCodeName}`):upper()
end
end
asciiRepresent()
print(keyCodeName)
Output:
22:56:55.604 N - Server - ModuleScript:105
22:56:55.604 A - Server - ModuleScript:105
-----Current Solution: don't run it in the Command Bar