2020-12-06 09:42:32 -05:00
|
|
|
--[[ Character Sheet Template by: MrStump
|
|
|
|
|
|
|
|
You can set up your own character sheet if you follow these steps.
|
|
|
|
|
|
|
|
Step 1) Change the character sheet image
|
|
|
|
-Right click on the character sheet, click Custom
|
|
|
|
-Replace the image URL with one for your character sheet
|
|
|
|
-Click import, make sure your sheet loads
|
|
|
|
-SAVE THE GAME (the table setup)
|
|
|
|
-LOAD FROM THAT SAVE YOU JUST MADE
|
|
|
|
|
|
|
|
Step 2) Edit script to fit your character sheet
|
|
|
|
-Below you will see some general options, and then the big data table
|
|
|
|
-The data table is what determines how many of which buttons are made
|
|
|
|
-Checkboxes
|
|
|
|
-Counters
|
|
|
|
-Textboxes
|
|
|
|
-By default, there are 3 of each. You can add more or remove entries
|
|
|
|
-If you intend to add/remove, be sure only to add/remove ENTRIES
|
|
|
|
-This is what an entry looks like:
|
|
|
|
{
|
|
|
|
pos = {-0.977,0.1,-0.589},
|
|
|
|
size = 800,
|
|
|
|
state = false
|
|
|
|
},
|
|
|
|
-Deleting the whole thing would remove that specific item on the sheet
|
|
|
|
-Copy and pasting it after another entry would create another
|
|
|
|
-Each entry type has unique data points (pos, size, state, etc)
|
|
|
|
-Do not try to add in your own data points or remove them individually
|
|
|
|
-There is a summary of what each point does at the top of its category
|
|
|
|
|
|
|
|
Step 3) Save and check script changes
|
|
|
|
-Hit Save & Apply in the script window to save your code
|
|
|
|
-You can edit your code as needed and Save+Apply as often as needed
|
|
|
|
-When you are finished, make disableSave = false below then Save+apply
|
|
|
|
-This enables saving, so your sheet will remember whats on it.
|
|
|
|
|
|
|
|
Bonus) Finding/Editing Positions for elements
|
|
|
|
I have included a tool to get positions for buttons in {x,y,z} form
|
|
|
|
Place it where you want the center of your element to be
|
|
|
|
Then copy the table from the notes (lower right of screen)
|
|
|
|
You can highlight it and CTRL+C
|
|
|
|
Paste it into the data table where needed (pos=)
|
|
|
|
If you want to manually tweek the values:
|
|
|
|
{0,0,0} is the center of the character sheet
|
|
|
|
{1,0,0} is right, {-1,0,0} is left
|
|
|
|
{0,0,-1} is up, {0,0,1} is down
|
|
|
|
0.1 for Y is the height off of the page.
|
|
|
|
If it was 0, it would be down inside the model of the sheet
|
|
|
|
|
|
|
|
Begin editing below: ]]
|
|
|
|
|
|
|
|
--Set this to true while editing and false when you have finished
|
|
|
|
disableSave = false
|
|
|
|
--Remember to set this to false once you are done making changes
|
|
|
|
--Then, after you save & apply it, save your game too
|
|
|
|
|
|
|
|
--Color information for button text (r,g,b, values of 0-1)
|
|
|
|
buttonFontColor = {0,0,0}
|
|
|
|
--Color information for button background
|
|
|
|
buttonColor = {1,1,1}
|
|
|
|
--Change scale of button (Avoid changing if possible)
|
|
|
|
buttonScale = {0.1,0.1,0.1}
|
|
|
|
|
|
|
|
--This is the button placement information
|
|
|
|
defaultButtonData = {
|
|
|
|
--Add checkboxes
|
|
|
|
checkbox = {
|
|
|
|
--[[
|
|
|
|
pos = the position (pasted from the helper tool)
|
|
|
|
size = height/width/font_size for checkbox
|
|
|
|
state = default starting value for checkbox (true=checked, false=not)
|
|
|
|
]]
|
|
|
|
--End of checkboxes
|
|
|
|
},
|
|
|
|
--Add counters that have a + and - button
|
|
|
|
counter = {
|
|
|
|
--[[
|
|
|
|
pos = the position (pasted from the helper tool)
|
|
|
|
size = height/width/font_size for counter
|
|
|
|
value = default starting value for counter
|
|
|
|
hideBG = if background of counter is hidden (true=hidden, false=not)
|
|
|
|
]]
|
|
|
|
--1st Player Experience
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-1.080,0.1,-1.010},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 800,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--1st Player Physical Trauma
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-1.270,0.1,-0.790},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 600,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--1st Player Mental Trauma
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-1.000,0.1,-0.790},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 600,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--2nd Player Experience
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-0.251,0.1,-1.010},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 800,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--2nd Player Physical Trauma
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-0.441,0.1,-0.790},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 600,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--2nd Player Mental Trauma
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-0.171,0.1,-0.790},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 600,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--3rd Player Experience
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {0.579,0.1,-1.010},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 800,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--3rd Player Physical Trauma
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {0.389,0.1,-0.790},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 600,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--3rd Player Mental Trauma
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {0.659,0.1,-0.790},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 600,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--4th Player Experience
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {1.407,0.1,-1.010},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 800,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--4th Player Physical Trauma
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {1.217,0.1,-0.790},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 600,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--4th Player Mental Trauma
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {1.487,0.1,-0.790},
|
2020-12-06 09:42:32 -05:00
|
|
|
size = 600,
|
|
|
|
value = 0,
|
|
|
|
hideBG = true
|
|
|
|
},
|
|
|
|
--End of counters
|
|
|
|
},
|
|
|
|
--Add editable text boxes
|
|
|
|
textbox = {
|
|
|
|
--[[
|
|
|
|
pos = the position (pasted from the helper tool)
|
|
|
|
rows = how many lines of text you want for this box
|
|
|
|
width = how wide the text box is
|
|
|
|
font_size = size of text. This and "rows" effect overall height
|
|
|
|
label = what is shown when there is no text. "" = nothing
|
|
|
|
value = text entered into box. "" = nothing
|
|
|
|
alignment = Number to indicate how you want text aligned
|
|
|
|
(1=Automatic, 2=Left, 3=Center, 4=Right, 5=Justified)
|
|
|
|
]]
|
|
|
|
--1st Player Name
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-1.265,0.1,-1.390},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 1,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--1st Player Investigator
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-1.265,0.1,-1.195},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 1,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--1st Player Story Assets/Weaknesses
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-1.265,0.1,-0.420},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 7,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--2nd Player Name
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-0.436,0.1,-1.390},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 1,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--2nd Player Investigator
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-0.436,0.1,-1.195},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 1,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--2nd Player Story Assets/Weaknesses
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-0.436,0.1,-0.420},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 7,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--3rd Player Name
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {0.394,0.1,-1.390},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 1,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--3rd Player Investigator
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {0.394,0.1,-1.195},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 1,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--3rd Player Story Assets/Weaknesses
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {0.394,0.1,-0.420},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 7,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--4th Player Name
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {1.222,0.1,-1.390},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 1,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--4th Player Investigator
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {1.222,0.1,-1.195},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 1,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--4th Player Story Assets/Weaknesses
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {1.222,0.1,-0.420},
|
2020-12-06 09:42:32 -05:00
|
|
|
rows = 7,
|
|
|
|
width = 3800,
|
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--Campaign Notes 1
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {-0.930,0.1,0.930},
|
|
|
|
rows = 27,
|
|
|
|
width = 7800,
|
2020-12-06 09:42:32 -05:00
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--Campaign Notes 2
|
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {0.820,0.1,0.707},
|
|
|
|
rows = 20,
|
|
|
|
width = 7800,
|
2020-12-06 09:42:32 -05:00
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
2021-09-03 13:52:12 -04:00
|
|
|
--Killed and Insane Investigators
|
2020-12-06 09:42:32 -05:00
|
|
|
{
|
2021-09-03 13:52:12 -04:00
|
|
|
pos = {1.010,0.1,1.700},
|
|
|
|
rows = 5,
|
|
|
|
width = 7400,
|
2020-12-06 09:42:32 -05:00
|
|
|
font_size = 300,
|
|
|
|
label = "Empty",
|
|
|
|
value = "",
|
|
|
|
alignment = 2
|
|
|
|
},
|
|
|
|
--End of textboxes
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--Lua beyond this point, I recommend doing something more fun with your life
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--Save function
|
|
|
|
function updateSave()
|
|
|
|
saved_data = JSON.encode(ref_buttonData)
|
|
|
|
if disableSave==true then saved_data="" end
|
|
|
|
self.script_state = saved_data
|
|
|
|
end
|
|
|
|
|
|
|
|
--Startup procedure
|
|
|
|
function onload(saved_data)
|
|
|
|
if disableSave==true then saved_data="" end
|
|
|
|
if saved_data ~= "" then
|
|
|
|
local loaded_data = JSON.decode(saved_data)
|
|
|
|
ref_buttonData = loaded_data
|
|
|
|
else
|
|
|
|
ref_buttonData = defaultButtonData
|
|
|
|
end
|
|
|
|
|
|
|
|
spawnedButtonCount = 0
|
|
|
|
createCheckbox()
|
|
|
|
createCounter()
|
|
|
|
createTextbox()
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--Click functions for buttons
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--Checks or unchecks the given box
|
|
|
|
function click_checkbox(tableIndex, buttonIndex)
|
|
|
|
if ref_buttonData.checkbox[tableIndex].state == true then
|
|
|
|
ref_buttonData.checkbox[tableIndex].state = false
|
|
|
|
self.editButton({index=buttonIndex, label=""})
|
|
|
|
else
|
|
|
|
ref_buttonData.checkbox[tableIndex].state = true
|
|
|
|
self.editButton({index=buttonIndex, label=string.char(10008)})
|
|
|
|
end
|
|
|
|
updateSave()
|
|
|
|
end
|
|
|
|
|
|
|
|
--Applies value to given counter display
|
|
|
|
function click_counter(tableIndex, buttonIndex, amount)
|
|
|
|
ref_buttonData.counter[tableIndex].value = ref_buttonData.counter[tableIndex].value + amount
|
|
|
|
self.editButton({index=buttonIndex, label=ref_buttonData.counter[tableIndex].value})
|
|
|
|
updateSave()
|
|
|
|
end
|
|
|
|
|
|
|
|
--Updates saved value for given text box
|
|
|
|
function click_textbox(i, value, selected)
|
|
|
|
if selected == false then
|
|
|
|
ref_buttonData.textbox[i].value = value
|
|
|
|
updateSave()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
--Dud function for if you have a background on a counter
|
|
|
|
function click_none() end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--Button creation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--Makes checkboxes
|
|
|
|
function createCheckbox()
|
|
|
|
for i, data in ipairs(ref_buttonData.checkbox) do
|
|
|
|
--Sets up reference function
|
|
|
|
local buttonNumber = spawnedButtonCount
|
|
|
|
local funcName = "checkbox"..i
|
|
|
|
local func = function() click_checkbox(i, buttonNumber) end
|
|
|
|
self.setVar(funcName, func)
|
|
|
|
--Sets up label
|
|
|
|
local label = ""
|
|
|
|
if data.state==true then label=string.char(10008) end
|
|
|
|
--Creates button and counts it
|
|
|
|
self.createButton({
|
|
|
|
label=label, click_function=funcName, function_owner=self,
|
|
|
|
position=data.pos, height=data.size, width=data.size,
|
|
|
|
font_size=data.size, scale=buttonScale,
|
|
|
|
color=buttonColor, font_color=buttonFontColor
|
|
|
|
})
|
|
|
|
spawnedButtonCount = spawnedButtonCount + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
--Makes counters
|
|
|
|
function createCounter()
|
|
|
|
for i, data in ipairs(ref_buttonData.counter) do
|
|
|
|
--Sets up display
|
|
|
|
local displayNumber = spawnedButtonCount
|
|
|
|
--Sets up label
|
|
|
|
local label = data.value
|
|
|
|
--Sets height/width for display
|
|
|
|
local size = data.size
|
|
|
|
if data.hideBG == true then size = 0 end
|
|
|
|
--Creates button and counts it
|
|
|
|
self.createButton({
|
|
|
|
label=label, click_function="click_none", function_owner=self,
|
|
|
|
position=data.pos, height=size, width=size,
|
|
|
|
font_size=data.size, scale=buttonScale,
|
|
|
|
color=buttonColor, font_color=buttonFontColor
|
|
|
|
})
|
|
|
|
spawnedButtonCount = spawnedButtonCount + 1
|
|
|
|
|
|
|
|
--Sets up add 1
|
|
|
|
local funcName = "counterAdd"..i
|
|
|
|
local func = function() click_counter(i, displayNumber, 1) end
|
|
|
|
self.setVar(funcName, func)
|
|
|
|
--Sets up label
|
|
|
|
local label = "+"
|
|
|
|
--Sets up position
|
|
|
|
local offsetDistance = (data.size/2 + data.size/4) * (buttonScale[1] * 0.002)
|
|
|
|
local pos = {data.pos[1] + offsetDistance, data.pos[2], data.pos[3]}
|
|
|
|
--Sets up size
|
|
|
|
local size = data.size / 2
|
|
|
|
--Creates button and counts it
|
|
|
|
self.createButton({
|
|
|
|
label=label, click_function=funcName, function_owner=self,
|
|
|
|
position=pos, height=size, width=size,
|
|
|
|
font_size=size, scale=buttonScale,
|
|
|
|
color=buttonColor, font_color=buttonFontColor
|
|
|
|
})
|
|
|
|
spawnedButtonCount = spawnedButtonCount + 1
|
|
|
|
|
|
|
|
--Sets up subtract 1
|
|
|
|
local funcName = "counterSub"..i
|
|
|
|
local func = function() click_counter(i, displayNumber, -1) end
|
|
|
|
self.setVar(funcName, func)
|
|
|
|
--Sets up label
|
|
|
|
local label = "-"
|
|
|
|
--Set up position
|
|
|
|
local pos = {data.pos[1] - offsetDistance, data.pos[2], data.pos[3]}
|
|
|
|
--Creates button and counts it
|
|
|
|
self.createButton({
|
|
|
|
label=label, click_function=funcName, function_owner=self,
|
|
|
|
position=pos, height=size, width=size,
|
|
|
|
font_size=size, scale=buttonScale,
|
|
|
|
color=buttonColor, font_color=buttonFontColor
|
|
|
|
})
|
|
|
|
spawnedButtonCount = spawnedButtonCount + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function createTextbox()
|
|
|
|
for i, data in ipairs(ref_buttonData.textbox) do
|
|
|
|
--Sets up reference function
|
|
|
|
local funcName = "textbox"..i
|
|
|
|
local func = function(_,_,val,sel) click_textbox(i,val,sel) end
|
|
|
|
self.setVar(funcName, func)
|
|
|
|
|
|
|
|
self.createInput({
|
|
|
|
input_function = funcName,
|
|
|
|
function_owner = self,
|
|
|
|
label = data.label,
|
|
|
|
alignment = data.alignment,
|
|
|
|
position = data.pos,
|
|
|
|
scale = buttonScale,
|
|
|
|
width = data.width,
|
|
|
|
height = (data.font_size*data.rows)+24,
|
|
|
|
font_size = data.font_size,
|
|
|
|
color = buttonColor,
|
|
|
|
font_color = buttonFontColor,
|
|
|
|
value = data.value,
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|