minor update to blurse manager

This commit is contained in:
Chr1Z93 2024-01-09 16:38:44 +01:00
parent 8dcbce1542
commit 640c0dd8a2
6 changed files with 234 additions and 605 deletions

View File

@ -106,8 +106,6 @@
"AdditionalPlayerCards.2cba6b", "AdditionalPlayerCards.2cba6b",
"BarkhamHorror.308439", "BarkhamHorror.308439",
"ChaosBagStatTracker.766620", "ChaosBagStatTracker.766620",
"Blesstokens.afa06b",
"Cursetokens.bd0253",
"TokenSpawnTool.36b4ee", "TokenSpawnTool.36b4ee",
"OfficialStandaloneChallengeScenarios.0ef5c8", "OfficialStandaloneChallengeScenarios.0ef5c8",
"TarotDeck.77f1e5", "TarotDeck.77f1e5",

View File

@ -1,87 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"ContainedObjects_order": [
"Bless.b2b7be",
"Bless.b2b7be",
"Bless.b2b7be",
"Bless.b2b7be",
"Bless.b2b7be",
"Bless.b2b7be",
"Bless.b2b7be",
"Bless.b2b7be",
"Bless.b2b7be",
"Bless.b2b7be"
],
"ContainedObjects_path": "Blesstokens.afa06b",
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"CustomShader": {
"FresnelStrength": 0,
"SpecularColor": {
"b": 1,
"g": 1,
"r": 1
},
"SpecularIntensity": 0,
"SpecularSharpness": 2
},
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/1655601092778623873/C9EF4B44CE708DFC5A804FF2912C9F9B47323287/",
"MaterialIndex": 3,
"MeshURL": "https://pastebin.com/raw/ALrYhQGb",
"NormalURL": "",
"TypeIndex": 6
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "afa06b",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": true,
"LuaScript": "",
"LuaScriptState": "",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Custom_Model_Bag",
"Nickname": "Bless tokens",
"Snap": true,
"Sticky": true,
"Tags": [
"CleanUpHelper_ignore",
"displacement_excluded"
],
"Tooltip": true,
"Transform": {
"posX": 2.842,
"posY": 1.644,
"posZ": -11.239,
"rotX": 0,
"rotY": 225,
"rotZ": 0,
"scaleX": 0.7,
"scaleY": 0.7,
"scaleZ": 0.7
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 0.04894,
"g": 0.32859,
"r": 0.37456
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1655601092778627699/339FB716CB25CA6025C338F13AFDFD9AC6FA8356/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "b2b7be",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "Bless",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -1.465,
"posY": 1.703,
"posZ": -26.93,
"rotX": 0,
"rotY": 90,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,87 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"Bag": {
"Order": 0
},
"ColorDiffuse": {
"b": 1,
"g": 1,
"r": 1
},
"ContainedObjects_order": [
"Curse.678891",
"Curse.678891",
"Curse.678891",
"Curse.678891",
"Curse.678891",
"Curse.678891",
"Curse.678891",
"Curse.678891",
"Curse.678891",
"Curse.678891"
],
"ContainedObjects_path": "Cursetokens.bd0253",
"CustomMesh": {
"CastShadows": true,
"ColliderURL": "",
"Convex": true,
"CustomShader": {
"FresnelStrength": 0,
"SpecularColor": {
"b": 1,
"g": 1,
"r": 1
},
"SpecularIntensity": 0,
"SpecularSharpness": 2
},
"DiffuseURL": "http://cloud-3.steamusercontent.com/ugc/1655601092778633181/7A00AF905BCD6EB5D866F2107CECBC0A49E360F7/",
"MaterialIndex": 3,
"MeshURL": "https://pastebin.com/raw/ALrYhQGb",
"NormalURL": "",
"TypeIndex": 6
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "bd0253",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": true,
"LuaScript": "",
"LuaScriptState": "",
"MaterialIndex": -1,
"MeasureMovement": false,
"MeshIndex": -1,
"Name": "Custom_Model_Bag",
"Nickname": "Curse tokens",
"Snap": true,
"Sticky": true,
"Tags": [
"CleanUpHelper_ignore",
"displacement_excluded"
],
"Tooltip": true,
"Transform": {
"posX": 4.053,
"posY": 1.642,
"posZ": -12.449,
"rotX": 0,
"rotY": 225,
"rotZ": 0,
"scaleX": 0.7,
"scaleY": 0.7,
"scaleZ": 0.7
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,57 +0,0 @@
{
"AltLookAngle": {
"x": 0,
"y": 0,
"z": 0
},
"Autoraise": true,
"ColorDiffuse": {
"b": 0.44425,
"g": 0.00387,
"r": 0.27072
},
"CustomImage": {
"CustomTile": {
"Stackable": false,
"Stretch": true,
"Thickness": 0.1,
"Type": 2
},
"ImageScalar": 1,
"ImageSecondaryURL": "",
"ImageURL": "http://cloud-3.steamusercontent.com/ugc/1655601092778636039/2A25BD38E8C44701D80DD96BF0121DA21843672E/",
"WidthScale": 0
},
"Description": "",
"DragSelectable": true,
"GMNotes": "",
"GUID": "678891",
"Grid": true,
"GridProjection": false,
"Hands": false,
"HideWhenFaceDown": false,
"IgnoreFoW": false,
"LayoutGroupSortIndex": 0,
"Locked": false,
"LuaScript": "",
"LuaScriptState": "",
"MeasureMovement": false,
"Name": "Custom_Tile",
"Nickname": "Curse",
"Snap": true,
"Sticky": true,
"Tooltip": true,
"Transform": {
"posX": -46.206,
"posY": 1.789,
"posZ": -3.483,
"rotX": 0,
"rotY": 270,
"rotZ": 0,
"scaleX": 0.81,
"scaleY": 1,
"scaleZ": 0.81
},
"Value": 0,
"XmlUI": ""
}

View File

@ -1,5 +1,5 @@
local chaosBagApi = require("chaosbag/ChaosBagApi") local chaosBagApi = require("chaosbag/ChaosBagApi")
local tokenArrangerApi = require("accessories/TokenArrangerApi") local tokenArrangerApi = require("accessories/TokenArrangerApi")
-- common button parameters -- common button parameters
local buttonParamaters = {} local buttonParamaters = {}
@ -8,340 +8,257 @@ buttonParamaters.color = { 0, 0, 0, 0 }
buttonParamaters.width = 700 buttonParamaters.width = 700
buttonParamaters.height = 700 buttonParamaters.height = 700
local altState = false
local MODE = {
[false] = "Add / Remove",
[true] = "Take / Return"
}
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 = " "
local updating local updating
--------------------------------------------------------- ---------------------------------------------------------
-- creating buttons and menus + initializing tables -- creating buttons and menus + initializing tables
--------------------------------------------------------- ---------------------------------------------------------
function onSave() return JSON.encode(altState) end function onLoad()
-- index: 0 - bless
buttonParamaters.click_function = "clickBless"
buttonParamaters.position = { -1.03, 0, 0.46 }
buttonParamaters.tooltip = "Add / Remove Bless"
self.createButton(buttonParamaters)
function onLoad(saved_state) -- index: 1 - curse
if saved_state ~= nil then buttonParamaters.click_function = "clickCurse"
altState = JSON.decode(saved_state) buttonParamaters.position[1] = -buttonParamaters.position[1]
end buttonParamaters.tooltip = "Add / Remove Curse"
self.createButton(buttonParamaters)
-- index: 0 - bless -- index: 2 - bless count
buttonParamaters.click_function = "clickBless" buttonParamaters.tooltip = ""
buttonParamaters.position = { -1.03, 0.05, 0.46 } buttonParamaters.click_function = "none"
self.createButton(buttonParamaters) buttonParamaters.width = 0
buttonParamaters.height = 0
buttonParamaters.color = { 0.4, 0.4, 0.4 }
buttonParamaters.font_color = { 1, 1, 1 }
buttonParamaters.font_size = 235
buttonParamaters.position = { -1.03, 0.06, -0.8 }
self.createButton(buttonParamaters)
-- index: 1 - curse -- index: 3 - curse count
buttonParamaters.click_function = "clickCurse" buttonParamaters.position[1] = -buttonParamaters.position[1]
buttonParamaters.position[1] = -buttonParamaters.position[1] self.createButton(buttonParamaters)
self.createButton(buttonParamaters)
-- index: 2 - alternative mode (take / return) -- context menu
buttonParamaters.click_function = "enableAlt" self.addContextMenuItem("Remove all", doRemove)
buttonParamaters.width = 900 self.addContextMenuItem("Reset", doReset)
buttonParamaters.height = 210
buttonParamaters.position = { -1.03, 0.05, -0.85 }
self.createButton(buttonParamaters)
-- index: 3 - default mode (add / remove) -- initializing tables
buttonParamaters.click_function = "enableDefault" initializeState()
buttonParamaters.position[1] = -buttonParamaters.position[1] broadcastCount("Curse")
self.createButton(buttonParamaters) broadcastCount("Bless")
-- load labels, tooltips and colors
updateButtons()
-- context menu
self.addContextMenuItem("Remove all", doRemove)
self.addContextMenuItem("Reset", doReset)
-- initializing tables
initializeState()
broadcastCount("Curse")
broadcastCount("Bless")
end end
function resetTables() function resetTables()
numInPlay = { Bless = 0, Curse = 0 } numInPlay = { Bless = 0, Curse = 0 }
tokensTaken = { Bless = {}, Curse = {} } tokensTaken = { Bless = {}, Curse = {} }
sealedTokens = {} sealedTokens = {}
updateButtonLabels()
end end
function initializeState() function initializeState()
resetTables() resetTables()
-- count tokens in the bag -- count tokens in the bag
local chaosbag = chaosBagApi.findChaosBag() local chaosbag = chaosBagApi.findChaosBag()
local tokens = {} local tokens = {}
for _, v in ipairs(chaosbag.getObjects()) do for _, v in ipairs(chaosbag.getObjects()) do
if v.name == "Bless" then if v.name == "Bless" then
numInPlay.Bless = numInPlay.Bless + 1 numInPlay.Bless = numInPlay.Bless + 1
elseif v.name == "Curse" then elseif v.name == "Curse" then
numInPlay.Curse = numInPlay.Curse + 1 numInPlay.Curse = numInPlay.Curse + 1
end
end end
end
-- find tokens in the play area -- find tokens in the play area
for _, obj in ipairs(getObjects()) do for _, obj in ipairs(getObjects()) do
local pos = obj.getPosition() local pos = obj.getPosition()
if pos.x > -65 and pos.x < 10 and pos.z > -35 and pos.z < 35 then if pos.x > -65 and pos.x < 10 and pos.z > -35 and pos.z < 35 then
if obj.getName() == "Bless" then if obj.getName() == "Bless" then
table.insert(tokensTaken.Bless, obj.getGUID()) table.insert(tokensTaken.Bless, obj.getGUID())
numInPlay.Bless = numInPlay.Bless + 1 numInPlay.Bless = numInPlay.Bless + 1
elseif obj.getName() == "Curse" then elseif obj.getName() == "Curse" then
table.insert(tokensTaken.Curse, obj.getGUID()) table.insert(tokensTaken.Curse, obj.getGUID())
numInPlay.Curse = numInPlay.Curse + 1 numInPlay.Curse = numInPlay.Curse + 1
end end
end
end end
end
end
function updateButtonLabels()
self.editButton({ index = 2, label = formatTokenCount("Bless", true)})
self.editButton({ index = 3, label = formatTokenCount("Curse", true)})
end end
function broadcastCount(token) function broadcastCount(token)
local count = formatTokenCount(token) local count = formatTokenCount(token)
if count == "(0/0)" then return end if count == "(0/0)" then return end
broadcastToAll(token .. " Tokens " .. count, "White") broadcastToAll(token .. " Tokens " .. count, "White")
end end
function broadcastStatus(color) function broadcastStatus(color)
broadcastToColor("Curse Tokens " .. formatTokenCount("Curse"), color, "White") broadcastToColor("Curse Tokens " .. formatTokenCount("Curse"), color, "White")
broadcastToColor("Bless Tokens " .. formatTokenCount("Bless"), color, "White") broadcastToColor("Bless Tokens " .. formatTokenCount("Bless"), color, "White")
end end
-- context menu function 1 ---------------------------------------------------------
-- context menu functions
---------------------------------------------------------
function doRemove(color) function doRemove(color)
local chaosbag = chaosBagApi.findChaosBag() local chaosbag = chaosBagApi.findChaosBag()
-- remove tokens from chaos bag -- remove tokens from chaos bag
local count = { Bless = 0, Curse = 0 } local count = { Bless = 0, Curse = 0 }
for _, v in ipairs(chaosbag.getObjects()) do for _, v in ipairs(chaosbag.getObjects()) do
if v.name == "Bless" or v.name == "Curse" then if v.name == "Bless" or v.name == "Curse" then
chaosbag.takeObject({ chaosbag.takeObject({
guid = v.guid, guid = v.guid,
position = { 0, 5, 0 }, position = { 0, 5, 0 },
callback_function = function(obj) obj.destruct() end callback_function = function(obj) obj.destruct() end
}) })
count[v.name] = count[v.name] + 1 count[v.name] = count[v.name] + 1
end
end end
end
broadcastToColor("Removed " .. count.Bless .. " Bless and " .. broadcastToColor("Removed " .. count.Bless .. " Bless and " .. count.Curse .. " Curse tokens from the chaos bag.", color, "White")
count.Curse .. " Curse tokens from the chaos bag.", color, "White") broadcastToColor("Removed " .. removeTakenTokens("Bless") .. " Bless and " .. removeTakenTokens("Curse") .. " Curse tokens from play.", color, "White")
broadcastToColor("Removed " .. removeTakenTokens("Bless") .. " Bless and " ..
removeTakenTokens("Curse") .. " Curse tokens from play.", color, "White")
resetTables() resetTables()
tokenArrangerApi.layout() tokenArrangerApi.layout()
end end
-- context menu function 2
function doReset(color) function doReset(color)
initializeState() initializeState()
broadcastCount("Curse") broadcastCount("Curse")
broadcastCount("Bless") broadcastCount("Bless")
tokenArrangerApi.layout() tokenArrangerApi.layout()
end
-- removing tokens that were 'taken'
function removeTakenTokens(type)
local count = 0
for _, guid in ipairs(tokensTaken[type]) do
local token = getObjectFromGUID(guid)
if token ~= nil then
token.destruct()
count = count + 1
end
end
return count
end end
--------------------------------------------------------- ---------------------------------------------------------
-- click functions -- click functions
--------------------------------------------------------- ---------------------------------------------------------
-- click function 1
function clickBless(_, color, isRightClick) function clickBless(_, color, isRightClick)
playerColor = color playerColor = color
callFunctions("Bless", isRightClick) callFunctions("Bless", isRightClick)
end end
-- click function 2
function clickCurse(_, color, isRightClick) function clickCurse(_, color, isRightClick)
playerColor = color playerColor = color
callFunctions("Curse", isRightClick) callFunctions("Curse", isRightClick)
end end
-- click function 3 function callFunctions(type, isRightClick)
function enableAlt() if not chaosBagApi.canTouchChaosTokens() then return end
if altState then return end
altState = not altState
updateButtons()
end
-- click function 4 if isRightClick then
function enableDefault() removeToken(type)
if not altState then return end else
altState = not altState addToken(type)
updateButtons() end
tokenArrangerApi.layout()
end end
--------------------------------------------------------- ---------------------------------------------------------
-- called functions -- called functions
--------------------------------------------------------- ---------------------------------------------------------
function updateButtons()
self.editButton({
index = 0,
tooltip = MODE[altState] .. " Bless"
})
self.editButton({
index = 1,
tooltip = MODE[altState] .. " Curse"
})
self.editButton({
index = 2,
label = whitespace .. MODE[true] .. (altState and " ✓" or whitespace) .. " ",
color = BUTTON_COLOR[not altState],
font_color = FONT_COLOR[not altState]
})
self.editButton({
index = 3,
label = whitespace .. MODE[false] .. (altState and whitespace or " ✓") .. " ",
color = BUTTON_COLOR[altState],
font_color = FONT_COLOR[altState]
})
end
-- function that is called by click_functions 1+2 and calls the other functions
function callFunctions(token, isRightClick)
if not chaosBagApi.canTouchChaosTokens() then
return
end
local success
if not altState then
if isRightClick then
success = takeToken(token, true)
else
success = addToken(token)
end
else
if isRightClick then
success = returnToken(token)
else
success = takeToken(token, false)
end
end
if success ~= 0 then tokenArrangerApi.layout() end
end
-- returns a formatted string with information about the provided token type (bless / curse) -- returns a formatted string with information about the provided token type (bless / curse)
function formatTokenCount(type) function formatTokenCount(type, omitBrackets)
if type == nil then type = mode end if type == nil then type = mode end
if omitBrackets then
return (numInPlay[type] - #tokensTaken[type]) .. "/" .. #tokensTaken[type]
else
return "(" .. (numInPlay[type] - #tokensTaken[type]) .. "/" .. #tokensTaken[type] .. ")" return "(" .. (numInPlay[type] - #tokensTaken[type]) .. "/" .. #tokensTaken[type] .. ")"
end
end end
-- called by cards that seal bless/curse tokens -- called by cards that seal bless/curse tokens
---@param param Table This contains the type and guid of the sealed token ---@param param Table This contains the type and guid of the sealed token
function sealedToken(param) function sealedToken(param)
table.insert(tokensTaken[param.type], param.guid) table.insert(tokensTaken[param.type], param.guid)
broadcastCount(param.type) broadcastCount(param.type)
updateButtonLabels()
end end
-- called by cards that seal bless/curse tokens -- called by cards that seal bless/curse tokens
---@param param Table This contains the type and guid of the released token ---@param param Table This contains the type and guid of the released token
function releasedToken(param) function releasedToken(param)
for i, v in ipairs(tokensTaken[param.type]) do for i, v in ipairs(tokensTaken[param.type]) do
if v == param.guid then if v == param.guid then
table.remove(tokensTaken[param.type], i) table.remove(tokensTaken[param.type], i)
break break
end
end
if not updating then
updating = true
Wait.frames(function()
broadcastCount(param.type)
updating = false
end, 1)
end end
end
if not updating then
updating = true
Wait.frames(function()
broadcastCount(param.type)
updateButtonLabels()
updating = false
end, 1)
end
end end
--------------------------------------------------------- ---------------------------------------------------------
-- main functions: add, take and return -- main functions: add and remove
--------------------------------------------------------- ---------------------------------------------------------
function addToken(type) function addToken(type)
if numInPlay[type] == 10 then if numInPlay[type] == 10 then
printToColor("10 tokens already in play, not adding any.", playerColor) printToColor("10 tokens already in play, not adding any.", playerColor)
return 0 return
end end
numInPlay[type] = numInPlay[type] + 1 numInPlay[type] = numInPlay[type] + 1
printToAll("Adding " .. type .. " token " .. formatTokenCount(type)) printToAll("Adding " .. type .. " token " .. formatTokenCount(type))
return chaosBagApi.spawnChaosToken(type) updateButtonLabels()
return chaosBagApi.spawnChaosToken(type)
end end
function takeToken(type, remove) function removeToken(type)
local chaosbag = chaosBagApi.findChaosBag() local chaosbag = chaosBagApi.findChaosBag()
if not remove and not SEAL_CARD_MESSAGE then local tokens = {}
broadcastToColor("For sealing tokens on cards try right-clicking on the card for seal options.", playerColor)
SEAL_CARD_MESSAGE = true for _, v in ipairs(chaosbag.getObjects()) do
if v.name == type then
table.insert(tokens, v.guid)
end end
local tokens = {} end
for _, v in ipairs(chaosbag.getObjects()) do
if v.name == type then if #tokens == 0 then
table.insert(tokens, v.guid) printToColor("No " .. type .. " tokens in the chaos bag.", playerColor)
end return
end
chaosbag.takeObject({
guid = table.remove(tokens),
smooth = false,
callback_function = function(obj)
numInPlay[type] = numInPlay[type] - 1
printToAll("Removing " .. type .. " token " .. formatTokenCount(type))
updateButtonLabels()
obj.destruct()
end end
if #tokens == 0 then })
printToColor("No " .. type .. " tokens in the chaos bag.", playerColor)
return 0
end
local pos = self.getPosition() + Vector(2.25, 0, 0.85)
if type == "Curse" then pos[3] = pos[3] - 1.7 end
chaosbag.takeObject({
guid = table.remove(tokens),
position = pos,
smooth = false,
callback_function = function(obj)
if remove then
numInPlay[type] = numInPlay[type] - 1
printToAll("Removing " .. type .. " token " .. formatTokenCount(type))
obj.destruct()
else
table.insert(tokensTaken[type], obj.getGUID())
printToAll("Taking " .. type .. " token " .. formatTokenCount(type))
end
end
})
end end
function returnToken(type) -- removing tokens that were 'taken'
local guid = table.remove(tokensTaken[type]) function removeTakenTokens(type)
if guid == nil then local count = 0
printToColor("No " .. type .. " tokens to return", playerColor) for _, guid in ipairs(tokensTaken[type]) do
return 0
end
local token = getObjectFromGUID(guid) local token = getObjectFromGUID(guid)
if token == nil then if token ~= nil then
printToColor("Couldn't find token " .. guid .. ", not returning to bag", playerColor) token.destruct()
return 0 count = count + 1
end end
local chaosbag = chaosBagApi.findChaosBag() end
if chaosbag == nil then return count
return 0
end
chaosbag.putObject(token)
printToAll("Returning " .. type .. " token " .. formatTokenCount(type))
end end
--------------------------------------------------------- ---------------------------------------------------------
@ -349,83 +266,85 @@ end
--------------------------------------------------------- ---------------------------------------------------------
function addMenuOptions(parameters) function addMenuOptions(parameters)
local playerColor = parameters.playerColor local playerColor = parameters.playerColor
local hoveredObject = parameters.hoveredObject local hoveredObject = parameters.hoveredObject
if hoveredObject == nil or hoveredObject.getVar("MENU_ADDED") == true then return end if hoveredObject == nil or hoveredObject.getVar("MENU_ADDED") == true then return end
if hoveredObject.tag ~= "Card" then if hoveredObject.tag ~= "Card" then
broadcastToColor("Right-click seal options can only be added to cards", playerColor) broadcastToColor("Right-click seal options can only be added to cards", playerColor)
return return
end end
hoveredObject.addContextMenuItem("Seal Bless", function(color) hoveredObject.addContextMenuItem("Seal Bless", function(color)
sealToken("Bless", color, hoveredObject) sealToken("Bless", color, hoveredObject)
tokenArrangerApi.layout() 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)
tokenArrangerApi.layout() 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)
tokenArrangerApi.layout() 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)
tokenArrangerApi.layout() 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)
hoveredObject.setVar("MENU_ADDED", true) hoveredObject.setVar("MENU_ADDED", true)
sealedTokens[hoveredObject.getGUID()] = {} sealedTokens[hoveredObject.getGUID()] = {}
end end
function sealToken(type, playerColor, enemy) function sealToken(type, playerColor, enemy)
local chaosbag = chaosBagApi.findChaosBag() local chaosbag = chaosBagApi.findChaosBag()
if chaosbag == nil then return end if chaosbag == nil then return end
local pos = enemy.getPosition() local pos = enemy.getPosition()
for i, token in ipairs(chaosbag.getObjects()) do for i, token in ipairs(chaosbag.getObjects()) do
if token.name == type then if token.name == type then
chaosbag.takeObject({ chaosbag.takeObject({
position = { pos.x, pos.y + 1, pos.z }, position = { pos.x, pos.y + 1, pos.z },
index = i - 1, index = i - 1,
smooth = false, smooth = false,
callback_function = function(obj) callback_function = function(obj)
Wait.frames(function() Wait.frames(function()
table.insert(sealedTokens[enemy.getGUID()], obj) table.insert(sealedTokens[enemy.getGUID()], obj)
table.insert(tokensTaken[type], obj.getGUID()) table.insert(tokensTaken[type], obj.getGUID())
printToColor("Sealing " .. type .. " token " .. formatTokenCount(type), playerColor) printToColor("Sealing " .. type .. " token " .. formatTokenCount(type), playerColor)
end, 1) end, 1)
end
})
return
end end
})
return
end end
printToColor(type .. " token not found in bag", playerColor) end
printToColor(type .. " token not found in bag", playerColor)
end end
function releaseToken(type, playerColor, enemy) function releaseToken(type, playerColor, enemy)
local chaosbag = chaosBagApi.findChaosBag() local chaosbag = chaosBagApi.findChaosBag()
if chaosbag == nil then return end if chaosbag == nil then return end
local tokens = sealedTokens[enemy.getGUID()] local tokens = sealedTokens[enemy.getGUID()]
if tokens == nil or #tokens == 0 then return end if tokens == nil or #tokens == 0 then return end
for i, token in ipairs(tokens) do for i, token in ipairs(tokens) do
if token ~= nil and token.getName() == type then if token ~= nil and token.getName() == type then
local guid = token.getGUID() local guid = token.getGUID()
chaosbag.putObject(token) chaosbag.putObject(token)
for j, v in ipairs(tokensTaken[type]) do for j, v in ipairs(tokensTaken[type]) do
if v == guid then if v == guid then
table.remove(tokensTaken[type], j) table.remove(tokensTaken[type], j)
table.remove(tokens, i) table.remove(tokens, i)
printToColor("Releasing " .. type .. " token" .. formatTokenCount(type), playerColor) printToColor("Releasing " .. type .. " token" .. formatTokenCount(type), playerColor)
return return
end
end
end end
end
end end
printToColor(type .. " token not sealed on " .. enemy.getName(), playerColor) end
printToColor(type .. " token not sealed on " .. enemy.getName(), playerColor)
end end
function none() end