diff --git a/modsettings/ComponentTags.json b/modsettings/ComponentTags.json index a30f8e1a..e3183d95 100644 --- a/modsettings/ComponentTags.json +++ b/modsettings/ComponentTags.json @@ -49,8 +49,8 @@ "normalized": "location" }, { - "displayed": "to_be_deleted", - "normalized": "to_be_deleted" + "displayed": "tempToken", + "normalized": "temptoken" }, { "displayed": "Minicard", diff --git a/objects/Fan-MadeAccessories.aa8b38/TokenArranger.022907.json b/objects/Fan-MadeAccessories.aa8b38/TokenArranger.022907.json index 951952de..61f9dd5d 100644 --- a/objects/Fan-MadeAccessories.aa8b38/TokenArranger.022907.json +++ b/objects/Fan-MadeAccessories.aa8b38/TokenArranger.022907.json @@ -45,10 +45,10 @@ ], "Tooltip": true, "Transform": { - "posX": 22.951, - "posY": 5.242, - "posZ": -30.295, - "rotX": 1, + "posX": -42.3, + "posY": 1.53, + "posZ": -46.5, + "rotX": 0, "rotY": 270, "rotZ": 0, "scaleX": 2, diff --git a/src/accessories/TokenArranger.ttslua b/src/accessories/TokenArranger.ttslua index b0d6d217..10a0b39a 100644 --- a/src/accessories/TokenArranger.ttslua +++ b/src/accessories/TokenArranger.ttslua @@ -1,4 +1,4 @@ --- names of tokens in order +local TOKEN_PRECEDENCE = {} local TOKEN_NAMES = { "Elder Sign", "Skull", @@ -12,21 +12,6 @@ local TOKEN_NAMES = { "" } --- token modifiers for sorting (and order for same modifier) --- order starts at 2 because there is a "+1" token -local TOKEN_PRECEDENCE = { - ["Elder Sign"] = { 100, 2 }, - ["Skull"] = { -1, 3 }, - ["Cultist"] = { -2, 4 }, - ["Tablet"] = { -3, 5 }, - ["Elder Thing"] = { -4, 6 }, - ["Auto-fail"] = { -100, 7 }, - ["Bless"] = { 101, 8 }, - ["Curse"] = { -101, 9 }, - ["Frost"] = { -99, 10 }, - [""] = { 0, 11 } -} - -- common parameters local buttonParameters = {} buttonParameters.function_owner = self @@ -52,13 +37,15 @@ function onSave() return JSON.encode(TOKEN_PRECEDENCE) end function onLoad(saveState) if saveState ~= nil then TOKEN_PRECEDENCE = JSON.decode(saveState) + else + loadDefaultValues() end -- create UI local offset = 0.725 local pos = { x = { -1.067, 0.377 }, z = -2.175 } - -- button and inputs index 1-10 + -- button and inputs index 0-9 for i = 1, 10 do if i < 6 then buttonParameters.position = { pos.x[1], 0, pos.z + i * offset } @@ -76,7 +63,7 @@ function onLoad(saveState) self.createInput(inputParameters) end - -- index 11: "Update / Hide" button + -- index 10: "Update / Hide" button buttonParameters.label = "Update / Hide" buttonParameters.click_function = "layout" buttonParameters.tooltip = "Left-Click: Update!\nRight-Click: Hide Tokens!" @@ -85,55 +72,52 @@ function onLoad(saveState) buttonParameters.width = 675 buttonParameters.height = 175 self.createButton(buttonParameters) - -- send object reference to bless/curse manager - Wait.time(function() getObjectFromGUID("5933fb").setVar("tokenArranger", self) end, 1) + + -- reset context menu + self.addContextMenuItem("Load default values", function() + loadDefaultValues() + updateUI() + layout() + end) end --- delete tokens and remove reference from bless/curse manager -function onDestroy() - deleteCopiedTokens() - -- remove object reference from bless/curse manager - getObjectFromGUID("5933fb").setVar("tokenArranger", nil) -end +-- delete temporary tokens when destroyed +function onDestroy() deleteCopiedTokens() end -- layout tokens when dropped (after 2 seconds) function onDrop() Wait.time(layout, 2) end --- delete tokens when picked up +-- delete temporary tokens when picked up function onPickUp() deleteCopiedTokens() end -- helper functions to carry index function attachIndex(click_function, index) local fn_name = click_function .. index - _G[fn_name] = function(obj, player_color, isRightClick) - _G[click_function](obj, player_color, isRightClick, index) + _G[fn_name] = function(_, _, isRightClick) + _G[click_function](isRightClick, index) end return fn_name end function attachIndex2(input_function, index) local fn_name = input_function .. index - _G[fn_name] = function(obj, player_color, input, selected) - _G[input_function](obj, player_color, input, selected, index) + _G[fn_name] = function(_, _, input, selected) + _G[input_function](input, selected, index) end return fn_name end -- click_function for buttons on chaos tokens -function tokenClick(_, _, isRightClick, index) - if not updating then - updating = true - local change = tonumber(isRightClick and "-1" or "1") - TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] = TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] + change - self.editInput({ index = index - 1, value = TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] }) - layout() - end +function tokenClick(isRightClick, index) + local change = tonumber(isRightClick and "-1" or "1") + TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] = TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] + change + self.editInput({ index = index - 1, value = TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] }) + layout() end -- input_function for input_boxes -function tokenInput(_, _, input, selected, index) - if selected == false and not updating then - updating = true +function tokenInput(input, selected, index) + if selected == false then local num = tonumber(input) if num ~= nil then TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] = num @@ -142,6 +126,31 @@ function tokenInput(_, _, input, selected, index) end end +-- loads the default precedence table +function loadDefaultValues() + -- token modifiers for sorting (and order for same modifier) + -- order starts at 2 because there is a "+1" token + TOKEN_PRECEDENCE = { + ["Elder Sign"] = { 100, 2 }, + ["Skull"] = { -1, 3 }, + ["Cultist"] = { -2, 4 }, + ["Tablet"] = { -3, 5 }, + ["Elder Thing"] = { -4, 6 }, + ["Auto-fail"] = { -100, 7 }, + ["Bless"] = { 101, 8 }, + ["Curse"] = { -101, 9 }, + ["Frost"] = { -99, 10 }, + [""] = { 0, 11 } + } +end + +-- update input fields +function updateUI() + for i = 1, 10 do + self.editInput({ index = i-1, value = TOKEN_PRECEDENCE[TOKEN_NAMES[i]][1] }) + end +end + -- order function for data sorting function token_value_comparator(left, right) if left.value > right.value then return true @@ -152,49 +161,35 @@ function token_value_comparator(left, right) end end --- get chaos bag from scripting zone and description -function getChaosBag() - local chaosbag = nil - local chaosbag_zone = getObjectFromGUID("83ef06") - - -- error handling: scripting zone not found - if chaosbag_zone == nil then - printToAll("Zone for chaos bag detection couldn't be found.", "Red") - return nil - end - - for _, v in ipairs(chaosbag_zone.getObjects()) do - if v.getDescription() == "Chaos Bag" then - chaosbag = getObjectFromGUID(v.getGUID()) - break +-- checks scripting zone for chaos bag +function findChaosBag() + for _, item in ipairs(getObjectFromGUID("83ef06").getObjects()) do + if item.getDescription() == "Chaos Bag" then + return item end end - - -- error handling: chaos bag not found - if chaosbag == nil then - printToAll("Chaos bag couldn't be found.", "Red") - end - return chaosbag end -- deletes previously placed tokens function deleteCopiedTokens() - for _, token in ipairs(getObjectsWithTag("to_be_deleted")) do token.destruct() end + for _, token in ipairs(getObjectsWithTag("tempToken")) do token.destruct() end end -- main function (delete old tokens, clone chaos bag content, sort it and position it) function layout(_, _, isRightClick) + if updating then return end + updating = true deleteCopiedTokens() -- stop here if right-clicked if isRightClick then return end - local chaosBag = getChaosBag() + local chaosBag = findChaosBag() local data = {} -- clone tokens from chaos bag (default position above trash can) for i, obj in ipairs(chaosBag.getData().ContainedObjects) do - obj["Tags"] = { "to_be_deleted" } + obj["Tags"] = { "tempToken" } local spawnedObj = spawnObjectData({ data = obj, position = { 0.49, 3, 0 } @@ -220,7 +215,7 @@ function layout(_, _, isRightClick) -- error handling for removal of token arranger if self == nil then - for _, token in ipairs(getObjectsWithTag("to_be_deleted")) do token.destruct() end + for _, token in ipairs(getObjectsWithTag("tempToken")) do token.destruct() end return end @@ -239,28 +234,17 @@ function layout(_, _, isRightClick) item.token.setRotation(self.getRotation()) location.z = location.z - 1.75 end - updating = false + Wait.time(function() updating = false end, 0.1) end -- called from outside to set default values for tokens function onTokenDataChanged(tokenData) - -- Skull - local table = tokenData["Skull"] or {} - local skullModifier = table.modifier or "" - print("Skull: " .. skullModifier) - - -- Cultist - local table = tokenData.Cultist or {} - local cultistModifier = table.modifier or "" - print("Cultist: " .. cultistModifier) - - -- Tablet - local table = tokenData.Tablet or {} - local tabletModifier = table.modifier or "" - print("Tablet: " .. tabletModifier) - - -- Elder Thing - local table = tokenData.ElderThing or {} - local elderThingModifier = table.modifier or "" - print("Elder Thing: " .. elderThingModifier) + -- update token precedence + for key, table in pairs(tokenData) do + local modifier = table.modifier + if modifier == -999 then modifier = 0 end + TOKEN_PRECEDENCE[key][1] = modifier + end + updateUI() + layout() end diff --git a/src/accessories/TokenArrangerApi.ttslua b/src/accessories/TokenArrangerApi.ttslua index dab706a5..c0edba77 100644 --- a/src/accessories/TokenArrangerApi.ttslua +++ b/src/accessories/TokenArrangerApi.ttslua @@ -1,13 +1,31 @@ do local TokenArrangerApi = {} - TokenArrangerApi.onTokenDataChanged = function(tokenData) + -- local function to call the token arranger, if it is on the table + ---@param functionName String Name of the function to cal + ---@param argument Variant Parameter to pass + local function callIfExistent(functionName, argument) local tokenArranger = getObjectsWithTag("TokenArranger")[1] - if tokenArranger ~= nil then - tokenArranger.call("onTokenDataChanged", tokenData) + tokenArranger.call(functionName, argument) end end + -- updates the token modifiers with the provided data + ---@param tokenData Table Contains the chaos token metadata + TokenArrangerApi.onTokenDataChanged = function(tokenData) + callIfExistent("onTokenDataChanged", tokenData) + end + + -- deletes already laid out tokens + TokenArrangerApi.deleteCopiedTokens = function() + callIfExistent("deleteCopiedTokens") + end + + -- updates the laid out tokens + TokenArrangerApi.layout = function() + callIfExistent("layout") + end + return TokenArrangerApi end diff --git a/src/chaosbag/BlessCurseManager.ttslua b/src/chaosbag/BlessCurseManager.ttslua index 84ab3f55..d7e64786 100644 --- a/src/chaosbag/BlessCurseManager.ttslua +++ b/src/chaosbag/BlessCurseManager.ttslua @@ -1,11 +1,4 @@ --- Bless / Curse Manager --- updated by: Chr1Z --- made by: Tikatoy --- description: helps with adding / removing and sealing of bless and curse tokens -information = { - version = "3.5", - last_updated = "12.11.2022" -} +local tokenArrangerApi = require("accessories/TokenArrangerApi") local IMAGE_URL = { Bless = "http://cloud-3.steamusercontent.com/ugc/1655601092778627699/339FB716CB25CA6025C338F13AFDFD9AC6FA8356/", @@ -25,9 +18,6 @@ local BUTTON_COLOR = { [false] = { 0.4, 0.4, 0.4 }, [true] = { 0.9, 0.9, 0.9 } } local FONT_COLOR = { [false] = { 1, 1, 1 }, [true] = { 0, 0, 0 } } local whitespace = " " --- variable will be set by outside call -tokenArranger = nil - --------------------------------------------------------- -- creating buttons and menus + initializing tables --------------------------------------------------------- @@ -67,12 +57,6 @@ function onLoad(saved_state) -- context menu self.addContextMenuItem("Remove all", doRemove) self.addContextMenuItem("Reset", doReset) - self.addContextMenuItem("More Information", function() - printToAll("------------------------------", "White") - printToAll("Bless / Curse Manager v" .. information["version"] .. " by Chr1Z", "Orange") - printToAll("last updated: " .. information["last_updated"], "White") - printToAll("original by Tikatoy", "White") - end) -- hotkeys addHotkey("Bless Curse Status", printStatus, false) @@ -173,15 +157,13 @@ end -- context menu function 2 function doReset(color) -- delete previously pulled out tokens by the token arranger - if tokenArranger then - tokenArranger.call("deleteCopiedTokens") - end + tokenArrangerApi.deleteCopiedTokens() playerColor = color numInPlay = { Bless = 0, Curse = 0 } tokensTaken = { Bless = {}, Curse = {} } initializeState() - updateTokenArranger() + tokenArrangerApi.layout() end --------------------------------------------------------- @@ -263,18 +245,7 @@ function callFunctions(token, isRightClick) success = takeToken(token, false) end end - if success ~= 0 then updateTokenArranger() end -end - -UPDATING = false -function updateTokenArranger() - if tokenArranger and not UPDATING then - UPDATING = true - Wait.time(function() - UPDATING = false - tokenArranger.call("layout") - end, 1.5) - end + if success ~= 0 then tokenArrangerApi.layout() end end function getChaosBag() @@ -405,22 +376,22 @@ function addMenuOptions(playerColor, hoveredObject) hoveredObject.addContextMenuItem("Seal Bless", function(color) sealToken("Bless", color, hoveredObject) - updateTokenArranger() + tokenArrangerApi.layout() end, true) hoveredObject.addContextMenuItem("Release Bless", function(color) releaseToken("Bless", color, hoveredObject) - updateTokenArranger() + tokenArrangerApi.layout() end, true) hoveredObject.addContextMenuItem("Seal Curse", function(color) sealToken("Curse", color, hoveredObject) - updateTokenArranger() + tokenArrangerApi.layout() end, true) hoveredObject.addContextMenuItem("Release Curse", function(color) releaseToken("Curse", color, hoveredObject) - updateTokenArranger() + tokenArrangerApi.layout() end, true) broadcastToColor("Right-click seal options added to " .. hoveredObject.getName(), playerColor) diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua index 0234bbd5..f6fa758c 100644 --- a/src/core/Global.ttslua +++ b/src/core/Global.ttslua @@ -845,9 +845,6 @@ function applyOptionPanelChange(id, state) -- option: Show token arranger elseif id == "showTokenArranger" then - -- delete previously pulled out tokens - for _, token in ipairs(getObjectsWithTag("to_be_deleted")) do token.destruct() end - optionPanel[id] = spawnOrRemoveHelper(state, "Token Arranger", {-42.3, 1.6, -46.5}) -- option: Show clean up helper