--[[ 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 { pos = {-1.080,0.1,-1.010}, size = 800, value = 0, hideBG = true }, --1st Player Physical Trauma { pos = {-1.270,0.1,-0.790}, size = 600, value = 0, hideBG = true }, --1st Player Mental Trauma { pos = {-1.000,0.1,-0.790}, size = 600, value = 0, hideBG = true }, --2nd Player Experience { pos = {-0.251,0.1,-1.010}, size = 800, value = 0, hideBG = true }, --2nd Player Physical Trauma { pos = {-0.441,0.1,-0.790}, size = 600, value = 0, hideBG = true }, --2nd Player Mental Trauma { pos = {-0.171,0.1,-0.790}, size = 600, value = 0, hideBG = true }, --3rd Player Experience { pos = {0.579,0.1,-1.010}, size = 800, value = 0, hideBG = true }, --3rd Player Physical Trauma { pos = {0.389,0.1,-0.790}, size = 600, value = 0, hideBG = true }, --3rd Player Mental Trauma { pos = {0.659,0.1,-0.790}, size = 600, value = 0, hideBG = true }, --4th Player Experience { pos = {1.407,0.1,-1.010}, size = 800, value = 0, hideBG = true }, --4th Player Physical Trauma { pos = {1.217,0.1,-0.790}, size = 600, value = 0, hideBG = true }, --4th Player Mental Trauma { pos = {1.487,0.1,-0.790}, 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 { pos = {-1.265,0.1,-1.390}, rows = 1, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --1st Player Investigator { pos = {-1.265,0.1,-1.195}, rows = 1, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --1st Player Story Assets/Weaknesses { pos = {-1.265,0.1,-0.420}, rows = 7, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --2nd Player Name { pos = {-0.436,0.1,-1.390}, rows = 1, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --2nd Player Investigator { pos = {-0.436,0.1,-1.195}, rows = 1, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --2nd Player Story Assets/Weaknesses { pos = {-0.436,0.1,-0.420}, rows = 7, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --3rd Player Name { pos = {0.394,0.1,-1.390}, rows = 1, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --3rd Player Investigator { pos = {0.394,0.1,-1.195}, rows = 1, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --3rd Player Story Assets/Weaknesses { pos = {0.394,0.1,-0.420}, rows = 7, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --4th Player Name { pos = {1.222,0.1,-1.390}, rows = 1, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --4th Player Investigator { pos = {1.222,0.1,-1.195}, rows = 1, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --4th Player Story Assets/Weaknesses { pos = {1.222,0.1,-0.420}, rows = 7, width = 3800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --Campaign Notes 1 { pos = {-0.930,0.1,0.930}, rows = 27, width = 7800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --Campaign Notes 2 { pos = {0.820,0.1,0.707}, rows = 20, width = 7800, font_size = 300, label = "Empty", value = "", alignment = 2 }, --Killed and Insane Investigators { pos = {1.010,0.1,1.700}, rows = 5, width = 7400, 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