second part of updates

This commit is contained in:
Chr1Z93 2023-02-28 12:35:35 +01:00
parent a23c3d8150
commit b9fe13b658
6 changed files with 106 additions and 136 deletions

View File

@ -49,8 +49,8 @@
"normalized": "location" "normalized": "location"
}, },
{ {
"displayed": "to_be_deleted", "displayed": "tempToken",
"normalized": "to_be_deleted" "normalized": "temptoken"
}, },
{ {
"displayed": "Minicard", "displayed": "Minicard",

View File

@ -45,10 +45,10 @@
], ],
"Tooltip": true, "Tooltip": true,
"Transform": { "Transform": {
"posX": 22.951, "posX": -42.3,
"posY": 5.242, "posY": 1.53,
"posZ": -30.295, "posZ": -46.5,
"rotX": 1, "rotX": 0,
"rotY": 270, "rotY": 270,
"rotZ": 0, "rotZ": 0,
"scaleX": 2, "scaleX": 2,

View File

@ -1,4 +1,4 @@
-- names of tokens in order local TOKEN_PRECEDENCE = {}
local TOKEN_NAMES = { local TOKEN_NAMES = {
"Elder Sign", "Elder Sign",
"Skull", "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 -- common parameters
local buttonParameters = {} local buttonParameters = {}
buttonParameters.function_owner = self buttonParameters.function_owner = self
@ -52,13 +37,15 @@ function onSave() return JSON.encode(TOKEN_PRECEDENCE) end
function onLoad(saveState) function onLoad(saveState)
if saveState ~= nil then if saveState ~= nil then
TOKEN_PRECEDENCE = JSON.decode(saveState) TOKEN_PRECEDENCE = JSON.decode(saveState)
else
loadDefaultValues()
end end
-- create UI -- create UI
local offset = 0.725 local offset = 0.725
local pos = { x = { -1.067, 0.377 }, z = -2.175 } 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 for i = 1, 10 do
if i < 6 then if i < 6 then
buttonParameters.position = { pos.x[1], 0, pos.z + i * offset } buttonParameters.position = { pos.x[1], 0, pos.z + i * offset }
@ -76,7 +63,7 @@ function onLoad(saveState)
self.createInput(inputParameters) self.createInput(inputParameters)
end end
-- index 11: "Update / Hide" button -- index 10: "Update / Hide" button
buttonParameters.label = "Update / Hide" buttonParameters.label = "Update / Hide"
buttonParameters.click_function = "layout" buttonParameters.click_function = "layout"
buttonParameters.tooltip = "Left-Click: Update!\nRight-Click: Hide Tokens!" buttonParameters.tooltip = "Left-Click: Update!\nRight-Click: Hide Tokens!"
@ -85,55 +72,52 @@ function onLoad(saveState)
buttonParameters.width = 675 buttonParameters.width = 675
buttonParameters.height = 175 buttonParameters.height = 175
self.createButton(buttonParameters) 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 end
-- delete tokens and remove reference from bless/curse manager -- delete temporary tokens when destroyed
function onDestroy() function onDestroy() deleteCopiedTokens() end
deleteCopiedTokens()
-- remove object reference from bless/curse manager
getObjectFromGUID("5933fb").setVar("tokenArranger", nil)
end
-- layout tokens when dropped (after 2 seconds) -- layout tokens when dropped (after 2 seconds)
function onDrop() Wait.time(layout, 2) end function onDrop() Wait.time(layout, 2) end
-- delete tokens when picked up -- delete temporary tokens when picked up
function onPickUp() deleteCopiedTokens() end function onPickUp() deleteCopiedTokens() end
-- helper functions to carry index -- helper functions to carry index
function attachIndex(click_function, index) function attachIndex(click_function, index)
local fn_name = click_function .. index local fn_name = click_function .. index
_G[fn_name] = function(obj, player_color, isRightClick) _G[fn_name] = function(_, _, isRightClick)
_G[click_function](obj, player_color, isRightClick, index) _G[click_function](isRightClick, index)
end end
return fn_name return fn_name
end end
function attachIndex2(input_function, index) function attachIndex2(input_function, index)
local fn_name = input_function .. index local fn_name = input_function .. index
_G[fn_name] = function(obj, player_color, input, selected) _G[fn_name] = function(_, _, input, selected)
_G[input_function](obj, player_color, input, selected, index) _G[input_function](input, selected, index)
end end
return fn_name return fn_name
end end
-- click_function for buttons on chaos tokens -- click_function for buttons on chaos tokens
function tokenClick(_, _, isRightClick, index) function tokenClick(isRightClick, index)
if not updating then local change = tonumber(isRightClick and "-1" or "1")
updating = true TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] = TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] + change
local change = tonumber(isRightClick and "-1" or "1") self.editInput({ index = index - 1, value = TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] })
TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] = TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] + change layout()
self.editInput({ index = index - 1, value = TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] })
layout()
end
end end
-- input_function for input_boxes -- input_function for input_boxes
function tokenInput(_, _, input, selected, index) function tokenInput(input, selected, index)
if selected == false and not updating then if selected == false then
updating = true
local num = tonumber(input) local num = tonumber(input)
if num ~= nil then if num ~= nil then
TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] = num TOKEN_PRECEDENCE[TOKEN_NAMES[index]][1] = num
@ -142,6 +126,31 @@ function tokenInput(_, _, input, selected, index)
end end
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 -- order function for data sorting
function token_value_comparator(left, right) function token_value_comparator(left, right)
if left.value > right.value then return true if left.value > right.value then return true
@ -152,49 +161,35 @@ function token_value_comparator(left, right)
end end
end end
-- get chaos bag from scripting zone and description -- checks scripting zone for chaos bag
function getChaosBag() function findChaosBag()
local chaosbag = nil for _, item in ipairs(getObjectFromGUID("83ef06").getObjects()) do
local chaosbag_zone = getObjectFromGUID("83ef06") if item.getDescription() == "Chaos Bag" then
return item
-- 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
end end
end end
-- error handling: chaos bag not found
if chaosbag == nil then
printToAll("Chaos bag couldn't be found.", "Red")
end
return chaosbag
end end
-- deletes previously placed tokens -- deletes previously placed tokens
function deleteCopiedTokens() 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 end
-- main function (delete old tokens, clone chaos bag content, sort it and position it) -- main function (delete old tokens, clone chaos bag content, sort it and position it)
function layout(_, _, isRightClick) function layout(_, _, isRightClick)
if updating then return end
updating = true
deleteCopiedTokens() deleteCopiedTokens()
-- stop here if right-clicked -- stop here if right-clicked
if isRightClick then return end if isRightClick then return end
local chaosBag = getChaosBag() local chaosBag = findChaosBag()
local data = {} local data = {}
-- clone tokens from chaos bag (default position above trash can) -- clone tokens from chaos bag (default position above trash can)
for i, obj in ipairs(chaosBag.getData().ContainedObjects) do for i, obj in ipairs(chaosBag.getData().ContainedObjects) do
obj["Tags"] = { "to_be_deleted" } obj["Tags"] = { "tempToken" }
local spawnedObj = spawnObjectData({ local spawnedObj = spawnObjectData({
data = obj, data = obj,
position = { 0.49, 3, 0 } position = { 0.49, 3, 0 }
@ -220,7 +215,7 @@ function layout(_, _, isRightClick)
-- error handling for removal of token arranger -- error handling for removal of token arranger
if self == nil then 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 return
end end
@ -239,28 +234,17 @@ function layout(_, _, isRightClick)
item.token.setRotation(self.getRotation()) item.token.setRotation(self.getRotation())
location.z = location.z - 1.75 location.z = location.z - 1.75
end end
updating = false Wait.time(function() updating = false end, 0.1)
end end
-- called from outside to set default values for tokens -- called from outside to set default values for tokens
function onTokenDataChanged(tokenData) function onTokenDataChanged(tokenData)
-- Skull -- update token precedence
local table = tokenData["Skull"] or {} for key, table in pairs(tokenData) do
local skullModifier = table.modifier or "" local modifier = table.modifier
print("Skull: " .. skullModifier) if modifier == -999 then modifier = 0 end
TOKEN_PRECEDENCE[key][1] = modifier
-- Cultist end
local table = tokenData.Cultist or {} updateUI()
local cultistModifier = table.modifier or "" layout()
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)
end end

View File

@ -1,13 +1,31 @@
do do
local TokenArrangerApi = {} 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] local tokenArranger = getObjectsWithTag("TokenArranger")[1]
if tokenArranger ~= nil then if tokenArranger ~= nil then
tokenArranger.call("onTokenDataChanged", tokenData) tokenArranger.call(functionName, argument)
end end
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 return TokenArrangerApi
end end

View File

@ -1,11 +1,4 @@
-- Bless / Curse Manager local tokenArrangerApi = require("accessories/TokenArrangerApi")
-- 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 IMAGE_URL = { local IMAGE_URL = {
Bless = "http://cloud-3.steamusercontent.com/ugc/1655601092778627699/339FB716CB25CA6025C338F13AFDFD9AC6FA8356/", 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 FONT_COLOR = { [false] = { 1, 1, 1 }, [true] = { 0, 0, 0 } }
local whitespace = " " local whitespace = " "
-- variable will be set by outside call
tokenArranger = nil
--------------------------------------------------------- ---------------------------------------------------------
-- creating buttons and menus + initializing tables -- creating buttons and menus + initializing tables
--------------------------------------------------------- ---------------------------------------------------------
@ -67,12 +57,6 @@ function onLoad(saved_state)
-- context menu -- context menu
self.addContextMenuItem("Remove all", doRemove) self.addContextMenuItem("Remove all", doRemove)
self.addContextMenuItem("Reset", doReset) 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 -- hotkeys
addHotkey("Bless Curse Status", printStatus, false) addHotkey("Bless Curse Status", printStatus, false)
@ -173,15 +157,13 @@ end
-- context menu function 2 -- context menu function 2
function doReset(color) function doReset(color)
-- delete previously pulled out tokens by the token arranger -- delete previously pulled out tokens by the token arranger
if tokenArranger then tokenArrangerApi.deleteCopiedTokens()
tokenArranger.call("deleteCopiedTokens")
end
playerColor = color playerColor = color
numInPlay = { Bless = 0, Curse = 0 } numInPlay = { Bless = 0, Curse = 0 }
tokensTaken = { Bless = {}, Curse = {} } tokensTaken = { Bless = {}, Curse = {} }
initializeState() initializeState()
updateTokenArranger() tokenArrangerApi.layout()
end end
--------------------------------------------------------- ---------------------------------------------------------
@ -263,18 +245,7 @@ function callFunctions(token, isRightClick)
success = takeToken(token, false) success = takeToken(token, false)
end end
end end
if success ~= 0 then updateTokenArranger() end if success ~= 0 then tokenArrangerApi.layout() 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
end end
function getChaosBag() function getChaosBag()
@ -405,22 +376,22 @@ function addMenuOptions(playerColor, hoveredObject)
hoveredObject.addContextMenuItem("Seal Bless", function(color) hoveredObject.addContextMenuItem("Seal Bless", function(color)
sealToken("Bless", color, hoveredObject) sealToken("Bless", color, hoveredObject)
updateTokenArranger() tokenArrangerApi.layout()
end, true) end, true)
hoveredObject.addContextMenuItem("Release Bless", function(color) hoveredObject.addContextMenuItem("Release Bless", function(color)
releaseToken("Bless", color, hoveredObject) releaseToken("Bless", color, hoveredObject)
updateTokenArranger() tokenArrangerApi.layout()
end, true) end, true)
hoveredObject.addContextMenuItem("Seal Curse", function(color) hoveredObject.addContextMenuItem("Seal Curse", function(color)
sealToken("Curse", color, hoveredObject) sealToken("Curse", color, hoveredObject)
updateTokenArranger() tokenArrangerApi.layout()
end, true) end, true)
hoveredObject.addContextMenuItem("Release Curse", function(color) hoveredObject.addContextMenuItem("Release Curse", function(color)
releaseToken("Curse", color, hoveredObject) releaseToken("Curse", color, hoveredObject)
updateTokenArranger() tokenArrangerApi.layout()
end, true) end, true)
broadcastToColor("Right-click seal options added to " .. hoveredObject.getName(), playerColor) broadcastToColor("Right-click seal options added to " .. hoveredObject.getName(), playerColor)

View File

@ -845,9 +845,6 @@ function applyOptionPanelChange(id, state)
-- option: Show token arranger -- option: Show token arranger
elseif id == "showTokenArranger" then 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}) optionPanel[id] = spawnOrRemoveHelper(state, "Token Arranger", {-42.3, 1.6, -46.5})
-- option: Show clean up helper -- option: Show clean up helper