diff --git a/modsettings/CustomUIAssets.json b/modsettings/CustomUIAssets.json index f07b8088..a1a5e8bd 100644 --- a/modsettings/CustomUIAssets.json +++ b/modsettings/CustomUIAssets.json @@ -37,7 +37,7 @@ { "Name": "Playermat-Seeker-Cache", "Type": 0, - "URL": "http://cloud-3.steamusercontent.com/ugc/2444972799638880905/CFC02BF5A6140B9B4B92312AD6DC74D8DD61180B/" + "URL": "http://cloud-3.steamusercontent.com/ugc/2462982115659543571/5D778EA4BC682DAE97E8F59A991BCF8CB3979B04/" }, { "Name": "Playermat-Survivor-Cache", diff --git a/objects/FlexTableControl.bd69bd.ttslua b/objects/FlexTableControl.bd69bd.ttslua index 090285a0..4991a9ca 100644 --- a/objects/FlexTableControl.bd69bd.ttslua +++ b/objects/FlexTableControl.bd69bd.ttslua @@ -1,188 +1,172 @@ -tableHeightOffset =-9 +tableHeightOffset = -9 + function onSave() - saved_data = JSON.encode({tid=tableImageData, cd=checkData}) - --saved_data = "" - return saved_data + return JSON.encode({ tid = tableImageData, cd = checkData }) end function onload(saved_data) - --Loads the tracking for if the game has started yet - if saved_data ~= "" then - local loaded_data = JSON.decode(saved_data) - tableImageData = loaded_data.tid - checkData = loaded_data.cd - else - tableImageData = {} - checkData = {move=false, scale=false} - end + if saved_data ~= "" then + local loaded_data = JSON.decode(saved_data) + tableImageData = loaded_data.tid + checkData = loaded_data.cd + else + tableImageData = {} + checkData = { move = false, scale = false } + end - --Disables interactable status of objects with GUID in list - for _, guid in ipairs(ref_noninteractable) do - local obj = getObjectFromGUID(guid) - if obj then obj.interactable = false end - end + --Disables interactable status of objects with GUID in list + for _, guid in ipairs(ref_noninteractable) do + local obj = getObjectFromGUID(guid) + if obj then obj.interactable = false end + end - --Establish references to table parts - obj_leg1 = getObjectFromGUID("afc863") - obj_leg2 = getObjectFromGUID("c8edca") - obj_leg3 = getObjectFromGUID("393bf7") - obj_leg4 = getObjectFromGUID("12c65e") - obj_surface = getObjectFromGUID("4ee1f2") - obj_side_top = getObjectFromGUID("35b95f") - obj_side_bot = getObjectFromGUID("f938a2") - obj_side_lef = getObjectFromGUID("9f95fd") - obj_side_rig = getObjectFromGUID("5af8f2") + --Establish references to table parts + obj_leg1 = getObjectFromGUID("afc863") + obj_leg2 = getObjectFromGUID("c8edca") + obj_leg3 = getObjectFromGUID("393bf7") + obj_leg4 = getObjectFromGUID("12c65e") + obj_surface = getObjectFromGUID("4ee1f2") + obj_side_top = getObjectFromGUID("35b95f") + obj_side_bot = getObjectFromGUID("f938a2") + obj_side_lef = getObjectFromGUID("9f95fd") + obj_side_rig = getObjectFromGUID("5af8f2") - controlActive = true - createOpenCloseButton() + controlActive = true + createOpenCloseButton() end - - --Activation/deactivation of control panel - - --Activated by clicking on function click_toggleControl(_, color) - if permissionCheck(color) then - if not controlActive then - --Activate control panel - controlActive = true - self.clearButtons() - createOpenCloseButton() - createSurfaceInput() - createSurfaceButtons() - createScaleInput() - createScaleButtons() - else - --Deactivate control panel - controlActive = false - self.clearButtons() - self.clearInputs() - createOpenCloseButton() - - end + if permissionCheck(color) then + if not controlActive then + --Activate control panel + controlActive = true + self.clearButtons() + createOpenCloseButton() + createSurfaceInput() + createSurfaceButtons() + createScaleInput() + createScaleButtons() + else + --Deactivate control panel + controlActive = false + self.clearButtons() + self.clearInputs() + createOpenCloseButton() end + end end - - - --Table surface control - - --Changes table surface function click_applySurface(_, color) - if permissionCheck(color) then - updateSurface() - broadcastToAll("New Table Image Applied", {0.2,0.9,0.2}) - end + if permissionCheck(color) then + updateSurface() + broadcastToAll("New Table Image Applied", { 0.2, 0.9, 0.2 }) + end end --Saves table surface function click_saveSurface(_, color) - if permissionCheck(color) then - local nickname = self.getInputs()[1].value - local url = self.getInputs()[2].value - if nickname == "" then - --No nickname - broadcastToAll("Please supply a nickname for this save.", {0.9,0.2,0.2}) - else - --Nickname exists + if permissionCheck(color) then + local nickname = self.getInputs()[1].value + local url = self.getInputs()[2].value + if nickname == "" then + --No nickname + broadcastToAll("Please supply a nickname for this save.", { 0.9, 0.2, 0.2 }) + else + --Nickname exists - if findInImageDataIndex(url, nickname) == nil then - --Save doesn't exist already - table.insert(tableImageData, {url=url, name=nickname}) - broadcastToAll("Image URL saved to memory.", {0.2,0.9,0.2}) - --Refresh buttons - self.clearButtons() - createOpenCloseButton() - createSurfaceButtons() - createScaleButtons() - else - --Save exists already - broadcastToAll("Memory already contains a save with this Name or URL. Delete it first.", {0.9,0.2,0.2}) - end - end - end -end - ---Loads table surface -function click_loadMemory(_, color, index) - if permissionCheck(color) then - self.editInput({index=0, value=tableImageData[index].name}) - self.editInput({index=1, value=tableImageData[index].url}) - updateSurface() - broadcastToAll("Table Image Loaded", {0.2,0.9,0.2}) - end -end - ---Deletes table surface -function click_deleteMemory(_, color, index) - if permissionCheck(color) then - table.remove(tableImageData, index) + if findInImageDataIndex(url, nickname) == nil then + --Save doesn't exist already + table.insert(tableImageData, { url = url, name = nickname }) + broadcastToAll("Image URL saved to memory.", { 0.2, 0.9, 0.2 }) + --Refresh buttons self.clearButtons() createOpenCloseButton() createSurfaceButtons() createScaleButtons() - broadcastToAll("Element Removed from Memory", {0.2,0.9,0.2}) + else + --Save exists already + broadcastToAll("Memory already contains a save with this Name or URL. Delete it first.", { 0.9, 0.2, 0.2 }) + end end + end +end + +--Loads table surface +function click_loadMemory(_, color, index) + if permissionCheck(color) then + self.editInput({ index = 0, value = tableImageData[index].name }) + self.editInput({ index = 1, value = tableImageData[index].url }) + updateSurface() + broadcastToAll("Table Image Loaded", { 0.2, 0.9, 0.2 }) + end +end + +--Deletes table surface +function click_deleteMemory(_, color, index) + if permissionCheck(color) then + table.remove(tableImageData, index) + self.clearButtons() + createOpenCloseButton() + createSurfaceButtons() + createScaleButtons() + broadcastToAll("Element Removed from Memory", { 0.2, 0.9, 0.2 }) + end end --Updates surface from the values in the input field function updateSurface() - local customInfo = obj_surface.getCustomObject() - customInfo.diffuse = self.getInputs()[2].value - obj_surface.setCustomObject(customInfo) - obj_surface = obj_surface.reload() + local customInfo = obj_surface.getCustomObject() + customInfo.diffuse = self.getInputs()[2].value + obj_surface.setCustomObject(customInfo) + obj_surface = obj_surface.reload() end - - --Table Scale control - - --Applies Scale to table pieces function click_applyScale(_, color) - if permissionCheck(color) then - local newWidth = tonumber(self.getInputs()[3].value) - local newDepth = tonumber(self.getInputs()[4].value) - if type(newWidth) ~= "number" then - broadcastToAll("Invalid Width", {0.9,0.2,0.2}) - return - elseif type(newDepth) ~= "number" then - broadcastToAll("Invalid Depth", {0.9,0.2,0.2}) - return - elseif newWidth<0.1 or newDepth<0.1 then - broadcastToAll("Scale cannot go below 0.1", {0.9,0.2,0.2}) - return - elseif newWidth>12 or newDepth>12 then - broadcastToAll("Scale should not go over 12 (world size limitation)", {0.9,0.2,0.2}) - return - else - changeTableScale(math.abs(newWidth), math.abs(newDepth)) - broadcastToAll("Scale applied.", {0.2,0.9,0.2}) - end + if permissionCheck(color) then + local newWidth = tonumber(self.getInputs()[3].value) + local newDepth = tonumber(self.getInputs()[4].value) + if type(newWidth) ~= "number" then + broadcastToAll("Invalid Width", { 0.9, 0.2, 0.2 }) + return + elseif type(newDepth) ~= "number" then + broadcastToAll("Invalid Depth", { 0.9, 0.2, 0.2 }) + return + elseif newWidth < 0.1 or newDepth < 0.1 then + broadcastToAll("Scale cannot go below 0.1", { 0.9, 0.2, 0.2 }) + return + elseif newWidth > 12 or newDepth > 12 then + broadcastToAll("Scale should not go over 12 (world size limitation)", { 0.9, 0.2, 0.2 }) + return + else + changeTableScale(math.abs(newWidth), math.abs(newDepth)) + broadcastToAll("Scale applied.", { 0.2, 0.9, 0.2 }) end + end end --Checks/unchecks move box for hands function click_checkMove(_, color) - if permissionCheck(color) then - local find_func = function(o) return o.click_function=="click_checkMove" end - if checkData.move == true then - checkData.move = false - local buttonEntry = findButton(self, find_func) - self.editButton({index=buttonEntry.index, label=""}) - else - checkData.move = true - local buttonEntry = findButton(self, find_func) - self.editButton({index=buttonEntry.index, label=string.char(10008)}) - end + if permissionCheck(color) then + local find_func = function(o) return o.click_function == "click_checkMove" end + if checkData.move == true then + checkData.move = false + local buttonEntry = findButton(self, find_func) + self.editButton({ index = buttonEntry.index, label = "" }) + else + checkData.move = true + local buttonEntry = findButton(self, find_func) + self.editButton({ index = buttonEntry.index, label = string.char(10008) }) end + end end --Checks/unchecks scale box for hands @@ -206,273 +190,343 @@ end --Alters scale of elements and moves them function changeTableScale(width, depth) - --Scaling factors used to translate scale to position offset - local width2pos = (width-1) * 18 - local depth2pos = (depth-1) * 18 + --Scaling factors used to translate scale to position offset + local width2pos = (width - 1) * 18 + local depth2pos = (depth - 1) * 18 - --Hand zone movement - if checkData.move == true then - for _, pc in ipairs(ref_playerColor) do - if Player[pc].getHandCount() > 0 then - moveHandZone(Player[pc], width2pos, depth2pos) - end - end + --Hand zone movement + if checkData.move == true then + for _, pc in ipairs(ref_playerColor) do + if Player[pc].getHandCount() > 0 then + moveHandZone(Player[pc], width2pos, depth2pos) + end end - --Hand zone scaling - --The button to enable this was disabled for technical reasons - if checkData.scale == true then - for _, pc in ipairs(ref_playerColor) do - if Player[pc].getHandCount() > 0 then - scaleHandZone(Player[pc], width, depth) - end - end + end + --Hand zone scaling + --The button to enable this was disabled for technical reasons + if checkData.scale == true then + for _, pc in ipairs(ref_playerColor) do + if Player[pc].getHandCount() > 0 then + scaleHandZone(Player[pc], width, depth) + end end + end - --Resizing table elements - obj_side_top.setScale({width, 1, 1}) - obj_side_bot.setScale({width, 1, 1}) - obj_side_lef.setScale({depth, 1, 1}) - obj_side_rig.setScale({depth, 1, 1}) - obj_surface.setScale({width, 1, depth}) + --Resizing table elements + obj_side_top.setScale({ width, 1, 1 }) + obj_side_bot.setScale({ width, 1, 1 }) + obj_side_lef.setScale({ depth, 1, 1 }) + obj_side_rig.setScale({ depth, 1, 1 }) + obj_surface.setScale({ width, 1, depth }) - --Moving table elements to accomodate new scale - obj_side_lef.setPosition({-width2pos,tableHeightOffset,0}) - obj_side_rig.setPosition({ width2pos,tableHeightOffset,0}) - obj_side_top.setPosition({0,tableHeightOffset, depth2pos}) - obj_side_bot.setPosition({0,tableHeightOffset,-depth2pos}) - obj_leg1.setPosition({-width2pos,tableHeightOffset,-depth2pos}) - obj_leg2.setPosition({-width2pos,tableHeightOffset, depth2pos}) - obj_leg3.setPosition({ width2pos,tableHeightOffset, depth2pos}) - obj_leg4.setPosition({ width2pos,tableHeightOffset,-depth2pos}) - self.setPosition(obj_leg4.positionToWorld({-22.12, 8.74,-19.16})) - --Only enabled when changing tableHeightOffset - --obj_surface.setPosition({0,tableHeightOffset,0}) + --Moving table elements to accomodate new scale + obj_side_lef.setPosition({ -width2pos, tableHeightOffset, 0 }) + obj_side_rig.setPosition({ width2pos, tableHeightOffset, 0 }) + obj_side_top.setPosition({ 0, tableHeightOffset, depth2pos }) + obj_side_bot.setPosition({ 0, tableHeightOffset, -depth2pos }) + obj_leg1.setPosition({ -width2pos, tableHeightOffset, -depth2pos }) + obj_leg2.setPosition({ -width2pos, tableHeightOffset, depth2pos }) + obj_leg3.setPosition({ width2pos, tableHeightOffset, depth2pos }) + obj_leg4.setPosition({ width2pos, tableHeightOffset, -depth2pos }) + self.setPosition(obj_leg4.positionToWorld({ -22.12, 8.74, -19.16 })) + --Only enabled when changing tableHeightOffset + --obj_surface.setPosition({0,tableHeightOffset,0}) end --Move hand zone, p=player reference, facts are scaling factors function moveHandZone(p, width2pos, depth2pos) - local widthX = obj_side_rig.getPosition().x - local depthZ = obj_side_top.getPosition().z - for i=1, p.getHandCount() do - local handT = p.getHandTransform() - local pos = handT.position - local y = handT.rotation.y + local widthX = obj_side_rig.getPosition().x + local depthZ = obj_side_top.getPosition().z + for i = 1, p.getHandCount() do + local handT = p.getHandTransform() + local pos = handT.position + local y = handT.rotation.y - if y<45 or y>320 or y>135 and y<225 then - if pos.z > 0 then - pos.z = pos.z + depth2pos - depthZ - else - pos.z = pos.z - depth2pos + depthZ - end - else - if pos.x > 0 then - pos.x = pos.x + width2pos - widthX - else - pos.x = pos.x - width2pos + widthX - end - end - - --Only enabled when changing tableHeightOffset - --pos.y = tableHeightOffset + 14 - - handT.position = pos - p.setHandTransform(handT, i) + if y < 45 or y > 320 or y > 135 and y < 225 then + if pos.z > 0 then + pos.z = pos.z + depth2pos - depthZ + else + pos.z = pos.z - depth2pos + depthZ + end + else + if pos.x > 0 then + pos.x = pos.x + width2pos - widthX + else + pos.x = pos.x - width2pos + widthX + end end -end + --Only enabled when changing tableHeightOffset + --pos.y = tableHeightOffset + 14 + + handT.position = pos + p.setHandTransform(handT, i) + end +end ---Scales hand zones, p=player reference, facts are scaling factors function scaleHandZone(p, width, depth) - local widthFact = width / obj_side_top.getScale().x - local depthFact = depth / obj_side_lef.getScale().x - for i=1, p.getHandCount() do - local handT = p.getHandTransform() - local scale = handT.scale - local y = handT.rotation.y - if y<45 or y>320 or y>135 and y<225 then - scale.x = scale.x * widthFact - else - scale.x = scale.x * depthFact - end - handT.scale = scale - p.setHandTransform(handT, i) + local widthFact = width / obj_side_top.getScale().x + local depthFact = depth / obj_side_lef.getScale().x + for i = 1, p.getHandCount() do + local handT = p.getHandTransform() + local scale = handT.scale + local y = handT.rotation.y + if y < 45 or y > 320 or y > 135 and y < 225 then + scale.x = scale.x * widthFact + else + scale.x = scale.x * depthFact end + handT.scale = scale + p.setHandTransform(handT, i) + end end - - --Information gathering - - --Checks if a color is promoted or host function permissionCheck(color) - if Player[color].host==true or Player[color].promoted==true then - return true - else - return false - end + if Player[color].host == true or Player[color].promoted == true then + return true + else + return false + end end --Locates a string saved within memory file function findInImageDataIndex(...) - for _, str in ipairs({...}) do - for i, v in ipairs(tableImageData) do - if v.url == str or v.name == str then - return i - end - end + for _, str in ipairs({ ... }) do + for i, v in ipairs(tableImageData) do + if v.url == str or v.name == str then + return i + end end - return nil + end + return nil end --Round number (num) to the Nth decimal (dec) function round(num, dec) - local mult = 10^(dec or 0) + local mult = 10 ^ (dec or 0) return math.floor(num * mult + 0.5) / mult end --Locates a button with a helper function function findButton(obj, func) - if func==nil then error("No func supplied to findButton") end - for _, v in ipairs(obj.getButtons()) do - if func(v) then - return v - end + if func == nil then error("No func supplied to findButton") end + for _, v in ipairs(obj.getButtons()) do + if func(v) then + return v end - return nil + end + return nil end - - --Creation of buttons/inputs - - function createOpenCloseButton() - local tooltip = "Open Table Control Panel" - if controlActive then - tooltip = "Close Table Control Panel" - end - self.createButton({ - click_function="click_toggleControl", function_owner=self, - position={0,0,0}, rotation={-45,0,0}, height=400, width=400, - color={1,1,1,0}, tooltip=tooltip - }) + local tooltip = "Open Table Control Panel" + if controlActive then + tooltip = "Close Table Control Panel" + end + self.createButton({ + click_function = "click_toggleControl", + function_owner = self, + position = { 0, 0, 0 }, + rotation = { -45, 0, 0 }, + height = 400, + width = 400, + color = { 1, 1, 1, 0 }, + tooltip = tooltip + }) end function createSurfaceInput() - local currentURL = obj_surface.getCustomObject().diffuse - local nickname = "" - if findInImageDataIndex(currentURL) ~= nil then - nickname = tableImageData[findInImageDataIndex(currentURL)].name - end - self.createInput({ - label="Nickname", input_function="none", function_owner=self, - alignment=3, position={0,0,2}, height=224, width=4000, - font_size=200, tooltip="Enter nickname for table image (only used for save)", - value=nickname - }) - self.createInput({ - label="URL", input_function="none", function_owner=self, - alignment=3, position={0,0,3}, height=224, width=4000, - font_size=200, tooltip="Enter URL for tabletop image", - value=currentURL - }) + local currentURL = obj_surface.getCustomObject().diffuse + local nickname = "" + if findInImageDataIndex(currentURL) ~= nil then + nickname = tableImageData[findInImageDataIndex(currentURL)].name + end + self.createInput({ + label = "Nickname", + input_function = "none", + function_owner = self, + alignment = 3, + position = { 0, 0, 2 }, + height = 224, + width = 4000, + font_size = 200, + tooltip = "Enter nickname for table image (only used for save)", + value = nickname + }) + self.createInput({ + label = "URL", + input_function = "none", + function_owner = self, + alignment = 3, + position = { 0, 0, 3 }, + height = 224, + width = 4000, + font_size = 200, + tooltip = "Enter URL for tabletop image", + value = currentURL + }) end function createSurfaceButtons() - --Label + --Label + self.createButton({ + label = "Tabletop Surface Image", + click_function = "none", + position = { 0, 0, 1 }, + height = 0, + width = 0, + font_size = 300, + font_color = { 1, 1, 1 } + }) + --Functional + self.createButton({ + label = "Apply Image\nTo Table", + click_function = "click_applySurface", + function_owner = self, + tooltip = "Apply URL as table image", + position = { 2, 0, 4 }, + height = 440, + width = 1400, + font_size = 200, + }) + self.createButton({ + label = "Save Image\nTo Memory", + click_function = "click_saveSurface", + function_owner = self, + tooltip = "Record URL into memory (requires nickname)", + position = { -2, 0, 4 }, + height = 440, + width = 1400, + font_size = 200, + }) + --Label + self.createButton({ + label = "Load From Memory", + click_function = "none", + position = { 0, 0, 5.5 }, + height = 0, + width = 0, + font_size = 300, + font_color = { 1, 1, 1 } + }) + --Saves, created dynamically from memory file + for i, memoryEntry in ipairs(tableImageData) do + --Load + local funcName = i .. "loadMemory" + local func = function(x, y) click_loadMemory(x, y, i) end + self.setVar(funcName, func) self.createButton({ - label="Tabletop Surface Image", click_function="none", - position={0,0,1}, height=0, width=0, font_size=300, font_color={1,1,1} + label = memoryEntry.name, + click_function = funcName, + function_owner = self, + tooltip = memoryEntry.url, + font_size = 200, + position = { -0.6, 0, 6.5 + 0.5 * (i - 1) }, + height = 240, + width = 3300, }) - --Functional + --Delete + local funcName = i .. "deleteMemory" + local func = function(x, y) click_deleteMemory(x, y, i) end + self.setVar(funcName, func) self.createButton({ - label="Apply Image\nTo Table", click_function="click_applySurface", - function_owner=self, tooltip="Apply URL as table image", - position={2,0,4}, height=440, width=1400, font_size=200, + label = "DELETE", + click_function = funcName, + function_owner = self, + tooltip = "", + position = { 3.6, 0, 6.5 + 0.5 * (i - 1) }, + height = 240, + width = 600, + font_size = 160, + font_color = { 1, 0, 0 }, + color = { 0.8, 0.8, 0.8 } }) - self.createButton({ - label="Save Image\nTo Memory", click_function="click_saveSurface", - function_owner=self, tooltip="Record URL into memory (requires nickname)", - position={-2,0,4}, height=440, width=1400, font_size=200, - }) - --Label - self.createButton({ - label="Load From Memory", click_function="none", - position={0,0,5.5}, height=0, width=0, font_size=300, font_color={1,1,1} - }) - --Saves, created dynamically from memory file - for i, memoryEntry in ipairs(tableImageData) do - --Load - local funcName = i.."loadMemory" - local func = function(x,y) click_loadMemory(x,y,i) end - self.setVar(funcName, func) - self.createButton({ - label=memoryEntry.name, click_function=funcName, - function_owner=self, tooltip=memoryEntry.url, font_size=200, - position={-0.6,0,6.5+0.5*(i-1)}, height=240, width=3300, - }) - --Delete - local funcName = i.."deleteMemory" - local func = function(x,y) click_deleteMemory(x,y,i) end - self.setVar(funcName, func) - self.createButton({ - label="DELETE", click_function=funcName, - function_owner=self, tooltip="", - position={3.6,0,6.5+0.5*(i-1)}, height=240, width=600, - font_size=160, font_color={1,0,0}, color={0.8,0.8,0.8} - }) - end + end end function createScaleInput() - self.createInput({ - label=string.char(8644), input_function="none", function_owner=self, - alignment=3, position={-8.5,0,2}, height=224, width=400, - font_size=200, tooltip="Table Width", - value=round(obj_side_top.getScale().x, 1) - }) - self.createInput({ - label=string.char(8645), input_function="none", function_owner=self, - alignment=3, position={-7.5,0,2}, height=224, width=400, - font_size=200, tooltip="Table Depth", - value=round(obj_side_lef.getScale().x, 1) - }) + self.createInput({ + label = string.char(8644), + input_function = "none", + function_owner = self, + alignment = 3, + position = { -8.5, 0, 2 }, + height = 224, + width = 400, + font_size = 200, + tooltip = "Table Width", + value = round(obj_side_top.getScale().x, 1) + }) + self.createInput({ + label = string.char(8645), + input_function = "none", + function_owner = self, + alignment = 3, + position = { -7.5, 0, 2 }, + height = 224, + width = 400, + font_size = 200, + tooltip = "Table Depth", + value = round(obj_side_lef.getScale().x, 1) + }) end function createScaleButtons() - --Labels - self.createButton({ - label="Table Scale", click_function="none", - position={-8,0,1}, height=0, width=0, font_size=300, font_color={1,1,1} - }) - self.createButton({ - label=string.char(8644).." "..string.char(8645), - click_function="none", - position={-8,0,2}, height=0, width=0, font_size=300, font_color={1,1,1} - }) - self.createButton({ - label="Move Hands:", click_function="none", - position={-8.3,0,3}, height=0, width=0, font_size=200, font_color={1,1,1} - }) - --Disabled due to me removing the feature for technical reasons - --[[ + --Labels + self.createButton({ + label = "Table Scale", + click_function = "none", + position = { -8, 0, 1 }, + height = 0, + width = 0, + font_size = 300, + font_color = { 1, 1, 1 } + }) + self.createButton({ + label = string.char(8644) .. " " .. string.char(8645), + click_function = "none", + position = { -8, 0, 2 }, + height = 0, + width = 0, + font_size = 300, + font_color = { 1, 1, 1 } + }) + self.createButton({ + label = "Move Hands:", + click_function = "none", + position = { -8.3, 0, 3 }, + height = 0, + width = 0, + font_size = 200, + font_color = { 1, 1, 1 } + }) + --Disabled due to me removing the feature for technical reasons + --[[ self.createButton({ label="Scale Hands:", click_function="none", position={-8.3,0,4}, height=0, width=0, font_size=200, font_color={1,1,1} }) ]] - --Checkboxes - local label = "" - if checkData.move == true then label = string.char(10008) end - self.createButton({ - label=label, click_function="click_checkMove", - function_owner=self, tooltip="Check to move hands when table is rescaled", - position={-6.8,0,3}, height=224, width=224, font_size=200, - }) - --[[ + --Checkboxes + local label = "" + if checkData.move == true then label = string.char(10008) end + self.createButton({ + label = label, + click_function = "click_checkMove", + function_owner = self, + tooltip = "Check to move hands when table is rescaled", + position = { -6.8, 0, 3 }, + height = 224, + width = 224, + font_size = 200, + }) + --[[ local label = "" if checkData.scale == true then label = string.char(10008) end self.createButton({ @@ -481,31 +535,29 @@ function createScaleButtons() position={-6.8,0,4}, height=224, width=224, font_size=200, }) ]] - --Apply button - self.createButton({ - label="Apply Scale", click_function="click_applyScale", - function_owner=self, tooltip="Apply width/depth to table", - position={-8,0,4}, height=440, width=1400, font_size=200, - }) + --Apply button + self.createButton({ + label = "Apply Scale", + click_function = "click_applyScale", + function_owner = self, + tooltip = "Apply width/depth to table", + position = { -8, 0, 4 }, + height = 440, + width = 1400, + font_size = 200, + }) end - - - - --Data tables - - - ref_noninteractable = { - "afc863","c8edca","393bf7","12c65e","f938a2","9f95fd","35b95f", - "5af8f2","4ee1f2","bd69bd" + "afc863", "c8edca", "393bf7", "12c65e", "f938a2", "9f95fd", "35b95f", + "5af8f2", "4ee1f2", "bd69bd" } ref_playerColor = { - "White", "Brown", "Red", "Orange", "Yellow", - "Green", "Teal", "Blue", "Purple", "Pink", "Black" + "White", "Brown", "Red", "Orange", "Yellow", + "Green", "Teal", "Blue", "Purple", "Pink", "Black" } --Dummy function, absorbs unwanted triggers diff --git a/objects/TokenSource.124381/UniversalActionAbilityToken.834ad5.json b/objects/TokenSource.124381/UniversalActionAbilityToken.834ad5.json index e30872cc..d7142a26 100644 --- a/objects/TokenSource.124381/UniversalActionAbilityToken.834ad5.json +++ b/objects/TokenSource.124381/UniversalActionAbilityToken.834ad5.json @@ -41,7 +41,7 @@ "LayoutGroupSortIndex": 0, "Locked": false, "LuaScript": "require(\"core/UniversalActionAbilityToken\")", - "LuaScriptState": "", + "LuaScriptState": "{\"class\":\"Neutral\",\"symbol\":\"Neutral\"}", "MeasureMovement": false, "Memo": "universalActionAbility", "Name": "Custom_Tile", diff --git a/src/accessories/PhaseTracker.ttslua b/src/accessories/PhaseTracker.ttslua index 066d3ad3..e646a004 100644 --- a/src/accessories/PhaseTracker.ttslua +++ b/src/accessories/PhaseTracker.ttslua @@ -11,9 +11,6 @@ local phaseImages = { "http://cloud-3.steamusercontent.com/ugc/982233321870237261/C287CAED2423970F33E72D6C7415CBEC6794C533/" } --- these are intentionally global for remote updating --- phaseId, broadcastChange - function onSave() return JSON.encode({ phaseId = phaseId, @@ -21,11 +18,15 @@ function onSave() }) end +function loadFromSaveTable(savedData) + for var, val in pairs(JSON.decode(savedData)) do + _G[var] = val + end +end + function onLoad(savedData) if savedData and savedData ~= "" then - local loadedData = JSON.decode(savedData) - phaseId = loadedData.phaseId - broadcastChange = loadedData.broadcastChange + loadFromSaveTable(savedData) else phaseId = 1 broadcastChange = false diff --git a/src/accessories/UnderworldMarketHelper.ttslua b/src/accessories/UnderworldMarketHelper.ttslua index 0f851682..0373efbb 100644 --- a/src/accessories/UnderworldMarketHelper.ttslua +++ b/src/accessories/UnderworldMarketHelper.ttslua @@ -1,277 +1,275 @@ local searchLib = require("util/SearchLib") -function onload(savedData) - revealCardPositions = { - Vector(3.5, 0.25, 0), - Vector(-3.5, 0.25, 0) - } - - revealCardPositionsSwap = { - Vector(-3.5, 0.25, 0), - Vector(3.5, 0.25, 0) - } - - self.createButton({ - label = 'Underworld Market\nHelper', - click_function = "none", - function_owner = self, - position = {0,-0.1,-1.6}, - height = 0, - width = 0, - font_size = 145, - font_color = {1,1,1} - }) - - hiddenCards = 10 - hiddenCardLabel = '-----' - - isSetup = false - movingCards = false - - self.addContextMenuItem('Reset helper', resetHelper) - - if savedData ~= '' then - local loaded_data = JSON.decode(savedData) - hiddenCards = loaded_data.saved_hiddenCards - - isSetup = true - refreshButtons() - end +function onSave() + return JSON.encode({ saved_hiddenCards = hiddenCards }) end -function onSave() - return JSON.encode({ - saved_hiddenCards = hiddenCards - }) +function onload(savedData) + revealCardPositions = { + Vector(3.5, 0.25, 0), + Vector(-3.5, 0.25, 0) + } + + revealCardPositionsSwap = { + Vector(-3.5, 0.25, 0), + Vector(3.5, 0.25, 0) + } + + self.createButton({ + label = 'Underworld Market\nHelper', + click_function = "none", + function_owner = self, + position = { 0, -0.1, -1.6 }, + height = 0, + width = 0, + font_size = 145, + font_color = { 1, 1, 1 } + }) + + hiddenCards = 10 + hiddenCardLabel = '-----' + + isSetup = false + movingCards = false + + self.addContextMenuItem('Reset helper', resetHelper) + + if savedData and savedData ~= '' then + local loaded_data = JSON.decode(savedData) + hiddenCards = loaded_data.saved_hiddenCards + + isSetup = true + refreshButtons() + end end function onObjectEnterContainer(container, object) - if container ~= self then return end + if container ~= self then return end - if isSetup and object.tag == "Card" then - refreshButtons() - end + if isSetup and object.tag == "Card" then + refreshButtons() + end - if object.tag == "Deck" then - if validateDeck(object) then - takeDeckOut(object.getGUID(), self.getPosition() + Vector(0, 0.1, 0)) - refreshButtons() - - isSetup = true - end - elseif object.tag ~= "Card" then - broadcastToAll("The 'Underworld Market Helper' is meant to be used for cards.", "White") + if object.tag == "Deck" then + if validateDeck(object) then + takeDeckOut(object.getGUID(), self.getPosition() + Vector(0, 0.1, 0)) + refreshButtons() + + isSetup = true end + elseif object.tag ~= "Card" then + broadcastToAll("The 'Underworld Market Helper' is meant to be used for cards.", "White") + end end function onObjectLeaveContainer(container, object) - if container ~= self then return end - - if isSetup then - refreshButtons() - end + if container ~= self then return end + + if isSetup then + refreshButtons() + end end function validateDeck(deck) - if deck.getQuantity() ~= 10 then - print('Underworld Market Helper: Deck must include exactly 10 cards.') - return false + if deck.getQuantity() ~= 10 then + print('Underworld Market Helper: Deck must include exactly 10 cards.') + return false + end + + local illicitCount = 0 + + for _, card in ipairs(deck.getObjects()) do + decodedGMNotes = JSON.decode(card.gm_notes) + + if decodedGMNotes ~= nil and string.find(decodedGMNotes.traits, "Illicit", 1, true) then + illicitCount = illicitCount + 1 end + end - local illicitCount = 0 + if illicitCount ~= 10 then + print('Underworld Market Helper: Deck must include 10 Illicit cards.') + return false + end - for _, card in ipairs(deck.getObjects()) do - decodedGMNotes = JSON.decode(card.gm_notes) - - if decodedGMNotes ~= nil and string.find(decodedGMNotes.traits, "Illicit", 1, true) then - illicitCount = illicitCount + 1 - end - end - - if illicitCount ~= 10 then - print('Underworld Market Helper: Deck must include 10 Illicit cards.') - return false - end - - return true + return true end function refreshButtons() - local cardsList = '' + local cardsList = '' - for i, card in ipairs(self.getObjects()) do - local localCardName = card.name + for i, card in ipairs(self.getObjects()) do + local localCardName = card.name - if i <= hiddenCards then - localCardName = hiddenCardLabel - end - - cardsList = cardsList .. localCardName .. '\n' + if i <= hiddenCards then + localCardName = hiddenCardLabel end - self.clearButtons() + cardsList = cardsList .. localCardName .. '\n' + end - self.createButton({ - label = 'Market Deck:', - click_function = "none", - function_owner = self, - position = {0,-0.1,-1.6}, - height = 0, - width = 0, - font_size = 150, - font_color = {1,1,1} - }) + self.clearButtons() - self.createButton({ - label = cardsList, - click_function = "none", - function_owner = self, - position = {0,-0.1,0.15}, - height = 0, - width = 0, - font_size = 115, - font_color = {1,1,1} - }) + self.createButton({ + label = 'Market Deck:', + click_function = "none", + function_owner = self, + position = { 0, -0.1, -1.6 }, + height = 0, + width = 0, + font_size = 150, + font_color = { 1, 1, 1 } + }) - self.createButton({ - click_function = 'revealFirstTwoCards', - function_owner = self, - label = 'Reveal', - position = {-0.85,0,1.6}, - width = 375, - height = 175, - font_size = 90 - }) + self.createButton({ + label = cardsList, + click_function = "none", + function_owner = self, + position = { 0, -0.1, 0.15 }, + height = 0, + width = 0, + font_size = 115, + font_color = { 1, 1, 1 } + }) - self.createButton({ - click_function = 'swap', - function_owner = self, - label = 'Swap', - position = {0,0,1.6}, - width = 375, - height = 175, - font_size = 90 - }) + self.createButton({ + click_function = 'revealFirstTwoCards', + function_owner = self, + label = 'Reveal', + position = { -0.85, 0, 1.6 }, + width = 375, + height = 175, + font_size = 90 + }) - self.createButton({ - click_function = 'finish', - function_owner = self, - label = 'Finish', - position = {0.85,0,1.6}, - width = 375, - height = 175, - font_size = 90 - }) + self.createButton({ + click_function = 'swap', + function_owner = self, + label = 'Swap', + position = { 0, 0, 1.6 }, + width = 375, + height = 175, + font_size = 90 + }) + + self.createButton({ + click_function = 'finish', + function_owner = self, + label = 'Finish', + position = { 0.85, 0, 1.6 }, + width = 375, + height = 175, + font_size = 90 + }) end function takeDeckOut(guid, pos) - local deck = self.takeObject({ guid = guid, position = pos, smooth = false }) + local deck = self.takeObject({ guid = guid, position = pos, smooth = false }) - for i = 1, #deck.getObjects() do - self.putObject(deck.takeObject({ position = pos + Vector(0, 0.1 * i, 0), smooth = false })) - end + for i = 1, #deck.getObjects() do + self.putObject(deck.takeObject({ position = pos + Vector(0, 0.1 * i, 0), smooth = false })) + end - self.shuffle() + self.shuffle() end function getRevealedCards() - local revealedCards = {} + local revealedCards = {} - for _, pos in ipairs(revealCardPositions) do - for _, obj in ipairs(searchLib.atPosition(self.positionToWorld(pos), "isCard")) do - table.insert(revealedCards, obj.getGUID()) - end + for _, pos in ipairs(revealCardPositions) do + for _, obj in ipairs(searchLib.atPosition(self.positionToWorld(pos), "isCard")) do + table.insert(revealedCards, obj.getGUID()) end + end - return revealedCards + return revealedCards end function revealFirstTwoCards() - if movingCards or #getRevealedCards() > 0 then return end + if movingCards or #getRevealedCards() > 0 then return end - for i, card in ipairs(self.getObjects()) do - movingCards = true + for i, card in ipairs(self.getObjects()) do + movingCards = true - self.takeObject({ - index = 0, - rotation = self.getRotation(), - position = self.positionToWorld(revealCardPositions[i]), - callback_function = function(obj) - obj.resting = true - movingCards = false - end - }) + self.takeObject({ + index = 0, + rotation = self.getRotation(), + position = self.positionToWorld(revealCardPositions[i]), + callback_function = function(obj) + obj.resting = true + movingCards = false + end + }) - hiddenCards = hiddenCards - 1 + hiddenCards = hiddenCards - 1 - if i == 2 or #self.getObjects() == 0 then - break - end + if i == 2 or #self.getObjects() == 0 then + break end + end - refreshButtons() + refreshButtons() end function swap() - if movingCards then return end + if movingCards then return end - local revealedCards = getRevealedCards() + local revealedCards = getRevealedCards() - if #revealedCards == 2 then - for i, revealedCardGUID in ipairs(revealedCards) do - local revealedCard = getObjectFromGUID(revealedCardGUID) + if #revealedCards == 2 then + for i, revealedCardGUID in ipairs(revealedCards) do + local revealedCard = getObjectFromGUID(revealedCardGUID) - revealedCard.setPositionSmooth(self.positionToWorld(revealCardPositionsSwap[i]), false, false) - end + revealedCard.setPositionSmooth(self.positionToWorld(revealCardPositionsSwap[i]), false, false) end + end end function finish() - if movingCards then return end + if movingCards then return end - local revealedCards = getRevealedCards() + local revealedCards = getRevealedCards() - movingCards = true + movingCards = true - for i, revealedCardGUID in ipairs(revealedCards) do - self.putObject(getObjectFromGUID(revealedCardGUID)) - end + for i, revealedCardGUID in ipairs(revealedCards) do + self.putObject(getObjectFromGUID(revealedCardGUID)) + end - Wait.time( - function() - movingCards = false - end, + Wait.time( + function() + movingCards = false + end, 0.75) end function resetHelper() - for i, card in ipairs(self.getObjects()) do - self.takeObject({ - index = 0, - smooth = false, - rotation = self.getRotation(), - position = self.positionToWorld(revealCardPositions[2]) - }) - end - - self.clearButtons() - - self.createButton({ - label = 'Underworld Market\nHelper', - click_function = "none", - function_owner = self, - position = {0,-0.1,-1.6}, - height = 0, - width = 0, - font_size = 145, - font_color = {1,1,1} + for i, card in ipairs(self.getObjects()) do + self.takeObject({ + index = 0, + smooth = false, + rotation = self.getRotation(), + position = self.positionToWorld(revealCardPositions[2]) }) + end - hiddenCards = 10 - isSetup = false - movingCards = false + self.clearButtons() - self.reset() + self.createButton({ + label = 'Underworld Market\nHelper', + click_function = "none", + function_owner = self, + position = { 0, -0.1, -1.6 }, + height = 0, + width = 0, + font_size = 145, + font_color = { 1, 1, 1 } + }) - print('Underworld Market Helper: Helper has been reset.') + hiddenCards = 10 + isSetup = false + movingCards = false + + self.reset() + + print('Underworld Market Helper: Helper has been reset.') end diff --git a/src/core/DataHelper.ttslua b/src/core/DataHelper.ttslua index 5845b09b..1f5bcd22 100644 --- a/src/core/DataHelper.ttslua +++ b/src/core/DataHelper.ttslua @@ -483,13 +483,12 @@ modeData = { } function onSave() - local globalState = JSON.encode(SPAWNED_PLAYER_CARD_GUIDS) - return globalState + return JSON.encode(SPAWNED_PLAYER_CARD_GUIDS) end -function onLoad(save_state) - if save_state ~= '' then - SPAWNED_PLAYER_CARD_GUIDS = JSON.decode(save_state) +function onLoad(savedData) + if savedData and savedData ~= '' then + SPAWNED_PLAYER_CARD_GUIDS = JSON.decode(savedData) else SPAWNED_PLAYER_CARD_GUIDS = {} end diff --git a/src/core/MythosArea.ttslua b/src/core/MythosArea.ttslua index c1bcf2d1..9ce728d3 100644 --- a/src/core/MythosArea.ttslua +++ b/src/core/MythosArea.ttslua @@ -22,7 +22,14 @@ local ENCOUNTER_DISCARD_POSITION = { x = -3.85, y = 1, z = 10.38 } local isReshuffling = false local collisionEnabled = false local currentScenario, useFrontData, tokenData -local TRASH, DATA_HELPER + +function onSave() + return JSON.encode({ + currentScenario = currentScenario, + useFrontData = useFrontData, + tokenData = tokenData + }) +end function onLoad(savedData) if savedData and savedData ~= "" then @@ -31,20 +38,9 @@ function onLoad(savedData) useFrontData = loadedState.useFrontData or true tokenData = loadedState.tokenData or {} end - TRASH = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash") - DATA_HELPER = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") - Wait.time(function() collisionEnabled = true end, 0.1) end -function onSave() - return JSON.encode({ - currentScenario = currentScenario, - useFrontData = useFrontData, - tokenData = tokenData - }) -end - --------------------------------------------------------- -- collison and container event handling --------------------------------------------------------- @@ -182,6 +178,7 @@ end -- draw the provided card to the requesting playermat function actualEncounterCardDraw(card, params) local metadata = JSON.decode(card.getGMNotes()) or {} + local DATA_HELPER = guidReferenceApi.getObjectByOwnerAndType("Mythos", "DataHelper") -- draw hidden cards facedown local faceUpRotation = 0 @@ -249,6 +246,7 @@ end -- removes tokens from the provided card/deck function removeTokensFromObject(object) + local TRASH = guidReferenceApi.getObjectByOwnerAndType("Mythos", "Trash") for _, obj in ipairs(searchLib.onObject(object)) do if obj.getGUID() ~= "4ee1f2" and -- table obj ~= self and diff --git a/src/core/NavigationOverlayHandler.ttslua b/src/core/NavigationOverlayHandler.ttslua index a3cba763..ad8f37d4 100644 --- a/src/core/NavigationOverlayHandler.ttslua +++ b/src/core/NavigationOverlayHandler.ttslua @@ -89,13 +89,9 @@ function onLoad(savedData) pitch = loadedData.pitch distance = loadedData.distance else - local allColors = Player.getColors() - - for _, color in ipairs(allColors) do - -- default state for claims + -- initialize tables with defaults + for _, color in ipairs(Player.getColors()) do claims[color] = {} - - -- default state for visibility visibility[color] = { full = false, play = false } end end diff --git a/src/core/PlayAreaSelector.ttslua b/src/core/PlayAreaSelector.ttslua index fe32286f..0824dde9 100644 --- a/src/core/PlayAreaSelector.ttslua +++ b/src/core/PlayAreaSelector.ttslua @@ -3,7 +3,12 @@ local optionPanelApi = require("core/OptionPanelApi") local playAreaApi = require("core/PlayAreaApi") local typeIndex, selectionIndex, plainNameCache -function onSave() return JSON.encode({ typeIndex = typeIndex, selectionIndex = selectionIndex }) end +function onSave() + return JSON.encode({ + typeIndex = typeIndex, + selectionIndex = selectionIndex + }) +end function onLoad(savedData) if savedData and savedData ~= "" then diff --git a/src/playercards/CardSearch.ttslua b/src/playercards/CardSearch.ttslua index b3cb5228..f5143f2e 100644 --- a/src/playercards/CardSearch.ttslua +++ b/src/playercards/CardSearch.ttslua @@ -23,7 +23,9 @@ inputParameters.scale = { 0.1, 1, 0.1 } inputParameters.color = { 0.9, 0.7, 0.5 } inputParameters.font_color = { 0, 0, 0 } -function onSave() return JSON.encode({ spawnAll, searchExact, inputParameters.value }) end +function onSave() + return JSON.encode({ spawnAll, searchExact, inputParameters.value }) +end function onLoad(savedData) local loadedData = JSON.decode(savedData)